- ベストアンサー
2つの数字の組み合わせに対応する文字を返すコードを教えてください。
すみませんがお知恵を拝借させてください。下のような表で,B列の値に0~3,C列の値に0~3のいずれかを入れたとき,2つの数字の組み合わせに対応するA列にある名前を返すコードを教えていただけませんか。 例えば,B列の値=2,C列の値=0のとき,「酒井」と出力したいのですが。 ※2つの数字の組み合わせに重複はありません。範囲は下に書いた10名分のみです。よろしくお願いいたします。 ----------------------------------------- B列の値:_ C列の値:_ A列 B列 C列 ------------------- 大田 3 0 酒井 2 0 三宅 2 1 坂下 1 0 原田 0 0 山内 0 1 山口 1 1 相馬 1 2 渡辺 0 2 安藤 0 3
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。Wendy02です。 前回の例は、私は、特殊場合もきちんと作りこみましたが、今回は、数式をできる限り取り込みました。これは、かなり特殊なマクロだと思ってください。 Sub MacroTest() Dim strFind1 As String '検索値1 Dim strFind2 As String '検索値2 Dim strFind As String '統合検索値 Dim i As Long Dim myRngData As String Dim Rng1 As Range, rng2 As Range, rng3 As Range Dim Ret As Variant '戻り値 Set Rng1 = Range("A1:A10"): Set rng2 = Range("B1:B10"): Set rng3 = Range("C1:C10") On Error GoTo EndLine '検索値1, 検索値2 strFind1 = 3 strFind2 = 0 '検索値の作成 strFind = """" & strFind1 & "," & strFind2 & """" '行の確定 i = Evaluate("Match(" & strFind & "," & rng2.Address & " &"",""& " & rng3.Address & ", 0)") '戻り値 Ret = WorksheetFunction.Index(Rng1, i, 1) MsgBox Ret Exit Sub EndLine: If Err.Number > 0 Then MsgBox "見つからないか、エラーが発生しています。" End If Set Rng1 = Nothing: Set rng2 = Nothing: Set rng3 = Nothing End Sub
その他の回答 (4)
- yk3291
- ベストアンサー率66% (2/3)
B列の値を入力するセルがB1、C列の値を入力する セルがB2とします。 A5からC14の範囲に名前及び数字のデータが入力 されているとします。 該当のシート名は"Sheet1"とします。 この内容において、Sheet1のモジュールに以下の コードを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim a As Integer, b As Integer, c As Integer If Target.Column <> 2 Or Target.Row > 2 Then Exit Sub b = Sheets("Sheet1").Range("B1").Value c = Sheets("Sheet1").Range("B2").Value For a = 5 To Sheets("Sheet1").Range("A65536").End(xlUp).Row If Sheets("Sheet1").Range("B" & a).Value = b And Sheets("Sheet1").Range("C" & a).Value = c Then Exit For Next a If Sheets("Sheet1").Range("B1").Value <> "" And Sheets("Sheet1").Range("B2").Value <> "" Then Sheets("Sheet1").Range("C1").Value = Sheets("Sheet1").Range("A" & a).Value End If If Sheets("Sheet1").Range("B1").Value = "" Or Sheets("Sheet1").Range("B2").Value = "" Then Sheets("Sheet1").Range("C1").Value = "" End If End Sub 文字数の関係で改行されてしまっている部分は 手直ししてください。 あとは状況(シート名や、入力の位置、データが 入力されている範囲等)に応じて部分的に変更して みてください。
お礼
yk3291様 お知恵を拝借して恐縮です。本当にすごいというか,感心することしきりです。あと,コマンドボタンで操作したいときは, Private Sub Worksheet_Change(ByVal Target As Range)を, Private Sub CommandButton1_Click() にかえて, If Target.Column <> 2 Or Target.Row > 2 Then Exit Sub を削除すればよろしいですよね? 本当にありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。Wendy02です。 重複はないことを条件にします。 E列 E1 E2 で検索値を入れ、 =IF(ISERROR(MATCH($E$1&","&$E$2,INDEX($B$1:$B$10&","&$C$1:$C$10,,),0)),"",INDEX($A$1:$A$10,MATCH($E$1&","&$E$2,INDEX($B$1:$B$10&","&$C$1:$C$10,,),0),)) なお、$E$1&","&$E$2 に、「,(コンマ)」は、検索値が必ず1桁である場合は、必要ありません。また、基本的なエラー処理はされています。
補足
Wendy02様 ご返信ありがとうございます。 動作は完璧で驚きでした。 あつかましいようですが,これをVBAで動作させたいのですが(既存のVBAに組み込んで使いたいので),もしよろしければコードを書いていただけませんか? VBAは初心者ですので,なるべくシンプルなものをお願いします。
- mshr1962
- ベストアンサー率39% (7417/18945)
ほかのセルに下記のような表を作成(数字の列は表示形式を文字列にすること) 00 原田 01 山内 02 渡辺 03 安藤 10 坂下 11 山口 12 相馬 20 酒井 21 三宅 30 大田 数式は A2=IF(OR(B2="",C2""),"",VLOOKUP(B2&C2,上記の表の範囲,2,FALSE))
お礼
mshr1962様 ご教示ありがとうございました。 あいにく,新たな表をつけたしすることはできる限り避けたいと思っている次第でございます。 またよろしくお願いいたします。ありがとうございます。
対応する、というのは・・・どういう事でしょうか。 この表って、どういう法則性ですか? (どうなった時に名前を表示するのでしょうか) 察するに、何かのスポーツの得点か何かで、 勝ったほうの名前を出したいという事ですか。 だったらやりようは、ありますが・・・。 でも1と1ってところがありますから、違うのかな。
お礼
ご返答,誠にありがとうございます。 この表ですが,法則性はございません。 index関数など,1つの条件に対して1つの値を導き出す方法は入門書にあるようですが,そうではなくて,1つの条件に対して値が2~3個あり,さらにもうひとつの条件を踏まえるとその中の1個の値に絞り込む。。。というVBAのコードを試行錯誤しておる次第でございます。ありがとうございました。
お礼
Wendy02様 感激です。この2日間,本当にこのお世話になり,ありがとうございました。この3連休は朝から深夜までずっとこればかり考えていて,時間切れで諦めかけていたところでした。 おかげさまで何とかなりそうです。それにしても教えていただいたコードがわかるようにもっと勉強しなければ...と反省しています。 またよろしくお願いいたします。