lien entre 2 classeurs

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.
 
T

Thierry

Guest
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
 
A

Aurelien

Guest
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 :)
 
A

Aurelien

Guest
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.
 
T

Thierry

Guest
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
 
A

Aurelien

Guest
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.
 
A

Aurelien

Guest
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.
 
T

Ti

Guest
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
 
A

Aurelien

Guest
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?
 
A

Aurelien

Guest
décidément...je suis fatigué aujourd'hui, voici le fichier joint
j'ai viré le command-button et les 2 dernières séries de question pour que ça fasse moins de 50 k.
La macro s'éxécute à l'ouverture.
 

Pièces jointes

  • ClasseurTi2.xls
    46 KB · Affichages: 82

Discussions similaires

  • Question
Microsoft 365 Code VBA
Réponses
10
Affichages
704

Membres actuellement en ligne

Statistiques des forums

Discussions
314 655
Messages
2 111 605
Membres
111 217
dernier inscrit
aladinkabeya2