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

Excel rij tellen in formulier (vba)

Status
Niet open voor verdere reacties.

Koers

Gebruiker
Lid geworden
21 nov 2004
Berichten
47
Beste Excel kenners,

Voor mijn stage ontwikkel ik een eigen formulier in Excel 2007 m.b.v. VBA. De gebruiker kan een offertenummer opzoeken, waarna de rest van het formulier vervolgens automatisch wordt ingevuld.

Echter wanneer een gebruiker een offertenummer opzoekt, en hier een aanpassing in doet. (bijv. de offertestatus) maakt excel een nieuwe regel aan en kopieert alles in een nieuwe rij.

Wat ik dus wil is dat Excel de offerte aanpast, ipv een nieuwe rij maakt en alles kopieert.
(zit het met rowcount te proberen, maar het lukt maar niet.)

Iemand een idee hoe een eventuele code eruit kan zien?

Greets,
Koers.
 
Met Find kan je het offertenummer opzoeken en de bijbehorende Row gebruiken om gegevens weg te schrijven.

Met vriendelijke groet,


Roncancio
 
Met Find kan je het offertenummer opzoeken en de bijbehorende Row gebruiken om gegevens weg te schrijven.

Met vriendelijke groet,


Roncancio

Beste Roncanio en Bouwmeester,

Dank voor de snelle reactie.
Ik kan helaas geen voorbeeld posten omdat het gehele bestand uit gevoelige informatie bestaat. Hoe zal een combinatie van find en row eruit komen te zien? Op het internet staan volop tips om de laatste row te vinden, (voor een hele nieuwe offerte.) Maar helaas niet om een huidige offerte aan te passen.
 
Koers,

Deze code heeft volgens mij Roncancio dit eens geschreven voor het aan passen van de informatie.
Code:
Private Sub Aanpassen_button_Click()
    Dim lrij As Long
    With Worksheets(1).Range("C1:C65536")
    Set WA = .Find(Cbo_WA_nr.Value, LookIn:=xlValues, LookAt:=xlWhole)
    WA.Select
    Cells(WA.Row, "E").Value = Zoeken_van_werkaanvragen.Cbo_Cap_Gr.Value
    End With
End Sub

Misschien heb je er wat aan.
 
Laatst bewerkt:
Een simpel voorbeeld.
In bijgevoegd bestand zit een menu.
Op dit menu zitten 2 dropdownlijsten (nummer en tekst)
Kies je een nummer dan verschijnt bij tekst de bijbehorende tekst.
Verander je de tekst en klik je op OK dan wordt de tekst van de bron aangepast.

Bijv.

Nr Tekst
100 dag
200 doei
300 ok

Je kiest voor 200 (doei) en verandert de tekst in het tekstvak in "tot ziens".
Het overzicht wordt dan:

Nr Tekst
100 dag
200 tot ziens
300 ok

Met vriendelijke groet,


Roncancio
 

Bijlagen

Koers,

Deze code heeft volgens mij Roncancio dit eens geschreven voor het aan passen van de informatie.
Code:
Private Sub Aanpassen_button_Click()
    Dim lrij As Long
    With Worksheets(1).Range("C1:C65536")
    Set WA = .Find(Cbo_WA_nr.Value, LookIn:=xlValues, LookAt:=xlWhole)
    WA.Select
    Cells(WA.Row, "E").Value = Zoeken_van_werkaanvragen.Cbo_Cap_Gr.Value
    End With
End Sub

Misschien heb je er wat aan.

Zonder WA.Select mag ik hopen.:o:o:shocked:

Met vriendelijke groet,


Roncancio
 
Roncancio,

Zonder WA.Select mag ik hopen.

Ik denk wel dat hij snap dat het naar zijn behoefte moet worden aangepast.
Het gaat tenslotte om de code.
 
Roncancio,
Ik denk wel dat hij snap dat het naar zijn behoefte moet worden aangepast.
Het gaat tenslotte om de code.

Dat begrijp ik en daar ben ik het ook volledig mee eens. :thumb:
Maar waar het mij om gaat is dat ik (en meerderen) prediken om geen .Select oid te gebruiken.
Dat zou het wel opmerkelijk zijn als .Select tussen mijn code staat.:o

Met vriendelijke groet,


Roncancio
 
Roncancio,

Maar waar het mij om gaat is dat ik (en meerderen) prediken om geen .Select oid te gebruiken.
Dat zou het wel opmerkelijk zijn als .Select tussen mijn code staat.

Sorry dan heb ik mij vergist en zal het wel iemand anders geschreven hebben.
 
Helemaal super al deze reacties!
Ik ga gelijk met het voorbeeld aan de slag, jullie horen van me.

Gr,
Koers.
 
Suggestie

in plaats van
Code:
Private Sub Aanpassen_button_Click()
    Dim lrij As Long
    With Worksheets(1).Range("C1:C65536")
    Set WA = .Find(Cbo_WA_nr.Value, LookIn:=xlValues, LookAt:=xlWhole)
    WA.Select
    Cells(WA.Row, "E").Value = Zoeken_van_werkaanvragen.Cbo_Cap_Gr.Value
    End With
End Sub

kan het ook met deze one-liner
Code:
Private Sub Aanpassen_button_Click()
  on error resume next
  Worksheets(1).columns(3).Find(Cbo_WA_nr.Value).offset(,2).Value = Zoeken_van_werkaanvragen.Cbo_Cap_Gr.Value
End Sub
 
Laatst bewerkt:
kan het ook met deze one-liner
Code:
Private Sub Aanpassen_button_Click()
  on error resume next
  Worksheets(1).columns(3).Find(Cbo_WA_nr.Value,xlValues, xlWhole).offset(,2).Value = Zoeken_van_werkaanvragen.Cbo_Cap_Gr.Value
End Sub

Je bent wel van de on-liners:p.
Persoonlijk vind ik ook dat zo weinig mogelijk regels gebruikt moeten worden maar het moet wel leesbaar zijn. Een regel van een paar honderd karakters lijkt mij is dat niet.
Bovendien is het moeilijker om fouten te vinden, want ik neem aan dat je de code getest hebt en dat je gemerkt hebt dat het niet de juiste resultaat gaf. '
Code:
On Error Resume Next
 Worksheets(1).Columns(3).Find(cbo_wa_nr.Value, , xlValues, xlWhole).Offset(, 2).Value = zoeken_van_werkaanvragen.Cbo_Cap_Gr.Value
Zo lukt het wel.

Met vriendelijke groet,


Roncancio
 
Laatst bewerkt:
Jij ook bedankt voor de kritische blik:thumb::p

Met vriendelijke groet,


Roncancio
 
Hartelijk dank voor alle hulp.
Niet alleen loopt deze code perfect, het is ook een stuk korter dan wat ik in gedachte had!

Heb de code op deze manier toegepast:

Code:
Dim lnr
Private Sub txtoffertenr_change()

With Sheets("Offertes").Range("tabofferte[offertenummer]")
    Set lnr = .Find(txtoffertenr.Value, LookIn:=xlValues, lookat:=xlWhole)
     If Not lnr Is Nothing Then
        txtproduct.Value = lnr.Offset(0, 2)
        txtbedrag.Value = lnr.Offset(0, 7)
        txtverkoper.Value = lnr.Offset(0, 6)
        txtklant.Value = lnr.Offset(0, 1)
        txtdatum.Value = lnr.Offset(0, 3)
        txtstatus.Value = lnr.Offset(0, 14)
        txtorder.Value = lnr.Offset(0, 5)
        txtopmerkingen.Value = lnr.Offset(0, 15)
    End If
End With


End Sub
Private Sub cmdtoevoegen_Click()
lnr.Offset(0, 7) = txtbedrag.Value
lnr.Offset(0, 6) = txtverkoper.Value
lnr.Offset(0, 1) = txtklant.Value
lnr.Offset(0, 3) = txtdatum.Value
lnr.Offset(0, 14) = txtstatus.Value
lnr.Offset(0, 5) = txtorder.Value
lnr.Offset(0, 15) = txtopmerkingen.Value

End Sub

Wanneer een gebruiker echter een nieuwe offerte wil toevoegen werkt bovenstaande code (uiteraard) niet. Ik probeer dit op te lossen met onderstaande code.

Code:
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("Offertes")

'Vind eerste lege rij in database
iRow = ws.Cells(Rows.Count, 1) _
  .End(xlUp).Offset(1, 0).Row

'Kopieer de ingevoerde data in de database
ws.Cells(iRow, 1).Value = Me.txtoffertenr.Value
ws.Cells(iRow, 2).Value = Me.txtklant.Value
ws.Cells(iRow, 3).Value = Me.txtproduct.Value
ws.Cells(iRow, 8).Value = Me.txtbedrag.Value
ws.Cells(iRow, 16).Value = Me.txtopmerkingen.Value
ws.Cells(iRow, 4).Value = Me.txtdatum.Value
ws.Cells(iRow, 7).Value = Me.txtverkoper.Value
ws.Cells(iRow, 15).Value = Me.txtstatus.Value
ws.Cells(iRow, 6).Value = Me.txtorder.Value

De code zoekt de eerstvolgende lege regel, en kopieert de data in de tabel.
Echter werkt dit niet, ik vermoed dat ik het te ingewikkeld maak op bovenstaande manier.
Suggesties voor een betere uitwerking?
 
Koers,

Heb je hier wat aan?
Code:
Dim lrij As Long
        lrij = ActiveSheet.Range("C65536").End(xlUp).Row
        Cells(lrij + 1, "C").Value = Ingeven_van_werkaanvragen.Txt_wa.Text
        Cells(lrij + 1, "D").Value = Ingeven_van_werkaanvragen.Txt_omschrijving
        Cells(lrij + 1, "E").Value = Ingeven_van_werkaanvragen.Cbo_Cap_Gr.Value
        Cells(lrij + 1, "F").Value = Ingeven_van_werkaanvragen.Cbo_Week.Value
        Cells(lrij + 1, "G").Value = Ingeven_van_werkaanvragen.Txt_Datum
        Leeg_button_Click
 
Als je de tekstvakken wat handiger namen geeft

Code:
Private Sub txtoffertenr_change()
  With Sheets("Offertes").Range("tabofferte[offertenummer]").Find(txtoffertenr.Value, ,xlValues,xlWhole )
    for j= 1 to 8
      Me("txt" & j).Value = .Offset(, j)
    next
  End With
End Sub

Code:
Private Sub cmdtoevoegen_Click()
  With Sheets("Offertes").Range("tabofferte[offertenummer]").Find(txtoffertenr.Value, ,xlValues,xlWhole )
    for j= 1 to 8
      .Offset(, j) = Me("txt" & j).Value
    next
  End With
End Sub


'Kopieer de ingevoerde data in de database

Code:
Worksheets("Offertes").Cells(Rows.Count, 1).End(xlUp).Offset(1 ).resize(,9)=split(Me.offertenummer & "|" & txtklant & "|" txtproduct & "|" & txtbedrag & "|" &txtopmerkingen & "|" & txtdatum & "|" & txtverkoper & "|" & txtstatus &"|" & txtorder,"|")

Werp hier eens een blik
 
Laatst bewerkt:
Beste snb,

Een erg interessante code die met heel weinig regels hetzelfde resultaat bereikt.
De code maakt bij een nieuw nr idd een rij onder de database aan, maar dit doet die echter voor elke letter, ipv te wachten tot het formulier is ingevuld.
(Heb jou voorbeeldformulier gedeeltelijk gebruikt in de code.)

Code:
Private Sub txtoffertenr_change()
  With Sheets("Offertes").Range("tabofferte[offertenummer]").Find(txtoffertenr.Value, , xlValues, xlWhole)
   If txtoffertenr.ListIndex > -1 Then
   
    For j = 1 To 9
      Me("txt" & j).Value = .Offset(, j)
    Next
Else
 
Worksheets("Offertes").Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 9) = Split(Me.txtoffertenr & "|" & txtklant & "|" & txtproduct & "|" & txtbedrag & "|" & txtopmerkingen & "|" & txtdatum & "|" & txtverkoper & "|" & txtstatus & "|" & txtorder, "|")
    
    End If
  End With
End Sub
Private Sub cmdtoevoegen_Click()
  With Sheets("Offertes").Range("tabofferte[offertenummer]").Find(txtoffertenr.Value, , xlValues, xlWhole)
    For j = 1 To 9
      .Offset(, j) = Me("txt" & j).Value
     Next
  End With
End Sub

Wat klopt er niet aan deze code?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan