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

Contribuez Discussion :

Ajustement de la largeur des colonnes pour les requêtes et les tables


Sujet :

Contribuez

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Ajustement de la largeur des colonnes pour les requêtes et les tables
    Bonjour.

    Si vous êtes comme moi et que vous avez beaucoup de requêtes avec beaucoup de colonnes vous aimerez peut-être le code suivant qui permet à Access d'ajuster pour vous la largeur des colonnes au contenu avec un max.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Compare Database
    Option Explicit
     
    'Code récupéré d'ici :
    'https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa217449(v=office.11)?redirectedfrom=MSDN
     
    Const WIDTH_MAX As Long = 12030 'Colonne de 100 de large
    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
    45
    46
    Private Sub Test_FixColumnWidthsOfQuery()
        Call FixColumnWidthsOfQuery("Requete1")
    End Sub
     
    Public Function FixColumnWidthsOfQuery(stName As String)
        Dim db As Database
        Dim qdf As QueryDef
        Dim fld As DAO.Field
        Dim frm As Form
        Dim ictl As Integer
        Dim ctl As Control
     
        Set db = CurrentDb
        Set qdf = db.QueryDefs(stName)
        DoCmd.OpenQuery stName, acViewNormal
        Set frm = Screen.ActiveDatasheet
     
        For ictl = 0 To frm.Controls.Count - 1
            Set ctl = frm.Controls(ictl)
            'Debug.Print ctl.Name, ctl.ColumnWidth
            ctl.SetFocus
            ctl.ColumnWidth = -2 'Ajuste au texte
            Call SetDAOFieldProperty(qdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
        Next ictl
     
        DoCmd.Save acQuery, stName
        DoCmd.Close acQuery, stName
     
        DoCmd.OpenQuery stName, acViewNormal
     
        Set frm = Screen.ActiveDatasheet
     
        For ictl = 0 To frm.Controls.Count - 1
            Set ctl = frm.Controls(ictl)
            'Debug.Print ctl.Name, ctl.ColumnWidth
     
            If ctl.ColumnWidth > WIDTH_MAX Then
                ctl.ColumnWidth = WIDTH_MAX 'Ajuste à 100 max
                Call SetDAOFieldProperty(qdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
            End If
     
        Next ictl
     
        DoCmd.Save acQuery, stName
        DoCmd.Close acQuery, stName
    End Function
    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
    Private Sub Test_FixColumnWidthsOfTable()
        Call FixColumnWidthsOfTable("Table1")
    End Sub
     
    Public Function FixColumnWidthsOfTable(stName As String)
        Dim db As Database
        Dim tdf As TableDef
        Dim fld As DAO.Field
        Dim frm As Form
        Dim ictl As Integer
        Dim ctl As Control
     
        Set db = CurrentDb
        Set tdf = db.TableDefs(stName)
        DoCmd.OpenTable stName, acViewNormal
        Set frm = Screen.ActiveDatasheet
     
        For ictl = 0 To frm.Controls.Count - 1
            Set ctl = frm.Controls(ictl)
            ctl.SetFocus
            ctl.ColumnWidth = -2 'Ajutse au texte
            Call SetDAOFieldProperty(tdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
        Next ictl
     
        DoCmd.Save acTable, stName
        DoCmd.Close acTable, stName
     
        DoCmd.OpenTable stName, acViewNormal
        Set frm = Screen.ActiveDatasheet
     
        For ictl = 0 To frm.Controls.Count - 1
            Set ctl = frm.Controls(ictl)
            ctl.SetFocus
            If ctl.ColumnWidth > WIDTH_MAX Then
                ctl.ColumnWidth = WIDTH_MAX
            End If
     
            Call SetDAOFieldProperty(tdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
        Next ictl
     
        DoCmd.Save acTable, stName
        DoCmd.Close acTable, stName
     
    End Function
    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
    Private Sub SetDAOFieldProperty _
            (fld As DAO.Field, _
             stName As String, vValue As Variant, _
             lType As Long)
        Dim prp As DAO.Property
     
        For Each prp In fld.Properties
            If StrComp(prp.Name, stName, _
                       vbBinaryCompare) = 0 Then
                prp.Value = vValue
                Exit For
            End If
            Set prp = Nothing
        Next prp
     
        If prp Is Nothing Then
            Set prp = fld.CreateProperty(stName, lType, vValue)
            fld.Properties.Append prp
        End If
     
    End Sub
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Si quelqu'un veut le tester pour voir si cela marche dans d'autres versions ce serait super.

    Je pense que ça doit fonctionner à partir au moins de la version 2007.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Bien le bonjour, Marot_R,

    j'ai testé FixColumnWidthsOfQuery:
    le code fournit plante : il ouvre 2 fois la requte puis la referme encore la deuxième fois. Résultat : il ne reste pas grand chose à l'affichage !
    Sinon je ne comprends pas bien l’intérêt d'optimiser la largeur des colonnes si on ne les affiche pas ...

    En regardant ton code, je pense qu'il est inutile de faire 2 passes , tu peux tout faire en une passe. Mais surtout ne pas fermer mla deuxième fois.
    Alors les colonnes sont joliment optimisées.
    code modifié ci-dessous :

    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
    Public Function FixColumnWidthsOfQuery(stName As String)
        Dim db As Database
        Dim qdf As QueryDef
        Dim fld As DAO.Field
        Dim frm As Form
        Dim ictl As Integer
        Dim ctl As Control
     
        Set db = CurrentDb
        Set qdf = db.QueryDefs(stName)
        DoCmd.OpenQuery stName, acViewNormal
        Set frm = Screen.ActiveDatasheet
     
        For ictl = 0 To frm.Controls.Count - 1
            Set ctl = frm.Controls(ictl)
            'Debug.Print ctl.Name, ctl.ColumnWidth
            ctl.SetFocus
            ctl.ColumnWidth = -2 'Ajuste au texte
            Call SetDAOFieldProperty(qdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
     
            If ctl.ColumnWidth > WIDTH_MAX Then
                ctl.ColumnWidth = WIDTH_MAX 'Ajuste à 100 max
                Call SetDAOFieldProperty(qdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
            End If
        Next ictl
     
        DoCmd.Save acQuery, stName
       ' DoCmd.Close acQuery, stName  ' en commentaire !
     
    End Function
    Cordialement, En Access 2010 32 bits
    "Always look at the bright side of life." Monty Python.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et merci de ton intérêt.

    Oui le code n'est pas des plus élégants je le reconnais.

    Le but est que l'ajustement des colonnes reste, et quand on réouvre la requête directement à la main plus tard on ai les colonnes ajustée.
    Je vais traiter avec ce code environ 30 requêtes et je n'ai pas besoin qu'elles soient affichées, juste ajustées.

    La seconde passe est pour limiter la largeur à 100. Je n'ai pas trouvé comment le faire en une seule étape car quand tu demandes la largeur de colonne avec colonnwidth après l'avoir assigné pour l'ajustement automatique, il indique -2 pas la largeur réelle de la colonne.

    N'as-tu pas le même phénomène chez toi ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    je n'ai pas besoin qu'elles soient affichées, juste ajustées
    OK je ne devinais pas

    Ca me parait fonctionner correctement avec le code ci-dessus (en 1 boucle).
    Je viens de faire un test avec ta valeur WIDTH_MAX /2 et j'obtiens avec le code ci-dessus des lignes de largeur MAX 63 car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Const WIDTH_MAX As Long = 12030 'Colonne de 100 de large
    Const WIDTH_MAX As Long = 6015 'Colonne de 50 de large
    Cordialement
    "Always look at the bright side of life." Monty Python.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci du retour.

    Étrange cette version était la 1ère que j'avais faite et ne fonctionnait pas, mais vraiment pas.

    Si j'ai le temps je creuserai. Je n'aime pas ce code (il est vraiment moche) mais comme c'est pour "bricoler" je peux m'en accommoder du moment qu'il marche.

    Pour la largeur de 100 c'est ce que Access m'a renvoyé quand j'ai fait un essai en ayant forcé la largeur à la main.
    Mais je n'ai jamais vraiment saisi le rapport entre cette largeur et l'unité utilisée.
    De toute façon 100 est arbitraire, c'est juste pour ne pas avoir des colonnes aussi large que l'écran qui rendent le défilement horizontal pénible.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Pour être précis, j'ai fait ce test sur un champ qui est forcé en majuscules en affichage :
    qd je suis sur cette colonne, les minuscules sont affichées et il en a 63 par ligne.
    qd je met le focus sur une autre colonne, les majusules sont affichées et il y en a 53 par ligne. Donc la largeur MAX est indicative en nb exact de car. La largeur fixe en pixel est plus importante.

    très cordialement
    "Always look at the bright side of life." Monty Python.

Discussions similaires

  1. Réduire la largeur des "hline" pour les algos
    Par K@rim dans le forum Débuter
    Réponses: 0
    Dernier message: 17/10/2010, 11h48
  2. Réponses: 2
    Dernier message: 17/09/2009, 07h45
  3. [HTML] Ajustement de la largeur des colonnes
    Par louroulou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 04/02/2008, 16h50
  4. Réponses: 1
    Dernier message: 19/07/2006, 19h06
  5. Comment fixer les largeurs des colonnes d'un TStrinGrid
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/08/2005, 13h24

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