Menus en cascades contenus dans Excel et affichés sous Word

océanne

XLDnaute Occasionnel
Bonsoir le forum,

Après avoir consulté différents forums Excel et Word, je me décide à vous soumettre mon souci de ces dernières semaines sur lequel je cale totalement.

J'ai un classeur Excel 2007 dans lequel j'ai une base de donnée avec 4 colonnes (dans mon exemple j'ai juste mis un échantillon de A1 à D21)
Dans la même feuille que la BDD, j'obtiens par un USF et 4 menus en cascades dans les cellules H2 à K2 les sélections de mon choix.

Mon souci, c'est que je souhaiterais pouvoir piloter l'USF à partir de Word. En d'autres termes pouvoir à partir d'un document Word (qui serait une lettre type) activer d'une manière ou d'une autre les menus en cascades précités pour faire apparaitre la sélection dans mon document Word.

Si je n'ai pas été assez claire, et afin que vous puissiez vous faire une idée plus précise de mes attentes, je vous joins mon Excel ainsi que ma lettre type Word (en .zip)

Merci d'avance à celui ou celle qui pourra me mettre sur la voie.

O.
 

Pièces jointes

  • Menus déroulants 4 niveaux .xlsm
    28.1 KB · Affichages: 34
  • Doc Word pour liens BDD Excel.zip
    38.2 KB · Affichages: 21

océanne

XLDnaute Occasionnel
Re : Menus en cascades contenus dans Excel et affichés sous Word

Bonjour Tatiak

Je suis soufflée par tes deux propositions.
Merci beaucoup, c'est exactement ce que je visais, je vais tout d'abord essayer de comprendre, puis transposer l'exercice sur mes vraies données.
(l'option sans USF me convient encore mieux)
Je te remercie à nouveau pour ton investissement et j'espère que que cet échange pourra profiter à d'autres.

Très cordialement

O.
 

océanne

XLDnaute Occasionnel
Re : Menus en cascades contenus dans Excel et affichés sous Word

Bonsoir le Forum, bonsoir Tatiak

J'ai comme prévu essayé dès ce soir la transposition à mes données réelles.
ça c'est pas mal passé, à deux exceptions près :

J'ai changé mes étiquettes de colonnes dans ma base de donnée excel, comme ceci :

Métiers Domaines Sous_Domaines Activités Savoirs_SF

J'ai ajouté une cinquième colonne et par conséquent une 5eme combobox dans mon document Word.

Sous Word, j'ai modifié les deux scripts comme ceci :

Pour le Script "ThisDocument"

Option Explicit


Private Sub Document_Open()
Dim lig As Integer, i As Integer

With ActiveDocument
lig = Get_List_Métiers
If lig > 0 Then
For i = 0 To lig - 1
.ComboBox1.AddItem RcdSt(0, i)
Next i
.ComboBox1.ListIndex = -1
.ComboBox2.Clear
.ComboBox2.ListIndex = -1
.ComboBox3.Clear
.ComboBox3.ListIndex = -1
.ComboBox4.Clear
.ComboBox4.ListIndex = -1
.ComboBox5.Clear
.ComboBox5.ListIndex = -1
End If
End With
End Sub


Private Sub ComboBox1_Change()
Dim lig As Integer, i As Integer

With ActiveDocument
.ComboBox2.Clear
lig = Get_List_Domaines(.ComboBox1.Value)
If lig > 0 Then
For i = 0 To lig - 1
.ComboBox2.AddItem RcdSt(0, i)
Next i
.ComboBox2.ListIndex = -1
.ComboBox3.Clear
.ComboBox3.ListIndex = -1
.ComboBox4.Clear
.ComboBox4.ListIndex = -1
.ComboBox5.Clear
.ComboBox5.ListIndex = -1
End If
End With
End Sub


Private Sub ComboBox2_Change()
Dim lig As Integer, i As Integer

With ActiveDocument
.ComboBox3.Clear
lig = Get_List_Sous_Domaines(.ComboBox1.Value, .ComboBox2.Value)
If lig > 0 Then
For i = 0 To lig - 1
.ComboBox3.AddItem RcdSt(0, i)
Next i
.ComboBox3.ListIndex = -1
.ComboBox4.Clear
.ComboBox4.ListIndex = -1
.ComboBox5.Clear
.ComboBox5.ListIndex = -1
End If
End With
End Sub


Private Sub ComboBox3_Change()
Dim lig As Integer, i As Integer

With ActiveDocument
.ComboBox4.Clear
lig = Get_List_Activités(.ComboBox1.Value, .ComboBox2.Value, .ComboBox3.Value)
If lig > 0 Then
For i = 0 To lig - 1
.ComboBox4.AddItem RcdSt(0, i)
Next i
.ComboBox4.ListIndex = -1
.ComboBox5.Clear
.ComboBox5.ListIndex = -1
End If
End With
End Sub

Private Sub ComboBox4_Change()
Dim lig As Integer, i As Integer

With ActiveDocument
.ComboBox5.Clear
lig = Get_List_Savoirs_SF(.ComboBox1.Value, .ComboBox2.Value, .ComboBox3.Value, .ComboBox4.Value)
If lig > 0 Then
For i = 0 To lig - 1
.ComboBox5.AddItem RcdSt(0, i)
Next i
.ComboBox5.ListIndex = -1
End If
End With
End Sub


Pour le script "SQL"

Option Explicit

Public Const adOpenStatic = 3
Public Const adStateOpen = 1

Public Head() As Variant
Public RcdSt() As Variant

' Fichier données
Public Const NDF = "BDD.xlsx"
Public Const Data = "BD"


' ***** REQUETES **********************************************************************************
Function Get_List_Métiers() As Integer
Dim Requete As String

Requete = "SELECT Métiers FROM [" & Data & "$] GROUP BY Métiers ORDER BY Métiers"

Get_List_Métiers = SQL.Query(Requete, ActiveDocument.Path & "\" & NDF)

End Function


Function Get_List_Domaines(Métiers As String) As Integer
Dim Requete As String

Requete = "SELECT Domaines FROM [" & Data & "$] " & _
" WHERE Métiers='" & Métiers & "'" & _
" GROUP BY Domaines ORDER BY Domaines"

Get_List_Domaines = SQL.Query(Requete, ActiveDocument.Path & "\" & NDF)

End Function


Function Get_List_Sous_Domaines(Métiers As String, Domaines As String) As Integer
Dim Requete As String

Requete = "SELECT Sous_Domaines FROM [" & Data & "$] " & _
" WHERE Métiers='" & Métiers & "'" & _
" AND Domaines='" & Domaines & "'" & _
" GROUP BY Sous_Domaines ORDER BY Sous_Domaines"

Get_List_Sous_Domaines = SQL.Query(Requete, ActiveDocument.Path & "\" & NDF)

End Function


Function Get_List_Activités(Métiers As String, Domaines As String, Sous_Domaines As String) As Integer
Dim Requete As String

Requete = "SELECT Activités FROM [" & Data & "$] " & _
" WHERE Métiers='" & Métiers & "'" & _
" AND Domaines='" & Domaines & "'" & _
" AND Sous_Domaines='" & Sous_Domaines & "'" & _
" GROUP BY Activités ORDER BY Activités"

Get_List_Activités = SQL.Query(Requete, ActiveDocument.Path & "\" & NDF)

End Function

Function Get_List_Savoirs_SF(Métiers As String, Domaines As String, Sous_Domaines As String, Activités As String) As Integer
Dim Requete As String

Requete = "SELECT Savoirs_SF FROM [" & Data & "$] " & _
" WHERE Métiers='" & Métiers & "'" & _
" AND Domaines='" & Domaines & "'" & _
" AND Sous_Domaines='" & Sous_Domaines & "'" & _
" AND Activités='" & Activités & "'" & _
" GROUP BY Savoirs_SF ORDER BY Savoirs_SF"

Get_List_Savoirs_SF = SQL.Query(Requete, ActiveDocument.Path & "\" & NDF)

End Function


' ***** REQUETEUR SQL *****************************************************************************
Function Query(Requete As String, NDF_Data As String) As Variant
Dim Cnx As Object ' ADODB.Connection
Dim Rst As Object ' ADODB.Recordset
Dim Col_SQL As Integer, i As Integer

On Error GoTo errhdlr
Set Cnx = CreateObject("ADODB.Connection") ' = New ADODB.Connection
With Cnx
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DBQ=" & NDF_Data & "; ReadOnly=False"
.Open
End With
Set Rst = CreateObject("ADODB.Recordset") ' = New ADODB.Recordset

If Left(Requete, 6) = "SELECT" Then
Rst.Open Requete, Cnx, adOpenStatic
Query = Rst.RecordCount
Col_SQL = Rst.Fields.Count - 1
If Not Query = 0 Then
ReDim Head(Col_SQL)
For i = 0 To Col_SQL
Head(i) = Rst.Fields(i).Name
Next i
ReDim RcdSt(Col_SQL, Query)
Rst.MoveFirst
RcdSt = Rst.GetRows
End If
Else
Query = 1
Set Rst = Cnx.Execute(Requete)
End If

Cnx.Close
Set Cnx = Nothing
Set Rst = Nothing
Exit Function

errhdlr:
If Not Rst Is Nothing Then
If Rst.State = adStateOpen Then Rst.Close
End If
Set Rst = Nothing

If Not Cnx Is Nothing Then
If Cnx.State = adStateOpen Then Cnx.Close
End If
Set Cnx = Nothing

MsgBox (Err.Description & vbCrLf & vbCrLf & "Vérifier la requête (ou son appel) : " & vbCrLf & Requete)
End Function


Résultats :
- La 5eme combobox n'est jamais alimentée
- D'autre part, lors de certaines selections (j'ai refait le tests à plusieurs reprises sur les mêmes données) une des combobox n'est pas alimentée (ça peut être la 2 ou la 3) et le message suivant m'est retourné : Pilote ODBC Excel Erreur de syntaxe (opérateur absent) dans l'expression ....Vérifier la requete (ou son appel) .....
Ma BDD comporte plus de 5000 lignes, ceci explique-t-il cela ?

Je n'ai volontairement pas remis la BDD en P.J. pour cause de confidentialité, si ceci s'avérait nécessaire, je pourrais en mettre un nouvel échantillon maquillé.

Merci à nouveau pour ton aide précieuse et très bonne soirée à tous.
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Menus en cascades contenus dans Excel et affichés sous Word

Bonsoir à tous,

Tu peux conserver les apostrophes, tatiak, en SQL il suffit de les doubler

par exemple

Code:
    Requete = "SELECT Domaines FROM [" & Data & "$] " & _              
" WHERE Métiers='" & Replace(Métiers, "'", "''") & "'" & _
              " GROUP BY Domaines ORDER BY Domaines"
 

océanne

XLDnaute Occasionnel
Re : Menus en cascades contenus dans Excel et affichés sous Word

Tatiak encore une fois merci, tototiti ta précision me permettra de maintenir mes apostrophes dans mon fichier.

J'ai rencontré un dernier souci du fait que certains de mes items dépassent les 256 caractères....j'ai plafonné tous mes intitulés à 255 caractères max et tout semble fonctionner désormais.

Très bonnes vacances à vous deux.
 

océanne

XLDnaute Occasionnel
Re : Menus en cascades contenus dans Excel et affichés sous Word

Bonjour le Forum, bonjour Tototiti,

Je te remercie pour tes investigations complémentaires, mais comme stipulé dans mon dernier post, je me contenterai des libellés tronqués.

Par contre j'ai une dernière question qui porte plus sur les 5 combobox, contenues dans le document Word
J'essaye de récupérer les choix successifs de mon utilisateur pour les stocker dans un tableau positionné sous les menus déroulants...mais là aussi je coïnce.

J'ai essayé d'agréger plusieurs morceaux de code sans succès

ActiveDocument.Variables("MonChamp").Value = ComboBox1.Value
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.Text = MonChamp


Je joins mon document Word (dans lequel j'ai Esquissé le besoin) sans la BDD excel cette fois-ci que l'on retrouve plus haut dans nos échanges, si l'un d'entre vous à une idée de la boucle.

Merci d'avance

Océanne.
 

Pièces jointes

  • Complément récupération des valeurs Combobox.zip
    32.7 KB · Affichages: 16
  • Complément récupération des valeurs Combobox.zip
    32.7 KB · Affichages: 15
  • Complément récupération des valeurs Combobox.zip
    32.7 KB · Affichages: 21

océanne

XLDnaute Occasionnel
Re : Menus en cascades contenus dans Excel et affichés sous Word

Bonjour Tototiti,
Tu dois mettre un guetteur derrière ton PC pour être aussi réactif ?
Oh oui sous Excel ça aurait été beaucoup plus simple et je ne vous aurais pas dérangé....le souci c'est que ces éléments ne représentent qu'une partie de composants d'un document ....Word que je pourrai définir comme une "lettre type" ou un formulaire. (mais pas au sens USF) et ce document sera mis à disposition de nombreux utilisateurs.

Le fait que tu me dises que c'est probablement possible me rassure, je vais poursuivre mes recherches.
O.
 

tototiti2008

XLDnaute Barbatruc
Re : Menus en cascades contenus dans Excel et affichés sous Word

Re,

un essai
 

Pièces jointes

  • Complément récupération des valeurs Combobox.zip
    44.9 KB · Affichages: 17
  • Complément récupération des valeurs Combobox.zip
    44.9 KB · Affichages: 15
  • Complément récupération des valeurs Combobox.zip
    44.9 KB · Affichages: 20

océanne

XLDnaute Occasionnel
Re : Menus en cascades contenus dans Excel et affichés sous Word

Merci Titiak et TotoTiti.
Vous en êtes presque décourageants de facilité !
Pour ce coup j'ai une préférence pour la proposition de Titiak, par laquelle les données ne sont redistribuées dans le tableau que lorsque l'utilisateur Valide par le CommandButton.
Quoi qu'il en soit vos deux proposition sont tout à fait opérationnelles.
Encore merci pour votre réactivité.
O.
 

Discussions similaires

Statistiques des forums

Discussions
312 083
Messages
2 085 185
Membres
102 808
dernier inscrit
guo