KioskeaKioskeaCommentCaMarcheInscrivez-vous, c'est gratuit !
Mardi 13 mai 2008 - 01:58:08

[VBA] copier un classeur vers un autre

Rechercher : dans
[VBA] copier un classeur vers un autre
par hnok
 Fil de Discussions
Statut : Non résolu
jeudi 29 mars 2007 à 12:19:02
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 !!!
Configuration: Windows XP
Firefox 2.0.0.2
Répondre à hnok  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le jeudi 29 mars 2007 à 14:37:54 Fil de Discussions
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 !!! :-)
Répondre à hnok

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le jeudi 29 mars 2007 à 15:04:58 Fil de Discussions
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...
Répondre à xjl

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le jeudi 29 mars 2007 à 16:26:17 Fil de Discussions
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. )
Répondre à hnok

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le vendredi 30 mars 2007 à 10:16:54 Fil de Discussions
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 !
Répondre à xjl

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le vendredi 30 mars 2007 à 14:43:09 Fil de Discussions
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
Répondre à hnok

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le lundi 2 avril 2007 à 16:56:20 Fil de Discussions
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
Répondre à hnok

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le lundi 2 avril 2007 à 17:07:14 Fil de Discussions
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 !
Répondre à xjl

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le mardi 3 avril 2007 à 00:08:06 Fil de Discussions
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 :-~
Répondre à hnok

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le mardi 3 avril 2007 à 00:10:08 Fil de Discussions
oupss, le 10 dans le For n'a pas lieu d'être, désolé, erreur de frappe
Répondre à hnok

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le mardi 3 avril 2007 à 08:26:36 Fil de Discussions
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...
Répondre à xjl

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le mardi 3 avril 2007 à 08:31:03 Fil de Discussions
J'ai cru que mon message précédent avait buggé...

Bon si la solution fonctionne, pense à cloturer le sujet ! ;-)
Répondre à xjl

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le mardi 3 avril 2007 à 11:04:07 Fil de Discussions
Salut xjl !

merci pour ton aide;-) J'en ai tenu compte, mais ça donnait pas tout à fait le résultat que je voulais. après réflexion, j'ai pu avancer un peu. voici le code que j'ai :

nbadjacence = 0
i = 1
j = 2
For i = Cells(j, 2) To Range("B2").End(xlDown)
Cells(j, 2).Select
If (Columns.Cells(j, 2) = Columns.Cells(j - 1, 2)) Then nbadjacence = nbadjacence + 1
'si 2 cellules adjacentes ont un contenu different
If (Cells(j, 2).Value <> Cells(j - 1, 2).Value) Then Cells(j - 1, 4).Value = nbadjacence
j = j + 1
Next i
End Sub

actuellement, j'arrive à parcourir la colonne :-) (le Cells(j,2).select permet de visualiser ca), mais j'ai toujours un problème concernant le compteur nbadjacence.
en effet, lorsque l'on rentre dans le then de la 2è condition, nbadjacence passe à 0 en meme temps que d'afficher sa valeur dans la cellule correspondante de la colonne 4. cad que j'ai que des 0 dans la colonne 4 :-(
Est ce que tu sais comment implémenter cette instruction?
Je voudrais pouvoir afficher la valeur de nbadjacence dans la cellule de la colonne 4, PUIS, initialiser nbadjacence à 0.
Et le 2è problème que j'ai, c'est que je n'ai pas la bonne valeur de nbadjacence. c'est à dire que si dans la colonne B, j'ai 3 cellules de valeur 9, suivies de 3 cellules de valeur 10, j'aurai nbadjacence à 2, puis 2, dans la colonne 4 (ou plutot 2, puis 4, vu que j'initialise pas nbadjacence). Aurais tu une piste pour résoudre ce pbm ??

Merci d'avance !!
Répondre à hnok

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le mardi 3 avril 2007 à 11:28:13 Fil de Discussions
Alors, déjà je trouve que ta manière de boucler sur la colonne est un peu spéciale, mais bon, admettons...

Ensuite, ton deuxième if ne sert à rien, il te suffit de mettre un else après le premier if et d'y mettre ton Cells(j - 1, 4).Value = nbadjacence

Ce qui me choque également, c'est que t'as pas de End if pour clôturer ton if, pour moi ça peut pas marcher, alors je sais pas si tu l'as pas copier sur le site ou si t'en as vraiment pas mais à vérifier...

Enfin, si c'est vraiment le nombre total de cases égales qui se suivent que tu veux, alors ton nbadjacence, tu peux essayer de l'initialiser à 1 après ton Cells(j - 1, 4).Value = nbadjacence and nbadjacence=1 et il faut d'ailleurs que tu l'initialises à 1 au départ et non à 0

je sais pas si ça va marcher mais ça vaut le coup d'essayer...
Répondre à xjl

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le mardi 3 avril 2007 à 16:10:04 Fil de Discussions
merci ! ^^
alors concernant les conditions, tu as raison et effectivement j'ai rectifié. les if que j'avais écris l'étaient de manière provisoire vu que j'avais des messages d'erreurs bizarres du genre "endif without if".
donc j'avais écris ca comme ca pour pouvoir avancer sur le programme et pas perdre trop de temps. en fait j'ai compris que ces messages d'erreur venaient du fait que je respectais pas bien l'indentation. elle a de l'importance ici à priori (MSExcel pro 2003)
donc ca c'est corrigé.
pour calculer le nbadjacence, le problème est corrigé également :-)
je récupère la valeur désirée.

il me reste 2 p'tits pbm :
la 2è borne du for qui devrait permettre d'atteindre la fin de la colonne, ne fait qu'atteindre qu'une ligne aléatoire (pas toujours la meme) en cours de colonne. ... c'est un mystère....
et l'autre truc qui me manque désormais, est que dans la colonne 4 ou j'affiche le "nbadjacence", je voudrais que la valeur de ce nbadjacence apparaisse à chaque ligne.
c'est à dire que actuellement, dans la colonne 2, si j'ai 3 cellules à 9 suivies de 3 cellules à 10, j'aurai 3 qui apparaitra à l'intersection de la colonne 4 et de la dernière ligne contenant la valeur 9. Or, je voudrais que cette valeur de nbadjacence (3 dans l'exemple, car 3 cellules à 9) apparaisse dans chaque ligne qui contient le 9 de la colonne 2. en effet, chaque ligne contient dans une autre colonne un identifiant unique auquel on peut avoir à se référer par la suite.
NB : j'ai vraiment l'impression de progresser en VBA :-)) j'ai commencé de 0 il y a 10 jours :-~ merci pour ton aide!

sinon, voici le code que j'ai à présent :

'initialisation des variables de parcours de la colonne
nbadjacence = 0
i = 1
j = 2

For i = Cells(j, 2) To Range("B2").End(xlDown)
Cells(j, 2).Select
If (Columns.Cells(j, 2).Value = Columns.Cells(j - 1, 2).Value) Then
nbadjacence = nbadjacence + 1

'si 2 cellules adjacentes ont un contenu different
'il faut d'abord incrémenter nbadjacence de 1 pour prendre en compte le passage a la nouvelle valeur
'puis reinitialiser le compteur
Else
nbadjacence = nbadjacence + 1
'pour ne pas ecraser le nom du parametre
If j > 2 Then
Cells(j - 1, 4).Value = nbadjacence
End If
nbadjacence = 0
End If

j = j + 1

Next i
Répondre à hnok

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le mardi 3 avril 2007 à 16:11:42 Fil de Discussions
désolé, l'indentation n'apparait sur le message sur le forum, mais ce "bout de code" marche impec pour le moment
Répondre à hnok

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par xjl, le mercredi 4 avril 2007 à 08:43:42 Fil de Discussions
Alors deux choses:

faut vraiment que tu change ta façon de boucler...
Essaye: For j = 2 to Range("B2", Range("B2").End(xlDown)).Count
en enlevant le j = j + 1

Normalement ça devrait bien se passer...

Ensuite, pour écrire nbadjacence dans toutes les cellules concernées, je te conseille de mettre une petite boucle for après avoir trouvé la dernière cellule de même valeur:

For i = j-nbadjacence to j
Cells(i,4).Value=nbadjacence
Next i

Essaye ça et tu verras ce que ça donne...

PS: l'indentation n'est pas importante mais aide à la compréhension de ton code, ce qui importe c'est bien de fermer toutes tes boucles ou conditions dans l'ordre où elles ont été ouvertes...
Répondre à xjl

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par hnok, le vendredi 6 avril 2007 à 13:16:58 Fil de Discussions
salut xjl !

merci pour les réponses :-)
j'ai changé la façon de boucler. j'ai viré le j=j+1
et ca marche bien :D
j'ai mis une petite boucle for comme tu as conseillé, ca marche impec maintenant.... enfin presque :
je n'atteint pas la dernière ligne, le comptage s'arrete a l'avant dernière ligne. j'ai fais un débogage pas à pas, mais je comprend pas la raison :-~
Répondre à hnok

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par neo2k2, le vendredi 26 octobre 2007 à 17:21:54 Fil de Discussions 
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...
Répondre à neo2k2
Discussions pertinentes trouvées dans le forum
06/08 14h19[Excel VBA] - Copier classeur vers autreProgrammation13/12 14h291
19/07 10h54[VBA] Copie vers presse papierProgrammation19/07 14h011
13/12 14h08[excel VBA] copier une feuille de classeurProgrammation13/12 19h284
13/03 16h13EXCEL/VBA copier/collerProgrammation14/03 10h032
Plus de discussions sur « [VBA] copier un classeur vers un autre » Discussion en cours Discussion fermée Problème résolu
Répondre
Titre du message :
Votre pseudo:
Votre email :
Message: 
  •  
  •  
Options: Recevoir les réponses par mail.
 

Aide