Probleme de liaison entre classeurs

Messages postés
14
Date d'inscription
mardi 5 juillet 2016
Dernière intervention
22 août 2016
-
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.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
1
Merci
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#ou-les-trouver

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
timgvz
Messages postés
14
Date d'inscription
mardi 5 juillet 2016
Dernière intervention
22 août 2016
-
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...
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
> timgvz
Messages postés
14
Date d'inscription
mardi 5 juillet 2016
Dernière intervention
22 août 2016
-
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"
Commenter la réponse de ucfoutu
Messages postés
14
Date d'inscription
mardi 5 juillet 2016
Dernière intervention
22 août 2016
-1
Merci
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?
timgvz
Messages postés
14
Date d'inscription
mardi 5 juillet 2016
Dernière intervention
22 août 2016
-
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?
cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Dernière intervention
23 août 2018
-
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
Commenter la réponse de timgvz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.