web-dev-qa-db-ja.com

Excel VBA WorksheetFunction.CountA-Office 2010へのアップグレード後に機能しません

次のコードは、2010年より前のExcelで機能します。

myRange = Range("A:A")
NumRows = Application.CountA(myRange)

列Aにテキスト/値を含むセルが38個あります。Excel2007でコードを実行すると、NumRowsは38と正しく評価されますが、Excel 2010では(間違って)65,536と評価されます。

セル内にCountA関数を入力すると、両方のバージョンで正常に機能します。

同様のスレッドは question 16696891 ですが、答えはなく、提案は赤いニシンだったと思います...

何か案は?

8
Richard Ell

あなたのコードが書かれた通りに動作することができないので、私はあなたの問題が何であるか正確にはわかりません。次の2つのことが明らかです。

  1. VBAを使用して変数の型を決定し、それに応じて変更しているようです。 VBAが意図しない変数型を割り当てることがあるため、注意しないと混乱を招く可能性があります。コードでは、Rangeの型をmyRangeに割り当てる必要があります。 Range型はVBAのオブジェクトであるため、次のようにSetである必要があります:Set myRange = Range("A:A")
  2. ワークシート関数CountA()の使用は、.WorksheetFunctionで呼び出す必要があります

まだ行っていない場合は、モジュールの上部でOption Explicitオプションを使用し、以下で行ったように、Dimステートメントで変数を入力することを検討してください。

次のコードは2010年に私のために機能します。うまくいけばそれもあなたのために機能します:

Dim myRange As Range
Dim NumRows As Integer

Set myRange = Range("A:A")
NumRows = Application.WorksheetFunction.CountA(myRange)

がんばろう。

8

別のフォーラムからのこの回答は問題を解決しました。

(ここに表示されている「I:I」を独自の範囲に置き換えてください)

再:CountAはVBAで動作していません

Should be:

Nonblank = Application.WorksheetFunction.CountA(Range("I:I"))

You have to refer to ranges in the vba format, not the in-Excel format.
3
Justin

このコードは私のために働く:

Sub test()
    Dim myRange As Range
    Dim NumRows As Integer

    Set myRange = Range("A:A")
    NumRows = Application.WorksheetFunction.CountA(myRange)

    MsgBox NumRows
End Sub
2
CallumDA

Application.COUNTAがVB7とVB6で動作する方法に変更があるようです。 VBの両方のバージョンで次を試しました。

   ReDim allData(0 To 1, 0 To 15)
   Debug.Print Application.WorksheetFunction.CountA(allData)

VB6では、これは0を返します。

インVB7 32を返します

VB7はもうCOUNTAをCOUNTAと見なしていないようです。

0

明らかな場合もありますが、範囲を指定し、どのワークブックまたはワークシートも含めない場合、別のシートでCountA()を実行しようとする場合があります。これらのことを完全に解決することで、頭痛の種を大幅に減らすことができます。

0
perfo