• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Kortere VBA code

Status
Niet open voor verdere reacties.

mvdvlist

Gebruiker
Lid geworden
16 dec 2016
Berichten
920
Besturingssysteem
Windows 11
Office versie
2021 LTSC
Geachte medeforummers,

ditmaal niet zozeer een probleem, maar wel een vraagje:

Soms zie ik in formulieren twee knoppen: EEN om OP TE SLAAN en EEN om te VERANDEREN.
Er zijn ook mogelijkheden om dit beide met EEN knop te doen, maar die zijn vaak erg lang en uitgebreid, met heel veel declaraties.

Nu heb ik iets zitten knutselen met mijn beperkte VBA kennis, en dit is erg kort en werkt (bij mij althans) prima.

Mijn vraag is: zitten hier haken en ogen aan die ik over het hoofd zie? Is dit op de lange duur traag? Of kunnen er andere problemen komen?

Ik zou graag jullie mening en opbouwende kritiek hier over horen.

Het doel is de lengte van de code(s) te beperken...

Ik ben benieuwd...
 

Bijlagen

Hieronder een voorbeeld. Zelfde principe. Is een klein vb maar is heel gemakkelijk uit te breiden naar meerdere velden.
In tegenstelling tot jouw vb zitten er geen loops in (er wordt direct naar een match gezocht). Die kunnen wel eens voor vertraging zorgen.
 

Bijlagen

Jou systeem is ook erg kort, maar een opmerking: je moet zelf in de combobox een getal invoeren. Maar als je de database waar je naar toe schrijft niet kunt zien, weet je niet uit je hoofd wel getal...Daarom laat ik mijn eerste textbox invullen door die worksheetfunction...
Maar ik ga hier zeker mee verder. Overigens gebruik ik graag een listbox, omdat ik dat visueel fraaier vind, zeker bij meerder kolommen...

Overig mijn form een beetje aangepast...kort.
Om terug te komen op mijn eerste vraag: werken veel declaraties ook vertragend? Want dat zie je nogal eens, zeker bij wissen van een rij. In bijgevoegd gewijzigd bestandje zie je dat ik dat ook heel kort heb gehouden, en zonder declaraties...als ik het goed formuleer.
 

Bijlagen

Laatst bewerkt:
Je kan het ook omschrijven naar een listbox zonder loops. Het principe blijft hetzelfde. Volgens mij zorgen declaraties niet of nauwelijks voor vertraging.
 
Prachtige variant. Erg leerzaam voor mij. Nog een opmerking: in een array schijn je altijd ALLE controls te moeten opgeven. Is dit te ondervangen door bv een loop in een array?

Daarom had ik oorspronkelijk voor een loop gekozen, dan je iedere de control dezelfde naam geven, bijvoorbeeld TextBox, en de loop de cijfers laten invullen. Alleen moet de reeks wel compleet zijn. Er mag geen cijfer in de rij missen om het netjes te doen. En ik heb dus gemerkt na proberen dat je bv een combobox of checkbox ook gerust "TextBox" mag noemen...
In een array met bijvoorbeeld 50 controls is het handmatig invullen een heidens karwei...
 
Dan zul je het met een loop moeten doen.
Los daarvan zou ik niet blij worden van 50 invulvelden
 
Mee eens, maar ik wel eens een formulier gebouwd met iets van 6 tabbladen en meer dan 200 velden. Die waren niet allemaal verplicht om in te vullen. Ging om onderhoud voertuigen...en dan ben je toch wel blij met die loops...om het te maken...
 
Het wordt steeds leuker. Wat heb ik weer een hoop huiswerk. En ziet er allemaal prachtig uit.
Toch gek, ik ben maar een kneus die pas na zijn pensioen met VBA begonnen is, maar mijn systeempje werkt ook.

Nu een raadsel: welke van deze vier varianten zal de snelste zijn als je bv een database hebt met meer dan 25000 rijen?
En, niet onbelangrijk, want ik wil hier van leren, welke is de (waarschijnlijk) VEILIGSTE?

Ik hoop dat dit topic nog lang doorgaat, want hier leren we denkelijk allemaal van...Kijk overigens ook eens bij mijn #3, want daar heb ik bv voor het wissen ook een hele korte code geplaatst. Zonder de msgbox zou dat maar EEN regel zijn...
 
heel veel in een array
Code:
Dim arr
ReDim arr(1 To 200)


  For i = 1 To 200
    arr(i) = Me("TextBox" & i).Value
  Next
  
  Blad2.ListObjects(1).ListRows.Add.Range.Resize(, 200) = arr
 
Als je een database van 25000 rijen hebt zal de directe match voor het ophalen van data (merkbaar) sneller zijn dan een loop.
De veiligheid zou niet uit moeten maken. Dat ligt er aan hoe je het opbouwt:D
 
Dit is ook prachtig. Morgen hoop ik het te gaan bestuderen en toepassen. Nu eerst wat drinken en dan er even zijn voor mijn vrouwtje.
Ik krijg hier dorst van, naar kennis en naar koffie. Jullie zijn gigantisch...
Hartelijk dank, en GA DOOR...
 
Zonder de msgbox zou dat maar EEN regel zijn...
:thumb:
Jammer dat die ene regel dan wel een foutmelding geeft en niet al te logisch is opgebouwd als je met een listbox en een tabel werkt.;)
 
Laatst bewerkt:
Vreemd. Bij mij werkt het wissen prima. Maar inderdaade, ik heb er nooit aan gedacht om als je met een tabel werkt, ook consequent van die eigenschappen gebruik te maken. Hoe zou je dat in het vat gieten, een rij uit een tabel verwijderen? Zijn daar ook diverse manieren voor?

Eigenlijk logisch, nu begrijp ik ook dat het mij niet lukte om een rij uit een tabel te wissen, als er op datzelfde werkblad ook andere tabellen of dingen stonden...

Enne...die spreuk van Jack Nouws is ook op mij zeker van toepassing. Ik geniet van ieder klein miniem stapje vooruit...
 
Laatst bewerkt:
Het doel is de lengte van de code(s) te beperken...

Op zich een nobel doel maar de lengte van de code zegt niets over de efficiëntie van de code. In het bestand in #9 staan waarschijnlijk meer regels code maar alles gebeurt binnen het formulier en in de tabel. (Is niet geheel compleet maar als gepensioneerde kneus moet je toch wat uitdagingen hebben in deze dagen):d
 
hallo mvdvlist, pensionado , hoe oud zouden ze hier gemiddeld zijn ik ben 67 :o
veel plezier allemaal.
 
Laatst bewerkt:
Dan ben ik niet de enige..Ik hoop dit jaar 68 te worden...Zo blijven we bezig...
 
Nu we toch bezig zijn in huize avondrood:

- minimaliseer interaktie met een werkblad
- vermijd overbodige variabelen
- voorkom dat een gebruiker akties uitvoert die niet kunnen (bijv. als een item niet geselecteerd is kan dat niet verwijderd worden)
- vermijd redundante elementen (bijv. een invoerelement zoals een textbox die disabled is)
 

Bijlagen

Laatst bewerkt:
Volop goede tips.

VenA, bedankt nogmaals voor jou uitleg. Ik had inderdaad gemerkt, dat als ik een rij probeerde te wissen uit een tabel, dit alleen ging als er geen andere tabel
op datzelfde werkblad stond, op (deels) dezelfde rijen. Dan kreeg ik geen foutmelding, ,maar het verwijderen lukte gewoon niet. Goede beveiliging van Excel.

Nu lukt dat dus wel, met jou code. Zal me hierin verdiepen en er veel gebruik van gaan maken.

SNB, ook jou tips hou ik vast, en uiteraard alle andere...

Alleen noemde jij bijvoorbeeld een redundante Control. Ik denk dat je hiermee doelde op mijn TextBox1. Die wordt in mijn (matige) code gebruikt als uniek nummer, om niet de fout in te gaan bij het zoeken, maar mag niet worden aangepast, om te voorkomen dat er twee dezelfde nummers worden gebruikt. Of ik moet dat weer apart gaan beveiligen.

En inderdaad, soms maakte ik een Control onzichtbaar bij een selectie waarbij hij niet gebruikt mag worden, maar de manier van VenA is mooier. Gewoon Enable. Hert oog wil ook wat.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan