Execel VBA : faire n boucles avec les macros

Résolu/Fermé
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 - 16 juin 2017 à 14:45
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 - 17 juin 2017 à 08:28
Bonjour,

Je recherche la syntaxe qui me permettrai de simplifier le code suivant :

Sub itération()
'
' itération Macro
'
    Range("A8").Select
    ActiveCell.FormulaR1C1 = "I-001"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("A8").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "I-002"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I11").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("A8").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "I-003"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I12").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
End Sub


L'opération est, comme vous le constater, toujours la même.

Je recherche la syntaxe qui me permettrait d'utiliser la macro un nombre n fois (correspondant à un nombre de ligne déterminé par la case K1 avec une formule du type nb.val() ).

Dans le code, les seules différences sont :
- ActiveCell.FormulaR1C1 = "I-001" qui doit atteindre "I-n". Si les deux zéros posent problèmes, il est possible de les supprimer ;
- En parallèle que le dernier range("I10").Select s'incrémente de 1 à chaque tour commençant à la ligne "I10" jusqu'à atteindre la ligne "I(10+n-1)".


Je vous remercie d'avance pour l'aide que vous pourrez m'apporter.

Bonne journée

3 réponses

ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
16 juin 2017 à 15:25
Bonjour

Je ne vois pas trop où tu veux en venir, mais essaies ceci
Const n = 10

Sub OK()
Dim k As Long, adfin As String
With ActiveSheet
  For k = 1 To n
    .Range("A8").Value = "I-" & Format(k, "000")
    adfin = .Cells(8, Columns.Count).End(xlToLeft).Address
    .Range("I8:" & adfin).Copy .Range("I" & 9 + k)
  Next k
End With
End Sub

Cdlmnt
0
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
Modifié le 16 juin 2017 à 17:06
Merci,

Je ne vois pas trop où tu veux en venir
Ca veut dire que je me suis mal exprimé.

Je cherche un moyen d'éviter les répétitions dans mon code. Le but est que je n'ai plus à rajouter un bloc supplémentaire à chaque fois que je rajoute une ligne.

Sub itération()
'
' itération Macro
'

'
    Range("A8").Select
    ActiveCell.FormulaR1C1 = "Objet-001"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("A8").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "Objet-002"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I11").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("A8").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "Objet-003"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I12").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("A8").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "Objet-004"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I13").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("A8").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "Objet-005"
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("I14").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False


End Sub



Le résultat attendu serait plutôt du type (même si je sais que je vais écrire ne veut rien dire) :

Sub itération()
'
' itération Macro
'

' La cellule K1 détermine le nombre de boucle
     Range("K1").Select 
     Const n = ActiveCell.FormulaR1C1

' Déclaration de variables 
     Dim k As Long

' Début de la boucle
For k = 1 To n

    Range("A8").Select
    ActiveCell.FormulaR1C1 = "Objet-" & Format(k, "000")
    Range("I8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
' Je ne pense pas que l'on puisse mettre une variable directement dans un range :
    Range("I" & k + 9).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Next k
' Fin de la boucle

End Sub



Bonne journée
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
Modifié le 16 juin 2017 à 17:02
Et ce n'est pas ce que fait le code proposé plus haut, mis à part la constante n qui devrait être déclarée comme variable et affectée du contenu de K1 lors de l'exécution ?
voir procedure OK
http://www.cjoint.com/c/GFqpalW64za

Cdlmnt
0
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
16 juin 2017 à 17:15
Je viens de voir le fichier. Je vais essayer de le tester car cela ressemble à ce que j'attends.

Merci ccm81
0
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 > hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
16 juin 2017 à 20:46
J'ai eu du mal à comprendre pourquoi cela ne marchait pas.

J'avais déjà une macro nommée OK dans mon classeur. Et c'est donc l'autre macro qui s'actionnait quand j'essayais de la lancer.
hum, hum, bon

Il y aurait juste un point qui ne fonctionne pas bien. Et je pense que cela expliquerait le fait que vous n'avez pas saisie l'intérêt de ce que je voulais faire.
Vous avez dû vous dire qu'il suffisait de faire un copier-coller puis de dérouler pour obtenir le résultat, mais :

Les cellules copiées ne doivent pas être collées directement mais un collées via "option collage / valeurs (v) - 123 ".
En effet j'ai mis des formules de calcul dans les cases copiés qui sont modifiées à chaque changement de la case A8.

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Je ne sais pas comment intégrer l'équivalent de cette portion dans votre code.

CB
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
16 juin 2017 à 22:08
Sub OK()
Dim k As Long, adfin As String, n As Long
With ActiveSheet
  n = .Range("K1").Value
  For k = 1 To n
    .Range("A8").Value = "I-" & Format(k, "000")
    adfin = .Cells(8, Columns.Count).End(xlToLeft).Address
    .Range("I8:" & adfin).Copy
    .Range("I" & 9 + k).PasteSpecial Paste:=xlPasteValues
  Next k
End With
End Sub

Cdlmnt
0
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
17 juin 2017 à 08:28
Merci ! c'est bon pour moi
0