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 :

Problème avec nom d'un classeur en variable [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut Problème avec nom d'un classeur en variable
    Bonjour le forum,

    Je viens à nouveau vers vous car j'ai une petite incompréhension et j'aurais besoins d'un éclaircissement.
    Dans un premier temps voici mes codes :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Public Commande As String
    Public Datec As String
    Public Nomcde As String
    Public Cheminc As String
    Public Nomc As String
    Public yc As Integer
    Public Nbc As String
    Public dicoc As New Dictionary
    Public Wb As String
     
    Sub essai()
    Wb = ActiveWorkbook.Name
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim Repertoire As FileDialog
     
    For y = 1 To Cells(50, Cells.Columns.Count).End(xlToLeft).Column
    If Not dicoc.Exists(Cells(50, y).Value) Then
    dicoc.Add Cells(50, y).Value, Cells(50, y).Column - a
    a = y
    End If
    Next y
     
    NCom.Show
     
    Set xlApp = CreateObject("Excel.Application")
        xlApp.SheetsInNewWorkbook = dicoc.Count
    Set xlBook = xlApp.Workbooks.Add
        xlBook.SaveAs (Cheminc & "\- X - " & Commande & " - Truc.xls")
        xlApp.Visible = True
        Nomc = "- X - " & Commande & " - Truc.xls"
     
    For yc = 1 To dicoc.Count
    Nbc = dicoc("cellule " & yc)
    Set xlSheet = xlBook.Worksheets(yc)
    xlSheet.Name = "Cellule " & yc
    Sheets(yc).Activate
    Call Mise_en_page
    Call Mise_en_paquet
    Set xlSheet = Nothing
    Next yc
     
    End Sub
    Suivi de (dans le même module) :
    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
    Sub Mise_en_page()
     
        Workbooks(Nomc).Sheets(yc).Columns("A:M").ColumnWidth = 12
        Workbooks(Nomc).Sheets(yc).Columns("F:F").ColumnWidth = 2.29
        Workbooks(Nomc).Sheets(yc).Range("E1:H2").Select
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .WrapText = True
            .MergeCells = True
            .Font.Size = 16
        End With
     
        Workbooks(Nomc).Sheets(yc).Range("B6").FormulaR1C1 = "CDE :": Workbooks(Nomc).Sheets(yc).Range("B6").Font.Size = 14: Workbooks(Nomc).Sheets(yc).Range("C6").Value = Commande
        Workbooks(Nomc).Sheets(yc).Range("B7").FormulaR1C1 = "Chantier :": Workbooks(Nomc).Sheets(yc).Range("B7").Font.Size = 14: Workbooks(Nomc).Sheets(yc).Range("C7").Value = Nomcde
        Workbooks(Nomc).Sheets(yc).Range("B10").FormulaR1C1 = "Sortie :": Workbooks(Nomc).Sheets(yc).Range("B10").Font.Bold = True: Workbooks(Nomc).Sheets(yc).Range("B10").Font.Size = 14
        Workbooks(Nomc).Sheets(yc).Range("D10").FormulaR1C1 = "Nb colis :": Workbooks(Nomc).Sheets(yc).Range("E10").FormulaR1C1 = Nbc
        Workbooks(Nomc).Sheets(yc).Range("E11").FormulaR1C1 = "Rq :": Workbooks(Nomc).Sheets(yc).Range("E11").Font.Bold = True
        Workbooks(Nomc).Sheets(yc).Range("F11").FormulaR1C1 = "1 latte ": Workbooks(Nomc).Sheets(yc).Range("F11").Font.Bold = True
        Workbooks(Nomc).Sheets(yc).Range("E1").FormulaR1C1 = "Schéma"
     
    End Sub
    Comme on peut le voir j'utilise une variable (Nomc) pour sauvegarder le nom du nouveau classeur créé. Or quand je l'a réutilise dans la macro Mise_en_page il me dit : "Erreur 9 : l'indice n'appartient pas à la sélection"

    Donc si quelqu'un à une petite idée merci à lui

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    NomC a une portée "procédure", elle n'ira pas plus loin que la procédure où elle est déclarée.

    Si les deux procédures sont dans le même module, tu peux étendre sa portée au module complet, en la déclarant tout en haut du module (avant les procédures)

    Si les deux procédures sont dans des modules différents, tu dois passer la variable en publique (déclaration tout en haut d'un module standard en remplaçant Dim par Public)


    Autre méthode (au vu de ta procédure mise en page, c'est celle que je conseille), ajouter un paramètre à ta procédure, qui attend de recevoir une chaine de caractère. Et quand tu appelles la procédure, tu lui passes NomC en paramètre

  3. #3
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Merci de ta réponse joe mais mon Nomc est bien en variable Public

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Effectivement, j'ai mélangé tes deux blocs de déclaration (Public et ceux de la procédure).


    Du coup, en me penchant plus en détail, l'ai l'impression que tu crées une nouvelle instance Excel afin de créer un classeur et de l'enregistrer.

    Dans ta procédure principale, étant donné que tout est rattaché à l'instance Excel (xlApp) créeen tu n'as aucune difficulté à y accéder.
    Mais quand tu passes sur l'autre procédure, tu travailles sur un Workbook présent dans l'instance hôte du classeur contenant les macros, et pas dans la seconde instance. Qui expliquerait qu'aucun classeur de la collection des classeurs de l'instance n'est celui que tu cherches (car il est en dans une autre instance)


    Regarde si ça ne serait pas la piste à étudier ?

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour, bonjour !

    Et dire le classeur serait inutile dans la procédure Mise_en_page pour peu de comprendre et respecter le modèle objet d'Excel !

    Il suffit de passer en paramètre de cette procédure un objet Worksheet du genre Sub Mise_en_page(Ws As Worksheet)

    Et pour appeler cette procédure ce serait Mise_en_page Activesheet car la feuille est déjà activée dans le code …

    Au passage un bon code n'utilise pas ces affreux ralentisseurs d'Activate et de Select,
    ni une seconde instance d'Excel via CreateObject, quel gâchis !

    Si la feuille n'est pas activée mais son classeur actif : Mise_en_page Worksheets(yc)

    Et si le classeur n'est pas actif : Mise_en_page xlBook.Worksheets(yc)

    _________________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  6. #6
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Regarde si ça ne serait pas la piste à étudier ?
    En effet je n'y avais pas pensé, je vais regarder

    Il suffit de passer en paramètre de cette procédure un objet Worksheet du genre Sub Mise_en_page(Ws As Worksheet)

    Et pour appeler cette procédure ce serait Mise_en_page Activesheet car la feuille est déjà activée dans le code …
    Je t'avoue Marc-L que là j'ai pas tout compris

    Au passage un bon code n'utilise pas ces affreux ralentisseurs d'Activate et de Select,
    ni une seconde instance d'Excel via CreateObject, quel gâchis !
    Pour ce qui est des activate et select c'est normal c'est avec l'enregistreur que j'ai eu ce bout de code et à part changé les noms de cellules etc je ne l'ai pas remanier
    Par contre si il y a pas besoin de seconde instance je suppose que créer un nouveau classeur s'écrit ainsi :

  7. #7
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Je t'avoue Marc-L que là j'ai pas tout compris
    Dans Mise_en_page(), tu utilises toujours la même feuille. Tu peux donc la mettre en paramètre de ta fonction de mise en forme, comme ça il n'y aura théoriquement plus besoin de préciser le classeur et la feuille dans ta fonction de mise en forme.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  2. Problème avec un lien qui contient deux variables
    Par pierrot10 dans le forum Valider
    Réponses: 1
    Dernier message: 16/04/2009, 14h00
  3. [XML] Problème avec nom de la balise
    Par weaveur dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/08/2007, 11h57
  4. [MySQL] problème avec la récupération des valeurs des variables POST
    Par Jasmine80 dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 11/05/2007, 16h08
  5. Problème avec un pointeur global sur une variable manager
    Par sepullayer dans le forum C++/CLI
    Réponses: 12
    Dernier message: 26/03/2007, 13h00

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