Macro word - Suppression ligne tableau + problème compatibilité formulaire avec [Résolu]

Jethr0x - 31 juil. 2012 à 14:50 - Dernière réponse :  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
Afficher la suite 

Votre réponse

21 réponses

Meilleure réponse
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 3 août 2012 à 09:28
2
Merci
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)

Merci cs_loulou69 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_loulou69
Utilisateur anonyme - 31 juil. 2012 à 18:36
0
Merci
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.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 31 juil. 2012 à 19:01
0
Merci
Bonjour,

Il manque quelques mots. Il faut lire Les gens assez braves pour ouvrir ton fichier sont rares.
Commenter la réponse de Utilisateur anonyme
0
Merci
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,
Commenter la réponse de Jethr0x
0
Merci
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!
Commenter la réponse de Jethr0x
NHenry 14273 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 octobre 2018 Dernière intervention - 1 août 2012 à 14:05
0
Merci
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
---
Commenter la réponse de NHenry
0
Merci
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,
Commenter la réponse de Jethr0x
NHenry 14273 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 octobre 2018 Dernière intervention - 1 août 2012 à 14:59
0
Merci
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
---
Commenter la réponse de NHenry
0
Merci
Non toujours pas, il me met un message "Erreur de compilation - incompatibilité de type" maintenant au niveau du [.cell(ligne, 2)]
Commenter la réponse de Jethr0x
NHenry 14273 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 octobre 2018 Dernière intervention - 1 août 2012 à 15:15
0
Merci
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
---
Commenter la réponse de NHenry
0
Merci
Le type est "empty" d'après l'espion
Commenter la réponse de Jethr0x
NHenry 14273 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 octobre 2018 Dernière intervention - 1 août 2012 à 15:26
0
Merci
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
---
Commenter la réponse de NHenry
0
Merci
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
Commenter la réponse de Jethr0x
NHenry 14273 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 octobre 2018 Dernière intervention - 1 août 2012 à 15:44
0
Merci
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
---
Commenter la réponse de NHenry
0
Merci
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?
Commenter la réponse de Jethr0x
Utilisateur anonyme - 1 août 2012 à 16:39
0
Merci
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.
Commenter la réponse de Utilisateur anonyme
0
Merci
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
Commenter la réponse de Jethr0x
Utilisateur anonyme - 2 août 2012 à 18:26
0
Merci
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.
Commenter la réponse de Utilisateur anonyme
0
Merci
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,
Commenter la réponse de Jethr0x
0
Merci
Pardon problème avec la capture, le lien direct:Tapez le texte de l'url ici.
Commenter la réponse de Jethr0x

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.