Voir aussi
Scripting.Dictionary
L’objet Dictionnaire correspond à un tableau associatif de clefs et de valeurs. Chaque clef correspond à une unique valeur. Les éléments de ce tableau sont stockés en mémoire.

Un dictionnaire n’est pas un tableau (un Array), il existe plusieurs différences :
- les dictionnaires ne peuvent avoir que deux dimensions.
- les clefs servent à identifier les valeurs du dictionnaire.

L’objet Dictionnaire est défini dans le code par :
Set Nom_du_dictionnaire = Create Object ("Scripting.Dictionary")

Les clefs et les valeurs sont des méthodes utilisées par l’objet Dictionnaire qui sont définies par :

Nom_du_dictionnaire.keys
Nom_du_dictionnaire.items
et pour connaître le nombre d'items dans le dictionnaire : Nom_du_dictionnaire.count
Flo Cabon,
Ajouté ou modifié le 14/05/2007 (N°1831)
KERNEL
Que veut dire la cabalistique phrase : Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
C'est une "fonction" de l'API de Windows (API=Application Programming
Interface).
Il s'agit de la mise à disposition des programmeurs de certaines fonctions ou
procédures internes de Windows, contenues dans des bibliothèques qui ont souvent
l'extension .dll. C'est le cas de la bibliothèque Kernel32.dll (dans
Windows\System ou System32).
Pour pouvoir utiliser ces fonctions, il suffit, en VBA, de les déclarer avec le
mot clé Declare (qui peut servir aussi à rendre disponible une fonction créée
dans une dll perso).
Private et ByVal sont des mots clés qui ne sont pas propres aux fonctions API.
Par contre dw est un préfixe utilisé pour symboliser (en langage C je pense) le
type de données DoubleWord (pour ce que j'en sais, il s'agit d'un type d'entier
long non signé dont la valeur peut être comprise entre 0 et 4 294 967 295).
Frédéric Sigonneau,
Ajouté ou modifié le 16/05/2004 (N°1406)
VRAI FAUX
J'ai cru comprendre qu'on pouvait additionner ou multiplier les vraix et les faux ?
Supposons que tu veuilles comparer les plages A1:A5 avec C1:C5. ALors entre
la formule suivante:

=SOMME((A1:A5<>C1:C5)*1)=0

Attention, c'est une formule matricielle, donc tu sais avec
MAJ+CTRL+ENTRÉE (et non simplement ENTRÉE)

*******************
Je pense avoir compris la logique de ta formule.
Curieux, tout de même, que
VRAI * 1 = 1 !
Je croyais que pour Excel, VRAI, ça
voulait dire 1.
Et si je voulais utiliser ? = ? , puis-je faire
plus court que :
{=SOMME((un=deux)*1)=NBVAL(un)+NB.VIDE(un)}


*******************
Non. La preuve si tu entres Vrai dans A1 et Dans A2, alors SOMME(A1:A2)
donne 0. Par contre SOMME(A1:A2*1) et saisi matriciellement
(MAJ+CTRL+ENTRÉE) donne bien 2!

***************************
Laurent, si tu écris Laurent en B1 et Laurent en B2, SOMME(B1:B2) donne aussi 0
... (avec Excel 2000)

Tout ça pour dire que dans Excel
FAUX=0
VRAI=1

et dans VBA
False=0
True=-1

Excel 2000 (je ne sais plus s'il en est de même pour Excel 97 ou non) ne
provoque pas d'erreur quand il rencontre une valeur qu'il ne peut utiliser dans
une somme, il se contente de considérer qu'elle vaut 0.

Cela semble être le cas de VRAI et FAUX, non reconnus dans une somme. Par
contre, Excel accepte VRAI et FAUX dans une multiplication ou une division et
leur attribue dans ce cas les valeurs, respectivement, de 1 et 0.
Laurent Mortézai, Serge Garneau, Frédéric Sigonneau, (N°1019)
vbLf
Dans une zone de texte quand j'introduis des retour chariot, je trouve des petits carrés en bout de ligne...
pour intercaler des changements de ligne:
ActiveCell.Comment.Text "Les sanglots longs" & vbLf & "des violons."

En complément :
L'aide Excel 2000 "Constantes diverses" donne :
Constante Equivalent Description
vbCrLf Chr(13) + Chr(10) retour chariot + saut de ligne
vbCr Chr(13) saut de paragraphe
vbLf Chr(10) saut de ligne
vbTab Chr(9) tabulation
vbBack Chr(8) retour arrière
Laurent Longre, Robert Dezan, (N°1018)
VBA
Qu'est ce que c'est que VBA ? et un module ? et une macro dans tout ça ?
Allons-y pour un début d'initiation élémentaire au VBA primaire de base.
(Laurent, veux-tu bien regarder ailleurs s'il-te-plaît ? Merci.)Maintenant qu'on est entre
béotiens et quasi-béotiens, continuons.
Tu trouveras aussi utile je l'espère cette page spéciale pour toi qui débute

Chaque classeur Excel, quand tu le crées, comporte un certain nombre de
feuilles de calcul et un "Projet VBA" qui n'est rien d'autre qu'une
coquille vide prête à recevoir du code. Pour insérer du code dans le
projet VBA d'un classeur, on utilise l'éditeur Visual Basic intégré à
Excel.

Si tu as réussi à copier une première macro, tu sais déjà comment y
accéder : menu "Outils > Macros > Visual Basic Editor" (ou raccourci :
ALT+F11).

Une fois là, tu dois avoir quelque part une fenêtre "Explorateur de
projet" où tu vois, pour chacun des classeurs ouverts, le projet VBA qui
lui correspond, nommé "VBAProject(LeClasseur)". Si cette fenêtre n'est
pas ouverte, passe par le menu Affichage, tu pourras l'activer de là.

Dans cette fenêtre, tu vois tous les objets qui composent ton projet VBA :
ThisWorkbook, qui représente le classeur Excel, et Feuil1, Feuil2,
Feuil3 (etc) qui représentent toutes les feuilles du classeur. Ces
objets sont utiles si on veut réagir à des actions de l'utilisateur au
niveau du classeur ou d'une feuille, mais apparemment ça n'est pas ton
cas. On va donc placer ton code dans un endroit "neutre" : un module.

Fait un clic droit dans la fenêtre, menu Insérer > Module. Et hop ! tu
as une belle feuille blanche, le plus dur est fait, y'a plus qu'à coder.

Le code VBA, comme la plupart des codes informatiques, est écrit en
procédures ("Sub") et en fonctions ("Function").
Par exemple, réalisons une macro pour dire bonjour à Zaza :

Sub Première()
Msgbox "Bonjour Zaza !"
End Sub

Si tu retournes jeter un oeil dans Excel, regarde dans le menu "Outils >
Macros > Macros..." : tu y verras la macro "Première", prête à être
exécutée. (Macro est une synonyme de procédure). C'est pas formidable,
ça ?

Maintenant qu'on sait faire une macro très simple, comment en faire une
plus compliquée ? En utilisant l'enregistreur, il est fait pour ça. Dans
Excel, menu "Outils > Macros > Nouvelle Macro...". Clique sur OK et fait
plein de trucs (entre des valeurs sur une feuille, des calculs, change
les couleurs... tout ce que tu veux !). Quand tu en as assez, clique sur
le bouton en forme de carré bleu dans la barre d'outils nommée "Arrêter
l'enregistrement". (Ou menu "Outils > Macros > Arrêter
l'enregistrement".)

Retourne vers l'éditeur VBA. Excel a ajouté un nouveau module à ton
projet... et ce module est plein de code. Pour avoir de l'aide sur un
terme, place simplement le curseur sur un mot et appuie sur F1. Tout est
là.

Fin du didacticiel générique, merci d'avoir suivi.
Thomas Corvaisier, (N°1017)
VARIABLES : où les déclarer ?
Où définir les variables ? quelle est leur portée ?
Les variables peuvent être déclarées à plusieurs endroits et elles
auront alors une portée variable :
***************
Sub Blabla()
Dim VariableA
...
End Sub

VariableA n'est utilisable
qu'à l'intérieur de Blabla et "meurt" lorsque
l'on sort de la procédure
**************
Sub
Blabla()
Static VariableA
...
End Sub

VariableA n'est utilisable
qu'à l'intérieur de Blabla mais ne "meurt" pas
lorsque l'on sort de la
procédure. Sa valeur est gardée en mémoire et est
"retrouvée" lors d'un nouvel
appel de la procédure.

**************
En début de module
Dim VariableA
Sub Blabla1()
...
End Sub

sub Blabla2()
...
End Sub

VariableA est utilisable dans
tout le module, c'est-à-dire dans Blabla et
dans Blabla1. Chaque procédure peut
modifier la variable. VariableA "meurt"
lorsque l'on sort du module.

**************
En début de module
Static VariableA
Sub Blabla1()
...
End Sub

sub
Blabla2()
...
End Sub

VariableA est utilisable dans tout le module,
c'est-à-dire dans Blabla1 et
dans Blabla2. Chaque procédure peut modifier la
variable. VariableA ne meurt
pas lorsque l'on quitte le module. Sa valeur est
gardée en mémoire et
récupérée lors d'un nouvel appel d'une procédure du
module.

**************
En début de module
Public VariableA

Dans ce cas, la variable est
utilisable ET modifiable par les procédures ou
fonctions de tous les modules.


Une variable n'est JAMAIS publique lorsqu'elle est déclarée à l'intérieur
d'une procédure..

Pour utiliser une variable publique dans un module de
classe (tel un UserForm ou un module dépendant d'une WorkSheet), je conseille
de les déclarer publiques dans un module 'standard' et non dans le module de
classe qui les initialise.
Tu peux aussi aller voir cette rubrique
Pierre Fauconnier, (N°1016)
TRANSPOSE
Comment faire pour transposer des lignes et des colonnes en gardant la liaison avec les cellules d'origine ? Le collage spécial transpose ne permet pas ça.
Pour appliquer la fonction TRANSPOSE il faut prendre deux précautions :
a) tu sélectionnes au préalable une plage de la dimension adéquate (dans
le cas de la transposition de la plage A1:D3, une plage à 4 lignes et 3
colonnes),
b) tu tapes =TRANSPOSE(A1:D3) et tu valides matriciellement par CTRL MAJ
ENTREE (sinon tu obtiens #VALEUR!).
Dans ce cas, tu maintiens une liaison avec ta plage initiale.
Bernard Mazas, (N°1015)
TENDANCE
Je cherche un exemple concret de l'utilisation de la fonction TENDANCE avec le deuxième paramètre x_connu qui soit différent du premier paramètre y_connu
Suppose que tu connaisses le poids et la taille d'un groupe de 5 personnes
(ex : respectivement 50, 65, 62, 85, 71 et 160, 170, 172, 180, 160) et que
tu veuilles estimer à partir de leur taille le poids d'un autre groupe (tu
connais par exemple les tailles de 3 autres personnes 181, 175 et 165).
Tu écriras dans une feuille :
dans les cellules A1:A5 les poids 50, 65, 62, 85 et 71.
dans les cellules B1:B5 les tailles 160, 170, 172, 180 et 160.
dans les cellules C1:C3 les tailles 181, 175 et 165.
puis dans la plage D1:D3 la formule =TENDANCE(A1:A5;B1:B5;C1:C3) à valider
par CTRL MAJ ENTREE.
tu obtiens les poids des trois personnes obtenus par la régression linéaire
définie par les deux premières séries de valeurs.
Bernard, (N°1014)
Switch
Comment écrire en VBA quelque chose du genre If Expr1 = "Abc : " Or Expr1 = "Def : " Or Expr1 = "Hij : " _ Or Expr1 = "Klmn : " then ...
Une possibilité avec la fonction switch :

Sub AvecSwitch()
Dim pos
Expr1 = Range("A1").Text
pos = Switch(Expr1 = "ABC", 0, Expr1 = "DEF", 0, Expr1 = "GHI", 0, Expr1 =
"JKL", 0)
If pos = 0 Then
MsgBox "Trouvé"
Else
MsgBox "Pas trouvé"
End If
End Sub
Alain Vallon, (N°1013)
SUPPRESPACE
Dans mes cellules j'ai fréquemment un espace avant mes données ce qui est gênant pour trier.
"=SUPPRESPACE(A1) sauf s'il y a besoin de conserver des espaces autres
qu'espaces simples entre les mots (un double espace sera transformé en
simple espace)

Sinon :
=SI(GAUCHE(A1)=" ";DROITE(A1;NBCAR(A1)-1);A1)
Eric Jeanne, (N°1012)
SUB ou FUNCTION
Quelle différence entre une Sub avec paramètres : Sub Lolo1(parametre1)et une Function : Function Lolo2(parametre1)
La seule différence, c'est que la fonction renvoie une valeur alors que
la Sub ne renvoie rien du tout.

A part ça, c'est la même chose.
Laurent Longre, (N°1011)
SPLIT
Comment par VBA répartir dans plusieurs colonnes des mots séparés par "\"
Si dans la colonne A tu as des données du type
C:\mondossier\mon_sous_dossier\mondocument.xls .

Sub répartir
For Each cel In Range("A:A")
If cel.Value <> "" Then
c = cel.Address
Données = Split(Range(c).Value, "\")
range(c).offset(0,1).value=Données(0)
range(c).offset(0,2).value=Données(1)
range(c).offset(0,3).value=Données(2)
range(c).offset(0,4).value=Données(3)
End If
Next cel
End Sub

La fonction split crée un tableau dont le premier élément d'index 0 contient
les signes avant le premier séparateur, (ici \\\).
Si on ne connait pas le nombre d'éléments maximum de ce tableau
c'est à dire par exemple le nombre de sous dossiers imbriqués, utilise

For i = 0 To UBound(Données)
Range(c).Offset(0, i + 1).Value = Données(i)
Next i

à la place des 4 range (c).offset...
Ubound renvoie le nombre maximum d'éléments dans le tableau

Cette macro écrit donc en colonne B : c:
en col C : Mondosiier
En col D : mon sous_dossier
en col E : mondocument.xls
******************************************

La fonction Split de VBA existe pour excel 2000 et XP mais pas pour VBA
... alors voici une macro de Pierre :

Function Split97(chaine As String, Separateur As String)
Dim i As Integer,
NbreTab As Integer
Dim Debutchaine As Integer
Dim Tableau()

NbreTab = 0
Debutchaine = 1
For i = 1 To Len(chaine)
If
Mid(chaine, i, 1) = Separateur Then
NbreTab = NbreTab + 1

ReDim Preserve Tableau(1 To NbreTab)
Tableau(NbreTab) = _

Mid(chaine, Debutchaine, i - Debutchaine)
i = i + 1

Debutchaine = i
End If
Next i
If i > Debutchaine Then

NbreTab = NbreTab + 1
ReDim Preserve Tableau(1 To NbreTab)

Tableau(NbreTab) = _
Mid(chaine, Debutchaine, i - Debutchaine)

End If
If NbreTab = 0 Then
ReDim Tableau(1)

Tableau(1) = chaine
End If
Split97 = Tableau()
End Function
Michel Holderith, Stéphane Royer, Flo Cabon, Pierre Fauconnier, (N°1010)
SLEEP
Que fait la fonction sleep ?
Sleep est une fonction non documentée qui permet de suspendre l'exécution
d'une procédure
Ci-dessous les 4 solutions que je connais pour créer une temporisation


1 : tempo par boucle Inconvénient : dépend de la vitesse de la
machine
Tempo = 1000
For zz = 1 To Tempo
Next

2 : tempo par Timer
Inconvénient : pas de différence de vitesse notable en dessous de
0.05 s de tempo
Start_V = Timer ' Définit l'heure de début.
Do While Timer < Start_V + 0.03
DoEvents ' Donne le contrôle à d'autres processus.
Loop

3 : suspension du code par la fonction Sleep(nb millisecondes)
Inconvénient : pas de différence de vitesse notable en dessous de 50msec
Sleep (1000) ' dans le code 1000 suspend l 'exécution 1 seconde
Sleep (100) ' dans le code 100 suspend l 'exécution 1/10 de seconde
Sleep (10) ' dans le code 10 suspend l 'exécution 1/100 de seconde

4 : ne rien faire, ça marche aussi bien mais affichage dépend
de la vitesse de la machine

Un exemple avec la fonction SLEEP pour afficher un msgbox temporairement :

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Tempo()
Application.StatusBar = "Msg 1"
Sleep (3000) ' pause de 3 secondes
Application.StatusBar = "Msg 2"
Sleep (3000) ' pause de 3 secondes
Application.StatusBar = "Prêt"
End Sub
Robert Dezan, (N°1009)
SET
A quoi sert l'instruction "set"
Si tu écris
truc = cells(1), truc va prendre la valeur de la cellule 1
truc est donc un nombre, un texte, un vrai / faux...

si tu écris
set truc = cells(1)
truc représente l'OBJET cellule et tu peux utiliser truc à la place de
cells(1) :
truc.value donne le contenu de la cellule
truc.offset(1,0) la cellule du dessous..

l'utilisation de set pour manipuler des objets est très importante

Un autre exemple
quand tu cherches quelquechose avec find tu peux dire
cells.find("truc").activate
puis faire référence à activecell

mais il vaut mieux dire
set celluletrouvée=cells.find("truc")
et utiliser directement celluletrouvée, notamment en commencant par
if not celluletrouvée is nothing...
Jacques Chaussard, (N°1008)
Références circulaires, itération
Comment faire fonction les références circulaires ?
Les références circulaires sont utiles pour des calculs itératifs convergents où le résultat
d'une itération dépend du résultat précédent. Comme il faut bien s'arrêter un jour, il faut
indiquer la condition d'arrêt en fait on indique dans les options une double condition d'arrêt
:
précision atteinte et (on n'est jamais trop prudent) nombre d'itération. Si tu mets 0,01 comme
précision le calcul s'arrêtera dès que le résultat d'une itération sera identique au résultat
précédent à 1/100 près ou à la n-ième itération si cette précision n'est pas atteinte.
Exemple : calcul de la valeur d'un série dont le i+1 -ième élément se calcule à partir de
l'élément i.
Geo, (N°1007)
REFERENCE 3D
Qu'est ce qu'une référence 3D
On entends par 3D, un système de références basé sur un n° de ligne(row)
+ un n° de colonne(column) + un nom de feuille (sheet). L'utilisation de l'espace
"3D" est peu connue sur les tableurs. Elle peut s'avérer fort utile dans certains
cas.
Exemple:
vous pouvez écrire simultanément dans plusieurs feuilles en réalisant préalablement une
sélection des feuilles à modifier;
- maintenez la touche Ctrl enfoncée et cliquez sur les onglets de
feuilles;
- écrivez une valeur dans une cellule;
- vérifiez ensuite dans chaque feuille, elles contiennent toutes la
même valeur au même endroit.

2eme exemple, fonction 3D:
Vous voulez récapituler le contenu de plusieurs feuilles. Pour
additionner les plages A1:A10 de 10 feuilles
(feuil1, feuil2 ... feuil10), vous pouvez utiliser la fonction somme
avec cette syntaxe:
=SOMME(feuil1:feuil10!A1:A10)
ou
=SUM(sheet1:sheet10!A1:A10) avec la version Américaine

Ça marche aussi avec des feuilles renommées:
=SOMME(janvier:decembre!A1:A10)
à condition que le nom "janvier" remplace le nom initial "feuil1" et le
nom "decembre" remplace "feui112"
Christian Herbé, (N°1006)
REDIM
Quel est l'usage de Dim et de Redim ?
À l'origine, c'est-à-dire, dans le BASIC original, DiM servait
uniquement à définir des tableaux, de variables. (Aujourd'hui Dim sert à
toutes les sauces, mais ça c'est une autre histoire). Ces tableaux étaient
définis une fois pour toute, et les dimensions étaient immuables. La seule façon
pour les modifier était d'effacer le tableau, de le recréer et de
le remplir à nouveau.

Avec le temps, et l'évolution du Basic, est venue l'idée de permettre
l'effacement et le redimentionnement du tableau en une seule opération, d'où
l'expression REDIM. Redim seul efface les données du tableau précédent alors
que Redim Preserve redéfinit les dimensions du tableau tout en conservant les
données qu'il contient déjà. On utilise cette syntaxe dans une boucle sur x
objets dont seulement une partie, dépendant d'un critère donc non connue au
départ, devra remplir le tableau. Cela permet de créer quelque chose qui
ressemble aux tableaux dynamiques supportés par d'autres langages.
Clément, Frédéric Sigonneau, (N°1005)
Recherche dans un tableau : RECHERCHE V
Comment rechercher une valeur dans un tableau avec rechercheV ?
La fonction RECHERCHEV se construit avec quatre arguments.

Le premier est la valeur cherchée dans la colonne n°1 de ton tableau (code
produit par exemple), le deuxième la référence de la plage ou le nom du
tableau y compris la première colonne et la ligné d'étiquettes, le troisième
l'index de colonne pour le retour. Par exemple, si la code produit est en
colonne C, le prix unitaire en D et la quantité en E, tu indiquera 3 en
troisième argument si tu veux la quantité ou 2 si tu veux le prix (C = n°1,
D= n°2 et E = n°3). Le quatrième argument est VRAI/FAUX (ou 1/0). Si ton
choix est FAUX (ou 0), Excel cherchera dans la colonne n°1 la valeur exacte
que tu as indiqué comme premier argument : si excel ne trouve pas (code
produit inexistant par exemple), il renvoie une valeur d'erreur. Dans ce
cas, le tableau n'a pas besoin d'être trié : la colonne 1 peut être dans
n'importe quel ordre. Deuxième possibilité, tu choisis VRAI (ou 1). Dans ce
cas, et à condition que le tableau soit trié sur la colonne n° 1 en ordre
croissant, excel s'arrêtera à la ligne dont la valeur (en colonne 1) est la
plus grande qui soit inférieur ou égale à ton premier argument. Si par
exemple, pour des tranches de ventes (0/100/500/1000/3000) figurant en
colonne 1 tu indiques un argument n°1 égal à 600, il choisira la ligne 500.
Très pratique pour retourner une valeur en fonction d'un calcul de
fourchette (jusqu'à 100, 3% de remise, de 300+ à 500, 2% etc...).

Voir aussi les explications de la page lexique, plus détaillées et télécharge ce classeur exemple

Cette astuce est illustrée dans ces classeurs exemples :
gd-recherchevindexequiv (téléchargé 20285 fois)
rh-recherchev (téléchargé 10808 fois)
jb-indexequivprix (téléchargé 9874 fois)
Richard Hermann, Robert Dezan, (N°1004)
Rechercher Remplacer
Quels sont les différents jokers que l'on peut utiliser dans les fenêtres rechercher remplacer ~? Et ... comment faire pour remplacer "Ca vaut ***" par "Ca vaut +++" ?
* permet de rechercher n'importe quel groupe de caractère alors que ? permet
d'omettre un seul caractère.
Pour rechercher des caractères spéciaux comme *, ~?, ~ il faut les faire précéder d'un tilde :
~*, ~~, ~?...
Michel Gaboly, (N°1003)
RANDOMIZE
je voudrais que ma macro renvoie aléatoirement un nombre entre 1 et 10
RND génére des valeurs comprises entre 0 (inclus) et 1 (exclus)
Si tu souhaites faire plusieurs tirages et obtenir des nombres réellement aléatoires, fais
précéder RND de l'instruction RANDOMIZE:

for i = 1 to 5
Randomize
msgbox Int((supérieur - inférieur + 1) * Rnd + 1)
next i
Christian Herbé, (N°1002)
OBJETS (propriétés, méthodes)
Qu'appelle-t-on un objet dans excel ?
La définition d'un objet en programmation est différente de celle des objets de la vie
quotidienne puisqu'il s'agit généralement d'objets virtuels. Mais comme dans la vie, un objet a
des propriétés et des méthodes. Une voiture a des propriétés: la couleur, la carrosserie, le
moteur. Elle a des méthodes : accélerer, freiner, rouler ...
Il en va de même pour un objet informatique. Un document Excel a des propriétés : son nom, sa
version... Il a des méthodes : ajouter une feuille. On appliquera la méthode "add" à
l'objet workbook (document) et l'on déterminera ses propriétés en lui attribuant un nom, des
options de protections...Créer un objet en lui attribuant des propriétés définies s'appelle l'instanciation.
L'intérêt de la programmation orientée objet est qu'il n'est pas nécessaire de connaître toutes
les propriétés d'un objet pour l'utiliser mais seulement celles sur lesquelles on veut agir. Un
objet peut contenir d'autres objets. C'est le cas de l'objet application (Excel par exemple)
qui peut contenir les objets worbooks qui eux-mêmes peuvent contenir des objets worksheets
(feuilles) qui eux-mêmes contiennent des objets ranges (cellules ou plages
de cellules). On parle alors de conteneurs.
Christian Herbé, (N°1001)
MODULE DE CLASSE
Quelle est la différence entre un code attaché à une feuille et à un module ?
"- Modules de feuille : l'objet parent est la feuille de calcul
- Module 'ThisWorkbook' : l'objet parent est le classeur
- Module de classe : l'objet parent est l'objet instancié à partir de la
classe
- Module standard : pas d'objet parent

L'objet parent est l'objet auquel se réfère le module. On peut accéder à
cet objet par le mot-clé "Me" (bien que ce ne soit pas indispensable).
Par exemple :

Me.Name dans le module "Feuil1" : renvoie le nom de la feuille
Me.Name dans le module "ThisWorkbook" : renvoie le nom du classeur
Me.Name dans le module "Class1" : renvoie le contenu de la variable ou
propriété "Name" de l'objet telle qu'elle est définie dans le module de
classe
Me.Name dans un module standard : génère une erreur d'exécution.

Les modules de feuille et 'ThisWorkbook' sont des types particuliers et
prédéfinis de modules de classe. Ils sont destinés à contenir le code
relatif à l'objet parent et aux objets qu'il contient (procédures
événementielles de la feuille de calcul ou du classeur).

Ceci concerne essentiellement :

1) Les procédures événementielles

Par exemple :

- Si l'on veut intercepter toutes les saisies de l'utilisateur dans la
feuille Feuil1, on utilise en principe l'évènement Worksheet_Change de
son module de code.

- Si l'on veut intercepter les saisies dans n'importe quelle feuille du
classeur, on utilise l'évènement Workbook_SheetChange du module
'ThisWorkbook'.

- Si l'on veut intercepter les saisies dans n'importe quelle feuille de
n'importe quel classeur, on utilise l'événement App_SheetChange d'une
variable Application définie dans un module de classe.

Comme l'application est conteneur du classeur, qui est lui-même
conteneur de la feuille, on peut aussi intercepter par exemple les
saisies dans une feuille particulière à partir de Workbook_SheetChange
ou même d'une procédure App_SheetChange, mais c'est moins direct et pas
vraiment approprié.

2) Les objets :

Tout le code d'un contrôle (bouton, etc) posé dans une feuille de calcul
doit impérativement (procédures événementielles attachées au contrôle)
ou devrait être (autres procédures) placé dans le module de cette même
feuille.

Un piège classique : quand on utilise la propriété Range() seule sans la
faire précéder de Worksheets("..."):

- Dans les modules standard, la feuille contenant le Range sera
implicitement la feuille active (Range("A1") renvoie donc
ActiveSheet.Range("A1")).
- Dans les modules de feuille, il ne s'agit *pas* de la feuille active,
mais de la feuille parent du module (Range("A1") renvoie
Me.Range("A1")). Si l'on veut se référer à la feuille active, il est
donc nécessaire dans les modules de feuille de l'identifier
explicitement: ActiveSheet.Range("A1").

3) Les fonctions personnalisées :

Il est impossible d'appeler dans une formule sous Excel une fonction
perso définie dans un module de feuille ou le module 'ThisWorkbook'. Il
faut les définir uniquement dans des modules standard.

4) La persistance des modules :

Les modules de feuille étant attachées à des feuilles de calcul, si l'on
déplace ou supprime celles-ci, les modules seront déplacés ou supprimés
en même temps. Les modules standard et de classe ne peuvent pas être
affectés par les manipulations de l'utilisateur sous Excel. Le module
'ThisWorkbook' est indestructible.

Conclusion : en principe, tant qu'on ne manipule pas des procédures
événementielles ou des contrôles posés sur des feuilles, il vaut
beaucoup mieux placer son code dans des modules standard plutôt que dans
des modules de feuille ou 'ThisWorkbook'.

Les modules de feuille et 'ThisWorkbook' sont essentiellement employés
pour définir des procédures événementielles attachées respectivement aux
feuilles de calcul (ou aux objets qu'elles contiennent) ou au classeur
dans son ensemble. Les modules de classes sont essentiellement utiles
pour gérer des événements de niveau application.

OUF !!! J'espère que j'ai rien oublié...

Et en complément parce qu'il est intarissable sur le sujet, la
réponse humoristique de LL, qui a au moins le
mérite d'être claire !

Au fait, sa conclusion c'est que ça ne sert pas à grand chose... voire à rien
du tout !

Et enfin, pour voir que quand même on peut faire quelque chose d'utile avec les modules
de classe, href="http://disciplus.simplex.free.fr/classeursxl/dm-moduleclasse.zip">télécharge
border="0" src="../images/boutons/download.gif" width="16" height="16"> href="http://disciplus.simplex.free.fr/classeursxl/dma-moduleclasse.zip"> ce classeur
de
Daniel Maher qui permet de manipuler des séries de boutons sur un userform.

Et regarde aussi ici l'utilisation proposée par
Frédéric Sigonneau

Cette astuce est illustrée dans ce classeur exemple :
dm-moduleclasse (téléchargé 4662 fois)
Laurent Longre, (N°1000)
MID
Je voudrais me débarasser de la fonction round() sur toute une série de cellules ayant des formules du type "=ROUND(AB24/E$20,0". C'est-à-dire ne conserver que "=AB24/E$20" (la longueur de cette chaîne ne varie pas quelle que soit la cellule à traiter).
Sub SupprRound()
For Each cell In Selection
cell.Formula = "=" & Mid(cell.Formula, 8, 9)
Next
End Sub

explications :
La fonction Mid extrait d'une chaine de caractères un nombre spécifié à
partir d'une position spécifiée également.
La propriété Formula renvoie les formules sous forme d'une chaine de
caractères. Mid extrait donc de la chaine cell.Formula 9 caractères à partir
du 8ème. On concatène avec le signe ""="" devant pour que le résultat reste
une formule.
Frédéric Sigonneau, (N°999)
MATRICIELLES (formules)
Qu'est ce que les fonctions matricielles ont de particulier ?
Par "fonctions matricielles", on se réfère généralement à des fonctions
qui renvoient des données sur une plage ou matrice (ex avec DROITEREG,
FREQUENCE ...).
XL permet aussi l'utilisation de "formules matricielles"; il s'agit
cette fois de faire l'inverse c'est à dire utiliser une matrice de
données pour un seul résultat. Exemple(*) avec le calcul d'une somme des
carrés des écarts
(1000 excuses auprès des non-statisticiens):
si les données sont en A1:A100, le calcul classique consiste à entrer la
fonction suivante dans chaque cellule de la colonne B:
=(A1-moyenne(A$1:A$100))^2
puis à faire la somme des valeurs obtenues dans une autre cellule.

Il est plus rapide d'utiliser la formule matricielle suivante (sur une
seule cellule):
=SOMME((A1:A100-MOYENNE(A1:A100))^2)
et de valider à l'aide de la combinaison de touches: Ctrl Shift Entrée
(des crochets ({}) doivent apparaitre à chaque extrémités de la formule)

(*)
Ce calcul peut être fait avec la fonction SOMME.CARRES.ECARTS()

Traduction des fonctions citées:
































Fr

BR/US

Allemand
DROITEREG
LINEST
RGP
FREQUENCE
FREQUENCY
HÄUFIGKEIT
SOMME
SUM
SUMME
MOYENNE
AVERAGE
MITTELWERT
SOMME.CARRES.ECARTS
DEVSQ
SUMQUADABW
Christian Herbé, (N°998)
MATCH
Comment utiliser l'instruction match ?
object.MatchRequired = True

La syntaxe de la propriété MatchRequired comprend les éléments suivants :

Élément Description
object Objet valide.
Boolean Facultatif. Spécifie si le texte saisi doit correspondre à un
élément existant de la liste.

Les valeurs de Boolean sont les suivantes :
Valeur Description
True Le texte saisi doit correspondre à une entrée de la liste.
False Le texte saisi peut être différent de toutes les entrées
existantes de la liste (par défaut).
Denis Pasquier, (N°997)
Liste de choix
Comment proposer une liste de choix à partir d'une série de données en colonne
Nomme les données sur tes copains, ex. ListeMPFE puis sur une autre
feuille , et après avoir sélectionné les cellules où tu désires que cette
liste apparaisse :
Données/Validation/Autoriser:Liste/Source:=ListeMPFE

PS il y a toute une page sur les listes de choix ici
ChrisV, (N°996)
LIKE
Comment comparer des chaînes de caractères
Like compare les deux chaînes de caractères, et renvoie vrai si elles sont
parfaitement identiques, elle est sensible à la casse des caractères...
Alors que = "oui" renvoit VRAI même si le contenu de la cellule est
égal à "OUI".
L'équivalent de Like, en fonction feuille de calcul est EXACT()

Complément de l'aide d'excel :

Permet de comparer deux chaînes.
Syntaxe : result = string Like pattern

Le comportement de l'opérateur Like dépend de l'instruction Option Compare.
Par défaut, la méthode de comparaison de chaînes de chaque module est Option
Compare Binary dans lequel
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

La méthode Option Compare Text compare des chaînes sans prise en compte de la
casse, en fonction d'un ordre de tri textuel défini par les paramètres régionaux
de votre système.
(A=a) < (À=à) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)


La gestion intégrée des critères spéciaux permet une grande souplesse dans les
comparaisons de chaînes. Vous pouvez en effet utiliser des caractères génériques,
des listes de caractères ou des plages de caractères, combinés à votre gré, pour
comparer des chaînes. Le tableau suivant définit les caractères autorisés dans
l'argument pattern et leur correspondance :






Caractère(s) dans pattern

?

*

#
Correspondance dans l'argument string

Tout caractère unique.

Aucun ou plusieurs caractères.

Tout chiffre unique (de 0 à 9).
ChrisV, Microsoft, (N°995)
ITEM
Quand parle-t-on des items et à quoi sert le (0 après (xldown) ?
Lorsque l'ActiveCell est A1, comment sélectionner la plage A1:A4 sachant
que les cellules A2, A3, A4 sont vides alors que A5 est remplie ?
Range(ActiveCell, ActiveCell.End(xlDown)(0)).Select

Le (0), c'est un coup des item...

Première réponse :
Range(...)(X, Y) est un raccourci de la propriété .Item:
Range(...).Item(X, Y)

Cette propriété est décrite dans l'aide VBA. Elle présente certaines
particularités. Par exemple, le premier paramètre peut être supérieur au
nombre de cellules comprises dans la plage. Dans ce cas, Range(Ref)(X)
lit la Xième cellule des colonnes délimitées par la référence indiquée.
Par exemple:

Range("A1:E1")(6) correspond à B1 (6ème cellule de la plage A1:E65536)
Range("B10:F15")(6) correspond à B11 (6ème cellule de B10:F65536)

La propriété .Item est l'accesseur des objets Range. Ainsi, quand on
utilise par exemple Sheets(ShName).Cells(5,6), on utilise en fait de
manière implicite la propriété .Item, renvoyant un élément de la
collection Cells : Sheets(ShName).Cells.Item(5,6).

Pour renvoyer la cellule (X,Y) d'une plage variable, il est inutile de
passer par .Cells(X,Y). L'utilisation directe de la propriété Item
-Range(Ref).Item(X,Y) ou Range(Ref)(X,Y)- est beaucoup plus rapide en
vitesse d'exécution, et même un peu plus rapide que l'emploi de Offset.

Deuxième réponse, du même :
En très gros, on peut dire que la propriété Item correspond à la
fonction de feuille de calcul INDEX. Mais en beaucoup plus chinois
(pardon Hai-Li):

MaPlage(RowIndex, ColumnIndex) renvoie la référence de la cellule qui se
situe à l'intersection de la ligne RowIndex et de la colonne ColumnIndex
de MaPlage, de la même manière que =INDEX(MaPlage;NumLigne;NumCol) dans
une feuille de calcul.

Plage(1) renvoie la référence de la
première cellule de la plage.

Par exemple, mettons que tu as dans la variable Zaza (Range) la
référence d'une plage de dimensions inconnues:

Set Zaza = Selection

Si tu veux par exemple sélectionner la première cellule de cette plage,
dont tu ne connais pas a priori l'adresse ni les dimensions, tu peux
utiliser Item(1):

Zaza.Item(1).Select, ou alors plus simplement, Zaza(1).Select

Zaza(2) renvoie la deuxième cellule de la plage, en lisant celle-ci
ligne par ligne:

Range("A1:C3")(1) = Range("A1")
Range("A1:C3")(2) = Range("B1")
Range("A1:C3")(3) = Range("C1")
Range("A1:C3")(4) = Range("A2")
...
Range("A1:C3")(9) = Range("C3")

Pour sélectionner la dernière cellule de la plage Zaza :

Zaza(Zaza.Count).Select

Zaza(5, 13), équivalent de Zaza.Item(5,13) renvoie la cellule qui se
trouve sur la 5ème ligne, 13ème colonne de la plage Zaza.

Si le paramètre "RowIndex" de la propriété Item(RowIndex) est "hors
plage", ça marche aussi:

Range("B2")(3) = Range("B4") (on descend de 3 lignes vers le bas à
partir de B2).

Si RowIndex est inférieur à 1, Cellule.Item(N) "remonte" de (N+1)
lignes:

Range("B2")(0) = Range("B1")
Range("C3")(-1) = Range("C1")

Même chose pour le deuxième paramètre, ColumnIndex, mais pour le
décalage par colonne:

Range("B2")(1, 3) = Range("D2")
Range("B2")(1, 0) = Range("A2")
Range("D3")(1, -2) = Range("A3")

Quand la plage est constituée d'une seule cellule, Plage(X, Y) ou
Plage.Item(X, Y) est équivalent à Plage.Offset(X - 1, Y - 1). Mais la
propriété Item est plus rapide qu'Offset à l'exécution de la macro.

Si la plage est constituée de colonnes (issues de la propriété .Columns
ou .EntireColumn) ou de lignes (issues de .Rows ou .EntireRow), alors la
propriété Item renvoie aussi, respectivement, une colonne ou une ligne,
et non pas une cellule unique.

Par exemple :

Dim Plage As Range
Set Plage = Range("A1:C3").Columns
MsgBox Plage(2).Address(0, 0)
' ou MsgBox Plage.Item(2).Address(0, 0)

= affiche "B1:B3" (2ème colonne de la plage)

Set Plage = Range("A1:C3").Rows
MsgBox Plage(3).Address(0, 0)
' ou MsgBox Plage.Item(3).Address(0, 0)

= affiche "A3:C3" (3ème ligne de la plage)

Là aussi, on peut utiliser des décalages "hors plage", et un paramètre
RowIndex inférieur à 1:

Set Plage = Range("A5:C7").Rows
MsgBox Plage(0).Address(0, 0)
' ou MsgBox Plage.Item(0).Address(0, 0)

= affiche "A4:C4" (1ère ligne au-dessus de A5:C7)

Last but not least, tout le monde parle Item sans le savoir dans ses
macros, comme la prose de Mr Jourdain.

Il s'agit en effet de la propriété (dans ce cas, je crois que les
amerloques disent "accessor") par défaut des objets Plage.

Donc en fait, quand on utilise par exemple :

Cells(5, 8).Select

... sans le savoir, on utilise la propriété Item, sous sa forme
implicite :

Cells.Item(5, 8).Select

Ce qui veut dire : sélectionner l'Item (5, 8) de l'objet Cells, qui
représente la totalité des cellules de la feuille de calcul.

Même chose pour les propriétés Rows et Columns.

Et pour mieux tout embrouiller, comme la propriété Item renvoie une
référence de cellule, donc un objet sur lequel on peut appliquer encore
la propriété Item, les Item peuvent s'enchaîner ad libitum, ce qui fait
que l'instruction suivante, quoique complètement débile, est
parfaitement valide:
Cells(3)(4,5)(-2)(8,1)(12)(-5)(0).Select
Laurent Longre, (N°994)
INSTANCE
J'entends parler d'instance d'excel. De quoi s'agit-il ?
Une instance (d'Excel ou d'autre chose) c'est un exemplaire d'un objet.
Lorsque tu ouvres Excel sur ton PC par un clic sur un raccourci vers Excel.exe,
tu crées une instance de l'objet Excel (l'application Excel). Si tu cliques (ou
double cliques) plusieurs fois sur ton raccourci, tu crées autant d'instances
d'Excel que de clics (ou double clics). En faisant Ctrl+Alt+Suppr, tu peux les
compter.

Tu peux aussi créer des instances d'Excel avec du code :

Sub TestExcel1()
Shell "Excel.exe"
End Sub

ou en utilisant l'Automation :

Sub TestExcel2()
Dim xl As Object
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Add
xl.Visible = True
End Sub

Exécute ces deux petites procédures, puis retourne compter le nombre de
Microsoft Excel dans la liste des tâches actives :)
N'oublie pas de les refermer, un seul Excel suffit la plupart du temps !
Frédéric Sigonneau, (N°993)
INDIRECT
A quoi sert la fonction indirect ?
c'est utile lorsque tu as une référence (addresse) de cellule et que tu
veux avoir le contenu de cette addresse. Si la cellule A1 contient le texte
"B2" et que la cellule B2 contient la valeur 1,333 :
INDIRECT($A$1) égale 1,333
isabelle, (N°992)
FORMULA- FORMULALOCAL
Quand doit-on utiliser formula ou formula local ?
La propriété Formula renvoie ou définit une formule dans la langue anglaise
FormulaLocal renvoie ou définit une formule dans la langue du pays, donc en
français pour nous. Value renvoie ou définit une valeur.
Benead, (N°991)
EVALUATE
A quoi sert la fonction evaluate ?
La fonction Evaluate calcule l'expression passée en argument comme si
elle était saisie dans une cellule de la feuille de calcul active, et
renvoie le résultat correspondant. L'expression doit correspondre à une
formule en anglais.

Par exemple, Evaluate("SUM(A1:B4)") renvoie le même résultat que la
formule =SOMME(A1:B4) si elle était saisie dans une cellule de la
feuille active.

Cette fonction permet également d'évaluer le résultat de formules
matricielles.

Les [ ] sont un raccourci syntaxique de cette fonction. Par exemple,
[SUM(OFFSET(A1,B1,,5))] est synonyme de
Evaluate("SUM(OFFSET(A1,B1,,5))"), ce qui renvoie en l'occurrence la même
chose que la formule =SOMME(DECALER(A1;B1;;5))
Laurent Longre, (N°990)
EURO (symbole)
Comment faire apparaitre le symbole euro dans excel ?
Soit tu te le configures dans les paramètres régionaux de Windows (onglet
Nombre) : dans ce cas il te suffira de cliquer sur l'icône de format
Monétaire pour l'avoir par défaut.
Soit tu te crées un format personnalisé avec du genre # ##0.00" €"
(le symbole euro c'est alt+0128)
Et tu appliques ensuite ça avec format Cellule [Nombre]
PS une page entière de ce site est consacrée à la résolution des problèmes
liés à l'euro.
Catherine et Sainte Zaza, (N°989)
DECALER
Quels sont les paramètres de la fonction décaler ?
Dans la fonction DECALER, tu as 5 paramètres :

1. A partir de quelle cellule
2. De combien de cellules se décaler vers le bas (vers le haut si valeur négative)
3. De combien de cellules se décaler vers la droite (vers la gauche si valeur négative)
4. Hauteur de la plage (en nombre de cellules)
5. Largeur de la plage (en nombre de cellules)

Si le décalage vertical ou horizontal (paramètres 2 et 3) sont omis, ils sont égaux à 0.
Si les paramètres hauteur ou largeur sont omis, ils sont égaux à 1.

Quand tu fais par exemple =DECALER(A1;3;5) ça veut dire "cellule qui se trouve 3 cellules vers le bas et 5 cellules vers la droite à partir de A1", donc F4 si mon calcul est bon.

=DECALER(A1;5;;3), ça donne la plage qui se trouve 5 cellules vers le bas à partir de A1 et qui comporte 3 cellules de haut. Le 3° paramètre est ignoré (;;) donc égal à zéro: aucun décalage horizontal. Ce qui donne la plage A6:A9. Là il n'y a qu'un décalage vertical.

Et dans =DECALER(A1;;;3;2), les deux paramètres de décalage sont nuls. Donc ça renvoie simplement la plage faisant 3 lignes de haut et 2 de large à partir de A1, soit A1:B4. Il n'y a plus de décalage.

La fonction décaler est très utile pour définir de façon dynamique une plage de données : la plage s'adapte aux données que vous entrez sur votre feuille. Prenons un exemple : en A1 vous avez une étiquette : prénoms. En A2 A3, .... A20 vous avez entré des prénoms. Vous pouvez nommer cette plage MesPrénoms via le menu insertion/nom/définir en mettant dans la zone de formule =A2:A20.
Mais si vous ajoutez un prénom en bas de cette liste, MesPrénoms n'en tiendra pas compte. Pour que ce soit le cas, dans la zone de formule tapez ceci :
=decaler($2;;;nbval(:)-1).
MesPrénoms sera ainsi défini de la façon suivante : cellule de référence = A2. Pas de décalage vertical ou horizontal, hauteur de la plage = nombre de valeurs contenues dans la colonne A-1. largeurde la plage non définie donc égale à une colonne (A) .Le -1 après nbval est là pour tenir compte de la présence de l'étiquette. Si d'autres cellules n'appartenant pas à cette plage sont renseignées dans la colonne A il faut bien entendu en tenir compte et modifier ce -1. Si maintenant vous ajoutez un prénom sous les précédents, MaPlage l'incluera automatiquement.

Vous pouvez sur cette exemple définir des plages horizontales, mais aussi utiliser d'autres fonctions pour calculer un des paramètres.

PS : des exemples sont disponibles, notamment dans les pages formules, graphiques et TCD.
La fontion décaler est en effet très commode pour mettre automatiquement à jour des plages de données qui varient et qui sont utilisées comme source.
Laurent Longre, Flo Cabon, (N°988)
DATEDIF
Je ne trouve pas la description de la fonction Datedif
Calcule le nombre de jours, de mois ou d'années séparant deux dates. Cette fonction est fournie pour assurer une compatibilité avec Lotus 1-2-3.

Syntaxe

DATEDIF(date_début;date_fin;unité)

Date_début est une date qui représente la première date, ou date de début, de la période. Les dates peuvent être entrées sous forme de chaînes de caractères délimitées par des guillemets (par exemple, "30/1/2001"), sous forme de numéros de série (par exemple, 36921, qui représente le 30 janvier 2001, si vous utilisez le format de calendrier depuis 1900), ou sous forme de résultats d'autres formules ou fonctions (par exemple, DATEVAL("30/1/2001")).

Date_fin est une date qui représente la dernière date, ou date de fin, de la période.

Unité est le type d'informations qui doit être renvoyé.

Unité Renvoie
"Y" Le nombre d'années entières comprises dans la période.
"M" Le nombre de mois entiers compris dans la période.
"D" Le nombre de jours compris dans la période.
"MD" La différence entre les jours de date_début et date_fin. Les mois
et les années des dates ne sont pas pris en compte.
"YM" La différence entre les mois de date_début et date_fin. Les jours
et les années des dates ne sont pas pris en compte.
"YD" La différence entre les jours de date_début et date_fin. Les
années des dates ne sont pas prises en compte.


Exemples

DATEDIF("1/1/2001";"1/1/2003";"Y") égale 2, c'est-à-dire deux années entières dans la période.

DATEDIF("1/6/2001";"15/8/2002";"D") égale 440, c'est-à-dire 440 jours entre le 1er juin 2001 et le 15 août 2002.

DATEDIF("1/6/2001";"15/8/2002";"YD") égale 75, c'est-à-dire 75 jours entre le 1er juin et le15 août, sans tenir compte des années des dates.

DATEDIF("1/6/2001";"15/8/2002";"MD") égale 14, c'est-à-dire la différence entre 1 et 15 - le jour de date_début et le jour de date_fin - sans tenir compte des mois et des années des dates.
Microsoft, (N°987)
CUTCOPYMODE
Que signifie application.cutcopymode=false et à quoi ça sert ?
En VBA, Application.CutCopyMode=xlCopy équivaut à Ctrl+C et
Application.CutCopyMode=xlCut à Ctrl+X.
La cellule sélectionnée s'entoure de petits pointillés dans Excel.

Application.CutCopyMode=False ou Application.CutCopyMode=True équivaut à
l'appui sur la touche Echap (annulation du mode Copier ou Coller, disparition des pointillés).
Frédéric Sigonneau, (N°986)
Additions de booléens...
Soient les valeurs suivantes en A1:B4 : 1 8 2 5 1 8 3 4 pourquoi {=SOMME(A1:A4=1)} donne 0 alors que {=SOMME((A1:A4=1)*1)} donne le 2 attendu ?
Et quand les deux Laurent répondent exactement à la même heure cela donne ça :

La fonction Somme accepte des paramètres numériques, booléen ou texte sans broncher,
mais ça ne veux pas dire qu'elle en tient compte! C'est ainsi que la somme des
cellules A1:A3 suivantes donne 100:

bonjour
100
Vrai

Ce qui revient à dire que Vrai n'est pas converti en numérique!

Par contre, si tu utilises l'opérateur d'addition "+", c'est différent, il s'opère une
conversion de type implicite (basée sur Vrai=1 et faux=0).

J'espère que c'est plus clair.
=============
La conversion de booléens en valeurs numériques n'est faite par Excel
que s'ils sont inclus dans un calcul, donc combinés avec l'un des 4
opérateurs +, -, * ou /, ou alors par l'intermédiaire de la fonction
N().

S'ils sont simplement utilisés tels quels comme paramètres de fonction,
il n'y a pas de conversion.

Il y a une logique dans ce choix. La fonction SOMME accepte tout type de
paramètre, nombres, textes ou valeurs logiques, pour davantage de
souplesse. Quand une plage comporte à la fois des nombres et du texte,
par exemple, la fonction ignore tout simplement tout ce qui n'est pas
numérique (y compris les VRAI) et fait la somme sur les nombres sans
renvoyer d'erreur.

C'est la même chose pour les sommes de tableaux. Par exemple,
=SOMME({VRAI;"Toto";4;5}) renvoie 9. Idem avec =SOMME({VRAI;"12";4;5}).
Dans ce cadre, elle ne fait aucune conversion implicite, et sélectionne
uniquement les valeurs qui sont explicitement de type numérique. Si la
matrice ne contient que des booléens, ils seront donc tous ignorés et la
somme renverra 0.

Les conversions ne sont faites que s'il y a opérations mathématiques
entre les arguments (addition, multiplication etc). C'est un choix comme
un autre, mais il est assez cohérent.
Laurent Mortézai, Laurent Longre, (N°985)
ARRONDI monétaire
Je voudrais arrondir des sommes à 5 centimes.
"=ARRONDI(Nombre/0,05;0)*0,05

Autre : =PLAFOND(A2;0,05). Mais attention c'est un coup de
filou : ça n'arrondit qu'à la tranche supérieure !
Jacques Chaussard, (N°984)
ARRAY (tableau)
Quelle est la signification de tableau en programmation ?
Des exemples de manipulation des tableaux sur la page OUTILS.

Le "Tableau" est un concept de programmation que l'on retrouve
dans différent langage de programmation , un peu comme le
if ...else ... then, avec des nuances au sujet des modalités d'application.

Un "tableau" est avant tout un "conteneur" pouvant rassembler un nombre
impressionnant de données à l'instar d'une simple variable. Le contenu d'un
tableau peut être de type string, numérique, objets (Contrôle, Range, etc.).

Habituellement, on utilise un tableau parce que le résultat d'une action
génère un certain nombre de "Ouput" possibles. Comme nous ne voulons pas
générer une variable pour chacun de ces "ouput", nous les emmagasinons
temporairement dans un tableau. À chaque donnée d'un tableau correspond
un index à partir duquel nous pouvons référencer chacune des données.

Lorsque le tableau a été initialisé de ses données, foncièrement voici
ses principaux avantages:

A) vitesse d'exécution : Comme tout se passe en mémoire vivre ....
comparé à la lecture - écriture de ces informations
par exemple dans des cellules d'excel...

B) La facilité avec laquelle il est possible de référencer un item du
tableau,
(pas d'adresses de cellules ou feuilles à gérer.)

C) Comme dans tous les autres types de variables, il est possible
d'effectuer
toutes sortes d'opérations sur les données contenues dans un
tableau.

D) Ces données sont disponibles pour la durée d'une procédure sans que nous
ayons besoin d'effectuer des opérations d'écriture dans le classeur.

E) Il y a sûrement d'autres dont j'oublie.... ou ne connais...

Concernant l'utilisation d'un tableau, il est difficile de préciser
des domaines particuliers d'utilisation parce qu'en fait un tableau
peut contenir toutes sortes de données. Ce sont surtout par ses avantages
et par le fait qu'on peut sous son "toit" réunir plusieurs résultats d'une
action qui
en fait, justifie son emploi.

Excel ne peut gérer un tableau de plus de 2 dimensions c'est-à-dire
X nombre de lignes par Y nombre de colonnes, bien que le concept
"Tableau" n'en est pas limité.

Personnellement, tu n'as peut-être pas utilisé un tableau en programmation,
mais lorsque tu saisis une formule matricielle, la notion qu'il y a dernière
c'est le tableau. Bien sûr, il est abstrait puisqu'en mémoire vive, mais
Excel
se tape tous les formules intermédiaires que nous devrions écrire sans cette
notion pour arriver au résultat d'une opération.
Denis Michon, (N°983)
Arguments nommés = ou := ?
Dans les formules en VBA, je remarque que parfois il y a = et parfois := peut-on m'expliquer la différence?
On appelle cela des arguments nommés le ":=" signale à VBA que tu utilises un
argument nommé et non pas une affectation de valeur. Avec l'utilisation d'arguments nommés
c'est plus compréhensible mais plus long) et t'évite les virgules de séparation.
Exemple :
avec arguments nommés
Range("A1:A10").Address columnabsolute:=False, relativeto:=True

Sans arguments nommés, les virgules sont obligatoires jusqu'à la valeur
que tu veux définir et c'est moins clair pour celui qui ne connait pas
Range("A1:A10").Address , False, , , True
Hervé, (N°982)
API et DLL
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Pour moi c'est du chinois !
Cette fonction est utile pour connaître les dimensions des objets manipulés
sous Windows. Un paramètre Constante doit être envoyé pour récupérer le résultat en pixels.
Cette fonction fait partie des routines API (Application Programming Interface).
Ces routines sont utilisées chaque fois qu'un problème de programmation ne peut
pas être résolu sous VB ou VBA ou lorsque la mise en oeuvre sous VB ou VBA s'avère
trop compliquée.
Les fonctions API sont elles mêmes contenues dans dans des bibliothèques de
fonctions d'extension DLL.Windows lui même est d'ailleurs bâtisur une
collection de DLL. L'extension d'une DLL est le plus souvent .dll mais
Windows à introduit des exceptions à cette règle et des fichiers d'extension
exe, drv ou ocx ne sont souvent que des bibliothèques DLL. L'utilisation
d'une routine API implique sa déclaration préalable par l'instruction
obligatoire Declare qui indique l'appel à une procédure externe; de plus, le
nom de la bibliothèque est indispensable car elle est chargée dynamiquement
au moment de l'exécution et non statiquement au moment de la compilation.
Pour éviter d'avoir à déclarer chaque fois le chemin complet de la
bibliothèque, ces dernières sont généralement enregistrées dans le
répertoire system de Windows ou dans celui de l'application (d'où l'utilité
du programme regserv32.exe).

Un exemple simple sur la fonction MsgBox permet de mieux comprendre;
l'utilisation de MsgBox en VB ou VBA fait appel à une routine API dont
toutes les déclarations nécessaires ont déjà été intégrées au langage de
programmation, ce qui en simplifie l'utilisation pour l'utilisateur (seuls
les paramètres de la fonction sont à renseigner). Tu peux voir des exemples de la
routine API dans ce classeur à télécharger.

Une DLL est un fichier "annexe" d'un programme qui contient des procédures ou
fonctions "généralistes" (écrites une fois, utilisées de nombreuses fois dans le
programme).
Windows utilise de nombreuses DLL contenant des milliers de fonctions ou
procédures.
Beaucoup de ces fonctions, dites "fonctions de l'API Windows" (pour Applications
Programming Interface), sont utilisables par les programmeurs pour leurs propres
applications à condition de les déclarer correctement (notamment les paramètres
et leur type).
En VB/VBA, la déclaration de ces fonctions doit commencer par le mot clé
Declare. Le mot clé Lib (de Library, bibliothèque, je crois) indique dans quelle
DLL se trouve la fonction utilisée. Dans l'exemple donné, la fonction
GetSystemMetrics est incluse dans la bibliothèque user32.dll.

Il existe un fichier texte (Win32Api.txt) qui liste les déclarations
d'un grand nombre de fonctions de l'API de Windows. On peut en trouver le texte
par exemple à cette adresse

Cette astuce est illustrée dans ce classeur exemple :
mp-msgbox (téléchargé 11738 fois)
Michel Pierron, Frédéric Sigonneau, (N°981)
API
J'entends parler des API mais qu'est ce que c'est au juste ?
API signifie application programming interface
(en français : Interface de développement d'applications).

Tous ces fonctions (API) sont des "accessoires" au logiciel de Windows et
des composantes Microsoft.
La beauté de la chose , c'est qu'elles sont non seulement disponibles
pour Windows et ses applications,
mais elles le sont aussi à tous les développeurs utilisant certains
languages dont vb et vba font partie. Visual Basic (non VBA) possède une
visionneuse de toutes les fonctions , les types et les constantes....
qui sont disponbibles. (d'autres visionneuses existent également)

L'expression "Fonction" est plutôt une image pour aider à comprendre un
peu ce que sont ces API.

Certaines des déclarations dans les API sont a première vue assez hermétiques comme :

SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) And &HFFF7FFFF

En fait, il faut parler de déclaration . Nous déclarons dans le haut du
module l 'appellation de fonction API de Windows qui va nous permettre
d'obtenir l'information désirée. La fonction elle-même (le corps de la
fonction), nous ne la voyons pas et elle n'est pas accessible. Elle fait
partie de l'enchevêtrement du programme windows lui-même.

À moins de bien connaître la structure des fichiers de windows, son
programme écrit en C++, la tâche est souvent ardue de tenter de voir et
d'interprèter le rôle de chacune de ces déclarations (des variables de
celles-ci (paramètres)), et des constantes qu'elles utilisent et de
connaître ce à quoi elles font référence.

Ici HFFF7FFFF , c'est de l'hexadécimal, qui fait référence à un endroit
bien particulier le la mémoire (l'adressage de la mémoire se fait en
hexadécimal) et où doit se retrouver une information qu'à besoin l'API
pour résoudre l'énigme !

De me demander ce que représente HFFF7FFFF équivaut à demander à quelqu'un
ce que contient une cellule (sa valeur) d'un fichier xls quelconque à partir
de son adresse. Comme Bilou n'a pas l'intention de dévoiler le code derrière windows...
et bien tu te contentes de copier la déclaration dans son intégralité
dans ton projet, tu consultes les nombreux bouquins écrits sur le sujet des API
afin de connaître celles qui seront susceptibles de te rendre service et tu
retiens leur rôle pour un usage subséquent.
Denis Michon, (N°980)