Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/09/2011, 08h20   #1
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 164
Points : 30
Points : 30
Par défaut Modifier la cellule d'un tableau

Bonjour. J'ai un tableau et une cellule contenant du texte. A l'intérieur se trouve un mot compris entre deux accolades. Comment dois-je faire pour supprimer ce mot avec ses accolades? Merci pour votre aide.
Arsene12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 12h43   #2
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Voilà un exemple

Code :
1
2
3
4
5
6
Public Sub temp()
    Dim tableau As Integer, ligne As Integer, col As Integer
    tableau = 1: ligne = 1: col = 2
    Application.ActiveDocument.Tables(tableau).Cell(ligne, col).Select
    Selection.Delete
End Sub
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 16h54   #3
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 164
Points : 30
Points : 30
Par défaut Modifier le contenu d'une cellule d'un tableau

Merci, mais ça ne me donne pas vraiment la réponse. Ce que je veux, ce n'est pas effacer le contenu d'une cellule mais seulement une partie de ce contenu.
Arsene12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 22h47   #4
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Pardon... Je propose ce code qui n'est pas forcément le top surtout s'il y a un grand nombre de cellules à scruter avec un grand nombre de mots.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Public Sub temp()
    Dim tableau As Integer, ligne As Integer, col As Integer, debut As Long, fin As Long
    tableau = 1: ligne = 1: col = 1
    With Application.ActiveDocument.Tables(tableau).Cell(ligne, col)
        début = 0 'Initialisation
        fin = 1 'Initialisation
        While fin < .Range.Words.Count And Left(.Range.Words(fin).Text, 1) <> "}"
            If .Range.Words(fin).Text = "{" Then
                debut = fin
            End If
            fin = fin + 1
        Wend
        If debut <> 0 Then
            While debut <= fin
                .Range.Words(debut).Delete
                fin = fin - 1
            Wend
        End If
    End With
End Sub
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 06h54   #5
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 164
Points : 30
Points : 30
Merci beaucoup. J'ai copié le code tel quel et je l'ai appliqué. Et ça marche, c'est exactement ce que je voulais. Par contre, je comprends pas bien la méthode car les lignes de codes ne sont pas expliquées. Il faut que j'étudie à quoi elles correspondent pour pouvoir progresser.
Arsene12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 00h41   #6
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut Arsene12,

Un simple rechercher/remplacer aurait suffit et sans macro. Comme le code marche et tu sembles vouloir apprendre, on peut t'expliquer si tu as besoin.

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 04h05   #7
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 164
Points : 30
Points : 30
Par défaut Rechercher/remplacer

Bonjour,
Merci pour cette remarque. Le rechercher/remplacer est très simple à utiliser lorsqu'il s'applique à tout le document, là c'est sur une section précise (une seule cellule d'un tableau), ça complique un peu.
Arsene12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 12h44   #8
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Voici quelques explications...

Code :
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
Public Sub temp()
    'Déclaration des variables
    Dim tableau As Integer, ligne As Integer, col As Integer, debut As Long, fin As Long
    'Initialisation du numéro de tableau, de la ligne et de la colonne
    tableau = 1: ligne = 1: col = 1
    'La ligne With permet de simplifier pour réduire la longueur des variables (regarder dans l'aide...)
    With Application.ActiveDocument.Tables(tableau).Cell(ligne, col)
        'Initialisation des variables début et fin
        début = 0 
        fin = 1
        '.Range.Words.Count ==> Nombre de mots de la cellule
        'Tant que fin est strictement inférieur au nombre de de mot ou la première lettre du mot est '}'
        While fin < .Range.Words.Count And Left(.Range.Words(fin).Text, 1) <> "}"
            'Si le mot est '{' alors debut prend la position du mot (fin)
            If .Range.Words(fin).Text = "{" Then
                debut = fin
            End If
            'Incrémentation de la position du mot
            fin = fin + 1
        Wend
        La dernière position du mot est fin et si début est différent de 0 ('{' détecté) alors...
        If debut <> 0 Then
            'Tant que début est inférieur ou égal à fin
            While debut <= fin
                'Suppression du mot en qui a pour position début
                .Range.Words(debut).Delete
                'La suppression d'un mot décale la position des mots qui les suivent. Du coup je décrémente fin
                fin = fin - 1
            Wend
        End If
    End With
End Sub
N'hésite pas à tester le code en pas à pas. (F8 dans l'éditeur VBA)

Sepia, je suis intéressé par la méthode de Recherche/Remplace, ce qui simplifierait le code et réduirait le temps d'exécution.
Est-il possible de rechercher un texte qui commence par un caractère et qui se termine par un autre (ou pas) sans que l'on prenne en compte ce qu'il y a entre ces deux caractères?


Edit :
Oui en recherchant \{*\}
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 13h18   #9
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Voilà une méthode un peu plus propre à mon avis...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Sub temp()
    Dim tableau As Integer, ligne As Integer, col As Integer, debut As Long, fin As Long
    tableau = 1: ligne = 1: col = 1
    Application.DisplayAlerts = False
    Application.ActiveDocument.Tables(tableau).Cell(ligne, col).Select
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\{*\}"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Application.DisplayAlerts = True
End Sub
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 00h52   #10
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut Arsene12,

Citation:
Envoyé par Arsene12 Voir le message
Le rechercher/remplacer est très simple à utiliser lorsqu'il s'applique à tout le document, là c'est sur une section précise (une seule cellule d'un tableau), ça complique un peu.
La recherche dans Word peut porter soit sur tout le document soit sur la sélection en cours. Donc il suffit de sélectionner ta cellule, c'est OK.

Mais le code de Manuel40 est très complet et te permet de te former à VBA.

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 06h43   #11
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 164
Points : 30
Points : 30
Par défaut Codes imparfaits

Merci beaucoup Manuel40 pour les codes. Je tiens malheureusement à signaler qu'il y a des erreurs. Tout d'abord, pour celui de 22h47, il efface toutes les occurences, y compris celles situées en dehors du tableau alors que je ne veux cibler qu'une seule cellule. Pour celui de 12h44, il fait un bug lorsqu'y'a du texte avant la 1ère accolade.
Arsene12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h50   #12
Nouveau Membre du Club
 
Homme Manu
Automaticien
Inscription : août 2011
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Manu
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Automaticien
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 16
Points : 25
Points : 25
Celui de 22h47 fonctionne correctement chez moi.
Celui de 12h44, je ne sais pas, j'ai juste ajouté des commentaires.
Celui de 13h18 supprime toutes accolades. C'est de la faute (au programmateur) à la ligne Application.DisplayAlerts = False.
Cette ligne permet de ne pas afficher le message qui demande si on souhaite remplacer dans tout le document. En fait elle répond "Oui" à la question. Il faudrait trouver un moyen de répondre "Non" automatiquement et là c'est gagné...
Manuel40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h59   #13
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 597
Points : 1 597
Envoyer un message via MSN à carden752
Bonjour,

Peut-être utilisé la propriété wrap à wdfindstop.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 16h38   #14
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 164
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 164
Points : 30
Points : 30
Par défaut Solution

Je vous remercie beaucoup. Grâce à vous j'ai la solution.
Voici donc le code final :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Sub temp()
    Dim tableau As Integer, ligne As Integer, col As Integer, debut As Long, fin As Long
    tableau = 1: ligne = 1: col = 1
    Application.DisplayAlerts = False
    If ActiveDocument.Tables.Count >= 1 Then
    Application.ActiveDocument.Tables(tableau).Cell(ligne, col).Select
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\{*\}"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    End If
    Application.DisplayAlerts = True
End Sub
Arsene12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h42.


 
 
 
 
Partenaires

Hébergement Web