Erreur d'éxécution 5941 VBA

pero -  
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
j'ai créé une macro :
Sub transfert()
Dim Fich As Worksheet
Set Fich = ThisWorkbook.Worksheets("formulaire")
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = Array("nom", "prenom", "nom_jeune_fille", "sexe_M", "sexe_F", "lieu_naissance")

nb_Champs = 6
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = Variables(i)
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire admission.doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = FichierWord.activedocument.formfields(Variables(i)).result
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub

lorsque je la lance j'obtins un msg d'erreur : erreur d'éxécution 5941 : erreur définie par l'application ou par l'objet

Qu'est-ce que ça veut dire??!!

Merci pour vos réponses

14 réponses

melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

Sub transfert()
dim a as string
Dim Fich As string
Fich = "formulaire"
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = "nom" & "prenom" & "nom_jeune_fille" & "sexe_M" & "sexe_F" & "lieu_naissance"

nb_Champs = 6
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
if sheets(Fich).Cells(num_row, i + 1) = Variables then
z= sheets(Fich).Cells(num_row, i + 1)
end if
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire admission.doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
sheets(fich).Cells(num_row, i + 1) = FichierWord.activedocument.formfields(z)
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub
1
pero
 
j'ai à nouveau le msg d'erreur suivant :
erreur d'éxécution '5941'
erreur définie par l'application ou par l'objet
0
pero > pero
 
l'erreur se situe entre les deux lignes suivantes (31 et 32) :

Sheets(Fich).Cells(num_row, i + 1) = FichierWord.activedocument.formfields(z)
Next i

Je ne vois pas qu'est-ce qui lui pose problème!

Merci de ton aide!!
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Bonjour,

Lorsque tu as ce message, tu cliques sur déboggage, sur quelle ligne se positionne t il?
0
pero
 
il ne me dit pas à quelle ligne ça bloque. Quand je fais débogage pas à pas il s'arrête dès la première ligne
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

Je t'ai modifié ta macro en ayant ton word ou ton excel à coté pour voir ce que ca fait mais je ne sais pas si ca vamarché.
Fais ton code par F

Sub transfert()
dim a as string
Dim Fich As Worksheet
Set Fich = ThisWorkbook.Worksheets("formulaire")
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = "nom" & "prenom" & "nom_jeune_fille" & "sexe_M" & "sexe_F" & "lieu_naissance"

nb_Champs = 6
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
if Fich.Cells(num_row, i + 1) = Variables then
z= Fich.Cells(num_row, i + 1)
end if
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire admission.doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = FichierWord.activedocument.formfields(z)
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub
0
pero
 
il ne se passe rien...
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

et si tu fais :
Sub transfert()
dim a as string
Dim Fich As string
Set Fich = ThisWorkbook.Worksheets("formulaire")
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = "nom" & "prenom" & "nom_jeune_fille" & "sexe_M" & "sexe_F" & "lieu_naissance"

nb_Champs = 6
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
if Fich.Cells(num_row, i + 1) = Variables then
z= Fich.Cells(num_row, i + 1)
end if
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire admission.doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = FichierWord.activedocument.formfields(z)
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub
0
pero
 
Re,
à la ligne 4 il me dit :
erreur de compilation
objet requis
il n'a pas aimé la modif de Worksheet en String...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

j'ai boulié :
Set Fich = "formulaire"
0
pero
 
j'ai qd même le msg d'erreur de compilation : incompatibilité de type
0
pero > pero
 
pardon le msg est : erreur de compilation : objet requis!
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

alors écrit :
fich = "formulaire"
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

Sub transfert()
dim a as string
Dim Fich As string
Fich = activeworkbook.name
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = "nom" & "prenom" & "nom_jeune_fille" & "sexe_M" & "sexe_F" & "lieu_naissance"

nb_Champs = 6
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
if sheets("formulaire").Cells(num_row, i + 1) = Variables then
z= sheets("formulaire").Cells(num_row, i + 1)
end if
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire admission.doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
workbook(fich).activate ' si ca marche pas ecrit workbooks(fich).activate
sheets("formulaire").Cells(num_row, i + 1) = FichierWord.activedocument.formfields(z)
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub
0
pero
 
Nouvelle erreur :

erreur d'éxécution '9'
l'indice n'appartient pas à la selection
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

Fais le par F8 et dis moi ou ca bloque encore.

Courage, on va y arriver.
0
pero
 
entre les lignes 15 et 16
If Sheets("formulaire").Cells(num_row, i + 1) = Variables Then
z = Sheets("formulaire").Cells(num_row, i + 1)

merci bcp
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

Sub transfert()
dim a as string
Dim Fich As string
Fich = activeworkbook.name
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = "nom" & "prenom" & "nom_jeune_fille" & "sexe_M" & "sexe_F" & "lieu_naissance"

nb = 6
num = 1
i = 0

For i = 0 To nb_Champs - 1
if sheets("formulaire").Cells(num, i + 1) = Variables then
z= sheets("formulaire").Cells(num, i + 1)
end if
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire admission.doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num = num + 1
col = 1
For i = 0 To nb - 1
workbook(fich).activate ' si ca marche pas ecrit workbooks(fich).activate
sheets("formulaire").Cells(num, i + 1) = FichierWord.activedocument.formfields(z)
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub
0
pero
 
il n'y a plus d'erreur mais rien ne s'affiche...
0
melanie1324 Messages postés 1504 Date d'inscription   Statut Membre Dernière intervention   155
 
Re,

ca je m'en doutais un peu.

Qu'as tu voulu faire exactement?
0
pero27
 
Bonjuor,
je souhaite que les valeurs de mes différents champs dans les formulaires que j'ai récupéré ce mettent dans un ficher excel en tableau pour que je puisse les traiter plus rapidement qu'à la main.

Voici ma macro telle quelle est aujourd'hui :

Sub Import_données_formulaire()
Dim Fich As Worksheet
Set Fich = ThisWorkbook.Worksheets("Données formulaires")
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\formulaire\test\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = Array("jour_entree", "mois_entree", "annee_entree", "docteur", "hospit_complete", "ambulatoire", "htp", "soins_externes", "soins_de_suite", "chimiotherapie", "nom", "prenom", "nom_jeune_fille", "sexe_M", "sexe_F", "jour_naissance", "mois_naissance", "annee_naissance", "lieu_naissance", "departement", "adresse", "code_postal", "ville", "tel_dom", "tel_portable", "nom_pers_prevenir", "adresse_personne_pre", "tel_personne_preveni", "choix_chambre", "etablissement_exter", "date_hospit", "date_hospit2", "date_hospit3", "assurance_maladie", "num_secu", "cle_secu", "cmu_oui", "cmu_non", "mutuelle", "jour_accident", "mois_accident", "annee_accident", "employeur", "nom_assure", "prenom_assure", "nom_jeune_fille_assu", "adresse_assure", "cp_asssure", "ville_assure", "salarie", "retraite_ou_pens", "sans_emploi", "non_salarie", "non_salarie_precis", "nom_declarant", "jour_declaration", "mois_declaration", "annee_declaration")

nb_Champs = 58
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = Variables(i)
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire_vierge[1].doc" Then
monDocument = chemin & mesfichiers
FichierWord.Documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = FichierWord.ActiveDocument.FormFields(Variables(i)).Result
Next i
FichierWord.Documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

End Sub


J'ai une erreur à la ligne 38, c'est erreur d'éxécution 5941
le membre de la collection requis n'existe pas...
0
melanie1324
 
Bonjour,

En fait, je pense que le problème vient du fait que tu veux mettre trop de variables dans variables et c pour ca que ca te fait le message d'erreur.
0
pero27
 
existe-t-il une solution pour qd même pouvoir récupérer toutes ces variables?
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Bonjour

Tu as ouvert Word mais pas le document (le document est un membre de la collection Word)
dim WordApp as object, WordDoc as object
Set WordApp = CreateObject("word.application") 'ouvre session word
a chaque changement de document word (ta boucle)
Set WordDoc = WordApp.Documents.Open("C:\document1.doc") 'ouvre document Word
ton code
set wordDOc=nothing
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
re

autre chose:
1/as tu besoin de voir les documents word puisque ton objectif est de remplir excel ?
donc FichierWord.Visible = True ralentit énormément le déroulement de la macro...

2/ FichierWord.DisplayAlerts = False est à éviter: s'il y a une alerte, il faut la gérer!
si tu es obligé de l'utiliser, IL EST IMPERATIF d'insérer dès que possible
FichierWord.DisplayAlerts = True

3/ philosophie générale VBA: Eviter les boucles sur des cellules autant que faire se peut
ainsi pour nommer tes étiquettes dans excel

par ex(demo)
Dim tablo()
tablo = Array("aa", "bb", "cc")
nbre = UBound(tablo) 
num_row = 1
i = 1
Range(Cells(num_row, i), Cells(num_row, nbre+1)) = tablo


ce code est beaucoup + rapide (15 à 20X) que ta boucle...
t'évite aussi de compter le nombre de colonnes...
ce nombre est correct avec les capacités actuelles des mémoires

3/ avec ton do while fichiers<>"" tu parcours ton disque dur

avant force dans ton répertoire où se trouve tes documents par
Chdir chemin

lorsque tu demandes l'ouverture du document word tu n'as pu alors qu'à indiquer le nom du doc

4/je n'ai pas compris
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire_vierge[1].doc" Then
avec le ".", "..": a quoi servent ils?
tu pourrais écrire en supposant qu'il est dans le m^dossier que tes documents
if mesfichiers <> "formulaire_vierge[1].doc" Then



Donc essaies de rectifier: il risque aussi d'y avoir un problème avec activedocument (bug word)
et il doit y avoir moyen d'être + rapide avec les reports dans excel qu'on verra après ( ma pomme ou qqn d'autre) car il y a encore beaucoup de points à améliorer

edit 13:05: modifié paragraphe 4
0
pero27
 
bonjour,
j'ai essayé de suivre tes conseils mais je ne sais pas faire tout ce que tu me dis donc en bidouillant ça marche mais seulement si tout mes champs sont remplis. Y a-t-il un moyen pour que si un champ reste vide ça ne plante pas le programme mais simplement qu'il n'inscrive rien dans la cellule du fichier excel?

Ci-dessous ma macro telle qu'elle fonctionne à moitié maintenant !
Sub Import_données_formulaire()
Dim Fich As Worksheet
Set Fich = ThisWorkbook.Worksheets("Données formulaires")
chemin = "C:\Documents and Settings\stagiaire\Mes documents\Péroline\Admissions\formulaire\test\"
mesfichiers = Dir(chemin & "*.doc")
Dim Variables As Variant
Variables = Array("jour_entree", "mois_entree", "annee_entree", "docteur", "hospit_complete", _
"ambulatoire", "htp", "soins_externes", "soins_de_suite", "chimiotherapie", _
"nom", "prenom", "nom_jeune_fille", "sexe_M", "sexe_F", "jour_naissance", "mois_naissance", _
"annee_naissance", "lieu_naissance", "departement", "adresse", "code_postal", "ville", _
"tel_dom", "tel_portable", "nom_pers_prevenir", "adresse_personne_pre", "tel_personne_preveni", _
"choix_chambre", "etablissement_exter", "date_hospit", "date_hospit2", "date_hospit3", "num_secu", _
"cle_secu", "cmu_oui", "cmu_non", "mutuelle", "jour_accident", "mois_accident", "annee_accident", _
"employeur", "nom_assure", "prenom_assure", "nom_jeune_fille_assu", "adresse_assure", "cp_assure", _
"ville_assure", "salarie", "retraite_ou_pens", "sans_emploi", "non_salarie_precis", "precision_non_salari", _
"nom_declarant", "jour_declaration", "mois_declaration", "annee_declaration")


nb_Champs = 57
num_row = 1
i = 0

For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = Variables(i)
Next i

Set FichierWord = CreateObject("word.application")
FichierWord.Visible = True
FichierWord.DisplayAlerts = False

Do While mesfichiers <> ""
If mesfichiers <> "." And mesfichiers <> ".." And mesfichiers <> "formulaire_vierge[1].doc" Then
monDocument = chemin & mesfichiers
FichierWord.documents.Open Filename:=monDocument, ReadOnly:=True
num_row = num_row + 1
num_col = 1
For i = 0 To nb_Champs - 1
Fich.Cells(num_row, i + 1) = FichierWord.activedocument.formfields(Variables(i)).result
Next i
FichierWord.documents.Close (0)
End If
mesfichiers = Dir
Loop
FichierWord.Quit

Merci
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
Je n'y vois aucun changement
J'ai passé 3/4 heure à essayer de t'aider en t'expliquant: tout ça pour que dalle!
Ciao
--
0