Problème de récupération de données Excel depuis un Word

xUpsilon

XLDnaute Accro
Bonjour tout le monde,

Je souhaite actuellement créer un formulaire d'options pour la boite pour laquelle je bosse, et ce formulaire récupérerait les valeurs d'un configurateur excel déjà existant.
En gros, dans le Excel se trouve une feuille "Memory" sur laquelle sont stockées en physique les 1 ou 0 en fonction des options cochées dans les checkbox du configurateur.
Bref, ce que je souhaite faire, c'est depuis le Word appeler les valeurs des cases concernées dans ma feuille "Memory" pour remplir les checkbox correspondantes dans mon formulaire word.
J'ai donc fait ce petit bout de programme mais je tombe sur une erreur 91 "Variable objet ou variable de bloc With non définie". Même en essayant de passer par différentes méthodes je finis toujours pas retomber sur cette erreur, est-ce que qqun aurait une idée ?

Ci-dessous mon code :
VB:
Sub RécupérerDansExcel()
    Dim AppXL As Excel.Application
    AppXL.Visible = True
    Dim Classeur As Excel.Workbook
    Set Classeur = AppXL.ActiveWorkbook
    Dim LaFeuille As Excel.Worksheet
    Set LaFeuille = Classeur.Sheets("Memory")
    Dim LaVariableWord As Integer
    LaVariableWord = LaFeuille.Range("J10").Value
    MsgBox (LaVariableWord)
End Sub
 

xUpsilon

XLDnaute Accro
Tout fonctionne comme espéré !
Voici le code ci-dessous : En gros ce qu'il fait c'est qu'il prend chaque checkbox (format ActiveX, c'est important) dans mon word et, si dans ma feuille "Memory" de mon Workbook la valeur de Jx est "True", il coche la checkbox sur laquelle il est.
On va pas se mentir, pour mon fichier qui fait environ 70 checkbox, c'est un peu lourd comme boucle, mais au moins ça fonctionne !

VB:
Public AppXL As Excel.Application

Sub RécupérerDansExcel()
    Dim cellule, text1 As String
    Dim x As Integer
    
    Set AppXL = CreateObject("Excel.Application")
    AppXL.Visible = True
    AppXL.Workbooks.Open "V1_0.xlsm"
    x = 0
    For Each shapeLoop In ActiveDocument.InlineShapes
        x = x + 1
        text1 = AppXL.Range("Memory!J" & x).Value
        If text1 = "True" Then
            shapeLoop.OLEFormat.Object.Value = True
        End If
    Next
End Sub

Merci pour votre aide !
 

xUpsilon

XLDnaute Accro
Petit bonus, j'avais besoin dans mon programme d'utiliser les noms des Checkbox pour les relier correctement à la cellule attitrée de mon Excel. Sauf que la méthode montrée ci-dessus passe simplement de Checkbox en Checkbox en incrémentant x, ce qui permet de passer de ligne en ligne dans le Excel. Mais du coup si votre n-ième ligne Excel ne correspond pas à votre n-ième checkbox, vous êtes coincés.
J'ai donc trouvé une solution en exécutant ce code :
VB:
Public AppXL As Excel.Application

Sub RécupérerDansExcel()
    Dim text1, Nom As String
    Dim x As Integer
    
    Set AppXL = CreateObject("Excel.Application")
    AppXL.Visible = True
    AppXL.Workbooks.Open "V1_0.xlsm"
    x = 1
    For Each shapeLoop In ActiveDocument.InlineShapes
        Nom = shapeLoop.OLEFormat.Object.Name
        If Len(Nom) = 3 Then
            x = Right(Nom, 1)
        End If
        If Len(Nom) = 4 Then
            x = Right(Nom, 2)
        End If
        'x = x + 1
        text1 = AppXL.Range("Memory!J" & x).Value
        If text1 = "True" Then
            shapeLoop.OLEFormat.Object.Value = True
        End If
    Next
End Sub
 

xUpsilon

XLDnaute Accro
Re-bonjour,

Je reviens pour redemander de l'aide.

J'en suis au code suivant aujourd'hui :
VB:
Public AppXL As Excel.Application

Private Sub Document_Open()

    Dim text1, Nom As String
    Dim x As Integer
   
    Set AppXL = CreateObject("Excel.Application")
    AppXL.Visible = True
    AppXL.Workbooks.Open FileName:=ThisDocument.Path & "\V1_0.xlsm"
    x = 0
    For Each shapeLoop In ActiveDocument.Shapes
        Nom = shapeLoop.OLEFormat.Object.Name
        If Len(Nom) = 3 Then
            x = Right(Nom, 1)
        Else
            If Len(Nom) = 4 Then
                x = Right(Nom, 2)
            Else
                x = 100
            End If
        End If
        text1 = AppXL.Range("Memory!J" & x).Value
        If text1 = "True" Then
            shapeLoop.OLEFormat.Object.Value = True
        Else
            shapeLoop.OLEFormat.Object.Value = False
        End If
    Next

End Sub

Je voudrais faire plusieurs choses :
- déjà, quand j'exécute ce code, j'ai une erreur 91 qui apparait, mais le code s'exécute quand même, enfin mes checkbox se remplissent correctement et tout, mais j'ai quand même l'erreur ... C'est pas grave me direz vous, mais si ça l'est puisque c'est un fichier que j'enverrai à des clients, donc ça va leur faire bizarre si ils ont une erreur qui s'affichage en plein milieu de leur configuration de machine.
- deuxièmement, comme vous pouvez le voir au début de mon code, j'ouvre là un fichier excel avant de prendre ses valeurs. Sauf que dans la réalité le excel est déjà ouvert et c'est depuis ce excel que j'ouvre le word et que le code s'exécute (à l'ouverture du fichier word vous avez compris). Sauf que je sais pas comment faire pour ne pas rouvrir le Excel qui est déjà ouvert. J'ai essayé de remplacer mes lignes par un AppXL.Workbooks("V1_0.xlsm").Activate mais ça marche pas, il arrive pas à récupérer les valeurs du classeur Excel, comme si il le voyait pas ...

Merci d'avance !
 

xUpsilon

XLDnaute Accro
Justement, dans le Excel j'ouvre le Word, mais dans mon exécution de ma macro de Word, j'ai pas trouvé d'autre moyen pour faire tourner ma macro que de rouvrir l'excel, c'est bien pour ça que je demande de l'aide, je comprends pas comment faire pour ne pas avoir besoin de rouvrir ce fichier déjà ouvert.
 

xUpsilon

XLDnaute Accro
Re-re-bonjour,

Je suis toujours bloqué sur mon souci, sachant que je suis obligé d'avoir mon code dans Word puisque mon bouton d'actualisation se trouve sur mon document Word.
Je ne comprends pas pourquoi AppXL.Workbooks("MonFichier").Activate ne fonctionne pas (provoque une erreur 9, l'indice n'appartient pas à la sélection, alors que seul ce fichier excel là est ouvert).
(AppXL est ma variable Excel.Application)
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Peu importe où sont les boutons, ce sont les macros qui leur sont affectées qui doivent être coté Excel.
Vous vous trompez, il n'est pas ouvert par votre application mais par une autre. Le seul autre moyen serait de récupérer l'application Excel qui gère le classeur ouvert au lieu d'en créer une. Mais je n'y connais rien aux macros Word.
Et puis d'abord pourquoi avez vous des boutons dans un document Word ? Je ne comprend rien à votre système. Vous ne pourriez pas joindre des fichiers, qu'on y voie plus clair sur ce que vous voulez faire ?
 
Dernière édition:

xUpsilon

XLDnaute Accro
J'ai fini par m'en sortir, merci pour l'aide malgré tout !
Il s'agit en gros d'un configurateur et d'un word avec des checkbox qui se remplit en fonction des valeurs stockées dans le configurateur word. Et je voulais actualiser les valeurs du Word au clic d'un bouton situé sur le Word.
Au final j'ai contourné le problème en appelant tout depuis le excel et en forçant la fermeture de l'ancien Word et en le réouvrant avec les nouvelles valeurs pour actualiser, plutôt que de reboucler sur le fichier déjà ouvert (VBA Word est un enfer à manipuler).
 

Dranreb

XLDnaute Barbatruc
VBA Word est un enfer à manipuler
Ça je le savais. Je savais notemment qu'il pousse à une mauvaise habitude, transposé à Excel, en obligeant à définir l'objet Application de Word. Mais les souvenir de cette aberration sont devenus vagues pour moi.
La seule chose qui peut vaguement ressembler à ça coté Excel c'est, si on veut prendre en charge des évènements au niveau application par des procédures Private Sub AppXl_ÉvènementGlobalAuNiveauExcel(… Mais on ne lance pas une nouvelle appli Excel pour autant: on en prend l'exemplaire qui bosse déjà: Private WithEvents AppXl As Application … Set AppXl = Application, C'est tout.
Mais vous pouvez toujours, à tout hasard joindre un xlsm et un document Word (quitte à le zipper) pour que je voie s'il y a moyen d'eviter plusieurs réouvertures du document Word. Vous m'aviez dit que vous l'ouvriez dans Excel. C'est bon, ça suffit, il n'y a pas à le fermer et réouvrir 36 fois après ça !
 
Dernière édition:

Discussions similaires