Probleme de liaison entre classeurs

timgvz Messages postés 14 Date d'inscription mardi 5 juillet 2016 Statut Membre Dernière intervention 22 août 2016 - Modifié par ucfoutu le 6/07/2016 à 11:17
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 7 juil. 2016 à 10:08
Bonjour,


J’aimerais créer un tableau qui se constitue au fur et à mesure du temps à partir de certaines informations énoncées dans différents formulaires (qui sont sous formes de tableaux excel , cependant il n’y a que 2 ébauches de document-type, seules les valeurs diffèrent dans les formulaires).
Pour cela j’ai pensé à faire un code VBA avec un bouton clic qui, me remplirait mon tableau en fonction du formulaire que je souhaite retranscrire. En revanche, même si le tableau et les formulaires sont dans le même répertoire, je n’arrive pas à faire le lien entre le tableau et le formulaire un des formulaires. En effet, comme il faut que je sois capable de changer facilement de formulaire, je veux passer par une variable qui soit le nom du formulaire, mais cela ne marche pas.
Voilà une partie de mon code (attention, mon faible niveau de débutant pique les yeux) :

Sub Transcription()
Dim Source As Workbook, no_ligne As Integer
Set Source = Range("T2")
If Source.Sheets("Sheet1").Range("A8") = "Currency" Then
no_ligne = 1
If IsEmpty(Cells(no_ligne, 1)) Then
Range("A" & no_ligne) = [Source]Sheet1!B6
Range("C" & no_ligne) = [Source]Sheet1!B4
End If
Else
no_ligne = no_ligne + 1
Else
If IsEmpty(Cells(no_ligne, 1)) Then
Range("A" & no_ligne) = [Source]Sheet1!B4
Range("D" & no_ligne) = [Source]Sheet1!B2
Range("E" & no_ligne) = "ESC"
Range("G" & no_ligne) = [Source]Sheet1!B5
Range("H" & no_ligne) = [Source]Sheet1!B6
Range("I" & no_ligne) = [Source]Sheet1!B13
If IsEmpty(Cells(no_ligne, 2)) Then
Range("K" & no_ligne) = [Source]Sheet1!B17
Else
Range("K" & no_ligne) = [Source]Sheet1!B16
End If
End If
Else
no_ligne = no_ligne + 1
End If
End Sub


C'est le type de ligne Range("blabla" & no_ligne) = [Source]Sheet1!Bblabla qui me renvoie une erreur.

Nb : Il y a certainement beaucoup d’autres problèmes, n’hésitez pas à me les expliciter (et à me casser les dents).


Merci d’avance.

J'ai mis ton code entre balises code. Veille s'il te plait à prendre dorénavant ce soin toi-même.

6 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juil. 2016 à 14:21
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juil. 2016 à 10:53
Bonjour,
Je ne peux tout corriger (trop d'incompréhensions de base qui ne peuvent que me conduire à t'inviter à commencer à apprendre au moins les rudiments !)
Je m'arrête à ceci, qui montre d'entrée de jeu une grave carence :
Dim Source As Workbook, no_ligne As Integer
Set Source = Range("T2")

comment peut-on définir la variable source comme étant un objet classeur et l'initialiser en lui affectant un objet Range ????
Cette erreur serait mise en exergue bien avant celle que tu dénonces si tu te contentais de mettre ces deux seules lignes de code !
Tu as écrit :
Nb : Il y a certainement beaucoup d’autres problèmes, n’hésitez pas à me les expliciter (et à me casser les dents).

Je vais laisser tes dents intactes, mais tu ne peux continuer ainsi. Il importe que tu commences à apprendre les bases.
Bonne étude
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 juil. 2016 à 12:25
J'ai selon toute évidence annoté en vain ton premier message ===>>>
Pour mémoire :
J'ai mis ton code entre balises code. Veille s'il te plait à prendre dorénavant ce soin toi-même.
Modifié par ucfoutu le 6/07/2016 à 11:17

Tu ignores ? ===>> eh bien si ignorer est à la mode, j'ignore également.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 6/07/2016 à 18:32
L'erreur apparait à mon avis dès la première instruction après ouverture de l'objet source, à savoir ici :
 Sheets("tab1").Range("A" & no_ligne) = Source.Sheets("Sheet1").Range("B6")

l'ouverture fait que le classeur actif est le classeur source et non celui de départ. Et si l'objet source n'a pas de feuille "tab1", ma foi ===>> l'erreur dénoncée.
Remède : toujours préciser le classeur concerné, selon la syntaxe prudente suivante (exemple) :
Workbooks("Classeur_untel").worksheets("feuille_unetelle).range(...).value = Workbooks("Classeur_autrel").worksheets("feuille_autre).range(...).value

Observons : je ne laisse pas non plus VBA décider de se montrer tolérant ou non ===>> je précise systématiquement la propriété concernée (ici : la propriété Value)
Il y aurait beaucoup à dire encore (création d'un objet =Thisworkbook, utilisation de bloc With, etc ...) pour agiliser tout cela , mais je ne veux pas transformer cette discussion en cours d'apprentissage des rudiments. Ce n'est pas exactement la vocation de ce forum.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 7/07/2016 à 10:50
Bon ...
Je ne vais surtout pas tout te faire.
Juste te montrer un exemple de mécanisme, à adapter et compléter (facile si tu analyses et comprends):

Dim Source As Workbook, feuille_source As Worksheet, no_ligne As Long
Dim feuille_desti As Worksheet
Set feuille_desti = ThisWorkbook.Worksheets("Tab1")
Set Source = Workbooks.Open(feuille_desti.Range("S2").Value)
Set feuille_source = Source.Worksheets("Sheet1")
With feuille_desti
no_ligne = .Range("A" & Rows.Count).End(xlUp).Row + 1
MsgBox no_ligne
array_desti = Array("A", "C", "D")
array_source = Array(7, 3, 8)
For i = 0 To UBound(array_desti)
.Range(array_desti(i) & no_ligne).Value = feuille_source.Range("B" & array_source(i)).Value
Next
End With

Avec cet exemple :
- la cellule S2 de ton fichier de départ doit contenir un chemin de classeur valide
- la colonne B du fichier à ouvrir pour y "puiser" doit contenir des données en lignes 3,7 et 8
en lançant cette macro, tu obtiendras en dernière ligne des colonnes A, C et D de la feuille Tab1 de ton fichier de départ les valeurs mises en B7, B3 et B8 (dans cet ordre) de la feuille Sheet1 du fichier où tu puises.
Voilà (mais j'ai parfaitement conscience de ce que ce n'est peut-être pas un service, que je te rends là).
Bonne chance

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
timgvz Messages postés 14 Date d'inscription mardi 5 juillet 2016 Statut Membre Dernière intervention 22 août 2016
7 juil. 2016 à 09:17
Merci beaucoup pour ton investissement !!!

Grâce à ton exemple j'ai pu remarquer qu'en réalité mon erreur venait très certainement de ma condition:


If Source.Sheets("Sheet1").Range("A8") = "Currency" Then
'blabla
Else
'blabla
End If


C'est certainement tout bête mais je n'arrive pas à enlever ce problème de 'Subscript out of range'.
J'ai même essayé avec .Value, mais même problème...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > timgvz Messages postés 14 Date d'inscription mardi 5 juillet 2016 Statut Membre Dernière intervention 22 août 2016
Modifié par ucfoutu le 7/07/2016 à 10:12
C'est certainement tout bête mais je n'arrive pas à enlever ce problème de 'Subscript out of range'.

Ben ... si ta variable objet source est bien un classeur, tu le sauras en essayant :
msgbox source.name
Si erreur (avec ces seules lignes de code, sans remplacer les " 'blabla" ==>> source a mal été typé et initialisé
Si pas erreur, cela veut dire que le classeur source ne contient pas de feuille nommée exactement "Sheet1"
Quant à :
J'ai même essayé avec .Value,

C'est encore autre chose et je t'en ai parlé plus haut : toujours préciser, même si VBA "devine"
0
timgvz Messages postés 14 Date d'inscription mardi 5 juillet 2016 Statut Membre Dernière intervention 22 août 2016
6 juil. 2016 à 11:27
Bonjour et merci de ta perspicacité.

J'ai quelaue peu modifié la chose :

Sub Transcription()
Dim Source As Workbook, no_ligne As Integer
Set Source = Workbooks.Open(Sheets("tab1").Range("S2").Value)
no_ligne = 1
If Source.Sheets("Sheet1").Range("A8") = "Currency" Then
While Not IsEmpty(Cells(no_ligne, 1))

no_ligne = no_ligne + 1

Wend

Sheets("tab1").Range("A" & no_ligne) = Source.Sheets("Sheet1").Range("B6")
Sheets("tab1").Range("C" & no_ligne) = Source.Sheets("Sheet1").Range("B4")
Sheets("tab1").Range("D" & no_ligne) = Source.Sheets("Sheet1").Range("B2")
Range("E" & no_ligne) = "LCD"
Sheets("tab1").Range("G" & no_ligne) = Source.Sheets("Sheet1").Range("B8")
Sheets("tab1").Range("H" & no_ligne) = Source.Sheets("Sheet1").Range("B7")
Sheets("tab1").Range("I" & no_ligne) = Source.Sheets("Sheet1").Range("B21")
Sheets("tab1").Range("J" & no_ligne) = Source.Sheets("Sheet1").Range("B27")
Sheets("tab1").Range("M" & no_ligne) = Source.Sheets("Sheet1").Range("B3")
Sheets("tab1").Range("O" & no_ligne) = Source.Sheets("Sheet1").Range("B18")
Sheets("tab1").Range("P" & no_ligne) = Source.Sheets("Sheet1").Range("B22")
Else
While Not IsEmpty(Cells(no_ligne, 1))
no_ligne = no_ligne + 1
Wend

Sheets("tab1").Range("A" & no_ligne) = Source.Sheets("Sheet1").Range("B4")
Sheets("tab1").Range("D" & no_ligne) = Source.Sheets("Sheet1").Range("B2")
Range("E" & no_ligne) = "ESC"
Sheets("tab1").Range("G" & no_ligne) = Source.Sheets("Sheet1").Range("B5")
Sheets("tab1").Range("H" & no_ligne) = Source.Sheets("Sheet1").Range("B6")
Sheets("tab1").Range("I" & no_ligne) = Source.Sheets("Sheet1").Range("B13")
If IsEmpty(Cells(no_ligne, 2)) Then
Sheets("tab1").Range("K" & no_ligne) = Source.Sheets("Sheet1").Range("B17")
Else
Sheets("tab1").Range("K" & no_ligne) = Source.Sheets("Sheet1").Range("B16")
End If
Sheets("tab1").Range("L" & no_ligne) = Source.Sheets("Sheet1").Range("B18")
Sheets("tab1").Range("M" & no_ligne) = Source.Sheets("Sheet1").Range("B3")
Sheets("tab1").Range("P" & no_ligne) = Source.Sheets("Sheet1").Range("B19")

End If
End Sub


Mais maitenant j'ai une erreur 'Subscript Out of rang'... Une idée?
-1
timgvz Messages postés 14 Date d'inscription mardi 5 juillet 2016 Statut Membre Dernière intervention 22 août 2016
6 juil. 2016 à 15:04
Bonjour et merci de ta perspicacité.

J'ai quelaue peu modifié la chose :

Sub Transcription()
Dim Source As Workbook, no_ligne As Integer
Set Source = Workbooks.Open(Sheets("tab1").Range("S2").Value)
no_ligne = 1
If Source.Sheets("Sheet1").Range("A8") = "Currency" Then
While Not IsEmpty(Cells(no_ligne, 1))

no_ligne = no_ligne + 1

Wend

Sheets("tab1").Range("A" & no_ligne) = Source.Sheets("Sheet1").Range("B6")
Sheets("tab1").Range("C" & no_ligne) = Source.Sheets("Sheet1").Range("B4")
Sheets("tab1").Range("D" & no_ligne) = Source.Sheets("Sheet1").Range("B2")
Range("E" & no_ligne) = "LCD"
Sheets("tab1").Range("G" & no_ligne) = Source.Sheets("Sheet1").Range("B8")
Sheets("tab1").Range("H" & no_ligne) = Source.Sheets("Sheet1").Range("B7")
Sheets("tab1").Range("I" & no_ligne) = Source.Sheets("Sheet1").Range("B21")
Sheets("tab1").Range("J" & no_ligne) = Source.Sheets("Sheet1").Range("B27")
Sheets("tab1").Range("M" & no_ligne) = Source.Sheets("Sheet1").Range("B3")
Sheets("tab1").Range("O" & no_ligne) = Source.Sheets("Sheet1").Range("B18")
Sheets("tab1").Range("P" & no_ligne) = Source.Sheets("Sheet1").Range("B22")
Else
While Not IsEmpty(Cells(no_ligne, 1))
no_ligne = no_ligne + 1
Wend

Sheets("tab1").Range("A" & no_ligne) = Source.Sheets("Sheet1").Range("B4")
Sheets("tab1").Range("D" & no_ligne) = Source.Sheets("Sheet1").Range("B2")
Range("E" & no_ligne) = "ESC"
Sheets("tab1").Range("G" & no_ligne) = Source.Sheets("Sheet1").Range("B5")
Sheets("tab1").Range("H" & no_ligne) = Source.Sheets("Sheet1").Range("B6")
Sheets("tab1").Range("I" & no_ligne) = Source.Sheets("Sheet1").Range("B13")
If IsEmpty(Cells(no_ligne, 2)) Then
Sheets("tab1").Range("K" & no_ligne) = Source.Sheets("Sheet1").Range("B17")
Else
Sheets("tab1").Range("K" & no_ligne) = Source.Sheets("Sheet1").Range("B16")
End If
Sheets("tab1").Range("L" & no_ligne) = Source.Sheets("Sheet1").Range("B18")
Sheets("tab1").Range("M" & no_ligne) = Source.Sheets("Sheet1").Range("B3")
Sheets("tab1").Range("P" & no_ligne) = Source.Sheets("Sheet1").Range("B19")

End If
End Sub


Mais maitenant j'ai une erreur 'Subscript Out of rang'... Une idée?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
6 juil. 2016 à 16:38
Bonjour,

Sur quelle ligne apparaît cette erreur ?

NB:
Pour trouver la 1ere ligne vide, tu peux faire ainsi, plutôt que boucler
no_ligne = Sheets("tab1").Cells(Rows.count, "A").end(xlup).row + 1
0
Rejoignez-nous