IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

probleme avec workbook.name


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    cadre administratif
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : cadre administratif

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Par défaut probleme avec workbook.name
    Bonjour à tous.
    Je viens de m'inscrire et j'ai chercher sans succès une réponse à mon problème.

    Je fait une macro de ventilation.

    Pour commencer je souhaite ouvrir le classeur à ventiler puis faire diverses manip et ensuite revenir sur ce classeur que je n'ai pas fermé.
    Je commence donc par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chemin_import.Caption = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*")  '      attribue le choix à chemin_import
     Workbooks.Open Filename:=chemin_import.Caption  '                                                      ouvre le classeur choisi
          nom_fichier = ActiveWorkbook.Name               '                                                          attribue le nom du classeur à ventiler à la variable nom_fichier
    ensuite je voulais utiliser ma variable nom_fichier (variable publique) pour faire :
    workbooks(nom_fichier).activatel'ennui c'est que dès le départ ma variable nom_fichier ajoute un nombre à mon nom de fichier !!!

    lorsque je met une msgbox de controle juste sous ma troisième ligne : MsgBox ActiveWorkbook.Name & " _ " & chemin_import.Captionj'obtiens en résultat pour le fichier toto : toto _ toto1 (puis à chaque nouvelle tentative toto2, toto3 ect ...

    Je précise qu'a ce stade je n'ai encore créer aucune boucle ni aucune incrémentation.


    voici le code complet de la macro qui s’exécute lorsque je clique sur le premier bouton de mon userform :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    Private Sub B_import_Click()   '    lance le choix du claseur a ventiler
     
     
        chemin_import.Caption = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*")  '  attribue le choix à chemin_import
     
     
       If Left(chemin_import.Caption, 4) <> "Faux" Then  ' vérifie qu'un nom de fichier a été choisi
     
          Workbooks.Open Filename:=chemin_import.Caption  '   ouvre le classeur choisi
          nom_fichier = ActiveWorkbook.Name               ' attribue le nom du classeur à ventiler à la variable nom_fichier
     
        MsgBox chemin_import.Caption & "////" & nom_fichier
     
          Workbooks(nom_fichier).Sheets(1).Activate     ' selectionne la premiere feuille du classeur
          Dim var_col As Integer
          Dim var_critere As String
     
          var_col = 1
     
     
     
          Do While Workbooks(nom_fichier).Sheets(1).Cells(2, var_col).Value <> ""      '    récupére tous les entete de colonnes
     
              CB_critere.AddItem Workbooks(nom_fichier).Sheets(1).Cells(2, var_col).Value   ' les ajoute à la combobox CB_critere.
     
              var_col = var_col + 1
     
          Loop
     
     
       End If
     
     
    End Sub

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, une solution possible consiste à utiliser la fonction Left pour extraire le nom de fichier sans l’extension et le numéro qui est ajouté automatiquement . Vous pouvez utiliser la fonction InStr pour trouver la position du point dans le nom de fichier et ensuite utiliser la fonction Left pour extraire le nom de fichier sans l’extension et le numéro. Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    chemin_import.Caption = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*") ' attribue le choix à chemin_import
     
    If Left(chemin_import.Caption, 4) <> "Faux" Then ' vérifie qu'un nom de fichier a été choisi
     
        Workbooks.Open Filename:=chemin_import.Caption ' ouvre le classeur choisi
        Dim nom_fichier As String
        Dim pos_point As Integer
        Dim pos_espace As Integer
     
        pos_point = InStr(1, ActiveWorkbook.Name, ".")
        pos_espace = InStr(1, ActiveWorkbook.Name, " ")
     
        If pos_espace > 0 Then
            nom_fichier = Left(ActiveWorkbook.Name, pos_espace - 1)
        Else
            nom_fichier = Left(ActiveWorkbook.Name, pos_point - 1)
        End If
     
        MsgBox chemin_import.Caption & "////" & nom_fichier
     
    End If

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Quelle est le type de la variable objet chemin_import ?
    Pour moi, il suffirait simplement de définir une variable de type String pour récupérer le chemin et le nom du fichier que renvoie la méthode GetOpenFilename et ensuite d'utiliser une variable objet de type Workbook pour assigner l'objet que renvoie Workbooks.Open
    Sauf si vous ouvrez un classeur comme modèle, je ne vois pas la raison d'avoir une incrémentation de son nom

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub t()
      Dim wkb As Workbook
      Dim FullName As String
      FullName = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*")
      Set wkb = Workbooks.Open(Filename:=FullName)
      MsgBox "Vous avez ouvert le classeur " & wkb.Name
      Set wkb = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Candidat au Club
    Homme Profil pro
    cadre administratif
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : cadre administratif

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Par défaut
    Citation Envoyé par Franc Voir le message
    Bonjour, une solution possible consiste à utiliser la fonction Left pour extraire le nom de fichier sans l’extension et le numéro qui est ajouté automatiquement . Vous pouvez utiliser la fonction InStr pour trouver la position du point dans le nom de fichier et ensuite utiliser la fonction Left pour extraire le nom de fichier sans l’extension et le numéro. Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    chemin_import.Caption = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*") ' attribue le choix à chemin_import
     
    If Left(chemin_import.Caption, 4) <> "Faux" Then ' vérifie qu'un nom de fichier a été choisi
     
        Workbooks.Open Filename:=chemin_import.Caption ' ouvre le classeur choisi
        Dim nom_fichier As String
        Dim pos_point As Integer
        Dim pos_espace As Integer
     
        pos_point = InStr(1, ActiveWorkbook.Name, ".")
        pos_espace = InStr(1, ActiveWorkbook.Name, " ")
     
        If pos_espace > 0 Then
            nom_fichier = Left(ActiveWorkbook.Name, pos_espace - 1)
        Else
            nom_fichier = Left(ActiveWorkbook.Name, pos_point - 1)
        End If
     
        MsgBox chemin_import.Caption & "////" & nom_fichier
     
    End If
    Merci pour votre réponse.
    Je pense que je vais utiliser votre idée. J'y avais pensé mais je pensais logique d'utiliser une propriété (workbook.name) qui est normalement destinée à éviter ce genre de manipulation.

    Par contre il ne faut pas utiliser les formules sur le workbook.name car on retombe sur le même problème.
    Je vais devoir utiliser le nom du chemin complet et isoler le nom qui se trouve après le dernier \

    En tout cas merci beaucoup !

  5. #5
    Candidat au Club
    Homme Profil pro
    cadre administratif
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : cadre administratif

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Quelle est le type de la variable objet chemin_import ?
    Pour moi, il suffirait simplement de définir une variable de type String pour récupérer le chemin et le nom du fichier que renvoie la méthode GetOpenFilename et ensuite d'utiliser une variable objet de type Workbook pour assigner l'objet que renvoie Workbooks.Open
    Sauf si vous ouvrez un classeur comme modèle, je ne vois pas la raison d'avoir une incrémentation de son nom

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub t()
      Dim wkb As Workbook
      Dim FullName As String
      FullName = Application.GetOpenFilename("Fichiers Excel (*.xl*), *.xl*")
      Set wkb = Workbooks.Open(Filename:=FullName)
      MsgBox "Vous avez ouvert le classeur " & wkb.Name
      Set wkb = Nothing
    End Sub

    Merci pour votre réponse.
    J'ai déja essayé avec dim chemin as string mais sans résultat
    Lorsque j'utilise votre macro je trouve le même problème : wkb.name prend le nom du fichier plus un numéro d'orde : toto devient toto13
    J'avoue que c'est très étrange

    En fait je voulais justement créer un modèle.

    L'idée était
    1-ouvrir un classeur d'origine puis supprimer toutes les valeurs en gardant les formats, listes de validations et autres...
    2 -Enregistrer le résultat en modèle,
    3- revenir sur le classeur d'origine et faire une sélection (par exemple par code postal) et copier la sélection dans le modèle vide,
    4- Enregistrer le classeur obtenu sous le nom voulu (ex : toto_75001, toto75002....)
    5 - revenir sur le classeur d'origine et recommencer à partir de l'étape 3

    J'utilise déjà une macro de ventilation qui marchait très bien jusqu'à ce que mes collègues me réclament des listes de validation. Le problème c'est que lorsque l'on copie des classeurs avec listes de validation on obtient des références circulaires et des liens corrompus.

    La solution du modèle mes semblait simple et sure mais je n'avais pas anticipé les problèmes de noms de fichiers.
    Reste la solution d'ouvrir et fermer à chaque fois ou d'utiliser les numéro d'ordre des workbooks mais je n'aime pas trop car risque de plantage.

    Du coup j'aimerais bien comprendre pourquoi le woorkbook.name me donne cette bizarrerie.

    Bonne journée.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai déja essayé avec dim chemin as string mais sans résultat
    Lorsque j'utilise votre macro je trouve le même problème : wkb.name prend le nom du fichier plus un numéro d'orde : toto devient toto13
    J'avoue que c'est très étrange
    C'est effectivement très étrange.
    Tous les codes que je publie sont testés et je peux vous affirmer que je ne rencontre pas le problème que vous évoquez.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 575
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 575
    Par défaut
    A tout hasard, est-ce que les fichiers choisis sont des fichiers excel classique ou des fichiers modèles (xltx/xltm)?

    L'ajout d'un numéro me fait penser à ce que qui se passe quand on créé des nouveaux fichiers excel à la suite qui se nomment classeur1, classeur2, etc)

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 524
    Par défaut
    Salut,

    Excel exige que les fichiers ouverts aient des noms unique.
    En mode "utilisateur", même s'ils sont dans des dossiers différents, ouvrir 2 fichiers portant le même nom générera une complainte.

    Je suspecte qu'en mode "programmé", Excel ajoute d'autorité une particule (sous forme numérique) afin de garantir l'unicité des noms.
    Dit autrement: Ton problème pue les fichiers ouverts et jamais refermés.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La solution du modèle mes semblait simple et sure mais je n'avais pas anticipé les problèmes de noms de fichiers.
    Pour ouvrir un fichier excel en vue de l'utiliser comme modèle, il faut alors utiliser la méthode Add de la collection Workbooks en n'oubliant pas d'alimenter l'argument Template mais dans cas, il y a une incrémentation du nom du fichier ce qui est parfaitement normal pour un modèle.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub OpenTemplate()
      ' Déclaration + Affectation des variables
      Const SubFolder As String = "\Template\"                     ' Sous-répertoire des modèles
      Const TemplateName As String = "Template_Note de Frais.xlsx" ' Nom du modèle
      Dim wkb As Workbook
      Dim CurrentPath As String                                    ' Répertoire principal
      Dim FullName As String                                       ' Nom complet (Répertoire+fichier modèle
      CurrentPath = ThisWorkbook.Path
      FullName = CurrentPath & SubFolder & TemplateName
      ' Début
      Set wkb = Workbooks.Add(Template:=FullName)                  ' Charge le modèle comme nouveau document
      '
      ' Traitement
      '
      ' Fin
      Set wkb = Nothing
    End Sub
    Il ne faudra pas oublier de le sauver sous le nouveau nom.

    @deedolith
    Je suspecte qu'en mode "programmé", Excel ajoute d'autorité une particule (sous forme numérique) afin de garantir l'unicité des noms.
    En tous les cas pas avec la version 365. Il n'ouvre pas un autre classeur du même nom si celui-ci est déjà ouvert.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. Probleme avec WorkBooks.Open et plateforme Excel 32/64 bits ?
    Par chachaboy dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/04/2020, 15h37
  2. Probleme avec un code .name
    Par kyros21 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 13/01/2012, 11h21
  3. probleme avec VisualState x:Name="focused"
    Par lilibad dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 05/09/2011, 16h46
  4. problem avec django_qbe "error Empty modul name"
    Par midialzer dans le forum Django
    Réponses: 0
    Dernier message: 12/01/2011, 14h49
  5. [VC++] probleme avec le Pipe Named
    Par ksoft dans le forum Visual C++
    Réponses: 2
    Dernier message: 21/07/2006, 18h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo