Récupérer une valeur aléatoire

Bonjour à tous et à toutes,

Je suis un peu nouvelle dans la programmation VBA mais j'ai besoin de faire la macro suivante :

Dans ma case A2, une valeur aléatoire s'affiche et change toutes les 10 secondes. J'ai besoin de récupérer ces valeurs dans un "tableau" afin de pouvoir tracer un graphique (pour l'évolution de la valeur dans le temps). J'ai donc aussi besoin de récupérer l'heure à laquelle j'ai récupérer chaque valeur. J'ai essayé une macro avec une boucle Do While mais le problème c'est que je ne peux plus naviguer dans mon fichier quand la macro est lancée.

Pouvez-vous m'aider à réaliser cette macro svp ? Au moins quelques pistes de fonctions.

Merci par avance.

Bonjour,

Si tu fournis un classeur adéquat, on pourra examiner le problème...

Cordialement.

Oui. Juste que ma valeur aléatoire vient d'un autre logiciel donc c'est normal qu'il y a l'erreur de référence. Je suis entrain d'essayer de faire la macro à partir du début. Du coup ma valeur aléatoire est dans l'onglet traitement d'informations en C6. J'essaye de faire mon tableau dans la colonne E de l'onglet Traitement d'informations". J'ai réalisé un bouton "superviser" dans l'onglet température pour lancer ma macro et c'est sur cet onglet que le graphique s'affichera.

14application-v1.xlsm (514.36 Ko)

Bonjour,

peux-être avec un DoEvents dans ta boucle . pour libérer du temps processeur..

où bien plutôt qu'une loop tu utilise la fonction OnTime...

Tu dis que ta valeur aléatoire est en C6... Ce qu'il importe de savoir, c'est comment elle y arrive, quelle procédure permet de fournir cette valeur... Je ne vois rien dans le classeur.

Tu dis aussi que c'est la proc. Température avec laquelle tu veux recueillir ces valeurs... Je ne vois pas bien comment ! De toutes façons, elle à réécrire en éliminant la flopée de Select et Activate qui occupent déjà la moitié du code (et en plaçant comme il se doit les déclarations en tête de procédure, et en indentant le code, ce qui permettra de le lire...)

Pour l'instant, la question numéro 1 est de savoir comment arrive cette valeur !

Je suis arrivé à ce code là :

Sub temperature()

'Sélection de la feuille traitement d'informations'

Sheets("Traitement d'informations").Activate

'Sélection de la cellule C6'

Range("C6").Select

Range("E1").Value = Range("C6").Value

Range("C6").Copy

Range("E1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Sheets("Température").Activate

End Sub

Pour l'instant je récupère la valeur à l'instant que j'ai lancé la macro. J'ai besoin de récupérer la valeur toutes les 10 secondes sans effacer les précédentes qui ont été récupérer. L'onglet traitement d'information va être masqué pour l'utilisateur.

La valeur aléatoire est générée par le logiciel Kepware. Excel la récupère grâce à cette formule (qui est dans l'onglet température): =datahub|default!Channel_0_User_Defined.Random.Temperature

Je ne connais pas les fonctions DoEvents ou OnTime, comment fonctionne OnTime ?

Elle apparaît donc en Température, A5 !

Est-ce que quelque chose déclenche la mise à jour ?

Comment est portée l'heure qui figure en B6 (même feuille) ?

L'heure s'est affichée par rapport à une ancienne macro que j'avais créé, c'est mon second problème.

La mise à jour se fait lorsque mon fichier excel se connecte au serveur Kepware

Et qu'est-ce qui déclenche cette connexion ?

Il faut avoir les deux logiciels sur son ordinateur. C'est juste un lien. Considérons juste que c'est une valeur qu'on change toutes les 10 secondes.

J'ai essayé de faire ma macro avec un tableau dynamique, mais le tableau ne s'affiche pas dans mon excel et j'ai des erreurs. Je n'arrive pas à avancer.

Sub Workbook_BeforeClose(Cancel As Boolean)

Application.OnTime TimeValue(vTiming), Procedure:="temperature", Schedule:=False

End Sub

Sub temperature()

'Sélection de la feuille traitement d'informations'

Sheets("Traitement d'informations").Activate

'Déclaration tableau dynamique'

derniere = Range("H1").End(xlDown).Row

Dim tab1()

ReDim tab1(derniere)

'Sélection de la cellule C6'

Range("C6").Select

Range("E1").Value = Range("C6").Value

Range("C6").Copy

Range("E1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

tab1(i) = Range("E1")

vTiming = Now + TimeValue("00:00:02")

Application.OnTime TimeValue(vTiming), "temperature"

End Sub

Si on n'a pas de déclencheur, cela reste quelque peu aléatoire. On peut toujours récupérer une valeur toutes les 10 secondes...

Mais à partir de quand ?

[Encore une fois ! pas de select ni activate dans un code VBA qui se respecte ! Ce sont des opération parasite qui ne font que prendre du temps inutilement ! )

Je reprends : si tu as mis un bouton pour lancer l'enregistrement, on peut effectivement enregistrer la valeur de la cellule A5 toutes les 10 secondes.

Je pensais avoir posé la question mais je ne la retrouve pas : quel est le type de donnée de la valeur, et sous quel format apparaît-elle ? Cela peut avoir son importance...

Tu enregistres sur Traitement d'informations en colonne E : à partir de E1 ou de E2 ?

Tu n'enregistres pas l'heure du prélèvement ?

Et puis dans la foulée, 1 enregistrement toutes les 10 secondes, ça fait 360 enregistrement à l'heure...

Est-ce que chaque fois que tu lances une session d'enregistrements, la plage des enregistrements précédents est effacée ?

Bonsoir,

A défaut de réponses, je lâche le système élémentaire pour opérer tes enregistrements...

Dim Enreg As Boolean, t, RgRef As Range

Sub Temperature()
    Static n As Integer
    Dim v
    v = Worksheets("Température").Range("A5"): n = n + 1
    RgRef.Offset(n) = v
    If Enreg Then
        t = t + TimeValue("00:00:10")
        Application.OnTime t, "Température"
    Else
        n = 0
    End If
End Sub

Sub Enregistrer()
    If Not Enreg Then
        Set RgRef = Worksheets("Traitement d'informations").Range("E1")
        Enreg = True: t = Now
        Température
    End If
End Sub

Sub StopEnreg()
    Enreg = False
End Sub

Je reprends donc ton bouton "Superviser" pour lancer l'opération, lequel ne lance pas directement la proc. Température mais une proc. Enregistrer qui initialise 3 variables de niveau module : une variable booléenne Enreg qu'elle met à True, une variable t qui recueille la date et l'heure du lancement, et une variable plage à laquelle est affectée la cellule E1 de la feuille où doivent être enregistrées les valeurs se modifiant en A5 de la feuille Température. La proc. Température est lancée à la suite et va donc s'exécuter une première fois pour ensuite s'entretenir elle-même en se relançant toutes les 10 minutes.

Cette proc. prélève la valeur et l'affecte, en utilisant une variable statique (qui ne perd pas sa valeur entre deux exécution de la procédure) qui permet que chaque valeur prélevée soit inscrite ligne suivante (la première sera donc en E2, la suivante en E3, etc.)

La proc. à chaque exécution incrémente t de 10 minutes, ce qui définit son prochain lancement programmé par une instruction OnTime. Système tout à fait simpliste et fiable...

Elle teste à chaque fois également la valeur de Enreg avant de poursuivre le processus (si True). Ce qui permet de pouvoir l'arrêter simplement en passant la variable à False, ce que fait la proc. StopEnreg lancée par un bouton Stop.

En l'état, l'arrêt n'intervient qu'après la dernière exécution programmée... On peut si on le souhaite la déprogrammer pour avoir un effet immédiat. Lors de l'arrêt, la procédure réinitialise sa variable statique, il y aurait lieu cependant de lui faire faire ce que l'on souhaite en ce qui concerne le devenir des enregistrements réalisés (Cf. mes questions...)

De même il y a lieu de prévoir l'arrêt de la procédure lors de la fermeture du classeur (ou à l'inverse d'empêcher la fermeture si la procédure est en cours)...

NB- J'ai basculé le contenu de ta proc. Auto_Open (une vieillerie remplacée par les évènementielles et qu'il n'y a aucune raison de maintenir) sur la procédure Workbook_Open que tu trouveras donc dans le module ThisWorkbook.

Cordialement.


Rechercher des sujets similaires à "recuperer valeur aleatoire"