[VBA] copier un classeur vers un autre

Fermé
hnok - 29 mars 2007 à 12:19
 neo2k2 - 26 oct. 2007 à 17:21
Bonjour,

J'ai un bouton dans le premier fichier Excel (appellons le outil); lorsque je clique sur ce bouton, j'ouvre un fichier Excel contenant plusieurs colonnes, qui ne sont pas toutes nécessaires par la suite pour le traitement que j'ai à faire (ce fichier qui s'ouvre prend un nom aléatoire)
je voudrais pouvoir sélectionner certaines colonnes de ce fichier que j'ai ouvert et les coller dans un worksheet spécifique du classeur initial ("outil").

j'ai essayé plusieurs fonctions mais qui ne fonctionnent pas. déjà à la sélection des colonnes à copier, ca déconne quand je teste le programme en pas à pas. je commence à galérer un peu je vois pas comment faire.

sauriez vous comment faire, ou au moins quelques pistes ?

merci bcp d'avance !!!
A voir également:

4 réponses

finalement j'ai trouvé une solution

maintenant j'ai une (2) autre question :

voila, parmi les colonnes que je sélectionne, déjà chaque colonne du worksheet depuis lequel on copie n'aura pas toujours le meme nombre de ligne. c'est à dire que je peux pas faire genre : range("A1:A20").select par exemple.
donc est ce qu'il y a une fonction/mot clé qui permet de sélectionner la dernière cellule contenant des données de la colonne que l'on sélectionne ?

et ma 2ème question est : comment faire pour sélectionner plusieurs colonnes a la fois lorsque celles-ci ne sont pas adjacentes ?
je voudrais sélectionner par exemple les colonnes : A, B, et P, mais sans les colonnes entre B et P.

merci pour vos réponses !!! :-)
0
xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007 183
29 mars 2007 à 15:04
Salut,

Sub selec_colonnes()
Dim r1, r2, r3, myMultipleRange As Range
Set r1 = Sheets(1).Range(Range("A1"), Range("A1").End(xlDown).Address)
Set r2 = Sheets(1).Range(Range("B1"), Range("B1").End(xlDown).Address)
Set r3 = Sheets(1).Range(Range("P1"), Range("P1").End(xlDown).Address)
Set myMultipleRange = Union(r1, r2, r3)
myMultipleRange.Select
End Sub

Avec ça ça devrait marcher...
0
hnok > xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007
29 mars 2007 à 16:26
chapeau !!

merci !
ca marche impec.
j'étais pas loin, j'étais en train de réfléchir comment employer cette fonction End(xldown) justement, mais je connaissais pas la fonction Union :-(

sinon, je vais profiter que tu sois dans les parages :D pour compléter mon problème.

en fait ce code marche nikel si je le met dans le sheet du fichier a partir duquel je copie les 3 colonnes en question.
Or je voudrais écrire ce meme code dans le fichier vers lequel je copie les colonnes (ce fichier est mon outil)
le problème c'est que le fichier qui contient les 3 colonnes à copier a un nom aléatoire. il va s'apeller "Book20", et si je le rouvre il s'apellera "Book21" par exemple.
donc il faudrait que par exemple, a partir de mon outil, j'active le fichier qui vient d'etre ouvert, avant d'entrer dans ce bout de code qui permet de copier les 3 colonnes.
aurais tu une idée de comment faire ca ??

(je pense qu'il doit y avoir une ligne qui commence par activate. )
0
xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007 183 > hnok
30 mars 2007 à 10:16
Salut,

je repassais par hasard... ;-)

Ne place pas ce code dans ta feuille mais dans un module appellé "module1" par exemple, et remplace simplement Sheets(1) par ActiveSheet dans les trois lignes et ça devrait marcher !
0
salut,
ben encore une fois, merci !!!
ca marche! au final, j'obtiens pour le moment exactement ce que je voulais. :-))

j'espère que tu seras dans les parages de temps en temps, car je risque d'avoir d'autres questions, et donc de te soliciter, vu que je n'ai pas encore terminé mon projet.
et vu que dans cette entreprise, personne peut m'aider sur le VBA :-(
bon WE xjl
0
Bonjour,

voila, j'ai un tableau de données dont je voudrais parcourir la 2è colonne pour en déduire de nouvelles données. que j'afficherai dans une autre colonne.
pour le moment à priori, lorsque je parcours le programme pas à pas, mon code permet de parcourir par ligne, donc je n'ai pas le résultat escompté.
voici mon code :

If (Cells(i, 2).Value = Cells(i - 1, 2).Value) Then nbadjacence = nbadjacence + 1

j'ai essayé de rajouter column devant cells, mais ca marche pas.

sinon, comment on fait pour mettre plusieurs conditions dans un if ??
lorsque j'en mets plusieurs, j'ai des messages incohérents du genre :
"endif without if", "next without for"

merci d'avance
0
xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007 183
2 avril 2007 à 17:07
Salut,

la ligne que tu nous donne concerne ton if, or si tu parcours par ligne et non par colonne comme tu le voudrais, ça vient sûrement plus de ta boucle for que tu as placé avant, donc pour t'aider il nous faudrait un peu plus de code que ça...

Ensuite, pour mettre plusieurs conditions dans un if, tu peux les séparer par un or ou un and suivant ce que tu veux faire, ou alors utiliser des if imbriqués...

A toi de voir !
0
hnok > xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007
3 avril 2007 à 00:08
voila le code que j'ai pour l'instant :

sub adjacence()
nbadjacence = 0
For i = 2 To 10 Columns.End(xldown)
If (Cells(i, 2).Value = Cells(i - 1, 2).Value) Then nbadjacence = nbadjacence + 1
If (Cells(i, 2).Value <> Cells(i - 1, 2).Value) Then Cells(i - 1, 4).Value = nbadjacence and nbadjacence = 0
Next i
End Sub

Si 2 cellules adjacentes ont un contenu different, je souhaite afficher le nombre de cellules au contenu identique qui viennent d'être parcourues dans chacune des lignes correspondantes de la colonne 4; éventuellement regrouper ces cellules au contenu identique dans une meme ligne sur un nouveau worksheet.
Connais tu comment parcourir la colonne ?
C peut etre 2 for imbriqués, mais je vois pas comment faire ca :-~
0
oupss, le 10 dans le For n'a pas lieu d'être, désolé, erreur de frappe
0
xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007 183 > hnok
3 avril 2007 à 08:26
Salut,

ben en fait, non seulement il faut que tu enlèves le 10, mais il est également préférable que tu mettes un
Range("B1").End(xlDown).Count à la place de ton Columns.End(xlDown)... Au moins là t'es sûr que ça va te renvoyer le nombre de lignes entre ta case B1 et la fin de ta colonne.

Après si tu as mis "For 2 To..." je suppose que c'est parce que tu as une ligne d'en-tête dans tes colonnes, et dans ce cas tu peux remplacer B1 par B2...Sinon tu mets 1 à la place de 2 dans ton for...
0
xjl Messages postés 232 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 12 juin 2007 183 > hnok
3 avril 2007 à 08:31
J'ai cru que mon message précédent avait buggé...

Bon si la solution fonctionne, pense à cloturer le sujet ! ;-)
0
Bonjour, pour ton problème, essaye simplement d'incrémenter de 1 ta condition d'arrêt de la boucle.

for i=j-nbadjacence to j+1 par exemple...
0