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
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
A voir également:
Erreur 5941 le membre de la collection requis n'existe pas
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.
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,
Vous n’avez pas trouvé la réponse que vous recherchez ?
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.
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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 ---
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
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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 ---
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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 ---
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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 ---
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
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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 ---
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?
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
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 ")