.Offset vraag

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Even een vraag over .Offset. Deze is mij nog steeds niet helemaal duidelijk en geeft verwarring bij mij. Of ik lees de zaken gewoon verkeerd.

Nu heb ik een code gewijzigd. Daarmee wordt nog steeds de waarde in de onderste cel aangegeven. Nu moet deze waarde worden overgeslagen en dan de eerstvolgende waarde worden aangegeven. Echter tussen deze staan een aantal lege cellen die variabel kunnen zijn.

Klopt het dat ik dit gewoon middels .Offset(-1) kan doen? Of blijft dan de eerste lege cel boven de aangegeven cel continue weergegeven?

Dus Cells(Rows.Count, 1).End(xlUp).Value zoekt de eerste cel met een ingevoerde waarde vanaf onder af en geeft deze weer ( Bijvoorbeeld de waarde in A12). Dan kan ik wel .Offset(-1) er tussen plaatsen, maar blijft deze dan continue de waarde in A11 geven? Of pakt deze dan alsnog weer de eerstvolgende cel naar boven toe waar een waarde in staat, bijvoorbeeld in A9 ?

Ik heb iets gevonden met:

Code:
MsgBox ("LAATSTE WAARDE IN KOLOM A IS " & Cells(Rows.Count, 1).End(xlUp).Offset(-1).End(xlUp))

Nu wordt weer wel de eerste waarde genomen. Alleen ik weet niet of dit ook de bedoeling is en of dit wel degelijk is wat moet gebeuren. Ik bedoel ondanks dat deze nu lijkt te werken, klopt de code en blijft deze werken? Ik vind het een vreemde samenstelling.

Update:

Ik merk dat in bovenstaande code de .Offset(-1) niet eens nodig zou zijn. Als ik 2 keer .End(xlUp) na elkaar zet dan doet deze in dit geval precies hetzelfde.

Vandaar dat ik het fijn zou vinden als ik hier duidelijkheid over heb. Wellicht een duidelijke site hierover. Ik kan deze namelijk maar niet vinden.
 
Laatst bewerkt:
offset(rijen, kolommen)
positief: omlaag voor de rijen, en naar rechts voor de kolommen.
negatief: tegenovergestelde richting.
 
HSV Dank voor je reactie.

Maar met samengestelde cellen krijg ik weer een hele andere werking. Kan VBA niet met samengestelde cellen omgaan?

Bekijk bijlage TEST 2.xlsm

Met Knop 1 en 2, bij een niet samengestelde cel, krijg ik hetzelfde resultaat.
Met Knop 3 en 4, bij een samengestelde cel, krijg ik een ander resultaat.

Vandaar ik snap het niet helemaal. Het ziet er logisch uit, maar welke code kan ik het best wanneer gebruiken en dan voornamelijk i.v.m. de combinatie .Offset(1) en .Row + 1

En kennelijk volgens mijn bestand waar het uiteindelijk om gaat, werkt de code weer anders bij het gebruik met Lastrow =
 
Laatst bewerkt:
Samenstellen van cellen is vragen om problemen.
Zowel in Vba als met formules in je werkblad.
 
Je kan het best geen samengestelde cellen gebruiken, iedere gevorderde zal het je afraden.
edit: dat zijn er nu al twee
 
Wat is dan het probleem. Wat voor problemen kan het dan geven.

en inderdaad Alphamax, Ik heb dat vaker gelezen, maar heb nog nooit echt het probleem zelf ontdekt. Behalve dat je dan met codes moet vogelen. Soms ontkom je er niet aan bij het opzetten. Als ik tabellen maak dan gebruik ik vaak 2 regels omdat sommige teksten 2 regels omvatten. Daar waar ik dan 1 regel tekst heb, wil ik voor de netheid dan in het midden hebben en vervolgens stel ik dan die 2 cellen samen om deze dan erna weer te centreren.
 
Laatst bewerkt:
De problemen die je nu dus tegenkomt.
 
Haha kort en krachtig dus, maar deze zijn wel te verhelpen door te puzzelen?. Maar ik snap het.

Echter wat is nu de beste code... welke ik kan hanteren:

.Offset(1).Row of .Row + 1

Update

En dan nog meteen een extra vraag.
Code:
    .End(xlUp).Offset(1)

is dat hetzelfde als
Code:
    .End(xlUp)(1)
 
Laatst bewerkt:
Nee, is niet hetzelfde.

Als je het getest had was je daar zelf achter gekomen.
.end(xlup) (2) = hetzelfde
 
Uiteindelijk draait het om onderstaande code:

Je ziet de codes waar het om gaat vanzelf staan.

Code:
Private Sub UserForm_Initialize()

    Lb_Datum_Show = Date & " / " & Time
    Lb_Totaal1_Show = Format(Cells(Rows.Count, 9).End(xlUp).Offset(-1).Value, " € 0.00")
    Lb_Totaal2_Show = " € 0,00"
    Lb_Aantal_Rij_Show = ActiveSheet.Range("B4")
    
    Dim Lastrow As Integer
    Lastrow = Cells(Rows.Count, 1).End(xlUp).Offset(-3).End(xlUp).Row + 1 'Voor deze code is de laatste rij: Rij 25 + 1
    
    If Lastrow = 26 Then Call LaatsteRijShow2
    
    Lb_Totaal_Artikel_Show = " € 0,00"
    Cmb_Zoekwaarde.SetFocus
    Cmb_Zoekwaarde.RowSource = "Soort"
    
End Sub

Private Sub Cmb_Zoekwaarde_Change()

    Cmb_Merk.RowSource = Cmb_Zoekwaarde.Value
    Cmb_Merk.BackColor = &H80000005
    Cmb_Merk.Enabled = True
    Cmb_Merk.SetFocus

End Sub

Private Sub Cmb_Merk_Change()
On Error Resume Next
    Cmb_Omschrijving.RowSource = Cmb_Merk.Value
    Cmb_Omschrijving.BackColor = &H80000005
    Cmb_Omschrijving.Enabled = True
    Cmb_Omschrijving.SetFocus
    
End Sub

Private Sub Cmb_Omschrijving_Change()
    
    On Error Resume Next
    
    Tb_Art_Lev.Value = Application.WorksheetFunction.VLookUP(Cmb_Omschrijving.Value, Sheets("Materiaallijst").Range("A3:J900"), 3, False)
    Tb_EAN.Value = Application.WorksheetFunction.VLookUP(Cmb_Omschrijving.Value, Sheets("Materiaallijst").Range("A3:J900"), 5, False)
    Tb_Art_TU.Value = Application.WorksheetFunction.VLookUP(Cmb_Omschrijving.Value, Sheets("Materiaallijst").Range("A3:J900"), 6, False)
    
    With Tb_Prijs
        .Value = Application.WorksheetFunction.VLookUP(Cmb_Omschrijving.Value, Sheets("Materiaallijst").Range("A3:J900"), 7, False)
        .Value = Format(Replace(.Value, ".", ","), " € 0.00")
    End With
    
    Tb_Aantal.BackColor = &H80000005
    Tb_Aantal.Enabled = True
    Tb_Aantal.SetFocus
    
End Sub

Private Sub Cb_Toevoegen_Click()

    If Cmb_Zoekwaarde = vbNullString Then
        MsgBox ("U heeft geen Zoekwaarde ingevuld." & vbNewLine & vbNewLine & "Deze invoer is verplicht.")
        Cmb_Zoekwaarde.SetFocus
        Exit Sub
    End If
        
    If Cmb_Merk = vbNullString Then
        MsgBox ("U heeft geen Merk ingevuld." & vbNewLine & vbNewLine & "Deze invoer is verplicht.")
        Cmb_Merk.SetFocus
        Exit Sub
    End If
        
    If Cmb_Omschrijving = vbNullString Then
        MsgBox ("U heeft geen Omschrijving ingevuld." & vbNewLine & vbNewLine & "Deze invoer is verplicht.")
        Cmb_Omschrijving.SetFocus
        Exit Sub
    End If

    If Tb_Aantal = vbNullString Then
        MsgBox ("U heeft geen Aantal ingevuld." & vbNewLine & vbNewLine & "Deze invoer is verplicht.")
        Tb_Aantal.SetFocus
        Exit Sub
    End If
    
    With Sheets("Opzet")
        'If Range("B5") = vbNullString Then Range("B5").Value = Date
        'If Range("B6") = vbNullString Then Range("B6").Value = Time
        .Cells(Rows.Count, 1).End(xlUp).Offset(-3).End(xlUp).Offset(1).Resize(, 10) = Array(.Range("B4") + 1, Cmb_Merk, Cmb_Omschrijving, Tb_Art_Lev, Tb_EAN, Tb_Art_TU, Tb_Prijs, Tb_Aantal, Tb_Prijs * Tb_Aantal, Lb_Datum_Show)
        .Cells(Rows.Count, 1).End(xlUp).Offset(-3).End(xlUp).Offset(1).Resize(, 10).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End With

    Dim Verhogen As Long
        Verhogen = Lb_Aantal_Rij_Show
        Lb_Aantal_Rij_Show = Verhogen + 1
            
    Lb_Totaal1_Show = Format(Cells(Rows.Count, 9).End(xlUp).Offset(-1).Value, " € 0.00")
            
    Select Case Lb_Totaal2_Show
    Case Is = vbNullString
        Lb_Totaal2_Show = Lb_Totaal_Artikel_Show
    Case Is > vbNullString
        Dim Verhogen2 As Double
        Verhogen2 = Lb_Totaal2_Show
        Lb_Totaal2_Show = Format(CDbl(Lb_Totaal_Artikel_Show + Verhogen2), " € 0.00")
    End Select
            
    Call LaatsteRijShow
    Call Cb_Reset_Click
        
End Sub

Private Sub Cb_Reset_Click()

    For Each ctl In Me.Controls
        If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then ctl.Value = vbNullString
    Next
    
    Lb_Totaal_Artikel_Show = " € 0,00"
    Cmb_Merk.BackColor = &HE0E0E0
    Cmb_Merk.Enabled = False
    Cmb_Omschrijving.BackColor = &HE0E0E0
    Cmb_Omschrijving.Enabled = False
    Tb_Aantal.BackColor = &HE0E0E0
    Tb_Aantal.Enabled = False
    Cmb_Zoekwaarde.SetFocus
        
End Sub

Private Sub Cb_LaatsteRijWissen_Click()

    Dim Lastrow As Integer
        Lastrow = Cells(Rows.Count, 1).End(xlUp).Offset(-3).End(xlUp).Row + 1

    Select Case Lastrow
        Case Is = 26
            Call Einde
            Exit Sub
        
        Case Is > 26
            Dim Verlagen As Double
                Verlagen = Lb_Totaal2_Show
            
            Select Case Lb_Totaal2_Show
                Case Is = " € 0,00"
                    MsgBox ("Er zijn voor deze invoersessie geen artikelrijen te verwijderen." & vbNewLine & vbNewLine & "Klik op OK om door te gaan.")
                    Exit Sub
                Case Is > " € 0,00"
                    Lb_Totaal2_Show = Format(Verlagen - CDec(Cells(Rows.Count, 9).End(xlUp).Offset(-5).Value), " € 0.00")
                    Cells(Rows.Count, 1).End(xlUp).Offset(-3).End(xlUp).EntireRow.Delete
                    
                    Dim Verlagen2 As Long
                        Verlagen2 = Lb_Aantal_Rij_Show
                        Lb_Aantal_Rij_Show = Verlagen2 - 1
            
                    Lb_Totaal1_Show = Format(Cells(Rows.Count, 9).End(xlUp).Offset(-1).Value, " € 0.00")
                    Call LaatsteRijShow
            End Select
        End Select
        
End Sub

Private Sub Cb_Gereed_Click()

    Unload Me
    
End Sub

Private Sub Cb_Afsluiten_Click()

    Unload Me
    
End Sub

Private Sub Tb_Aantal_AfterUpdate()
    
    On Error Resume Next
    Cb_Toevoegen.SetFocus
    Lb_Totaal_Artikel_Show = Format(CDbl(Tb_Aantal.Text) * CDbl(Tb_Prijs.Text), " € 0.00")
    
End Sub

Private Sub LaatsteRijShow()

    If Cells(Rows.Count, 1).End(xlUp).Offset(-3).End(xlUp).Row + 1 = 26 Then
        Call LaatsteRijShow2
        Exit Sub
    End If
    
    Lb_Merk_Laatste_Show = " " & Cells(Rows.Count, 2).End(xlUp).Offset(-3).End(xlUp).Value
    Lb_Omschrijving_Laatste_Show = " " & Cells(Rows.Count, 3).End(xlUp).Value
    Lb_EAN_Laatste_Show = Cells(Rows.Count, 5).End(xlUp).Value
    Lb_Art_TU_Laatste_Show = Cells(Rows.Count, 6).End(xlUp).Value
    Lb_Prijs_Laatste_Show = Format(Cells(Rows.Count, 7).End(xlUp).Offset(-1).End(xlUp).Value, " € 0.00")
    Lb_Aantal_Laatste_Show = Cells(Rows.Count, 8).End(xlUp).Value
    Lb_Totaal_Artikel_Laatste_Show = Format(Cells(Rows.Count, 9).End(xlUp).Offset(-1).End(xlUp).Value, " € 0.00")
    
End Sub

Private Sub LaatsteRijShow2() 'Rij 26 selecteren en Rij 27 weergeven in userform
    
    Lb_Merk_Laatste_Show = " " & Cells(Rows.Count, 2).End(xlUp).Offset(-3).End(xlUp).Offset(1).Value
    Lb_Omschrijving_Laatste_Show = " " & Cells(Rows.Count, 3).End(xlUp)(2).Value
    Lb_EAN_Laatste_Show = Cells(Rows.Count, 5).End(xlUp)(2).Value
    Lb_Art_TU_Laatste_Show = Cells(Rows.Count, 6).End(xlUp)(2).Value
    Lb_Prijs_Laatste_Show = Format(Cells(Rows.Count, 7).End(xlUp).Offset(-4).Value, " € 0.00")
    Lb_Aantal_Laatste_Show = Cells(Rows.Count, 8).End(xlUp)(2).Value
    Lb_Totaal_Artikel_Laatste_Show = Format(Cells(Rows.Count, 9).End(xlUp).Offset(-4).Value, " € 0.00")
    
End Sub

Private Sub Einde()

    MsgBox ("U heeft alle artikelrijen verwijderd." & vbNewLine & vbNewLine & "Klik op OK om door te gaan."), vbInformation, "Alle artikelrijen gewist"
    
End Sub
 
HSV ik had het inderdaad getest en kwam er ook op uit dat het hetzelfde was. Alleen ik vroeg mij hierom ook af of het wel klopte.

Daarbij jij gebruikt nu (2) in je code. Waarom gebruik jij dan (2). Ik dacht namelijk dat dit ook te maken had met Offset. Maar kennelijk doet deze meer of werkt deze anders.

Ik gebruik nu dus als ik zo mijn code bekijk... Zaken door elkaar. Ik wil dit duidelijker hebben voor mijzelf, want wellicht maak ik het hierdoor ook enkel maar verwarrend.

Vandaar dat ik dus vroeg om duidelijkheid in de .Offset
 
Ik gebruik het nooit, daar je enkel de rijen maar mee aangeeft, en geen kolommen.
Ook is het verwarrend, daar je er één bij moet tellen.
De offset is daarbij veel overzichtelijker.
 
Dus onderstaande is het beste begrijp ik hieruit?


.End(xlUp).Offset(1)

De codes in mijn code hier vermeld, maken ook gebruik van de rij nummers, maar omdat ik telkens verkeerd uitkom, snap ik het niet meer. Wellicht als ik alles aanpas naar 1 eenheid dat ik het duidelijker maak en meteen ook de "kleine fouten" er uit haal.
 
Laatst bewerkt:
Ik gebruik het nooit, daar je enkel de rijen maar mee aangeeft, en geen kolommen.
Ook is het verwarrend, daar je er één bij moet tellen.
De offset is daarbij veel overzichtelijker.

Hoe zou jij het dan doen?
 
Je kan het ook zo aangeven als je het verwarrend vindt.

offset(1, 0)

Eén rij naar onderen en nul rijen opzij.
 
Die kende ik al. Maar (1) scheelt met (1,0) toch weer 2 tekens typen als ik enkel een cel omlaag wil. Ik type mijn codes al zo ontzettend lang als ik deze met die van jullie vergelijk. ALS ik ooit zo ver kom dan denk ik dat ik verder moet in mijn kistje van 6 planken. Alleen hier een probleem..... geen stroom en internet dus ik zal niet ver komen.

Jullie zijn wat dat aangaat vele malen verder... een horde die ik NOG LANGE niet heb bereikt. Zeker als ik de codes van Snb bekijk....Die zijn helemaal kort. hihi.
 
Als je de code maar begrijpt, dat is het belangrijkste.
Kortere code schrijven komt daarna vanzelf.
 
Ik ga even verder oefenen en aanpassen. Wellicht dat ik nu verder kom en dat ik door het duidelijker te maken minder verwarrend maak.

Als ik er dan nog niet uitkom dan moet jij of jullie maar kijken als jij of jullie er toe geneigd zijn.

Eerst zelf doen.

Bedankt.

Topic sluit ik af.
 
Oke ik heb hem toch nog even heropend.

Ik zag dat het simpeler kon. Ik herhaalde de code voor een bepaalde reeks. Ik kan ook de betreffende labels gewoon leeg laten. Gewoon vbNullString.

Nu kan ik dit doen op 2 manieren. Veel type werk en alle labels apart aanspreken en middels vbNullString leeg maken. Of op een andere manier met een korte code.

De labels in het userform hebben allen op het einde in de naam: _Laatste_Show staan. Het geldt voor deze labels dat ik deze met een simpele code op vbnullstring wil hebben. Zo ben ik veel gepuzzel met .Offset door een korte code kwijt. Deze wijze van schrijven zal ook denk ik met:

For Each ctl In Me.Controls
(En hier de code) then =vbNullString
Next

moeten, maar hoe ik dan enkel het eindgedeelte van de labels kan gebruiken dat weet ik niet.
 
Zonder testen
Code:
for each ctl in me.controls
if typename(ctl) = "Label" and right(ctl.name,13) = "_Laatste_Show" then
ctl.caption = vbnullstring
next
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan