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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é.

+ 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