[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『配列数式をvbaで』(処理が)
={IF( COUNTIF(K:T, A1),
INDEX(C:C, MAX(IF(K:T=A1, ROW(K:T)))))
ていう配列数式があります。
これをVBAで書くとどうなりますか?
< 使用 Excel:Excel2013、使用 OS:Windows7 >
趣旨を誤解しているかも知れませんが...
Function test(検索値, ByVal 検索範囲 As Range, 戻り範囲 As Range) test = False With 検索範囲.Worksheet Set 検索範囲 = Intersect(検索範囲, Range(.Cells(1, 1), .UsedRange)) End With If 検索範囲 Is Nothing Then Exit Function Dim v() As Variant, c As Long, r As Long, x As Long v = 検索範囲.Value For r = 1 To 検索範囲.Rows.Count For c = 1 To 検索範囲.Columns.Count If v(r, c) = 検索値 Then If r > x Then x = r Next Next If x Then Set test = 戻り範囲.Rows(x) End Function
(白茶) 2024/02/29(木) 18:06:21
あ、「Option Compare Text」付けとかなきゃダメですかね
(白茶) 2024/02/29(木) 18:17:20
ユーザー定義関数の別案です。
Function test(検索値 As Range, 検索範囲 As Range, 戻り値列 As Range) As Variant Dim found As Range Set found = 検索範囲.Find(検索値.Value, , xlValues, xlWhole, xlByRows, xlPrevious) If Not found Is Nothing Then test = 戻り値列(found.row, 1) Else test = False '該当なし End If End Function
使い方は、下記です。 =test(A1,K:T,C:C) (xyz) 2024/03/01(金) 06:07:04
コードを試した所
A1セルでCtrl+Sgift+Enterを押すと値が出ます。
押さないと
VALUEがでます。
なぜでしょうか?
ちなみに
検索値、検索範囲、戻り値列は実際の参照する箇所を入力した方がよいでしょうか?
(処理が) 2024/03/01(金) 15:33:49
それは配列数式ではありません。 ユーザー定義関数は、ワークシート関数と同じように使って下さい。 それぞれの引数の意味は、使い方も示しましたし、コードも提示していますので、想像がつくと思います。
>A1セルでCtrl+Sgift+Enterを押すと値が出ます。 >検索値、検索範囲、戻り値列は実際の参照する箇所を入力した方がよいでしょうか?
どのセルにどんな式を入れたのでしょうか。 どういう目的で、どのようなことをされたのか、想像できません。
(xyz) 2024/03/01(金) 16:08:27
現状は
検索値は検索する値というシートのB12セルです。
検索範囲は検索する範囲というシートのK列〜S列です。
右に9列というのはS列となります。
現状
Module1に
Function test(検索値 As Range, 検索範囲 As Range, 戻り値列 As Range) As Variant
Dim found As Range Set found = ThisWorkbook.Worksheets("検索する範囲").Range("K:T").Find(ThisWorkbook.Worksheets("検索する値").Range("B12").Value, , xlValues, xlWhole, xlByRows, xlPrevious) If Not found Is Nothing Then test = ThisWorkbook.Worksheets("検索する範囲")Range("S")(found.row, 1) Else test = False '該当なし End If End Function で 検索する値のシートのF10セルには =test(B12,検索する範囲!K:S,検索する範囲!S:S) という式が入っています。 これで行うと F10セルに検索値を入れても反応せず F10セルを編集状態にしてCtrl+Sgift+Enterを押すと値を抽出します。 何回か試したら合っているときとあっていない時があり困っております。
すみません。
(処理が) 2024/03/01(金) 20:26:35
ユーザー定義関数は変更せず、そのまま標準モジュールにコピーしてください。 Function test(検索値 As Range, 検索範囲 As Range, 戻り値列 As Range) As Variant Dim found As Range Set found = 検索範囲.Find(検索値.Value, , xlValues, xlWhole, xlByRows, xlPrevious) If Not found Is Nothing Then test = 戻り値列(found.row, 1) Else test = False '該当なし End If End Function
"検索する値"というシートのF10セルに =test(B12,検索する範囲!K:S,検索する範囲!S:S) と入れてみてください。 結果がF10セルに表示されるはずです。
(xyz) 2024/03/01(金) 22:30:41
無事にできました。
ひとつ気になることが
検索する値は
159-A278-Rなどですが
試しに数字の7とか5とかを入れてみると、
違ったものが出てきます。
本来は検索する値が検索する範囲になければFalseが表示されると思いますが
なぜでしょうか?
すみません。
(処理が) 2024/03/02(土) 08:31:07
> 検索する値は > 159-A278-Rなどですが > 試しに数字の7とか5とかを入れてみると、 > 違ったものが出てきます。 意味がわかりません。 > 試しに数字の7とか5とかを入れてみると、 とは? 検索値を7や5に変更したら、ということですか? そりゃ別の結果になるのに不思議はないです。
もう少し説明してください。
なお、関係する事項ですが、 検索はxlWhole、つまり完全一致で検索する仕様、と言うことに留意してください。 部分一致ではありません。 (xyz) 2024/03/02(土) 08:37:48
(処理が) 2024/03/02(土) 08:56:41
あ、そうですか。では下記のことを実行して結果を知らせてください。
Set found = 検索範囲.Find(検索値.Value, , xlValues, xlWhole, xlByRows, xlPrevious) のあとに MsgBox 検索値 & vbLf & found.Address & vbLf & found.Value を一行だけ追加してください。
そして、再度、入力すると、メッセージボックスが表示されるはずです。 内容は、 ・検索値 ・ヒットしたアドレス ・そのヒット箇所の値 です。
なお、ヒットしない場合、表示が#VALUEに変わりますが、それは追加行の影響ですから気にする必要ありません。 不要になったら、その追加行は消して下さい。 (xyz) 2024/03/02(土) 09:11:21
結果
アドレスは関係ない箇所を示してみました。
考えてみたら
検索範囲が
広すぎてその中から該当するものを探していたみたいです。
大変失礼いたしました
そこで検索範囲を
検索する範囲!K:Sから検索する範囲!K:Kに変更したら該当しないものはFALSEと出ました。
(処理が) 2024/03/02(土) 10:17:13
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.