macro: mettre le turbo !

J

JJ1

Guest
Bonjour à tous,
J'ai une petite macro simple qui fonctionne mais d'une lenteur...!

Le principe est simple: je copie une combinaison de 6 nombres (présentes en colonnes AU:AZ) en AD8:AI8, je temporise pour laisser le temps aux formules de calculer, je fais un test, si OK je copie la combinaison en BB:BG sinon je passe à la suivante.
voici ma macro:

Dim i As Integer, ligne As Integer, a As Integer, j As Integer, b As Integer
On Error Resume Next
For ligne = 1 To 100
a = 0
b = 0
For i = 47 To 52 'AU AZ
a = Cells(ligne, i).Value
Cells(8, i - 17).Value = a 'AD8 à AI8
Next i
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 1
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
If Cells(7, 41).Value < 7 And Cells(9, 36).Value > 0 And Cells(9, 36).Value < 4 And Cells(4, 36).Value < 4 Then
For j = 47 To 52
b = Cells(ligne, j).Value
Cells(ligne, j + 7).Value = b 'BB à BG
Next j
End If
Next ligne

Avez vous une solution pour l'accelerer car elle est vraiment trop lente?
merci et bon dimanche
 

Bebere

XLDnaute Barbatruc
Re : macro: mettre le turbo !

bonjour Jj1,Bof
cela devrait aller + vite
regarde le commentaire
Sub e()
Dim i As Integer, ligne As Integer, a As Integer, j As Integer, b As Integer
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
On Error Resume Next
For ligne = 1 To 100
a = 0
b = 0
For i = 47 To 52 'AU AZ
a = Cells(ligne, i).Value
Cells(8, i - 17).Value = a 'AD8 à AI8
Next i
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 1
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
'Cells(9, 36).Value > 0 And Cells(9, 36).Value < 4?Cells(9, 36).Value > 0 or Cells(9, 36).Value < 4
If Cells(7, 41).Value < 7 And Cells(9, 36).Value > 0 And Cells(9, 36).Value < 4 And Cells(4, 36).Value < 4 Then
For j = 47 To 52
b = Cells(ligne, j).Value
Cells(ligne, j + 7).Value = b 'BB à BG
Next j
End If
Next ligne
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With

End Sub

à bientôt
 

JeanMarie

XLDnaute Barbatruc
Re : macro: mettre le turbo !

Bonjour

Tu as sorti la grosse cavalerie pour le calcul du délai de pause, tu as recopié le 2ème exemple de l'aide VBA, pourquoi ne pas utiliser le 3ème, avec Now + TimeValue("00:00:01").

Tu peux aussi copier les valeurs des cellules sans passer par les boucles, ces deux lignes font la même chose.
Range("AD8:AI8").value = Range("AU" & ligne & ":AZ" & ligne).value
Range("BB" & ligne & "BG" & ligne).value = Range("AU" & ligne & ":AZ" & ligne).value

Sur la proposition de Bebere, de passer le mode de calcul en mode manuel, et de laisser la pause à 1 seconde pour le recalcul des formules, sans ordonner un .calculate, les formules ne seront jamais recalculées et la pause est donc inutile.

@+Jean-Marie
 
J

JJ1

Guest
Re : macro: mettre le turbo !

Bonsoir et merci pour vos solutions.
2 questions:
Si j'utilise Range=Range au lieu de For..., que devient mon test IF Cell(...car je n'ai plus la variable i
Est ce plus rapide que la boucle?
La pause est obligatoire car si les cellules ne sont pas recalculées le test ne peut pas se faire.

merci
JJ1
 

JeanMarie

XLDnaute Barbatruc
Re : macro: mettre le turbo !

Bonsoir

Je ne vois pas dans la ligne
If Cells(7, 41).Value < 7 And Cells(9, 36).Value > 0 And Cells(9, 36).Value < 4 And Cells(4, 36).Value < 4 Then
la prise en compte de la variable i, ...

Si tu places une instruction de calculate sur la plage range(....).calculate, je pense que tu pourras supprimer la pause de ta macro.

@+Jean-marie
 

Hellboy

XLDnaute Accro
Re : macro: mettre le turbo !

Bonsoir a tous

Une suggestion:



Dim i As Byte, ligne As Byte, j As Byte

On Error Resume Next
Application.ScreenUpdating =
False
Application.Calculation = xlCalculationManual
For ligne = 1 To 100
  
For i = 47 To 52 'AU AZ
    Cells(8, i - 17) = Cells(ligne, i)
  
Next i
  
  Application.Calculation = xlCalculationAutomatic
  DoEvents
  
  
If Cells(7, 41).Value < 7 And Cells(9, 36).Value > 0 And Cells(9, 36).Value < 4 And Cells(4, 36).Value < 4 Then
    Application.Calculation = xlCalculationManual
   
For j = 47 To 52
      Cells(ligne, j + 7) = Cells(ligne, j)
   
Next j
    Application.Calculation = xlCalculationAutomatic
    DoEvents
  
End If
  
Next ligne
Application.ScreenUpdating =
True

Autre chose, est-ce que tu as des fonctions dans tes cellules que tu as construitent toi même ?

a+
 
J

JJ1

Guest
Re : macro: mettre le turbo !

Bonsoir et merci

je vais essayer toutes vos soluces ce WE

Dans mon tableau il n'y a que des formules, assez "lourdes" ....vous voyez celles du style envoyées par Monique...(qui font 3 lignes de long !!!)

Bonne soirée
 

Discussions similaires

Réponses
0
Affichages
169

Statistiques des forums

Discussions
312 379
Messages
2 087 769
Membres
103 662
dernier inscrit
rterterert