Décaler les colonnes dans une boucle
Bonjour,
Je suis un grand novice dans le monde VBA. J'essaye grâce à ce super forum de créer quelques macros afin de faciliter ma vie (recherche scientifique) mais le manque de base dans la matière me rend la tâche très difficile...
Aujourd'hui j'ai besoin de réaliser une Macro assez simple (je pense). J'ai réussi un bout mais il me manque le plus important, le décalage à chaque boucle.
Pour faire simple je souhaite copier les cellules de B6 à la dernière valeur et coller sur AG6 puis copier AL3 (résultat d'une formule dépendant des données copier-coller précédemment sur AG6 depuis B6:B...) sur la colonne AN3.
Je souhaite ensuite répéter cette opération en décalant B6 d'une colonne et AN3 d'une colonne à chaque boucle (AG6 et AL3 ne changent pas) jusqu'à ce que la valeur de la colonne xxx6 du premier copier-coller soit vide. Tout cela se fait sur la même feuille du même classeur. (je ne peux pas vous envoyer le classeur car données confidentielles...
Sub Macro3()
Dim numero As Integer
numero = Range("B6")
While numero <> 0
Range("B6").Select OD.Cells(1, OD.Cells(1, Columns.Count).End(xlToLeft).Column + 1)
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("AG6").Select
ActiveSheet.Paste
Range("AL3").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Range("AN3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("AG6").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Wend
End Sub
J'espère que ce message respecte la charte, je précise bien entendu que je n'ai pas trouvé depuis ce matin 9h30 de réponse... C'est pour cela que je me permet de poster cette demande. Au plaisir de vous lire !
Salut crossfitman21,
jusqu'à ce que la valeur de la colonne xxx6 du premier copier-coller soit vide. ?? que veux dire xxx6?
mais un fichier test proche du réel avec le résultat souhaité sera lebienvenu!
Bonjour,
Merci pour ta réponse, j'ai joint un fichier avec quelques données afin de l'utiliser comme exemple, en effet ça sera plus simple ...
Le "xxx" signifie la xième colonne. J'aimerais que la macro s'effectue tant qu'une valeur est présente dans la xième colonne ligne 6. Jusqu'à E6 dans mon cas
et la formule qui devrait être dans AL3, elle est où?
et les données qui sont dans la colonne AI on les ecrases?
Mince j'ai supprimé la formule sans faire exprès pardon ... AL6 = "=SOMME. SI.ENS(AG:AG;AF:AF;AK3)" que je déroule jusqu'à AL43. Pour expliquer un peu plus le contexte, j'ai des sujets qui réalisent des apprentissages mais le nombre d'essais pour chaque sujet est variable. Je souhaite du coup normaliser le nombre d'essais en exprimant la progression en %. La colonne AH2 me sert à calculer le nombre total d'essais, AI le % de progression, AJ l'essai correspondant à x% et son arrondi à la décimale (AK). AL correspond du coup aux valeurs à chaque % de progression. (exemple, 5% de progression = 3è essai, AL = performance obtenue au 3è essai).
Donc AI, AJ et AK sont fixes, AG sert à recevoir la colonne copier pour calculer en AL les nouvelles valeurs. Et ensuite copier les nouvelles valeurs obtenues en AL sur AO et les colonnes suivantes (AO ou une autre feuille si plus simple, il n'y a pas d'importance à ce niveau). Il faut ensuite supprimer les valeurs dans AG et recommencer l'opération tant qu'il reste des colonnes à "normaliser en %". Ca sera surement plus clair avec ces explications !
Personne pour me donner un petit coup de pouce s'il vous plait ?
Salut crossfitman,
voici une idée
Sub test()
Dim sht As Worksheet
Dim i As Integer
Set sht = ThisWorkbook.Worksheets("News normalisé (2)")
With sht
For i = 2 To 9
If .Cells(3, i).Value = "" Then Exit Sub
If .Cells(3, i).Value <> "" Then
.Range("AG3:AG148").ClearContents
.Range(.Cells(3, i), .Cells(148, i)).Copy .Range("AG3")
.Range("AL3:AL148").Copy
.Cells(3, 39 + i).PasteSpecial Paste:=xlPasteValues
End If
Next i
End With
End Sub
Bonne nuit
C'est parfait merci beaucoup ! Il faut vraiment que je reprenne les bases de VBA pour comprendre l'intérêt des premières lignes qui permettent de définir les arguments ainsi que le rôle des i, j etc ... Car quand ça marche, le gain de temps est magique !
Bonjour,
Sub test()
Dim sht As Worksheet ' déclaration de la variable sht comme feuille
Dim i As Integer ' déclaration de i pour le numéro de la colonne
Set sht = ThisWorkbook.Worksheets("News normalisé (2)") ' definir la feuille de travail
With sht ' la boucle ne fonctionne que sur la feuille de travail définie
For i = 2 To 9 ' i correspond au numéro de la colonne 2==>B, 3==>C, 4==>D etc.
If .Cells(3, i).Value = "" Then Exit Sub ' si la valeur de la céllule (B3, C3, D3,...) est vide on quite la macro
If .Cells(3, i).Value <> "" Then ' si la valeur de la céllule (B3, C3, D3,...) n'est pas vide
.Range("AG3:AG148").ClearContents ' on efface la plage AG3:AG148
.Range(.Cells(3, i), .Cells(148, i)).Copy .Range("AG3") ' on copie les valeurs B3:B148, C3:C148, etc dans AG3:AG148
.Range("AL3:AL148").Copy ' copier AL3:AL148
.Cells(3, 39 + i).PasteSpecial Paste:=xlPasteValues ' insérer uniquement les valeurs dans AN3:AN148, AM3:AM148, etc.
End If
Next i
End With
End Sub
@++
Merci pour les explications ! Donc quand on écrit :
Dim i As Integer
Le i renvoi toujours à la colonne, et si ma logique est bonne j = ligne ? Donc si je voulais travailler sur des lignes, je dirais
Dim j As Integer 'définir la variable j
j = 5 'commencer à la ligne 5
If .Cells(1, j).Value 'Si la valeur de A5 ....
Je fais bonne route ??
Non c'est l'inverse
Dim j As Integer 'définir la variable j
j = 5 'définir la colonne 5 qui est E
If .Cells(1, j).Value 'Si la valeur de E1 (Cells(1, j) ===> j c'est la colonne E et la ligne 1
donc ton code deviendra comme ca si on change le i avec le j
Sub test()
Dim sht As Worksheet ' déclaration de la variable sht comme feuille
Dim j As Integer ' déclaration de j pour le numéro de la colonne
Set sht = ThisWorkbook.Worksheets("News normalisé (2)") ' definir la feuille de travail
With sht ' la boucle ne fonctionne que sur la feuille de travail définie
For j = 2 To 9 ' j correspond au numéro de la colonne 2==>B, 3==>C, 4==>D etc.
If .Cells(3, j).Value = "" Then Exit Sub ' si la valeur de la céllule (B3, C3, D3,...) est vide on quite la macro
If .Cells(3, j).Value <> "" Then ' si la valeur de la céllule (B3, C3, D3,...) n'est pas vide
.Range("AG3:AG148").ClearContents ' on efface la plage AG3:AG148
.Range(.Cells(3, j), .Cells(148, j)).Copy .Range("AG3") ' on copie les valeurs B3:B148, C3:C148, etc dans AG3:AG148
.Range("AL3:AL148").Copy ' copier AL3:AL148
.Cells(3, 39 + j).PasteSpecial Paste:=xlPasteValues ' insérer uniquement les valeurs dans AN3:AN148, AM3:AM148, etc.
End If
Next j
End With
End Sub