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

VB.NET Discussion :

Problème avec variable objet non définie [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    instituteur
    Inscrit en
    Juillet 2018
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 615
    Par défaut Problème avec variable objet non définie
    Bonjour à vous
    [Un problème non solutionné est une question mal posée]

    je reviens encore sur une ancienne discussion qui malheureusement n'a pas eu de solution parce que j'avais mal posé la question.

    Lorsque pour convertir mon fichier word en pdf puis l’imprimer, je rencontre souvent une erreur qui me dit : La référence d'objet n'est pas définie à une instance d'un objet et le numéro de l'erreur se pointe à la ligne que j'ai marqué en rouge sur l'image. Mais lorsque je redémarre l’ordinateur, le problème ne se produit plus et je convertis puis imprime le fichier.
    S’il vous plaît aidez-moi car je ne veux pas redémarrer l'ordinateur à chaque fois que le problème survient.
    code
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    Private Sub Bt_Valider_Click(sender As Object, e As EventArgs) Handles Bt_Valider.Click
     
        'copie du fichier
        Nom = Me.Nom1.Text
        If n = 0 Or Me.Nom1.Text = "" Then MsgBox("Veuillez sélectionner l'enseignant en question", vbExclamation) : Exit Sub
        If MsgBox("Voulez-vous enregistrer la demande de " & Me.Nom1.Text & " " & Me.Prenoms1.Text & " ?", vbQuestion + vbYesNo) <> vbYes Then Exit Sub
        SourceFichier = DestFichiers & "\Fichiers GestRH\Fichiers\Docs\Poste.docx" 'copie de l'attestation de presence de poste au poste
        DestinationFichier = DestFichiers & "\Fichiers GestRH\Fichiers\Attestation\AttestationDe" & Nom & ".docx"
     
        If My.Computer.FileSystem.FileExists(SourceFichier) Then My.Computer.FileSystem.CopyFile(SourceFichier, DestinationFichier, True)
        'Recherche et remplacement des valeurs
     
        L_Message.Text = "Extraction des données en cours..."
        Try
            Dim Docw As Object = New Word.Application
            Docw = CreateObject("Word.Application")
            Dim WordDoc As Object = New Word.Document
            WordDoc = CreateObject("Word.Document")
            WordDoc = Docw.Documents.Open(DestinationFichier)
            L_Message.Text = "Début de traitement des données en cours..."
     
            'information sur l'iepp
            With WordDoc.Content.Find 'civilité iepp
                .ClearFormatting()
                .Text = "civiliteiepp"
                .Replacement.ClearFormatting()
                .Replacement.Text = Strings.StrConv(CivilitéIEPP, VbStrConv.ProperCase)
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Civilité modifié avec succès..."
            With WordDoc.Content.Find 'nom iepp
                .ClearFormatting()
                .Text = "nomiepp"
                .Replacement.ClearFormatting()
                .Replacement.Text = NomIEPP
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Nom de IEPP modifié avec succès..."
            With WordDoc.Content.Find 'nom iepp
                .ClearFormatting()
                .Text = "fonctioniepp"
                .Replacement.ClearFormatting()
                .Replacement.Text = FctionIEPP
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ fonction de l'iepp modifié avec succès..."
            With WordDoc.Content.Find 'matricule iepp
                .ClearFormatting()
                .Text = "matriculeiepp"
                .Replacement.ClearFormatting()
                .Replacement.Text = MatriculeIEPP
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Matricule IEPP modifié avec succès..."
            ''information sur l'enseignant
            With WordDoc.Content.Find 'nom enseignant
                .ClearFormatting()
                .Text = "nom1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.Nom1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Nom enseignant modifié avec succès..."
            With WordDoc.Content.Find 'prenoms enseignant
                .ClearFormatting()
                .Text = "prenoms1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.Prenoms1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Prénoms enseignant modifié avec succès..."
            With WordDoc.Content.Find 'matricule enseignant
                .ClearFormatting()
                .Text = "matricule1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.Matricule1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Matricule Enseignant modifié avec succès..."
            With WordDoc.Content.Find 'emploi enseignant
                .ClearFormatting()
                .Text = "emploi1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.Emploi1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Emploi modifié avec succès..."
            With WordDoc.Content.Find 'emploi enseignant
                .ClearFormatting()
                .Text = "fonction1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.Fonction1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Fonction modifié avec succès..."
            With WordDoc.Content.Find 'emploi enseignant
                .ClearFormatting()
                .Text = "civilite1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.Civilite1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Civilité modifié avec succès..."
            With WordDoc.Content.Find 'ecole enseignant
                .ClearFormatting()
                .Text = "ecole1"
                .Replacement.ClearFormatting()
                If Me.Op_Admin.Checked = True Then .Replacement.Text = "IEPP MANKONO"
                If Me.Op_Craie.Checked = True Then .Replacement.Text = Me.Ecole1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Service modifié avec succès..."
            With WordDoc.Content.Find 'date entrée en iepp enseignant
                .ClearFormatting()
                .Text = "dateiepp1"
                .Replacement.ClearFormatting()
                .Replacement.Text = Me.DateIEPP1.Text
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            'les date du document
            With WordDoc.Content.Find 'Année du document
                .ClearFormatting()
                .Text = "annee1"
                .Replacement.ClearFormatting()
                Dim DDate As String = Strings.Format(Now, "yyyy")
                .Replacement.Text = DDate
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            With WordDoc.Content.Find 'Année scolaire
                .ClearFormatting()
                .Text = "annee2"
                .Replacement.ClearFormatting()
                .Replacement.Text = AnnScolaire
                .Execute(Replace:=Word.WdReplace.wdReplaceAll, Forward:=True, Wrap:=Word.WdFindWrap.wdFindContinue)
            End With
            L_Message.Text = "Champ Date modifié avec succès..."
            L_Message.Text = "Finalisation du processus pour la conversion du fichier en PDF... "
            'Conversion en PDF
            Complémentaire.ConvertionPDF(Docw, DestinationFichier)
            'Call ImprimerPDF(DestinationFichier, 2)
     
            L_Message.Text = ""
            n = 0
            Call Me.ViderChamp()
        Catch ex As Exception
            Dim rien = ex.Message()
        MsgBox("Veuillez redémarrer votre appareil. Une erreur non gérée a été repertoriée", vbExclamation)
        End Try
    End Sub
    Nom : vbnet1.jpg
Affichages : 175
Taille : 134,6 Ko

    j'utilise VS 2022
    Merci
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 726
    Par défaut
    Bonjour,

    Tu devrais être logique.
    S'il te dit qu'il n'existe pas, il faut chercher pourquoi.
    Ici, tu crées une instance en ouvrant un fichier destination.
    Mais est-ce que ce fichier est OK ?
    Si le fichier source existe, tu tentes de le copier sur le fichier destination, mais sans tester que le résultat est OK. Tu ne te poses pas la question, et tu exécutes le code...
    Moi je chercherais à ce niveau.
    Ensuite, que fais-tu dans ta routine de conversion PDF ? C'est peut-être là que se situe le problème à l'origine. Si tu verrouilles le fichier destination, il n'est peut-être plus utilisable.

  3. #3
    Membre éclairé
    Homme Profil pro
    instituteur
    Inscrit en
    Juillet 2018
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 615
    Par défaut
    Merci pour l'intervention
    Je vérifie bien l'existence du fichier avec la condition if avant d'initialiser les variables. Si le fichier n'existe pas alors pas de traitement.
    Le problème est pourquoi quand l'erreur survient et que je redémarre le pc, la même instruction s'exécute sans problème jusqu'à la conversation du fichier ? C'est la question première sinon j'ai essayé de récupérer le nom du fichier copié dans un message box pour voir réellement si le nouveau fichier existe et le résultat est ok. Le fichier existe bel et bien dans le dossier destination finale.
    Concernant la routine de la conversion, c'est le principe standard de conversion que j'ai utilisé.

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 726
    Par défaut
    Non tu ne vérifies pas la copie.
    Tu vérifies l'existence du fichier source, ce qui est totalement différent !

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 503
    Par défaut
    les lignes 15 et 16 (ainsi que 17 et 18) font la même chose (l'une en early binding, l'autre en late binding) donc choisit l'une au l'autre des façons (ici la seconde façon écrase la 1ère façon)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim Docw As Word.Application = New Word.Application
            Dim WordDoc As Word.Document
            WordDoc = Docw.Documents.Open(DestinationFichier)
    Il y a ensuite possiblement un problème de fermeture et du document et de l'application.
    Il faudrait voir si à l'issue de l'exécution de ton programme, il ne reste pas un WinWord.exe ouvert/présent dans ton gestionnaire des tâches (éventuellement onglet Détails pour être certain)
    à un moment du code, on devrait trouver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        WordDoc.Close(..) 'voir les éventuels paramètres à lui passer
        Docw.Quit(...) ' voir éventuellement aussi les paramètres à lui passer
        'optionnellement, pour libérer les ressources
        WordDoc.Dispose()
        Docw.Dispose()
    Sinon l'erreur doit se produire parce qu'il n'a pas réussi à ouvrir le fichier passé en paramètre (éventuellement parce qu'il est déjà ouvert dans une autre session Word active (cf mes remarques du dessus).

    Et donc ça fonctionne au redémarrage parce qu'il n'y a plus de session Word ouverte au démarrage, une fois le code exécuté une fois (et également si tu l'interrompt en cours de route), il faut penser à tuer les processus WinWord.exe existant pour bien repartir de 0.

  6. #6
    Membre éclairé
    Homme Profil pro
    instituteur
    Inscrit en
    Juillet 2018
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 615
    Par défaut
    Merci à vous deux... Je teste en suivant vos propositions et je vous reviendrai.
    Pour le gestionnaire des tâches j'ai remarqué qu'il y a une prolifération de Word malgré que j'ai fait DocsWd.close.

    Donc à toute de suite pour les remarques 🙏

  7. #7
    Membre éclairé
    Homme Profil pro
    instituteur
    Inscrit en
    Juillet 2018
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 615
    Par défaut Référence d'objet non défini à une instance d'un objet
    Bonjour et je reviens pour clôturer la discussion. J'ai testé toutes vos recommandations le problème a continué à persister. Mais la réponse de M4k a tiré mon attention sur un fait lorsque j'appelle l'objet document. L'application ouvre word mais ne charge pas le fichier.
    En interrogeant l'IA comment utiliser modifier un document word qui a été ouvert avec open.file, j'ai eu cette réponse
    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
     
    Imports System.IO
    Imports Microsoft.Office.Interop.Word
     
    Module Module1
        Sub Main()
            ' Chemin vers le fichier Word
            Dim filePath As String = "C:\chemin\vers\votre\document.docx"
            Dim pdfPath As String = "C:\chemin\vers\votre\document.pdf"
     
            ' Ouvrir le fichier en mode lecture/écriture
            Using fs As FileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite)
                ' Créer une nouvelle instance de l'application Word
                Dim wordApp As New Application()
                wordApp.Visible = False
     
                ' Ouvrir le document Word
                Dim doc As Document = wordApp.Documents.Open(filePath)
     
                ' Modifier le contenu du document
                With doc.Content.Find
                    .Text = "TexteÀRemplacer"
                    .Replacement.Text = "NouveauTexte"
                    .Execute(Replace:=WdReplace.wdReplaceAll)
                End With
     
                ' Sauvegarder le document
                doc.Save()
     
                ' Convertir le document en PDF
                doc.ExportAsFixedFormat(pdfPath, WdExportFormat.wdExportFormatPDF)
     
                ' Fermer le document et l'application Word
                doc.Close()
                wordApp.Quit()
            End Using
     
            Console.WriteLine("Le document a été modifié et converti en PDF avec succès.")
        End Sub
    End Module
    C'est par cette méthode que j'ai su qu'il y avait un problème qui était lié à mon dossier qui se situait dans le One drive. Lorsque je travaille avec la connexion, le problème ne survient plus mais hors connexion, il y a problème.
    J'ai donc déplacé le dossier qui reçoit le fichier copié dans l'un de mes disques et le problème s'est résolu.

    Vraiment j'ai galéré pendant des mois alors que la solution était de déplacer le dossier qui était dans une drive vers l'un des discs.

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

Discussions similaires

  1. Variable objet non définie avec utilisation outlook
    Par C'estPasMoi dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/07/2014, 16h57
  2. Renvoi d'erreur Variable Objet non définie
    Par ADbtr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/06/2010, 14h16
  3. Erreur 91 variable objet non définie
    Par kmarcel dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2008, 13h17
  4. Erreur 91 variable objet non défini
    Par sebeni dans le forum Général VBA
    Réponses: 3
    Dernier message: 07/05/2007, 11h12
  5. Réponses: 4
    Dernier message: 16/06/2006, 00h27

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