Help!

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

Hulp bij posten

Recente topics

Auteur Topic: Excel-beperking mbt datum pré 1900 wegwerken met VBA  (gelezen 244645 keer)

0 leden en 5 gasten bekijken dit topic.

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #105 Gepost op: 07 januari 2019, 19:29:14 »
Hey pitufo,

Ja, uiteindelijk zal ik de geschreven code moeten importeren in een nieuw bestand via mijn pc want er zijn heel wat
verschillen tussen de weergave van excel-bestanden die jij hebt gemaakt en de weergave van diegenen die ik heb gemaakt.
Vermoedelijk werk jij met een andere versie van office denk ik want naast andere weergave van lettertypen zijn ook de
basiskleuren en de kleuren voor tabelopmaak ed in jouw bestanden anders dan in de mijne.
Dus als ik dan via een nieuw bestand in mijn excel-versie werk dan zal ik wel al de functies, kleuren en lettertypen kunnen
gebruiken die ik al jaren gewend ben ;).

vriendelijke 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 BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #106 Gepost op: 10 januari 2019, 17:21:06 »
Hallokes pitufo en alle anderen,

Ik ben dus al enkele dagen bezig met het overzetten van alle werkbladen, formulieren, modules en alle code naar een nieuw bestand en
dan terwijl het bestand aan het vervolledigen met de nodige opgemaakte werkbladen.

Terwijl ik daar dan toch mee bezig was en ik echt wil leren coderen besloot ik me eraan te wagen om de nog toe
te voegen code voor de boeken en indexlijsten zelf proberen te schrijven.

Het is mij gelukt om deze code te schrijven (lees: de code doet wat ze moet doen) maar, net omdat ik nog aan het leren ben,
weet ik bijna zeker dat de code 'korter' kan geschreven worden en dat ik dus te veel omwegen maak waardoor ik dus ellenlange code
heb staan. Op zich misschien niet echt een probleem ware het niet dat ik dit stukje code moet toepassen op 25 werkbladen met
dezelfde opmaak maar telkens voor een ander boek.

Ik heb dus dit blokje code momenteel 25x op mijn coderingsblad staan.
Ik vermoed dat het mogelijk moet zijn met een paar extra lijntjes code om het betreffende blokje code maar 1x
te moeten vermelden maar wel op de 25 werkbladen te kunnen toepassen.
Het enige wat er voor elk boek in de code wijzigt zijn de namen van de TxtBoxen, ComboBoxen, verwijzingen naar telkens een ander werkblad....

Wie kan/wil mij hiermee op weg helpen indien dit mogelijk zou zijn.
Ik plaats hieronder het blokje code dat ik geschreven heb.

'bladen "Boeken" & "IdxLst_Bk**" bijwerken
    Bkn.Cells(bkn_rij, 1) = nr
'boek 01
    If .ChckB_Boek1.Value = True Then
        Bkn.Cells(bkn_rij, 2) = "P"
        ILB01.Cells(ilb01_rij, 1) = nr
        ILB01.Cells(ilb01_rij, 2) = .CmbB_Naam
        ILB01.Cells(ilb01_rij, 3) = .TxtB_Voornaam
        ILB01.Cells(ilb01_rij, 4) = Val(.TxtB_SOSA_nr)
        If .TxtB_GebDat.Value = True Then
            ILB01.Cells(ilb01_rij, 5) = Year(GebDat)
        Else
            ILB01.Cells(ilb01_rij, 5) = "-"
        End If
        If .TxtB_OvlDat.Value = True Then
            ILB01.Cells(ilb01_rij, 7) = Year(OvlDat)
        Else
            ILB01.Cells(ilb01_rij, 7) = "-"
        End If
        If .TxtB_Boek1.Value = True Then
            ILB01.Cells(ilb01_rij, 9) = .TxtB_Boek1
        Else
            ILB01.Cells(ilb01_rij, 9) = "-"
        End If
    Else
        Bkn.Cells(bkn_rij, 2) = "-"
    End If
    If .TxtB_Boek1.Value = True Then
        Bkn.Cells(bkn_rij, 3) = .TxtB_Boek1
    Else
        Bkn.Cells(bkn_rij, 3) = "-"
    End If
'boek 02

Bovenstaande code betreft dus Boek 01 waarbij voor de andere boeken telkens het cijfer in de benamingen wijzigt volgens
het nr van het boek.

Ik hoop dus dat er een mogelijkheid is om het repetitieve hiervan op een kortere wijze te kunnen coderen.

vriendelijke en dankbare 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 pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #107 Gepost op: 10 januari 2019, 19:46:17 »
Hey BlackDevil,

Ik had zo al een zwaar vermoeden dat je volop aan het programmeren was...
Eerst en vooral : héle dikke proficiat om dit al werkend te hebben gekregen (meer bepaald in de wetenschap dat je enkele weken geleden nog aan de vba-studie moest beginnen)

Vermits je bijgeleverde code werkt heb je voordien ook ongetwijfeld iets staan als :
Dim Bkn As Worksheet
Set Bkn = Sheets("Boeken")
en heb je ook de doelrij in Boeken en in Boek1 laten zoeken.

Uiteraard is het mogelijk om dit voor meerdere 'boeken' in één code te schrijven. Voor de duidelijkheid en het gemak naderhand zou ik het aantal boeken gewoon in een variabele steken.

Ik heb het niet kunnen testen, maar zo met de héél natte vinger heb ik er dit van gemaakt (aantal_boeken zomaar 25 genomen omdat het momenteel zo op je formulier staat) :
Dim Bkn As Worksheet
Dim ilb_blad As Worksheet
Set Bkn = Sheets("Boeken")
aantal_boeken=25
For i = 1 To aantal_boeken
    Set ilb_blad = Sheets("Boek" & i)      'aangenomen dat ze Boek1, Boek2... heten
    p_kolom = i * 2
    i_rij = .....   'moet je nog per boek laten bepalen met gebruik van ilb_blad
    If Invoer("ChckB_Boek" & i).Value = True Then
        Bkn.Cells(bkn_rij, p_kolom) = "P"
        ilb_blad.Cells(i_rij, 1) = nr
        ilb_blad.Cells(i_rij, 2) = .CmbB_Naam
        ilb_blad.Cells(i_rij, 3) = .TxtB_Voornaam
        ilb_blad.Cells(i_rij, 4) = Val(.TxtB_SOSA_nr)
        If .TxtB_GebDat.Value = True Then
            ilb_blad.Cells(i_rij, 5) = Year(GebDat)
        Else
            ilb_blad.Cells(i_rij, 5) = "-"
        End If
        If .TxtB_OvlDat.Value = True Then
            ilb_blad.Cells(i_rij, 7) = Year(OvlDat)
        Else
            ilb_blad.Cells(i_rij, 7) = "-"
        End If
        If Invoer("TxtB_Boek" & i).Value = True Then
            ilb_blad.Cells(i_rij, 9) = Invoer("TxtB_Boek" & i)
        Else
            ilb_blad.Cells(i_rij, 9) = "-"
        End If
    Else
        Bkn.Cells(bkn_rij, p_kolom) = "-"
    End If
    If Invoer("TxtB_Boek" & i).Value = True Then
        Bkn.Cells(bkn_rij, p_kolom + 1) = Invoer("TxtB_Boek" & i)
    Else
        Bkn.Cells(bkn_rij, p_kolom + 1) = "-"
    End If
Next i

Laten we (vermits ongetest) niet verbaasd zijn als dit nog geen 100% klopt, maar dan hoor ik het wel ?
En anders ook ?  ;)

Groetjes,
pitufo
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #108 Gepost op: 10 januari 2019, 20:53:08 »
Hey pitufo,

Bedankt voor het complimentje en vooral bedankt voor de code.
Doch kan ik er niet geheel aan uit...
Bvb, hoe ik de [i_rij = ....] moet aanvullen...?

Ik heb inderdaad iets staan als Dim Bkn As Worksheet en Dim ILB01 As Worksheet staan
maar ik heb deze gewoon toegevoegd aan de code die er reeds stond maw ik heb dit staan :

Dim Pers, Geb, Huw, Ovl, Doc, Bkn, Lft, Klst, ILB01, ILB02, ILB03, ILB04, ILB05, ILB06, ILB07, ILB08, ILB09, ILB10, ILB11, ILB12, ILB13, ILB14, ILB15, ILB16, ILB17, ILB18, ILB19, ILB20, ILB21, ILB22, ILB23, ILB24, ILB25 As Worksheet
    Set Pers = Sheets("Personen")
    Set Geb = Sheets("Geboorten")
    Set Huw = Sheets("Huwelijken")
    Set Ovl = Sheets("Overlijdens")
    Set Bkn = Sheets("Boeken")
    Set Doc = Sheets("Documenten")
    Set Lft = Sheets("Leeftijdsberekeningen")
    Set Klst = Sheets("Keuzelijsten")
    Set ILB01 = Sheets("IdxLst_Bk01")
    Set ILB02 = Sheets("IdxLst_Bk02")
    Set ILB03 = Sheets("IdxLst_Bk03")
    Set ILB04 = Sheets("IdxLst_Bk04")
    Set ILB05 = Sheets("IdxLst_Bk05")
    Set ILB06 = Sheets("IdxLst_Bk06")
    Set ILB07 = Sheets("IdxLst_Bk07")
    Set ILB08 = Sheets("IdxLst_Bk08")
    Set ILB09 = Sheets("IdxLst_Bk09")
    Set ILB10 = Sheets("IdxLst_Bk10")
    Set ILB11 = Sheets("IdxLst_Bk11")
    Set ILB12 = Sheets("IdxLst_Bk12")
    Set ILB13 = Sheets("IdxLst_Bk13")
    Set ILB14 = Sheets("IdxLst_Bk14")
    Set ILB15 = Sheets("IdxLst_Bk15")
    Set ILB16 = Sheets("IdxLst_Bk16")
    Set ILB17 = Sheets("IdxLst_Bk17")
    Set ILB18 = Sheets("IdxLst_Bk18")
    Set ILB19 = Sheets("IdxLst_Bk19")
    Set ILB20 = Sheets("IdxLst_Bk20")
    Set ILB21 = Sheets("IdxLst_Bk21")
    Set ILB22 = Sheets("IdxLst_Bk22")
    Set ILB23 = Sheets("IdxLst_Bk23")
    Set ILB24 = Sheets("IdxLst_Bk24")
    Set ILB25 = Sheets("IdxLst_Bk25")

Verder heb ik ook de code, voor de bepaling waar de gegevens moeten worden weggeschreven, als volgt aangevuld :

nr = Val(.lbl_IntID)
    'bepalen waar formuliergegevens moeten weggeschreven worden
    nieuwpersoon = False
    If WorksheetFunction.CountIf(Pers.Columns(1), nr) = 0 Then
        'nieuw persoon
        nieuwpersoon = True
        pers_rij = Pers.Cells(Rows.Count, 1).End(xlUp).Row + 1
        geb_rij = pers_rij
        huw_rij = pers_rij
        ovl_rij = pers_rij
        bkn_rij = pers_rij
        doc_rij = pers_rij
        lft_rij = pers_rij
        ilb01_rij = ILB01.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb02_rij = ILB02.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb03_rij = ILB03.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb04_rij = ILB04.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb05_rij = ILB05.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb06_rij = ILB06.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb07_rij = ILB07.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb08_rij = ILB08.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb09_rij = ILB09.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb10_rij = ILB10.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb11_rij = ILB11.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb12_rij = ILB12.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb13_rij = ILB13.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb14_rij = ILB14.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb15_rij = ILB15.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb16_rij = ILB16.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb17_rij = ILB17.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb18_rij = ILB18.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb19_rij = ILB19.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb20_rij = ILB20.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb21_rij = ILB21.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb22_rij = ILB22.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb23_rij = ILB23.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb24_rij = ILB24.Cells(Rows.Count, 9).End(xlUp).Row + 1
        ilb25_rij = ILB25.Cells(Rows.Count, 9).End(xlUp).Row + 1


Op deze manier, samen met de code die ik in mijn vorig bericht heb vermeld, heb ik het dus werkende gekregen, althans toch
inzake het toevoegen van nieuwe personen.
Voor het bewerken van personen krijg ik echter steeds een foutmelding omdat ik nog niet heb uitgevist hoe en/of waar
ik de code daarvoor moet aanvullen...

Verder ben ik nog enkele foutjes tegengekomen mbt de oorspronkelijke code.
1) tijdens het uittesten had ik per ongeluk 2x iemand toegevoegd met hetzelfde SOSA-nr en dat werd gewoon aanvaard terwijl
dit niet zou mogen, er kunnen nooit 2 personen hetzelfde SOSA-nr hebben.

2) datums worden normaliter ingevoerd als 14032005 en worden dan weergegeven als 14-03-2005.
    Nu zijn er 2 datums die verkeerd worden weergegeven terwijl alle andere datums wel correct worden weergegeven.
    De 2 datums zijn 12-02-1919 en 06-07-1974. Ik voer deze in als 12021919 en 06071974 maar dan worden ze weergegeven
    als volgt : 2/12/1919 en 7/06/1974... Ik heb dus totaal geen idee wat daar de oorzaak van is of kan zijn.


Zodra ik uitgevist heb op welke wijze ik jouw nieuwe code moet toevoegen zal ik jou laten weten of het al dan niet werkt.


Vriendelijke en dankbare groetjes,
BlackDevil


Aanvulling : Inzake de invoer van de datums vroeg ik mij af of het niet mogelijk was om in het invoerveld de twee "-"jes reeds
                  staan te hebben zodat je de datum zelf zonder streepjes invoert maar dat de datum dan wel in het invoerveld reeds
                  als 14-03-2005 staat en dan ook in het werkblad word weergegeven als 14-03-2005...
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 pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #109 Gepost op: 11 januari 2019, 10:19:19 »
Hey BlackDevil,

Citaat
Doch kan ik er niet geheel aan uit...
Bvb, hoe ik de [i_rij = ....] moet aanvullen...?

Ai, mijn plannetje is mislukt... ik hoopte je te kunnen stimuleren dit zelf uit te dokteren.
En 't was voor mij ook niet superhandig. Ik had je code in Kladblok gekopieerd en ze daar gevoelsmatig aangepast, da's net ietsje onhandiger dan in een vba-editor (waar dan meteen kan getest worden).
Vooraleer daar een misschien overbodig lang epistel over te schrijven liever eerst de vraag : is een for...next-constructie voor jou volkomen duidelijk ?

Citaat
Ik voer deze in als 12021919 en 06071974 maar dan worden ze weergegeven als volgt : 2/12/1919 en 7/06/1974... Ik heb dus totaal geen idee wat daar de oorzaak van is of kan zijn
Bij mij gaat dat goed, dus ik vrees dat het komt doordat je één en ander uit mijn ontwerp in je eigen document hebt opgenomen, maar misschien niet de 'datumkolommen' als "Tekst" hebt opgemaakt.
Een ander antwoord zou dus kunnen zijn : we hebben dat aan die dekselse Amerikanen te danken. Feit is dat we een tekst uit je formulier halen maar dat, als Excel kans ziet om dat als datum te interpreteren hij dat ook zal doen, en als je kolomopmaak bvb. 'datum' of 'standaard' is zal de datum daar in Amerikaans formaat terechtkomen. Je zal nu ook al zien waarom sommige datums worden 'omgekeerd' en andere niet : alles vóór 1900 zal goed staan, en vanaf 1900 ook als dag >12 is.
Je suggestie over een invoermasker met 2 x "-" zouden we kunnen forceren, maar zal daar niets aan veranderen, we zouden eerder van de regen in de drop komen.

Citaat
tijdens het uittesten had ik per ongeluk 2x iemand toegevoegd met hetzelfde SOSA-nr en dat werd gewoon aanvaard
Dat is volkomen normaal. Het is eens ter sprake gekomen dat je massa's controles zou kunnen inbouwen, en daar heb je toen op geantwoord zelf zo goed mogelijk voor juiste invoer te zorgen. De kwestie is dat vba niets spontaan zal doen. Alle controles die momenteel gebeuren staan waar ze mogen/moeten verwacht worden, nl. aan het begin van de procedure 'Opslaan', dus nog vooraleer ook maar iets wordt weggeschreven. Bij 'foute' invoer wordt de procedure afgebroken wat je met inbegrip van een boodschap terug naar je formulier brengt. Voor de duidelijkheid worden de controles telkens voorafgegaan door een commentaarregel.
Het zal nogal meevallen om de Sosa-controle toe te voegen. Laten we eerst even de redenering vastleggen : na de huidige controles kijken we eerst of het een nieuw persoon is (dat doen we nu al). Toe te voegen : als InternID wordt gevonden is het zeker een bestaand persoon (omdat je InternID op het formulier niet kan wijzigen) en mag er worden opgeslagen. Enkel als InternID niet wordt gevonden mag er enkel worden verdergegaan als Sosa-nr niet wordt gevonden. Op die plaats moet dus nog een if...then...else...endif-constructie komen.
Die if-voorwaarde zoeken kan best op identieke wijze gebeuren zoals we naar InternID zoeken.
Dat zal je lukken, denk ik stellig  :)

Mocht je toch vast komen te zitten mag je uiteraard nog altijd je laatste versie eens meesturen.

Groetjes,
pitufo
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #110 Gepost op: 11 januari 2019, 13:24:59 »
Hey pitufo,

Ai, mijn plannetje is mislukt... ik hoopte je te kunnen stimuleren dit zelf uit te dokteren.
En 't was voor mij ook niet superhandig. Ik had je code in Kladblok gekopieerd en ze daar gevoelsmatig aangepast, da's net ietsje onhandiger dan in een vba-editor (waar dan meteen kan getest worden).
Vooraleer daar een misschien overbodig lang epistel over te schrijven liever eerst de vraag : is een for...next-constructie voor jou volkomen duidelijk ?

lol, nee hoor, niet mislukt. Ik was zeker gestimuleerd om dit zelf uit te zoeken en ik begrijp dus wel dat bij
[i_rij =] het dient aangevuld te worden met de locatie en ik vermoed dan iets (volgens de benamingen in jouw nieuw stukje code)
als [i_rij = ilb_blad.Cells(Rows.Count, 9).End(xlUp).Row + 1]
Maar omdat mijn werkbladen een andere wijze van nummering hebben (01, 02, 03, ..., 10, 11, ...) dan de Checkboxen (1, 2, 3, ..., 10, 11, ...)
vreesde ik dat het op die manier niet zou werken en dat er op vlak van nummering dan toch nog iets diende aangepast of extra gedefinieerd te worden.

Kloppen mijn vermoeden en mijn vrees?
Indien ja, dien ik dan nog iets extra's toe te voegen aan de code om dat verschil in nummering op te vangen of dien ik sowieso
de namen van mijn werkbladen aan te passen?

vriendelijke en dankbare 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 pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #111 Gepost op: 11 januari 2019, 14:12:44 »
Hoi BlackDevil,

Je vrees is gegrond, en toch weer niet, want we kunnen dat heel simpel oplossen.
Ik had het in mijn stukje code ook al aangegeven :
Citaat
Set ilb_blad = Sheets("Boek" & i)      'aangenomen dat ze Boek1, Boek2... heten

Binnen de lus die 25 maal doorlopen wordt krijgt ilb_blad dus telkens een andere waarde, gebaseerd op de waarde van i (die op zijn beurt varieert van 1 tot 25).
Als de nummering dus telkens uit 2 cijfers bestaat moeten we er enkel dit van maken :
Citaat
Set ilb_blad = Sheets("Boek" & format(i,"00"))

Ondertussen heb je onvermijdelijk ook al gezien dat je geen behoefte meer hebt aan "Dim ILB01, ILB02... " noch aan "Set ILB01 =Sheets("IdxLst_Bk01")..." en dus al evenmin aan "ilb01_rij =..."
Dat wordt allemaal binnen die lus opgevangen.

Wat op het eerste zicht raar kan overkomen is dat er bv. niet staat :
If .ChckB_Boek & format(i,"00").Value = True Then
maar wel :
If Invoer("ChckB_Boek" & format(i,"00")).Value = True Then
Het is weer simpel : vba kan die eerste schrijfwijze niet begrijpen.

Er is wel nog iets waar je bijzondere aandacht zal moeten aan besteden :
Op al je andere gegevenstabellen (uitgezonderd Boek** dus) staan altijd evenveel en dezelfde personen, dus om te kijken of het al dan niet een nieuwe is beperken we ons tot blad Personen.
Maar een bestaand persoon kan op elk Boek** zowel een bestaand als een 'nieuw' persoon zijn. Dus bij een bestaand persoon, en enkel DAN, zal je voor elk Boek** eerst moeten nagaan op welke rij die moet weggeschreven worden !

Succes !!

Groetjes,
pitufo
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #112 Gepost op: 11 januari 2019, 14:41:41 »
Hey pitufo,

Ik heb eventjes, voor de test, 2 van mijn werkbladen qua naam aangepast en jouw code toegevoegd als volgt (lichtjes aangepast qua benamingen) :

aantal_boeken = 2
    For i = 1 To aantal_boeken
    Set ilb_blad = Sheets("IdxLst_Bk" & i)
    p_kolom = 1 * 2
    i_rij = ilb_blad.Cells(Rows.Count, 9).End(xlUp).Row + 1
    If Invoer("ChckB_Boek" & i).Value = True Then
        Bkn.Cells(bkn_rij, p_kolom) = "P"
        ilb_blad.Cells(i_rij, 1) = nr
        ilb_blad.Cells(i_rij, 2) = .CmbB_Naam
        ilb_blad.Cells(i_rij, 3) = .TxtB_Voornaam
        ilb_blad.Cells(i_rij, 4) = Val(.TxtB_SOSA_nr)
        If .TxtB_GebDat.Value = True Then
            ilb_blad.Cells(i_rij, 5) = Year(GebDat)
        Else
            ilb_blad.Cells(i_rij, 5) = "-"
        End If
        If .TxtB_OvlDat.Value = True Then
            ilb_blad.Cells(i_rij, 7) = Year(OvlDat)
        Else
            ilb_blad.Cells(i_rij, 7) = "-"
        End If
        If Invoer("TxtB_Boek" & i).Value = True Then
            ilb_blad.Cells(i_rij, 9) = Invoer("TxtB_Boek" & i)
        Else
            ilb_blad.Cells(i_rij, 9) = "-"
        End If
    Else
        Bkn.Cells(bkn_rij, p_kolom) = "-"
    End If
    If Invoer("TxtB_Boek" & i).Value = True Then
        Bkn.Cells(bkn_rij, p_kolom + 1) = Invoer("TxtB_Boek" & i)
    Else
        Bkn.Cells(bkn_rij, p_kolom + 1) = "-"
    End If
Next i

Nu, op de werkbladen "IdxLst_Bk*" doet hij exact wat hij hoort te doen maar op het werkblad "Boeken" loopt het dus fout.
Hij geeft elke invoer weer in de kolommen van Boek01.
Dus als ik boek02 aanvink dan geeft hij gewoon in de kolom van boek01 het resultaat weer...

De kolommen voor de resultaten van de checkbox zijn 2, 4, 6, 8, ..., 48 en 50
en de kolommen voor resultaten van de txtbox zijn 3, 5, 7, 9, ..., 49 en 51


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 pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #113 Gepost op: 11 januari 2019, 15:11:14 »
Hey BlackDevil,

Oei, je was intussen toch al je bladen aan het hernoemen. Geen probleem natuurlijk, dat is een even goede oplossing als die van mijn voorgaande suggestie.

Citaat
Hij geeft elke invoer weer in de kolommen van Boek01.
Dus als ik boek02 aanvink dan geeft hij gewoon in de kolom van boek01 het resultaat weer...
Ik geloof je natuurlijk wel, maar zou dat toch eens met mijn eigen ogen willen zien, want :
Citaat
De kolommen voor de resultaten van de checkbox zijn 2, 4, 6, 8, ..., 48 en 50
en de kolommen voor resultaten van de txtbox zijn 3, 5, 7, 9, ..., 49 en 51
ook zonder dat je dit vermeldde wist ik dat al, EN had daar al rekening mee gehouden :
Citaat
For i = 1 To aantal_boeken
    p_kolom = i * 2
    If Invoer("ChckB_Boek" & i).Value = True Then
        Bkn.Cells(bkn_rij, p_kolom) = "P"
        ...
    Else
        Bkn.Cells(bkn_rij, p_kolom) = "-"
    End If
    If Invoer("TxtB_Boek" & i).Value = True Then
        Bkn.Cells(bkn_rij, p_kolom + 1) = Invoer("TxtB_Boek" & i)
    Else
        Bkn.Cells(bkn_rij, p_kolom + 1) = "-"
    End If
Next i

Misschien toch even je bestand bezorgen ?, want ik zie anders niet hoe dit zou kunnen mislukken.

Groetjes,
pitufo

Update : LAP ! Net nadat ik mijn bericht verzond zie ik het.
Je hebt daar staan :
p_kolom = 1 * 2
ipv
p_kolom = i * 2  :'(
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #114 Gepost op: 11 januari 2019, 17:17:41 »
Hey pitufo,

Ja, nu zie ik het ook  :'(, geen idee hoe ik die fout heb gemaakt maar goed, de codeblok werkt volledig naar behoren nu.  :thumbsup:

Citaat
Er is wel nog iets waar je bijzondere aandacht zal moeten aan besteden :
Op al je andere gegevenstabellen (uitgezonderd Boek** dus) staan altijd evenveel en dezelfde personen, dus om te kijken of het al dan niet een nieuwe is beperken we ons tot blad Personen.
Maar een bestaand persoon kan op elk Boek** zowel een bestaand als een 'nieuw' persoon zijn. Dus bij een bestaand persoon, en enkel DAN, zal je voor elk Boek** eerst moeten nagaan op welke rij die moet weggeschreven worden !

Ik denk niet dat dat een probleem vormt hoor.
De volgorde van de personen in de indexlijsten per boek zal sowieso alfabetisch gesorteerd worden en ook hier
word er gebruik gemaakt van het 'InternID_nr' als uniek nummer.
Of het nu een nieuw of een bestaand persoon betreft inzake initiële invoer, voor de werkbladen met de indexlijsten zal
dit per boek sowieso een nieuwe toevoeging zijn, zodra er een boek aangevinkt word, wat dus duidelijk opgevangen
word in de code door te zeggen dat deze op de eerste lege rij volgens de kolomcel van het paginanummer moet vermeld
worden en deze cel pas 'gevuld' word nadat er in het formulier de checkbox aangevinkt word.
Voor een bestaand persoon in de lijst personen gebeurd deze toevoeging via de knop bewerken.
Maar zoals ik reeds zei moet ook de inleescode nog dusdanig aangepast worden zodra ik mijn 'uitgeviste' theorie
hieromtrent heb kunnen testen ;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

Offline pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #115 Gepost op: 11 januari 2019, 18:06:12 »
Ik hoop het samen met jou, maar "we zullen zien"  :)
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #116 Gepost op: 12 januari 2019, 21:16:12 »
Hey pitufo,

Ok,  ::) alszijnde recente leerling betreffende VBA moet ik me neerleggen bij het feit dat ik in dit geval
de logica van VBA totaal niet door had  :-[ :'( en moet ik toegeven dat er idd een probleem is in de
werkbladen "IdxLst_Bk**"...
Elke keer er een wijziging word aangebracht bij een bestaand persoon word deze opnieuw toegevoegd
aan de tabellen met indexlijst van de aangevinkte boeken, zelfs als de wijziging een andere tabel (bvb overlijdens)
betreft.

Ik heb na lang zoeken dus gevonden hoe ik ervoor moest zorgen dat een aangevinkt boek opgeslagen
word en bij het bewerken nog steeds aangevinkt was (dus toch een klein pluimpje voor mij ;D )...
Onder de Cmd_knop 'Bewerken' heb ik volgende code toegevoegd :
    If Bkn.Cells(bkn_rij, 2).Value = "P" Then
        .ChckB_Boek1.Value = True
    Else
        .ChckB_Boek1.Value = False
    End If
    .TxtB_Boek1.Value = Bkn.Cells(bkn_rij, 3)
Deze moet ik uiteraard nog voor elk boek afzonderlijk ingeven, tenzij dit ook via een variabele
onmiddellijk voor alle boeken kan zoals bij het aanmaken van een nieuwe persoon...
Ik had geprobeerd om hier op dezelfde wijze te werk te gaan zoals bij het toevoegen van een nieuw
persoon maar kreeg steeds een foutmelding.
Ik deed het opnieuw weg en voegde dan opnieuw bovenstaande code toe maar toen kreeg ik nog
steeds diezelfde foutmelding en bij nader nazicht bleken er elders in de code enkele foutjes ontstaan
te zijn dus misschien was mijn coderingspoging wel juist maar ik weet niet juist meer hoe ik het
gecodeerd had en ben momenteel een beetje te moe en heb nog teveel ander werk om het opnieuw
uit te zoeken  :(....



Maar nu moet ik er nog voor zorgen dat hij een reeds opgenomen persoon in de indexlijsten er niet
elke keer opnieuw gaat inzetten...
En ik vrees dus dat daarvoor mijn klein beetje kennis, dat ik in de afgelopen weken heb opgedaan,
aanzienlijk onvoldoende is om aan dergelijke codering te beginnen...
Dus graag toch een klein beetje hulp hiermee indien mogelijk, alleszins toch voldoende om mij minstens
op weg te helpen en als ik daar dan niet uit kom dat ik dan verdere hulp kan vragen.

vriendelijke en dankbare 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 pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #117 Gepost op: 13 januari 2019, 10:37:22 »
Hoi BlackDevil,

Citaat
Elke keer er een wijziging word aangebracht bij een bestaand persoon word deze opnieuw toegevoegd
aan de tabellen met indexlijst van de aangevinkte boeken

Ik ken persoonlijk iemand die jou dat voorspeld had  :) , vergezeld van een onderbouwd advies om dat op te vangen.
Maar erg is het allemaal niet, geen betere methode om iets geleerd te krijgen dan door fouten maken (sprak de ervaringsdeskundige  :D )

Eigenlijk kan je dat op exact dezelfde manier waarop in Personen wordt geverifieerd of een persoon al bestaat. Dat moet voor elk boek apart gebeuren, dus de enige 'normale' plaats om dat te doen is binnen de lus met 'aantal_boeken' (zoals het al in mijn eerste code over dat issue stond) :For i = 1 To aantal_boeken
    Set ilb_blad = Sheets("Boek" & i)      'aangenomen dat ze Boek1, Boek2... heten
    p_kolom = i * 2
    i_rij = .....   'moet je nog per boek laten bepalen met gebruik van ilb_blad

Ik blijf met hetzelfde probleem zitten over geen recente versie meer te beschikken, maar zo op het eerste zicht zou dit kunnen volstaan :If WorksheetFunction.CountIf(ilb_blad.Columns(1), nr) = 0 Then
    i_rij = ilb_blad.Cells(Rows.Count, 1).End(xlUp).Row + 1
Else
    i_rij = WorksheetFunction.Match(nr, ilb_blad.Columns(1), 0)
End If


Onder de Cmd_knop 'Bewerken' heb ik volgende code toegevoegd :
    If Bkn.Cells(bkn_rij, 2).Value = "P" Then
        .ChckB_Boek1.Value = True
    Else
        .ChckB_Boek1.Value = False
    End If
    .TxtB_Boek1.Value = Bkn.Cells(bkn_rij, 3)
Deze moet ik uiteraard nog voor elk boek afzonderlijk ingeven, tenzij dit ook via een variabele
onmiddellijk voor alle boeken kan zoals bij het aanmaken van een nieuwe persoon...

Vanzelfsprekend kan je ook hier met een lus werken om alle boeken met dezelfde code te laten verwerken. Let er wel op dat vba hier niet weet hoeveel boeken er zijn, dus vóór de lus eerst "aantal_boeken = 25" zetten.
De kolommen die nu 2 en 3 zijn in je code moeten een variabele worden (bv. zoals ik bij Opslaan deed)
en .ChckB_Boek1 moet natuurlijk worden Invoer("ChckB_Boek" & i) (als je ook hier i als 'teller' gebruikt)
Dat geldt ook bij .TxtB_Boek1. Bovendien zou ik die laatste regel tussen If en Else opnemen.
En moet daar niet ook Invoer("TxtB_Boek" & i).Enabled = True staan ?

Oef, 't is weer compleet nattevingerwerk, dus alweer een verzoek om niet op de pianist te schieten in geval van  ;)

Misschien wil je toch nog eens overwegen me de laatste versie te bezorgen ?

Groetjes,
pitufo
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #118 Gepost op: 13 januari 2019, 12:48:45 »
Hey pitufo,

Hoi BlackDevil,

Ik ken persoonlijk iemand die jou dat voorspeld had  :) , vergezeld van een onderbouwd advies om dat op te vangen.
Maar erg is het allemaal niet, geen betere methode om iets geleerd te krijgen dan door fouten maken (sprak de ervaringsdeskundige  :D )
:) idd, vandaar de wijze waarop ik het meedeelde hé  ;D...


Citaat
Ik blijf met hetzelfde probleem zitten over geen recente versie meer te beschikken, maar zo op het eerste zicht zou dit kunnen volstaan :If WorksheetFunction.CountIf(ilb_blad.Columns(1), nr) = 0 Then
    i_rij = ilb_blad.Cells(Rows.Count, 1).End(xlUp).Row + 1
Else
    i_rij = WorksheetFunction.Match(nr, ilb_blad.Columns(1), 0)
End If
Ik heb bovenstaande code overgenomen maar heb wel bij de "Rows.Count" de 1 gewijzigd in een 9 omdat het in die
kolom is dat hij de waarde van TxtB_Boek** moet wegschrijven.
Ik heb het dan even getest en dat lijkt perfect te werken.  :thumbsup:


Citaat
Vanzelfsprekend kan je ook hier met een lus werken om alle boeken met dezelfde code te laten verwerken. Let er wel op dat vba hier niet weet hoeveel boeken er zijn, dus vóór de lus eerst "aantal_boeken = 25" zetten.
De kolommen die nu 2 en 3 zijn in je code moeten een variabele worden (bv. zoals ik bij Opslaan deed)
en .ChckB_Boek1 moet natuurlijk worden Invoer("ChckB_Boek" & i) (als je ook hier i als 'teller' gebruikt)
Dat geldt ook bij .TxtB_Boek1.
Dat heb ik dan ook zo geprobeerd (zoals ik vermelde in mijn vorig bericht) maar kreeg dan die foutmelding
waardoor ik het opnieuw had gewijzigd en daarna wist ik niet meer hoe ik het had opgesteld.
Maar dat heb ik dan vannacht opnieuw geprobeerd en toen kreeg ik een foutmelding mbt de Match-eigenschap
van de WorksheetFunction.
Ik heb mijn versie van het bestand langs een andere weg moeten doorsturen omdat het te groot was om
hier te plaatsen maar ik heb mijn 'probeercode' er als "commentaar" laten in staan zodat je kan zien wat
ik verkeerd zou hebben gedaan. Zo zal ik het het beste kunnen leren hé :).


Citaat
Bovendien zou ik die laatste regel tussen If en Else opnemen.
Bedoel je een nieuw If-statement dan?
want het opnemen in dat van de ChckB_Boek gaat niet werken hé aangezien de TxtB_Boek ook leeg kan
zijn indien ChckB_Boek aangevinkt is.
(sorry heb vrij weinig geslapen dus mijn focus-vermogen  is niet optimaal  ;D)


Citaat
En moet daar niet ook Invoer("TxtB_Boek" & i).Enabled = True staan ?
Ik vermoed dat dit dan slaagt op het feit dat TxtB_Boek pas kan ingevuld worden nadat ChckB_Boek aangevinkt is?
Maar begrijp niet onmiddellijk waar ik dit dan moet opnemen in de code...
(slaap nog half hé  ;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

Offline pitufo

  • Ambassadeur
  • *****
  • Berichten: 1.343
  • Geslacht: Man
Re: Excel-beperking mbt datum pré 1900 wegwerken met VBA
« Reactie #119 Gepost op: 13 januari 2019, 18:10:49 »
Hey BlackDevil,

Zopas thuisgekomen en naast dit hier ook je bericht in mijn mailbox aangetroffen.
Ik heb je bestand eens vluchtig bekeken, en de reden waarom het plots zo groot is geworden zit in alles wat je op de 25 boekindex-bladen hebt ingevuld. Het verkeerd noemen zou absurd zijn, maar voor mezelf zou ik dat nooit doen. Het blijft ook overzichtelijker als je dat door de (2 korte extra regeltjes) code laat doen.

Wat meer essentiële kwesties betreft zal ik je om een beetje geduld moeten vragen : ik heb vanavond nog een aantal katten te geselen, en daarna wacht mij een uiterst belastende driedaagse in mijn job. Maar wees gerust : ik zie in je laatste berichten weer niets onoverkomelijks.

Misschien al een kleintje uit de wereld helpen :
Citaat
Ik heb bovenstaande code overgenomen maar heb wel bij de "Rows.Count" de 1 gewijzigd in een 9 omdat het in die
kolom is dat hij de waarde van TxtB_Boek** moet wegschrijven
1 of 9 zal hier absoluut geen verschil maken, de laatst gevulde rij van kolom 1 zal altijd dezelfde zijn als deze van kolom 9, en het enige dat we met die code doen is de rij zoeken waarop moet geschreven worden.

Wordt dus vervolgd...

Groetjes,
pitufo
"De computer doet wel degelijk wat je hem vraagt,
 maar NIET wat je DENKT dat je hem vraagt"

 


www.combell.com