2016-07-25 43 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