2017-08-10 23 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ではなくExcelでも問題なく動作します。 – Roumya

+0

コードを正しく読んでいれば、最後に使用された行の列にある値を含む最初の行A.正しいですか?そして、あなたはそのポイントまでにいくつの偶数が出現するか、そしてどれくらいの数の奇数が出てくるのか試してみたいのですが、A列の最後の値の最初の出現を超えて何かを除外したいのですか?したがって、A1:A9のセルに1,2,2.7,3,4,5,1,2,3が含まれていれば、1偶数と3奇数を計算しようとしています(つまり、A4までのカウントのみ)。あれは正しいですか? – YowE3K

答えて

0

私のコメント:

私が正しくあなたのコードを読んでいた場合は、列Aの最後の占有行にある値を含む最初の行を見つけるしようとしていたがそれは正しいですか?そして、あなたはそのポイントまでにいくつの偶数が出現するか、そしてどれくらいの数の奇数が出てくるのか試してみたいのですが、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

ありがとうございます。私はあなたが書いた2番目のコードを参照していました。私はすでにそれを使用し、答えを見つけました。とにかく最初のコードについても教えてくれてありがとう。しかし、今私はいくつかの他のクエリがあります。私は以下のコードを書いた。 "セル"と "行"の前にドットの使用を教えてください – Roumya

+0

プライベートSub CommandButton3_Click() 範囲rng2範囲として、私は整数として、LastRowとして長い セットrng1 =範囲( "A:A" ) セットRNG2 =範囲( "B:B") LASTROW =細胞(Rows.Count、1).END(xlUp).Row「の列1 I = 0 の最後の非空白行を見つけますI = I + 1 LASTROW かの細胞(I、1)のMod 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 'のショートカットです。行数を減らすことができます。 'With ActiveSheet'を' With Sheethe '( "Sheet4") 'に変更するだけで済むので、オブジェクトを' ActiveSheet'から 'Worksheets(" Sheet4 ")'に変更したい場合は、あなたは終わった。 – YowE3K

関連する問題