Détecter les noms des feuilles d’un workbook

romainchu78

XLDnaute Occasionnel
Bonjour a tout le forum,

J’ai 2 workbooks different d’ouvert. A l’aide d’une macro contenu dans le 1er workbook, je stock le titre du 2eme workbook dans une variable avec ceci: “ NomFichierCourt = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) » (j’enleve l’extention et variable NomFichierCourt declare en public (code donne par thierry du forum)). Maintenant je veux comparer cette variable (qui contient le titre du 2eme workbook) avec tous les noms des feuilles du 1er workbook.
Mon but final est de créer une nouvelle feuille dans le 1er workbook avec le meme nom que le titre du 2eme workbook. Mais pour cela je dois verifier s’il n’y a pas deja une feuille qui contient deja le nom.

Je ne connais pas le moyen de coder. Jai essaye ca, mais ca ne marche pas :
If Workbook.Worksheets = NomFichierCourt Then
MsgBox "probleme de duplication"
End If

Quelqu’un a t’il une idée pour au moins faire ressortir les noms des feuilles du 1er workbook dans des variables de manière a faire comparer toutes variables (autant que de feuilles) avec la variable qui contient le titre du 2eme workbook.
Ou quelqu’un a carrément une idée pour également faire toute la comparaison. Je mets mon fichier Excel pour ceux qui veulent le mettre à jour.

Merci par avance.
Bon week-end…
 

Pièces jointes

  • romainchu78.zip
    11.4 KB · Affichages: 24
  • romainchu78.zip
    11.4 KB · Affichages: 21
  • romainchu78.zip
    11.4 KB · Affichages: 23
Dernière édition:

romainchu78

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

Merci les gars pour vos reponses.
voila qui est mieux.
Kobaya jai repris ton deuxieme code ainsi que le mien pour en faire un troisieme qui fonctionne. Sauf la ligne de code pour annuler proprement la boite de dialogue si le mec clique sur annuler ou fermeture a la place d'ouvrir le fichier.
je te met en piece jointe mon nouveau fichier.

a part ca tout marche niquel. merci beaucoup.
bon week-end
 

Pièces jointes

  • Romainchu78_v2.zip
    13.5 KB · Affichages: 18
  • Romainchu78_v2.zip
    13.5 KB · Affichages: 21
  • Romainchu78_v2.zip
    13.5 KB · Affichages: 19

Temjeh

XLDnaute Accro
Supporter XLD
Re : Détecter les noms des feuilles d’un workbook

Bonjour à tous

Si j'ai bien compris juste un ajout de ceci:

...

If FileToOpen = False Then Exit Sub
Workbooks.OpenText Filename:=FileToOpen _
, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
False, Comma:=False, Space:=False, Other:=True, OtherChar:="|", _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1))

...

Temjeh
 
Dernière édition:

Kobaya

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

re,

Y'a des trucs qui me chiffonnent :

1. La version que tu as mise dans ton dernier message n'a plus le code qui nomme l'onglet avec le nom du fichier (s'il n'existe pas déjà).

2. Il vaut mieux utiliser les boucles Do Loop, qui combinées avec Until ou While (en entrée ou en sortie de boucle), ou For Next, ce qui donne pas déjà pas mal de possibilités. C'est plus "propre" que le Goto startover qui est hérité des premières génération de Basic, mais côté structuration du programme...

3. dans la boucle
For Each Worksheet In wbk1.Sheets
If wbk2.Name = NomFichierCourt Then
MsgBox "Part list already loaded or few Part lists with the same title"
wbk2.Close False
GoTo startover
End If
Next
Worksheet est un mot réservé de VBA, qui ne peut pas être utilisé comme variable

4.
FileToOpen = Application.GetOpenFilename("Fichiers texte (*.txt), *.txt")
doit être placé dans le Do Loop, sinon, on charge à chaque fois le même fichier

5. à la fin d'une procédure, il faut toujours libérer la mémoire utilisée par les variables objet (initialisées avec Set) en faisant Set variable = Nothing. Sinon, on peut finir par saturer la mémoire vive en faisant tourner la macro plusieurs fois successives...

6. Attention !
Dim wbk1, wbk2 As Workbook
wbk2 est bien défini comme un objet de type Workbook, mais wbk1 est défini comme Variant (voir l'aide)
 

romainchu78

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

Merci a vous les gars, maintenant mon programme fonctionne.
Kobaya je ne comprend pas:

- la citation 6 "wbk2 est bien défini comme un objet de type Workbook, mais wbk1 est défini comme Variant (voir l'aide)" ?

- Ok pour la citation 5 avec la liberation de la memoire vive.

- Pour la citation 4: "FileToOpen = Application.GetOpenFilename("Fichiers texte (*.txt), *.txt") doit être placé dans le Do Loop, sinon, on charge à chaque fois le même fichier". jai essaye ca na pas marche. il me proposait en boucle d'ouvrir un fichier. jai reussi autremant avec le code de Temjeh "If FileToOpen = False Then Exit Sub
Workbooks.OpenText Filename:=FileToOpen , Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _ ......."
Ca marche...

- Pour la citation 3:"Worksheet est un mot réservé de VBA, qui ne peut pas être utilisé comme variable". je nai pas compris en tout les cas ce code fonctionne.

- Pour la citation 2: "C'est plus "propre" que le Goto startover qui est hérité des premières génération de Basic, mais côté structuration du programme..." En quoi le goto n'est pas propre ?

- Pour la citation 1: je voulais tester quelque chose en particluier alors jai mis dans cette version que ce que je voulais tester.

Merci pour ces conseils, c'est toujours interessant de savoir optimiser son code.
 

Kobaya

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

- la citation 6 "wbk2 est bien défini comme un objet de type Workbook, mais wbk1 est défini comme Variant (voir l'aide)" ?
Il vaut toujours mieux définir une variable avec le type le plus approprié, car le type par défaut (Variant) consomme beaucoup plus de mémoire, et consomme aussi plus de temps (dans une boucle par exemple).
après chaque varible, il faut spécifier le type :
Dim wbk1, wbk2 As Workbook
==> wbk1 est un une variable de type Variant, wbk2 est une variable objet de type Workbook
Dim wbk1 As Workbook, wbk2 As Workbook
==> wbk1 et wbk2 sont des variables objet de type Workbook

Il est bon aussi de respecter quelques principes :
  • utiliser des noms de variable le plus parlant possible (comme tu le fais déjà)
  • préfixer la variable avec trois caractères résumant le type (strVariable pour un type String, intVariable pour Integer, lngVariable pour Long, wshVariable pour Worksheet, wbkVariable pour Workbook, etc...)
  • utiliser l'indentation : mettre en retrait les lignes de codes se trouvant dans une boucle (code plus lisible)
  • il y en a d'autres, mais c'est assez pour aujourd'hui :p
- Pour la citation 3:"Worksheet est un mot réservé de VBA, qui ne peut pas être utilisé comme variable". je nai pas compris en tout les cas ce code fonctionne.
Autant pour moi : ça a produit une erreur chez moi, car j'utilise toujours Option Explicit en tête de module. Et c'est ce qui a provoqué l'erreur. Effectivement, avec Worksheet, le code tourne...
mais, bon, je persiste : Worksheet est bien un terme utilisé par VBA (pour être précis, c'est une classe d'objet), donc j'évite de faire des déclarations qui ressembleraient à Dim Worksheet As Worksheet... :p
Voici un extrait de l'aide VBA :
Règles d'affectation de noms Visual Basic
Utilisez les règles suivantes pour nommer des procédures, des constantes, des variables et des arguments dans un module Visual Basic :
  • Utilisez une lettre comme premier caractère.
  • N'utilisez pas d'espace, de point (.), de point d'exclamation (!) ou les caractères @, &, $, # dans le nom.
  • Un nom ne peut compter plus de 255 caractères.
  • Généralement, vous ne devriez pas utiliser des noms identiques aux noms de fonction, d'instruction et de méthode de Visual Basic. Vous feriez double emploi des mots clés du langage. Pour utiliser une fonction, une instruction ou une méthode du langage intrinsèque en conflit avec un nom attribué, vous devez l'identifier explicitement. Faites précéder la fonction, l'instruction ou la méthode intrinsèque du nom de la bibliothèque de types associée. Par exemple, si vous avez une variable nommée Left, pour invoquer la fonction Left, vous devez employer VBA.Left.
  • Vous ne pouvez pas employer deux fois le même nom au même niveau de portée. Par exemple, vous ne pouvez pas déclarer deux variables nommées age dans la même procédure. Cependant, vous pouvez déclarer une variable privée nommée age et une variable de niveau procédure nommée age dans le même module. Note Visual Basic ne différencie pas les majuscules des minuscules, mais conserve la casse dans l'instruction de déclaration du nom.
- Pour la citation 2: "C'est plus "propre" que le Goto startover qui est hérité des premières génération de Basic, mais côté structuration du programme..." En quoi le goto n'est pas propre ?
Je suis peut-être un peu chatouilleux, surtout vis à vis de programmeurs non professionnels, mais si le programme prend de l'ampleur (en terme de nombre de ligne), utiliser des Goto finit par faire ressembler à un "plat de nouilles" (en terme de structuration)
Merci pour ces conseils, c'est toujours interessant de savoir optimiser son code.
Le forum sert à ça :)
Je me permets de remettre une version où j'ai corrigé, notamment, le problème du FileToOpen = False
Dernière question : est-il nécessaire d'ouvrir le fichier ? Recueillir simplement le nom du fichier devrait suffire. A moins que j'ai loupé quelquechose
 

Kobaya

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

- la citation 6 "wbk2 est bien défini comme un objet de type Workbook, mais wbk1 est défini comme Variant (voir l'aide)" ?
Il vaut toujours mieux définir une variable avec le type le plus approprié, car le type par défaut (Variant) consomme beaucoup plus de mémoire, et demande aussi plus de temps à l'exécution (dans une boucle par exemple).
après chaque variable, il faut spécifier le type :
Dim wbk1, wbk2 As Workbook
==> wbk1 est un une variable de type Variant, wbk2 est une variable objet de type Workbook
Dim wbk1 As Workbook, wbk2 As Workbook
==> wbk1 et wbk2 sont des variables objet de type Workbook

Il est bon aussi de respecter quelques principes :
  • utiliser des noms de variable le plus parlant possible (comme tu le fais déjà)
  • préfixer la variable avec trois caractères résumant le type (strVariable pour un type String, intVariable pour Integer, lngVariable pour Long, wshVariable pour Worksheet, wbkVariable pour Workbook, etc...)
  • utiliser l'indentation : mettre en retrait les lignes de codes se trouvant dans une boucle (code plus lisible)
  • il y en a d'autres, mais c'est assez pour aujourd'hui :p
- Pour la citation 3:"Worksheet est un mot réservé de VBA, qui ne peut pas être utilisé comme variable". je nai pas compris en tout les cas ce code fonctionne.
Autant pour moi : ça a produit une erreur chez moi, car j'utilise toujours Option Explicit en tête de module. Et c'est ce qui a provoqué l'erreur. Effectivement, avec Worksheet, le code tourne...
mais, bon, je persiste : Worksheet est bien un terme utilisé par VBA (pour être précis, c'est une classe d'objet), donc j'évite de faire des déclarations qui ressembleraient à Dim Worksheet As Worksheet... :p
Voici un extrait de l'aide VBA :
Règles d'affectation de noms Visual Basic
Utilisez les règles suivantes pour nommer des procédures, des constantes, des variables et des arguments dans un module Visual Basic :
  • Utilisez une lettre comme premier caractère.
  • N'utilisez pas d'espace, de point (.), de point d'exclamation (!) ou les caractères @, &, $, # dans le nom.
  • Un nom ne peut compter plus de 255 caractères.
  • Généralement, vous ne devriez pas utiliser des noms identiques aux noms de fonction, d'instruction et de méthode de Visual Basic. Vous feriez double emploi des mots clés du langage. Pour utiliser une fonction, une instruction ou une méthode du langage intrinsèque en conflit avec un nom attribué, vous devez l'identifier explicitement. Faites précéder la fonction, l'instruction ou la méthode intrinsèque du nom de la bibliothèque de types associée. Par exemple, si vous avez une variable nommée Left, pour invoquer la fonction Left, vous devez employer VBA.Left.
  • Vous ne pouvez pas employer deux fois le même nom au même niveau de portée. Par exemple, vous ne pouvez pas déclarer deux variables nommées age dans la même procédure. Cependant, vous pouvez déclarer une variable privée nommée age et une variable de niveau procédure nommée age dans le même module. Note Visual Basic ne différencie pas les majuscules des minuscules, mais conserve la casse dans l'instruction de déclaration du nom.
- Pour la citation 2: "C'est plus "propre" que le Goto startover qui est hérité des premières génération de Basic, mais côté structuration du programme..." En quoi le goto n'est pas propre ?
Je suis peut-être un peu chatouilleux, surtout vis à vis de programmeurs non professionnels, mais si le programme prend de l'ampleur (si le nombre de lignes augmente), utiliser des Goto finit par faire ressembler le code à "un plat de nouilles" (en terme de structuration)
Merci pour ces conseils, c'est toujours interessant de savoir optimiser son code.
Le forum sert à ça :)
Je me permets de remettre une version où j'ai corrigé, notamment, le problème du FileToOpen = False
Dernière question : est-il nécessaire d'ouvrir le fichier ? Recueillir simplement le nom du fichier devrait suffire. A moins que j'ai loupé quelquechose...
 
Dernière édition:

Kobaya

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

- la citation 6 "wbk2 est bien défini comme un objet de type Workbook, mais wbk1 est défini comme Variant (voir l'aide)" ?
Il vaut toujours mieux définir une variable avec le type le plus approprié, car le type par défaut (Variant) consomme beaucoup plus de mémoire, et demande aussi plus de temps à l'exécution (dans une boucle par exemple).
après chaque variable, il faut spécifier le type :
Dim wbk1, wbk2 As Workbook
==> wbk1 est un une variable de type Variant, wbk2 est une variable objet de type Workbook
Dim wbk1 As Workbook, wbk2 As Workbook
==> wbk1 et wbk2 sont des variables objet de type Workbook

Il est bon aussi de respecter quelques principes :
  • utiliser des noms de variable le plus parlant possible (comme tu le fais déjà)
  • préfixer la variable avec trois caractères résumant le type (strVariable pour un type String, intVariable pour Integer, lngVariable pour Long, wshVariable pour Worksheet, wbkVariable pour Workbook, etc...)
  • utiliser l'indentation : mettre en retrait les lignes de codes se trouvant dans une boucle (code plus lisible)
  • il y en a d'autres, mais c'est assez pour aujourd'hui :p
- Pour la citation 3:"Worksheet est un mot réservé de VBA, qui ne peut pas être utilisé comme variable". je nai pas compris en tout les cas ce code fonctionne.
Autant pour moi : ça a produit une erreur chez moi, car j'utilise toujours Option Explicit en tête de module. Et c'est ce qui a provoqué l'erreur. Effectivement, avec Worksheet, le code tourne...
mais, bon, je persiste : Worksheet est bien un terme utilisé par VBA (pour être précis, c'est une classe d'objet), donc j'évite de faire des déclarations qui ressembleraient à Dim Worksheet As Worksheet... :p
Voici un extrait de l'aide VBA :
Règles d'affectation de noms Visual Basic
Utilisez les règles suivantes pour nommer des procédures, des constantes, des variables et des arguments dans un module Visual Basic :
  • Utilisez une lettre comme premier caractère.
  • N'utilisez pas d'espace, de point (.), de point d'exclamation (!) ou les caractères @, &, $, # dans le nom.
  • Un nom ne peut compter plus de 255 caractères.
  • Généralement, vous ne devriez pas utiliser des noms identiques aux noms de fonction, d'instruction et de méthode de Visual Basic. Vous feriez double emploi des mots clés du langage. Pour utiliser une fonction, une instruction ou une méthode du langage intrinsèque en conflit avec un nom attribué, vous devez l'identifier explicitement. Faites précéder la fonction, l'instruction ou la méthode intrinsèque du nom de la bibliothèque de types associée. Par exemple, si vous avez une variable nommée Left, pour invoquer la fonction Left, vous devez employer VBA.Left.
  • Vous ne pouvez pas employer deux fois le même nom au même niveau de portée. Par exemple, vous ne pouvez pas déclarer deux variables nommées age dans la même procédure. Cependant, vous pouvez déclarer une variable privée nommée age et une variable de niveau procédure nommée age dans le même module. Note Visual Basic ne différencie pas les majuscules des minuscules, mais conserve la casse dans l'instruction de déclaration du nom.
- Pour la citation 2: "C'est plus "propre" que le Goto startover qui est hérité des premières génération de Basic, mais côté structuration du programme..." En quoi le goto n'est pas propre ?
Je suis peut-être un peu chatouilleux, surtout vis à vis de programmeurs non professionnels, mais si le programme prend de l'ampleur (si le nombre de lignes augmente), utiliser des Goto finit par faire ressembler le code à "un plat de nouilles" (en terme de structuration)
Merci pour ces conseils, c'est toujours interessant de savoir optimiser son code.
Le forum sert à ça :)
Je me permets de remettre une version où j'ai corrigé, notamment, le problème du FileToOpen = False
Dernière question : est-il nécessaire d'ouvrir le fichier ? Recueillir simplement le nom du fichier devrait suffire. A moins que j'ai loupé quelquechose...
 
Dernière édition:

Kobaya

XLDnaute Occasionnel
Re : Détecter les noms des feuilles d’un workbook

- la citation 6 "wbk2 est bien défini comme un objet de type Workbook, mais wbk1 est défini comme Variant (voir l'aide)" ?
Il vaut toujours mieux définir une variable avec le type le plus approprié, car le type par défaut (Variant) consomme beaucoup plus de mémoire, et demande aussi plus de temps à l'exécution (dans une boucle par exemple).
après chaque variable, il faut spécifier le type :
Dim wbk1, wbk2 As Workbook
==> wbk1 est un une variable de type Variant, wbk2 est une variable objet de type Workbook
Dim wbk1 As Workbook, wbk2 As Workbook
==> wbk1 et wbk2 sont des variables objet de type Workbook

Il est bon aussi de respecter quelques principes :
  • utiliser des noms de variable le plus parlant possible (comme tu le fais déjà)
  • préfixer la variable avec trois caractères résumant le type (strVariable pour un type String, intVariable pour Integer, lngVariable pour Long, wshVariable pour Worksheet, wbkVariable pour Workbook, etc...)
  • utiliser l'indentation : mettre en retrait les lignes de codes se trouvant dans une boucle (code plus lisible)
  • il y en a d'autres, mais c'est assez pour aujourd'hui :p
- Pour la citation 4: "FileToOpen = Application.GetOpenFilename("Fichiers texte (*.txt), *.txt") doit être placé dans le Do Loop, sinon, on charge à chaque fois le même fichier". jai essaye ca na pas marche. il me proposait en boucle d'ouvrir un fichier. jai reussi autremant avec le code de Temjeh "If FileToOpen = False Then Exit Sub
Workbooks.OpenText Filename:=FileToOpen , Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _ ......."
Ca marche...
Corrigé dans la version jointe

- Pour la citation 3:"Worksheet est un mot réservé de VBA, qui ne peut pas être utilisé comme variable". je nai pas compris en tout les cas ce code fonctionne.
Autant pour moi : ça a produit une erreur chez moi, car j'utilise toujours Option Explicit en tête de module. Et c'est ce qui a provoqué l'erreur. Effectivement, avec Worksheet, le code tourne...
mais, bon, je persiste : Worksheet est bien un terme utilisé par VBA (pour être précis, c'est une classe d'objet), donc j'évite de faire des déclarations qui ressembleraient à Dim Worksheet As Worksheet... :p
Voici un extrait de l'aide VBA :
Règles d'affectation de noms Visual Basic
Utilisez les règles suivantes pour nommer des procédures, des constantes, des variables et des arguments dans un module Visual Basic :
  • Utilisez une lettre comme premier caractère.
  • N'utilisez pas d'espace, de point (.), de point d'exclamation (!) ou les caractères @, &, $, # dans le nom.
  • Un nom ne peut compter plus de 255 caractères.
  • Généralement, vous ne devriez pas utiliser des noms identiques aux noms de fonction, d'instruction et de méthode de Visual Basic. Vous feriez double emploi des mots clés du langage. Pour utiliser une fonction, une instruction ou une méthode du langage intrinsèque en conflit avec un nom attribué, vous devez l'identifier explicitement. Faites précéder la fonction, l'instruction ou la méthode intrinsèque du nom de la bibliothèque de types associée. Par exemple, si vous avez une variable nommée Left, pour invoquer la fonction Left, vous devez employer VBA.Left.
  • Vous ne pouvez pas employer deux fois le même nom au même niveau de portée. Par exemple, vous ne pouvez pas déclarer deux variables nommées age dans la même procédure. Cependant, vous pouvez déclarer une variable privée nommée age et une variable de niveau procédure nommée age dans le même module. Note Visual Basic ne différencie pas les majuscules des minuscules, mais conserve la casse dans l'instruction de déclaration du nom.
- Pour la citation 2: "C'est plus "propre" que le Goto startover qui est hérité des premières génération de Basic, mais côté structuration du programme..." En quoi le goto n'est pas propre ?
Je suis peut-être un peu chatouilleux, surtout vis à vis de programmeurs non professionnels, mais si le programme prend de l'ampleur (si le nombre de lignes augmente), utiliser des Goto finit par faire ressembler le code à "un plat de nouilles" (en terme de structuration)

Merci pour ces conseils, c'est toujours interessant de savoir optimiser son code.
Le forum sert à ça :)
Dernière question : est-il nécessaire d'ouvrir le fichier ? Recueillir simplement le nom du fichier devrait suffire. A moins que j'ai loupé quelquechose...
 

Pièces jointes

  • romainchu78.zip
    13.2 KB · Affichages: 19
  • romainchu78.zip
    13.2 KB · Affichages: 17
  • romainchu78.zip
    13.2 KB · Affichages: 21

Discussions similaires

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 979
dernier inscrit
bderradji