エクセルの関数について質問です。


現在VLOOKUPの関数などを使用しているのですが、VLOOKUPの関数を少し変更した関数を作成したいと考えています。

作成したい関数なのですが、VLOOKUPZと自分で名前をつけてみました。

詳細ですが以下になります。

http://oskuni7.sakura.ne.jp/hatena//question15/question15.htm

ポイントは

セル内のデータを検索範囲から照合して、照合したデータがあった場合検索範囲のデータの値と設定をそのまま出力するということです。(最悪書式は反映されなくても大丈夫です)


上記のような関数を時間があるかたで作成していただけるかたおりましたら作成していただけないでしょうか?

お手数をおかけしますがどうぞよろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/01/22 16:54:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969

ポイント100pt

それっぽい物はできました。

ただし、第4引数がTRUEのときの処理がいまいちよくわからなかったので省略しました。

Function VLOOKUPZ(r1 As Range, r2 As Range, i As Integer) As String
    Dim rs As Range
    Dim j As Integer
    Dim r As Range
    Dim s As String
    If r2.Columns.Count >= i Then
        Set rs = Range(Cells(r2.Row, r2.Column + i - 1), Cells(r2.Row + r2.Rows.Count - 1, r2.Column + i - 1))
        For Each r In rs
            If InStr(1, r1.Value, r.Value) > 0 Then
                s = r.Value
                Exit For
            End If
        Next
    End If
    VLOOKUPZ = s
End Function
id:aiomock

ご回答ありがとうございます。

プログラムを実行してみたのですが

#NAME?

というエラーが発生してしまいます。

計算式ですが

=vlookupz(A3,$E$3:$F$10,1,false)

で入力してみました。

2009/01/22 10:58:36

その他の回答1件)

id:SALINGER No.1

回答回数3454ベストアンサー獲得回数969ここでベストアンサー

ポイント100pt

それっぽい物はできました。

ただし、第4引数がTRUEのときの処理がいまいちよくわからなかったので省略しました。

Function VLOOKUPZ(r1 As Range, r2 As Range, i As Integer) As String
    Dim rs As Range
    Dim j As Integer
    Dim r As Range
    Dim s As String
    If r2.Columns.Count >= i Then
        Set rs = Range(Cells(r2.Row, r2.Column + i - 1), Cells(r2.Row + r2.Rows.Count - 1, r2.Column + i - 1))
        For Each r In rs
            If InStr(1, r1.Value, r.Value) > 0 Then
                s = r.Value
                Exit For
            End If
        Next
    End If
    VLOOKUPZ = s
End Function
id:aiomock

ご回答ありがとうございます。

プログラムを実行してみたのですが

#NAME?

というエラーが発生してしまいます。

計算式ですが

=vlookupz(A3,$E$3:$F$10,1,false)

で入力してみました。

2009/01/22 10:58:36
id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969

ポイント35pt

文字数が多い方を優先されるようにしてみました。

例えば「ああえ 魚サカナ 肉ニク 野菜ヤサイ ささ」の場合

文字群に「ああ」と「ああえ」があれば、「ああえ」になります。

ただし、「ああえ 魚サカナ 肉ニああおク 野菜ヤサイ ささ」の場合

文字群に「ああえ」と「ああお」がある場合はどちらか(下の方)になります。

ループが増えてますので処理が少し重くなっているかもしれません。

Function VLOOKUPZ(r1 As Range, r2 As Range, i As Integer) As String
    Dim rs As Range
    Dim j As Integer
    Dim r As Range
    Dim s As String
    Dim k As Integer
    Dim myCount As Integer
    
    k = 0
    myCount = 0
    If r2.Columns.Count >= i Then
        Set rs = Range(Cells(r2.Row, r2.Column + i - 1), Cells(r2.Row + r2.Rows.Count - 1, r2.Column + i - 1))
        While myCount < r2.Rows.Count
            For Each r In rs
                If Len(r.Value) = k Then
                    If InStr(1, r1.Value, r.Value) > 0 Then
                        s = r.Value
                    End If
                    myCount = myCount + 1
                End If
            Next
            k = k + 1
        Wend
    End If
    VLOOKUPZ = s
End Function
id:aiomock

ご回答ありがとうございます。

プログラム実行されました。

とてもいいものができましたありがとうございます。

2009/01/22 16:54:08
  • id:SALINGER
    ユーザー定義関数から書式は変更できないのです。
  • id:aiomock
    SALINGER さん

    ご回答ありがとうございます。

    書式の変更が出来ないこと了解いたしました。

    セル内にある文字を検索して検索範囲にある文字を照合して出力するということをしたいのですが、

    こちらは可能でしょうか?
  • id:SALINGER
    仕様がちょっとわかりづらいのですが、例えばC3の数式はどうなりますか?
  • id:aiomock
    SALINGER さん

    ご連絡ありがとうございます。

    C3 の ああ 魚サカナ 肉ニク 野菜ヤサイ ささ のケースですが

    =VLOOKUPZ(A3,$E$3:$F$10,2,FALSE)

    になります。
  • id:SALINGER
    第4引数は勝手に削除してしまったので、
    =vlookupz(A3,$E$3:$F$10,1)
    にしてみてください。
    第4引数については、TRUEの場合どうなるのかがわかり実装できそうなら実装したいと思います。
    vlookupのように省略できるようにしたり、参照エラーなどのエラーも出せるようにすれば本格的ですが。
  • id:Mook
    ユーザ定義関数は標準モジュールに書いていますか?
  • id:aiomock
    SALINGERさん

    ご回答ありがとうございます。
    プログラムきちんと実行されました。
    ひとつだけ気になる点があったのですが

    例えば ああ と ああえ 、ああお があったとして

    これらの検出するデータがすべて ああ  になってしまうのですが

    これを ああ ああえ ああお と三つに分けて出力することは可能でしょうか?

    お手数をおかけしますがご回答お待ちしております。



    Mook さん

    標準モジュールによるものでした。

    本当に恥ずかしいです。

    今後標準モジュールでのミスというのは絶対ないようにさせて頂きます。

  • id:SALINGER
    この関数のやっていることを説明をすると、例えば
    =vlookupz(A3,$E$3:$F$10,1)
    ならば、E3:F10の1行目(検索群A)の上から順番に、A3(ああ 魚サカナ 肉ニク 野菜ヤサイ ささ)の文字列に
    含まれていないかを調べて、含まれていればその文字を反し終了します。
    それで、検索群に「ああ」と「ああえ」と「ああお」があった場合、「ああ」を検索した時点で終了します。
    これを回避するためには、「ああえ」と「ああお」には「ああ」が含まれるので検索群Aの中で下にすればいいことになります。
    これを自動でやるには文字数が多い順に並び替えとかが必要になってきますね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません