Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Réf [A1]

24 réponses
Avatar
Michel MTO
Bonjour à toutes et à tous,

Je me demandait si on peut mettre en VBA :
[E & i] où i représente une variable, pour référence une cellule.

Je sais qu'on peut le faire comme ceci :
Range("E" & i)

Merci pour vos réponses

Michel MTO

10 réponses

1 2 3
Avatar
garnote
Les crochets sont plus rapides qu'une boucle, n'est-il pas ? :-)

Sub Rapide()
[f10:f50009] = [2*row(1:50000)+1]
End Sub

Serge
Avatar
FS
Nous sommes bien d'accord Denis.

Le problème, c'est la facilité d'écriture (et du coup c'est aussi plus
court et plus rapide) que permet le langage. Ça marche même si on ne
comprend pas tout des subtilités du langage objet. Idem d'ailleurs en ce
qui concerne la déclaration et le typage des variables.
Les débutants trouvent ça très bien et je les comprends. Mais ils
prennent de mauvaises habitudes et il arrive un jour où ça coince..

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

MichDenis a écrit :
Bonjour Frédéric,

Je suis d'accord avec toi sur la permissivité d'Excel lorsque
vient le temps de coder !

Dans le cas présent, Excel définit la propriété Evaluate :
"Cette méthode convertit un nom Microsoft Excel en un OBJECT ou une valeur"
En conséquence, je suppose que [A1] est converti en un OBJET RANGE. Si ce qui
précède est vrai, je suppose qu'il ne doit pas y avoir une très grande différence
entre :
Dim Rg as range
Set Rg = Range("A1")

Rg , Range("A1") ou [A1]. Toutes ces présentations doivent avoir la même
propriété par défaut : "Value" puisqu'elle personnifie un objet "Range".
Dans le modèle objet Excel, je ne connais qu'un objet "Range".






Avatar
MichDenis
En dernier lieu, j'ajouterai ceci :

Set Rg = Range("A1")
Rg , Range("A1") ou [A1]. Si toutes ces présentations
personnifient un objet "Range", si quelqu'un arrive à la
conclusion que ces expressions sont "semblables", et bien
on devrait déduire que la déclaration des variables dans
une procédure est inutile puisque le code serait aussi efficace
et rapide qu'avec ou sans déclaration de celles-ci. C'est ce
que sous-entend l'expression "semblables"... Non ?

Si la variable Rg n'est pas déclarée et typée, elle ressemble à
[A1] puisqu'Excel "interprétera" ces objets au moment de
l'exécution du code. Ainsi en est-il des propriétés et méthodes
employées avec ces 2 expressions. Selon moi, cela va à l'encontre
des principes les plus élémentaires de programmation. Quand le
seul avantage de cette syntaxe "[A1]" se résume à la concision de
la saisie... c'est un peu court comme argument. Est-ce que la qualité
du code d'une procédure se résume au nombre de caractères utilisés ?

En dernier lieu, si quelqu'un a besoin de se convaincre de
l'utilité de déclarer les variables, John Walkenbach a commis
cette procédure à titre d'exemple. (ce ne sont pas des variables objet)

à exécuter avec et sans la déclaration des variables pour
voir la différence :
'--------------------------------------
Sub TimeTest()

Dim A As Integer, B As Integer, C As Integer
Dim x As Integer, y As Integer
Dim i As Integer, j As Integer
Dim StartTime As Date, EndTime As Date

StartTime = Timer

x = 0
y = 0
For i = 1 To 5000
For j = 1 To 1000
A = x + y + j
B = y - x - i
C = x - y - i
Next j
Next i
EndTime = Timer
MsgBox EndTime - StartTime
End Sub
'--------------------------------------
Avatar
MichDenis
| Sub Rapide()
| [f10:f50009] = [2*row(1:50000)+1]
| End Sub

On peut très bien écrire :
range("f10:f50009") = [2*row(1:50000)+1]

Personne ne prétend à l'inutilité des crochets droits s'il s'agit d'évaluer une formule !
Il me semble qu'évaluer une formule et personnifier un objet "range"
représente 2 choses totalement différentes.

On pourrait aussi faire usage de ceci :
'-----------------------------------------
Sub test()
Dim Rg As Range
With Feuil1
With .Range("G10:G50009")
.Formula = "=2*row(1:50000)+1"
.Value = .Value
End With
End With
End Sub
'-----------------------------------------
Avatar
garnote
Pff... Seulement 2,5 fois plus rapide :-)

Serge


Sub TimeTest()

Dim A As Integer, B As Integer, C As Integer
Dim x As Integer, y As Integer
Dim i As Integer, j As Integer
Dim StartTime As Date, EndTime As Date

StartTime = Timer

x = 0
y = 0
For i = 1 To 5000
For j = 1 To 1000
A = x + y + j
B = y - x - i
C = x - y - i
Next j
Next i
EndTime = Timer
MsgBox EndTime - StartTime
End Sub














"MichDenis" a écrit dans le message de news:

En dernier lieu, j'ajouterai ceci :

Set Rg = Range("A1")
Rg , Range("A1") ou [A1]. Si toutes ces présentations
personnifient un objet "Range", si quelqu'un arrive à la
conclusion que ces expressions sont "semblables", et bien
on devrait déduire que la déclaration des variables dans
une procédure est inutile puisque le code serait aussi efficace
et rapide qu'avec ou sans déclaration de celles-ci. C'est ce
que sous-entend l'expression "semblables"... Non ?

Si la variable Rg n'est pas déclarée et typée, elle ressemble à
[A1] puisqu'Excel "interprétera" ces objets au moment de
l'exécution du code. Ainsi en est-il des propriétés et méthodes
employées avec ces 2 expressions. Selon moi, cela va à l'encontre
des principes les plus élémentaires de programmation. Quand le
seul avantage de cette syntaxe "[A1]" se résume à la concision de
la saisie... c'est un peu court comme argument. Est-ce que la qualité
du code d'une procédure se résume au nombre de caractères utilisés ?

En dernier lieu, si quelqu'un a besoin de se convaincre de
l'utilité de déclarer les variables, John Walkenbach a commis
cette procédure à titre d'exemple. (ce ne sont pas des variables objet)

à exécuter avec et sans la déclaration des variables pour
voir la différence :
'--------------------------------------
Sub TimeTest()

Dim A As Integer, B As Integer, C As Integer
Dim x As Integer, y As Integer
Dim i As Integer, j As Integer
Dim StartTime As Date, EndTime As Date

StartTime = Timer

x = 0
y = 0
For i = 1 To 5000
For j = 1 To 1000
A = x + y + j
B = y - x - i
C = x - y - i
Next j
Next i
EndTime = Timer
MsgBox EndTime - StartTime
End Sub
'--------------------------------------






Avatar
garnote
Personne ne prétend à l'inutilité des crochets droits s'il s'agit d'évaluer
une formule !
C'était pour plaisanter.

Il me semble qu'évaluer une formule et personnifier un objet "range"
représente 2 choses totalement différentes.
Ce n'est pas moi qui vais te contredire.


"MichDenis" a écrit dans le message de news:

| Sub Rapide()
| [f10:f50009] = [2*row(1:50000)+1]
| End Sub

On peut très bien écrire :
range("f10:f50009") = [2*row(1:50000)+1]

Personne ne prétend à l'inutilité des crochets droits s'il s'agit
d'évaluer une formule !
Il me semble qu'évaluer une formule et personnifier un objet "range"
représente 2 choses totalement différentes.

On pourrait aussi faire usage de ceci :
'-----------------------------------------
Sub test()
Dim Rg As Range
With Feuil1
With .Range("G10:G50009")
.Formula = "=2*row(1:50000)+1"
.Value = .Value
End With
End With
End Sub
'-----------------------------------------





Avatar
Daniel.C
> On peut très bien écrire :
range("f10:f50009") = [2*row(1:50000)+1]



Mais c'est aussi laxiste ! Si j'ai bien compris, il faut mettre :
range("f10:f50009").Value = [2*row(1:50000)+1]
Daniel
Avatar
MichDenis
| Mais c'est aussi laxiste ! Si j'ai bien compris, il faut mettre :
| range("f10:f50009").Value = [2*row(1:50000)+1]

Supposons que tu n'as pas l'habitude d'utiliser la propriété
de l'objet associé à l'action que tu veux exécuter, pour le néophyte,
pour cette ligne de code Doit-il utiliser
Set Rg = Feuil1.Range("A1:G10").Cells OU .Value OU RIEN ?

Dans les 2 boucles, si je ne suis pas habitué à considérer la propriété
d'un objet comme étant ce qui est retourné par cet objet, comment puis-je arriver
à savoir et à comprendre si je dois utiliser .Rows et .Cells dans les 2 boucles
précédentes ?
C'est l'essence même de l'action du code.
For Each R In Rg.Rows
For Each E In R.Cells

La ligne de code suivante :
E = E + 1
Je n'ai pas déclaré la variable E comme objet Range
je n'ai pas non plus utilisé .Value associé à l'objet E
Si tu exécutes le code, les cellules demeurent vides.
Si tu débutes en programmation, tu cherches en tabarnac
ce qui se passe. Non ? Et pourtant, aucun message d'erreur, la procédure tourne tout à
fait correctement !

L'absence du .value à un objet dûment déclaré comme "Range"
n'est pas en soi du laxisme puisqu'Excel est conçu comme ça
et le permet (valeur par défaut) ... mais apprendre à programmer en
utilisant un langage approximatif comme dans l'exemple précédent
rend la tâche plutôt ardue. C'est là qu'entre en jeu la notion de laxisme.

a) Déclaration des variables non obligatoires
b ) Typage des variables non obligatoires
c ) utilisation ou non des "propriétés" associées à l'objet en relation
avec le résultat escompté... (pourquoi les cellules demeurent vides
à l'exécution du code proposé? )
d ) l'introduction de syntaxe comme celle-ci [A1]

Je crois que c'est là où voulait en venir Frédéric dans son propos.

Si tu sais ce que tu fais, tu peux à l'occasion te permettre des raccourcis,
mais mentionner la "propriété" de l'objet améliore la lecture, la
compréhension du code et facilite l'assimilation de ce dernier.
Avatar
MichDenis
Un tout dernier truc :

dans la procédure telle que proposée :

For Each e In R.Cells
e = e + 1
Msgbox TypeName(e)
Next

Le message retourne "Integer" on est loin
d'un objet "Range" et ça vous donne une petite
idée pourquoi les cellules demeurent vides !
;-))



"MichDenis" a écrit dans le message de groupe de discussion :

| Mais c'est aussi laxiste ! Si j'ai bien compris, il faut mettre :
| range("f10:f50009").Value = [2*row(1:50000)+1]

Supposons que tu n'as pas l'habitude d'utiliser la propriété
de l'objet associé à l'action que tu veux exécuter, pour le néophyte,
pour cette ligne de code Doit-il utiliser
Set Rg = Feuil1.Range("A1:G10").Cells OU .Value OU RIEN ?

Dans les 2 boucles, si je ne suis pas habitué à considérer la propriété
d'un objet comme étant ce qui est retourné par cet objet, comment puis-je arriver
à savoir et à comprendre si je dois utiliser .Rows et .Cells dans les 2 boucles
précédentes ?
C'est l'essence même de l'action du code.
For Each R In Rg.Rows
For Each E In R.Cells

La ligne de code suivante :
E = E + 1
Je n'ai pas déclaré la variable E comme objet Range
je n'ai pas non plus utilisé .Value associé à l'objet E
Si tu exécutes le code, les cellules demeurent vides.
Si tu débutes en programmation, tu cherches en tabarnac
ce qui se passe. Non ? Et pourtant, aucun message d'erreur, la procédure tourne tout à
fait correctement !

L'absence du .value à un objet dûment déclaré comme "Range"
n'est pas en soi du laxisme puisqu'Excel est conçu comme ça
et le permet (valeur par défaut) ... mais apprendre à programmer en
utilisant un langage approximatif comme dans l'exemple précédent
rend la tâche plutôt ardue. C'est là qu'entre en jeu la notion de laxisme.

a) Déclaration des variables non obligatoires
b ) Typage des variables non obligatoires
c ) utilisation ou non des "propriétés" associées à l'objet en relation
avec le résultat escompté... (pourquoi les cellules demeurent vides
à l'exécution du code proposé? )
d ) l'introduction de syntaxe comme celle-ci [A1]

Je crois que c'est là où voulait en venir Frédéric dans son propos.

Si tu sais ce que tu fais, tu peux à l'occasion te permettre des raccourcis,
mais mentionner la "propriété" de l'objet améliore la lecture, la
compréhension du code et facilite l'assimilation de ce dernier.
Avatar
Philippe.R
Bonsoir,
Chez moi, 2 fois plus rapide..
--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/mpfe/connexion.php
News://news.microsoft.com/microsoft.public.fr.excel
"MichDenis" a écrit dans le message de
news:
En dernier lieu, j'ajouterai ceci :

Set Rg = Range("A1")
Rg , Range("A1") ou [A1]. Si toutes ces présentations
personnifient un objet "Range", si quelqu'un arrive à la
conclusion que ces expressions sont "semblables", et bien
on devrait déduire que la déclaration des variables dans
une procédure est inutile puisque le code serait aussi efficace
et rapide qu'avec ou sans déclaration de celles-ci. C'est ce
que sous-entend l'expression "semblables"... Non ?

Si la variable Rg n'est pas déclarée et typée, elle ressemble à
[A1] puisqu'Excel "interprétera" ces objets au moment de
l'exécution du code. Ainsi en est-il des propriétés et méthodes
employées avec ces 2 expressions. Selon moi, cela va à l'encontre
des principes les plus élémentaires de programmation. Quand le
seul avantage de cette syntaxe "[A1]" se résume à la concision de
la saisie... c'est un peu court comme argument. Est-ce que la qualité
du code d'une procédure se résume au nombre de caractères utilisés ?

En dernier lieu, si quelqu'un a besoin de se convaincre de
l'utilité de déclarer les variables, John Walkenbach a commis
cette procédure à titre d'exemple. (ce ne sont pas des variables objet)

à exécuter avec et sans la déclaration des variables pour
voir la différence :
'--------------------------------------
Sub TimeTest()

Dim A As Integer, B As Integer, C As Integer
Dim x As Integer, y As Integer
Dim i As Integer, j As Integer
Dim StartTime As Date, EndTime As Date

StartTime = Timer

x = 0
y = 0
For i = 1 To 5000
For j = 1 To 1000
A = x + y + j
B = y - x - i
C = x - y - i
Next j
Next i
EndTime = Timer
MsgBox EndTime - StartTime
End Sub
'--------------------------------------






1 2 3