schrijven naar tabel Logboek werkt niet (lijkt niet te werken....)

Status
Niet open voor verdere reacties.
Ga morgen je laatste stukje code uitproberen i.p.v. de macro.
Ben er inmiddels ook al achter, dat de macro-functie niet zaligmakend is, maar bij gebrek aan super-VBA-kennis, soms toch nog wel makkelijker om een bepaalde functionaliteit te bereiken. Doe ondertussen mijn best de VBA-kennis op te schroeven zodat we geen gebruik meer hoeven te maken van niet-zaligmakende functionaliteit.
En jouw/jullie hulp is daarbij zeer waardevol :thumb:

Begrijp ik nou alleen goed, dat door het formulier te beveiligen, ik je code waarin je de tags gebruikt ("blauwe" code van post #4) en de mutatievelden, niet langer nodig heb, maar dat ik kan volstaan met de code uit post #56 en het tonen van de gekoppelde velden?
 
De oorspronkelijke code heb je altijd nodig, want anders valt er niks weg te schrijven. Maar als je niet wilt dat mensen in het formulier muteren, kun je het formulier instellen op <Bewerken toestaan> = Nee en <Toevoegen toestaan> = Nee. In die status kun je ook de niet-gekoppelde velden verbergen. Je kunt dan alleen zoeken in het formulier. Met een extra knop zet je dan <Bewerken toestaan> op Ja en maak je de velden weer zichtbaar.
 
Ik heb er, ter lering ende vermaeck, maar even een voorbeeldje van gemaakt.
 

Bijlagen

  • TestLog.rar
    38,8 KB · Weergaven: 43
Octafish,

Ik ben je code aan het proberen te implementeren en te testen.

Wil / kan je ondertussen alsnog een oplossing geven voor mijn vraag hoe ik het vullen van de .controlsource ongedaan kan maken via VBA voor alle velden in 1x.
Ik zit te denken in de "undo"-hoek, maar ik kom er niet uit. Gewoon omdat ik verwacht dat ik deze functionaliteit toch nog wel eens nodig zal hebben.
Is het niet voor de controlsource, dan is het wel voor iets anders en dan weet ik het maar vast.

Code:
For Each ctl In Controls
      With ctl
        Select Case .ControlType
         Case acTextBox, acComboBox
           If Left(.Name, 2) = "NW" Then
           [COLOR="#0000FF"].controlSource. = empty [/COLOR] ( [COLOR="#0000FF"].controlsource = ""[/COLOR] werkt niet, wat is de juiste code?????)
          End If
      End Select
    End With
    Next ctl

Thx again.
Resultaten laat ik nog weten.
 
Ik heb in mijn voorbeeldje geloof ik (kan hem nu niet openen) dit staan:
Code:
           .controlSource. = Null
of anders dit:
Code:
           .controlSource. = ""

Empty is niks; Access maakt er ook geen hoofdletter van, dus dan weet je al gelijk dat het fout is.
 
Dat Empty niet werkte, dat wist ik ;) , was bedoeld om aan te geven dat ik het niet wist.

In je voorbeeldje staat het niet (of ik kijk er over heen), in ieder geval werkt
Code:
.controlsource. = null
niet
En
Code:
.controlsource. = "'
ook niet.

Helaas.....tot nu toe.

Eerder werkte het wel als ik de "blauwe" voorwaarde wegliet.
Probleem was dan alleen dat alle velden hun controlsource verloren. Dus ook de gekoppelde velden, dat was dus niet de oplossing.

Code:
   For Each ctl In Controls
      With ctl
        Select Case .ControlType
         Case acTextBox, acComboBox
           [COLOR="#0000FF"]If Left(.Name, 2) = "NW" [/COLOR]Then
           .ControlSource = ""
          End If
      End Select
    End With
    Next ctl
 
Laatst bewerkt:
Ik zat ook nog te denken om een variabele te vullen met de tag en die te gebruiken, maar toen liep ik er tegenaan dat ik weer niet wist hoe de variabele weer leeg te maken.....aaah. Kennisgat pur sang.

dus iets in de trant van:
Code:
sTest = .tag

   For Each ctl In Controls
      With ctl
        Select Case .ControlType
         Case acTextBox, acComboBox
           If Left(.Name, 2) = "NW" Then
           .ControlSource = sTest
          End If
      End Select
    End With
    Next ctl

om te vullen en vervolgens dacht ik:
Code:
sTest = "weer leeg maken" (hoe???)
 
Waarom zou je dat doen? Nogmaals: laat het formulier in tact, en gooi alleen de inhoud van de controls weg. Je denkt volgens mij veel te moeilijk.
 
Wat bedoel je met
..... en gooi alleen de inhoud van de controls weg. Je denkt volgens mij veel te moeilijk.
Ik zal vast te moeilijk denken, maar de simpele oplossing vind ik niet (obvious).
Ongetwijfeld veroorzaakt door gebrek aan kennis, maar ik zit er nu mee en wil het opgelost hebben, moeilijk of makkelijk, dat is voor nu even niet meer zo belangrijk.

Makkelijke oplossingen neem ik sowieso zeer ter harte bij een volgende ontwikkeling en probeer waar mogelijk nu toe te passen.
Maar in mijn koppie lukt dat dus nog niet altijd. Out of the box-denken blijft een fijne vaardigheid, maar lastig als je die (binnen VBA :( )niet compleet beheerst.

Begrijp me goed, alle suggesties en hulp zijn welkom en gewaardeerd. Laat daar geen twijfel over bestaan.
 
Laatst bewerkt:
Ik denk dat we een beetje langs elkaar heen kleppen.
Wil / kan je ondertussen alsnog een oplossing geven voor mijn vraag hoe ik het vullen van de .controlsource ongedaan kan maken via VBA voor alle velden in 1x.
Ik snap niet waarom je hieraan zou willen morrelen. De controlsource ligt volgens mij vast, tenzij je meerdere tabellen wilt muteren met hetzelfde formulier. Maar dan nog: dat werkt alleen als die tabellen exact dezelfde hoeveelheid velden hebben. En dan moet je inderdaad de Controlsource van de velden aanpassen. In mijn voorbeeldje maak ik de ingevulde velden leeg na het opslaan. Je ziet dan ook de opgeslagen waarden gelijk terug in de linker kolom. Ik zou niet weten hoe je het anders zou moeten doen.
 
Ik denk dat het antwoord op de vraag waarom niet meer zo relevant is, omdat we daar denk ik verschillende meningen/inzichten over hebben en ik het geloof ik niet goed kan uitleggen (i.h.k.v. langs elkaar heen kleppen....)
Wat ik gek vind is dat ik de controlsource van velden wel "en mass" kan vullen via
Code:
For Each ctl In Controls
     With ctl
        Select Case .ControlType
         Case acTextBox, acComboBox
            If Left(.Name, 2) = "NW" Then
           .ControlSource = .Tag [COLOR="#0000FF"](.controlsource = "" om leeg te maken, werkt dus niet, ook niet .controlsource = null dus ook niet)[/COLOR]
          End If
      End Select
    End With
    Next ctl
maar niet "en mass" leeg kan maken.
Dit lukt alleen per veld, met de volgende code:
Code:
Private Sub NWtxtvoornaam1_GotFocus()
If NWtxtvoornaam1.ControlSource <> "" Then NWtxtvoornaam1.ControlSource = ""
End Sub

En ik kan niet begrijpen dat er geen mogelijkheid is om dit, net als het vullen, niet met een "for each" de controlsource 1x weer leeg te maken.
 
Voor een ieder "ter lering ende vermaeck", los van of het de ideale oplossing is:
Het in 1x leegmaken van .controlsources voor alle controls tegelijk is de volgende code:
Code:
For Each ctl In Controls
    With ctl
        Select Case .ControlType
        Case acTextBox, acComboBox
            If Left(.Name, 2) = "NW" Then
                If [COLOR="#FF0000"]ctl[/COLOR].ControlSource = [COLOR="#FF0000"]ctl[/COLOR].Tag Then
                [COLOR="#FF0000"]ctl[/COLOR].ControlSource = ""
                End If
            End If
        End Select
     End With
    Next ctl

"ctl" vóór .Controlsource was de missing link om dit stukje werkend te krijgen.

Dan nu het laatste vraagstuk: Ik wil:
Code:
If ctl.ControlSource = ctl.Tag Then ctl.ControlSource = ""

inpassen in de allereerste code uit post 4, zodat eerst de controlsources leeg gemaakt worden voordat de nieuwe waarde wordt weggeschreven in het logboek.
Maar op welke regel zou dit moeten?
 
... zodat eerst de controlsources leeg gemaakt worden voordat de nieuwe waarde wordt weggeschreven in het logboek.
Ik begrijp er steeds minder van.... Als de controlsource leeg is, doet de hele functie het volgens mij niet meer.
 
HOi Octafish,

Als ik het nog maar begrijp, komt het voor nu wel goed ;).

Alle hulp en suggesties zijn zeker niet voor niets, die neem ik mee bij de volgende ontwikkelingen zoals eerder gezegd.
Als er nu slechts nog iemand mij kan helpen met een antwoord op mijn laatste vraag, dan ben ik helemaal gelukkig (met alle tussendoor verworven kennis als zinvolle extra bagage als basis).

Dus wie kan me helpen op welke plek, ik mijn laatste stukje code moet zetten om het werkend te integreren in de eerste werkende code van post #4?
Zie mijn laatste vraag voor dit bericht.
 
Even nog gauw een vraag tussendoor in de hoop dat dit een oplossing voor mij is.
(dus los of het logisch / gesnapt wordt....;) ).

Kan ik de code:
Code:
Sub Onclick()
For Each ctl In Controls
    With ctl
        Select Case .ControlType
        Case acTextBox, acComboBox
            If Left(.Name, 2) = "NW" Then
                If ctl.ControlSource = ctl.Tag Then
                ctl.ControlSource = ""
                End If
            End If
        End Select
     End With
    Next ctl
End sub

ook in een module zetten en dan bij een click-event van een knop aanroepen?
Dus dan iets in de trant van:
Code:
Private Sub button_click()
Onclick
End sub
Wat moet dan de correct syntax/werkwijze zijn?
Zoals ik in deze post als voorbeeld heb staan, krijg in het button-click-event, krijg ik een compilatiefout:
"Er wordt een variabele of een procedure verwacht, geen module".
????????
 
Een zelfstandige functie moet weten waar hij moet draaien. Nu heb je 'm vermoedelijk op het formulier staan, en dan gaat het altijd goed. Verplaats je de code naar een aparte module, dan weet de functie nooit meer waar hij draait. Dan moet je de code naar zoiets omzetten:

Code:
Function ControlsLeeg(frm as Form)
    With frm
        For Each ctl In .Controls
            With ctl
                Select Case .ControlType
                    Case acTextBox, acComboBox
                        If Left(.Name, 2) = "NW" Then
                            If ctl.ControlSource = ctl.Tag Then ctl.ControlSource = ""
                        End If
                End Select
            End With
        Next ctl
    End With
End Function

En op je knop zet je dan:
Code:
Private Sub button_click()
     ControlsLeeg Me
End sub
Ik heb nog steeds geen flauw idee waarom je dat überhaupt zou willen (en eerlijk gezegd is de belangstelling daarvoor ook behoorlijk gezakt), maar dit zou wel moeten kunnen werken.
 
Octafish, ondanks je tanende belangstelling (begrijpelijk hoor, bedoel het zeker niet verkeerd), toch bedankt weer voor je input.
Dat helpt me toch weer vooruit.

Daarbij heb ik besloten om dit draadje nu te sluiten.
Immers, de initiële vraag is natuurlijk ondertussen wel al beantwoord (wegschrijven wijzigen in logboek) en ik wil het forum verder niet bevuilen met vraag in vraag.
Met alle input ga ik zeker door en kom ik zeker verder.
Evt. nieuwe vragen zal ik in een nieuw onderwerp posten.
Dank, dank, dank.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan