web-dev-qa-db-ja.com

Excel VBAでMATCH関数とINDEX関数を一緒に実装するにはどうすればよいですか?

ゼロ未満の最初のセルの行番号を見つけようとしています。したがって、ネットを閲覧することで、完全にうまく機能するこの式を思いつくことができました。

=MATCH(TRUE,INDEX($C2531:$C2731 < 1,0),0)

しかし、これをExcel VBAに実装したいのですが、いくつかのオプションを試しましたが、型の不一致エラー13が発生しました。誰かがこれを手伝ってくれますか?

With Application.WorksheetFunction
    Range("C2527").Value = .Match(True, .Index(Range("C2531:C2731") < 1, 0), 0)
End With

前もって感謝します。

3
NK1

私の知る限り、INDEX数式で共通部分演算子(スペース)を使用しています: "$ C2531:$ C2731 <1"。これにより、ある範囲($ C2531 $ C2731)のすべてのセルが別の範囲と比較されますが、この場合は代わりに「<1」の比較になります。したがって、交差点は、比較ごとにTRUEまたはFALSEの値を含む範囲(つまり、配列数式)を返します。次に、MATCHは、結果の範囲で「TRUE」値を調べます。

言い換えれば、式は舞台裏で比較的複雑であり、読むのは短いですが、VBAでは、「舞台裏」の観点から物事をできるだけ単純かつ明確に保ちたいと考えています。そうしないと、問題が発生します。 。達成しようとしていることは単純ですが、INDEX関数とMATCH関数をVBAに詰め込むことは簡単ではありません。

Visual Basicには、ネイティブの交差演算子はありません。私が見つけたものから、に相当するのはApplication.Intersect関数だけで、これはRangeオブジェクトをパラメーターとして受け取ります。残念ながら、最初の範囲は "Set myRange = Range(" $ C2531:$ C2731 ")として作成できますが、これは有効なセルではないため、VBAで" <1 "のRangeオブジェクトを作成できませんでした。したがって、Excel数式の交差演算子はVBAのApplication.Intersectメソッドよりも機能的で柔軟性があるようです。これが失敗のポイントです( "$ C2531:$ C2731 <1"は有効なVBAではありません)

これで、VBAで範囲と「<1」を交差させることができるかどうかを確認するために1日を費やすことができますが、VBAでこれを行う簡単な方法があります。私の場合は、ワークシート関数を使用せず、標準のFor ... Nextループを使用して行を調べ、範囲内の各セルのプレーンビジュアルベーシックで比較を行います。 1つの比較が一致する場合は、行番号を返します。

アイデアを得るには、次のようになります。

Dim myRange As Range
Set myRange = Range("$C2531:$C2731")
For y = 1 to myRange.Cells.Rows.Count
   If y < 0 Then 
       result = myRange.Cells(y,1).Row
   End
Next y
2
mtone

数式を文字列として送信するだけです。以下に例を示します。

Range("C2527").Value = "=MATCH(TRUE,INDEX($C2531:$C2731 < 1,0),0)"
1
Santosh