IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

problème recupération valeur signet Word [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : autre
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 2
    Points
    2
    Par défaut problème recupération valeur signet Word
    Bonjour,

    j'ai un problème que je n'arrive pas à résoudre (avec Office 2003)
    Je voudrais copier/coller des numéros de factures qui sont dans des zones de textes dans des documents Word.
    ces numéros ont été créés par l'intermédiaire d'un signet sous la forme "171101"

    Par VBA Excel ou Word, j'arrive à ouvrir le document, à le rendre visible et au 1er plan (je sais que ce n'est pas nécessaire mais c'est pour voir ce qui se passe)
    j'arrive aussi à positionner le curseur sur le signet, j'arrive même à écrire quelque chose (par exemple "test" > ça donne test171101) mais impossible de récupérer le n° de facture

    en VBA Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set ouvreword = CreateObject("word.application")
    Set doc = ouvreword.documents.Open(nomentier) 'nom du document
    doc.Application.Visible = True 'facultatif
    doc.Activate 'facultatif
    recup = doc.Bookmarks("numero").Range.Select 'positionne le curseur
    recup = doc.Bookmarks("numero").Range.Text 'renvoie une chaine vide ("")
    doc.Bookmarks("numero").Range.Text = "test" 'donne "test171101" sur le signet donc ne remplace pas la valeur précédente
    en VBA Word, je peux utiliser Selection mais ça ne change rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    doc.Activate
    recup = doc.Bookmarks("numero").Range.Select ' positionne le curseur sur le signet (au début !)
    ActiveDocument.ActiveWindow.Selection.MoveRight Unit:=wdCharacter, Count:=6, Extend:=wdExtend 'selectionne du texte sur le document ou est la macro mais pas sur la facture
    j'ai essayé de mettre la macro sur un normal.dot : ça ne change rien !
    il semble qu'il y ait 2 problèmes
    1 - la macro n'est pas sur le document ou s'effectue la recherche
    2 - le curseur se positionne "au début" du signet et c'est pour ça qu'il renvoie une chaine vide

    j'ai près de 3000 numéros de factures à récupérer et j'espérais automatiser l'affaire
    quelqu'un pour m'aider ? merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par je_galere Voir le message
    Bonjour,

    Une piste avec ce code à adapter. Le principe est de charger une matrice de vos signets de position et de récupérer le numéro de la facture toujours dans la matrice. Vous aurez sans doute à référencer Word, car les variables sont typées Word. La matrice peut être remplacée par un objet Range. Le code fonctionne sur un document Word, pas testé à partir d'Excel.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Option Explicit
     
    Public MesFactures() As Variant
     
    Function RecupererLeNumeroDeFacture(ByVal DocEnCours As Word.Document, ByVal NomDuSignet As Word.Bookmark) As String
     
    Dim MonRange As Word.Range
    Dim MaSelection As Word.Selection
    Dim DebutFacture As Long, FinFacture As Long
     
            NomDuSignet.Range.Select
            Set MaSelection = Selection
            With MaSelection
                 .HomeKey unit:=wdStory, Extend:=wdExtend
                 DebutFacture = .Characters.Count
                 FinFacture = DebutFacture + 6
                 Set MonRange = DocEnCours.Range(Start:=DebutFacture, End:=FinFacture)
                 RecupererLeNumeroDeFacture = MonRange.Text
                 Set MonRange = Nothing
            End With
            Set MaSelection = Nothing
            NomDuSignet.Range.Select
     
    End Function
     
    Sub TestRecupererLeNumeroDeFacture()
     
    Dim MesFactures As Variant
    Dim I As Long
     
        ReDim MesFactures(1, 1)
     
        For I = LBound(MesFactures, 1) To UBound(MesFactures)
            MesFactures(0, 0) = "MonSignet"
            MesFactures(1, 0) = "MonSignet2"
        Next I
     
        For I = LBound(MesFactures) To UBound(MesFactures)
            MesFactures(I, 1) = RecupererLeNumeroDeFacture(ActiveDocument, ActiveDocument.Bookmarks(MesFactures(I, 0)))
        Next I
     
        For I = LBound(MesFactures) To UBound(MesFactures)
            MsgBox MesFactures(I, 1)
        Next I
     
    End Sub

  3. #3
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : autre
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci pour la réponse et sa rapidité !
    je vais étudier ça en début de semaine prochaine (occupé ce WE) et je vous fais un retour
    si ça marche, je vous bénirai jusqu'à la fin des temps !

  4. #4
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : autre
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    bon j'ai un peu regardé et j'avoue que je ne comprends pas tout
    déja je ne comprends pas à quoi correspondent "MonSignet" et "MonSignet2" ? et par quoi je dois les remplacer si je dois le faire ?
    ensuite j'ai remplacé ActiveDocument par doc (qui renvoie au nom de chaque facture que j'ouvre), dans cette formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MesFactures(I, 1) = RecupererLeNumeroDeFacture(ActiveDocument, ActiveDocument.Bookmarks(MesFactures(I, 0)))
    sinon, ça cherche sur le document sur lequel je fais tourner la macro et non sur chaque facture, malgré mon instruction : doc.Activate
    enfin, arrivé à cette instruction (ligne 40), ça me renvoie : erreur 5941, le membre de la collection requis n'existe pas
    je pense que ça concerne justement "MonSignet" et "MonSignet2" ?

    je crois que je vais avoir besoin d''explications supplémentaires

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    je crois que je vais avoir besoin d''explications supplémentaires
    je crois quant à moi surtout que ta difficulté est une difficulté VBA/Word. Le fait de "piloter" Word depuis VBA/Excel n'a rien à voir avec la nécessité de savoir au moins traiter la difficulté en cause depuis VBA/Word même.
    Tu es ici dans la section VBA/EXCEL.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : autre
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par unparia Voir le message
    Tu es ici dans la section VBA/EXCEL.
    j'avais posté dans cette section parce qu'au départ je voulais faire une macro Excel, mais que j'étais prêt à la faire sous Word si ça marchait avec Word.
    Devais-je poster mon message 2 fois dans les 2 sections ?
    dois-je l'effacer et le reposter dans la section Word, ou tu me demanderas pourquoi j'y parle de macro Excel ?
    que veut dire le "au moins" de "n'a rien à voir avec la nécessité de savoir au moins traiter la difficulté" ? j'y sens une forme de mépris. Si j'étais à ton niveau de compétence, je n'aurais pas besoin d'aide.
    Merci pour l'accueil !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par je_galere Voir le message
    Un exemple dans les fichiers joints :

    Pièce jointe 330191

    Le fichier Excel contient deux modules permettant de :
    • Lister les documents Word d'un répertoire.
    • Récupérer le numéro de facture contenu dans un signet nommé "numero" ' A adapter


    Pour récupérer la liste des fichiers Word (suppose de n'avoir uniquement que des fichiers .docm ou .docx dans le répertoire).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Option Explicit
     
    ' Référencer la DLL Microsoft Word et la DLL Microsoft Scripting Runtime
     
    Public ShFactures As Worksheet
    Public RepertoireFactures As String
     
     
    Sub ListeDesFichiers(ByVal FeuilleCible As Worksheet, ByVal SpecDossier As String)
     
    Dim Fs, F, F1, Fc
    Dim LigneEnCours As Long
     
        With FeuilleCible
     
             LigneEnCours = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
     
             Set Fs = CreateObject("Scripting.FileSystemObject")
             Set F = Fs.getfolder(SpecDossier)
             Set Fc = F.Files
     
             For Each F1 In Fc
                 .Cells(LigneEnCours, 1) = F1.Name
                 .Cells(LigneEnCours, 2) = F1.DateCreated
                 LigneEnCours = LigneEnCours + 1
             Next
     
             Set Fc = Nothing
             Set F = Nothing
             Set Fs = Nothing
     
       End With
     
    End Sub
     
    Sub ListerLesFichiersFactures()
     
     
        Set ShFactures = Sheets("Liste des factures")
        With ShFactures
             RepertoireFactures = .Range("DossierFactures")
             ListeDesFichiers ShFactures, RepertoireFactures
        End With
        Set ShFactures = Nothing
     
    End Sub
    Pour récupérer les numéros de facture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    Option Explicit
     
    Function RecupererLeNumeroDeFacture(ByVal MonWord As Word.Application, ByVal DocEnCours As Word.Document, ByVal NomDuSignet As Word.Bookmark) As String
     
    Dim MonRange As Word.Range
    Dim MaSelection As Word.Selection
    Dim DebutFacture As Integer, FinFacture As Integer
    Dim MonSignet As Word.Bookmark
    Dim Continuer As Boolean
     
            Continuer = False
            For Each MonSignet In DocEnCours.Bookmarks
                If MonSignet.Name = NomDuSignet.Name Then Continuer = True
            Next MonSignet
     
            If Continuer = True Then
                NomDuSignet.Range.Select
                Set MaSelection = MonWord.Selection
                With MaSelection
                     .HomeKey unit:=wdStory, Extend:=wdExtend
                     DebutFacture = .Characters.Count
                     FinFacture = DebutFacture + 6
                     Set MonRange = DocEnCours.Range(Start:=DebutFacture, End:=FinFacture)
                     RecupererLeNumeroDeFacture = MonRange.Text
                     Set MonRange = Nothing
                End With
                Set MaSelection = Nothing
                NomDuSignet.Range.Select
            End If
     
    End Function
     
    Sub RecupererLesNumerosDeFacture()
     
    Dim MesFactures As Variant
    Dim I As Long, LigneDeTitre As Long, DerniereLigne As Long
     
    Dim AireFactures As Range, CelluleFacture As Range
     
    Dim WordApp As Word.Application
    Dim WordDoc As Word.Document
     
     
        Set ShFactures = Sheets("Liste des factures")
        With ShFactures
             RepertoireFactures = .Range("DossierFactures")
             LigneDeTitre = 10
             DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
             Set AireFactures = .Range(.Cells(LigneDeTitre + 1, 1), .Cells(DerniereLigne, 1))
        End With
     
        Set WordApp = CreateObject("word.application") 'ouvre session word et le fichier voulu
        WordApp.Visible = True 'word masqué pendant l'operation
     
        For Each CelluleFacture In AireFactures
     
            Set WordDoc = WordApp.Documents.Open(RepertoireFactures & "\" & CelluleFacture) 'ouvre document Word
            CelluleFacture.Offset(0, 2) = RecupererLeNumeroDeFacture(WordApp, WordDoc, WordDoc.Bookmarks("numero"))
            WordDoc.Close savechanges:=False
            Set WordDoc = Nothing
     
        Next CelluleFacture
     
        WordApp.Quit
     
        Set WordApp = Nothing
        Set AireFactures = Nothing
        Set ShFactures = Nothing
     
    End Sub

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    dois-je l'effacer et le reposter dans la section Word, ou tu me demanderas pourquoi j'y parle de macro Excel ?
    Pas du tout, car tu y poserais une difficulté rencontrée au sein même de Word, sans même dire où vont être utilisées ensuite les données extraites
    j'y sens une forme de mépris
    Non plus ! Simple invite à localiser la véritable difficulté (et elle est bel et bien une difficulté Word et non Excel)
    Si j'étais à ton niveau de compétence, je n'aurais pas besoin d'aide.
    Ce n'est nullement la "compétence", qui intervient dans ce choix, mais la seule "logique".

    Et cette logique est la même que celle exposée ici en matière de "pilotages" d'une application depuis une autre application :
    https://www.developpez.net/forums/d1...e-ecran-excel/
    Pour les mêmes raisons.

    EDIT : tu vas peut-être mieux comprendre avec cet exemple tout simple :

    - tu es en déplacement et donc éloigné du véhicule V, dont les bougies doivent être remplacées
    - tu as à cette fin envoyé à ton concierge un colis avec ces bougies. Mais lui, ne sait qu'en faire et attend tes instructions claires
    - Si tu ne sais pas toi-même quels gestes sont à faire à cette fin sur le véhicule, tu ne pourras certes pas "téléguider" ton concierge dans l'accomplissement de ces gestes !

    Il te faudra donc :
    1) t'informer toi-même, auprès d'un garagiste, des gestes que tu devrais faire si tu étais là où se trouve le véhicule
    2) seulement alors (une fois ces gestes connus de toi) : les dicter à ton concierge lointain pour qu'il les accomplisse

    Simple à comprendre, non ?

    Et pour que cet exemple soit plus "près" de ton cas :
    Imagine maintenant que tu veuilles que ton concierge t'envoie plutôt ces bougies afin de te permettre d'acheter les mêmes. Il faudra bien que tu lui expliques comment (gestes à faire là où il est) extraire ces fameuses bougies
    Et ce ne sera qu'ensuite (lorsque tu les auras reçues) que tu continueras la tienne, de démarche (l'achat de bougies identiques).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : autre
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    @ Eric KERGRESSE : merci pour votre aide et votre disponibilité. Je vais étudier votre code et vous faire un retour dans les prochains jours

  10. #10
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : autre
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Rebonjour,

    Bon j'ai finalement résolu mon problème d'une autre manière :
    constatant que mon VBA Excel ne voulait vraiment pas copier la valeur de mon signet et que par ailleurs il refusait de reconnaitre l'instruction word.Selection (j'avais pourtant référencé la Library correspondante) , je suis passé par la zone de texte, en récupérant son nom par l'enregistreur de macro.
    et là ça a marché sans problème.
    j'avais en plus cette contrainte : mes noms de factures commençaient comme ceux des devis mais il fallait retrouver leur nom complet
    ma macro ci dessous, j'ai conscience qu'elle n'est certainement pas optimisée et "académique" mais elle marche, et comme j'ai appris le VBA tout seul avec mes petits neurones, je me débrouille comme je peux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub affectenum_Click()
    chemin = "C:\\Factures archive"
    For Each cell In Range(Cells(1, 2), Cells(3154, 2))
    numdevis = cell.Value '= 1497 par exemple
    Set az = Application.FileSearch
    With az
           .LookIn = chemin
           .Filename = numdevis & "-*" & ".doc"
           If .Execute > 0 Then
           nomentier = az.FoundFiles(1) 'renvoie 1497-100318~40434 = NuméroUnique-DateDevis~DateFacture (format nombre Excel)
           Set ouvreword = CreateObject("word.application")
           Set doc = ouvreword.Documents.Open(nomentier)
           entiertexte = doc.Shapes("Text Box 12").TextFrame.TextRange 'renvoie FACTURE N°100901
           lenum = Mid(entiertexte, 12, 6) 'renvoie 100901
           doc.Close savechanges:=False
           Set doc = Nothing
           ouvreword.Quit
           Set ouvreword = Nothing
           End If
    End With
    cell.Offset(0, 1).Value = lenum
    Next
    End Sub
    je reviendrai mettre le sujet en Résolu dans quelques jours, au cas ou vous voudriez rajouter des commentaires

    Edit : et grand merci à Eric Kergresse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/03/2017, 09h44
  2. [WD-2003] Valeur excel vers signet word, chemin d'accès
    Par 8e8eClo dans le forum VBA Word
    Réponses: 2
    Dernier message: 10/08/2011, 12h53
  3. [WD-2000] recuperer valeur signet word
    Par ouflala dans le forum VBA Word
    Réponses: 1
    Dernier message: 07/05/2010, 21h19
  4. Récupération valeur signets Word depuis Excel
    Par scrouet dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/01/2009, 14h49
  5. [Word]Recuperer valeur Signet Word
    Par PhRey dans le forum VBA Word
    Réponses: 2
    Dernier message: 20/12/2006, 13h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo