VBA Excel: Attente récupération de données
gregt73
Messages postés
55
Statut
Membre
-
gregt73 Messages postés 55 Statut Membre -
gregt73 Messages postés 55 Statut Membre -
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
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
A voir également:
- Vba attendre 1 seconde
- 1 milliard en seconde - Accueil - Technologies
- Toutes les formules de maths seconde pdf - Télécharger - Études & Formations
- Pc s'allume 1 seconde puis s'éteint ✓ - Forum Windows
- L'indice n'appartient pas à la sélection vba - Forum VB / VBA
- Excel compter cellule couleur sans vba - Guide
2 réponses
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.
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.
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...
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...
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..!
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..!
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.
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.