Variables de classeur
Bonjour a tous,
il y a decidement des subtilites qui m'echappent en VBA.
Depuis un classeur contenant une macro, je souhaite a terme copier une colonne de l'un a l'autre. J'ai donc defini des variables suivant ce que j'ai rencontre sur internet:
Sub TEST()
Dim wb0 As Workbook, wb As Workbook
Dim ws0 As Worksheet, ws As Worksheet
Dim nl0 As Long, nl As Long
Dim fic As String
' Declaration du fichier de depart
fic = "C:\Users\moi\Desktop\VBA\TEST.XLS"
Set wb0 = Application.Workbooks.Open(fic)
' Declaration de la feuille qui contient les donnees: ws0
Set ws0 = Worksheets("Cas 1")
' Ouverture du classeur de destination
fic = "C:\Users\moi\Desktop\VBA\Test_destination.xlsm"
Set wb = Application.Workbooks.Add(fic)
' Declaration de la feuille qui contient les donnees: ws
Set ws = Worksheets("Cas 1")
' Determination du nombre de lignes de la colonne de destination
nl0 = wb0.ws0.Range("M" & Rows.Count).End(xlUp).Row
' Determination di nombre de lignes de la colonne de destination
nl = wb.ws.Range("M" & Rows.Count).End(xlUp).Row
' print des nombres de lignes respectifs
MsgBox ("Nombre de lignes dans depart: " & nl0 & " destination: " & nl)J'ai une erreur de syntaxe dans la determination de nl0...
J'ajoute que si je supprime les wb.ws devant les Range, cela me calcule bien le nombre de lignes du fichier de destination, mais ce n'est pas le but ,)
Je ne veux bien entendu pas de la solution ou je calcule nl0 avant l'ouverture du fichier de destination ^^'
Il y a quelque chose que je n'ai pas comprise dans l'utilisation des variables visiblement, si vous avez des idees...
Bon apres-midi !
Bonjour,
Essaie ceci :
Sub TEST()
Dim wb0 As Workbook, wb As Workbook
Dim ws0 As Worksheet, ws As Worksheet
Dim nl0 As Long, nl As Long
Dim fic As String
'Fichier de depart
fic = "C:\Users\moi\Desktop\VBA\TEST.XLS"
Set wb0 = Workbooks.Open(fic)
Set ws0 = wb0.Worksheets("Cas 1")
nl0 = ws0.Range("M" & Rows.Count).End(xlUp).Row
'Fichier de destination
fic = "C:\Users\moi\Desktop\VBA\Test_destination.xlsm"
Set wb = Workbooks.Open(fic)
Set ws = wb.Worksheets("Cas 1")
nl = ws.Range("M" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de lignes dans depart: " & nl0 & " destination: " & nl)
End SubBonjour Jean-Eric,
et merci de t'etre penche sur mon probleme: ta solution marche effectivement, mais ce n'est pas ce que je recherche.
En effet, je voudrais d'abord ouvrir les 2 fichiers, et ensuite seulement determiner le nombre de lignes de chacun d'eux.
Ce n'est pas un caprice: j'ai pris le nombre de lignes comme exemple, mais le veritable but est de naviguer de l'un a l'autre, et je pensais que la nomenclature workbook.worksheet.fonction le permettait a coup sur... Cela pourrait correspondre a des numeros d'unite de fichiers ouverts tels qu'on les rencontre dans d'autres langages (fortran, C notamment), mais peut-etre n'est ce pas possible...
Ce qui m'interesse c'est de comprendre pourquoi cette syntaxe n'est pas possible...
Encore merci de tes efforts!
Re,
Alors reviens avec une exemple représentatif !...
Cdlt.
Je suis desole, je ne sais pas ce qui est entendu par exemple representatif.
L'algorithme est celui indique dans le code d'origine:
1- ouverture de fichier de depart
2- ouverture de fichier d'arrivee
3- determination du nombre de lignes dans une colonne du fichier de depart
4- determination du nombre de lignes dans une colonne du fichier d'arriveealors que ta solution est:
1- ouverture de fichier de depart
3- determination du nombre de lignes dans une colonne du fichier de depart
2- ouverture de fichier d'arrivee
4- determination du nombre de lignes dans une colonne du fichier d'arriveeMais je ne veux pas inverser les points 2 et 3, je veux comprendre comment on peut passer d'un fichier ouvert a un autre avec une commande du type:
wb.ws.fonctionou wb est le nom d'un des 2 fichiers, ws la feuille de ce fichier, et fonction n'importe quoi, par exemple le comptage de lignes, la fonction copy, la fonction couleur, etc....
Je ne sais pas si c'est plus clair?
Desole de surement mal exposer le soucis...
Bonne fin de journee!
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Hello, ça m'intéresserait fortement de savoir aussi !
Je suis tout ceci avec le plus grand intérêt.
Re,
Il y a confusion !
Il n'y a pas de différence entre les 2 solutions.
Sinon, ws0 est liée à wb0 et ws est liée à wb...
Je ne sais pas si je vais dans le bon chemin. ma vision est défaillante, et je vois des sapins partout.
Teste :
Sub TEST()
Dim wb0 As Workbook, wb As Workbook
Dim ws0 As Worksheet, ws As Worksheet
Dim nl0 As Long, nl As Long
Dim fic As String
'Fichier de depart
fic = "C:\Users\moi\Desktop\VBA\TEST.XLS"
Set wb0 = Workbooks.Open(fic)
Set ws0 = wb0.Worksheets("Cas 1")
nl0 = ws0.Range("M" & Rows.Count).End(xlUp).Row
'Fichier de destination
fic = "C:\Users\moi\Desktop\VBA\Test_destination.xlsm"
Set wb = Workbooks.Open(fic)
Set ws = wb.Worksheets("Cas 1")
nl = ws.Range("M" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de lignes dans depart: " & nl0 & " destination: " & nl)
'Informations !...
MsgBox ws0.Parent.Name
MsgBox ws.Parent.Name
MsgBox Workbooks(ws0.Parent.Name).FullName
MsgBox Workbooks(ws.Parent.Name).FullName
'Conclusion ?
End SubMerci de tes efforts Jean-Eric,
mais ce n'est toujours pas ce que je souhaite ^^'
Les msgbox donne bien les noms de fichiers puis ces noms avec leur chemin (bizarrement pas le second), mais mour faire le parallele, pourrait-on par exemple ecrire :
MsgBox wb.wsou bien:
Msgbox wb.ws.FullNamePour indiquer ces memes noms?
Desole d'insister, en fait je ne sais pas si cela est possible, mais dans ma petite tete c'est a ca que devraient servir les variables definies plus haut ;)
Encore merci, ainsi qu'a JoyeuxNoel qui m'a deja aide sur le sujet :)
Bonne soiree!!
Bonjour tout le monde,
j'ai finalement pu contourne le probleme avec le code suivant, ou la notion de "variable" pour les wb me semble plus claire:
Sub Test()
Dim wb0 As Workbook, wb1 As Workbook
Dim ws0 As Worksheet, ws1 As Worksheet
Dim ns0 As String, ns1 As String, fic As String
Dim nl0 As Long, nl1 As Long
' Declaration du 1er fichier
fic = "C:\Users\moi\Desktop\VBA\a1.xlsx"
Set wb0 = Application.Workbooks.Open(fic)
ns0 = "feuil1"
Set ws0 = Worksheets(ns0)
' Declaration du 2nd fichier
fic = "C:\Users\moi\Desktop\VBA\a2.xlsx"
Set wb1 = Application.Workbooks.Open(fic)
ns1 = "feuil1"
Set ws1 = Worksheets(ns1)
' Determination du nombre de lignes des 2 fichiers
wb0.Activate
nl0 = ws0.Range("A" & Rows.Count).End(xlUp).Row
wb1.Activate
nl1 = ws1.Range("A" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de lignes fichier 1: " & nl0 & Chr(13) & Chr(10) & "Nombre de lignes fichier 2: " & nl1)
End SubVraiment dommage de ne pas pouvoir directement ecrire:
nl0 = wb0.ws0.Range("A" & Rows.Count).End(xlUp).Row
nl1 = wb1.ws1.Range("A" & Rows.Count).End(xlUp).Rowmais en tous cas je n'ai pas trouve ^^'
Merci a tous pour votre aide, bonnes vacances!