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 :

Affichage de l'userform beaucoup trop long


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Affichage de l'userform beaucoup trop long
    Bonjour,

    Dans un userform j'ai ce code VBA:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveCell.Offset(1, 0).Select
    ActiveWindow.ScrollRow = ActiveCell.Row
    TextBox1 = ActiveCell.Value


    L'affichage de mon userform est très long et cette lenteur semble liée à ces codes VBA ci-dessus.
    Est-ce ce code ActiveCell.Offset(1, 0).Select qui pose problème?
    Je sais que sélectionner une cellule n'est pas toujours conseillé en VBA mais je ne sais pas comment faire autrement.
    Pouvez-vous m'aider?

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    effectivement, la selection est chronophage et inutile dans 99.9% des cas

    Si tu veux simplement prendre la valeur, inutile de selectionner la cellule.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveCell.Offset(1, 0).Select
    ActiveWindow.ScrollRow = ActiveCell.Row
    TextBox1 = ActiveCell.Value


    se transformera en
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    TextBox1 = ActiveCell.Offset(1, 0).Value


    reste à toi de déterminer si tu peux t'affranchir d'une cellule active en utilisant directement une adresse
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016 et Access 2019

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Futur Membre du Club
    Bonjour,
    Merci pour la réponse !
    Malheureusement,
    Ces codes sont intégrés dans un bouton nommé "suivant" c'est à dire que je dois absolument passer à la cellule suivante vers le bas et qu'elle doit être active.
    Ensuite la valeur de cette cellule doit s'afficher sur une textbox après avoir affiché l'userform.

  4. #4
    Membre expert
    Bonjour,

    N'y aurait-il pas des procédures évènementielles dans la feuille ?
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Futur Membre du Club
    Pas de procédure évènementielle dans la feuille
    Bonjour,

    Il n'y a aucune procédure évènementielle dans la feuille en revanche dans l'userform j'ai ces codes 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    With bv 'affiche l'USF en bas à droite
          .Top = 250
          .Left = 250
        End With
    Label3.Font.Size = 8
    Label3.ForeColor = RGB(0, 0, 255)
    Label3.Font.Bold = True
    Me.Label3.Caption = Sheets("macros").Range("c11").Value
    Me.Label11.Caption = Sheets("macros").Range("a17")
     
     
    Label6.Font.Size = 8
    Label6.ForeColor = RGB(255, 0, 0)
    Label6.Font.Bold = True
     
    Label8.Font.Size = 8
    Label8.ForeColor = RGB(0, 0, 255)
    Label8.Font.Bold = True
     
    Label11.Font.Size = 8
    Label11.ForeColor = RGB(0, 0, 255)
    Label11.Font.Bold = True
     
    Label7.Font.Size = 8
    Label7.ForeColor = RGB(255, 0, 0)
    Label7.Font.Bold = True
     
    Label16.Font.Size = 8
    Label16.ForeColor = RGB(255, 0, 0)
    Label16.Font.Bold = True
     
     
    Dim cellule As Range
    With Sheets("listetag")
    On Error Resume Next
    Set cellule = .Columns("A").Find(Me.TextBox1.Value, .Range("A65536"), xlValues)
    If Not cellule Is Nothing Then
    Dim b As Range
    On Error Resume Next
    Set b = Workbooks("adressesbi.xlsm").Sheets("contacts").Range("a1:a" & Workbooks("bv chilly-mazarin.xlsm").Sheets("contacts").Range("a65536").End(xlUp).Row).Find(cellule.Offset(0, 4).Value)
    If Not b Is Nothing Then
    Me.Label16.Caption = b.Offset(0, 9).Value
    End If
    End If
    End With
     
    Me.TextBox2.Value = Sheets("macros").Range("a138").Value
     
    Me.TextBox3.Value = Sheets("macros").Range("a41").Value
    Dim dat As String
    Dim vieux As String
    Dim vieux2 As String
    Dim rng As Range, cell2 As Range
    Set rng = Sheets("archivage").Range("a2:a65000")
    Sheets("tri").Cells.Clear
    Sheets("tri").Range("a:a").NumberFormat = "0"
    Sheets("tri").Range("b:b").NumberFormat = "0"
    Sheets("tri").Range("B1").FormulaR1C1 = "=MAX(C[-1])"
    For Each cell2 In rng
        If cell2.Value <> "" Then
      If cell2.Value = Me.TextBox1.Value Then
    If Format((cell2.Offset(0, 7).Value), "yyyy") = Sheets("macros").Range("a39").text Then
    Sheets("tri").Range("A65536").End(xlUp).Offset(1, 0) = cell2.Offset(0, 6).Value
    If cell2.Offset(0, 6).Value = Sheets("tri").Range("B1").Value Then
           dat = cell2.Offset(0, 7).Value
           vieux = cell2.Offset(0, 10).Value
           vieux2 = cell2.Value & "-" & cell2.Offset(0, 6).Value & "-" & cell2.Offset(0, 7).Value & "-"
           End If
    End If
    End If
    End If
            Next cell2
     
    Dim madate As Date
    madate = DateAdd("m", "-" & Sheets("macros").Range("a41").Value, Date)
    On Error GoTo fin
    If dat < madate Then
    Label13.Font.Size = 8
    Label13.ForeColor = RGB(255, 0, 0)
    Label13.Font.Bold = True
    Me.Label13.Caption = "Dernière Feuille reçue: " & vieux
    Else
    Me.Label13.Caption = ""
    End If
    If Me.Label13.Caption = "Dernière dépêche reçue: " Then Me.Label13.Caption = "Dernière Feuille reçue: " & vieux2
    If ActiveCell.Offset(1, 0) = "" Then GoTo fin
    Call CommandButton9_Click
    Call CommandButton10_Click
    fin::
    Sheets("tri").Cells.Clear
    Set rng = Nothing

  6. #6
    Membre émérite
    Bonjour,

    Peux-tu nous donner le code COMPLET de ton module d'Userform?

    Ce que tu nous donnes ne nous dit pas :
    > de qu'elle procédure il s'agit (le code présenté)
    > quels sont les codes des commandbutton
    > etc...
    Cordialement,
    Franck

  7. #7
    Responsable
    Office & Excel

    Salut.

    Un code de procédure d'une centaine de lignes, manifestement partiel puisqu'il n'englobe pas les bornes de la procédure (Sub... End Sub) est beaucoup trop long. Tu dois découper ton code en petites procédures/fonctions qui n'ont qu'une seule responsabilité. De cette manière, tu as une architecture stable, facilement testable, évolutive, compréhensible et lisible. Lorsque je dis "facilement testable", cela veut dire notamment que nous pouvons la reproduire facilement pour envisager les cas qui posent problème.

    De plus, il serait intéressant que tu expliques en français (sans jargon Excel, un peu comme si tu n'y connaissais rien en Excel/VBA) d'où tu pars, où tu veux arriver, et ce dont tu disposes pour y réaliser ton objectif. Nous pourrons ainsi te proposer une architecture et un code qui sont en adéquation avec ce que tu souhaites réaliser. Pour l'instant, tu nous demandes en gros de jouer à madame Irma ^^
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    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...
    ---------------