après avoir vu un code ici
http://www.vbfrance.com/code.aspx?ID=16976
Je me suis dit que j'allais mettre aussi le mien
j'ai un appareil qui m'envois des données (via le port com - mais c'est pas l'objet ici) toutes les secondes. j'en fait un graphe (courbe) si la fenêtre est ouverte. et pas si elle est fermée (travail un peu comme un pop-up)
Créer une forme "capteur1" Dans lequel vous mettre un MSCHART que vous nommez "Graph"
Il doit avoir plusieurs propriété pour avoir de belles courbes mais vous trouverez au fur et a mesures de vos recherche (bouton droit sur l'objet MSChart -> propriété).
Je peux avoir 4 capteurs maximum (capteur1->capteur4)
Ayez une forme qui envois les données (fonction graph) et qui ouvre la forme du capteur pour voir le graphe.
Source / Exemple :
'a mettre dans un module
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim YMax(4) As Double
Dim YMin(4) As Double
Dim XMax(4) As Long
Dim XMin(4) As Long
'heure : l'heure de l'aquisition
'data : la valeure de l'aquisition
'capteur : le nom de la forme "capteur1"
'NomCapteur : le nom pour le titre de la forme
Function Graph(Heure As String, data As Double, capteur As String, NomCapteur As String)
Dim NumCap As Integer
Dim f As Form
For Each f In Forms
If f.Name = capteur Then 'on recherche pour voir si la forme est active
NumCap = Int(Mid(capteur, 8, 1))
If f.Graph.Tag = "" Then
'première édition
YMax(NumCap) = 0
YMin(NumCap) = Val(999999.9999) 'valeure max pour mes capteurs
f.Graph.Tag = "fin"
f.Graph.ColumnCount = 1 '1 seul capteur
f.Graph.RowCount = 0 'pas de données
f.Graph.Plot.Axis(2).AxisScale.Hide = True 'on cache les valeure numérique à droite
With f.Graph.Plot.Axis(VtChAxisIdY) 'on définit l'axe des Y
.CategoryScale.Auto = False
.CategoryScale.DivisionsPerLabel = 3
.CategoryScale.DivisionsPerTick = 3
.CategoryScale.LabelTick = True
.ValueScale.MinorDivision = 0
End With
'Les noms des axes et du graphique
f.Graph.Plot.Axis(VtChAxisIdY).AxisTitle.Text = "HZ" 'je recois une frequence
f.Graph.Plot.Axis(VtChAxisIdX).AxisTitle.Text = "Heure" 'par rapport au temps
With f.Graph.Plot.Axis(VtChAxisIdX) 'on définit l'axe des Y
.CategoryScale.Auto = False
.CategoryScale.DivisionsPerLabel = 5
.CategoryScale.DivisionsPerTick = 5
.CategoryScale.LabelTick = True
.ValueScale.MinorDivision = 0
End With
XMin(NumCap) = Int(Mid(Heure, 1, 2) * 10000 + Mid(Heure, 4, 2) * 100 + Mid(Heure, 7, 2))
'le nom de la forme... retiré du titre du graph car prend trop de place !
f.Caption = NomCapteur
End If
'a tous les coups
f.Graph.Column = 1
'On choisit le capteur 1
'
' si le graphe a plus de 32 767 données il plante :(
' 32767 est la donnée max pour un integer !
'
If f.Graph.RowCount >= 32767 Then
'décalage de 1 donnée sur la gauche
'on perd la donnée de gauche
For j = 2 To 32767
f.Graph.Row = j
TempHeure$ = f.Graph.RowLabel
TempData% = f.Graph.data
f.Graph.Row = j - 1
f.Graph.RowLabel = TempHeure$
f.Graph.data = TempData%
Next
f.Graph.Row = 32767
Else
'on continue à compter
f.Graph.RowCount = f.Graph.RowCount + 1
End If
'dernière donnée
f.Graph.Row = f.Graph.RowCount
f.Graph.RowLabel = Heure 'mettre l'heure sur le graphe
f.Graph.data = data 'mettre la donnée sur le graphe
If YMax(NumCap) < data Then YMax(NumCap) = data + (10 - (data Mod 10))
If YMin(NumCap) > data Then YMin(NumCap) = data - (data Mod 10)
'axes des Y
If YMax(NumCap) - YMin(NumCap) < 11 Then
f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = YMax(NumCap) - YMin(NumCap)
Else
f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10
End If
With f.Graph.Plot.Axis(VtChAxisIdY)
.ValueScale.Maximum = YMax(NumCap)
.ValueScale.Minimum = YMin(NumCap)
End With
'Axes des X
If f.Graph.RowCount < 11 Then
f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = 1
f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = 1
Else
f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = Int(f.Graph.RowCount / 10)
f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = Int(f.Graph.RowCount / 10)
End If
End If
'fin de la forme
Next
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''
''' Dans votre forme Capteur1
'' où il y a 1 MSCHARt nommé graph
''' mettez ce code
'''''''''''''''''''''''''''''''''''''''''''''''''''
Dim lar As Long, lng As Long
Private Sub Form_Load()
lng = Me.Width
lar = Me.Height
Graph.Top = 0
Graph.Left = 0
Graph.Width = lng
Graph.Height = lar - 200
Graph.Plot.SeriesCollection(1).Pen.VtColor.Blue = False
Graph.Plot.SeriesCollection(1).Pen.VtColor.Green = False
Graph.Plot.SeriesCollection(1).Pen.VtColor.Red = True
End Sub
Private Sub Form_Resize()
Dim ctl As Control
If (Me.WindowState = 1) Then Exit Sub
For Each ctl In Me.Controls
If TypeOf ctl Is ComboBox Then
ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, ctl.Width * Me.Width / lng
Else
'Les comboboxes ont leur propriété Height en lecture seule
ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, _
ctl.Width * Me.Width / lng, ctl.Height * Me.Height / lar
End If
Next
lng = Me.Width
lar = Me.Height
End Sub
Conclusion :
'''''''''''''''''''''''''''''''
'' Vous appelez le tout de la sorte
'''''''''''''''''''''''''''''''
Graph(date(), 123456.1234, "Capteur1", "Titre de mon graphe")
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.