Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Report du contenu d'une cellule #2

4 réponses
Avatar
Jocelyne Roberge
Bonjour,

Je reviens avec ma question sur le report du contenu de cellules avec les
signets et merci encore. Suite aux instructions suivantes qu'on m'a données,
j'ai réussi.

ActiveDocument.Bookmarks("Tbl2Date1").Range.Text = _
TxtNet(ActiveDocument.Bookmarks("Tbl1Date1").Range.Text)

Juste par curiosité, existe-t-il une façon plus concise pour effectuer cette
opération car actuellement j'ai copié et adapté cette ligne en très grand
nombre. Je m'explique.

J'ai 9 tableaux (insérés dans un tableau donc imbriqués). Dans le premier
tableau (Tbl1Date1), j'écris 6 dates dans la première colonne. Ces dates
doivent être toutes reportées dans les autres tableaux dont les cellules
sont nommées respectivement Tbl1Date1, Tbl1Date2, Tbl1Date3, etc. et
Tbl2Date1, Tbl2Date2 et ainsi de suite pour tous les 9 tableaux.

Je vois souvent des exemples avec une instruction For Each qui permet d'agir
sur une série d'objets. Peut-on lui donner des instructions qui feraient que
pour chaque Signet comportant le mot Date1 met le même contenu que
Tbl1Entrée1, que pour chaque Signet comportant le mot Date2 met le même
contenu que Tbl1Entrée2.

J'espère que ma question est claire et merci pour les suggestions.

Jocelyne

4 réponses

Avatar
Geo
Bonjour Jocelyne

La réponse à votre question nécessiterait de longs développements.

Quand on doit faire plusieurs fois la même opération, une technique est
de faire un sous-programme (Sub ou Function) auquel on passe en
paramètre des éléments.
Par exemple :
Sub Copie(S as string, D as string)
ActiveDocument.Bookmarks(D).Range.Text = _
TxtNet(ActiveDocument.Bookmarks(S).Range.Text)
end sub

On appelle ce sous programme en donnant la valeur des paramètres.
Exemple 1 :
Copie("Tbl1Date1", "Tbl2Date1")
Copie("Tbl1Date2", "Tbl2Date2")
etc.
Exemple 2 :
Dim Tsource as string
Dim Tdest as string

Tsource = "Tbl1Date1"
Tdest = "Tbl2Date1"
Copie(Tsource, Tdest)
Tsource = "Tbl1Date2"
Tdest = "Tbl2Date2"
Copie(Tsource, Tdest)
etc.
Jusque là on n'a pas trop gagné en nb de lignes, mais comme vos noms
ont l'air de se suivre :

Exemple 3 :
Dim Tsource as string
Dim Tdest as string
Dim i as integer

For i = 1 to 9
Tsource = "Tbl1Date" & i
Tdest = "Tbl2Date" & i
Copie(Tsource, Tdest)
next

Si vos tableaux sont numérotés de 1 en 1 jusqu'à 12, on ajoute une
autre boucle :
Exemple 4 :
Dim Tsource as string
Dim Tdest as string
Dim i as integer
Dim j as integer

for j= 1 to 12 step 2
For i = 1 to 9
Tsource = "Tbl" & j & "Date" & i
Tdest = "Tbl" & j + 1 & "Date" & i
Copie(Tsource, Tdest)
next i
next j

Là, effectivement vous avez tout traité en quelques lignes.
On voit aussi l'intérêt de choisir judicieusement le nom des signets.

Le for each s'utilise avec des "collections", c'est le terme exact qui
vous aidera à vous retrouver dans l'aide.
L'ensemble des signets d'un document (ou d'une plage, ou d'une
sélection) est une collection de signets.
Idem pour les tableaux.
Ainsi :
Dim UneTable as Table

For each UneTable in Active Document.Tables
' passe en revue toutes les tables du document actif
next

Ca marche pour des tas de choses, par exemple :
Dim Paragraphe As Paragraph
For Each Paragraphe In ActiveDocument.Sections(5).Paragraphs
'Traiter chaque paragraphe de la section 5
Next

Ce type de programmation est très pratique, mais peut s'avérer
piégeuse, ce n'est pas le cas dans votre exemple, mais il vaut mieux le
savoir.
On n'a aucune garantie sur l'ordre dans lequel la collection est
défilée.
Si le nombre d'éléments de la collection varie en cours d'exécution
(suppression d'éléments) on ne maîtrise plus grand chose.

Dans votre cas, ce serait qqch comme

Dim Signet as bookmark
For each Signet in Activedocument.bookmarks
If instr(Signet.Name,"Date1") >0 then
' Signet à traiter

endif
next signet
Mais ça ne me parait pas très bien adapté à votre cas, en particulier
en raison des noms qui sont significatifs.

--
A+
Avatar
Geo
Re Bonjour

Pour compléter un peu sur les collections.
Chaque élément d'une collection à un index qui permet de l'identifier
de façon unique.
Supposons que vous ayez donné un nom à la plage du document contenant
vos tableaux.
Dans cette plage le premier tableau a pour index 1, le suivant : 2
etc.
Un tableau contient une collection de colonnes, une collection de
lignes, une collection de cellules.
La solution que vous utilisez avec les signets vous a obligé à donner
un nom à chaque élément, et à partir de là, la solution est simple à
programmer.
Vous pourriez certainement utiliser la collection des cellules de
chaque tableau, faisant lui-même partie de la collection des tableaux,
mais la solution dépend de la présentation et de l'ordre des différents
éléments. Vous les connaissez bien sûr, mais pas le(a) bénévole qui
vous a aidée à trouver la solution qui marche actuellement.
A contrario, si vous modifiez la structure d'un tableau, il faudrait
peut-être aussi modifier votre programme.

--
A+
Avatar
Jocelyne
Merci Geo pour vos explications.

Je vais tester les différents exemples pour mieux comprendre.

En ayant diverses automatisations à produire, je m'aperçois que le VBA ne
s'apprend pas en un ou deux mois avec toutes les facettes qu'il comporte.

Pour ma part, il faut que je pratique sur différents cas, ce n'est pas
seulement à regarder les codes que j'arrive à comprendre.

Dans certains codages, j'ai de la difficulté à savoir si c'est une variable
de l'utilisateur ou un code de VBA. Alors, je teste en faisant des
changements dans ce que je pense être une variable de l'utilisateur.

Les exemples que vous m'avez donnés pour mon cas vont m'aider dans ce sens
et aussi les solutions que les autres bénévoles apportent.

J'apprécie grandement cette formation.

Au sujet de la collection Tableau, lorsqu'on utilise For each pour exécuter
une action sur tous les tableaux du document, est-ce que les tableaux
imbriqués sont également traités? ou bien VB n'en tient pas compte à moins de
les nommer?

Jocelyne


Re Bonjour

Pour compléter un peu sur les collections.
Chaque élément d'une collection à un index qui permet de l'identifier
de façon unique.
Supposons que vous ayez donné un nom à la plage du document contenant
vos tableaux.
Dans cette plage le premier tableau a pour index 1, le suivant : 2
etc.
Un tableau contient une collection de colonnes, une collection de
lignes, une collection de cellules.
La solution que vous utilisez avec les signets vous a obligé à donner
un nom à chaque élément, et à partir de là, la solution est simple à
programmer.
Vous pourriez certainement utiliser la collection des cellules de
chaque tableau, faisant lui-même partie de la collection des tableaux,
mais la solution dépend de la présentation et de l'ordre des différents
éléments. Vous les connaissez bien sûr, mais pas le(a) bénévole qui
vous a aidée à trouver la solution qui marche actuellement.
A contrario, si vous modifiez la structure d'un tableau, il faudrait
peut-être aussi modifier votre programme.

--
A+





Avatar
Geo

Dans certains codages, j'ai de la difficulté à savoir si c'est une variable
de l'utilisateur ou un code de VBA. Alors, je teste en faisant des
changements dans ce que je pense être une variable de l'utilisateur.


C'est pour cela qu'il vaut mieux donner un nom en français, au moins on
est certain que ce n'est pas du vba.
Une coutume est de nommer une variable Mon ou Ma quelque chose.
Par exemple MonTableau ou MaTable.
Personnellement, pour les For Each j'utilise plutôt UnTableau, je
réserve l'utilisation de MonTableau à un tableau précis, mais à chacun
ses manies.
Exploitez à fond l'interface VBE, il y a tout un chapitre sur le sujet
dans le livre VBA que vous vous êtes procuré.
En particulier l'utilisation de la fenêtre "Variables locales", vous y
verrez toutes les variables et leurs membres.

Au sujet de la collection Tableau, lorsqu'on utilise For each pour exécuter
une action sur tous les tableaux du document, est-ce que les tableaux
imbriqués sont également traités? ou bien VB n'en tient pas compte à moins de
les nommer?


Comme vous le disiez, l'expérimentation est le plus sur.
Tapez ceci dans la fenêtre d'exécution :
? ActiveDocument.Tables.Count
Vous verrez que seuls les tableaux globaux sont comptés
Autre possibilité faites tourner ce petit programme en mettant un point
d'arrêt sur le Next, vous verrez comment se fait le balayage :

Sub testTableaux()
Dim UnTableau As Table
Debug.Print ActiveDocument.Tables.Count
For Each UnTableau In ActiveDocument.Tables
UnTableau.Select
Next
End Sub
Les tableaux imbriqués, sont des tableaux dans des tableaux.
Voici un bout de programme qui permet de savoir le nombre de tableaux
imbriqués jusqu'au niveau 3, c'est à dire combien il y a de tableaux
dans un tableau, lui-même dans un tableau du document :
Sub testTableaux()
Dim UnTableau As Table
Dim SousTableau As Table
Debug.Print "Niveau 1", ActiveDocument.Tables.Count
For Each UnTableau In ActiveDocument.Tables
'UnTableau.Select
Debug.Print "Niveau 2", UnTableau.Tables.Count
For Each SousTableau In UnTableau.Tables
'SousTableau.Select
Debug.Print "Niveau 3", SousTableau.Tables.Count
Next
Next
End Sub

Le premier tableau imbriqué dans le deuxième tableau du document est :
ActiveDocument.Tables(2).Tables(1)

--
A+