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 :

Affichage de l'userform beaucoup trop long


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    postier
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : postier
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Par défaut 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

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    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/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

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

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    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
    Membre habitué
    Homme Profil pro
    postier
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : postier
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Par défaut
    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
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    N'y aurait-il pas des procédures évènementielles dans la feuille ?

  5. #5
    Membre habitué
    Homme Profil pro
    postier
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : postier
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Par défaut 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 Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    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...

  7. #7
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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 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...
    ---------------

Discussions similaires

  1. [Python 3.X] Affichages de fenêtre beaucoup trop long avec imshow()
    Par Tonivege dans le forum Général Python
    Réponses: 19
    Dernier message: 13/01/2018, 20h50
  2. TinyMCE temps d'affichage des boites de dialogue trop long
    Par manu f dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 30/07/2010, 12h08
  3. MS SQL 2000 - Job SQL Agent beaucoup trop long
    Par williamc73 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/11/2009, 14h08
  4. Réponses: 4
    Dernier message: 23/03/2006, 15h29
  5. [DELETE]Beaucoup trop long
    Par bourbaki2003 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 23/12/2005, 10h29

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