VBA Excel: Attente récupération de données

Fermé
gregt73 Messages postés 52 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 21 janvier 2019 - 9 août 2018 à 11:24
gregt73 Messages postés 52 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 21 janvier 2019 - 10 août 2018 à 15:43
Bonjour à tous,

N'étant pas très doué en macro excel, je me permer de vous demander de l'aide après avoir fouiller sur beaucoup de forum...

J'ai une macro dans laquelle je vais récupérer des valeurs (données historiques) dans un autre logiciel.
Suite à ça, je veux faire des calculs à partir de ces valeurs et faire de la mise en forme...Ca parait plutôt simple.

Sauf que je fais un copier/coller des valeurs récupérés vers une autre plage. Mais comme la recuperation prend un peu de temps, le copier/coller s'execute trop vite (avant la recuperation des données en fait..) et mes cellules de destinations ne contiennent rien, donc tout mon calcul est faux.

Je cherche donc un moyen d'être sur que la recuperation des données soit faites avant de faire le copier/coller. J'ai essayé le WAIT, le DOEVENTS, le CALCULATE, mais tout ça ne fonctionne pas dans mon cas.

Si qq1 a une idée...

Merci d'avance.

Ci dessous le code
Sub Récupération_compteur_moteur()
'
'
' MACRO RECUPERANT LES DONNEES HISTORIQUES
'
'
' Déclaration des variables

Dim Derlig As Long
Dim Données As Worksheet
Set Données = Worksheets("DATA")
Dim i As Integer
Dim j As Integer
Dim text As String
Dim calc As Long


Application.ScreenUpdating = False


' Effacement colonnes B, C, D, E, F, G et H de "DATA"

Données.Range("B11:H65536").Delete

' Calcul du nombre repères

ActiveWorkbook.Worksheets("PARAMETRAGE").Select

Derlig = Range("C11").End(xlDown).Row

' Copie du repères dans "DATA"

Range("B11:C" & Derlig).Copy
Données.Cells(11, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False


' Ecriture du chemin du logiciel extérieur

For i = 11 To Derlig
Données.Cells(i, 7).Value = """" & Données.Cells(3, 7).Value & "." & Données.Cells(i, 2).Value & "." & Données.Cells(i, 3).Value & "." & Données.Cells(3, 8).Value & ".Value:Value" & """"



' Récupération de la valeur

text = Données.Cells(i, 7).Value
Données.Cells(i, 8).Formula = "=RECUP(" & text & " ,NOW,,,,0,0,0,1,,,,,,,,,0,,0)"

Next i

' Copie de la valeur
'PROBLEME ICI
Données.Range("H11:H" & Derlig).Copy
Données.Cells(11, 6).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False


' Récupération de la valeur en hr

For i = 11 To Derlig

' calc = Val(Cells(i, 6).Value)
Données.Cells(i, 5).Value = (Val(Données.Cells(i, 6).Value)) / 3600

Next i

' Comparaison valeur par rapport aux seuils pour affichage icon set

For i = 11 To Derlig
If (Données.Cells(i, 5).Value < Worksheets("PARAMETRAGE").Cells(i, 9).Value) Then
Données.Cells(i, 4).Value = 0
End If
If (Données.Cells(i, 5).Value >= Worksheets("PARAMETRAGE").Cells(i, 9).Value And Données.Cells(i, 4).Value < Worksheets("PARAMETRAGE").Cells(i, 6).Value) Then
Données.Cells(i, 4).Value = 1
End If
If (Données.Cells(i, 5).Value >= Worksheets("PARAMETRAGE").Cells(i, 6).Value And Données.Cells(i, 4).Value < Worksheets("PARAMETRAGE").Cells(i, 7).Value) Then
Données.Cells(i, 4).Value = 2
End If
If (Données.Cells(i, 5).Value >= Worksheets("PARAMETRAGE").Cells(i, 7).Value And Données.Cells(i, 4).Value < Worksheets("PARAMETRAGE").Cells(i, 8).Value) Then
Données.Cells(i, 4).Value = 3
End If
If (Données.Cells(i, 5).Value >= Worksheets("PARAMETRAGE").Cells(i, 8).Value) Then
Données.Cells(i, 4).Value = 4
End If
Next i


' Copie de la valeur et icon set de "DATA" vers "PARAMETRAGE"

For i = 11 To Derlig
Données.Range("B11:E" & Derlig).Copy
Worksheets("PARAMETRAGE").Cells(11, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next i

j = Derlig + 1
On Error Resume Next
Worksheets("PARAMETRAGE").Range("B" & j & ":I65536").SpecialCells(xlCellTypeConstants, 23).ClearContents

' Ecriture date actuelle

Worksheets("PARAMETRAGE").Range("J2").FormulaR1C1 = "=NOW()"



ActiveWorkbook.Worksheets("PARAMETRAGE").Select



Application.ScreenUpdating = True

End Sub

2 réponses

rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 28
9 août 2018 à 14:51
Bonjour,

J'ai déjà été confronté à ce même problème des dizaines de fois lors de grosses programmations.
Certaine fois le code s'exécute effectivement trop vite.

Des fois j'utilise cela :
Application.Wait (Now + TimeValue("0:00:01"))

Et d'autre fois j'utilise une fonction que vous pouvez facilement trouver sur le net qui s'appelle delay(ms) qui permet d'attendre en milisecondes.

Meilleures salutations.
0
gregt73 Messages postés 52 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 21 janvier 2019
10 août 2018 à 14:21
Bjr REVOLV3r, et merci pour votre réponse,

J'ai (ENCORE) essayé le Wait, mais ca ne fonctionne pas.
En fait, la macro attend bien le temps reglé, mais bizarement, mes valeurs ne sont pas mise à jour.

On dirait que la MAJ des valeurs (depuis le logiciel extérieur) se fait quand la macro est fini...!C'est possible ca? Que les valeurs soit stocké "je sais pas où" et que l'affichage dans ma cellule soit faite à la fin de la macro?
Et du coup, mon copier/coller au milieu de la macro ne fonctionne toujours pas...

Si vous avez encore des idées...
0
rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 28
10 août 2018 à 14:25
vous pouvez essaye d'activer la page ou d'activer le range(A1) de la page ou les données doivent être copiée afin de forcer excel à mettre à celles-ci. Redites-moi.
0
gregt73 Messages postés 52 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 21 janvier 2019
10 août 2018 à 14:47
Après la commande "=RECUP(" & text & " ,NOW,,,,0,0,0,1,,,,,,,,,0,,0)" dans la macro, j'ai rajouté Range ("H" & Derlig).Activate.
Je ne suis pas vraiment sur que c'est celà dont vous parlez, mais ca ne fonctionne toujours pas...
0
rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 28
10 août 2018 à 14:58
Si vous lancez la macro step by step, lors de l'activation du range, Est-ce que les données collées sont présentes ?
0
gregt73 Messages postés 52 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 21 janvier 2019
10 août 2018 à 15:18
Effectivement, meme pas pensé de faire du pas à pas...!!
Alors, tout se passé pour le mieux (on avance de pas en pas) jusqu'au moment de la commande RECUP où, au lieu de faire ligne à ligne (avec ma commande for I/next I), le sablier s'affiche......puis tout déroule d'un seul coup jusqu'à la fin de la macro...!! Où j'arrive donc au meme probleme. Je comprend plus rien..!
0
gregt73 Messages postés 52 Date d'inscription lundi 25 mai 2009 Statut Membre Dernière intervention 21 janvier 2019
10 août 2018 à 15:43
Je viens de faire une boucle infinie après avoir censé récuperer la valeur (par =RECUP...).
Et là, je vois les cellules de destination (celles qui doivent récupérer les valeurs de l'autre logiciel) afficher un #ACQUIRING, qui est la syntaxe lorsque l'on est en train d'acquerir les valeurs.
SAuf que si j'écris la formule à la main, le ACQUIRING apparait 0.5 voir 1 seconde avant de voir afficher la valeur.
Ce qui prouve que dans la macro, la valeur n'est pas récupéré tant que la macro n'est pas fini, donc mon copié/coller ne fonctionnera jamais...
En fait, il faudrait 2 macros, 1 sui récupère les valeurs, qui se termine, puis l'autre qui se lance pour faire le traitement et mise en page dans excel, non?
COmment est ce que je pourrais faire ça??

MErci d'avance pour vos réponses.
0