[Déplacé .Net --> VBA] copier coller avec variable est-ce possible de faire une

cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009 - 22 oct. 2009 à 14:28
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 25 oct. 2009 à 00:37
Bonjour,

Débutant en VBA excel je suis entrain de créer un document excel qui permet de mettre a jour un autre document.
Pour l'instant j'utilise le code suivant :
numero1 = Range("L107")
numero2 = Range("L108")
numero3 = Range("L109")
numero4 = Range("L110")
numero5 = Range("L111")
numero6 = Range("L112")
numero7 = Range("L113")
numero8 = Range("L114")
numero9 = Range("L115")
numero10 = Range("L116")
numero11 = Range("L117")
numero12 = Range("L118")
numero13 = Range("L119")
numero14 = Range("L120")
numero15 = Range("L121")
numero16 = Range("L122")
numero17 = Range("L123")
numero18 = Range("L124")
numero19 = Range("L125")
numero20 = Range("L126")Workbooks.Open "C:\2009.xls"
    Workbooks("ficher.xls").Sheets("Forms89").Range("R107:U107").Copy
    
    Workbooks("2009.xls").Sheets("S89").Select
Set cellule = Range("A2:A1000").Find(numero1)
cellule.Select
ActiveCell.Offset(0, 6).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False
    Workbooks("ficher.xls").Sheets("Forms89").Range("R108:U108").Copy
    
    Workbooks("2009.xls").Sheets("S89").Select
Set cellule = Range("A2:A1000").Find(numero2)
cellule.Select
ActiveCell.Offset(0, 6).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
 :=True, Transpose:=False
    Range("a1").Select

....

j'ai donc mis ce code 20 fois mais je suis à la recherche d'un code plus court pouvant faire la même chose je pensais au boucle mais je sais pas comment faire.

Quelqu'un pourrait-il m'aider
Merci d'avance

damien

16 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 oct. 2009 à 17:57
Bonjour,

oui, une boucle s'impose...

sans regarder spécifiquement ton code, on peut remplacer numero1,...,numero20 en les mettant dans un tableau avec DIM. On a donc déjà :
DIM Numero(20)
ce qui remplacera avantageusement les 20 variables par une seule (en qlq sorte) qui contient 20 indices...
Par exemple, tu peux faire :
numero(5) = "truc"
et
msgbox numero(5) qui renvoit "truc"... c'est donc l'équivalent de numero5="truc" qui tu aurais fait.

Ensuite, une boucle, oui ! pour mettre les ranges qui se suivent... ce qui est bien pratique en passant...

For t=107 to 126
numero(t-107)=range("L" & str(t)).value
next t


Enfin, le code de recherche sera aussi adapté par une boucle ainsi :

for For t=107 to 126

Workbooks("ficher.xls").Sheets("Forms89").Range("R" & str(t) & ":U" & str(t)).Copy    
Workbooks("2009.xls").Sheets("S89").Select
Set cellule = Range("A2:A1000").Find(numero(t-107))
cellule.Select
ActiveCell.Offset(0, 6).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=True, Transpose:=False

next t


=

Donc au final :

DIM Numero(20)

For t=107 to 126
numero(t-107)=range("L" & str(t)).value
next t


for For t=107 to 126

Workbooks("ficher.xls").Sheets("Forms89").Range("R" & str(t) & ":U" & str(t)).Copy    
Workbooks("2009.xls").Sheets("S89").Select
Set cellule = Range("A2:A1000").Find(numero(t-107))
cellule.Select
ActiveCell.Offset(0, 6).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=True, Transpose:=False

next t


=

Je n'ai pas cherché à faire mieux que ton code, mais seulement de le raccourcir avec une boucle... il est encore optimisable, mais bon...

Amicalement,
Us.
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
22 oct. 2009 à 18:02
merci beaucoup de ton aide je vais testé tous ça.
Merci


damien
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
22 oct. 2009 à 18:10
Il me met une erreur au niveau de : numero(t-107)=range("L" & str(t)).value. Erreur d'exécution 1004 de range dans _global
damien
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 oct. 2009 à 18:43
Bigre !

Utilises plutôt les références par cells... cela passe toujours mieux...

For t = 107 To 126
Numero(t - 107) = Range("A1").Cells(t, 12)
Next t


et

Workbooks("ficher.xls").Sheets("Forms89").Range(Cells(t, 18), Cells(t, 21)).Copy


ensuite, il peut avoir une erreur sur :
Set cellule = Range("A2:A1000").Find(numero(t-107))
cellule.Select
dans le cas où la correspondance n'est pas trouvé... mais peut-être que dans ton cas, cela ne peut pas se produire...

Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
22 oct. 2009 à 18:55
Merci bcq de ton aide. Il ne me fait plus d'erreur mais maintenant j'ai pour
Workbooks("ficher.xls").Sheets("Forms89").Range(Cells(t, 18),
, l'erreur d'exécution "9" L'indice n'appartient pas à la selection j'ai essayer de fermer la parenthese mais cela ne change rien.


merci de ton aide
damien
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 oct. 2009 à 19:01
?? je ne comprends pas, ce que tu dis... quelle parenthèse à fermer ?

Rappelle du code :

Workbooks("ficher.xls").Sheets("Forms89").Range(Cells(t, 18), Cells(t, 21)).Copy


Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 oct. 2009 à 19:02
pourquoi tu écris que la moitié de la ligne ?

Amicalement,
Us.
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
22 oct. 2009 à 19:13
Workbooks("ficher.xls").Sheets("Forms89").Range(Cells(t, 18), Cells(t, 21)).Copy

Il veut pas l'exécuter une fois il met l'erreur 9 ou 1004

Merci de ton aide

damien
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 oct. 2009 à 19:23
Normal, pour faire une copie il faut que l'objet (ici la feuille) doit être activée :

Workbooks("ficher.xls").Sheets("Forms89").Activate


soit ici :

For t=107 to 126

Workbooks("ficher.xls").Sheets("Forms89").Activate
Workbooks("ficher.xls").Sheets("Forms89").Range("R" & str(t) & ":U" & str(t)).Copy    
Workbooks("2009.xls").Sheets("S89").Select
Set cellule = Range("A2:A1000").Find(numero(t-107))
cellule.Select
ActiveCell.Offset(0, 6).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=True, Transpose:=False

next t


Amicalement,
Us.
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
22 oct. 2009 à 19:37
C'est bon ça marche. Il me reste juste une erreur à résoudre sur : Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=True, Transpose:=False

erreur qu'il me faissait aussi au début encore l'autre méthode avant que ça lui passe lol

merci beaucoup de ton aide.

damien
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
22 oct. 2009 à 19:43
C'est super cela marche maintenant, mon erreur et que j'avais mis l'ouverture du fichier 2009 dans la boucle donc il voulait me l'ouvrir plein de fois.

merci encore beaucoup pour ton aide.
damien
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 oct. 2009 à 21:21
OK.

Il reste une remarque que j'avais fait : Est-il possible que les données recherchées n'aboutissent pas ?

Si non, alors tout est okay.

Si oui, alors il y aura une erreur qui va se produire sur cellule.select :

Set cellule = Range("A2:A1000").Find(numero(t-107))
cellule.Select


Amicalement,
Us.
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
23 oct. 2009 à 07:58
Bonjour,

Normalement il trouve toujours les données car c'est en établissant un formulaire que je rempli un tableau (2009.xls) et c'est a partir de ce meme formulaire que je modifie les données en rechercher les valeurs. Par contre je n'ai pas toujours les 20 valeurs donc une fois que les lignes sont vides, il selectionne la premiere ligne vide de mon tableau (2009.xls)

Merci encore de ton aide.
amicalement,
damien
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
23 oct. 2009 à 15:21
De rien, tout le plaisir était pour moi.

A+
Amicalement,
Us.
0
cs_opanis Messages postés 15 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 24 octobre 2009
24 oct. 2009 à 07:35
Bonjour,

J'aurais juste une petite dernière question, serait-il possible de rajouter une condition au code qui dit que si la valeur de L110 est vide par exemple, il ne fait rien ?
Merci de ta réponse
damien
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
25 oct. 2009 à 00:37
Que veut dire exactement par : Ne fait rien ?

Si c'est ne pas exécuter la macro, alors le simple c'est de faire le test avant tout autre chose :

If range("L110").value=vbnullstring then exit sub


Amicalement,
Us.
0
Rejoignez-nous