hoquei44
Messages postés15335Date d'inscriptiondimanche 19 janvier 2014StatutMembreDernière intervention22 mai 2023
-
16 juin 2017 à 14:43
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 2023
-
17 juin 2017 à 20:18
Bonjour,
Je recherche la syntaxe qui me permettrai de simplifier le code suivant :
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.
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 202321 Modifié le 17 juin 2017 à 08:15
Bonjour,
Par exemple :
Sub itération()
Dim r As Range
Dim i As Byte
For i = 1 To 3
Range("A8").Formula = "I-00" & i
Set r = Range("I8")
Set r = Range(r, r.End(xlToRight))
Range("I1" & i - 1).Resize(1, r.Columns.Count).Value = r.Value
Next i
End Sub
Mais, attention à l'emploi de End(xlToRight) : c'est pas l'idéal si la ligne risque d'être vide.
PS: Est-il nécessaire d'écrire la formule en A8 ?
Cordialement
Patrice
hoquei44
Messages postés15335Date d'inscriptiondimanche 19 janvier 2014StatutMembreDernière intervention22 mai 2023 17 juin 2017 à 08:35
Bonjour,
Dans l'absolu non, mais il est cependant nécessaire que la case modifiée (A8) soit sur la même ligne que les valeurs copiés (I8 et suivantes).
Vous aviez une idée en tête ?
CB
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 202321
>
hoquei44
Messages postés15335Date d'inscriptiondimanche 19 janvier 2014StatutMembreDernière intervention22 mai 2023 17 juin 2017 à 20:18
Bonjour,
« Vous aviez une idée en tête ? », Si la valeur des cellules I8 et suivantes ne dépendent pas de A8, cette dernière pourrait être obtenue par une simple formule.
J'ai répondu un peu vite, sans voir que le nombre d'itérations est en K1 !
Voici un mix entre mon code précédent et l'excellent code de ccm81, pour éviter l'emploi de Copy puis PasteSpecial. Ces instructions utilisent le Presse-papier et donc sont beaucoup plus lentes que la copie directe des valeurs dans Excel.
Sub itération() Dim r As Range, i As Long With ActiveSheet For i = 1 To .Range("K1").Value .Range("A8").Formula = "I-" & Format(i, "000") Set r = .Cells(8, Columns.Count).End(xlToLeft) Set r = .Range("I8", r) .Range("I" & 9 + i).Resize(1, r.Columns.Count).Value = r.Value Next i End With End Sub
hoquei44
Messages postés15335Date d'inscriptiondimanche 19 janvier 2014StatutMembreDernière intervention22 mai 2023 17 juin 2017 à 08:34
Bonjour merci du retour et des conseils,
Pour info ccm81 m'a transmis les lignes suivantes qui sont fonctionnent sur ma page :
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