Opgelost Excel raakt in de stress bij lege data invoervelden.

  • 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 forum lezers,



Misschien vraag ik wel teveel van Excel omdat ik probeer technische meetapparatuur aan te sturen met een zo’n vriendelijk mogelijke bediening via userformulieren. Dank zij hulp op dit forum van Ahulpje heb ik al veel mogelijkheden kunnen uitvoeren.

Zo lukt het om :
  • Meerdere grafieken te schrijven na elkaar .
  • De grafieken op te rekken op de X-as (vergroot glas)
  • De legenda van de grafiek automatisch te laten aanpassen aan de waarde die is ingevoerd bij een userformulier.
  • Een keuze maken tussen één of vier grafieken weergeven.
  • De tekst die bij de legenda staat ook iets aangepast bij de “ grafiek userformulier” . De bedoeling is dat later bij de “grafiek userformulier” gekozen kan worden welke grafiek of grafieken zichtbaar gemaakt moeten worden. Nu is de keuze één of vier.
Ik was van plan om ook met een “commando button” alle grafieken leeg te maken en op de legenda cellen de tekst “grafiek is leeg” te zetten. Het nut van de reset knop is dat je soms een totale nieuwe meting wil starten en dat je dan alle bestaande data wil verwijderen. Natuurlijk verdwijnt deze ook wanneer je op die plaats een nieuwe meting uitvoert maar al die momenten daarvoor staat dan die oude niet relevante data er nog.

Voor het leeg maken heb ik dit geprobeerd met het commando “.ClearContents”. Dit gaat goed maar daarna kwam er een vervelend verschijnsel en daar gaat mijn vraag nu ook over. Er zit nu even geen code achter de reset knop maar het handmatig leeg maken van de cellen geeft hetzelfde resultaat.

Wanneer alle data velden leeg zijn , in mijn geval dus de kolommen A,B,C,D en E (in de 1e cel per kolom staat wel de tekst “grafiek is leeg”) dan krest het Excel programma wanneer je het grafisch userformulier oproept. Het beeld wordt uitgegrijst en er komen na een tijd meldingen over afsluiten programma. Als je het programma daarna weer opstart dan werkt het niet meer goed onder andere is de grafiek verdwenen op het scherm. Pas als je weer data in de kolommen zet gaat het weer werken.

Het lijkt er dus op dat Excel geen totaal lege data cellen kan hebben in dit geval. Ik zou dus programma code kunnen maken die bij vast stellen van deze situatie de toegang tot het grafisch user formulier blokkeert, maar is dit de juiste oplossing of is er een betere oplossing.

Met vriendelijke groet,

Loek
 

Bijlagen

Als er geen grafiekdata beschikbaar is wordt als laatste rij 1048576 gevonden, met het opbouwen van een of vier grafieken met 2^20 punten wordt van Excel wel heel erg veel gevraagd. In het grafiekformuliertje zie je dat de rij van xmax dan 1048576 is.
Om te voorkomen dat er dan een grafiek wordt opgebouwd plaats je onderstaande in het begin van Sub Zoomgrafiekcode:
Code:
   Private Sub ZoomGrafiek()
        If Range("B2") = vbNullString Then
            MsgBox "Er valt niet veel te zoomen, de grafiek is leeg."
            Exit Sub
        End If
 
Omdat ik het een leuk project vind ben ik toch nog even aan het knutselen gegaan, bijgaand het resultaat.
De vier reeksen zijn nu individueel aan- en uit te zetten en reeksdata kan verwijderd worden, daar mag je zelf nog een knopje voor maken.
 

Bijlagen

Hallo Ahulpje,
Ik heb de door jou voorgestelde wijzigingen doorgevoerd. Ik was zelf ook al op papier bezig, maar de oplossing die jij gemaakt heb is beter. Er komt wel, in sommige situaties, een fout melding bij de functie "ReeksNaam(volgnr,rng).
Bijvoorbeeld:
alleen in kolom B en E staat data en je vinkt dan bij het userform de 3e en 4e aan.
Of bij alleen in de kolommen C en E staat data en je vinkt de 1e en 4e aan.

Met vriendelijke groet,

Loek
 
Hallo Ahulpje,

Ik was nog vergeten te vertellen dat de test, zoals jij hem had gemaakt om te controleren of de data voor de grafiek leeg was, door mij iets was aangepast met vier "and functies". Dus de mededeling en verlaten sub gebeurt alleen als er in geen enkel kolom data staat. Deze aanvulling was nodig op mijn vorige bericht omdat daar ook een lege kolom B als voorbeeld is genoemd. En dit zou met het oude ontwerp direct de melding geven dat er niets te presenteren was.
Met vriendelijke groet,

Loek
 
Weer iets simpeler gemaakt, verwijder de subroutines ZoomGrafiek, GraphRange en ReeksNaam en voeg onderstaande code toe:
Code:
Private Sub ZoomGrafiek()
    Dim scoll
    With ActiveSheet.ChartObjects("Chart 4").Chart
        For Each scoll In .SeriesCollection
            scoll.Delete
        Next
        If Me.CheckBox1 Then AddSerie 2
        If Me.CheckBox2 Then AddSerie 3
        If Me.CheckBox3 Then AddSerie 4
		If Me.CheckBox4 Then AddSerie 5
    End With
End Sub

Sub AddSerie(k)
    With ActiveSheet.ChartObjects("Chart 4").Chart.SeriesCollection.NewSeries
        .Name = Cells(1, k)
        .Values = Range(Cells(Int(Me.txtXmin), k), Cells(Me.txtXmax, k))
        .XValues = Range(Cells(Me.txtXmin, 1), Cells(Me.txtXmax, 1))
    End With
End Sub
 
Laatst bewerkt:
Me. overal voor te zetten is overbodig.
 
Beste Harry,

Ik zet er geen Me. voor , ik zet er intellisense achter ;-)
En ja, ik weet dat je via Ctrl-J of Ctrl-Space ook een dropdown te zien krijgt na het intypen van de eerste letter.
 
Begin bij het begin:
Verwijder overbodige werkbladen.
Userform_Initialize (ipv _Activate):
Leg beginwaarden (van de scrollbars en tekstvakken) vast in de ontwerpmodus, niet in VBA.

CSS:
Private Sub UserForm_Initialize()
    with sbXmin
      .Max = Blad1.Cells(1).CurrentRegion.Rows.Count
      sbXmax.Max = .Max
      txtXmax = .Max
  end with

    For j = 1 To 4
        With Me("CheckBox" & j)
           .Value = Blad1.Cells(2, j + 1) <> vbNullString
           .Caption = Blad1.Cells(1, j + 1)
           If InStr(Blad1.Cells(1, j + 1), "U") Then .Caption = Mid(Blad1.Cells(1, j + 1), 10)
        End With
    Next
   
'    ZoomGrafiek
End Sub
 
Geen stress.....

CSS:
Private Sub UserForm_Initialize()
    with sbXmin
      .Max = Blad1.Cells(1).CurrentRegion.Rows.Count
      sbXmax.Max = .Max
      txtXmax = .Max
  end with

    For j = 1 To 4
        With Me("CheckBox" & j)
           .Visible = Blad1.Cells(2, j + 1) <> ""
           .Caption = Blad1.Cells(1, j + 1)
           If InStr(Blad1.Cells(1, j + 1), "U") Then .Caption = Mid(Blad1.Cells(1, j + 1), 10)
          y=y-.visible

        End With
    Next
  
   if y>0 then ZoomGrafiek
End Sub
 
Ikdenk dat het allemaal wel een beetje eenvoudiger kan.
Het lijkt me onwaarschijnlijk dat jouw meetapparaten geen interface naar Excel hebben, zodat die montermacromodules niet nodig zijn.
Ik heb me primair geconcentreerd op de grafiekweergave.
 

Bijlagen

Hallo Ahulpje,

Ik heb alle wijzigingen doorgevoerd en gekeken of het nu goed werkte. Ook na handmatig alle kolommen leeg maken (op de eerste cellen waar de legenda tekst na) werkte het goed.

Hierna heb ik de code aangebracht waarmee alle grafieken leeg gemaakt worden via de command button in userform1. Ik dacht dat dit hetzelfde was als handmatig leeg maken, maar toch werd het geheel zeer traag en kwam het zogenaamde “uitgrijzen”. Uiteindelijk komt het geheel wel weer tot rust en bestuurbaar. Om dit te voorkomen heb ik in de “grafiek userform “ toch de code toegevoegd die bij constatering van alle lege kolommen B tot en met E de sub verlaat met een melding in de tekstbox.

Op het moment dat de button “reset alle grafieken” wordt ingedrukt wordt de tekst die in de cellen nr1 van de kolommen B t/m E aangepast in “grafiek is leeg”. Deze tekst komt ook netjes bij het grafisch userform bij de vinkjes te staan. Alleen bij de grafiek blijft bij de legenda met de oude tekst staan die voor de reset aanwezig was. En door de , door mij , aangebrachte blokkade wordt deze tekst nu niet veranderd. Pas nadat er weer een grafiek geschreven is wordt de tekst wel aangepast. Wat mij betreft kan dit zo blijven immers je ziet in de grafiek zelf niets staan.

Ik heb nog wel een vraag over hoe ik de routine gemaakt heb om alle cellen leeg te maken. Het zelfde principe heb ik toegepast in de module2 bij het schrijven van de gekozen grafiek. Ook daar wordt eerst de kolom A en de gekozen grafiek leeg gemaakt. Ik bereken niet hoeveel cellen er beschreven gaan worden maar ga uit van 1000 cellen. Omdat ik dacht dat deze waarde ook elders gebruikt zou moeten worden had ik deze in een variabele “Global als pnts double “ gedefinieerd.

Ik dacht dat ik dan deze variabele in een andere routine dan ook zou kunnen gebruiken. In dit geval dus bij userform1. Maar dat lukt me niet en dus heb ik hem daar ook weer gedeclareerd. Mijn vraag is kan dat op een andere manier.

En de tweede vraag is kan het leeg maken van deze cellen ook met een ander commando zodat je niet het juiste aantal beschreven cellen weet maar deze wel kan wissen. Uiteraard moeten wel de kopteksten in stand blijven.

Ik stuur de laatste versie met alle wijzigingen mee en wat mij betreft is dit een uitstekende werkbare uitvoering. Bedankt nogmaals met vriendelijke groet,

Loek
 

Bijlagen

Ikdenk dat het allemaal wel een beetje eenvoudiger kan.
Het lijkt me onwaarschijnlijk dat jouw meetapparaten geen interface naar Excel hebben, zodat die montermacromodules niet nodig zijn.
Ik heb me primair geconcentreerd op de grafiekweergave.
Hallo snb,

Het besturen van meetapparaten kan op verschillende wijze worden uitgevoerd. Vroeger (30 jaar geleden ) was de enige mogelijkheid via de HPIB bus ook wel IEEE448 bus genoemd. Via een kaart in de computer werden de meetapparaten met elkaar verbonden via een kabel waarop steeds weer een nieuwe kabel naar het volgende meetapparaat ging en zo verder. De data bus was 8bits en er waren een aantal controle signalen. Ieder apparaat had een eigen instelbaar adres en de interface zorgt er voor dat op het moment dat dat nodig is dat specifieke adres op de data lijnen staat en dat op de control lijnen komt te staan of een apparaat moet luisteren of dat hij iets mocht zeggen. De taal die gebruikt werd was basic.

Nu vele jaren later is deze techniek nog steeds in gebruik er zijn ook wel meetapparaten die bestuurd kunnen worden via een USB aansluiting. Maar de oude HPIB is nog steeds actueel. Dus ook nu nog moet je een HPIB-interface hebben die vanuit je computer de meetapparatuur kan aansturen. Zat vroeger de HPIB interface als kaart in de computer, nu is deze interface een appart kastje dat onderandere aangestuurd kan worden door USB maar dan als een serie poort. Er zijn vele commerciele leveranciers die programma's leveren voor het aansturen van de meetapparatuur.
Zij vragen zeer hoge prijzen voor hun programma's (denk aan 6 tot 7 duizend euro). ook voor de interface bijvoorbeeld die van HP moet je 6 duizend Euro voor neertellen.

Ik ben een hobbiist ( 75 jaar) ik wil dat er niet voor betalen en de meetapparatuur die ik heb is ook al meer dan 20 jaar oud die ik zelf gerepareerd heb. Mijn kennis van Excel is beperkt toch ben ik al een heel eind gekomen maar dank zij de hulp van dit forum is het programma nu een stuk beter geworden. Dus ik denk dat de montermacromodules wel nodig zijn. Ik nog wel even jou programma uitgeprobeert maar dit werkte niet en ging gelijk in de sress. Bedankt voor het meedenken met vriendelijke groet,
Loek
 
Hoe heb je mijn suggestie dan uitgeprobeerd ?
Heb je het bestand gewoon geopend ?
 
Bij het bepalen van het aantal rijen voor de grafiek krijg je 1048576 als resultaat als er geen data aanwezig is, en een grafiek met 4*10480576 punten vindt Excel niet zo leuk, het opbouwen van de grafiek vraagt dan nogal wat tijd.

Globals kun je alleen gebruiken in Modules, terwijl Publics in modules, classes, controls, forms etc. te gebruiken zijn.
Dus in jouw geval kun je ze beter als Public declareren. Maar de variabele pnts heb je niet meer nodig.

Zie bijlage, je problemen en wensen uit bericht #12 zijn hierin verwerkt.

De code van snb is zeer compact en werkt prima tot je alle data verwijdert. Ik kan me ook voorstellen dat die compacte code voor een wat minder ervaren gebruiker wat minder goed leesbaar is.
 

Bijlagen

@AHulpje
Bedoel je met alle data ook de gegevens in kolom A ?

Dat is in de code in het toegevoegde bestand eenvoudig ondervangen.


Vervolgens
Gebruik deze regel
CSS:
Blad1.cells(1).currentregion.offset(1).clearcontents

ter vervanging van de monstercode:
CSS:
Select Case actieve_grafiek
    Case 1
       ActiveWorkbook.Sheets(1).Cells(1, 2) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
       'wissen Y-as data
        With Range("b2:b" & Pnts)
          .ClearContents
          .Interior.Color = vbWhite
        End With
     Case 2
        ActiveWorkbook.Sheets(1).Cells(1, 3) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
        'wissen Y-as data
        With Range("c2:c" & Pnts)
           .ClearContents
           .Interior.Color = vbWhite
        End With
     Case 3
        ActiveWorkbook.Sheets(1).Cells(1, 4) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
        'wissen Y-as data
         With Range("d2:d" & Pnts)
            .ClearContents
            .Interior.Color = vbWhite
         End With
     Case 4
        ActiveWorkbook.Sheets(1).Cells(1, 5) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
        'wissen Y-as data
         With Range("e2:e" & Pnts)
            .ClearContents
            .Interior.Color = vbWhite
         End With
 End Select

'wissen X-as data dit is niet afhankelijk van de gekozen grafiek
   With Range("a2:a" & Pnts)
        .ClearContents
        .Interior.Color = vbWhite
   End With
 

Bijlagen

Laatst bewerkt:
Bij het bepalen van het aantal rijen voor de grafiek krijg je 1048576 als resultaat als er geen data aanwezig is, en een grafiek met 4*10480576 punten vindt Excel niet zo leuk, het opbouwen van de grafiek vraagt dan nogal wat tijd.

Globals kun je alleen gebruiken in Modules, terwijl Publics in modules, classes, controls, forms etc. te gebruiken zijn.
Dus in jouw geval kun je ze beter als Public declareren. Maar de variabele pnts heb je niet meer nodig.

Zie bijlage, je problemen en wensen uit bericht #12 zijn hierin verwerkt.

De code van snb is zeer compact en werkt prima tot je alle data verwijdert. Ik kan me ook voorstellen dat die compacte code voor een wat minder ervaren gebruiker wat minder goed leesbaar is.
Hallo AHulpje,

Ik heb de nieuwe code uitgeprobeerd,

Er komt een fout melding wanneer:
bij het "grafisch userform" de tweede grafiek aanvinkt
kolom die daar bij hoort (C) is leeg is
In kolom B staat wel data
En de bovenste schuif geheel naar rechts

Verder heb je de module2 een aanpassing gemaakt met "Clear Graph" de intentie van mijn routine was dat alleen de kolom die geschreven werd eerst geleegd werd. En dat in koptekst de waarde komt te staan waarmee de meting start. Deze waarde wordt ook gebruikt bij de opbouw van de grafiek om de legenda aan te passen en bij het "grafisch user form" wordt deze tekst ook gebruikt bij de vinkjes. Dit alles werkt nu niet meer.

Met vriendelijke groet,

Loek
 
@AHulpje
Bedoel je met alle data ook de gegevens in kolom A ?

Dat is in de code in het toegevoegde bestand eenvoudig ondervangen.


Vervolgens
Gebruik deze regel
CSS:
Blad1.cells(1).currentregion.offset(1).clearcontents

ter vervanging van de monstercode:
CSS:
Select Case actieve_grafiek
    Case 1
       ActiveWorkbook.Sheets(1).Cells(1, 2) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
       'wissen Y-as data
        With Range("b2:b" & Pnts)
          .ClearContents
          .Interior.Color = vbWhite
        End With
     Case 2
        ActiveWorkbook.Sheets(1).Cells(1, 3) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
        'wissen Y-as data
        With Range("c2:c" & Pnts)
           .ClearContents
           .Interior.Color = vbWhite
        End With
     Case 3
        ActiveWorkbook.Sheets(1).Cells(1, 4) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
        'wissen Y-as data
         With Range("d2:d" & Pnts)
            .ClearContents
            .Interior.Color = vbWhite
         End With
     Case 4
        ActiveWorkbook.Sheets(1).Cells(1, 5) = "Ia in mA     Ua = " & anodespanning & "V" 'tekst voor legenda kolom
        'wissen Y-as data
         With Range("e2:e" & Pnts)
            .ClearContents
            .Interior.Color = vbWhite
         End With
 End Select

'wissen X-as data dit is niet afhankelijk van de gekozen grafiek
   With Range("a2:a" & Pnts)
        .ClearContents
        .Interior.Color = vbWhite
   End With
Hallo SNB,

De intentie van deze code was dat de variabele "actieve grafiek" bepaalt bij welke kolom de data vanaf cel 2 leeg gemaakt moet worden. De data in de overige cellen moet blijven staan. Verder regelt deze routine dat de tekst in de cellen 1 van de kolommen alleen aangepast wordt met de waarde waarmee de meting wordt uitgevoerd. Deze tekst wordt in de grafiek weer gebruikt voor de legenda en bij het "grafisch userform" bij vink-teksten . Ik begrijp niet hoe dit met de enkele regel die jij als vervanger opgeeft kan werken.

De tekst bij kolom bij cel1 kolom A moet blijven staan en in alle gevallen van de variabele "actieve grafiek" moet de kolom A vanaf cel 2 wel altijd gewist worden.

Met vriendelijke groet,

Loek
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan