尝试使用variables时MsgBox错误

我有以下代码,但出于某种原因, msgbox krow似乎不工作。 有一场比赛,但只是显示错误。 我不明白为什么。 帮助表示赞赏,谢谢!

 Sub addsheet() Dim lrow As Variant, krow As Variant Dim i As Long, lastcol As Long, lastrow As Long, lastrowcomp As Long Dim sheetname As String, sheetname2 As String Sheets("Main Sheet").Activate lastcol = Cells(2, Columns.Count).End(xlToLeft).Column lrow = Application.Match(Sheets("Main Sheet").Range("F6").Value, Sheets("Main Sheet").Range(Cells(2, 14), Cells(2, lastcol)), 0) If IsError(lrow) Then MsgBox "Please Select a value under change" ElseIf lrow > 0 Then lastrow = Sheets("Main Sheet").Cells(Rows.Count, lrow + 13).End(xlUp).Row lastrowcomp = Sheets("Comparison Check").Range("A" & Rows.Count).End(xlUp).Row For i = 3 To lastrow krow = Application.Match(Sheets("Main Sheet").Cells(i, lrow).Value, Sheets("Comparison Check").Range("A3:A" & lastrowcomp), 0) MsgBox krow 'If IsError(krow) Then 'sheetname = Sheets("Main Sheet").Cells(i, lrow + 13).Value 'Worksheets.Add(After:=Worksheets(1)).Name = sheetname 'ThisWorkbook.Sheets("Sheet1").UsedRange.Copy 'ThisWorkbook.Sheets(sheetname).Select 'ThisWorkbook.Sheets(sheetname).Range("A1").Select 'ThisWorkbook.Sheets(sheetname).Paste 'ThisWorkbook.Sheets(sheetname).Cells.Interior.ColorIndex = 2 'Else If krow > 0 Then sheetname2 = Sheets("Comparison Check").Cells(krow, 1).Value Sheets(sheetname2).Activate End If Next i End If End Sub 

基本上,我试图创build一个新的名单,如果没有匹配的名字,如果匹配存在,转到现有的表。 但是当有匹配的时候,它会不知不觉地创build一个新的工作表。 因此,为什么我加了msgbox krow来确认问题是否与匹配有关。

我对你的代码做了一些小的调整。 请看看,让我知道如果它现在工作。

 Option Explicit Sub addsheet() Dim lrow As Variant, krow As Variant Dim i As Long, lastcol As Long, lastrow As Long, lastrowcomp As Long Dim sheetname As String, sheetname2 As String Dim ws As Worksheet, lngCount As Long, strSheets As String strSheets = "Main Sheet/Comparison Check" For Each ws In ThisWorkbook.Worksheets For i = LBound(Split(strSheets, "/")) To UBound(Split(strSheets, "/")) If Split(strSheets, "/")(i) = ws.Name Then lngCount = lngCount + 1 Next i Next ws If lngCount < 2 Then MsgBox "One of the required sheets was not found." & Chr(10) & "Aborting!" Exit Sub End If With ThisWorkbook.Worksheets("Main Sheet") lastcol = .Cells(2, .Columns.Count).End(xlToLeft).Column lrow = Application.Match(.Range("F6").Value, .Range(.Cells(2, 14), .Cells(2, lastcol)), 0) If VarType(lrow) = vbError Then MsgBox "Please Select a value under change." Debug.Print "Value '" & .Range("F6").Value & "' not found in range " & .Cells(2, 14).Address & ":" & .Cells(2, lastcol).Address Else lastrow = .Cells(.Rows.Count, lrow + 13).End(xlUp).Row lastrowcomp = ThisWorkbook.Worksheets("Comparison Check").Range("A" & .Rows.Count).End(xlUp).Row For i = 3 To lastrow krow = Application.Match(.Cells(i, lrow).Value, ThisWorkbook.Worksheets("Comparison Check").Range("A3:A" & lastrowcomp), 0) If VarType(krow) = vbError Then MsgBox CStr(krow) Else sheetname2 = ThisWorkbook.Worksheets("Comparison Check").Cells(krow, 1).Value For Each ws In ThisWorkbook.Worksheets If ws.Name = sheetname2 Then lngCount = lngCount + 1 Next ws If lngCount < 3 Then MsgBox "A sheet by the name '" & sheetname2 & "' couldn't be found." & Chr(10) & "Aborting!" Exit Sub Else ThisWorkbook.Worksheets(sheetname2).Activate End If End If Next i End If End With End Sub 

基本上,上面的代码几乎和你的一样,但是error handling更多。 所以,在代码中有更less的假设,而不是更多的检查。 如果某些东西没有按照预期工作,那么你在VBE的Immediate Window中得到消息框或通知行。

另外,我更明确地编码。 这意味着我真的在告诉VBA我想要什么,不允许任何解释。 例如:当你写lastcol = Cells(2, Columns.Count).End(xlToLeft).Column你的意思是说你想引用表单Main Sheet的最后一列( Columns.Count )。 然而,这并没有明确说明,只是由VBA编译器推断出来的,因为你事先激活了工作表。 我把所有这一切都改为显式编码,这消除了(大部分时间)已经很多的麻烦。