Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Offset VBA en question

  • Initiateur de la discussion Initiateur de la discussion chimel38
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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
 
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
 
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
 
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:
Re : Offset VBA en question


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.
 
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 !!!
 
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
 
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:
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
 
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
 
Re : Offset VBA en question

Re à tous
@ chimel38 :
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…