Valeurs des cellules, UserForm et boucles

Kirokk

XLDnaute Nouveau
Bonjour bonjour. :)
Etant novice en VBA, je m'en retour ne vers vous our quelques conseils avisés. :p
Voici mon problème :
_ Je souhaite récupérer les valeurs de cellules dans un UserForm
_ J'aimerais que si ces valeurs changent (et ce sera le cas), elles soient modifiées au même moment dans mon UserForm.

Voici le code actuel :
_ Du UserForm :
Code:
Private Sub UserForm_Activate()
    With Me
        .StartUpPosition = 3
        .Width = Application.Width
        .Height = Application.Height
        .Left = 0
        .Top = 0
    End With
End Sub

Private Sub UserForm_Click()
    
End Sub

Private Sub UserForm_Initialize()
    Me.StartUpPosition = 3
End Sub

_ De ma macro de lancement :
Code:
Sub Lancer_UserForm()
Dim nbr As Variant
Dim nombre As Variant

nombre = 0
    UserForm1.Show
    
    Do Until nombre = 25
    
        nombre = nombre + 1
        nbr = nbr + 5
        ' Go = TimeSerial(Hour(Time), Minute(Time), Second(Time) + Range("Feuil2!G1"))
    
        ' Application.OnTime Go, "Lancer_UserForm"
    
        ' Range("Feuil2!G2") = Time

        ' For nombre = 1 To 1000
            Range("Feuil3!A1") = nbr
            UserForm1.TextBox1.Text = nbr
            UserForm1.Repaint
        ' Next nombre
    Loop
End Sub

N'étant vraiment pas habitué au VB, je m'y perd pas mal :( ...
J'espère que vous saurez éclairer ma lanterne, pour le moment je fonce dans les murs :D
 

Kirokk

XLDnaute Nouveau
Re : Valeurs des cellules, UserForm et boucles

Le fichier csv est modifié toutes les 5 minutes environ, donc il faudrait que mon UserForm se rafraîchisse toutes les 5 minutes au maximum afin d'afficher un résultat fiable et à jour. Pourriez vous me faire un exemple de fonction gérant cela? (un intervalle court me convient parfaitement).
Je pense qu'il suffit de faire une boucle en intégrant la fonction de temps approprié (chose que j'ai déjà fait par le passé dans d'autres langages), mais la syntaxe en VBA m'es bien obscure :)

Si vous souhaitiez être averti chaque fois que ce logiciel enregistre une information
Ce n'est pas utile.
 

Dranreb

XLDnaute Barbatruc
Re : Valeurs des cellules, UserForm et boucles

Le code, dans un module ordinaire, pourrait ressembler à cela:
VB:
Option Explicit
Public LesNoms() As String, LesValeurs() As Long, LesHeures() As Date
Dim DernHeureFic As Date
Const NomFichier = "Schenck_matin2.csv"

Sub Démarrage()
UserForm2.Show
ChDrive ThisWorkbook.Path: ChDir ThisWorkbook.Path
TesterHeureCsv
End Sub

Sub TesterHeureCsv()
Dim HeureFic As Date, Le As Long, Ls As Long, Z() As String, TSpl() As String
If Not UserForm2.Visible Then Unload UserForm2: Exit Sub
HeureFic = FileDateTime(NomFichier)
If HeureFic <> DernHeureFic Then
   Open NomFichier For Input As #1
   Do While Not EOF(1): Le = Le + 1: ReDim Preserve Z(1 To Le): Line Input #1, Z(Le): Loop
   Close #1
   ReDim LesNoms(1 To Le), LesValeurs(1 To Le), LesHeures(1 To Le)
   For Le = 2 To UBound(Z)
      TSpl = Split(Z(Le), ";")
      Ls = Ls + 1
      LesNoms(Ls) = Replace(TSpl(0), """", "")
      LesValeurs(Ls) = CLng(TSpl(2))
      LesHeures(Ls) = CDbl(TSpl(4)) / 1000000: Next Le
   ReDim Preserve LesNoms(1 To Ls), LesValeurs(1 To Ls), LesHeures(1 To Ls)
   UserForm2.Raffraîchir
   DernHeureFic = HeureFic: End If
Application.OnTime Now + 5 / 86400, "TesterHeureCsv"
End Sub
Les tableaux LesNoms, LesValeurs et LesHeures seront connus dans la Public Sub Raffraîchir() de votre Userform2 (pourquoi 2 ?)

Ce n'est pas absolument indispensable, mais il serait plus propre de terminer votre Userform par ça :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = CloseMode = 0: If Cancel Then Me.Hide
End Sub
Le test de visibilité d'un userform provoque en effet bêtement l'exécution de son UserForm_Initialize si on l'a purement et simplement laissé décharger.
 

Kirokk

XLDnaute Nouveau
Re : Valeurs des cellules, UserForm et boucles

Mmmmh... Je me perd à partir de "Sub TesterHeureCsv()"
Si ce n'est pas abuser de votre temps, pourriez vous commenter les lignes à partir de cet endroit?
Un grand merci pour votre aide, encore une fois :)
de votre Userform2 (pourquoi 2 ?)
Rien de bien important, mais le 1 ne me laissait pas faire ce que je voulais (raison obscure )
 

Dranreb

XLDnaute Barbatruc
Re : Valeurs des cellules, UserForm et boucles

VB:
Sub TesterHeureCsv()
Dim HeureFic As Date, Le As Long, Ls As Long, Z() As String, TSpl() As String
If Not UserForm2.Visible Then Unload UserForm2: Exit Sub ' Termine le processus si l'Userform n'est plus visible.
HeureFic = FileDateTime(NomFichier) ' Récupère l'heure de dernière modification du fichier.
If HeureFic <> DernHeureFic Then ' Si cette heure est différente de celle qui avait été notée la dernière fois :
   Open NomFichier For Input As #1 ' Ouverture du fichier, puis son chargement rapide en tableau brut Z
   Do While Not EOF(1): Le = Le + 1: ReDim Preserve Z(1 To Le): Line Input #1, Z(Le): Loop
   Close #1 ' Fermeture du fichier.
   ReDim LesNoms(1 To Le), LesValeurs(1 To Le), LesHeures(1 To Le) ' Redimensionnement des tableaux au maxi possible.
   For Le = 2 To UBound(Z) ' pour chaque ligne d'entrée du tableau Z, brut de chargement :
      TSpl = Split(Z(Le), ";") ' Éclatement selon séparateur ";"
      Ls = Ls + 1 ' Incrément du numéro d'index des tables de sortie
      LesNoms(Ls) = Replace(TSpl(0), """", "") ' Là on en prend simplement le texte débarrassé des doubles guillemets
      LesValeurs(Ls) = CLng(TSpl(2)) ' On en prend le texte converti en nombre entier.
      LesHeures(Ls) = CDbl(TSpl(4)) / 1000000: Next Le ' Ben oui: c'est la date et l'heure en millionnième de jour.
   ReDim Preserve LesNoms(1 To Ls), LesValeurs(1 To Ls), LesHeures(1 To Ls) ' Retaille à l'effectivement garni.
   UserForm2.Raffraîchir ' Demande à l'Uf de prendre acte des nouveaux tableaux.
   DernHeureFic = HeureFic: End If ' Note pour la prochaine fois l'heure de dernière modification du fichier.
Application.OnTime Now + 5 / 86400, "TesterHeureCsv" ' Replanifie le contrôle pour dans 5 secondes (soit 5 / 86400 jours)
End Sub
Que cela ne vous dispense pas d'utiliser la touche F1 sur les mots clés du langage si vous ne comprenez comment les instructions assument l'effet expliqué en commentaire.
 

Dranreb

XLDnaute Barbatruc
Re : Valeurs des cellules, UserForm et boucles

Permettez moi de me re-citer :
Les tableaux LesNoms, LesValeurs et LesHeures seront connus dans la Public Sub Raffraîchir() de votre Userform2
C'est grâce au fait qu'ils sont déclarés Public dans un module ordinaire.
Et c'est naturellement de là que vous puiserez de quoi rectifier l'affichage.

P.S. Il serait possible, si plus facile à traiter, de se passer du tableau LesNoms mais d'avoir 3 tableaux ValMauv, ValPasse et ValBon à la place de LesValeurs et de n'enregistrer dans tous les tableaux qu'un élément pour chaque groupe de 3 lignes, le numéro Ls n'étant incrémenté que lorsque le nom est "SchenckMauv_M" (cas où la valeur sera aussi envoyée dans ValMauv(Ls) bien évidemment). Faudrait-il aussi un tableau de byte vallant en général 7 pour reproduire les info de la colonne Validity ? Il ne serait pas bon d'ignorer à tout jamais ce qui me parait relever d'incidents de fonctionnement possibles.
 
Dernière édition:

Kirokk

XLDnaute Nouveau
Re : Valeurs des cellules, UserForm et boucles

En fait pour ce qu'on m'a demandé de faire, on peut ignorer les autres lignes. Aussi, quelqu'un doit me faire un fichier plus clair ne contenant que les valeurs que je dois récupérer.
En fait là où je me perd, c'est surtout : que dois-je exactement mettre dans cette macro rafraîchir? Afin de tester votre code, j'ai simplement mis un Me.Repaint, pensant que cela suffirait pour tester tout ça.
Aussi, votre code est-il sensé créer des tableaux dans une feuille (comme le fait la macro d'ouverture de .csv que je possède déjà dans mon classeur)?
Désolé d'être aussi lent, mais j'ai pas mal d'autres choses qui m'occupent et je ne peux pas me concentrer à 100% sur le code.
 

Dranreb

XLDnaute Barbatruc
Re : Valeurs des cellules, UserForm et boucles

Bonjour.
Aussi, votre code est-il sensé créer des tableaux dans une feuille (comme le fait la macro d'ouverture de .csv que je possède déjà dans mon classeur)?
Non. Il créait des tableaux uniquement en mémoire. Pourquoi reporter dans une feuille des infos qui n'intéressent personne ?
Même pas pour afficher un graphique ? Quelqu'un y a pensé à ce truc ?
Attendons de voir ce nouveau fichier. On n'aura peut être plus besoin de tableau mais seulement des variables Public. Ou pas.
La lecture pourrait aussi se programmer dans l'Userform.
 

Kirokk

XLDnaute Nouveau
Re : Valeurs des cellules, UserForm et boucles

Attendons de voir ce nouveau fichier
C'est ce que j'allais vous proposer ;)
Je vous retiendrais au courant lorsque le nouveau fichier serait fait, et je pense en effet qu'il n'y aura pas besoin de créer de tableau.
Même pas pour afficher un graphique
On ne me l'a pas demandé.

Cependant, je pense qu'il sera nécessaire de reporter les valeur du nouveau fichier dans un tableau pour éventuellement faire des statistiques sur l'évolution de la production. Normalement, le fichier en question comportera uniquement la quantité de pièces produites ("Schenckbon_M") et s'incrémentera toutes les 5 minutes avec le nombre de nouvelle pièces fabriquées.
 

Kirokk

XLDnaute Nouveau
Re : Valeurs des cellules, UserForm et boucles

Me revoilà !!!!
J'ai bien avancé, il ne ma manque qu'une petite chose :)
Voilà, tout fonctionne comme il le faut, seulement j'aimerais pouvoir rajouter un bouton "STOP". Malheureusement, une fois le programme lancé, impossible de fermer le UserForm autrement qu'avec "Ctrl+Pause".
Je vous joins naturellement le programme dans l'état actuel, avec le fichier que je récupère (avec ligne unique comme nous en avions parlé), bien plus simple à gérer qu'avant.
 

Pièces jointes

  • Affichage_prod_1.1.xlsm
    30.7 KB · Affichages: 40
  • Archive_SupervisionMU2Montage0.zip
    316 bytes · Affichages: 18

Dranreb

XLDnaute Barbatruc
Re : Valeurs des cellules, UserForm et boucles

Bonsoir.
Pour de multiples raisons, je vous recommande de revenir à la structure générale proposée au #17
Un appel récursif à la procédure Bouclage avant qu'elle ne soit terminée n'est vraiment pas correct.
 

Kirokk

XLDnaute Nouveau
Re : Valeurs des cellules, UserForm et boucles

Le problème du #17 est que je n'affiche pas les valeurs dans un tableau, or c'est quelque chose qui m'a été demandé. Mon seul problème ici est que Application.Wait m'empêche de faire une action pendant le déroulement du programme (je pense que cela vient de là). Après je pense que vous parlez de ma condition qui ramène au bouclage persistant, et je pense aussi que ce n'est pas la meilleure solution. Et c'est d'ailleurs bien pour cela que je reviens vers vous :)
Merci encore d'être disponible pour m'aider dans ma tâche ;)
 

Dranreb

XLDnaute Barbatruc
Re : Valeurs des cellules, UserForm et boucles

C'est pour cela qu'il ne faut pas utiliser Wait, mais Application.OnTime.
Il y avait juste à réécrire Raffraichir. Tout le processus de lancement et de test de la date et de heure du fichier doivent rester comme ils étaient. Jusqu'aux 5 secondes. Pourquoi prendre plus de retard sur la sortie d'un nouveau fichier ?
Mais la lecture peut se faire dans l'Userform.
Avec ce qui avait été écrit ça s'arrêtait en fermant l'userform parce qu'alors il n'est plus visible, or c'est testé et alors la procédure ne se replanifie plus.
 

Discussions similaires

Statistiques des forums

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