lien entre 2 classeurs

  • Initiateur de la discussion Initiateur de la discussion aurélien
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

A

aurélien

Guest
quelle est la syntaxe dans une macro vb pour faire appel à des données d'un autre classeur? comment spécifier le chemin d'accès à cet autre classeur?
workbooks? worksheets?
Merci.
 
Salut Aurélien,

J'ai peur de ne pas bien saisir ta question ? "faire appel à des données"

Faire un récupération de ranges sur deux classeurs différents on peut faire çà (NB Condition Les 2 Classeur SONT OUVERTS ):
Workbooks("book1.xls").Worksheets("Sheet1").Range("a2:c2").Value = Workbooks("book2.xls").Worksheets("Sheet1").Range("a2:c2").Value

Donc ce serait WORKBOOKS... Si j'ai bien capté (?)

Par contre si c'est sur des classeurs fermés... Mis à part l'ouverture du classeur (qui serait donc l'instruction: "Workbooks.Open").... je ne vois que les liens...qui non pas d'objet "WorkBooks" ni "WorkSheets"

Exemple 1 : Faire un "update" de lien existant donnerait ceci...
ActiveWorkbook.UPDATELINK Name:= _
"G:\USERS\SHARE\Shared Banks\Bank BNP PARIBAS.xls", Type:=xlExcelLinks

Exemple 2 : Créer un nouveau lien donnerait ceci...
ActiveCell.FormulaR1C1 = _
"='G:\USERS\SHARE\Shared Banks\[BNP PARIBAS.xls]Sheet2002'!R3C2"
(mais bon, faut exactement savoir où se trouve la cellule à lier...)


Ou bien........ Peut_être veux-tu lire des donnée d'un classeur fermé... Là il faut cette fonction de J.walkenbach :

Public Function GetValue(ByVal path, ByVal file, ByVal sheet, ByVal ref) As Variant

Dim Arg As String
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "File Not Found"
Exit Function
End If

Arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
GetValue = Application.ExecuteExcel4Macro(Arg)
DoEvents

End Function

Sur le site de disciplus.simplex tu as des exemples
<http://disciplus.simplex.free.fr/xl/fichiers.htm#classeurfermé>

Voilà, je pense avoir fair le tour de la question...
Bon Lundi et bonne semaine à tous et toutes
@+Thierry
 
Salut Thierry,
finalement, je met la série de question et le formulaire dans le même classeur.
J'ai un petit pb avec les questions aléatoires ( fichiers joints), si la première change, les autres sont tjrs les mêmes, je vois pas ou je me suis trompé.
Chaque module devra contenir entre 3 et 5 questions issue chacun d'une même série de questions (sheet2) mais il faut qu'elle soit différente à chaque fois.
Je suis débutant en macro et vb, donc, si tu puvais me filer un ptit coup de main 🙂
 
bon, j'ai résolu une partie du pb, il fallait mettre
Numero = Int((11 - 1) * Rnd + 1) pour la série complète de question d'un module.
Mais il reste un pb, comment éviter les doublons, qu'une question n'apparaissent pas 2 fois?
Merci.
 
Salut Aurélien,

Je n'ai pas très bien compris ce revirement de situation on parle de "lien entre 2 classeurs" puis je me retrouve avec un classeur démo à moi !! tu aurais dû rester dans la même ficelle, ou y faire référence, vu qu'elle est ancienne, çà m'aurait peut-être évité de m'étendre sur les liens comme ci-dessus...

Sacré Aurélien!

Non si j'ai bien compris, tu as simplement fait un copié/collé de la formule rechercheV sur les Cellules C7, C9, C11 et C13... sans te soucier des zones de série de questions comme j'avais préparé dans la démo.

Et en plus tu as viré le ";0" (ou ";FAUX") à la fin........Il ne faut pas ! (si tu enlèves çà, tu retournes la valeurs la plus approchante et ici ce n'est pas le but)
C'est normal que çà ne marche plus...

Remplace tes formules en sheet1 comme suit :
en C7 =VLOOKUP(B7,Sheet2!$A$2:$B$11,2,0)
en C9 =VLOOKUP(B9,Sheet2!$A$12:$B$21,2,0)
en C11 =VLOOKUP(B11,Sheet2!$A$22:$B$31,2,0)
en C13 =VLOOKUP(B12,Sheet2!$A$32:$B$41,2,0)

Euh en Français ce doit être çà :
C7 =RECHERCHEV(B7;Sheet2!$A$2:$B$11;2;0)
etc

Cà devrait marcher mieux...

Par contre pour faire un "TOUT" dans cette ficelle, j'imagine pourquoi tu as commencé par cette question plus haut...
Tu as la possibilité de faire la "database" de tes questions sur un fichier séparé que par exemple tu nommera Question.xls (enregistré sur ton réseau et accessible à tes users), et là tu n'auras qu'à faire un lien en RECHERCHEV comme çà :

=VLOOKUP(B7,'G:\Users\Share\Database\[Question.xls]Sheet1'!$A$2:$BF$11,2,0)

Utilise L'assistant de fonction est applique RECHERCHEV tu n'auras qu'à aller cliquer sur le fichier Question.xls (ouvert) pour faire ce lien sans le taper.. (dans la partie "Table_array" 2em TextBox)

Désolé suis tjrs en XL US ici.

J'espère avoir été suffisamment clair et que tu as pu me comprendre ?
Bon Travail
@+Thierry
 
Salut Thierry et Ti.
Pour Thierry, j'essaie d'appliquer la solution la plus simple possible et qui fonctionne, étant complètement novice en vb et macro et n' ayant jamais bcp utilisé excel auparavant, j'ai parfois du mal mais j'aime apprendre.
Pour Ti, j'essaie de comprendre ton code ( et c'est pas évident ;-)). et je reviens.
Merci.
 
Me (re)voilà.
J'ai regardé ton code Ti, vraiment super, même si j'ai pas tt compris.
Par contre, comment imbriquer mes with?
J'ai la première série de question, mais quel est la syntaxe pour faire suivre
les instructions with?


Sub NumeroAleatoire()
Dim Numeros()
' renvoie 5 valeurs pour la série 1
'Numeros = ValeursAleatoires(1, 10, 5)
'pour la série 2
'Numeros = ValeursAleatoires(11, 20, 5)
'pour la série 3
'Numeros = ValeursAleatoires(21, 30, 5)
'pour la série 4

Numeros = ValeursAleatoires(1, 10, 5)

With Worksheets("sheet1")
.Range("B7").Value = Numeros(1)
.Range("B9").Value = Numeros(2)
.Range("B11").Value = Numeros(3)
.Range("B13").Value = Numeros(4)
.Range("B15").Value = Numeros(5)
End With



End Sub

encore merci.
 
je ne sais pas si j'ai bien compris ce que tu veux, je suppose que tu veux envoyer successivement la série 1, puis la 2 etc.
Voici un code pour faire ça. Evidemment entre chaque série, il faudrait alors rajouter des lignes pour gérer les réponses.

Sub EcritValeurs(PNumeros())
Dim Boucle
For Boucle = 1 To UBound(PNumeros)
With Worksheets("sheet1")
.Range("B" & 5 + 2 * Boucle).Value = PNumeros(Boucle)
End With
Next Boucle
End Sub

Sub NumeroAleatoire()
Dim Numeros()
' renvoie 5 valeurs pour la série 1
'Numeros = ValeursAleatoires(1, 10, 5)
'EcritValeurs Numeros

'pour la série 2
'Numeros = ValeursAleatoires(11, 20, 5)
'EcritValeurs Numeros

'pour la série 3
'Numeros = ValeursAleatoires(21, 30, 5)
'EcritValeurs Numeros

'pour la série 4
Numeros = ValeursAleatoires(31, 40, 5)
EcritValeurs Numeros
End Sub
 
En fait, il s'agit d'envoyer chaque question dans chaques partie de la feuille (5 questions aléatoires de série question1 dans nettoyage sécurité de sheet1, 5 questions aléatoires de série question2 dans vérification équipement etc...
(voir fichier joint)
Chaque block a une série de question qui lui correspond.
Voilà
ça marche pour la 1 ère série de question de la partie "nettoyage" mais comment faire pour le reste, avec l'instruction with?
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
5
Affichages
217
Réponses
9
Affichages
367
  • Question Question
Microsoft 365 Code VBA
Réponses
10
Affichages
773
Retour