• 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.

hulp bij VBA formulier om database te vullen

Status
Niet open voor verdere reacties.
Thnx, aller eerst nog de beste wensen voor het nieuwe jaar.
Ik zit met een issue, ik heb in de kolommen de formule aangepast naar bv =ALS(W2<>"N.N.";ALS.FOUT(DATUMVERSCHIL(VANDAAG();W2+365;"d");"Verlopen");" -")
Maar door 1 of andere manier wijzigt deze soms bij invoer, ik heb het idee dat onderstaande code hier invloed op heeft en de aangepaste formule overschrijf als er een fout ontstaat.
Code:
Private Sub C_1_Click()
   ' For i = 1 To 45
        'If Me("T" & i).Value = "" Then
          ' MsgBox "Niet volledig ingevuld!", vbInformation, "Niet compleet"
           'Me("T" & i).SetFocus
        'Exit Sub
       'End If
    'Next
    
   With Blad1
     x = .[a1000].End(xlUp).Offset(1).Row
        For i = 1 To 47
            If Me("t" & i) <> "" Then
            If i = 6 Or i = 13 Or i = 23 Or i = 25 Or i = 27 Or i = 29 Or i = 31 Or i = 33 Or i = 35 Or i = 37 Or i = 39 Or i = 42 Or i = 44 Or i = 46 Then
            Select Case i
                Case 6
                .Cells(x, i).Value = Format(Me("T" & i).Value, "mm/dd/yyyy")
                Case 13
                .Cells(x, i).Value = Format(Me("T" & i).Value, "mm/dd/yyyy")
                .Cells(x, i + 1).FormulaR1C1 = "=IFERROR(DATEDIF(TODAY(),RC[-1] ,""d""),""neen"")"
                i = i + 1
                Case 23, 25
                .Cells(x, i).Value = Format(Me("T" & i).Value, "mm/dd/yyyy")
                .Cells(x, i + 1).FormulaR1C1 = "=IFERROR(DATEDIF(TODAY(),RC[-1]+365 ,""d""),""neen"")"
                i = i + 1
                Case 27, 35, 37, 39, 42, 44, 46
                .Cells(x, i).Value = Format(Me("T" & i).Value, "mm/dd/yyyy")
                .Cells(x, i + 1).FormulaR1C1 = "=IFERROR(DATEDIF(TODAY(),RC[-1]+1095 ,""d""),""neen"")"
                i = i + 1
                Case 29, 33
                 .Cells(x, i).Value = Format(Me("T" & i).Value, "mm/dd/yyyy")
                 .Cells(x, i + 1).FormulaR1C1 = "=IFERROR(DATEDIF(TODAY(),RC[-1]+3652 ,""d""),""neen"")"
                 i = i + 1
                Case 31
                 .Cells(x, i).Value = Format(Me("T" & i).Value, "mm/dd/yyyy")
                 .Cells(x, i + 1).FormulaR1C1 = "=IFERROR(DATEDIF(TODAY(),RC[-1]+1825 ,""d""),""neen"")"
                 i = i + 1
            End Select
            Else
                .Cells(x, i).Value = Me("T" & i).Value
            End If
            End If
        Next
    .Cells(1, 1).CurrentRegion.Sort key1:=.Cells(1, 2), key2:=.Cells(1, 6), Header:=xlYes
    End With
    MsgBox "Cursist toegevoegd", vbInformation, "Klaar"
      
    For Each ctrl In Controls
        If TypeName(ctrl) = "TextBox" Or TypeName(ctrl) = "ComboBox" Then ctrl.Value = ""
    Next
    
    Call UserForm_Initialize
End Sub

Zoals ik al aangaf zijn niet alle data nodig en word bij sommige N.N. (Niet nodig) ingevoerd.(waarna een foutmelding komt) en deze zorgt er juist voor de de bastaande formule in blad1 komt te vervallen en deze terug wordt gezet.
Bijgaand even mijn aangepaste bestand
 

Bijlagen

  • Frans testbestand 1.xlsb
    53 KB · Weergaven: 18
Kunnen we niet beter bij het begin beginnen ?

Zet de gebeurtenis Userform op de meest logische plaats in de macromodule van het Userform: bovenaan.

Gebruik de ontwerpmodus voor het instellen van basiseigenschappen van elementen van het Userform zoals Visible of Backgroundcolor.

Reduceer interaktie met een werkblad (lezen/schrijven) tot een minimum. Gebruik daarvoor arrays.
Als je VBA gebruikt zijn dynamisch gedefinieerde benoemde gebieden overbodig en vertragend: bij iedere wijziging van een werkblad worden alle gebieden opnieuw berekend.

En dan nu de code voor de Initialize-gebeurtenis, rekening houdend met bovenstaande punten:

Code:
Private Sub UserForm_Initialize()
  L_1.List = Blad1.ListObjects(1).Range.Value
    
  For jj = 0 To UBound(L_1.List, 2)
    Me("Lbl" & jj + 1).Caption = L_1.List(0, jj)
  Next

  sn = Blad3.Cells(1).CurrentRegion
  For jj = 1 To UBound(sn, 2)
    For j = 2 To UBound(sn)
      If sn(j, jj) = "" Then Exit For
    Next
    Me("T" & Choose(jj, 1, 8, 5, 16, 17, 22, 9, 41)).List = Application.Index(sn, Evaluate("row(2:" & j - 1 & ")"), jj)
  Next
     
  For Each it In Array(10, 11, 12, 15, 18, 19, 21)
    Me("T" & it).List = T5.List
  Next
End Sub
 
Laatst bewerkt:
Bedankt voor de info, maar hier was ik al bang voor, mijn gebrek aan kennis gaat nu parten spelen.
Kan ik deze code plaatsen i.p.v. wat ik had aangegeven, of moet de zaak compleet worden aangepast?
 
Dit is nog maar het begin; kijk bijv. eens naar de 'Tab Order' van het Userform.

Het is ook beter geen controlnamen te gebruiken die verward kunne worden met Excel of VBA zaken: ieder werkblad heeft een cel T5, maar geen cel T_5. Daarom beter in controlnamen een verboden teken voor Excel/VBA elementen gebruiken.

Vermijd in VBA ook om Excelformules in een werkblad te zetten (de aanleiding voor deze draad). VBA rekent zelf heel enel zonder interakties met Excel (schermverversing, herberekening formules elders, bijv). Het resultaat kun je dan in het werkblad zetten.

Ik mis hog hulp voor de gebruiker om correcte datums in te vullen; dat kan eenvoudig met comboboxen die slechts geldige data bevatten.

Antwoord op je laatste vraag: probeer het uit.
 
Laatst bewerkt:
Fijn......... gaat hem niet worden denk ik, bekijk maar even vorige berichten in dit topic.
Ik zal het denk ik moeten doen met wat ik nu heb.
 
Code:
Private Sub C_1_Click()
    For Each it In Array(6, 13, 23, 25, 27, 29, 31, 33, 35, 37, 39, 42, 44, 46)
       If Me("T" & it) <> "" Then
           L_1.Column(it) = Me("T" & it)
           If it > 6 Then L_1.Column(it + 1) = DateDiff("d", Date, Me("T" & it) - 365 * (InStr("23 25 ", it) > 0) - 1095 * InStr("27 35 37 39 42 44 46 ", it) > 0) - 3652 * (InStr("29 33", it) > 0) - 1825 * (it = 31)
       End If
    Next
End Sub
 
Kan ik onderstaande code niet aanpassen naar deze formule? =ALS(W2<>"N.N.";ALS.FOUT(DATUMVERSCHIL(VANDAAG();W2+365;"d");"Verlopen");" -")


.Cells(x, i + 1).FormulaR1C1 = "=IFERROR(DATEDIF(TODAY(),RC[-1]+365 ,""d""),""neen"")"
 
Als je in VBA werkt moet je in de VBA-taal denken, niet in Excel-taal.
Ik kan niet zien welke onjuiste invoer die tekstvakken bevatten.
Vandaar mijn suggestie voor het gebruik van comboboxen voor geldige datuminvoer.
 
Probeer deze eens.
 

Bijlagen

  • Frans testbestand 1.xlsb
    56,6 KB · Weergaven: 12
Nu de tab volgorde van de textboxen/comboboxen nog goed zetten. zie #44
Zelf zou ik de knop "toevoegen" in het L_1_Click event verbergen, per abuis klicken op "toevoegen" geeft problemen.
Probeer de aangereikte codes van @snb te ontrafelen/begrijpen, daar leer je veel van. (ik in ieder geval wel:d)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan