• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルマクロで条件に該当する数値を探す)

エクセルマクロで条件に該当する数値を探す

このQ&Aのポイント
  • エクセル初心者のため、シート1とシート2の中から条件に該当する数値を探す方法を教えてください。
  • シート1のA列には1~18の数値が、シート2のC3~T3には1~18の数値がランダムに入っています。さらに、シート2のC2~T2には1~18の数値が順位表示されています。これらの条件の下で、該当する数値を探し、シート3の1行目に表示させる方法を教えてください。
  • 例えば、シート1のA1=3、A2=2、A3=1の場合、シート2のC3=3、D3=1、E3=2となります。さらに、シート2のC2=1、D2=2、E2=3です。この時、シート3にはA1=1、B1=3、C1=2と表示されるようなマクロを教えてください。

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>どの部分の式がどんな動作をさせているのか? Sub test()  Dim i As Long  Dim r As Range, rr As Range  Dim v, w, x  With Worksheets("Sheet1")             ' ワークシート1のA1からA列の最終行までの値を配列として             ' vに与える。       v = .Range(.Range("A1"), .Cells(Rows.Count, 1).End(xlUp)).Value  End With  With Worksheets("Sheet2")             ' 検索対象の範囲(INDEX関数)を取得する。             ' 対象はC2から一番右の列の3行目。       Set r = .Range(.Range("C2"), .Cells(3, Columns.Count).End(xlToLeft))             ' 上記で取得した範囲から検索対象の範囲(MATCH関数)として、             ' 3行目だけとする。       Set rr = Intersect(r, .Rows(3))  End With             ' 配列xの範囲を1列、vの行数とする。  ReDim x(1 To 1, 1 To UBound(v, 1))  For i = 1 To UBound(v, 1)      With Application             ' rの範囲の1行目(WS2のC2の行)の値を取得するため             ' 列数はMATCH関数でrrの範囲から検索する。           w = .Index(r, 1, .Match(v(i, 1), rr, 0))             ' 上記で対象が見つからない場合エラーが変数wに入るので、             ' エラーの場合は表示は""(空白)とする。           x(1, i) = IIf(IsError(w), "", w)      End With  Next             ' WS3のA1から1行で列数はvの行数分として、配列xを書き出す。  Worksheets("Sheet3").Range("A1").Resize(1, UBound(x, 2)).Value = x             ' 以下は変数の解放。(Rangeと配列)  Set r = Nothing  Set rr = Nothing  Erase v, x End Sub こんな感じでしょうか。 >それから今回の質問ではシート2の3行目でしたが、他に4行目、5行目・・・と >同じように調べるにはどの部分をアレンジすれば良いのでしょうか? rrの行数を変更するか、連続で行なう場合ならもう一段For ~ Nextの ループでrrをOffsetしていくことかな。(未検証ですけど)

fightman11
質問者

お礼

分かり易い説明をして頂き解決しました。 ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

>エクセルマクロで条件に該当する数値を探す 内容を見ると、Excel通常関数でも出来そうな、ように見えるがExcel VBAでやりたいのですか。 >初心者ですので分かりやすい回答を宜しくお願いいたします。 基本的にこのコーナーはヒントとして回答をもらい、後は質問者が勉強するなり、考えるべきだ。 そもそもこの質問は、丸投げの質問で、質問コーナーの規約から望ましくない。 回答が出る前から、>分かりやすいかどうか判らないわけで、回答に注文をつけるべきでない。 ーーー データに重複が無いと言うことなのでExcel関数のMATCH,VLOOKUP などに好都合。 ーー まず関数でやってみる。 例データ Sheet1 A1:B4 aa bb 1 2 3 1 2 3 質問ではSheet3に出したいらしいが、Sheet1に出すと B2の式は =INDEX(Sheet2!$C$2:$H$2,1,MATCH(A2,Sheet2!$C$3:$H$3,0)) 下方向に式を複写。結果上記。 ーー VBAならOFFSETとMATCH関数を使って 質問ではSheet3に出したいらしいが、Sheet1のD列に出すと Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '------ d = sh1.Range("A65536").End(xlUp).Row For i = 2 To d n = WorksheetFunction.Match(sh1.Cells(i, "A"), sh2.Range("C3:H3"), 0) 'MsgBox n sh1.Cells(i, "D") = sh2.Range("B2").Offset(0, n) Next i End Sub 少数例しかテストして無いので質問を誤解してないか心配だが。 #1のお礼を見るとVBAをやって間もないようだが、わかるかな。 上記のように関数利用だと関数がわかる人には判りやすいと思うが。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Sub test()  Dim i As Long  Dim r As Range, rr As Range  Dim v, w, x  With Worksheets("Sheet1")       v = .Range(.Range("A1"), .Cells(Rows.Count, 1).End(xlUp)).Value  End With  With Worksheets("Sheet2")       Set r = .Range(.Range("C2"), .Cells(3, Columns.Count).End(xlToLeft))       Set rr = Intersect(r, .Rows(3))  End With  ReDim x(1 To 1, 1 To UBound(v, 1))  For i = 1 To UBound(v, 1)      With Application           w = .Index(r, 1, .Match(v(i, 1), rr, 0))           x(1, i) = IIf(IsError(w), "", w)      End With  Next  Worksheets("Sheet3").Range("A1").Resize(1, UBound(x, 2)).Value = x  Set r = Nothing  Set rr = Nothing  Erase v, x End Sub こうゆう感じのことですか?

fightman11
質問者

補足

ありがとうございます。 希望通りに実行できました。 お願いがあるのですが、どの部分の式がどんな動作をさせているのか? 簡単に説明を入れて頂けると応用出来るかも知れませんので、 教えて頂けませんか? それから今回の質問ではシート2の3行目でしたが、他に4行目、5行目・・・と同じように調べるにはどの部分をアレンジすれば良いのでしょうか? シート2の2行目を見るのはずーと同じです。 宜しくお願いいたします。

関連するQ&A