Macro word - Suppression ligne tableau + problème compatibilité formulaire avec

Résolu
Jethr0x - 31 juil. 2012 à 14:50
 Jethr0x - 3 août 2012 à 11:20
Bonjour,

Sous Word 2003, je souhaite créer un bouton macro qui supprime les lignes blanches d'un tableau, qui lui-même se complète à l'aide d'une autre macro.

Après quelques recherches sur le forum du site, j'ai trouvé un code qui me semblait adapté.

Malheureusement il y a une erreur dans le code que j'ai adapté (Erreur 5941), quelqu'un pourrait il s'il vous plait m'aider à corriger l'erreur?

Ci-dessous le code:

Private Sub CommandButton1_Click()

Dim ligne As Integer
Dim valeur As Integer

ligne = 2
While ligne <= ActiveDocument.Tables(2).Rows.Count
ActiveDocument.Tables(2).Cell(ligne, 2).Select
valeur = Left(Selection.Tables(2).Cell(ligne, 2).Range.Text, 1)'l'erreur survient à cet endroit
If valeur = 0 Then
Selection.Cells.Delete shiftcells:=wdDeleteCellsEntireRow
Else
ligne = ligne + 1
End If
DoEvents
Wend

End Sub


Si besoin, le lien du fichier word en question:
Lien du fichier word

Egalement, j'ai un autre soucis mais plus en rapport avec word, je ne peux pas utiliser dans le même document Word des macros et des formulaires: lorsque je veux remplir le formulaire, je suis obligé de protéger le document, et du coup lorsque une macro se lance pour écrire du texte dans un tableau, ça met un message d'erreur ("erreur d'execution 6124") car j'imagine que l'accès en écriture du document est bloqué. Auriez-vous une solution à ce problème?

Merci beaucoup d'avance,

Cordialement

21 réponses

cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
3 août 2012 à 09:28
Bonjour
Lire la traduction de l'anglais sur le site de microsoft
http://support.microsoft.com/kb/165928

3 paragraphes
- cause
- methode 1 (enlever la caractère ASCII 7 fin de cellule)
- Methode2 (utiliser la methode Expand sur un objet Range)
2
Utilisateur anonyme
31 juil. 2012 à 18:36
Bonjour,

Les gens assez braves pour ouvrir ton fichier.

Le texte de l'erreur 5941 c'est : Le membre requis de la collection n'existe pas.

Donc, cela pourrait être:

Le numéro de la table
Le numéro de la cellule

Et puisque que tu augmentes ton compteur en même temps que tu effaces tes lignes, il y a un risque assez évident que le compteur excède le nombre réel de lignes bien avant d'atteindre la fin de la boucle.

C'est la raison qui incite à préconiser l'effacement des lignes à rebours, en commençant par la dernière.
0
Utilisateur anonyme
31 juil. 2012 à 19:01
Bonjour,

Il manque quelques mots. Il faut lire Les gens assez braves pour ouvrir ton fichier sont rares.
0
Bonjour merci pour votre réponse,

J'ai essayé:

Private Sub CommandButton1_Click()

Dim ligne As Single
Dim valeur As Single

ligne = 8
While ligne <= ActiveDocument.Tables(2).Rows.Count
ActiveDocument.Tables(2).Cell(ligne, 2).Select
valeur = Left(Selection.Tables(2).Cell(ligne, 2).range.Text, 1)
If valeur = "" Then
Selection.Cells.Delete shiftcells:=wdDeleteCellsEntireRow
Else
ligne = ligne - 1
End If
DoEvents
Wend

End Sub

mais sans succès (je ne suis pas très doué en VBA!).
Je ne vois pas de quel membre de la collection le débogueur parle, pour moi ils sont bon (j'ai revérifié, le tableau + la position de la cellule existe bien), j'ai compté à rebours avec ligne =8 pour un tableau de 8 lignes en décrémentant.
L'erreur doit venir de la ligne "valeur = Left(Selection.Tables(2).Cell(ligne, 2).range.Text, 1)" où peut être il doit y avoir un problème de compatibilité des types de caractères (chaines de caractères + entiers)?

Eh oui désolé je ne veux pas vous effrayer avec mon fichier, promis rien de nuisible pour votre ordi dedans!

Cordialement,
0

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

Posez votre question
Re-bonjour,

J'ai essayé avec un code plus simple:

Dim ligne As Integer
Dim valeur As Boolean

ligne = 8

While ligne <> 0
ActiveDocument.Tables(2).Cell(ligne, 2).Select
valeur = IsEmpty(Tables(2).Cell(ligne, 2))
If valeur = True Then
ActiveDocument.Tables(2).Cell(ligne, 2).Select
Selection.Cells.Delete shiftcells:=wdDeleteCellsEntireRow
Else
ligne = ligne - 1
End If
DoEvents
Wend

End Sub

Mais apparemment la formule IsEmpty me donne toujours comme résultat False alors que cela devrait me rendre True si la cellule est bien vide...
Du coup la macro se déroule normalement ligne par ligne mais ne supprime jamais une seule ligne vide du tableau word.

Quelqu'un sait d'où peut venir ce problème?

Merci d'avance!
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
1 août 2012 à 14:05
Bonjour,

IsEmpty retourne si la variable est vide ou pas, mais une chaine "" n'est pas vide, elle a une valeur.

Il faut donc que tu couple avec un test du genre :
If ***.Value="" Then

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Bonjour, merci de ta réponse

J'ai essayé avec ta méthoden malheureusement ça me met sort le message "Erreur de compilation - membre de méthode ou de données introuvable" à la ligne [If ActiveDocument.Tables(2).Cell(ligne, 2).Value = "" Then]

Ci-dessous le code que j'ai mis (désolé je suis vraiment un débutant en VBA!!):

Dim ligne As Integer

ligne = 8

While ligne <> 0
ActiveDocument.Tables(2).Cell(ligne, 2).Select
If ActiveDocument.Tables(2).Cell(ligne, 2).Value = "" Then
Selection.Cells.Delete shiftcells:=wdDeleteCellsEntireRow
Else
ligne = ligne - 1
End If
DoEvents
Wend
End Sub

Vois tu la solution?

Merci d'avance,
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
1 août 2012 à 14:59
Bonjour,

Je n'ai pas vu que c'était du Word.
If ActiveDocument.Tables(2).Cell(ligne, 2) = "" Then
ça passe ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Non toujours pas, il me met un message "Erreur de compilation - incompatibilité de type" maintenant au niveau du [.cell(ligne, 2)]
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
1 août 2012 à 15:15
Bonjour,

En pas à pas, avec un espion, quel est le type indiqué ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Le type est "empty" d'après l'espion
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
1 août 2012 à 15:26
Bonjour,

Tu as un screen de l'affichage ?
Sinon, un IsEmpty retour toujours Vrai, même si c'est Empty ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Ci-dessous la capture:



Non avec le IsEmpty le problème est qu'il me retourne toujours False même s'il n'y a rien dans le tableau, du coup il ne prend jamais la conditionnelle de suppression
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
1 août 2012 à 15:44
Bonjour,

Non, il faut tout sélectionner :
ActiveDocument...,2)

Comme ça tu auras la vraie valeur.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Non mais en fait le débogueur pas à pas ne peut même pas se lancer à cause de cette expression, le message erreur de compilation apparait directement quand je lance le débog.
Tu veux directement le fichier?
0
Utilisateur anonyme
1 août 2012 à 16:39
Bonjour,

Je viens presque juste de me réveiller et à force de voir les images de ton code, je pense que l'on peut dire EURÊKA. Cell, n'est pas une collection de cellules, c'est UNE cellule. La collection de cellule c'est Cells

Donc, si tu ajoutes un s au Cell de ta ligne

ActiveDocument.Tables(2).Cell(ligne, 2).Select 


cela devrait marcher.
0
Bonjour,

Je viens d'essayer ce matin et j'aurais aimé dire EUREKA avec toi mais malheureusement ça ne marche toujours pas! (il me met erreur de compilation)

Je ne sais pas si on va y arriver un jour
0
Utilisateur anonyme
2 août 2012 à 18:26
Bonjour,

Mets un espion sur Ligne, lance l'exécution au pas-à-pas (F8) et vérifie la valeur de Ligne au moment de la panne.
0
Bonjour,

C'est déjà ce que j'ai essayé de faire mais la macro ne se lance pas et me met direct "Erreur de compilation - incompatibilité de type" sur la ligne:

If ActiveDocument.Tables(2).Cell(ligne, 2) = "" Then
au niveau de "Cell".

Du coup j'ai procédé autrement en créant une variable "valeur2" de type Variant (au moins il me retournera quelquechose dedans) et en remplaçant la ligne
If ActiveDocument.Tables(2).Cell(ligne, 2) = "" Then
, la macro devient:

Dim ligne As Integer
Dim valeur2 As Variant


ligne = 8

While ligne <> 0
        ActiveDocument.Tables(2).Cell(ligne, 2).Select
        valeur2 = ActiveDocument.Tables(2).Cell(ligne, 2)
        If valeur2 = "" Then
        Selection.Cells.Delete shiftcells:=wdDeleteCellsEntireRow
      Else
      ligne = ligne - 1
     End If
DoEvents
Wend

End Sub


Et là je peux lancer un espion sur "valeur2" et il me retourne une valeur étrange " " alors que la cellule du tableau est apparemment vide.
Du coup mon problème viendrait des valeurs par défaut du tableau que je ne comprend pas (même si par exemple je mets une valeur par défaut dans le tableau par exemple 34, il me retourne "34 ")

Ci-dessous une capture avc espion:



As-tu une idée de la solution?

Merci d'avance,
0
Pardon problème avec la capture, le lien direct:Tapez le texte de l'url ici.
0
Rejoignez-nous