VBA: Petites questions

CISCO

XLDnaute Barbatruc
Bonjour à tous

Comme je débute en VBA, et qu'il me reste quelques habitudes de Basic et de Fortran, je fais de nombreux essais avant d'arriver à un code qui fonctionne correctement.

Exemple, sur ce fil, dans une première version (post #8 du fil cité), je travaille avec la plage B2: D2 donc je peux faire par exemple
Code:
Range("B2:D2").Copy
Range("B8").PasteSpecial xlValue
mais comme c'est dans une boucle, comme je sais que je travaille sur la plage allant de B à D sur la ligne i, cela me donne
Code:
For i = 2 To Dernligne Step Paquetligne
Range("B" & i & ":D" & i).Copy
Range("B" & i + Paquetligne - 1).PasteSpecial xlValue
Next
Dans une autre version (post #10 du fil cité ci-dessus), je travaille avec une plage dont je ne connais pas exactement la position (la ligne et les colonnes peuvent changer car la macro doit pouvoir fonctionner sur plusieurs tableaux dont on ne connait pas la position à l'avance). J'ai fait, pour obtenir la même chose que précédemment, avec
Code:
For i = Premligne To Dernligne - 1 Step Paquetligne
Totaldébut = Cells(i + 1, Premcol + 1).AddressLocal
Totalfin = Cells(i + 1, Derncol).AddressLocal
Range(Totaldébut, Totalfin).Copy
Pasdutoutdébut = Cells(i + Paquetligne, Premcol + 1).AddressLocal
Range(Pasdutoutdébut).PasteSpecial xlValue
Autrement dit, j'ai attribué l'adresse (la référence) du début de la plage à copier au nom Totaldébut, l'adresse de la fin à Totalfin, et j'ai mis cela dans Range, ce qui donne Range(Totaldébut, Totalfin). De même, j'ai attribué l'adresse de la cellule destinatrice à Pasdutoutdébut avant de faire le collage spécial.

1ère question : Est-ce qu'il ni a pas plus simple, par exemple
Code:
Total = Cells(i + 1, Premcol + 1) & ":" & Cells(i + 1, Derncol)
Range(Total).Copy
ou encore
Code:
Range(Cells(i + 1, Premcol + 1) & ":" & Cells(i + 1, Derncol)).Copy
J'ai essayé, et cela ne fonctionne pas. Dommage...

2ème question : Dans la méthode précédente, Range(Totaldébut, Totalfin) désigne toute la plage allant de l'adresse totaldébut à l'adresse Totalfin. Comment fait-on si on ne veut que la plage contenant les deux cellules non contiguës correspondant aux adresses Totaldébut et Totalfin, et non la plage allant de l'une à l'autre, ces cellules y comprises ?


Merci

@ plus
 
Dernière édition:

CHALET53

XLDnaute Barbatruc
Re : VBA: Petites questions

bonjour,

Pas sûr de comprendre ce que tu veux faire

Essaie à titre d'exemple :

Sub essai()
premcol = 5
derncol = 10
'a est la lettre de la 1ère colonne
'b est la lette de la 2ème colonne
a = Split(Columns(premcol + 1).Address(ColumnAbsolute:=False), ":")(1)
b = Split(Columns(derncol + 1).Address(ColumnAbsolute:=False), ":")(1)
i = 2

Set Total = Range((a & i) & ":" & (b & i + 5))
Total.Copy
Range("A15").Select
ActiveSheet.Paste
End Sub
 

CISCO

XLDnaute Barbatruc
Re : VBA: Petites questions

Bonjour Chalet53

Merci pour ta réponse. Je vais aller voir à quoi correspond Split. Ceci dit, on ne peut pas dire que cela soit vraiment plus pratique que la méthode que j'ai utilisée.

@ plus
 

néné06

XLDnaute Accro
Re : VBA: Petites questions

Bonjour Cisco,CHALET53

Si j'ai bien compris, tu souhaites copier coller des plages de cellules dans une autre portion de la feuille ?:confused:
Je pense que le plus rapide et le plus simple serait d'utiliser les tableaux en mémoire.:)

Si tu pouvais nous faire parvenir un exemple avec plusieurs plages à recopier, je pense que des solutions seraient données.

Sinon, le site de jacques est vraiment super pour les tableaux et autres, mais je pense que tu l'as déjà consulté à "moultes" reprises;)

A+

René
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : VBA: Petites questions

Bonjour CISCO, CHALET53, néné06,

Pour la question 1, tu pourrais écrire :
Code:
Range(Cells(i + 1, Premcol + 1), Cells(i + 1, Derncol)).Copy
et pour la question 2:

Code:
Range(Totaldébut & "," & Totalfin).copy
A+
 

CISCO

XLDnaute Barbatruc
Re : VBA: Petites questions

Bonjour Néné

Je veux effectivement copier-coller des plages de cellules d'un endroit à un autre. Le problème vient du fait que je ne sais pas à l'avance où se trouvent les plages à copier, aussi bien au niveau de la ligne (Dans ce cas, je pourrais faire simplement avec un Range("B"& i &": D"& i) par ex) qu'au niveau des colonnes (la plage à transférer ne commence pas forcément en colonne B et ne finit pas forcément en colonne D).

Pour ce qui est des fichiers, cf. le fil déja cité précédemment, posts #8 et #10. La méthode que je propose fonctionne, mais je cherche à savoir s'il y a plus simple (donc moins de trois lignes).

Pour ce qui est d'utiliser un tableau (au sens VBA du terme), j'y avais penser, mais j'ai lu quelque part que les données dans un tableau doivent toutes être du même type, et cela n'est pas le cas dans l'exemple traité (il y a du texte et des nombres dans les plages à transférer).


Au cas ou je ne n'aurai pas été assez explicite, voila une autre situation faisant appel au même problème: Imaginons qu'il faille copier-coller plusieurs plages dont les lignes et les colonnes sont définies par deux boucles imbriquées. En utilisant ma méthode cela donnerait par exemple
Code:
For i = 1 to 10
For j = 1 to 20
début = Cells(i,j).addresslocal
fin = Cells(i,j+nbredecol).addresslocal
destination = Cells(....).addresslocal
Range(début,fin).Copy Range(destination)
Next
Next
Comment feriez-vous cela, soit avec moins de lignes, soit avec une méthode plus "belle" que celle que j'ai utilisée ?
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Re : VBA: Petites questions

Bonjour Paf

Et oui, pour la question 1, je n'ai pas pensé à essayer sans le ":" au milieu. Je vais essayer de ce pas.

Merci.

@ plus
 

CISCO

XLDnaute Barbatruc
Re : VBA: Petites questions

Rebonjour Paf

Cela fonctionne avec
Code:
Range(Cells(i + 1, Premcol + 1), Cells(i + 1, Derncol)).Copy
mais par contre
Code:
Range(Cells(j + Paquetligne, Premcol + 1)).PasteSpecial xlValue
ne fonctionne pas.

Je suis forcé de faire avec
Code:
Pasdutoutdébut = Cells(j + Paquetligne, Premcol + 1).AddressLocal
Range(Pasdutoutdébut).PasteSpecial xlValue
ou avec
Code:
Range(Cells(j + Paquetligne, Premcol + 1),Cells(j + Paquetligne, Premcol + 1)).PasteSpecial xlValue
c-à-d en répétant deux fois la position de la cellule destinatrice

ou avec
Code:
Range(Cells(j + Paquetligne, Premcol + 1), Cells(j+Paquetligne,Derncol)).PasteSpecial xlValue
donc en donnant toute la plage.

J'aurai trouvé logique de pouvoir écrire Range(Cells(1,1) : Cells(20,1)).Copy ou Range(Cells(1,1) &":"& Cells(20,1)).Copy puisqu'on peut écrire Range("A1:A20").Copy. De même, puisque Range("A8").PasteSpecial xlValue fonctionne, cela aurait été bien qu'il en soit de même avec Range(Cells(8,1)).PasteSpecial xlValue. Dommage. Il est évident que je ne saisie pas encore toutes les finesses du VBA, même de base.

Paf, merci quand même pour ta proposition, puisque l'un dans l'autre, cela me fait, et apprendre des détails du langage VBA, et raccourcir la macro du post #10 sur l'autre fil de 6 ou 7 lignes, sans la rendre davantage difficile à comprendre.

@ plus
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : VBA: Petites questions

re,

mais par contre
Code:
Range(Cells(j + Paquetligne, Premcol + 1)).PasteSpecial xlValue
ne fonctionne pas.
il faudrait utiliser
Code:
Cells(j + Paquetligne, Premcol + 1).PasteSpecial xlValue

un essai avec des tableaux (merci néné06) ;
on copie la première ligne dans un tableau1
on copie le bloc (ligne 2 à fin) dans un tableau2
on copie le tableau2 en première ligne
on copie le tableau1 en dernière ligne

Code:
    For i = Premligne To Dernligne - 1 Step Paquetligne
        'Stockage de la première ligne qu'il faut décaller vers le bas
        Stockage1 = Range(Cells(i + 1, Premcol + 1), Cells(i + 1, Derncol))
        'Stockage des lignes suivantes du paquet
        Stockage2 = Range(Cells(i + 2, Premcol + 1), Cells(i + Paquetligne, Derncol))
        'collage du paquet stockage2 une ligne plus haut
        Cells(i + 1, Premcol + 1).Resize(UBound(Stockage2, 1), UBound(Stockage2, 2)) = Stockage2
        'collage de la première ligne en fin de paquet
        Cells(i + Paquetligne, Premcol + 1).Resize(UBound(Stockage1, 1), UBound(Stockage1, 2)) = Stockage1
    Next
A+
 

CISCO

XLDnaute Barbatruc
Re : VBA: Petites questions

Bonjour

Merci Paf, effectivement, cela fonctionne... Petit à petit...

@plus
 

Paf

XLDnaute Barbatruc
Re : VBA: Petites questions

re re

J'aurai trouvé logique de pouvoir écrire Range(Cells(1,1) : Cells(20,1)).Copy ou Range(Cells(1,1) &":"& Cells(20,1)).Cop puisqu'on peut écrire Range("A1:A20").Copy. De même, puisque Range("A8").PasteSpecial xlValue fonctionne, cela aurait été bien qu'il en soit de même avec Range(Cells(8,1)).PasteSpecial xlValue. Dommage. Il est évident que je ne saisie pas encore toutes les finesses du VBA, même de base.

Range("A1:A20").Copy on copie de l'adresse A1 à l'adresse A20

pour avoir l'équivalent en utilisant Cells:

Range(cells(1,1).address & ":" & cells(20,1).address).copy
ou alors
Range(cells(1,1) , cells(20,1)).copy

et

Range("A8") et cells(8,1) sont équivalent donc, pour Range("A8").PasteSpecial xlValue..., utiliser simplement
Cells(8,1).PasteSpecial xlValue...

A+
 

Discussions similaires


Haut Bas