2017-08-10 243 views
0

我是VBA新手,在下面的代碼中出現類型不匹配錯誤。類型不匹配錯誤

我得到整數j的錯誤。我已將其更改爲所有其他數據類型,但仍相同。

Private Sub CommandButton3_Click() 

    Dim rng1 As Range, rng2 As Range, i As Integer, j As Integer, k As Integer 

    Set rng1 = Range("A:A") 
    Set rng2 = Range("B:B") 

    j = Application.WorksheetFunction.Lookup(2, 1/(rng1 <> ""), rng1) 
    k = Application.WorksheetFunction.Match(j, rng1, 0) 

    i = 0 

    For i = i + 1 To k 
     If Cells(i, 1) Mod 2 = 0 Then 
      Cells(i, 2) = "Even" 
     Else: Cells(i, 2) = "Odd" 
     End If 
    Next i 

    MsgBox "There are " & Application.WorksheetFunction.CountIf(rng2, "Even") _ 
     & " Even and " & Application.WorksheetFunction.CountIf(rng2, "Odd") & " Odd numbers" 

End Sub 
+2

不能陣列比較字符串(即'rng1 <>「」'無效並且會導致類型不匹配)。 – YowE3K

+0

謝謝。這意味着我只能使用最後一行功能。請說明如何在VBA中使用此公式,因爲在Excel中可以正常工作,但在VBA中不能正常工作 – Roumya

+0

如果我正確讀取代碼,則試圖找到包含最後一列佔用的列上的值的第一行A.這是正確的嗎?然後,您正在設法計算出至此爲止出現了多少個偶數以及多少個奇數 - 但是您希望從列中排除最後一個值的第一次出現以外的任何內容。是否正確?因此,如果單元格A1:A9包含「1,2,2.7,3,4,5,1,2,3」,則您試圖計算1個偶數和3個奇數(即僅計數到A4的計數)。那是對的嗎? – YowE3K

回答

0

我的評論:

如果我正確地讀你的代碼,你試圖找到一個包含與A列的最後佔用的行的值的第一行是正確的嗎?然後,您正在設法計算出至此爲止出現了多少個偶數以及多少個奇數 - 但是您希望從列中排除最後一個值的第一次出現以外的任何內容。是否正確? ...

你的答案:

前兩個你的問題是完全正確的。

示例數據:

enter image description here


如果你真的想找到一個包含與在A列的最後佔用的行的值的第一行,即包含第一行3在上面的示例數據中,並確定該點的賠率/平均數,並從計數中排除超出該點的任何數值,然後您可以使用以下代碼:

Private Sub CommandButton3_Click()  
    Dim lastUsedRow As Long 
    Dim lastRow As Long 
    Dim i As Long 
    Dim Odds As Long: Odds = 0 
    Dim Evens As Long: Evens = 0 

    With ActiveSheet 

     'Find the last used row in column A (row 9 in example data) 
     lastUsedRow = .Cells(.Rows.Count, "A").End(xlUp).Row 

     'Find first row containing the data from the last used row 
     '(i.e. the first row containing a 3 in the example data, i.e. row 4) 
     lastRow = Application.Match(.Cells(lastUsedRow, "A").Value, .Range("A:A"), 0) 

     'Loop from first row to last row 
     For i = 1 To lastRow 

      'Decide whether the nearest integer to the value in the cell 
      'is odd or even 
      If .Cells(i, "A").Value Mod 2 = 0 Then 
       .Cells(i, "B").Value = "Even" 
       Evens = Evens + 1 
      Else 
       .Cells(i, "B").Value = "Odd" 
       Odds = Odds + 1 
      End If 

     Next i 

     MsgBox "There are " & Evens & " Even and " & Odds & " Odd numbers" 
    End With 
End Sub 

但是,如果你想要做的你的計算,那麼所有行,你可以使用下面的代碼:

Private Sub CommandButton3_Click()  
    Dim lastUsedRow As Long 
    Dim i As Long 
    Dim Odds As Long: Odds = 0 
    Dim Evens As Long: Evens = 0 

    With ActiveSheet 

     'Find the last used row in column A (row 9 in example data) 
     lastUsedRow = .Cells(.Rows.Count, "A").End(xlUp).Row 

     'Loop from first row to last used row 
     For i = 1 To lastUsedRow 

      'Decide whether the nearest integer to the value in the cell 
      'is odd or even 
      If .Cells(i, "A").Value Mod 2 = 0 Then 
       .Cells(i, "B").Value = "Even" 
       Evens = Evens + 1 
      Else 
       .Cells(i, "B").Value = "Odd" 
       Odds = Odds + 1 
      End If 

     Next i 

     MsgBox "There are " & Evens & " Even and " & Odds & " Odd numbers" 
    End With 
End Sub 
+0

謝謝。我指的是你寫的第二個代碼。我已經使用它並找到了答案。無論如何感謝教育第一代碼也。但是現在我有其他一些疑問。我寫了下面的代碼。請告訴我在「單元格」和「行」之前使用點 – Roumya

+0

Private Sub CommandButton3_Click() Dim rng1 As Range,rng2 As Range,i As Integer,LastRow As Long Set rng1 = Range(「A:A」 ) 集RNG2 =範圍( 「B:B」) LASTROW =細胞(Rows.Count,1).END(xlUp).Row「發現在第1列 I = 0 的最後一個非空白行有關I = I + 1要LASTROW 如果細胞(I,1)模2 = 0。然後 細胞(I,2)= 「連」 否則 細胞(I,2)= 「奇」 結束如果 下一I MSGBOX 「有」 &Application.WorksheetFunction.CountIf(RNG2, 「連」)& 「偶」 &Application.WorksheetFunction.CountIf(RNG2, 「奇」)& 「奇數」 End Sub – Roumya

+0

在'With'塊中,任何'.'開頭的東西都被認爲是指向'With'的對象,因此在'With ActiveSheet'中''Rows'是'ActiveSheet的快捷方式。行「 - 它節省了很多打字。如果您想將對象從「ActiveSheet」更改爲「Worksheets(」Sheet4「)」(例如),那麼它也變得更容易,因爲您只需將'With ActiveSheet'更改爲'With Worksheets(「Sheet4」)';你完成了。 – YowE3K