Opgelost Gecombineerde grafiek in en uitschakelen met VBA

  • Onderwerp starter Onderwerp starter LRR
  • Startdatum Startdatum
Dit topic is als opgelost gemarkeerd
Status
Niet open voor verdere reacties.

LRR

Gebruiker
Lid geworden
27 jul 2023
Berichten
35
Hallo Forumlezers,

Ik ben als hobbyist bezig met het via Excel, in combinatie met VBA , aansturen van meetapparatuur.
Ik doe dit puur voor de hobby en om er van te leren. Gezien mijn leeftijd (75 jaar) zet ik veel commentaar in het VBA programma.
Ik heb vroeger wel gewerkt met Excel maar dat was puur voor administratieve doeleinde.

Wat ik nu doe is heel anders, de meetapparaten worden aangestuurd via een zogenaamde HPIB interface.
En deze interface wordt weer aangestuurd via USB en dus via de serie module van VBA weer door Excel.

Alles wat ik tot nu toe van plan was is na lang uitproberen gelukt.
Er zullen wel deskundige zijn die na het zien van mijn VBA programma dat het anders kan en misschien ook netter geprogrammeerd
maar het werkt nu wel goed.

Het moeilijkste deel was het mogelijk maken van een variabele X-as. Stel dat je 100 meetpunten of meer heb.
Dan wordt de grafiek erg in elkaar gedrukt. Via een schuif balk is het nu mogelijk om de grafiek op te delen in blokken van 50 punten.
Staat de balk geheel links dan is de totale grafiek zichtbaar. Dit heb ik gemaakt naar voorbeeld van iemand op internet met formules
voor X en Y-as en zogenaamde indirecte waarde. Helemaal begrijpen doe ik dat niet maar het werkt goed.


Als voorbeeld heb ik een samenwerking van een generator en een niveau meter grafiek als bijlage meegestuurd.
Helaas lukt het me niet om na uitschakelen en weer inschakelen van de computer om de X-as via de schuif balk te verdelen in stukjes.
Dat werkt dus wel als de grafiek geschreven is en de computer nog niet is uitgezet. Maar dat is niet mijn vraag.


Mijn vraag is het volgende:

Stel ik heb een grafiek gemaakt en daarna heb ik iets gewijzigd aan het te meten object wat tussen de generator en de niveau meter zit.
Nu zou ik de grafiek opnieuw willen opmeten maar de oude grafiek moet blijven staan. Dus de X-as blijft gelijk en er komen eventuele nieuwe waarde voor de Y-as.
Deze nieuwe grafiek zou dan in een andere kleur geschreven moeten worden.

De keuze om een nieuwe over een bestaande grafiek heen te schrijven zou ook via een button op het user formulier gemaakt moeten worden.
Is deze button niet aangevinkt dan altijd een totaal nieuwe grafiek bij aanvinken dus oude laten staan en nieuwe er over heen.

Tot nu toe zijn alle voorbeelden (op internet) van gecombineerde grafieken met reeds bestaande data gegevens welke je met de Excel functies kan realiseren.
Ik zoek dus een methode die via VBA ingesteld kan worden en uitgeschakeld kan worden en die ook de mogelijkheid van de variabele X-as mogelijk blijft houden.

Wie durft deze uitdaging aan?
Met vriendelijke groet,

Loek
 

Bijlagen

Je hebt een leuk project met aansturing van een IEEE poort geproduceerd!

Aan je userform een checkbox "Tweede reeks" toegevoegd die de data uit kolom C toevoegt aan de grafiek.
Het vullen van die kolom met meetresultaten van een tweede meting (of met een kopie van de eerste meting?) moet je zelf maar uitvogelen, je bent beter thuis in de onderliggende code dan ik. Ik heb er een kopie van de eerste meting +1 in gezet. Ook de data ranges heb ik hard geprogrammeerd, zie "Private Sub chkTweedeReeks_Click()" in de code van je form, dat moet dus ook nog aangepast worden.

Verder heb ik wat opgeruimd onderin Blad1, waardoor de grootte van het bestand is geslonken van 1565 kB naar 204 kB.
Ook de naam van het bestand een heel klein beetje aangepast.
 

Bijlagen

Hallo Ahulpje,

Bedankt voor je reactie en het meedenken. Ik heb gisteren een dag zitten “spelen” met jouw oplossing. Maar ik krijg het niet voor elkaar om de X-as dynamisch te maken.
In mijn programma had ik een methode toegepast die ik ergens op internet gevonden had.
De werking gaat als volg:
Het aantal meetpunten van de grafiek worden bepaald door de (eindfrequentie – startfrequentie)/frequentie per stap. Dit betekent dus dat het aantal meetpunten afhangt van de invoer via het
userformulier. De begrenzing is ingesteld op 3000 punten. De cellen in kolom A vertegenwoordigen de frequentie meetpunten deze worden dus door het programma berekend. De bijbehorende gemeten
waarde komen in de cellen van kolom B. Bij een grafiek van meer dan 60 punten wordt deze al minder goed leesbaar. Hiervoor heb ik dus dat stukje code gebruikt waarmee ik dus een aantal
cellen van de kolommen A en B door de grafiek laat weergeven. Ik heb de limiet ingesteld op 50 meetpunten. Zijn er dus meer meetpunten dan wordt de grafiek opgedeeld in stukken van 50 punten.
De enige manier waarop het mij uiteindelijk gelukt is om dit door de grafiek te laten weergeven is gebruik te maken van de “indirect” functie.

In mijn programma staan op twee willekeurige cellen in dit geval cel E13 (y-as) en E14(x-as) waarin met tekst de gegevens staan voor de X-As en Y-as.

In mijn programma staat op E13 de Y-as met deze gegevens “blad1!$B$2:$B$102”.

Dus de cellen van B2 tot B102 bevat de gemeten data in dit voorbeeld 100 meetpunten. Voor de X-as staat eigenlijk dezelfde getalen echter de kolom is dan A . “blad1!$A$2:$A$102”.
Nu kan ik in het VBA programma de tekst in deze twee cellen veranderen Ik bouw in onderstaand stukje code deze tekst opnieuw op maar dan met de aangepaste getallen welke in
variabele STA en STO staan. In het voorbeeld zou de data in twee blokken zijn opgedeeld dus “ blad1!$B$2$B$50” en daarna “ blad1!$B$52$B$102”

Code:
'DE Y_AS

   sta_str_y_as = "blad1!$b$"
   sta_str_y_as = sta_str_y_as & STABEW
   sto_str_y_as = ":$b$"
   sto_str_y_as = sto_str_y_as & STOBEW
   Target = sta_str_y_as & sto_str_y_as
   'Debug.Print "de nieuwe waarde stop y-as is: " & target
   ActiveWorkbook.Sheets(1).Cells(13, 5).Value = Target
   
   'DE X_AS
   sta_str_x_as = "blad1!$a$"
   sta_str_x_as = sta_str_x_as & STABEW
   sto_str_x_as = ":$a$"
   sto_str_x_as = sto_str_x_as & STOBEW
   Target = sta_str_x_as & sto_str_x_as
   'Debug.Print "de nieuwe waarde stop x-as is: " & target
   ActiveWorkbook.Sheets(1).Cells(14, 5).Value = Target
Dit stukje code wordt aangestuurd door een schuifbalk en zo kun je dus de gehele grafiek of de opgedeelde stukken zien door hen en weer te schuiven.

Om de data in de grafiek te krijgen zijn eerst de twee data cellen ieder met een naam in een formule gezet. Bij het maken van deze formule is de functie “=indirect” toegepast.
Dus in mijn programma heeft de cel E13 (deze was voor de Y-as de naam gekregen “datyas” met de formule “=indirect(blad1!$f$13)” . Voor de X-as is dit cel E14 “datxas”
met de formule “=indirect(blad1!$f$14)”

Nu bij het ontwerpen van de grafiek is bij gegevens selecteren de bestaande data verwijderd en is de formulenaam voor de x en y-as toegevoegd.
Hierna wordt dus de data weergegeven die in de cellen E13 en E14 gekozen zijn.
In jouw programma voorbeeld verschijnen er wel twee grafieken echter ik kan niet een deel van de meetpunten kiezen. Dat gaf je zelf ook al aan dat dit nu als voorbeeld
hard gecodeerd was. Maar ik heb geprobeerd of je dan toch de data dynamisch zou kunnen uitrafelen. Dat is me niet gelukt je blijft steeds zitten met de vaste “range waarde” .
Ik kan nergens een voorbeeld vinden waarmee je de “range” kan wijzigen doormiddel codering in VBA.

Als ik de range als code verander en dan weer compileer dan krijg je hetzelfde, en gewenste, resultaat als bij mijn programma. Dus is de vraag zijn er mogelijkheden om de “range”
via VBA te wijzigen


Graag je reactie met vriendelijke groet,

Loek
 
Is het niet handiger de grafiek automatisch op een gewenste breedte te zetten i.p.v. die schuifbalk ?

Code:
Sub M_snb()
    ActiveSheet.Shapes("Grafiek 4").ScaleWidth 500 / ActiveSheet.Shapes("Grafiek 4").Width, 0, 0
End Sub
 
Hallo snb,

Nee het is voor deze toepassing niet handig om vooraf een bepaalde breedte in te stellen. Het gaat hier om technische metingen je zend vanaf een frequentie tot een eindfrequentie en soms wil je dat met zeer kleine stapjes doen. Je krijgt dan veel meetpunten die erg dicht op elkaar zitten. Nu kunnen er ergens tussen deze start en stop (dus einde grafiek), kleine meet veranderingen zijn tussen bepaalde frequentie stappen. Deze zullen doordat ze dicht op elkaar zitten niet of slecht zichtbaar zijn. Ook de juiste vorm van hoe het niveau verloopt is dan niet zichtbaar. Door de X-as dynamisch te kunnen verdelen in 50 punten kan je langs de hele X-as kijken of daar ergens zo'n verschijnsel zit.

Als je zeker weet waar iets nauwkeurig beken moet worden ja dan kan je door de start en stop in te stellen op dat gebied en eventueel ook kleine meet stapjes direct zien wat er gebeurt. Maar dat komt niet veel voor.

Met vriendelijke groet,

Loek
 
Probeer deze eens. Zie module modGrafiek en form frmGrafiek.

Oeps, deze activeren:
Code:
Private Sub chkTweedeReeks_Click()
    ZoomGrafiek
End Sub
en de andere de-activeren.
 

Bijlagen

Laatst bewerkt:
Hallo Ahulpje,

Dat programma dat je gestuurd heb werkt uitstekend. Het werkt mooier dan mijn oorspronkelijke ontwerp. Ik vraag me wel af hoe ik dit zelf zou hebben kunnen maken.
Er zijn zoveel mogelijkheden met Excel in combinatie met VBA maar zoeken op internet geeft toch vaak niet de juiste oplossing.

Ik heb geprobeerd om het geheel werkbaar te maken in het bestaande programma. Ik bedoel daarmee dus het schrijven van de meetresultaten in de kolom B of C welke
op dat moment van toepassing is. Ik probeerde in de door jou gemaakte SUB een variabele aan te brengen waarmee ik in de rest van het programma Deze gekozen schrijf actie
kan laten uit voeren. Ook moeten de kolommen waar het actuele meetresultaat in komt eerst leeg gemaakt worden.
Daar kom ik nu nog een eigenaardigheid tegen. Stel ik wil maar één grafiek schrijven en beide kolommen B en C zijn leeg. Uit testen blijkt dat kolom A geen rol hier in speelt.
Als ik nu het grafiek Userform oproep en ik kies voor tweede reeks dan komt er een foutmelding bij de sub op de regel "SeriesCollection(2).name("C1")" .
Het is natuurlijk een verkeerde handeling als kolom A leeg is en je kiest voor een tweede reeks. Eigenlijk zou dus de tweede reeks keuze alleen toegestaan mogen worden als
er data in kolom 1 staat.

Verder is er nog iets over het user formulier voor de grafiek, deze blijft actief (knipperen schuifbalk) waardoor ook het programma stil blijft staan. Je kan de activiteit stoppen door twee keer het vinkje
tweede reek aan te vinken.



Voor beide problemen die ik hier boven genoemd heb ga ik nog wel zelf proberen een oplossing te vinden. Maar nogmaals bedankt voor jouw fantastische oplossing
Met vriendelijke groet,

Loek
 
Nog wat tips:
Test of er een tweede Seriescollection is (in Sub ZoomGrafiek):
Code:
If chkTweedeReeks And .Seriescollection.Count > 1 Then

Form modeless openen (je kunt dan ook buiten het formulier werken):
Code:
Sub Grafiek()
    frmGrafiek.Show vbModeless
End Sub

Kolom C leegmaken:
Code:
    Range("C2").Select
    Range(Selection, Selection.End(xlDown)).ClearContents
 
Hallo Ahulpje,

Ik heb de voorgestelde wijziging uitgeprobeerd maar om te kunnen testen of dit goed werkt moet ik ook meet-data kunnen schrijven op de kolom die actief is.
Dus gekozen voor tweede reeks dan moet de data in kolom C komen en bij de eerste reeks in kolom B komen. Tot nu toe had ik dit hard in de code aangebracht
en ook het wissen van kolom A ,B en C.


In mijn programma lukt het nog niet om aan de hand van het "vinkje" voor tweede reeks een variabelen te maken die in
de schrijf routine gelezen kan worden. Dit zou te maken hebben met de zogenaamde "private SUB" waar de grafiek mee gemaakt wordt.
Ik blijf wel doorzoeken naar een mogelijkheid. Maar tijdens wat experimenten gebeurde er toch iets raars, er was een keer een lege
kolom B (dus eerste reeks) en omdat het schrijven naar kolom C ging was deze ook leeg. De grafiek werd niet geschreven en ook de aansturing naar de beide meters
was gestopt. Het grafiek veld werd geheel grijs en uiteindelijk werd het hele beeldscherm vaag. De bediening buttons van Excel reageerde niet en uiteindelijk
door lang drukken op "ESC" kon ik Excel stoppen zonder de opdracht "opslaan". Je zou dan verwachten dat ik bij opnieuw opstarten alles weer werkend kon
krijgen maar dat lukte niet. Het lijkt er op dat er "iets" veranderd is waardoor het geheel niet meer werkt. Ik heb gekeken naar de code en er was niets veranderd .
Ook had ik geen wijzigingen aangebracht in de code. Ik had een backup gemaakt en deze werkt weer wel. Samenvattend het lijkt er op dat er absoluut geen lege kolom B
mag zijn wanneer er gewerkt wordt met kolom C.

Er komt ook een foutmelding als je de schuiven snel verplaatst. Eerst dacht ik dat de eindstand een foutmelding gaf, maar ga je er langzaam naar toe dan gaat het goed.

Als je me "vervelend vind worden" zeg het gerust je hebt me al een heel eind op weg geholpen daar nogmaals mijn dank voor.

Met vriendelijke groet,

Loek
 
In plaats van jouw functie "vertraging" kun je beter de functie Sleep gebruiken, Sleep(1000) pauzeert de macro 1000 milliseconden=1 sec.
Jouw functie vertraging is afhankelijk van de kloksnelheid van de processor.
Verder nog wat kleine wijzigingen.

Startpositie frmGrafiek:
Code:
Sub Grafiek()
    frmGrafiek.Show vbModeless
    frmGrafiek.Top = Application.Height - Application.UsableHeight + ActiveSheet.ChartObjects("Chart 4").Height + 20
End Sub

En nieuwe versie van ZoomGrafiek:
Code:
Private Sub ZoomGrafiek()
    With ActiveSheet.ChartObjects("Chart 4").Chart
        If chkTweedeReeks Then
            .SetSourceData Source:=Sheets("Blad1").Range(Cells(Me.txtXmin.Value, 2), Cells(Me.txtXmax.Value, 3)), PlotBy:=xlColumns
            On Error Resume Next
            .FullSeriesCollection(2).Name = Range("C1")
            On Error GoTo 0
        Else
            .SetSourceData Source:=Sheets("Blad1").Range(Cells(Me.txtXmin.Value, 2), Cells(Me.txtXmax.Value, 2)), PlotBy:=xlColumns
        End If
        .FullSeriesCollection(1).Name = Range("B1")
        .FullSeriesCollection(1).XValues = Range(Cells(Me.txtXmin, 1), Cells(Me.txtXmax, 1))
    End With
End Sub

Private Sub chkTweedeReeks_Click()
    ZoomGrafiek
End Sub
 
Hallo AHulpje,

Ik heb de nieuwe code uitgeprobeerd en het werkt zeer goed. Er zijn geen foutmeldingen meer ook niet als je een verkeerde actie uitvoert.
Bij deze toepassing zijn twee grafieken per keer, meer dan genoeg. Ik ga nu proberen een geheel andere meetopstelling te maken waarmee je
de grafiek van een radiobuis kan opnemen. Je gaat dan een roosterspanning ver anderen van bijvoorbeeld +20 Volt naar -20 Volt. Dit doe je dan bij
verschillende anode spanningen. Deze grafieken worden vaak op één overzicht weergegeven en dat kunnen er wel 5 tegelijk zijn.
Een vergrootfunctie van de as is dan niet nodig omdat spreiding nooit erg groot wordt.
De eerste uitdaging is of ik de apparatuur aan kan spreken met de HPIB bus via Excel. Het is allemaal zeer oude apparatuur en ook de HPIB interface is
zeer oud. Deze combinaties werden ongeveer 35 jaar geleden gebruikt. Ook nu wordt er nog veel gewerkt met de HPIB interface. Maar door commerciële
bedrijven zoals National instruments. Zij leveren dan ook voor heel veel geld het besturing programma. Maar je ziet in Excel kan het ook.

Nogmaals heel erg bedankt met vriendelijke groet,

Loek
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan