Find methode

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Beste allen.

Ik ben nog niet helemaal in de Find methode.

Onderstaande code geeft mij een foutmelding.

Code:
    Dim i as String       

    With Sheets("Blad1")
        i = .Columns(1).Find(TextBox1.Value, , xlValues, xlWhole).Row

            If Trim(TextBox1.Value) = Trim(.Cells(i, 1)) Then
                A = True
                UserRow = i                
                BlokTijd = 1
                
                If Trim(TextBox2.Value) = Trim(.Cells(i, 2)) Then
                    B = True
                    Exit Sub
                End If
            End if


'''''''''''''''''' Hieronder nog een paar Codes om uit te voeren welke de "i" ( De Rij ) gebruiken.

    End With



Deze code wordt gebruikt om het rijnummer te vinden waar de waarde in staat die wordt ingevoerd in TextBox1. Als de waarde overeenkomt dan werkt het perfect. Zodra de waarde niet voorkomt of niet overeenkomt, dan krijg ik een foutcode: Foutmelding 91 tijdens uitvoeren. Objectvariabele of objectvariabele With is niet ingesteld.

Let wel ik heb voordat ik deze code ging inbrengen een andere code gehad. De code was:

Code:
'De rode tekst is verwijderd
    Dim i as Long
    [COLOR="#FF0000"]Dim LastRow as Long[/COLOR]

    [COLOR="#FF0000"]With Sheets("Blad1")[/COLOR]
       [COLOR="#FF0000"] LastRow = .Cells(Rows.Count, 1).End(xlUp).Row[/COLOR]        
        [COLOR="#FF0000"][/COLOR][COLOR="#FF0000"]For i = 2 To LastRow[/COLOR]            

            If Trim(TextBox1.Value) = Trim(.Cells(i, 1)) Then
                A = True
                UserRow = i                
                BlokTijd = 1
                
                If Trim(TextBox2.Value) = Trim(.Cells(i, 2)) Then
                    B = True
                    Exit Sub
                End If
            End if


'''''''''''''''''' Hieronder nog een paar Codes om uit te voeren welke de "i" ( De Rij ) gebruiken.

       [COLOR="#FF0000"] Next i[/COLOR]
    End With

Om niet teveel in de code aan te passen, wilde ik de "i" behouden door deze Variabele op een andere wijze van dezelfde waarde te voorzien. De reden van deze aanpassing is de For die veel tijd in beslag neemt om alles na te gaan.


Volgens het helpmenu mis ik iets of is er iets niet goed ingesteld.

Is dit voldoende?

Aanvulling: UserRow = i, wordt gebruikt in een andere sub binnen hetzelfde userform. Deze is als: Long gedeclareerd helemaal bovenin het UserForm buiten een sub.
 
Laatst bewerkt:
Waarom heb je de variabele i als String gedeclareerd?
Doe het eens zo:
Code:
Dim i As Long
i = 0
On Error Resume Next
i = Sheets("Blad1").Columns(1).Find(TextBox1.Value, , xlValues, xlWhole).Row
On Error Goto 0
If i > 0 then enz...
 
Laatst bewerkt:
De i moest inderdaad Long zijn. Heb het direct aangepast, maar het probleem blijft hetzelfde.

Waarom i = 0.

Het formulier betreft een inlog formulier. Dit formulier heb ik al langer in gebruik en heb ik in het nieuw te ontwerpen bestand gevoegd.

Dit bestand betreft hetzelfde bestand welke recent is geplaatst. Indien nodig zal ik deze hier weer plaatsen, maar dan moet ik wel weer zaken weghouden.
 
Normaal gebruik is.
Zo heb je de on error niet nodig.
Code:
dim c as range
set c = .Columns(1).Find(TextBox1.Value, , xlValues, xlWhole)
if not c is nothing then
msgbox c.address
msgbox c.row
 
Gebruik Application.Match
Kan je gebruik maken van IsError of Not IsError om de waarde te controleren. Als geen overeenkomst gevonden wordt houd VBA de fout 'vast' maar gaat niet in Debug.
 
Sorry, was even bezig om onnodige inhoud te verwijderen. Bestand is namelijk te groot. Nog steeds trouwens en dus krijg ik deze niet geplaatst.

Weet even niet meer waarmee ik dit kon verkleinen en plaatsen.

HSV en WarmBakkertje, dank voor jullie inbreng.

HSV als dit de feitelijke opzet is, bevreemd het mij dat deze elders wel werkt. Kan ik dan middels: i = c.Row, de i behouden?
 
Geen probleem, maar ook if trim(textbox1)= c then
of c.offset(,1)
 
Code:
    With Sheets("Blad1")
        i = Application.Match(TextBox1.Value, .Columns(1), 0)
        If Not IsError(i) Then
            If Trim(TextBox1.Value) = Trim(.Cells(i, 1)) Then
                A = True
                UserRow = i
                BlokTijd = 1
            End If
            If Trim(TextBox2.Value) = Trim(.Cells(i, 2)) Then
                B = True
                Exit Sub
            End If
'''''''''''''''''' Hieronder nog een paar Codes om uit te voeren welke de "i" ( De Rij ) gebruiken.
        End If
    End With
 
Na even puzzelen kom ik uit op onderstaande:

Graag reactie als je ziet dat iets niet klopt of eventueel anders kan. Zo ver ik tot nu toe kan beoordelen is dat de procedure nu goed verloopt, zij het dat ik nog enkele kleine correcties moet maken.

Code:
Private Sub Log()
    Dim LastRow As Long
    Dim Logregel As Long
    Dim GebruikerOk As Boolean
    Dim WachtwoordOk As Boolean
    Dim LogTijd As Date
    Dim c As Range
    Dim i As Long
       
    With Sheets("Gebruikers")
        Set c = .Columns(1).Find(Tb_Gebruiker.Value, , xlValues, xlWhole, , , True)
               
        If Not c Is Nothing Then
            i = c.Row
            MsgBox .Cells(i, 1) & vbCr & .Cells(i, 2) 'Test VERWIJDEREN BIJ JUISTE WERKING""""""""""""""
        
            If Trim(Tb_Gebruiker) = Trim(.Cells(i, 1)) Then
                GebruikerOk = True
                UserRow = i
                BlokTijd = 1
                
                If Trim(Tb_Wachtwoord) = Trim(.Cells(i, 2)) Then
                    WachtwoordOk = True
                    
                    'Controle op blokkade
                    If .Cells(i, 11) = 3 And DateDiff("n", .Cells(i, 12), Now) <= BlokTijd Or .Cells(i, 11) = 5 Then
                        Call Blokkade
                        Exit Sub
                    End If
                End If
            End If
            
            If GebruikerOk = True And WachtwoordOk = True Then
                LogTijd = Now
                
                If Not InlogOk Then 'INLOGGEN
                    Logregel = Sheets("LogFile").Cells(Rows.Count, 1).End(xlUp).Row ''''''''''''''''''''''''
                    Gebruikersnaam = .Cells(i, 1)
                    Gebruiker = .Cells(i, 3)
                    PersNr = .Cells(i, 4)
                    TypeGebruiker = .Cells(i, 5)
                    InlogOk = True
                    
                    Call RijKleur
                    
                    .Cells(i, 7) = .Cells(i, 7) + 1 'Aantal maal login
                    
                    If .Cells(i, 11) > 0 Then 'Reset Aantal mislukte inlogpogingen
                        .Cells(i, 11) = 0
                        If .Cells(i, 12) <> vbNullString Then .Cells(i, 12) = vbNullString 'Reset Blokkade datum en tijd
                    End If
                    
                    With .Cells(i, 8)
                        .Value = LogTijd
                        .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                    End With
                    
                    .Cells(i, 10) = "1" 'Status: Gebruiker Ingelogd
                              
                    With Sheets("LogFile").Cells(Rows.Count, 1).End(xlUp).Offset(1)
                        .Resize(, 6) = Array(Logregel, Gebruikersnaam, Gebruiker, PersNr, TypeGebruiker, LogTijd)
                        .Cells(, 6).NumberFormat = "dd-mm-yyyy hh:mm:ss"
                    End With
                    
                    Call Welkom 'Mod_Frm_Hoofd
                    
                    Me.Hide
                    
                Else 'UITLOGGEN
                    InlogOk = False
                    Call RijKleur
                    
                    With .Cells(i, 9)
                        .Value = LogTijd
                        .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                    End With
                    
                    .Cells(i, 10) = "0" 'Status: Gebruiker Uitgelogd
                    
                    With Sheets("LogFile").Cells(Rows.Count, 1).End(xlUp)
                        .Cells(, 7) = LogTijd
                        .Cells(, 7).NumberFormat = "dd-mm-yyyy hh:mm:ss"
                        .Cells(, 8) = .Cells(, 7) - .Cells(, 6) 'Bereken Sessieduur: UitlogTijd - InlogTijd
                        .Cells(, 8).NumberFormat = "[hh]:mm:ss"
                    End With

                    Gebruiker = vbNullString 'Kan in deze opzet worden verwijderd
                    Gebruikersnaam = vbNullString 'Kan in deze opzet worden verwijderd
                    LaatsteInlog = vbNullString 'Kan in deze opzet worden verwijderd
                    PersNr = vbNullString
                    TypeGebruiker = vbNullString
                    
                    Me.Hide
                    
                    Call Welkom 'Mod_Frm_Hoofd
                    
                End If
                
                Exit Sub
            End If
        Else
            If Not GebruikerOk Then
                MsgBox ("Gebruikersnaam niet gevonden. Probeer opnieuw"), vbInformation
                Call Reset
            Else
                If Not WachtwoordOk Then Call Blokkade
            End If
        End If
    End With

End Sub

Let nog even niet op de opmerkingen geplaatst achter de code. Deze heb ik tijdelijk voor mijzelf geplaatst om overzicht te houden en ook een beetje als een soort van TO-DO list.

Toch waarom kan ik hier niet meteen de range "i" noemen in plaats van "c". Nu moet ik de "i" als volgt benoemen: i = c.Row

Dan nog even de opzet van de Find methode. Ik gebruik nu komma's. Ik heb eens een makkelijke manier gezien. Is er een andere opzet ook te gebruiken. Dit daar er ook een Worksheet Find Methode bestaat welke slechts 3 argumenten telt.
 
Laatst bewerkt:
Toch waarom kan ik hier niet meteen de range "i" noemen in plaats van "c". Nu moet ik de "i" als volgt benoemen: i = c.Row

Omdat i een Long is en c een Range object.
Dat zijn twee totaal verschillende dingen.
 
Ja in al die tijd mag ik hopen dat ik dat wel snap. Zover was ik dus wel. Haha.

Nee ik bedoel. Ik gebruikte dus kennelijk telkens de "i" als range ipv row, wat dus niet ging. Even de procedure zonder de "c" dan. Met andere woorden dat was waarom die foutmelding 91 er in kwam?
 
Laatst bewerkt:
Fout 91 ontstaat bij een verwijzing naar een niet bestaand object of naar een index element buiten de grenzen van de index, afhankelijk van de context.
 
Oke.

Hier dan de code waar ik naar refereerde en geen problemen ondervond.

Hier wordt Rij als String gedeclareerd.

Wat is hier buiten de declaratie als String, dan het verschil mee, want op deze wijze werkt het wel in een andere procedure welke overigens is verwijderd.

Code:
    Dim Rij As String
    
    With Sheets("Gebruikers")
        Rij = .Columns(1).Find(ComboBox2.Value, , xlValues, xlWhole).Row
        
        Select Case ComboBox1.Value
            Case Is = "Deblokkeren"
                'If .Cells(Rij, 1).Interior.ColorIndex = 5 Or .Cells(Rij, 1).Interior.ColorIndex = 6 Then
                    .Cells(Rij, 10) = 0 'Statuscode
                    .Cells(Rij, 11) = 0 'Mislukte pogingen
                    .Cells(Rij, 12) = vbNullString
                    .Cells(Rij, 13) = vbNullString
                    .Range(Sheets("Gebruikers").Cells(Rij, 1), Sheets("Gebruikers").Cells(Rij, 13)).Interior.ColorIndex = xlNone
                'End If
        
                MsgBox ("Gebruiker: " & ComboBox2.Value & " is gedeblokkeerd."), , ""
                
            Case Is = "Blokkeren"
                'If .Cells(Rij, 1).Interior.ColorIndex = 5 Or .Cells(Rij, 1).Interior.ColorIndex = 6 Then
                    .Cells(Rij, 10) = 4 'Statuscode
                    .Cells(Rij, 11) = 5 'Mislukte pogingen
                    .Cells(Rij, 12) = vbNullString
                    
                    With .Cells(Rij, 13)
                        .Value = Now
                        .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                    End With
                    
                    .Range(Sheets("Gebruikers").Cells(Rij, 1), Sheets("Gebruikers").Cells(Rij, 13)).Interior.ColorIndex = 3 'Kleur: Rood
                'End If
                
            End Select
 
Laatst bewerkt:
Rij zou als long gedeclareerd moeten zijn, maar met string kan ook.
Code:
msgbox cells("1", 1).value
msgbox cells(1,1).value
msgbox cells(rij,1).value
 
HSV. Goedenavond,

Akkoord, maar waarom werkt het met deze opzet in de ene code wel en in de andere (voor bovenstaande verandering) niet. Dit heeft niet enkel met de declaratie te maken. Ergens heb ik mij verkeken.
 
Stel dat met....
Code:
Rij = .Columns(1).Find(ComboBox2.Value, , xlValues, xlWhole).Row
.........: Rij = 10 wordt.
Dan is 10 een Long.
Met string: Rij = "10"
Dat komt door het woordje Row aan het eind van bovenstaande lijn dat het nooit een string moet worden.

Gebruik je Rij voor meerdere doeleinden in meerdere codes en je declareert buiten de procedure om dan kun je kiezen voor Variant.
Dan kan Rij een Boolean zijn maar ook een Long.
Ik geef maar een schets.

Met set c: wordt een objectverwijzing aan een variabele toegewezen, namelijk aan c.
c.row
c.address
c.column
c.offset

Wil je dit weer naar een long declareren zul je weer gebruik moeten maken van: i = c.row
Of c.row gebruiken in de code.
cells(c.row,1)
 
Oke kort gezegd is dus de opzet volledig anders en al lijkt het dan enigszins op elkaar.... toch is het niet zo omdat de declaraties niet overeenkomen met wat een andere foutmelding ook wel een aantal keren liet zien. Toen gaf deze een foutmelding dat typen niet overeen kwamen. Hoe ik dat heb veranderd weet ik even niet meer omdat ik flink aan het puzzelen ben.

Vandaar dat ik graag wilde weten, waarom. Dit om dit probleem een volgende keer voor te zijn.

Weer wat geleerd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan