• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。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

papparamasao
質問者

お礼

Wendy02様  感激です。この2日間,本当にこのお世話になり,ありがとうございました。この3連休は朝から深夜までずっとこればかり考えていて,時間切れで諦めかけていたところでした。  おかげさまで何とかなりそうです。それにしても教えていただいたコードがわかるようにもっと勉強しなければ...と反省しています。  またよろしくお願いいたします。  

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yk3291
  • ベストアンサー率66% (2/3)
回答No.5

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 文字数の関係で改行されてしまっている部分は 手直ししてください。 あとは状況(シート名や、入力の位置、データが 入力されている範囲等)に応じて部分的に変更して みてください。

papparamasao
質問者

お礼

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)
回答No.3

こんにちは。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桁である場合は、必要ありません。また、基本的なエラー処理はされています。

papparamasao
質問者

補足

Wendy02様 ご返信ありがとうございます。 動作は完璧で驚きでした。  あつかましいようですが,これをVBAで動作させたいのですが(既存のVBAに組み込んで使いたいので),もしよろしければコードを書いていただけませんか? VBAは初心者ですので,なるべくシンプルなものをお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

ほかのセルに下記のような表を作成(数字の列は表示形式を文字列にすること) 00 原田 01 山内 02 渡辺 03 安藤 10 坂下 11 山口 12 相馬 20 酒井 21 三宅 30 大田 数式は A2=IF(OR(B2="",C2""),"",VLOOKUP(B2&C2,上記の表の範囲,2,FALSE))

papparamasao
質問者

お礼

mshr1962様 ご教示ありがとうございました。 あいにく,新たな表をつけたしすることはできる限り避けたいと思っている次第でございます。 またよろしくお願いいたします。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
noname#101292
noname#101292
回答No.1

対応する、というのは・・・どういう事でしょうか。 この表って、どういう法則性ですか? (どうなった時に名前を表示するのでしょうか) 察するに、何かのスポーツの得点か何かで、 勝ったほうの名前を出したいという事ですか。 だったらやりようは、ありますが・・・。 でも1と1ってところがありますから、違うのかな。

papparamasao
質問者

お礼

ご返答,誠にありがとうございます。 この表ですが,法則性はございません。  index関数など,1つの条件に対して1つの値を導き出す方法は入門書にあるようですが,そうではなくて,1つの条件に対して値が2~3個あり,さらにもうひとつの条件を踏まえるとその中の1個の値に絞り込む。。。というVBAのコードを試行錯誤しておる次第でございます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBA 変数Aと変数Bの組み合わせに対応する値を返すコード

    ワークシート上に次の表があり,この表をもとにして,変数A(0~4)と変数B(0~4)の組み合わせに対応するC列の値を返すコードは,どう書いたらよいでしょうか。  例えば,変数Aのセルに●(4),変数Bのセルに▲(0)と入力したら,値のセルに■(5)と表示させたいのです。  どなたか教えていただけませんか。 A列  B列  C列  4   0   5  3   1   4  3   0   5  2   2   3  2   1   4  2   0   4  1   3   2  1   2   2  1   1   3  1   0   3  0   4   1  0   3   1  0   2   2  0   1   3  0   0   3 変数A:● 変数B:▲ 値:■

  • エクセルで256通りの組み合わせ

    たとえば、A,B,C,Dという箱にそれぞれ1~4の数字を入れると 1111 1112 1113 ・ ・ ・ 4444 と全部で256通りの組み合わせができると思います。 このようにいくつもの値の組み合わせをエクセルで全て作製するにはどのようにしたらよいのでしょうか。 実際には、Aに(10,20,30,40)、Bに(0.5,1.0,1.5,2.0)、Cに(500,600,700,800)、Dに(1.1,1.2,1.3,1.4)という感じの値の組み合わせを全通り作りたいです。 簡単なことかもしれませんが、あまり詳しくないので困っています。 よろしくお願いいたします。

  • 組合せVBA

    環境はExcel2002です A列に連番数字1から100が入力されていて B列の100行には数字のデータがあるとします ある目的の数値Xに一番近くなるB列の組合せをC列に表示したいのです…VBAで B列に表示するのはA列の連番です 『一番近くなる』の意味は2通りあって、両方の算出方法をご教示願います (1)目的の数値Xを絶対超えないで目的の数値Xに一番近くなる組合せ (2)目的の数値Xを必ず超えて目的の数値Xに一番近くなる組合せ

  • Excelの組み合わせをカウントしたいです。

    こんにちは。 Excelの組み合わせをカウントしようと試行錯誤したのですが 未だに完成出来ないので質問させて頂きます。 A列に1から10までの数字がランダムで500行ほどあり、 A列の中で1と言う数字があった場合、 その下のセルに2があればその組み合わせを1とカウントし、 B列に合計を表示したいのですが、これは可能でしょうか? どうかご教授下さいますよう、宜しくお願い致します。

  • 組み合わせの数え上げで困っています。

    組み合わせの数え上げが難しいので、計算のお伺いをいたします。 ビンゴゲームで、1から75の数字を用いたカードを作成します。 通常は、B/I/N/G/Oの縦列にそれぞれ5個(ただしNは4個)の数字を出して N以外は15C5の60倍、Nは15C4の24倍という計算が成り立つと思いますが、 海外において実際に存在するビンゴカードに以下のようなものがあります。 (1)1つのマスに数字が2個入っている。 (2)マスを構成する2個の数字、どちらが選ばれてもそのマスは塗られたものとする。 なので、48個の数字が印刷されたビンゴカードがありますが、2個のワンセットが逆になっても良いが、配列上は別となるため、実質的な組み合わせの計算が難しくなってしまいました(完全バラなら15C10の720倍&15C8の336倍をベースに求められる)。 どのように計算して、トータル何通りあるのでしょうか。 ご教示いただければと存じますので、よろしくお願いいたします。 (当然の前提ですが、B列は1から15、I列は16から30、N列は31から45、G列は46から60、O列は61から75の数字が使われます)

  • Rを.にして文字列を数字として取り出す

    関数を教えてください A列に品番が入っています 例)ABC075C75 ABC035C6R5 AAA285D7 文字列は左から7文字が品番をあらわして残りが長さをあらわしています。例)ABC075C75は75 ABC035C6R5は6.5 AAA285D7は7です。 Rが小数点を意味しています。 このような場合にB列のみを使って長さの情報を取り出す関数の組み合わせを教えてください。列を複数行使えば、私にも長さを数字として取り出せますが、表が大変大きいのでなるべく列を増やしたくないので、 1列に関数を収めてしまいたいと思っています。よろしくお願いいたします。

  • 順列の組み合わせを表示させる方法

    B~Cの3列のそれぞれの2つの数字からできる順列の組み合わせを図のように表示させる方法をご教示願います。

  • エクセル、B列に入力した数字と対になった数字をC列に表示させたい

    B列に21600~21699までの数字を入力したらC列に300プラスされた数字21900~21999を表示させる。同じようにB列に1100~1199までの数字を入力したらC列に800プラスされた数字1800~1899を表示させる。同じくB列に3500~3599までの数字を入力したら、今度は500マイナスの数字3000~3099が表示されるようにしたいのですが、過去の質問の中から探し出せません。下に例を書きました宜しくお願いします。 (例)     B列      C列 1   21610     21910(B列+300) 2   21685     21985(B列+300) 3    1106      1806(B列+800) 4    1131      1813(B列+800)  

  • 文字だけ残して数字だけ消す

    Excel2003 VBAで文字だけを残して数字だけを消す方法を色々と考えたのですが 上手くマクロが作れずにおります。 例として、 A列    B列  C列 7月1日  東京  ABCDEF123456GHIJK のような、C列の部分のみ、文字と文字の間にある数字の部分だけを消したいのです。 理想的な結果としては 7月1日 東京 ABCDEFGHIJK という状態にしたいのですが可能でしょうか? ctrl+Gでは、全部消えてしまって困っています。 以上、宜しくお願いします。

  • エクセルで数字の下1桁を見て並び替える

    エクセルで下記の様な数字が並んでいます。 A列の下1桁の数字は上から順に増えていて、ある数字で1に戻りまた増えています。 その数字は毎回同じではなく、6までの場合もあれば10までの場合もあります。 下記の例では上から6行、次は4行、次は7行と下1桁の数字によってグループ分け出来ますよね? それで上から6行目までのB列の値(462~530)をコピーしてSheet2のA1から横方向に並べます。 その次は7行目から10行目までのB列の値(356~487)をコピーしてSheet2のA2から横方向に並べます。 その次も同じように並べます。 B列が空欄の場合もありますが、その場合はそのままSheet2にも空欄のセルを作ります。 1グループ全部のB列が空欄でもそのままSheet2に空欄の行を作ります。 この動作をマクロで出来る式を教えて頂けないでしょうか? A列          B列 0213240101     462 0213240102    387 0213240103    556 0213240104    585 0213240105    536 0213240106    530 0213240201    356 0213240202    632 0213240203    486 0213240204    487 0213240301    586 0213240302    670 0213240303    619 0213240304 0213240305    645 0213240306    487 0213240307    651 0213240401 0213240402 0213240403 0213240501    455 0213240502    623 0213240503    411 Sheet2 A列   B列    C列   D列    E列    F列   G列 462    387    556    585    536    530 356    632    486    487 586    670    619            645    487    651    455    623    411

専門家に質問してみよう