Macros très lente

Zentin

XLDnaute Nouveau
Bonjour le forum,

Grâce à toutes les aides reçues sur ce forum et pour lesquelles je remercie encore Pierrot, Kjin, Phlaurent, Youki (Bj), et tous les autres… j’ai 2 macros mais celles-ci sont très lente à l’exécution, est-il possible de ralentir l’exécution de celles-ci svp ?

Merci à tous pour l’attention que vous apporterez à cette demande et excellente journée.

Christine

Voici les 2 Macros (désolée si texte très long mais n’ai pas encore trouvé le système pour avoir la fenêtre avec les codes !!)

PREMIERE MACRO :Private Sub CommandButton3_Click()
If MsgBox("Avez-vous encodés les modifications dans les champs ci-dessus", vbQuestion + vbYesNo) = vbNo Then
Exit Sub
'Le code à exécuter si on répond 'oui' à la msgbox
Else
'Le code à exécuter si on répond 'non'
Dim li As Integer 'déclare la variable li (LIgne)
Workbooks("copy.xls").Activate
Sheets("Master").Select
[Master!d2] = TextBox1
[Master!d3] = TextBox2
[Master!d4] = TextBox3
[Master!d5] = TextBox4
[Master!d6] = TextBox5
[Master!d7] = TextBox6
[Master!d8] = TextBox7
[Master!d9] = TextBox8
Workbooks("Offres.xls").Activate
Worksheets("Clients").Activate
li = Sheets("clients").Columns(1).Find(TextBox9.Value, , xlValues, xlWhole).Row
Cells(li, 2).Value = Me.TextBox1.Value
Cells(li, 3).Value = Me.TextBox2.Value
Cells(li, 4).Value = Me.TextBox3.Value
Cells(li, 5).Value = Me.TextBox4.Value
Cells(li, 6).Value = Me.TextBox5.Value
Cells(li, 7).Value = Me.TextBox6.Value
Cells(li, 8).Value = Me.TextBox7.Value
Cells(li, 9).Value = Me.TextBox8.Value
End If
ActiveWorkbook.Save
Workbooks("Offres.xls").Activate
Sheets("MENU").Select
Unload Me
Corps_offre.Show
End Sub


DEUXIEME MACRO :
Private Sub CommandButton5_Click()
If MsgBox("Confirmez-vous la suppression de ce client?", vbQuestion + vbYesNo) = vbNo Then
Exit Sub
Else
Dim li As Integer 'déclare la variable li (LIgne)
Dim rng As Range
Dim txd, txi As String
If TextBox9 = "" Then Exit Sub
txd = TextBox9.Value
txi = TextBox9.Value
Do
Workbooks("Offres.xls").Activate
Worksheets("Clients").Activate
Set rng = Range("A:A").Find(txd)
Set rng = Range("A:A").Find(txi)
If rng Is Nothing Then
Exit Do
Else
Rows(rng.Row).Delete
End If
Loop
ActiveWorkbook.Save
Sheets("MENU").Activate
End If
End Sub
 
G

Guest

Guest
Re : Macros très lente

Bonjour,

MJ:)

Tu peux tester:
Code:
Private Sub CommandButton3_Click()
    If MsgBox("Avez-vous encodés les modifications dans les champs ci-dessus", vbQuestion + vbYesNo) = vbNo Then
        Exit Sub
        'Le code à exécuter si on répond 'oui' à la msgbox
    Else
        'Le code à exécuter si on répond 'non'
        Dim li As Long
        Dim i As Integer
        Dim t(1 To 8) As String
 
        For i = 1 To 8
            t(i) = Me.Controls("TextBox" & i).Text
        Next
        Workbooks("copy.xls").Sheets("Master").Range("d2:d9").Value = Application.Transpose(t)
        With Workbooks("Offres.xls").Worksheets("Clients")
            li = .Columns(1).Find(TextBox9.Value, , xlValues, xlWhole).Row
            .Cells(li, 2).Resize(, 8).Value = Application.Transpose(t)
        End With
 
    End If
 
    ActiveWorkbook.Save
    Workbooks("Offres.xls").Activate
    Sheets("MENU").Select
    Unload Me
    Corps_offre.Show
End Sub

Déclarer les variables de ligne de cellules en Long et non en Integer.

Utiliser avec parcimonie les références aux cellules entre crochets qui font appel à la méthode Evluate très gourmande en temps d'éxécution.

Utiliser les bloc With ... End With et éviter les select et activate multiple et non absolument nécessaires.

etc., etc...

A+
 

Zentin

XLDnaute Nouveau
Re : Macros très lente

Bonjour MJ13 et Hasco

@MJ13, le fichier est très lourd et même en enlevant les infos persos plus de 1Mb.

@Hasco,

Merci pour ce code, je viens de faire un essai, mais il y a un problème les infos du textbox1 sont recopiées sur la bonne ligne de la base de données, mais dans toutes les colonnes (B à I) même info que textbox1 et les infos des textbox 2,3,4,5,6,7,et 8 sont donc remplacée par les infos de la textbox1.

Concernant la rapidité, en effet dèjà nettement mieux qu'avant.

N'étant que débutante, je ne vois pas ce que je dois corriger dans ton code, encore un petit coup de puce stp.

Merci
Christine
 
G

Guest

Guest
Re : Macros très lente

Re,

Remplace la ligne : .Cells(li, 2).Resize(,8).Value = Application.Transpose(t)
Par :
Code:
.Cells(li, 2).Resize(8).Value = Application.Transpose(t)

Note que la virgule (,8) a disparue.:)
A+
 
Dernière modification par un modérateur:

Zentin

XLDnaute Nouveau
Re : Macros très lente

re,

Avec le nouveau code les infos sont transposées les unes en dessous des autres (toutes les textbox dans la même colonne) au lieu des unes à côtés des autres.
Donc le transpose avec les bonnes infos maintenant se fait à la verticale au lieu de horizontale.
On y est presque!
@+
 

Zentin

XLDnaute Nouveau
Re : Macros très lente

Re,

Génial, c'est exactement ce qu'il me fallait.
Y-a-t'il également un moyen de faire en sorte que la deuxième Macro soit plus rapide stp?

Pour rappel :
Code:
Private Sub CommandButton5_Click()
If MsgBox("Confirmez-vous la suppression de ce client?", vbQuestion + vbYesNo) = vbNo Then
Exit Sub
Else
Dim li As Integer 'déclare la variable li (LIgne)
Dim rng As Range
Dim txd, txi As String
If TextBox9 = "" Then Exit Sub
txd = TextBox9.Value
txi = TextBox9.Value
Do
Workbooks("Offres.xls").Activate
Worksheets("Clients").Activate
Set rng = Range("A:A").Find(txd)
Set rng = Range("A:A").Find(txi)
If rng Is Nothing Then
Exit Do
Else
Rows(rng.Row).Delete
End If
Loop
ActiveWorkbook.Save
Sheets("MENU").Activate
End If
End Sub

Et oui! j'ai enfin trouvé comment insérer la balise Code:p
Merci
Christine
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Macros très lente

Re, Bonjour Ges

Zentin:Ah, mais je comprend que je n'y comprenais rien, en tableau, je suis encore aussi nul qu'il y a 6 mois (on peut pas tout faire) :eek:.

Mais avec Ges, que je salue, tu devrais t'en sortir facilement :).
 
G

Guest

Guest
Re : Macros très lente

Re,
Salut Mj:)

Ben Christine vois-tu nous sommes sur un forum d'échange et non de production de fichiers et macros tout cuit.

Aussi c'est volontairement que je n'ai pas fait la deuxième macro pour te laisser adapter (tout au moins faire des essais) à partir de celles que je t'ai donnée.

De toute façon, n'ayant aucun classeur exemple sous les yeux, je ne sais pas sur quoi je travaille et j'aime pas naviguer à l'aveuglette.

L'est méchant l' hasco!

A+ avec tes essais
 

Zentin

XLDnaute Nouveau
Re : Macros très lente

Re,
Salut MJ:cool:

@Hasco, mais non, mais non, L'est pas méchant l'hasco :p puisqu'il m'a super dépannée pour le première Macro.
Je vais prendre mon weekend pour essayer de comprendre tes modifs dans mon premier code et reviendrai probablement vers le forum pour résoudre les problémes "erreur 1004-exécution 19 et toutti quanti".

Encore merci pour ton aide et excellente soirée

Christine
 

Zentin

XLDnaute Nouveau
Re : Macros très lente

Bonjour Hasco & MJ

N'ai pas eu la patience d'attendre le weekend alors voilà la macro 2 modifiée et fonctionnelle.
J'ai ajouté à la fin de la macro un clear de tous les textbox dans mon userform.
Merci de m'avoir donné un petit coup de pied aux fesses pour que je trouve une solution par moi-même.
Qu'en pensez-vous?

Christine

Code:
Private Sub CommandButton5_Click()
If TextBox9 = "" Then
MsgBox "VEUILLEZ CHOISIR UN CLIENT"
Exit Sub
Else
If MsgBox("Confirmez-vous la suppression de ce client?", vbQuestion + vbYesNo) = vbNo Then
Exit Sub
Else
Dim li As Long
        Dim i As Integer
        Dim t(1 To 9) As String
 
        For i = 1 To 9
            t(i) = Me.Controls("TextBox" & i).Text
        Next
        With Workbooks("Offres.xls").Worksheets("Clients")
            li = .Columns(1).Find(TextBox9.Value, , xlValues, xlWhole).Row
            .Cells(li, 1).Resize(, 9).Delete
        End With
        End If
        End If
    ActiveWorkbook.Save
    Sheets("MENU").Activate
    Dim Ctl As MSForms.Control
For Each Ctl In Me.Controls
    If TypeOf Ctl Is MSForms.TextBox Then
        Ctl.Text = ""
    End If
    Next
End Sub
 
G

Guest

Guest
Re : Macros très lente

Bonjour Christine,

Presque parfait. Manque un paramètre indiquant le sens de décalage des cellules supprimées(xlShiftUp ou xlShiftLeft)

Code:
.Cells(Li, 1).Resize(, 9).Delete xlShiftUp

Ce paramètre est important car si l'utilisateur rajoute des données, même provisoires à droite de ta ligne supprimée. Excel évaluera lui-même le sens de décalage et tu risque d'avoir des surpises.

Deuxième petite chose.
Dans la ligne:
Code:
li = .Columns(1).Find(TextBox9.Value, , xlValues, xlWhole).Row

Tu supposes que vba trouvera la cellule correspondant à la valeur de TextBox9. Si pour une raison ou une autre. Cette valeur a été modifiée entre son affichage dans le textBox ou qu'elle ne correspond plus à ce qu'il y avait dans la cellule->plantage.

Une solution possible
Code:
Dim c as range
set c = .Columns(1).Find(TextBox9.Value, , xlValues, xlWhole)
if not c Is Nothing then .Cells(c.row, 1).Resize(, 9).Delete xlSfiftUp

En règle générale il faut toujours s'attendre à ce que l'utilisateur ET vba ne se comportent pas comme on l'esperait.

Bonne programmation.

A+
 

Zentin

XLDnaute Nouveau
Re : Macros très lente

Re Hasco,

Ai fait les adaptations et tout est nickel pour .cells... mais pour plantage avec ta solution possible.

Encore merci pour tout, je croise les doigts pour que les utilisateurs (max. 4) se comporteront bien.
Aussi-non distribution de baffes, je peux me le permettre étant la seule femme!!

Excellent weekend et peut-être à bientôt sur ce forum.

Christine
 

Statistiques des forums

Discussions
312 245
Messages
2 086 571
Membres
103 247
dernier inscrit
bottxok