1

私が知る限り、Excel では WorksheetFunctions を vba FUNCTION (サブまたはサブルーチンではありません) で使用できません。FUNCTION で WorksheetFunctions を使用する方法はありますか? そうでない場合、COUNTA 関数と同じ結果を得るための簡単な代替手段はありますか? WorksheetFunctions がカスタム関数とうまくいかないように見える理由を知っている人はいますか?

Function CountIfsFast(range1 As range, val1, Optional range2 As range, Optional val2)
    rangesize = WorksheetFunction.CountA(range1)
    range1array = RangetoArray(range1)
    range2array = RangetoArray(range2)
    matchcount = 0
    For i = 0 To rangesize
        If range1array(i) = val1 Then
            If range2array(i) = val2 Then
                matchcount = matchcount + 1
            End If
        End If
    Next i
    CountIfsFast = matchcount
End Function

更新:私は問題を理解しました。以下の私の答えを見てください。

4

4 に答える 4

0

この「カスタム」関数は、組み込みの CountA 関数と同じ値を返します (少なくとも 2007 年には)。デバッグに役立つように、関数に渡す範囲について少し詳しく説明する必要があります。

Function counta2(rng As Range)
     Dim i As Integer

     i = Application.WorksheetFunction.CountA(rng)

     counta2 = i

End Function

そして、次のように使用します: =counta2(C1:C8)

于 2013-05-06T19:22:18.273 に答える
0

これは私にとってもうまくいきます:(Excel 2010)

Public Function fubu(range1 As Range) As Variant
    Dim rangesize As Variant

    rangesize = WorksheetFunction.CountA(range1)

    fubu = rangesize
End Function

これを文字どおりカット アンド ペーストしてみてください。まったく変更せずに、シート式から呼び出します。

于 2013-05-06T19:29:21.300 に答える
0

私は問題を理解しました。私の場合、サブルーチンでは WorksheetFunctions を使用できましたが、関数では使用できなかったので、関数の制限だと思いました。それはそれとは何の関係もなかったことが判明しました。50290 エラーをさらに調査したところ、別のフォーラムでこれを見つけました。

「これに遭遇しました - これは Microsoft のバグです。フォームの 1 つまたはそれが何であれ (ボタン、画像、ラベルなど) で問題のあるオブジェクトを見つけて削除する必要があります。」

いくつか実験を行ったところ、WorksheetFunctions を呼び出すと、関数のコレクション内の何かが Excel をフリークさせていることがわかりました。それらを再び機能させるには、Excel を完全に閉じて、新しいブックを開始する必要があります。私がそれを行うと、WorksheetFunctions は正常に動作します。変。

于 2013-05-08T20:53:26.223 に答える
0

RangeToArrayあなたが含めなかった機能を取り除くために、私はそれを修正しなければなりませんでした。戻り値のデータ型を指定するように を変更したことに注意してくださいAs Long。また、特定のデータ型の変数も宣言します。これは始めるのに良い習慣になるでしょう:)

スクリーンショット

Function CountIfsFast(range1 As Range, val1, Optional range2 As Range, Optional val2) As Long
    Dim range1Array As Variant
    Dim range2Array As Variant
    Dim rangeSize As Long
    Dim matchCount As Long
    Dim i as Long

    rangeSize = WorksheetFunction.CountA(range1)
    range1Array = range1
    range2Array = range2
    matchCount = 0
    For i = 1 To rangeSize
        If range1Array(i, 1) = val1 Then
            If range2Array(i, 1) = val2 Then
               matchCount = matchCount + 1
            End If
        End If
    Next i
    CountIfsFast = matchCount
End Function
于 2013-05-06T19:45:04.457 に答える