2016-07-25 39 views
1

我有以下代码,但由于某些原因,msgbox krow似乎不起作用。有一场比赛,但它只是显示错误。我不明白为什么。帮助表示赞赏,谢谢!试图使用变量时MsgBox错误

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 

基本上,我想如果没有匹配,创建一个名为新的工作表,然后转到现有薄片如果匹配存在。但是当有一场比赛时,它会以某种方式不断创建一张新纸张。因此,为什么我添加msgbox krow来确认问题是否与匹配有关。

+0

抛出的错误是什么? – RGA

+0

错误不匹配。 – Vigmo10

+0

它是一种类型不匹配? – RGA

回答

1

我对你的代码做了一些小的调整。请看看,让我知道它现在是否有效。

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 

基本上,上面的代码和你的代码几乎一样,但是错误处理更多。因此,代码中的假设少得多,而代之以更多的检查。如果某些功能无法正常工作,则您会在VBE的Immediate Window中收到消息框或通知行。

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

+0

你好,伙伴们,对延迟的回应表示歉意。只是试了一下,就像一个魅力,谢谢你的帮助!我会尝试从现在开始更明确地编码。 – Vigmo10