Offset VBA en question

chimel38

XLDnaute Nouveau
Bonjour,

Je m'initie tranquillement au VBA et je fais un constat qui m'intrigue.
Jugez :
avec le code ActiveCell(3,4).range("A1").Select alors que la cellule active est F4 la sélection affichée est en I6 au lieu de d'être en J7

D'ailleurs si je mets le paramètre ligne à 0 la sélection se position en dessus.
Je ne vois pas dans VBA de paramétrage qui expliquerai ce comportement...
Avez vous quelques pistes à me communiquer

Merci pour votre Aide

Chimel
 

mécano41

XLDnaute Accro
Re : Offset VBA en question

Bonjour,

Je ne vois pas la signification de ce que tu indiques...que vient faire le .range("A1")? ActiveCell(3,4).Select produit la sélection d'une cellule décalée de +3 lignes et +4 colonnes par rapport à la cellule active (sélectionnée) mais c'est tout...

Que veux-tu faire exactement?

Cordialement
 

JCGL

XLDnaute Barbatruc
Re : Offset VBA en question

Bonjour à tous,

Peux-tu essayer :

Pour le décalage de ligne
Code:
ActiveCell.Offset(Range("A1"),0).Select

Pour le décalage de colonne
Code:
ActiveCell.Offset(,Range("A1")).Select

A + à tous
 

MichD

XLDnaute Impliqué
Re : Offset VBA en question

Bonjour,

Une autre syntaxe à celle que tu donnes : ActiveCell(3,4).range("A1").Select

ActiveCell.Item(3, 4).Select

Dans les 2 cas, suite à leur exécution, la cellule active devrait être i6.

Dans cette syntaxe, la propriété ".item" peut-être omise.

Pour la méthode Offset : Range("C5").offset(0,0) = C5
Range("C5").item(1,1) = C5
La différence entre les 2 propriétés sont les paramètres
de départ à partir desquels elle calcule le déplacement.

Dans les 2 cas, les paramètres peuvent prendre des valeurs négatives.

Dans ta proposition la partie Range("A1") est l'équivalent de la propriété
".item"
Exemple : Range("C5").item(1,1).item(1,1) = C5
OU
Range("C5").item(1,1).Range("A1") = C5

Range("C5").item(1,1).item(2,2) = D6
OU
Range("C5").item(1,1).Range("B2") = D6
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Offset VBA en question

Bonsoir Chimel38,

VBA comporte effectivement des raccourcis de notation intéressants quand ils sont appliqués à un range.

Dans la notation ActiveCell(3,4), VBA considère un tableau-implicite dont le coin supérieur gauche est ActiveCell et dont le nombre de ligne et de colonne s'étend jusqu'aux limites fixées par Excel. ActiveCell(3,4) est donc l'élément de la 3ième ligne et 4ième colonne de ce tableau-implicite.

Dans la notation ActiveCell(3,4).range("A1"), VBA considère un tableau-implicite dont le coin supérieur gauche est ActiveCell.ActiveCell(3,4) et dont le nombre de ligne et de colonne s'étend jusqu'aux limites fixées par Excel. La base de ce tableau prend la notation A1. Le range("A1") désigne donc la cellule A1 non pas à partir du coin supérieur gauche de la feuille excel mais à partir de ActiveCell.ActiveCell(3,4). La cellule référencée range("A1") correspond à la 1ième colonne (correspond à A) et 1ière ligne (1) du tableau-implicite de base ActiveCell.ActiveCell(3,4).

Les références relatives de ce type peuvent faciliter et raccourcir le code (par rapport à l'utilisation du Offset) mais nuisent quelquefois à la relecture du code selon moi, ce qui ne m'empêche pas de l'utiliser de temps en temps. Effectivement, quand je vois un range("D4") dans un code, j'ai plutôt l'habitude d'une référence absolue à la feuille excel.

La notation Range("D3") ou Cells(3,4) sans qualification de range qui les précède s'applique au tableau (range) représenté par la feuille active dans son intégralité.

Offset désigne un déplacement alors que la notation (x,y) ou "D3" doit plutôt être vue comme la référence à des coordonnées.
ActiveCell(1,1) désigne ActiveCell - ActiveCell.Offset(1,1) désigne la cellule just en dessous et juste à droite de ActiveCell.
 
Dernière édition:

chimel38

XLDnaute Nouveau
Re : Offset VBA en question

Bonjour,

Je ne vois pas la signification de ce que tu indiques...que vient faire le .range("A1")? ActiveCell(3,4).Select produit la sélection d'une cellule décalée de +3 lignes et +4 colonnes par rapport à la cellule active (sélectionnée) mais c'est tout...

Que veux-tu faire exactement?

Cordialement

Comme exprimé dans mon message je teste VBA
Et si j'applique la formule ActiveCell(3,4).Select je ne décale que de 2 lignes et 3 colonnes ce qui me semble être un problème que n'arrive pas à comprendre.

.range(A1) est effectivement dans ce cas inutile.
 

chimel38

XLDnaute Nouveau
Re : Offset VBA en question

Merci à tous pour la promptitude à examiner mon problème.
Vos réponses ont provoqué le déclic ... je parle d'Offset dans le sujet, et je m'aperçois que j'avais oublié de l'intégré dans ma commande qui en réalité devait être ActiveCell.Offset(3,4).range("A1").Select.
Et là ça fonctionne comme je le souhaitai.

MichD et mapomme sont venus m'apporter des précisions complémentaires et j'apprécie.

Merci à tous, .... j'apprécie !!!
 

Efgé

XLDnaute Barbatruc
Re : Offset VBA en question

Bonjour à tous; Bonjour JC :),
Si vous le voulez bien; ce code explique facilement l'utilisation des raccourcis d'offset.
La cellule d'origine est égale à :
VB:
ActiveCell(1, 1)
Ensuite tester ce code dans un nouveau fichier....

VB:
Sub test()
Dim i As Long, j As Long
Application.ScreenUpdating = False
Range("$H$9").Interior.ColorIndex = 35
For i = -3 To 5
    For j = -3 To 5
        Range("$H$9")(i, j).Value = "Range(""$H$9"")(" & i & "_" & j & ")"
    Next j
 Next i
Columns.AutoFit
Application.ScreenUpdating = True
End Sub

Cordialement
 
Dernière édition:

chimel38

XLDnaute Nouveau
Re : Offset VBA en question

D'accord avec toi, et d'ailleurs je l'admets volontiers dans un de mes posts, mais si tu remplaces "A1" par "B5" par exemple le résultat s'en trouve affecté. puisqu'il fait encore office d'offset par rapport à A1 avec décalage de 1 ligne et 4 colonnes ... Donc ce Range est susceptible d'être utilisé :)
Bien entendu je n'en vois pas d'usage particulier.... mais sait-on jamais.

Bien cordialement
 

chimel38

XLDnaute Nouveau
Re : Offset VBA en question

Puis-je te faire remarquer que l'expression Range("A1") n'apporte absolument rien
dans ActiveCell.Offset(3,4).range("A1").Select

Ceci est suffisant : ActiveCell.Offset(3,4).Select
D'accord avec toi, et d'ailleurs je l'admets volontiers dans un de mes posts, mais si tu remplaces "A1" par "B5" par exemple le résultat s'en trouve affecté. puisqu'il fait encore office d'offset par rapport à A1 avec décalage de 1 ligne et 4 colonnes ... Donc ce Range est susceptible d'être utilisé :)
Bien entendu je n'en vois pas d'usage particulier.... mais sait-on jamais.

Bien cordialement
 

Efgé

XLDnaute Barbatruc
Re : Offset VBA en question

Re à tous
@ chimel38 :
D'accord avec toi, et d'ailleurs je l'admets volontiers dans un de mes posts, mais si tu remplaces "A1" par "B5" par exemple le résultat s'en trouve affecté. puisqu'il fait encore office d'offset par rapport à A1 avec décalage de 1 ligne et 4 colonnes ... Donc ce Range est susceptible d'être utilisé
Comme on peux utiliser
VB:
ActiveCell.Offset(3, 4).Range("B5").Range("B5").Select
Mais est-ce bien raisonnable ?
Au même titre que l'on peux s'interroger sur le bien fondé de la selection.....
Cordialement
 

Statistiques des forums

Discussions
312 611
Messages
2 090 224
Membres
104 452
dernier inscrit
hamzamounir