2016-12-28 2 views
0

Ich habe Code-Block, wo ich eine For... Next Schleife verwenden, um durch eine Excel-Tabelle zu gehen, und sagen Sie mir, ob in die Textfelder eingegebene Werte gefunden wurden oder nicht . Ich habe es geändert, um zu funktionieren, wenn die Werte übereinstimmen. Dennoch empfange ich die Variable Object/With Block nicht gesetzt, und das verwirrt mich. Ich habe folgendes erstellt:Initialize Correct Wert zu vermeiden Objektvariable oder Mit Blockvariable nicht gesetzt

Dim Value2Find_1 As String = txtMachNumber.Text      'Serial number value. 
    Dim Value2Find_2 As String = txtMachName.Text      'Machine name value. 


    Dim ReplaceWithValue1 As String = ""        'Replaces the serial number value if found in the sheet. 
    Dim ReplaceWithValue2 As String = ""        'Replaces the machine name value if found in the sheet. 
    Dim ReplaceWithValue3 As String = ""        'Replacement for the date-time in the Date Column. 

    Dim Range2Use_1 = xlWS.Range("A1:A4000")       'Range to span the A Column. 
    Dim Range2Use_2 = xlWS.Range("B1:B4000")       'Range to span the B Column. 
    Dim Range2Use_3 = xlWS.Range("F1:F4000")       'Range to span the F Column. 

    Dim xlCell_A = Range2Use_1.Find(txtMachNumber.Text)     'Looks up the searched serial value in A Column. 
    Dim xlCell_B = Range2Use_2.Find(txtMachName.Text)     'Looks up the searched machine value in B Column. 

    Dim LastRow = xlWS.Range("A4000").End(Excel.XlDirection.xlUp).Row + 1 
    Dim i As Integer 


    With xlWS 
     For i = 1 To LastRow 
      If Not (Value2Find_1 = txtMachNumber.Text And Value2Find_2 = txtMachName.Text) Then 

       MessageBox.Show("No value exists here...") 


      Else 
       Range2Use_1.Find(What:=Value2Find_1, MatchCase:=True) 
       Range2Use_2.Find(What:=Value2Find_2, MatchCase:=True) 


       MsgBox("Found both values: " & Value2Find_1 & " and " & Value2Find_2 & " on row " & xlCell_A.Row) 
      End If 

      Exit Sub 
     Next 


    End With 

Wenn meine Textbox Einträge nicht in dem Blatt, die Fehler auf der folgenden Codezeile zurückgibt:

MsgBox("Found both values: " & Value2Find_1 & " and " & Value2Find_2 & " on row " & xlCell_A.Row) 

Ich habe es verengt, etwas zu haben mit der Variablen zu tun, die die Zeilennummer der gefundenen Textboxeinträge zurückgibt - xlCell_A. Hier stecke ich jedoch fest. Was muss ich einstellen, um zu vermeiden, dass die Variable Object/With Block nicht gesetzt ist? Ich fürchte, ich weiß nicht, worum es geht.

Antwort

1

Ich denke, das Problem mit Ihrem Code ist, dass die Find Methode Nothing zurückgibt, wenn keine Übereinstimmung gefunden wird, wie in seiner documentation angegeben. Daher gibt xlCell_A.Row den Fehler zurück, da die -Methode nicht auf Nothing aufgerufen werden kann.

Eigentlich sehe ich eine Reihe weiterer Probleme mit dem Code:

  1. Das Innere der for-Schleife hängt nicht von der Schleifenvariablen i. Daher macht es genau dasselbe in jeder Interaktion.
  2. Die Variable xlWS des With-Blocks wird nie verwendet, was den With-Block unnötig macht.
  3. Die Rückgabewerte der Find Methoden in der Schleife werden nie zugewiesen. Aus diesem Grund haben sie keine Wirkung.
  4. Die Bedingung in der if-Anweisung gibt immer False, da Sie nie die Werte von Value2Find_1 und Value2Find_2 ändern und Sie initialisiert sie txtMachNumber.Text und txtMachName.Text sind.

Wenn Sie auswerten beabsichtigen, ob die Werte txtMachNumber.Text und txtMachName.Text vorhanden sind in der Spalte A bzw. B, können Sie einfach testen, ob xlCell_A und xlCell_BNothing sind.

Da Sie beide auf der gleichen Zeile finden wollen, die Find mit nicht garantieren, könnte es einfacher sein, eine Schleife zu verwenden, wie in Ihrem Code aber ersetzen txtMachNumber.Text und txtMachName.Text mit Range2Use_1.Cells(i,1) und Range2Use_2.Cells(i,1) in der if-Anweisung. (Dies vergleicht den Wert in der i-ten Zeile mit den Werten, nach denen gesucht werden soll.) Offensichtlich müssten Sie die Schleife nach dem Finden einer Übereinstimmung verlassen, z. Verwenden der break Anweisung.

+0

Interessanterweise las ich Ihren Rat vor dem Bearbeiten und Setup etwas, aber wurde in das Problem der "Teilzeichenfolge" zurückgegeben, wenn in einen Teil der Zelle Textwert eingefügt. Ich nehme an, dass die Verwendung der Schleife mir helfen wird, das gleiche Ergebnis zu erzielen, das ich mit Match Match Exact Cell Contents in der Excel-Funktion finden würde. Wie würdest du vorschlagen, dass ich 'xlWS' für meinen' With' Block verwende? Ich erreiche Resultate, indem ich 'xlCell A und B' überprüfe, war tatsächlich' Nothing' und die 'If' Aussage tweakend, aber es ist in genauen suchenden Begriffen instabil - ich brauche eine exakte Wertübereinstimmung oder sonst, sagen Sie, dass der Wert nicht anwesend ist . – DesignerMind

+0

@DesignerMind Der Kommentar zu dem 'With'-Block bestand zunächst darin, dass er gelöscht werden kann, ohne dass dies Auswirkungen auf den Code hat und daher gelöscht werden sollte. Zweitens, wenn Sie 'Find' verwenden und nach' Nothing' suchen, sollte es keine Schleife geben. Drittens schlage ich nicht vor, dass Sie nur die Bedingung in der "if" -Anweisung ändern, sondern dass Sie eine Schleife mit einer gewissen Logik verwenden, um eine erfolgreiche Übereinstimmung, z. Einige Werte sind nur auf einen vernünftigen Wert für den Erfolg festgelegt, brechen die Erfolgsschleife aus und geben dann das entsprechende Ergebnis zurück. –

+0

Ich habe einen Swing gemacht und bekomme einen 'hresult COM error', verstehe aber nicht warum. Ich verwende die folgenden 'Für i = 0 bis LastRow Wenn Range2Use_1.Cells (i, 1) .text = Value2Find_1 Dann MsgBox ("Sie haben es ...") Else MsgBox (" hier nicht. . ") Ende If Weiter" Ich denke mein Problem ist mit dem '.Cells' Teil, aber ich bin verwirrt, wie man es bekommt, um gegen meine' xlCell_A' zu suchen. Ich weiß, dass ich ein Objekt mit der '.Cells()' Methode bekomme, aber versuche. 'Value',' .Text' am Ende erzeugt weiterhin Fehler. – DesignerMind

Verwandte Themen