[[20210115115600]] 『match indexをvbaで記載したい』(斎藤) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


返信ありがとうございます。
if文はプログラムが汚くなるし、重くなるので使いたくないのです。
printでエクセルのセル上に入力してから、改めて取得するのも
やはりプログラムが汚くなります。

あくまでも下記関数をそのままvbaで記載できる方法を聞いております。
MATCH(TRUE,INDEX(A1:A10="",0),0)

分かる方はいらっしゃいませんか?
(斎藤) 2021/01/15(金) 12:22


[[20201221172157]] 『エクセルのセルの変数名を取得したい』(斎藤) >>BOT
 自分勝手な方か・・・

 >printでエクセルのセル上に入力してから、改めて取得するのも 
 これは別にセル上に入力してませんよ。
https://excel-ubara.com/excelvba4/EXCEL_VBA_424.html
 evaluateを省略しているだけです。

 >if文はプログラムが汚くなるし、重くなるので使いたくないのです。 
 それは自分の技量がないだけでしょう。

(稲葉) 2021/01/15(金) 12:31


すいません、最初の空白セルを取得する方法を聞いているのではなく
あくまでも下記関数をvbaで記載できる方法を聞いております。
MATCH(TRUE,INDEX(A1:A10="",0),0)
それ以外の答えは必要ございません。
あしからず

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


なるほど、そもそもvbaでは出来ない事だったのですね。
わかりました、ご丁寧にありがとうございます。
Evaluateを分ける方法も記載していただき、誠にありがとうございました。
(斎藤) 2021/01/15(金) 13:06

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.