Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: niet aansluitende cellen leegmaken via VBA  (gelezen 12191 keer)

0 leden en 1 gast bekijken dit topic.

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #30 Gepost op: 05 augustus 2021, 16:24:20 »
@Veerj,

Dank voor de toevoeging inzake sortering, die was ik zelf eventjes vergeten...

Ik heb nu al twee comboboxen aangemaakt en gecodeerd en deze met bovenstaande code toegevoegd achter de opdrachtknop.
Tot zover geen problemen, werkt uitstekend.

Bij de originele code (zonder comboboxen) had ik een lijntje code toegevoegd om na uitvoering van de macro gelijk de ingevoerde gegevens op het blad 'input' opnieuw te verwijderen.
Hoe zorg ik er nu voor dat ook het invoervak van de combobox opnieuw leeg is voor de volgende invoer/keuze?

Mijn excuses voor de talloze vragen...


groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #31 Gepost op: 05 augustus 2021, 17:09:46 »
Dat doe je zo:

Sub cleardata()
ActiveSheet.ComboBox1.ListIndex = -1
End Sub

of alles in ene

Sub clearalld()
  For Each cb In Sheets("INPUT").OLEObjects
     If cb.progID = "Forms.ComboBox.1" Then cb.Object.ListIndex = -1
  Next
End Sub

Als je dit gebruikt ook even de ComboBox codes aanpassen van
Private Sub ComboBox1_Change()
    With ComboBox1
     .List = Filter(Application.Transpose(Sheets("inhoud keuzelijsten").Range("voornaam")), .Value, 1, vbTextCompare)
     .DropDown
   End With
End Sub

Naar

Private Sub ComboBox1_Change()
    With ComboBox1
      If Len(.Value) > 0 Then
         .List = Filter(Application.Transpose(Sheets("inhoud keuzelijsten").Range("voornaam")), .Value, 1, vbTextCompare)
         .DropDown
      End If
   End With
End Sub

Private Sub ComboBox1_DropButtonClick()
  ComboBox1.List = Filter(Application.Transpose(Sheets("inhoud keuzelijsten").Range("voornaam")), ComboBox1.Value, 1, vbTextCompare)
End Sub

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #32 Gepost op: 05 augustus 2021, 18:08:39 »
@Veerj,

Ontzettend bedankt voor al je hulp  _/-\o_ _/-\o_ :thumbsup:

Ik ga hiermee aan de sleg en als ik nog problemen zou tegenkomen dan laat ik het hier wel even weten.


groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #33 Gepost op: 05 augustus 2021, 18:14:21 »
Graag gedaan. Succes verder ;)

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #34 Gepost op: 06 augustus 2021, 04:48:21 »
@Veerj,

Ik heb nog een vraagje ivm het eventueel inkorten/versnellen van meerdere (repetitieve) codeblokken (uit het verleden weet ik dat jij daar nogal een ‘krak’ in bent  ;)).

In totaal heb ik 12 ComboBoxen waarvan er 5 gelinkt zijn aan tabel ‘naam’ en 6 gelinkt aan tabel ‘voornaam’. Enkel de eerste ComboBox is gelinkt aan tabel ‘plaats’.
Mijn vraag slaagt dus op de code voor de meerdere ComboBoxen die gelinkt zijn aan de tabellen ‘naam’ en ‘voornaam’.
Zou het eventueel mogelijk zijn om ipv de code voor elke ComboBox afzonderlijk te coderen, te werken met bvb arrays en lussen om de code in te korten en/of te versnellen?

Dus bvb iets in de trant van :
(voor de ComboBoxen gelinkt aan de tabel ‘naam’)
arr_nm = Array(ComboBox2, ComboBox3, ComboBox6, ComboBox8, ComboBox11)
For Each CB in arr_nm
‘hier de betreffende code
Next
en
(voor de ComboBoxen gelinkt aan de tabel ‘voornaam’)
arr_vrnm = Array(ComboBox4, ComboBox5, ComboBox7, ComboBox9, ComboBox10, ComboBox12)
For Each CB in arr_vrnm
‘hier de betreffende code
Next

En kan dit dan voor elke soort codeblok die ik moet toepassen mbt ComboBoxen?

Ik heb momenteel volgende soorten codeblokken (ik vervang het nr van de ComboBox even door ‘#’ en de betreffende specifieke tabelnamen door gewoon ‘tabelnaam’) :
(achter blad ‘INPUT’) :
Private Sub ComboBox#_Change()
    With ComboBox#
      If Len(.Value) > 0 Then
         .List = Filter(Application.Transpose(Sheets("inhoud keuzelijsten").Range("tabelnaam")), .Value, 1, vbTextCompare)
         .DropDown
      End If
   End With
End Sub

Private Sub ComboBox#_DropButtonClick()
  ComboBox#.List = Filter(Application.Transpose(Sheets("inhoud keuzelijsten").Range("tabelnaam")), ComboBox#.Value, 1, vbTextCompare)
End Sub
Met bovenstaande code zou ik dus in totaal 24 Sub’s hebben…

(achter de opdrachtknop (module)) :
With Sheets("inhoud keuzelijsten").ListObjects("tabelnaam")
            If Not IsNumeric(Application.Match(Sheets("INPUT").ComboBox#.Text, .DataBodyRange, 0)) Then
            .ListRows.Add.Range = Sheets("INPUT").ComboBox#.Text
            .Range.Sort .DataBodyRange(1, 1), 1, , , , , , 1
            End If
        End With
met bovenstaande code zou ik dan in totaal 36 extra codeblokken hebben (12 per soort akte (geb / huw / ovl) die verwerkt moet worden).

Aangezien de tabellen uiteindelijk enkele tientallen rijen zullen bevatten vrees ik dat de gehele code op deze wijze gigantisch traag zal worden naarmate die tabellen langer zullen worden. (Indien mijn vraag mogelijk zou zijn zou ik dan de Sub’s kunnen reduceren van 24 naar 6 en de codeblokken achter de opdrachtknop kunnen reduceren van 36 naar 9.)


(aan het einde van de code achter de opdrachtknop (module) binnen de ‘With Sheets(“INPUT”), van elke soort akte die verwerkt moet worden, heb ik dan) :
For Each cb In Sheets("INPUT").OLEObjects
     If cb.progID = "Forms.ComboBox.1" Then cb.Object.ListIndex = -1
  Next

Zou mijn vraag mogelijk zijn?
Ik vermoed wel dat het voor de codeblokken achter het werkblad ‘INPUT’ een uitdaging zal worden gezien de soort Sub die hier noodzakelijk is en misschien zelfs onmogelijk zal zijn.
Maar voor de codeblokken achter de opdrachtknop (module) denk ik wel dat het mogelijk moet zijn, of zie ik het verkeerd? Gezien mijn beperkte kennis van VBA tast ik hier wat in het duister.


groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #35 Gepost op: 06 augustus 2021, 11:31:33 »
Hetgeen wat je wil is complex. Je zal moeten werken met Public With events, om de code korter te krijgen. Het schrijven van die code is ingewikkelder.
Zo'n event wordt getriggerd wanneer je een combobox gebruikt en zal dan eerst kijken welke ComboBox je hebt aangeklikt, vanuit dat punt gaat de code lopen voor je specifieke ComboBox.

Ook hier blijkt dat je beter een echte userform kan gebruiken ipv de losse activeX - besturingselementen.
Eigenlijk doe je in een Userform hetzelfde maar dan wordt het wat makkelijker aansturen en het is gebruiksvriendelijker. :)

De vraag is of je die kant wel wilt opgaan.

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #36 Gepost op: 06 augustus 2021, 12:17:42 »
@Veerj,

Hartelijk dank voor je reactie...

Het is niet dat ik dit persé wil, ik vroeg me gewoon af of het mogelijk was...
Vooral voor de codeblokken die achter de opdrachtknop in de module 'mod_input' moeten geplaatst worden leek het me efficiënter om de code op één of andere wijze in te korten en alzo sneller te maken.

Maar indien het werkelijk té complex is dan doe ik voorlopig wel op deze manier verder.
Het UserForm dat ik voor dit bestand gemaakt had zal zeker nog in gebruik genomen worden, ben het ontwerp ervan zelfs al aan het aanpassen (de nodige TextBoxen aan het vervangen door ComboBoxen).

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #37 Gepost op: 06 augustus 2021, 12:59:22 »
Lekker bezig! Een Userform gaat je zeker voordelen opleveren.  ;)

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #38 Gepost op: 06 augustus 2021, 13:44:59 »
@Veerj,

In bijlage het bestand met aangepast UserForm.
Het is nog een vrij 'clean' bestand wat de code betreft (= enkel de wegschrijf-code achter het UserForm naar de drie "IDX"-werkbladen is aanwezig).

Zou jij me eventueel op weg willen helpen om het gewenste resultaat mbt de comboboxen en de tabellen op een efficiënte wijze gecodeerd te krijgen?

Ook zou ik willen verkrijgen dat, wanneer het UserForm getoond wordt, ik tóch naar een ander werkblad kan gaan zonder eerst het UserForm handmatig te moeten sluiten.

Alvast mijn oprechte dank op voorhand.


groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #39 Gepost op: 06 augustus 2021, 15:09:47 »
In de bijlage toch een voorbeeld met Public WithEvents (dmv classmodule).
Probeer het maar eens uit. Je ziet dat alle ComboBoxen gevuld worden met de data die je wil(met 1 codeblok)

Het kunnen gebruiken van de sheet terwijl de userform geopend is doe je zo: (staat ook in het bestand)

Sub j()
UserForm1.Show vbModeless
End Sub

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.277
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #40 Gepost op: 06 augustus 2021, 17:16:34 »
Puntje van aandacht met een Modeless formulier is dat je moet oppassen met "activesheet" in je procedures. Tenminste... als de output van je formulier op een bepaalde sheet moet worden weggeschreven.  ;)
______________________________

Groet, Leo

Offline AD1957

  • Ervaren lid
  • ***
  • Berichten: 250
  • Oplossing.be
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #41 Gepost op: 06 augustus 2021, 19:11:13 »
Leo,

in Sheet("Input")

Private Sub Worksheet_Deactivate()
Unload UserForm1
End Sub
Groet,

Albert

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #42 Gepost op: 06 augustus 2021, 19:13:05 »
Ze wil wel naar een ander werkblad kunnen gaan.  ;)


Offline AD1957

  • Ervaren lid
  • ***
  • Berichten: 250
  • Oplossing.be
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #43 Gepost op: 06 augustus 2021, 20:27:25 »
Dan blijft de vraag: Moet de Userform open blijven staan, denk zelf van niet.
Er is maar een persoon die hier antwoord op kan geven. ;D

Vraagje: VeerJ, klassemodule is vaak een goede oplossing.
              Maar is er ook een oplossing om met de klassemodule  die 12 comboboxen te vullen met de 3 verschillende ranges.
              Mij lukt het niet. (met jouw expertise misschien wel.)

              BLackDevil, excuus voor het inbreken op deze topic.
Groet,

Albert

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: niet aansluitende cellen leegmaken via VBA
« Reactie #44 Gepost op: 06 augustus 2021, 20:45:45 »
Mijn excuses voor de late reactie...

@Veerj,
Ik heb jouw bestandje met de Public WithEvents ook bekeken en ik stelde me dezelfde vraag als Albert inzake de drie verschillende ranges... Er is 1 combobox voor range A, 5 comboboxen voor range B en 6 comboboxen voor range C.

@Albert,
Geen excuses nodig, ik zie het niet als 'inbreken op deze topic' maar als 'meedenken naar een oplossing'  ;).

Om op jouw vraag te beantwoorden, nee, als ik eventjes naar een ander werkblad ga dient de UserForm niet open te blijven, deze komt toch automatisch opnieuw tevoorschijn als ik terug naar het werkblad 'INPUT' ga via de code "UserForm1.Show" achter 'INPUT' binnen de Worksheet_Activate.
Het is gewoon de bedoeling dat ik snel even naar een ander werkblad kan gaan, zeker tijdens de 'test'-fase, maar ook naderhand is dit voor mij handiger, zonder eerst telkens die UF te moeten afsluiten...
Nu gebeurd het vaak (lees: meestal) dat ik op de opdrachtknop druk en dan eventjes naar het 'doel'-werkblad wil gaan en gelijk een geluidje te horen krijg en dan denk "ah ja, juist, ik moet eerst het UF afsluiten". Behoorlijk storend als je net in een goeie 'flow' zit en dan daardoor volledig uit je concentratie gehaald wordt  ;D...

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

 


www.combell.com