• Aucun résultat trouvé

Nous allons commencer par traiter des propriétés assez particulières de l'objet Range qui gèrent le contenu de la cellule.

Pour Excel, le contenu des cellules n'est pas typé à priori. Excel interprète le contenu des cellules et peut selon les cas, mettre la donnée sous une autre forme ou appliquer un formatage ce qui fait que l'apparence du contenu peut différer du contenu réel.

Notez que dans Excel, le contenu de la cellule tel qu'il est entré par l'utilisateur n'existe pas forcément dans une des propriétés de la cellule.

Comme Excel est un tableur, il gère aussi des formules. Dans ce cas, le contenu réel de la cellule est la formule. Cependant, les mêmes règles s'appliquent. C'est-à-dire que le résultat de la formule est calculé, et que ce contenu peut être formaté. Ce mécanisme qui paraît assez évident lorsqu'on l'utilise directement est assez complexe au niveau des propriétés de l'objet Range.

Celui possède donc plusieurs propriétés qui exposent les différentes représentations du contenu. Celles-ci se regroupent globalement en deux familles, celles qui exposent les formules :

¾ Formula ¾ FormulaR1C1 ¾ FormulaLocal ¾ Formula R1C1Local

Celles qui exposent les valeurs. ¾ Value

¾ Value2 ¾ Text

Cette division n'a de sens que lorsque la cellule contient une formule, lorsqu'elle contient une valeur, les propriétés de formule renvoient la valeur. Lorsqu'une cellule est vide, elle renvoie Empty.

Prenons un exemple simple, la cellule A1 contient la valeur 14, la cellule A2 contient la formule =2*A1/10, la cellule A3 contient la formule =Log(A1;A2)

Si on lit à l'aide d'un code les propriétés précédentes, on obtient :

Debug.Print Range("A1").Formula '14

Debug.Print Range("A1").FormulaLocal '14

Debug.Print Range("A1").FormulaR1C1 '14

Debug.Print Range("A1").FormulaR1C1Local '14

Debug.Print Range("A1").Value '14

Debug.Print Range("A1").Value2 '14

Debug.Print Range("A1").Text '14

Debug.Print Range("A2").Formula '=2*A1/10

Debug.Print Range("A2").FormulaLocal '=2*A1/10

Debug.Print Range("A2").FormulaR1C1 '=2*R[-1]C/10

Debug.Print Range("A2").FormulaR1C1Local '=2*L(-1)C/10

Debug.Print Range("A2").Value ' 2,8

Debug.Print Range("A2").Value2 ' 2,8

Debug.Print Range("A2").Text '2,8

Debug.Print Range("A3").Formula '=LOG(A1,A2)

Debug.Print Range("A3").FormulaLocal '=LOG(A1;A2)

Debug.Print Range("A3").FormulaR1C1 '=LOG(R[-2]C,R[-1]C)

Debug.Print Range("A3").FormulaR1C1Local '=LOG(L(-2)C;L(-1)C)

Debug.Print Range("A3").Value ' 2,56313865645652

Debug.Print Range("A3").Value2 '2,56313865645652

Debug.Print Range("A3").Text '2,56313866

Tout cela est assez cohérent. Vous noterez cependant que dans le cas de la cellule A3 renvoie une valeur différente dans Value et dans Text. Cela vient du fait que la valeur renvoyée par la propriété

Text est le contenu tel qu'il est affiché.

Prenons maintenant un deuxième exemple. C1 contient la valeur 30/10/2002, C2 contient la formule =TEMPS(10;27;42) et C3 la formule =$C$1+$C$2

Un code de lecture identique au précédent donnerait :

Debug.Print Range("C1").Formula '37559

Debug.Print Range("C1").FormulaLocal '37559

Debug.Print Range("C1").FormulaR1C1 '37559

Debug.Print Range("C1").FormulaR1C1Local '37559

Debug.Print Range("C1").Value '30-oct-2002

Debug.Print Range("C1").Value2 '37559

Debug.Print Range("C1").Text '30-10-2002

Debug.Print Range("C2").Formula '=TIME(10,27,42)

Debug.Print Range("C2").FormulaLocal '=TEMPS(10;27;42)

Debug.Print Range("C2").FormulaR1C1 '=TIME(10,27,42)

Debug.Print Range("C2").FormulaR1C1Local '=TEMPS(10;27;42)

Debug.Print Range("C2").Value ' 0,435902777777778

Debug.Print Range("C2").Value2 ' 0,435902777777778

Debug.Print Range("C2").Text '10:27 AM

Debug.Print Range("C3").Formula '=$C$1+$C$2

Debug.Print Range("C3").FormulaLocal '=$C$1+$C$2

Debug.Print Range("C3").FormulaR1C1 '=R1C3+R2C3

Debug.Print Range("C3").FormulaR1C1Local '=L1C3+L2C3

Détaillons ensemble ces résultats car ils exposent assez bien le fonctionnement de ces propriétés. Nous avons entré la chaîne 30/10/2002. Comme nous l'avons vu précédemment, Excel gère les dates sous la forme d'un nombre entier. Comme il a reconnu une date dans la valeur saisie, il a opéré une conversion de valeur pour transformer la date saisie en entier. Nous l'avons vu en préambule, les propriétés renvoyant les formules renvoient une valeur lorsque la cellule ne contient pas de formule. La valeur réelle de la cellule est l'entier 37559 (nombre de jour entre le 30/10/2002 et le 01/01/1900), toutes les propriétés formules renvoient cet entier. La propriété Value renvoie toujours la valeur formatée. Excel interprète l'entier comme une date, lui applique le formatage par défaut, dans ce cas le format de date courte tel qu'il est défini dans le panneau de configuration du système et renvoie cette valeur dans la propriété Value.

la cellule non formaté. Dans ce cas il s'agit donc d de la cellule tel qu'il est affiché. On pourrait s'attendre à ce qu'il renvoie alors la chaîne saisie, mais tel n'est pas le cas. En effet, Excel utilise toujours les séparateurs de dates définit par le système sauf si vous lui avez indiqué explicitement un autre séparateur, soit en modifiant le format de la cellule, soit en modifiant les séparateurs dans la configuration d'Excel. Dans ce cas, vous noterez que la valeur que nous avons saisie n'existe plus (même s'il est assez simple de la reformer).

Pour la cellule C2, vous remarquerez juste que les formules locales utilisent des noms de fonctions localisées (dans notre cas en Français) et le séparateur d'argument localisé (le point virgule) et les propriétés non locales utilisent les noms de fonctions et le séparateur d'argument Américain.

Je viens de dire précédemment que la propriété Value renvoie toujours un contenu formaté, et vous voyez bien que la propriété Value de la cellule C2 renvoie un temps non formaté. N'allez pas pour autant croire que je déraille (encore que…) mais dans ce cas, nous avons utilisé la fonction Temps qui transforme un temps en sa représentation numérique. Excel considérant que nous ne sommes pas suffisamment bourrés pour lui demander de reformater une fonction qui sert justement à ne pas formater sous la forme d'un temps, il renvoie bien dans la propriété Value la valeur renvoyée par la fonction, dans ce cas 0,435902777777778. La propriété Value2 qui elle ne formate jamais renvoie la même valeur. Enfin comme prévu, la propriété Text renvoie la valeur affichée.

Si vous m'avez suivi jusque là, l'interprétation de la cellule C3 ne présente rien de nouveau. Vous noterez juste que la notation américaine R1C1 est sous forme L1C1 dans les versions localisées de la formule.

Prenez deux aspirines, une petite pause, plus qu'un dernier petit col et ensuite c'est tranquille. Vous êtes prêt ? Alors continuons.

A l'exception de la propriété Text, toutes ces propriétés que nous venons de voir présentent donc une autre particularité, ce sont des propriétés tableau. Comme nous l'avons déjà dit, une propriété tableau renvoie ou définit un tableau de valeur quand l'objet Range contient plusieurs cellules.

Autrement dit, ces propriétés renvoient ou définissent un Variant contenant un tableau de Variant représentant le contenu de chaque cellule sous forme de valeurs et de formules. Dans tous les cas, il s'agit d'un tableau à deux dimensions où la première dimension représente les lignes et la seconde les colonnes. La limite basse de chaque dimension vaut toujours 1.

Dans le cas simple des plages continues, le tableau va représenter donc la plage sous la forme : (1 To Nombre de lignes, 1 To Nombre de colonnes)

La propriété Value2 renvoie toujours le contenu de e l'entier 37559. Text renvoie toujours le contenu

Partons d'un fichier exemple qui ressemble à :

Nous allons travailler sur la plage L3C3:L30C7 (ou C3:G30 si vous préférez les notations standards).

Fort de ce que nous venons de dire, nous pourrions écrire :

Sub Valeurs()

Dim MaPlage As Range, TabValeur As Variant

Dim cmptLigne As Long, NbLigne As Long, NbCol As Long

Set MaPlage = ThisWorkbook.Worksheets("tableau").Range("C3:G30")

TabValeur = MaPlage.Value NbLigne = UBound(TabValeur, 1) NbCol = UBound(TabValeur, 2)

MsgBox NbLigne & " lignes" & vbNewLine & NbCol & " colonnes"

For cmptLigne = 1 To NbLigne

TabValeur(cmptLigne, 1) = TabValeur(cmptLigne, 2) + 1

Next

ThisWorkbook.Worksheets("tableau").Cells(1, 10).Resize(NbLigne, NbCol).Value = TabValeur

End Sub

Dans ce code, je récupère la propriété Value de l'objet Range MaPlage dans une variable TabValeur de type Variant. Comme MaPlage contient plusieurs cellules et que Value est une propriété tableau, TabValeur est un tableau. Je peux donc récupérer le nombre de lignes et de colonnes de ce tableau pour véfifier qu'il fait la même taille que ma plage.

Dans mon tableau, je vais parcourir l'ensemble des lignes de la première colonne et leur affecter comme valeur la valeur de la case située sur la même ligne de la colonne 2 + 1.

Vous noterez que les cellules de la nouvelle plage contiennent bien les valeurs d'origine sauf pour celle de la première colonne qui ont été modifiées.

Notez aussi que si je n'avais pas de modification à faire, je pourrais affecter directement tel que :

Sub Valeurs()

Dim MaPlage As Range, TabValeur As Variant

Dim NbLigne As Long, NbCol As Long

Set MaPlage = ThisWorkbook.Worksheets("tableau").Range("C3:G30")

TabValeur = MaPlage.Value

NbLigne = UBound(MaPlage.Value, 1) NbCol = UBound(MaPlage.Value, 2)

MsgBox NbLigne & " lignes" & vbNewLine & NbCol & " colonnes" ThisWorkbook.Worksheets("tableau").Cells(1, 10).Resize(NbLigne, NbCol).Value = MaPlage.Value

End Sub

Mais revenons sur l'exemple précédent. Alors que j'ai modifié la valeur des cellules de la première colonne de la plage, les valeurs de moyenne n'ont pas changées. Si nous allons voir une cellule de la nouvelle colonne moyenne, nous constatons que la formule a disparu et qu'elle ne contient plus que la valeur ce qui n'est pas surprenant puisque nous avons fait une récupération de la propriété Value.

Imaginons un code similaire en travaillant sur les formules. Soit le code :

Sub Formule()

Dim MaPlage As Range, TabFormule As Variant

Dim cmptLigne As Long, NbLigne As Long, NbCol As Long

Set MaPlage = ThisWorkbook.Worksheets("tableau").Range("C3:G30")

TabFormule = MaPlage.FormulaLocal NbLigne = UBound(TabFormule, 1) NbCol = UBound(TabFormule, 2)

MsgBox NbLigne & " lignes" & vbNewLine & NbCol & " colonnes"

mptLigne = 1 To NbLign

Ne

OYENNE(L onne

L(2)C(-11):L(2)C(-8)) s'es

l'affectation à une nouvelle plage pour garder ses arguments de la plage d'origine.

Il convient donc de faire attention, si l'affectation d'un tableau de valeurs équivaut bien à faire un collage spécial des valeurs, la manipulation d'un tableau de formules n'équivaut pas à un collage spécial des formules.

Nous retrouverons ces concepts dans la suite de ce document.

For c e TabFormule(cmptLigne, 1) = CStr(Val(TabFormule(cmptLigne, 2)) + 1) xt ThisWorkbook.Worksheets("tableau").Cells(1, 10).Resize(NbLigne, NbCol).FormulaLocal = TabFormule End Sub

Notez déjà que nous devons procéder à des conversions de types puisque le tableau récupéré contient des chaînes et non des nombres. Cependant même dans ce cas, la moyenne reste identique à celle de la plage source. Si nous allons voir une cellule de la colonne moyenne, nous voyons que la formule d'origine, =M C(-4):LC(-1)) apparaît dans la nouvelle col moyenne sous la forme =MOYENNE( . C'est-à-dire que la formule t modifiée lors de