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 :

en tête de colonne


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Avril 2014
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 212
    Points : 0
    Points
    0
    Par défaut en tête de colonne
    bonjour

    j'ai une liste de listbox, elle comprend plus de 40 colonnes

    avant je procédais de la sorte

    j’exécutais une requette sql dans ma base de données Access en vba
    j'écrivais le résultat dans une feuille de calcul
    puis je remplissais une listbox

    ça fonctionnait très bien mais il fallait presque 2 secondes pour exécuter cette macro


    j'ai donc décider de tester autre chose

    j'exécute une requette sql dans ma base de données Access en vba
    j'écris directement le résultat dans ma listbox

    il faut 0.45 secondes, excellent

    sauf que je n'ai pas les entêtes de colonnes!!!

    vous avez une idée?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TexteSQL_liste_feuille_atdec = "SELECT [date_création],[produit],[lignes],[ref],[lot],[description défaut],[Nbre_pièces_ATDEC],[cloture],[action ligne] ,[action qualité 1],[résultat qualité 1],[action qualité 2],[résultat qualité 2],[action qualité 3],[résultat qualité 3],[action qualité 4],[résultat qualité 4],[action qualité 5],[résultat qualité 5],[action qualité 6],[résultat qualité 6],[N°feuille_atdec],[Palette1 lot],[Palette2 lot],[Palette3 lot],[Palette4 lot],[Palette5 lot],[Palette6 lot],[Palette7 lot],[Palette8 lot],[Palette9 lot],[Palette10 lot],[Palette11 lot],[Palette12 lot],[Palette13 lot],[Palette14 lot],[Palette15 lot],[Palette16 lot],[Palette17 lot],[Palette18 lot],[Palette19 lot],[Palette20 lot]FROM [feuille atdec] WHERE [produit] IS NOT NULL and [cloture] IS NULL "
     
    Set rst = cn.Execute(TexteSQL_liste_feuille_atdec)
    a = rst.GetRows
    Me.L_liste_feuille_atdec.Column = a    ' Il n'y a pas de problème s'il n'y a qu'une ligne

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    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 : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    sauf que je n'ai pas les entêtes de colonnes!!!
    vous avez une idée?
    Peut-être la réponse dans cette contribution titrée Fonction qui renvoie une table contenant résultat d'une requête SQL sur une base de données Access ?
    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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Avril 2014
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 212
    Points : 0
    Points
    0
    Par défaut
    bonsoir
    j'ai essayé votre méthode, mais je n'y arrive pas trop désolé

    par contre je suis partie sur une autre manière

    j'ai créé un tableau d'une ligne et plusieurs colonne pour les entêtes
    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
        Dim NomTableau() As String
        Dim i As Integer, j As Integer
     i = 2
        'Définit la taille du tableau
        ReDim NomTableau(247)
     
        Set db = DBEngine.OpenDatabase("D:\Documents Personnel\boulot\suivi atdec\bdd feuille atdec.accdb")
     
        Set tb = db.TableDefs("feuille atdec")
     colonne = 1
     i = 0
     
        For Each fd In tb.Fields
     
            NomTableau(i) = fd.Name
         i = i + 1
           colonne = colonne + 1
        Next
     
    Set tb = Nothing
    Set db = Nothing
     
     
     
    Me.ListBoxentete.Column = NomTableau
    j'ai ensuite crée un autre tableau pour les données de la base Access
    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
    Set Cn = New ADODB.Connection
    With Cn
     .Provider = "Microsoft.ACE.OLEDB.12.0"
     .ConnectionString = "Data Source=" & ThisWorkbook.Path & "\bdd feuille atdec.accdb" & ";Persist Security Info=False;"
     .Open
    End With
     
     
     
    'TexteSQL_liste_feuille_atdec = "SELECT * FROM [feuille atdec$]  "
    TexteSQL_liste_feuille_atdec = "SELECT [date_création],[produit],[lignes],[ref],[lot],[description défaut],[Nbre_pièces_ATDEC],[cloture],[action ligne] ,[action qualité 1],[résultat qualité 1],[action qualité 2],[résultat qualité 2],[action qualité 3],[résultat qualité 3],[action qualité 4],[résultat qualité 4],[action qualité 5],[résultat qualité 5],[action qualité 6],[résultat qualité 6],[N°feuille_atdec],[Palette1 lot],[Palette2 lot],[Palette3 lot],[Palette4 lot],[Palette5 lot],[Palette6 lot],[Palette7 lot],[Palette8 lot],[Palette9 lot],[Palette10 lot],[Palette11 lot],[Palette12 lot],[Palette13 lot],[Palette14 lot],[Palette15 lot],[Palette16 lot],[Palette17 lot],[Palette18 lot],[Palette19 lot],[Palette20 lot]FROM [feuille atdec] WHERE [produit] IS NOT NULL and [cloture] IS NULL "
     
    Set rst = Cn.Execute(TexteSQL_liste_feuille_atdec)
    a = rst.GetRows
    Me.L_liste_feuille_atdec.Column = a   ' Il n'y a pas de problème s'il n'y a qu'une ligne
     
    'Fermeture connexion
    Cn.Close
    Set Cn = Nothing

    qu'elle est le moyen le plus rapide pour excel pour fusionner les 2 tableaux?

    ou alors, il est peut être possible de rajouter sur mon 2° tableaux les en tête en le redimensionnant et en rajouter la 1° ligne?

  4. #4
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    Le plus simple est de placer le résultat de ta requête dans un tableau Excel et d'utiliser celui ci pour ta liste!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i =0 to rst.Fields.count -1
           Sheets("temp").range("A1").offset(,i)=RST.Fields(i).name
    Next
    Sheets("temp").range("A2").CopyFromRecordset rst

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Cette séquence donne les noms des champs d'une table Access:

    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
    Sub LectureAccess()
      'Microsoft ActivexDataObject 2.8 Library dans outils/référence
      repertoire = ThisWorkbook.Path & "\"
      Dim rs As ADODB.Recordset
      Set cnn = New ADODB.Connection
      cnn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & repertoire & "Access2000.mdb"
      Set rs = cnn.Execute("SELECT * FROM Client")
      For i = 0 To rs.Fields.Count - 1
        Cells(i + 2, 1) = rs(i).Name
        Cells(i + 2, 2) = rs(i).Type
      Next i
      rs.Close
      cnn.Close
      Set rs = Nothing
      Set cnn = Nothing
    End Sub
    Pour afficher des entetes de ListBox avec des Labels:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub EnteteListBox()
      x = Me.ListBox1.Left + 8
      Y = Me.ListBox1.Top - 12
      For i = 1 To NbCol
        Set lab = Me.Controls.Add("Forms.Label.1")
        lab.Caption = Rng.Offset(-1).Cells(1, i)
        lab.Top = Y
        lab.Left = x
      Next
    End Sub
    Boisgontier

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Avril 2014
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 212
    Points : 0
    Points
    0
    Par défaut
    bonjour
    merci pour vos réponses
    le pb de vos solutions, c'est qu'elles sont très longue en terme de temps, 2 secondes pour afficher et récupérer plus de 40 colonnes sur 300 enregistrements environs dans une listbox

    je cherche surtout à gagner en rapidité, donc je ne veux pas d'une solution en passant par une feuille excel, ni en créant de multiple boucle

  7. #7
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Je ne répondrai plus à tes postes ça m'évitera de prendre de vent!

    Tu ne pourras pas afficher tes entêtes et tes 40 colonnes si tu opte pas pour ma solution qui très rapide!

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Avril 2014
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 212
    Points : 0
    Points
    0
    Par défaut
    Désolé, si je vous ai "choqué ", mais je pensais avoir été clair dans mon 1° post

  9. #9
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    Si tu relis ma proposition tu verras qu'elle est raccord avec le poste #1!

    Mais si Pierre passe par là il pourra t'orienter vers Powerquerry que je ne m'etrises pas!

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Avril 2014
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 212
    Points : 0
    Points
    0
    Par défaut
    je viens avec l'aide d'autre personne du forum à trouvé une alternative à ma question

    https://www.developpez.net/forums/d2.../#post11294450

    dans une base de donnée
    avoir une table avec les données:[feuille atdec]
    et avoir une autre table avec comme donnée, un enregistrement du nom champs de la 1° table: [champs]

    on exécute cette requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TexteSQL_liste_feuille_atdec = "SELECT * FROM [feuille atdec]  " &  " UNION " & "SELECT * FROM [champs]  "
    et on remplie une listbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set rst = Cn.Execute(TexteSQL_liste_feuille_atdec)
    a = rst.GetRows
    'ReDim Preserve a(1)
     
    Me.L_liste_feuille_atdec.Column = a   ' Il n'y a pas de problème s'il n'y a qu'une ligne
    les entêtes, et les données sont dans la listbox, et le tout en moins de 0.5 secondes

    car si je passe par une feuille excel, ça me prend presque 2 secondes


    il me reste un dernier petit pb maintenant

    je souhaiterais figer les entêtes de ma listbox, mais même si je mets la valeurs "columnheads", à true, ça ne me prend pas la 1° ligne

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    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 : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    il me reste un dernier petit pb maintenant
    je souhaiterais figer les entêtes de ma listbox, mais même si je mets la valeurs "columnheads", à true, ça ne me prend pas la 1° ligne
    La propriété ColumnHeads ne fonctionne qu'avec la propriété RowSource
    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

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Avril 2014
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 212
    Points : 0
    Points
    0
    Par défaut
    Zut, et on ne peut pas utiliser la propriété rowsource avec une requête SQL

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par Thumb down Voir le message
    [...]
    Mais si Pierre passe par là il pourra t'orienter vers Powerquerry que je ne m'etrises pas!
    Je viens de passer par là

    Pour limiter le code VBA au strict minimum, je récupérerais les données Access par liaison, soit par PowerQuery soit via les assistants hérités pour la liaison à des données, et j'appuierais ma listbox sur le tableau structuré créé lors de la récupération des données. La récupération étant effectuée par liaison, on rafraichit la liaison avant d'alimenter la listbox et/ou d'afficher le userform. Zéro boucle et c'est instantané (testé sur une table de 1000 lignes de 40 champs). Tu peux alors donner à la propriété RowSource de ta listbox le nom du tableau structuré récupéré (ici, j'ai utilisé Tableau_Listbox.accdb mais tu peux bien sûr renommer le tableau. Tu pourras ainsi mettre la propriété ColumnHeads à True

    Nom : 2019-12-29_165816.png
Affichages : 1089
Taille : 82,3 Ko



    Comme tu le vois, le code est minimaliste et évite le hardcoding, les problèmes de connexion (attention que les drivers ne sont pas les mêmes pour un mdb que pour un accdb), la requête SQL en dur dans ton code, ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
      Range("Tableau_Listbox.accdb").ListObject.QueryTable.Refresh
      UserForm1.Show
    End Sub


    Pour ce qui est de la liaison aux données, en ce compris les entêtes (Attention: le ruban se présente un peu différemment en XL2013, il faut aller dans l'onglet Données et chercher "à partir d'Access" ou quelque chose comme ça sur la gauche de l'onglet):

    Nom : 2019-12-29_162323.png
Affichages : 1121
Taille : 104,6 Ko

    Nom : 2019-12-29_162352.png
Affichages : 1064
Taille : 8,5 Ko

    Nom : 2019-12-29_162418.png
Affichages : 1094
Taille : 169,8 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour a tous, aujourd'hui, je pense que je vais me faire allumer. Mais, lorsque je vois cette super et superbe série d'interventions, certes pas inutile, pour gagner 1,50 secondes.... Je m'interroge.
    N'est-ce pas une manière de se compliquer la vie en essayant de la simplifier? Enfin cette intervention n'est que le fruit pragmatique de ma pensée stérile
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

Discussions similaires

  1. [DBGrid] Tri d'un clic sur l'en-tête de colonne
    Par pifou25 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/09/2006, 17h03
  2. En-têtes de colonnes dans un rapport
    Par ym21 dans le forum Access
    Réponses: 4
    Dernier message: 07/03/2006, 11h05
  3. [zone de liste] En têtes de colonne
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 07/11/2005, 12h10
  4. JBuilder et En-tête de colonnes
    Par gigande dans le forum JBuilder
    Réponses: 2
    Dernier message: 18/07/2005, 14h45
  5. Guillemets dans un en-tête de colonne
    Par Tutulejouflu dans le forum Oracle
    Réponses: 5
    Dernier message: 12/08/2004, 17h11

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