Accelerer une macro

Bonjour à tous

J'utilise un formulaire qui me permet de remplir ma feuille excel, mais

je trouve que la retranscription du formulaire vers la feuille est

lente.

Alors je me demande si c'est normal car il y a 150 colonnes dans ma feuille ou c'est du a la macro ?

J'ai 2 feuilles avec leur formulaire distinct :

Autres_documents
et Liste_a_plan

Si dans la feuille Autres_documents j'utilise son formulaire l'écriture est très

13fichier-1.zip (1.04 Mo)

lente idem avec l'autre feuille

Merci d'avance

Bonjour,

Au début des macros > tu peux déjà ajouter  Application.ScreenUpdating = False  ...

Si l'accélération n'est pas suffisante > l'on regardera plus avant ...

ric

Bonjour ric

Merci pour ta reponse,

je vais essayer et si ça ne change rien je reviens pour dire quoi

bonne soirée

Bonjour ric

j'ai testé mais cela ne change rien

bonne soirée

J'ai remis une autre partie de mon fichier la en vois bien la lenteur entre le formulaire et la feuille.

Merci d'avance

bonne soirée

5fichier2.zip (0.95 Mo)

Bonjour,

Il ne reste qu'un petit détail que je ne comprends pas > la variable tableau rejette l'info avec des espaces dans le cellule vide ...

Ce qui fait que l'indice A passe à G ...

Sinon > c'est quasi instantané ...

ric

Bonjour,

Un essai ...

Est-ce mieux ?

ric

6fichier3.zip (1.14 Mo)

Bonjour ric

Super merci

C'est vrai que c'est le jour et la nuit, pourrais-tu me dire ce que tu as modifier pour que je comprenne mieux :)

J'en profite pour te poser une autre question si tu le permet,

dans ma feuille listing_ft j'ai plusieurs colonne date, si j'entre les valeurs manuellement dans la feuille le format date (JJ/MM/AAAA) est bien pris en compte, par contre quand j'entre les dates via le formulaire exemple dans le formulaire j’inscris 10/10/20 la date est retranscrite tel quelle.

Donc dans ma feuille je me retrouve avec la valeur 10/10/20 et pas 10/10/2020.

Encore un grand merci

Bonne journée

Bonjour,

pourrais-tu me dire ce que tu as modifier pour que je comprenne mieux :)

Ici, je me sers du nombre de colonnes, du numéro 4 jusqu'au dernier textbox "Ncol" pour écrire ces textbox dans une variable tableau "tmp" ...

For k = 4 To Ncol  'k = décalage de colonnes
            tmp(1, k) = Me("TextBox" & k)
        Next k

Puis > je colle le contenu de "tmp" dans la plage concernée ...

f.Range(f.Cells(noEnreg, 4), f.Cells(noEnreg, Ncol)) = tmp

Enfin > cette variable "tmp" semble inscrire un caractère invisible dans les cellules > dont les cellules vides des "Marque" ...
Ce fameux caractère invisible (que je ne comprends pas à date) > nuit à ta formule "indice" de la colonne "B" ...
Je dois donc vérifier si la cellule est "semble-t-il" vide en vérifiant le nombre de caractères de son contenu > si le nombre de caractères est zéro > je fais faire un ".ClearContents" de la cellule ce qui rétablit l'exactitude de la formule de la colonne "B" ...

        ' si K à Ac la cellule semble vide, faire un clearcontents
        Set Rng = f.Range(f.Cells(noEnreg, 11), f.Cells(noEnreg, 29))
        For Each Cl In Rng
            If Len(Cl) = 0 Then Cl.ClearContents
        Next Cl

Concernant la date > je ne maîtrise pas encore suffisamment tout dans le Vba > donc pour l'instant je n'ai pas de solution miracle ...
Mais je vais faire de la recherche et tenter de trouver une façon de compléter automatiquement l'année quand tu ne saisis que 2 chiffres ...

Je te reviens ...

ric

Merci Ric pour tes explications

En fait l'histoire avec la colonne indice, c'est pour faire une incrémentation automatique de mon indice, si on entre une valeur dans matériel indice B l'indice général passe en indice B.

C'est peut-être un peu farfelu mais la seule façon que j'ai trouvé pour le faire.

Merci

Bonne journée

Bonjour,

Contrôler les textbox qui contiennent des dates dont l'année est sur 2 chiffres > pour les écrire dans la feuille avec l'année sur 4 chiffres > alourdit un peu l'écriture ...

Est-ce encore acceptable ?

Note : quand tu réponds en citant le message > s.t.p. supprime la pièce jointe dans cette citation > car dans ce cas-ci, cela n'apporte rien de concret et alourdit inutilement le forum > merci ...

ric

3fichier4.zip (1.14 Mo)

Bonjour ric

C'est top, je te remercie pour ton aide

Bonne fin de journée

bonsoir ric

une dernière question,
Dans ton code si je veux écrire a partir de la première colonne et non pas la 4ième quelle ligne dois-je changer ?

Private Sub b_valid_Click() 'bouton modif
Dim tmp()
Dim Rng As Range
Dim Cl As Range

Application.ScreenUpdating = False

If Me.Enreg <> "" And Me.TextBox1 <> "" Then
noEnreg = Me.Enreg
ReDim tmp(1, 4 To Ncol)

For k = 4 To Ncol 'k = decalage de colone

tmp(1, k) = Me("TextBox" & k)
Next k ' colle le array sur la plage dans la feuille
f.Range(f.Cells(noEnreg, 4), f.Cells(noEnreg, Ncol)) = tmp

' si K à Ac la cellule semble vide, faire un clearcontents
Set Rng = f.Range(f.Cells(noEnreg, 11), f.Cells(noEnreg, 29))
For Each Cl In Rng
If Len(Cl) = 0 Then Cl.ClearContents
Next Cl


UserForm_Initialize
End If
End Sub

Bonne soirée

Bonjour,

Il y a 3 endroits à modifier le 4 pour placer un 1 ...

Private Sub b_valid_Click()    'bouton modif
Dim tmp()
Dim Rng As Range
Dim Cl As Range
Dim Nb As Integer
Dim Ctrl As Control
Dim IsN

    For Each Ctrl In Me.Controls
        If TypeOf Ctrl Is MSForms.TextBox Then
            If Ctrl.Tag = "UneDate" And Ctrl <> "" Then
                On Error Resume Next
                Ctrl = CDate(Ctrl)
                On Error GoTo 0
            End If
        End If
    Next Ctrl

    Application.ScreenUpdating = False
    If Me.Enreg <> "" And Me.TextBox1 <> "" Then
        noEnreg = Me.Enreg
        ReDim tmp(1, 1 To Ncol)                                     ' < modif ici

        For k = 1 To Ncol  'k = decalage de colone                  ' < modif ici
            tmp(1, k) = Me("TextBox" & k)
        Next k
        ' colle le array sur la plage dans la feuille
        f.Range(f.Cells(noEnreg, 1), f.Cells(noEnreg, Ncol)) = tmp  ' < modif ici

        ' si K à Ac la cellule semble vide, faire un clearcontents
        Set Rng = f.Range(f.Cells(noEnreg, 11), f.Cells(noEnreg, 29))
        For Each Cl In Rng
            If Len(Cl) = 0 Then Cl.ClearContents
        Next Cl

        UserForm_Initialize
    End If
End Sub

ric

ric

j'ai essayé sur mon fichier mais cela ne fonctionne pas

3fichier-1.zip (695.83 Ko)

Bonjour,

Tu dis que ça ne fonctionne pas et tu m'envoies un fichier complètement différent ...

Les macros > ce n'est pas universel ...

Je vais regarder cela > mais ça peut prendre un jour ou deux ...

ric

Bonjour,

En fin de compte > je me suis penché sur ton fichier ...

Pour que tu puisses reproduire dans un autre fichier > en voici les étapes ...

- copier "DateClasse" qui est dans le "modules de classe" ...
- tout au haut du "Module 1" > ajoute > Public TextBoxDate() As New DateClasse  ....
- tout au haut de ton formulaire > ajoute > Option Base 1  ...
- au début du "UserForm_initialise > ajoute ceci ...

Private Sub UserForm_Initialize()
' ajout pour module de classe
Dim Nb As Integer
Dim Ctrl As Control
Nb = 1
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then
      If Ctrl.Tag = "UneDate" Then
        ReDim Preserve TextBoxDate(Nb)
        Set TextBoxDate(Nb).DateClasse = Ctrl
        Nb = Nb + 1
      End If
    End If
  Next Ctrl

' suite
' ...
'...

-puis > change la macro pour celle-ci ...

Private Sub b_valid_Click()    'bouton modif
Dim tmp4()
Dim Rng As Range
Dim Cl As Range
Dim Nb As Integer
Dim Ctrl As Control
Dim IsN

    For Each Ctrl In Me.Controls
        If TypeOf Ctrl Is MSForms.TextBox Then
            If Ctrl.Tag = "UneDate" And Ctrl <> "" Then
                On Error Resume Next
                Ctrl = CDate(Ctrl)
                On Error GoTo 0
            End If
        End If
    Next Ctrl

    Application.ScreenUpdating = False
    If Me.Enreg <> "" And Me.TextBox1 <> "" Then
        noEnreg = Me.Enreg
        ReDim tmp4(1, 1 To Ncol)                                     ' < modif ici

        For k = 1 To Ncol  'k = decalage de colone                  ' < modif ici
            tmp4(1, k) = Me("TextBox" & k)
        Next k
        ' colle le array sur la plage dans la feuille
        f.Range(f.Cells(noEnreg, 1), f.Cells(noEnreg, Ncol)) = tmp4  ' < modif ici

        UserForm_Initialize
    End If
End Sub

Et enfin > l'étape la plus longue > dans le userform > trouve tous les textbox qui doivent recevoir des dates > à tour de rôle > tu en sélectionnes un et dans ses propriétés > à "Tag" > ajoutes la mention : UneDate > dans le fichier joint > je n'ai mis la mention qu'à 3 ou 4 textbox > le reste est à faire ...

Enregistre de temps à autre pour ne pas être obligé de tout reprendre si tu fais une mauvaise manipulation ...

Tu pourras te familiariser avec les étapes en suivant dans le fichier joint ...

Bon amusement ...

ric

11fichier-1b.zip (696.49 Ko)

Bonjour ric

Désolé pour le fichier, mais j'ai voulu adapter un autre formulaire de mon fichier à l'aide de tes modifications, après une bonne nuit de sommeil j'ai remarqué que j'avais oublier une des première ligne "option base 1" j'avais cru que c'était une annotation et je n'avais pas remarqué que tu avait ajouté le tag unedate dans les textbox.

Encore merci pour ton aide et surtout ta patience.

Bonne journée

Bonjour @ric

Je reviens vers toi car j'ai encore une question.

Si maintenant je veux commencer a partir de la colonne 1 jusque la dernier mais en évitant de copier dans la colonne 5 et 7 est-ce possible.

Merci et bonne journée

Bonjour,

Pour la simplicité du code > qu'est-ce que tu penses de l'idée de simplement effacer le contenu des cellules de la colonne 5 et 7 après la copie de ligne ?

f.Cells(noEnreg, 5).ClearContents
f.Cells(noEnreg, 7).ClearContents

ric

Rechercher des sujets similaires à "accelerer macro"