[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『match indexをvbaで記載したい』(斎藤)
二回目の質問になります。
最初に出てくる空白セルを探したくて下記の関数を作成しました。
MATCH(TRUE,INDEX(A1:A10="",0),0)
これと同じ事をしようと下記のようにVBA上で記載したのですが
Application.Match(True, Application.Index(Range(Cells(1, 1), Cells(1, 10)) = "", 0), 0)
エラーが出力されました。
vbaではどのように記載したら良いでしょうか?
< 使用 Excel:Excel2019、使用 OS:Windows10 >
範囲が決め打ちなら Sub a() Debug.Print [MATCH(TRUE,INDEX(A1:A10="",0),0)] End Sub でいいんじゃない?
VBAっぽくやるなら、ループ処理を覚えるとよいと思います! Sub b() Dim i As Long Dim ans As Long ans = 0 For i = 1 To 10 If Cells(i, "A").Value = "" Then ans = i Exit For End If Next i If ans = 0 Then MsgBox "空白はありませんでした" Else MsgBox "空白は " & ans & " 行目です" End If End Sub
(稲葉) 2021/01/15(金) 12:13
あくまでも下記関数をそのままvbaで記載できる方法を聞いております。
MATCH(TRUE,INDEX(A1:A10="",0),0)
分かる方はいらっしゃいませんか?
(斎藤) 2021/01/15(金) 12:22
自分勝手な方か・・・
>printでエクセルのセル上に入力してから、改めて取得するのも これは別にセル上に入力してませんよ。 https://excel-ubara.com/excelvba4/EXCEL_VBA_424.html evaluateを省略しているだけです。
>if文はプログラムが汚くなるし、重くなるので使いたくないのです。 それは自分の技量がないだけでしょう。
(稲葉) 2021/01/15(金) 12:31
Evaluateを省略していたのですね。
ただ、そうすると関数内にVBAの構文を書くことができないので
全く意味がありません。
MATCH(TRUE,INDEX(A1:A10="",0),0)
を
Application.Match(True, Application.Index(Range(Cells(1, 1), Cells(1, 10)) = "", 0), 0)
のようにVBA内で書き換える方法をご存知の方はいらっしゃいますか?
(斎藤) 2021/01/15(金) 12:41
>Application.Index(Range(Cells(1, 1), Cells(1, 10)) = "" このような配列数式を扱う書き方がVBA内ではできないです。 そのため、VBAではFor文で各要素ごとに評価したり Evaluateを使って配列数式としても扱えるように工夫しています。 [[20070212134849]] 『Evaluate Method の研究』(seiya) >>BOT
>ただ、そうすると関数内にVBAの構文を書くことができないので できます。 Evaluateに文字列として値を渡せばよいです。 その場合、Evaluateは省略できないため、下記のような扱いになります。
Sub c() Dim f As String f = "MATCH(TRUE,INDEX(■="""",0),0)" f = Replace(f, "■", Range("A1:A10").Address) Debug.Print Application.Evaluate(f) End Sub
(稲葉) 2021/01/15(金) 13:03
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.