Adaptation formule copier valeur VBA
Bonjour,
Je ne connais pas bien le VBA. J'ai cependant récuperé et adapté une formule qui me convient.
La seule modification que j'aimerais faire c'est ne copier que les "valeurs" des lignes a partir de A31 du classeur d'origine.
J'utilisais avant copy/select/past mais j'ai compris que nous devions eviter autant que faire se peut cette méthode.
J'ai pensé rajouter le critere VALUE mais je ne sais pas ou le mettre et mes essais ont été infructueux.
Remerciements à tous.
Sub Transfert()
Dim lig As Long
'Selection du tableau à partir de la cellule A31
For lig = 31 To ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
If Application.CountA(Rows(lig)) > 0 Then
'Copie de la ligne entière si non vide sur la feuille "Liste Installateur"
Rows(lig).Copy Destination:=Sheets("Liste Installateur").Rows(Sheets("Liste Installateur").Range("A" & Rows.Count).End(xlUp).Row + 1)
End If
Next lig
'Selectionne la cellule A1
Range("A1").Select
End Sub
Salut lioga,
Voici le code pour faire un beau copié/collé d'une plage avec VBA :
Sub copie_colle()
Dim CopyRange As Range
Dim PasteRange As Range
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A31:A" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de données que tu veux copier
Set PasteRange = ThisWorkbook.Worksheets("Feuil2").Range("A31:A" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de cellules où tu veux coller
PasteRange.Value2 = CopyRange.Value2 'Copie/colle les données
Set CopyRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Set PasteRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
End SubBonne soirée !
Baboutz
Merci Baboutz pour ta réponse rapide...Comme beaucoup suis impressioné par la facilité à laquelle vous repondez a un probleme donné...
Par contre est il possible, dans ta formule, de mettre le collage final a la suite des lignes deja existantes et non pas de les coller a partir de A31 sur la feuill2?
La selection des valeurs a copier marche, le collage marche ,mais l'endroit du collage me pose probleme. :-)
Merci encore.
Sur certains problème, on y a déjà été confronté et donc on connait bien comment le résoudre
En effet, je ne savais pas exactement où il fallait coller...
À tester:
Remplacer
Set PasteRange = ThisWorkbook.Worksheets("Feuil2").Range("A31:A" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de cellules où tu veux collerPar
Set PasteRange = ThisWorkbook.Worksheets("Feuil2").Range("A" & Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row & ":A" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de cellules où tu veux collerÇa marche ?
Baboutz
Ca marche !! Je dois effectuer qq modifications pour avoir satisfaction..Je ne clos pas encore le sujet car je vais surement avoir besoin d'une derniere information quand j'aurais analyser mon besoin.
Je reviens rapidement.
Bon...Apparement il serait plus souhaitable que la selection A COPIER soit en definitif uniquement la plage A31:I33 de la feuil1....
J'ai essaye de modifier la ligne suivante :
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A31:A" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row)
En :
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A31:I33")
Mais comme tu t'en doutes ca ne marche pas....
Exemple :
Je voudrais copier la selection A31:I33 de ma feuil1SI elles ne sont pas vides ( dans cet exemple les lignes 31, 32 et 33 sont non vides, elles peuvent l'être)
Et coller cette sélection sur ma feuil2, ici à la suite des enregistrements existant :
Je ne suis pas sure d'être super clair...
Re lioga !
Avec CopyRange tu définies la plage à copier ; avec PasteRange tu définies la plage où coller ! Ces deux plages doivent être identiques en terme de taille, sinon, ça coince.
Pour ce que tu veux faire, c'est à dire copier "A31:I33" tu as eu le bon reflexe avec CopyRange ! Mais tu as oublié de modifier PasteRange ! Tu as essayé de faire rentrer une plage de cellule("A31:I33") de cellules dans une plage de cellules de cellules !
Donc ton CopyRange est bon à moitié, car toi tu désires ne copier que les cellules non-vides.
Donc il faut que tu cherches quelles est la dernière lignes non vide !
Donc pour ton CopyRange ça donnera :
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A31:I" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row)Ce bout de code : Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row signifie qu'il récupère le N° de ligne de la dernière cellule non vide dans la colonne A ! Étant donnée que la dernière cellule non-vide est A33, ce bout de code récupère "33" !
Donc c'est comme si ça donnait :
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A31:I33")Sauf que si dans le futur, si tu as plus ou moins de lignes remplies, le code ajustera cela !
Au niveau du PasteRange, comme tu archives (Du moins c'est l'impression que j'ai
Ce qui donne :
TailleRange = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row - 31
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A" & Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row +1 & ":I" & Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row + TailleRange + 1)J'ai, comme tu le vois, rajouté '+1' pour pouvoir commencer le collage dans le ligne en dessous de la dernière ligne non-vide. Ensuite, venait un problème : connaître la taille de la plage ! Du coup, on rajoute une variable TailleRange qui nous permet ensuite d'ajuster le tir.
Tu me suis ?
Voici donc ton code final :
Sub copie_colle()
Dim CopyRange As Range
Dim PasteRange As Range
Dim TailleRange As Long
TailleRange = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row - 31 'On calcule la taille de la plage
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A31:I" & Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de données que tu veux copier
Set CopyRange = ThisWorkbook.Worksheets("Feuil1").Range("A" & Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row +1 & ":I" & Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row + TailleRange + 1) 'La plage de cellules où tu veux coller
PasteRange.Value2 = CopyRange.Value2 'Copie/colle les données
Set CopyRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Set PasteRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
End SubEst-ce ça marche chez toi ?
Bonne soirée,
Baboutz
Merci encore pour le temps passé et les explications en prime !
Mais ça ne semble pas fonctionner...
J'ai essayé de modifier ta formule finale avec les explications que tu m'as données mais sans succés :
Sub copie_colle()
Dim CopyRange As Range
Dim PasteRange As Range
Dim TailleRange As Long
TailleRange = Worksheets("FORMULAIRE").Range("A" & Rows.Count).End(xlUp).Row - 31 'On calcule la taille de la plage
Set CopyRange = ThisWorkbook.Worksheets("FORMULAIRE").Range("A31:I" & Worksheets("FORMULAIRE").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de données que tu veux copier
Set PastRange = ThisWorkbook.Worksheets("FORMULAIRE").Range("A" & Worksheets("Liste Installateur").Range("A" & Rows.Count).End(xlUp).Row + 1 & ":I" & Worksheets("Liste Installateur").Range("A" & Rows.Count).End(xlUp).Row + TailleRange + 1) 'La plage de cellules où tu veux coller
PasteRange.Value2 = CopyRange.Value2 'Copie/colle les données
Set CopyRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Set PasteRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
End Sub
En rouge ce que j'ai modifié :
J'ai enlevé un = CopyRange (pensant que c'etait une faute de doublon)
J'ai changé le deuxieme Set CopyRange = en Set PastRange = (pensant que c'etait une erreur de frappe)
J'ai un message d'erreur sur la ligne Set PastRange.
Je pense qu'ON est pas loin.....(remarque le ON tout a fait déplacé...
Ahah, mais si ! C'est un travail de groupe !
Il est possible que j'ai fait une erreur, puisque je n'ai pas testé avec un fichier...
Tu pourrais mettre un fichier anonymisé afin que je puisse corriger cela ?
En effet, c'était une erreur de copié/collé et bel et bien un doublon à supprimer, tu as bien fait.
PS : Pour mettre des lignes de codes, cliques sur </> !
Euh....Comment anonymiser un fichier?
Il n'y a rien de confidentiel mais t'envoyer le fichier en l'etat il comporte 8 feuilles avec des formules imbriquées "rechercheV" etc....
Sinon je crée un fichier exemple?
S'il n'y a rien de confidentiel, tu peux me l'envoyer tel quel, je sais qu'il faut que je traite les feuilles 'FORMULAIRE' et 'Liste installateur" donc ne t'inquiète pas !
Ci-joint. J'ai supprimé toutes les infos nominatives.
Tu constateras une macro que j'avais fait "SAISIE" avec la fleche Orange sur l'onglet FORMULAIRE.La première partie de cette macro fonctionne, quoique peut n'être pas optimale.
La deuxième partie de la macro, je pense que tu la reconnaitras, tente de faire ce pour quoi tu es sollicitée.
En fait la feuille FORMULAIRE est à remplir, et on vient alimenter les différents champs de la feuille CRA et Liste Installateur.
L'alimentation de la feuille CRA fonctionne (via la première partie de la macro SAISIE.)
L'alimentation de la feuille liste Installateur est celle qui nous concerne.
Je réunirais ensuite le tout en une seule macro.
Voici le code corrigé :
Sub copie_colle()
Dim CopyRange As Range
Dim PasteRange As Range
Dim TailleRange As Long
TailleRange = Worksheets("FORMULAIRE").Range("A" & Rows.Count).End(xlUp).Row - 31 'On calcule la taille de la plage
Set CopyRange = ThisWorkbook.Worksheets("FORMULAIRE").Range("A31:I" & Worksheets("FORMULAIRE").Range("A" & Rows.Count).End(xlUp).Row) 'La plage de données que tu veux copier
Set PasteRange = ThisWorkbook.Worksheets("Liste Installateur").Range("A" & Worksheets("Liste Installateur").Range("A" & Rows.Count).End(xlUp).Row + 1 & ":I" & Worksheets("Liste Installateur").Range("A" & Rows.Count).End(xlUp).Row + TailleRange + 1) 'La plage de cellules où tu veux coller
PasteRange.Value2 = CopyRange.Value2 'Copie/colle les données
Set CopyRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Set PasteRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
End SubIl y avait deux problèmes :
- C'était écrit
Set PastRangeau lieu deSet PasteRange! Il manquait un e, ça ne risquait pas de marcher - J'avais marqué également
Set PasteRange = ThisWorkbook.Worksheets("FORMULAIRE")au lieu deSet PasteRange = ThisWorkbook.Worksheets("Liste Installateur")donc forcément ça ne collait pas dans la bonne feuille !
Alors j'ai vu ta macro SAISIE et... mon cœur s'est arrêté. On voit que tu t'es aidée de l'enregistreur de macro, ce qui est bien ! Mais il y a de bien meilleurs manières de faire ça. Je vais y jeter un petit coup d’œil.
Retiens qu'en VBA, pour avoir des macros saines, propre et qui ont un temps d'exécution rapide, il faut :
1. N'utiliser le .Select qu'en cas nécessaire ! Dans la très grande majorité des cas on peut faire sans !
2. Pareil avec le copié/collé !
Bonne journée,
Baboutz
Re Baboutz.
Comme tu t'en doutes ca marche nickel.
Mais....Dans les champs A31:I33 de ma feuill1 sur le fichier que je t'ai envoyé on remplissait les champs directement ou pas.
Hors, je pense que je vais devoir les remplir via une formule SI"()"...Dans ce cas, les champs seront soit remplis soit marqueront une valeur 0 si la conditon est fausse.
Dans ce cas le code VBA doit être modifié? En effet il ne reconnaitra pas la valeur 0 comme un champ vide je pense et me collera des 0...
Suis désolé de te donner les informations au fur et a mesure...Je pense qu'avec ce dernier changement je serai au top.
Merci encore pour ton partage et ta disponibilité.
Mais....Dans les champs A31:I33 de ma feuill1 sur le fichier que je t'ai envoyé on remplissait les champs directement ou pas.
Bonjour lioga,
Je n'ai pas compris...
Peux-tu me ré-expliquer s'il te plaît ? Tu veux ne pas copier les lignes quand il n'y a que des 0 c'est ça ?
Sinon explique moi la globalité de ce que tu désires faire avec ton bouton 'flèche', j'aurai une meilleure vue d'ensemble
Bonne journée,
Baboutz
Alors, sur le fichier que je t'ai envoyé, tous les champs blancs de l'onglet FORMULAIRE seront a remplir par des commerciaux.
Sauf certains qui seront alimenter par des rechercheV (ca c'est ok).
une partie de ces champs seront repris pour alimenter l'onglet CRA. (ça c'est ma macro qui t'a donné un infarctus).
La deuxieme partie de ces champs, ceux se referant aux installateurs sur cette feuille FORMULAIRE seront remplis mais ponctuellement.
Ces informations installateurs, par facilité pour creer une macro, ont été copier sur les champs A31:I33.LA raison sociale, la ville le tel etc... (ca c'etait avant de te connaitre, tu aurais surement fait autrement)
Et ce sont ces fameuses cellules A31:I33 que j'essayais de copier/coller dans l'onglet Liste Installateurs sans succes. (A l'aide d'une patie de macro que tu n'as pas car je l'ai remplacé par ton code. Elle était a la suite de celle qui t'a piqué les yeux.
Du coup le bouton fleche devra lancer une macro une fois que le commercial aura saisi les informations de la feuille Formulaire, en sachant qu'une partie de ces infos iront dans l'onglet CRA et seront jamais vides, et une deuxieme partie de ces informations, relatives aux installateurs, devra alimenter l'onglet Liste Installateurs uniquement si elles sont rensignées au prealable.
Je sais pas si j'ai été clair.
si ca pêut t'aider : la cellule B31 par exemple, sur le fichier finale sera =SI(C13="";"";C13)
A l'origine cette feuille FORMULAIRE est un formulaire de Saisie et ces fameuses lignes a parir de la ligne 29 ne me servent que pour faciliter mes macros. (d'aileurs idealement j'aurais voulu les masquer, ce qui peut aussi poser un probleme peut etre pour les codes VBA...Pas grave si pas possible).
Autres solutions on vire toutes lignes a partir de la ligne 29 et on fait autrement, mais du coup faut refaire toutes ma/mes macros...
Si je résume :
- La première partie du "tableau" en bleu doit alimenter le tableau "CRA".
- La seconde partie doit alimenter le tableau "Liste installateur".
- Effacer les infos après l'injection dans les tableaux.
Tu confirmes ?
Si c'est cela, en effet les infos en bas comme tu l'as fait ne sont vraiment pas nécessaire... Et le code que je t'ai fait n'est également pas utile ici !
Oui c'est exactement ça... Les noms des champs de la feuille FORMULAIRE correspondent normalement au nom des champs à affecter dans le tableau CRA ou liste Installateur.
Ville dans la colonne Ville, Contact dans la colonne contact etc.
Certaines valeurs sont issues comme tu as pu le voir d'un autre onglet avec des formules rechercheV.
À force de triturer une journée complète le fichier j'en étais arrivé a créér ces lignes à partir de la ligne 29 pour faciliter la macro sous forme de ". Select".
Ce qui me chagrine c'est que du coup, à vouloir simplifier au début je t'ai faits travailler pour rien si je comprends bien... J'etais parti pour seulement ajuster une deuxième partie de macro qui me posait problème sans me rendre compte que cette macro était à la base bien bancale...
Mes excuses Baboutz.
lioga,
Il n'y a pas de mal !
J'ai fais ton fichier, je te poste un message avec explications dans 5min