Vragen m.b.t. gelijktijdige bewerking in Listview en werkblad

Status
Niet open voor verdere reacties.

JJZijlstra

Gebruiker
Lid geworden
26 nov 2013
Berichten
299
Beste lezer,

Hier in de bijlage een kort en eenvoudig bestandje. Hierover heb ik een paar vragen, nl:

-- Bij gebruik van 'Volgend record' en 'Vorig record' (met < en >) zou ik graag zien dat de selectie in de listview gelijktijdig hetzelfde record aangeeft in het werkblad of sheet.
Met welke code verbind ik de rijen in de listview met de rijen in het werkblad?
-- In de tekstvakken in de userform wil ik gegevens kunnen wijzigen en deleten die direct ook meegenomen worden in het werkblad.
Hoe luidt de juiste code hiervoor?
-- Is dit ook simpel uit te leggen?

Vriendelijke groet,
Johan
 

Bijlagen

-- In de tekstvakken in de userform wil ik gegevens kunnen wijzigen en deleten die direct ook meegenomen worden in het werkblad.
Wat is daar het nut van? Een formulier is (m.i.) juist bedoeld om eerst rustig alle gegevens in te voeren en te verzamelen, en die dan in één keer weg te schrijven m.b.v. een opdrachtknop. Zo voorkom je dat je nodeloos allerlei gegevens loopt te muteren en je hebt veel meer controle over wat de gebruiker mag/moet invoeren.
 
Wat betreft je eerste vraag: ik gebruik zoiets. Een functie die het formulier vult, en het rijnummer krijgt vanuit (bijvoorbeeld) een spinner of bladerknoppen.
Code:
Private Sub Formulier(rWaarde As Integer)

    For i = 1 To 26
        On Error Resume Next
        Select Case i
            Case 10
                cboType.Value = ws.Cells(rWaarde, i)
            Case 12
                Me("Textbox" & i).Value = ws.Cells(rWaarde, i)
                If ws.Cells(rWaarde, i) > 42 Then
                    Me("Textbox" & i).ForeColor = vbRed
                    Me("Textbox" & i).Font.Bold = True
                Else
                    Me("Textbox" & i).ForeColor = vbBlack
                    Me("Textbox" & i).Font.Bold = False
                End If
            Case 14
                cboJurist.Value = ws.Cells(rWaarde, i)
            Case 15
                Me("Textbox" & i).Value = ws.Cells(rWaarde, i)
                If ws.Cells(rWaarde, i) < ws.Cells(1, 26) Then
                    Me("Textbox" & i).ForeColor = vbRed
                    Me("Textbox" & i).Font.Bold = True
                Else
                    Me("Textbox" & i).ForeColor = vbBlack
                    Me("Textbox" & i).Font.Bold = False
                End If
            Case 18
                cboUitkomst.Value = ws.Cells(rWaarde, i)
            Case Else
                Me("Textbox" & i).Value = ws.Cells(rWaarde, i)
        End Select
    Next i
    Me.Repaint

End Sub
't Is code uit mijn begintijd, dus hij zal best handiger kunnen ondertussen :).

De code roep je dan zo aan:
Code:
Private Sub spnRecords_Change()

    cLastRow = spnRecords.Value
    Me.txtRijen = cLastRow
    Me.scrRecords.Value = cLastRow
    Formulier (cLastRow)

End Sub

Code:
Private Sub cmdVolgende_Click()
    
    If Me.txtRijen.Value < Me.scrRecords.Max Then
        cLastRow = Me.txtRijen.Value + 1
        Me.txtRijen = cLastRow
        Me.scrRecords.Value = cLastRow
        Me.spnRecords.Value = cLastRow
        Formulier (cLastRow)
    End If

End Sub

Code:
Private Sub cmdVorige_Click()

    If Me.txtRijen.Value > Me.scrRecords.Min Then
        cLastRow = Me.txtRijen.Value - 1
        Me.txtRijen = cLastRow
        Me.scrRecords.Value = cLastRow
        Me.spnRecords.Value = cLastRow
        Formulier (cLastRow)
    End If

End Sub
 
Om in het bestandje van jezelf te blijven.
 

Bijlagen

@ OctaFish,

Hartelijk dank voor de uitgebreide uitleg en voorbeeld. Omdat ik (nog) niet in de materie thuis ben, het volgende:
-- Ik zal het onderwerp wijzigen en deleten dan maar vergeten en nu doorgaan met "Volgend record" en "Vorig record".
Als ik jouw code overneem in mijn formulier, dan zegt hij bij mRow dat hij het gegevenslid niet kan vinden. Hoe los ik dat op?

In de begincode zie ik, zoals ik het zelf vertaal, dat de tekstvelden verschillende kleuren kunnen hebben en dat de tekst soms wel en niet vet is.
Hoe moet ik me dat voorstellen of hoe ziet dat eruit? Is de begincode met de 'select case' de opmaak van de userform?

Groet,
Johan
 
Ik gebruik een aantal variabelen en tekstvakken op het formulier. Die worden soms gevuld, of uitgelezen. Als een variabele bij jou niet bestaat, en die kans is natuurlijk groot, dan krijg je een foutmelding. Op mijn formulier heten de tekstvelden Textbox#, met oplopend nummer (vandaar dat je ze met een lus kunt vullen en uitlezen) en een aantal keuzelijsten die met cbo beginnen. Alles wat jij niet hebt/gebruikt, moet natuurlijk weg. En als je minder als 26 tekstvakken hebt (en dat is zo) dan moet de lus ook worden aangepast.
Met
Code:
        cLastRow = Me.txtRijen.Value + 1
        Formulier (cLastRow)
wordt het rijnummer verhoogd en de functie Formulier aangeroepen die de volgende rij uitleest.
 
Is het ook mogelijk om vanuit mijn eigen code in het door mij geüploade bestand een code toe te voegen die gelijktijdig op het werkblad en listview een selectie laat zien?

Groet,
Johan
 
Dat kan uiteraard wel, maar de vraag is: moet je dat wel willen? En wat is de winst ervan? De grap van een Userform is nu juist dat je de gebruiker een overzichtelijk scherm voorschotelt waar alles netjes en op een rustige manier te zien en te muteren is. Als je vervolgens op de achtergrond van alles laat bewegen, dan wordt het werken met het formulier er niet prettiger op. Maar bovenal: ik zie het nut er totaal niet van.
 
Prima, dan. Het levert dan wel geen winst op, zoals je zegt. Ik citeer de jouw zin:
De grap van een Userform is nu juist dat je de gebruiker een overzichtelijk scherm voorschotelt waar alles netjes en op een rustige manier te zien en te muteren is.
Daarmee ben ik het helemaal totaal mee eens.
Het gaat nu om het tweede gedeelte van jouw zin
en te muteren is.

Zoals ik het begrijp wil jij ook de mogelijkheid hebben om later of achteraf te kunnen muteren. Dat is nu juist wat ik bedoel oftewel de spijker op zijn kop. Je kunt bv. een adressenbestand hebben die vandaag de dag actueel is, maar iemand kan later gaan verhuizen, het is dan de bedoeling om die wijziging dan ook later te kunnen aanbrengen in zo mogelijk alle tekstvelden. Mijn vraag is dan hoe jij dat gaat oplossen wanneer je uitgaat van mijn bestand.

Groet,
Johan
 
Met deze aanvulling in het geplaatst bestandje door mij, is het een fluitje van een cent.
Code:
Private Sub CommandButton1_Click()
 Cells(ListBox1.ListIndex + 1, 1).Resize(, 4) = Array(TextBox1, TextBox2, TextBox3, CCur(TextBox4))
End Sub
 
Dit is pas echt de spijker op z'n kop. Dit is exact wat ik bedoel. :):):)

Nog even een kleine analyse van de code
Mag ik nog vragen wat je bedoelt met
Cells(Listbox1.Listindex+1,1)
.
De RESIZE heeft vlgs. mij betrekking op op de 4 textboxen.

Verder: Ocatafish en HSV: ik bedank jullie hartelijk voor je bijdragen en ....... welterusten nu.

Vriendelijke groet,
Johan
 
Laatst bewerkt:
Je moet nog een code om de textboxen te vullen als je in de listbox klikt. ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan