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 :

Selection de zone avec variable dans une boucle [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut Selection de zone avec variable dans une boucle
    Bonjour à tous,

    Tout d'abord permettez-moi de vous remercier d'avance de lire la suite et pour votre aide, étant donné que je suis un grand débutant sur VBA (j'ai commencé il y a moins d'un mois en autodidacte...).

    J'essaie en ce moment de créer à partir d'un fichier répertoire une liste de fichiers à ouvrir, pour lesquels je sélectionne ensuite certains onglets définis à l'avance dans mon excel répertoire, pour ensuite les exporter en pdf.

    Je n'ai aucun soucis pour créer une boucle d'ouverture de fichier, mais je n'arrive pas l'étape de sélection des onglets au nombre variable.

    Concrètement, ci dessous:

    Fichier source
    Fichier A Onglet C Onglet D Onglet E Onglet F
    Fichier B Onglet G Onglet H
    Fichier C

    J'ai un fichier source excel., dans ce fichier source, j'ai un onglet 1 qui comprend le chemin de fichiers sur lesquels j'effectue pas mal d'opérations; et un onglet 2 qui correspond à ce qui a si dessus, c'est à dire une liste de fichiers avec des noms d'onglets dans ces fichiers à exporter en pdf.

    En A2 j'ai le nom du fichier A, en A3 le fichier B, etc.
    Je veux ouvrir le fichier A, sélectionner les onglets C,D,E,F, exporter sous pdf, fermer le fichier A, ; ouvrir le fichier B, sectionner les onglets G & H, exporter sous pdf, etc.

    Pour le moment voici mon code:
    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
    Sub Refresh_BMU()
     
    Dim SVSheet As Worksheet
    Dim x As Long
    Dim i As Integer
    Dim j As Integer
    Dim t As Integer
    Dim u As Integer
    Dim v As Integer
    Dim MemoVisible As Boolean
    Dim MemoAutoRecover As Boolean
    Dim MemoSheetName As String
    Dim TestSVContent As Boolean
    Dim StartRefreshTime As Date
    Dim PreviousRetName As String
    Dim CountSheet, ConnectedSheetsCount As Integer
    Dim vtGrid, ContentType As Variant
    Dim server, user, Passw, appli, Db, FriendlyName, URL, provider As Variant
    Dim sts As Variant
    Dim onglet1 As String
    Dim onglet2 As String
    Dim txt As Pictures
     
    onglet1 = Range("C20")
    onglet2 = Range("C21")
     
    Worksheets(onglet1).Select
    t = Application.WorksheetFunction.CountA(Range("A:A"))
     
    For i = 2 To t
    Application.DisplayAlerts = False
    Workbooks.Open Filename:=Range("A" & i), UpdateLinks:=Range("C" & i)

    Cette partie de code me permet dans mon onglet 1 d'ouvrir un à 1 les fichiers et j'ai ensuite un pavé d'une trentaine de lignes de codes pour opérer pas mal de modifications mais cela ne concerne pas mon problème donc je ne les remets pas ici.

    Ensuite, je ferme les onglets dans ma boucle un par un et je reprends avec la partie de code qui bloque:

    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
    ActiveWorkbook.Close
     
    Worksheets(onglet1).Select
    Set C1 = ActiveWorkbook
     
    Workbooks.Open Filename:=Range("A" & i), UpdateLinks:=Range("C" & i)
    Set C2 = ActiveWorkbook
     
    C1.Activate
     
    Worksheets(onglet2).Select
    u = Application.WorksheetFunction.CountA(Rows(i))
     
    slct = Array(Cells(i, i), Cells(i, u))
    slct2 = slct.Text
     
    C1.Activate
    C1.Worksheets(onglet2).Select
     
    C2.Activate
     
    Sheets(Array(slct)).Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF

    Concrètement, ce que je fais, c'est que je bascule sur mon onglet 2 qui contient la liste de fichiers à ouvrir et leurs onglets respectifs à exporter sous pdf.
    J'arrive à créer un boucle pour savoir le nombre de fichiers à ouvrir (peut varier), ainsi que compter le nombre d'onglets qui seront pris dans ma sélection pour export en pdf (variable aussi).
    Mais je n'arrive pas à stocker le nom de ces onglets sous forme d'un tableau, ou d'une chaîne de caractère, pour que lorsque j'ouvre mon fichier, cette chaine de caractère soit appelée et désignée comme onglets à sélectionner.

    J'y arrive s'il n'y a qu'un seul onglet à sélectionner, mai pas plusieurs.
    Je suppose qu'il me faudrait une variable temporaire, pour stocker le nom de l'onglet 1, puis stocker lors de la seconde boucle le nom de l’onglet 1 + l'onglet 2, etc.



    J'espère que cela peut être clair?
    Sinon en tout cas merci pour votre aide, malgré de nombreuses recherches je n'y arrive pas et mes très maigres connaissances me laissent démuni

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je te conseille d'utiliser plutôt la propriété End(xlToLeft) plutôt qu'une fonction Count() pour déterminer la dernière cellule remplie dans une ligne.
    https://msdn.microsoft.com/fr-fr/lib...9(v=office.15)

    Ca donnerait quelque chose comme ça : Cells(i, Columns.Count).End(xlToLeft).Column pour obtenir le numéro de la dernière colonne remplie.

    Ensuite, pour récupérer les noms de chaque onglets, il faut faire une boucle For To allant de la première colonne où se trouve un nom d'onglet jusqu'à la valeur obtenue par la formule ci-dessus.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Bonjour Menhir, et merci pour ton aide,

    Alors en fait, j'avais effectivement réussi dans une de mes pistes, à faire une boucle du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     For v = i to u
    slct = Cells(i,v).text
    Ce qui me permettait d'obtenir le nom de chaque onglet.

    Mais je n'arrive pas en fait l'étape qui consisterait à stocker le nom de l'onglet, puis ajouter le nom de l'onglet suivant, etc., pour ensuite obtenir une variable que je peux appeler pour sélectionne précisément les onglets que je veux dans le second fichier.

    concrètement cela me donnait

    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
    Worksheets(onglet2).Select
    u = Application.WorksheetFunction.CountA(Rows(i))
     
    For v = i to u
     
    slct = (Cells(i, v).text
     
    'La il me manque une étape pour storer cette valeur et à la boucle suivante obtenir une var du style:
    slct2 = slct i, slcti+1; le tout sous un format qui permette la dernière étape qui est de sélectionner les bons onglets dans le second fichier 
     
    Next
     
     
    C2.Activate
     
    Sheets(Array(slct)).Select

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Après réflexion j'ai compris le soucis,

    En fait j'essaie de créer un tableau finalement d'éléments que j'initialise en même temps.
    Ma solution est donc la suivante:

    Je modifie mon excel de base, je créé une concatenation de mes noms d'onglets pour précréer la liste d'onglets concernés; ce qui me permet de ne pas ajouter une autre boucle et de simplement faire appel à la valeur d'une seule cellule.

    ça me donne donc une partie finale de code sous forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C1.Activate
     
    Worksheets(onglet2).Select
     
    slct = Cells(i, 2).Text
    nompdf = Cells(i, 1).Text
     
    C2.Activate
     
    Sheets(Array(slct)).Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        nompdf, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False
    Ce n'est pas ce que je cherchais mais je crois que je fais face à une limite d'excel; je ne vois aucun moyen pour déclarer une nouvelle variable qui change au cours de la boucle tout en gardant la valeur précédente

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par LBaber Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     For v = i to u
    slct = Cells(i,v).text
    Je ne suis pas sûr de comprendre ce que tu veux faire là.
    Si j'ai bien compris, tu as un nom de fichier par ligne (la variable i repérant la ligne courante) et les noms d'onglets dans des colonnes de cette même ligne.

    Donc, si ta variable v représente le numéro de colonne, pourquoi commencer son comptage au numéro de la ligne courante ????
    Tes noms d'onglets sont placés "en escalier", chaque liste débutant une colonne plus loin que la précédente ?
    Je doute que ce soit le cas.

    Donc réfléchit à la façon de repérer tes colonnes de noms d'onglet : où est-ce que ça commence ? Où est-ce que ça finit ?

    Mais je n'arrive pas en fait l'étape qui consisterait à stocker le nom de l'onglet, puis ajouter le nom de l'onglet suivant, etc.,
    Je ne comprends pas du tout ton explication : pourquoi "stocker" le nom d'onglet ?
    A partir du moment où tu as le numéro de ligne et le numéro de colonne, cette valeur est accessible avec un simple objet Cells().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    u = Application.WorksheetFunction.CountA(Rows(i))
    Je le répète, le Count, c'est une mauvaise idée.
    End() est bien plus approprié.

    Prends le temps d'y réfléchir : que représente "v" ? que représente "i" ? que représente "u" ?

    'La il me manque une étape pour storer cette valeur et à la boucle suivante obtenir une var du style:
    Non. Ce qu'il te manque, c'est de comprendre ce que représentent les différents éléments d'une boucle For To.

    C2.Activate
    Une fois que tu auras compris ce qui précède, tu verras que le Activate est sans intérêt.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Si j'ai bien compris, tu as un nom de fichier par ligne (la variable i repérant la ligne courante) et les noms d'onglets dans des colonnes de cette même ligne.
    Oui tout à fait,

    Donc, si ta variable v représente le numéro de colonne, pourquoi commencer son comptage au numéro de la ligne courante ?
    C'est une erreur de ma part, je commence toujours en 2; j'avais fait tourner sur i car ma première occurrence est i = 2, mais c'est bien entendu for v = 2 to u.

    Mais en fait, pas sûr d'être clair, mais avant de basculer sur mon second classeur, il faut que j'ai en fait en stock une variable qui comprend:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    slct = Cells (2,i) & Cells (3,i) & ...  Cells (v,2)
    Pour pouvoir dans mon second classeur faire mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sheets(Array(slct)).Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        nompdf, Quality:= _
    etc.


    Et je réitère la boucle i fois.

    Prends le temps d'y réfléchir : que représente "v" ? que représente "i" ? que représente "u" ?
    J'ai bien compris que i est égal à mon nombre de fichiers; et il se trouve que j'utilise également cette valeur comme numéro de ligne où se trouve le nom du fichier sur mon second onglet.
    u est mon nombre d'onglets.

    Après, je pense qu'il faut bien que je bascule sur mon second fichier, d'ou le fait que j'ai écris C2.Activate.

    S'il y a autrement je suis preneur.

    Dans l'ensemble je suis un énorme débutant..

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Je réécris un peu ce que j'ai compris et j'essaie de faire plus synthétique car ce n'est pas clair.

    J'ai une feuille du style:

    Nom fichier
    Fichier A Onglet 1 Onglet 2 Onglet 3
    Fichier B Onglet 4 Onglet 5
    Fichier C

    Je veux, depuis mon fichier de contrôle, ouvrir le fichier A, puis sélectionner les onglets 1,2 & 3 et les exporter sous PDF.

    De ce que je comprends, les étapes sont donc:

    Compter le nombre de fichiers,
    Compter le nombre d'onglets à sélectionner par fichier,
    Ouvrir le premier fichier, sélectionner les onglets appropriés, les exporter sous pdf,
    Passer au second fichier, etc.

    Il y a donc, une boucle sur les fichiers, et une autre sur chaque fichier pour le nombre d'onglets = nombre colonnes non vides.

    Je n'ai aucun soucis pour ouvrir les fichiers les uns après les autres si je veux.
    J'arrive à compter le nombre d'onglet.

    Ce que je n'arrive pas, c'est lorsque j'ouvre un des fichiers, sélectionner les onglets appropriés (dont le nom se trouve dans le fichier de controle)

    Il faut donc que:
    Je store le nom du fichier,
    Je store les noms des onglets à ouvrir,
    J'ouvre le fichier et sélectionne les ongelts
    J'exporte sous PDF et passe au fichier suivant (en repassant par mon fichier de suivi)

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par LBaber Voir le message
    C'est une erreur de ma part, je commence toujours en 2; j'avais fait tourner sur i car ma prmière occurence est i = 2, mais c'est bien entendu for v = 2 to u.
    Tu es sur la bonne voie mais réfléchis encore : que représente "u" ? Essaye de te faire un exemple et de voir si ça représentera effectivement la borne supérieure.
    Un indice : tu commences à 2 et pas à 1.

    J'ai bien compris que i est égal à mon nombre de fichiers; et il se trouve que j'utilise également cette valeur comme numéro de ligne où se trouve le nom du fichier sur mon second onglet.
    Non : "i" est le numéro de ligne en cours de traitement.

    u est mon nombre d'onglets.
    Si "u" est le nombre d'onglets et que la borne supérieure de ton For To doit indiquer la dernière colonne renseignée, penses-tu qu'il s'agit de la même chose.

    Après, je pense qu'il faut bien que je bascule sur mon second fichier, d'ou le fait que j'ai écris C2.Activate.
    Pourquoi veux-tu "basculer" ?
    En VBA, il est possible de traiter (appliquer une méthode ou utiliser une propriété) un classeur, un onglet ou une cellule sans les "activer".
    Par exemple Workbooks("MonFichier").Worksheets("MonOnglet").Range("A1").Value = 1 va placer "1" comme valeur de la cellule A1 de l'onglet MonOnglet du classeur MonClasseur, quels que soient le classeur ou l'onglet actifs à cet instant.

    De la même façon, il est possible de faire un export PDF d'un onglet, sans l'activé. Il suffit d'appliquer cette méthode à l'onglet souhaité.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Ok donc techniquement oui, i est mon numéro de lignes, u mon nombre de colonnes non vides et v représente le nombre d'onglet

    Mon for est donc sur for v = 2 to u-1

    Mais en fait, voila ce que je ne comprends pas, et pq je voulais basculer:

    Sauf erreur de ma part, pour exporter en pdf je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets(Array("Onglet 1", "Onglet 2").Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        nompdf, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False
    Mais je ne vois pas comment je pourrais au sein d'une seule boucle définir cet Array.

    Voila pourquoi je voulais stocker le nom des onglets.

    Je ne sais pas comment à partir du nom des onglets que j'arrive à récupérer simplement avec cells arriver à définir ma zone de sélection (mobile selon le fichier et le nombre d'onglets).

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    A moins que je ne puisse avoir une formule du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For v = 2 to u-1
    Workoobs (C2).Sheets(Array(Cells(i,v).text)))).select
    ?

    C'est une horreur sans nom à mes yeux donc je ne saisis toujours pas comment je peux sélectionner les onglets d'un second fichier en faisant référence à des donnes mes cells (i,v).Text comprises dans un premier fichier?

  11. #11
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Mon for est donc sur for v = 2 to u-1
    Tu ne pars pas de la colonne 1 mais de la colonne 2 (ce qui est correct dans ton instruction).
    Donc, si tu ajoutes 1 au départ, il faut logiquement ajouter (et non soustraire) 1 à l'arrivée.

    Il y a une méthode simple pour le comprendre : faire un exemple.
    Tu commences à la colonne 2 et tu as 3 noms d'onglets. Quel sera la colonne finale : 2 ou 4 ?

    Sauf erreur de ma part, pour exporter en pdf je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets(Array("Onglet 1", "Onglet 2").Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        nompdf, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False
    Le Select / Selection n'a rien d'obligatoire.
    Comme je le disais, on peut appliquer une méthode (ExportAsFixedFormat par exemple) directement à la référence qu'un onglet.
    Autre détail : il n'est pas indispensable de mettre les paramètres qui ont leur valeur par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Array("Onglet 1", "Onglet 2").ExportAsFixedFormat Type:=xlTypePDF, Filename:= nompdf
    Mais je ne vois pas comment je pourrais au sein d'une seule boucle définir cet Array.
    Je n'avais pas compris que tu voulais exporter tous les onglets sélectionnés d'un même classeur dans un seul PDF. Je pensais que tu voulais créer un PDF par onglet.

    En supposant que u soit le nombre de noms d'onglets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Base 1
    Dim MesOnglets As Variant
    MesOnglets = Array(1)
    Redim MesOnglets(u)
    For v = 2 To u + 1
         MesOnglets(v) = Cells(i, v).Value
    Next v
    Il est rare que je manipule des Array et il existe peut-être une méthode plus propre que celle-ci, mais, à priori, ça fonctionne.

    Etudie bien chaque élément de ce code pour comprendre ce que tu dois mettre dedans ou dehors de ta première boucle For To (celle de i).

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Merci, c'est la partie Array qui me bloque le plus désormais, je crois avoir bien compris.

    Toutefois, après la partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MesOnglets = Array(1)
    ReDim MesOnglets(u)
     
    For v = 2 To u
     
    MesOnglets(v) = Cells(i, v).Text
     
    Next v
    Je crois comprendre qu'il faut que je sélectionne donc mon array:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Array(MesOnglets).ExportAs etc.)
    Mais je ne comprends pas comment sélectionner l'ensemble des Array, si je le fais sur une boucle (MesOnglets(v) avec v qui varie, la selection change ce qui ne me permet pas d'avoir sélection de l'ensemble des onglets.
    Au contraire, si je sors de la boucle, je n'ai dans Mes Onglets (v) que la dernière valeur, soit le dernier onglet..

    Il me manque quelque chose mais j'ai beau avoir essayé hier soir je ne vois tjrs pas

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    tu pedale tu pedale tu t'en sort pas
    faisons simple
    je recapitule tu a des noms d'onglet quelque part dans ton sheets pour chaque fichier

    tu boucle sur les cellules pour créer ton array de sheets
    tu ouvre tes fichier selectionne cet array de sheets et exporte en pdf puis ferme le classeur et passe au suivant

    je te donne un exemple sur le meme classeur que tu pourrais tres facilement adapter a ton fichier pilote -> tes fichier a exporter

    1. dans cet exemple mes noms d'onglets sont en colonnes"E" de la ligne 2 a 5
    2. je ne boucle pas sur les cellules il y a des fonctionnatives pour faire un array avec un tableau multi dim
    3. quand tu met l'array entre les parenthezes tu n'a pas besoins de mettre "array" Sheets(array(mesonglets)).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
        Dim mesonglets, cheminpdf$
     
        mesonglets = Application.Transpose(Sheets("Feuil1").Range("E2:E5").Value) 'recolte l'array des onglets
     
        cheminpdf= ThisWorkbook.Path & "\toto.pdf" 'chemin complet  de la destination du pdf
     
        Sheets(mesonglets).Select 'on selectionne les onglets de l'array précedement créé
     
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=cheminpdf, Quality:= _
                                        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False
    End Sub
    pas compliqué non ? si ?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par LBaber Voir le message
    Sérieux... Je te mets la bonne instruction et tu ne la recopies même pas correctement.

    Je crois comprendre qu'il faut que je sélectionne donc mon array:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Array(MesOnglets).ExportAs etc.)
    Pas besoin de mettre la fonction Array(), la variable MesOnglets est déjà une chaine en elle-même.
    Il suffit de l'utiliser comme paramètre.

    Mais je ne comprends pas comment sélectionner l'ensemble des Array, si je le fais sur une boucle (MesOnglets(v) avec v qui varie, la selection change ce qui ne me permet pas d'avoir sélection de l'ensemble des onglets.
    L'ensemble des onglets est cumulé dans la variable MesOnglets.
    Fais le test, mets en point d'arrêt en sortie de boucle et regarde le contenu de la variable MesOnglets dans la fenêtre de variables locales. Tu comprendras.

    Au contraire, si je sors de la boucle, je n'ai dans Mes Onglets (v) que la dernière valeur, soit le dernier onglet..
    Parce que l'indice "v" pointe sur le dernier élément de MesOnglets.
    Mais MesOnglets sans indice représente l'ensemble des noms.

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour menhir
    il n'a meme pas besoins de boucle pour recupérer l'array de nom d'onglets

    Pas besoin de mettre la fonction Array(), la variable MesOnglets est déjà une chaine en elle-même.
    Il suffit de l'utiliser comme paramètre.
    heu.. non c'est un array pas une chaine


    peut etre que lbaber comprendra mieux comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mesonglets=array("feuil2","feuil5","feuil8")
    Sheets(mesonglets).Select
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets(array("feuil2","feuil5","feuil8")).Select
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    heu.. non c'est un array pas une chaine
    Je n'ai pas parlé de "chaine de caractères" mais de "chaine". Peut-être aurais-je dû préciser "chaine de valeurs".
    Mon vieil Harrap's traduit Array par "rangée". La différence avec "chaine" est suffisamment subtile pour ne pas n'empêcher la compréhension.

  17. #17
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Merci à tous les deux.

    J'ai enfin bouclé!

    Pour être précis, voici la partie de code:

    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
    u = Application.WorksheetFunction.CountA(Rows(i))
    nompdf = Cells(i, 1).Text
     
     
     
    MesOnglets = Array(1)
    ReDim MesOnglets(u - 1)
     
    For v = 1 To u - 1
     
    MesOnglets(v) = Cells(i, v + 1).Value
     
    Next v
     
     
    C2.Activate
     
    Sheets(MesOnglets).Select
    Je sais que ce n'est pas les bornes que vous proposiez, mais en fait, comme je n'utilise pas les cellules en colonne A qui ne forment que le nom du pdf à exporter, il fallait que la taille de mon array soit de u-1

    Ensuite, il fallait que mon array ne soit pas vide en MesOnglets(1); donc je fais partir v de 1; et m'arrête à u-1 car encore une fois je n'utilise pas la première des colonnes; et je compte u sur l'ensemble de la ligne, pas à partir de la colonne 2.

    Enfin, et c'est surtout ma grosse b^tise....; L'un des noms d'onglet était mal écris...... Je crois que j'ai fait 120 méthodes pour absolument rien, juste à cause d'une faute de frappe sur un onglet très long (que j'avais renommé ensuite).

    Pour pallier à ça, j'ai utiliser la formule suivante qui me rapatrie toujours le nom d'onglet approprié dans mon fichier de contrôle, même s'il change:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROITE(CELLULE("nomfichier";'Onglet1'!$E$1);NBCAR(CELLULE("nomfichier";'Onglet1'!$E$1))-TROUVE("]";CELLULE("nomfichier";'Onglet1s'!$E$1)))
    par exemple pour l'onglet 1 du fichier 1.

    Encore une fois merci; ce qui m'a véritablement bloqué n'étais pas spécialement la compréhension des boucles mais bien l'étapes simple du .select car une de mes valeurs était mauvaise...

    Pour être précis mon code entier est aussi relativement long et ce n'est que la dernière partie de ma boucle donc je ne comprenais pas pourquoi je n'arrivais pas à finir le projet; n'ayant jamais utilisé d'array avant je crois que j'étais juste totalement paumé...

    Bref, un grand merci à tous les deux, et désolé si j'ai pu paraître totalement pataud, je découvre VBA sans cours ni bouquin.

    Bonne journée
    L

  18. #18
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    J'ajoute que je vais ensuite repasser sur le code pour retirer tous les points select inutiles, et les .Activate similairement vu qu'il y en a un peu partout

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/03/2016, 16h23
  2. [MySQL] Création de variables dans une boucle et récupération de données avec une requête
    Par lavande4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/09/2008, 11h10
  3. Réponses: 3
    Dernier message: 01/09/2005, 11h56
  4. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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