• ベストアンサー

エクセルVBAを使ってデータの抽出をしたいのですが

タンク容量のデータベースがあります。(以下のような)    A   B   C......←タンクNo 0  100  200  500 ..... 2  90  180  460  ...... 4  80  160   420  ..... 6   70  140   400 .....  ・ ・ ・ ↑タンク上部からの空寸 このようなデータからたとえば、タンクBの160は空寸が4ですが、この空寸4を抽出するにはどうすればいいのか教えてください。 ちなみに、データはシート2にあり、シート1のA1セルにタンクN0、B1セルに容量を入力し、コマンドボタンを押すとC1セルに対応する空寸がでるようにしたいのですが。。 また、容量はぴったり一致するときもありますが、無いときは最も近い値の空寸を持ってきたいのです。 どうか、よろしくお願いします。

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

再びmaruru01です。 まず、Sheet2の表の位置を確認したいのですが、 A1は空白で、A2~縦方向にA1225までに「空寸」、 逆に、B1~横方向にAP1までに「タンクNo」となっていますか? つまり、容量はB2~AP1225までに入力されていることになります。 それなら、No.1の補足欄の数式でいいはずですが。 あと、MATCH関数では、タンクNoの位置を検索しています。 したがって、データに関係なく、第2引数は「Sheet2!$1:$1」のままにしておいて下さい。

nakkya
質問者

お礼

参考にさせて頂いて、何とか解決できました。 ありがとうございました。 結局、VBAでやってみました。

その他の回答 (2)

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

(データ)Sheet2のA1:D5 A  B  C. 0 100 200 500 2 90 180 460 4 80 160 420 6 70 140 400 (指定) B9セル (VBA) Sub test01() Worksheets("sheet2").Select Select Case Cells(9, 2) 'B9セル Case Is < 100 c = 2 Case Is < 200 c = 3 Case Is < 500 c = 4 End Select MsgBox c For i = 1 To 10 If Cells(i, c) < Cells(9, 2) Then If Cells(9, 2) - Cells(i, c) > Cells(i - 1, c) - Cells(9, 2) Then MsgBox Cells(i - 1, c) Else MsgBox Cells(i, c) End If Exit Sub Else End If Next i End Sub (テスト) 94の時2 101の時6 171の時2 490のとき0 (お詫び) この解答はB列の最低が100を越える、またC列の最低 (最下行)が200を越えることを前提にしています。 また急いだため、指定を同じシートのB9に設定して手抜きをしています。ヒントに使ってください。 またテストが十分でありませんことをお詫びします。 上記仮定が不可の場合は、おっしゃって頂ければ考えなおします。

nakkya
質問者

補足

お返事ありがとうございます。maruru01さんが教えてくれるワークシート関数でやってみようかと思っていますが、VBAも勉強したいと思っているものですから、教えてください。 Worksheets("sheet2").Select Select Case Cells(9, 2) 'B9セル Case Is < 100 c = 2 Case Is < 200 c = 3 Case Is < 500 c = 4 ですが、タンク容量のデータシートにはタンクの番号が200本以上あります。1から200番まで整理されて並んでいるわけでなく番号が不揃いで1052や12、502、500、821といったようにランダムにまた抜けた番号もあります。また今回はシート2のタンクのデータで対処できるのですが今後シート3やシート4にもタンク容量のデータがありそちらも利用できたらとも思っています。 説明不足で申し訳ありませんがよろしくお願いいたします。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 VBAでなくても、ワークシート関数でも出来ます。 シート1のC1に、 =IF(ISERROR(MATCH($A$1,Sheet2!$1:$1,0)),"",INDEX(Sheet2!$A:$A,MIN(IF(ABS(OFFSET(Sheet2!$A$2:$A$5,0,MATCH($A$1,Sheet2!$1:$1,0)-1)-$B$1)=MIN(ABS(OFFSET(Sheet2!$A$2:$A$5,0,MATCH($A$1,Sheet2!$1:$1,0)-1)-$B$1)),ROW(Sheet2!$A$2:$A$5))))) と入力して、[Ctrl]+[Shift]+[Enter]で確定します。 (数式の両端に「{}」が付いて、配列数式になります。) なお、Sheet2のデータ範囲は2~5行なので、適宜変更して下さい。 また、シート1のB1の値が2つのデータの中間の場合は、上の行が優先されます。 例えば、「B」で「170」なら、「3」ではなく「2」になります。

nakkya
質問者

補足

返事が遅くなってしまい申し訳ありません。 maruru01さん、いつも教えていただいてありがとうございます。 MATCH関数がよくわからないのですが、MATCH($A$1,Sheet2!$1:$1,0)の$1:$1はどういう意味なのでしょうか? タンクのデータはA1からAP1225に入っているのですが$1:$1の部分をA1:AP1225に変えればいいのですか? また、”Sheet2のデータ範囲は2~5行なので、適宜変更して下さい。”ということだったので最初 {=IF(ISERROR(MATCH($A$1,Sheet2!$1:$1,0)),"",INDEX(Sheet2!$A:$A,MIN(IF(ABS(OFFSET(Sheet2!$A$2:$A$1225,0,MATCH($A$1,Sheet2!$1:$1,0)-1)-$B$1)=MIN(ABS(OFFSET(Sheet2!$A$2:$A$1225,0,MATCH($A$1,Sheet2!$1:$1,0)-1)-$B$1)),ROW(Sheet2!$A$2:$A$1225))))) }としましたがだめでしたどこがいけないのでしょうか? 一つ一つ解釈しながら勉強させて頂いてます。すいませんが、よろしくおねがいいたします。

関連するQ&A

  • Excelでのデータ抽出

    Excelで外部結合風のデータ抽出を教えてください。 シートAとシートBに表形式のデータがあり、 シートAのA列の値とシートBのA列の値が一致するシートBの 行を抽出するのが目的です。 具体的には次のような感じです。 シートA         シートB ----------------  ---------------- A列 | B列 | C列     A列 | B列 | C列 ----------------  ---------------- 2  | 2B  | 2C      1  | 1BB | 1CC ----------------  ---------------- 4  | 4B  | 4C      2  | 2BB | 2CC ----------------  ---------------- 6  | 6B  | 6C      3  | 3BB | 3CC ----------------  ---------------- ↓ シートB ---------------- A列 | B列 | C列 ---------------- 2  | 2BB | 2CC ---------------- 以下以外の方法がありましたら教えてください。 1)アクセスに両シートのデータを取り込み、2つのテーブルを外部結合で連結させる。 2)マクロで二重ループをつくり、A列が一致した行を取り出す。 よろしくお願いします。

  • EXCEL抽出?についてご指導ください。

    シート1にあるデータをシート2に抽出したいのですが・・・ シート1にあるデータの2列目と3行目で交差する「A」を シート2のA1セルに「2」A2セルに「3」と入力すると 指定したセル(たとえばB1セルに「A」と表示(抽出)させたいのですが、ご存知の方教えていただけませんか? (シート1)   1 2 3 4 5 1 2 3    A 4 (シート2)   A  B  C 1 2  A 2 3 3 よろしくお願いします。

  • エクセルのデータ抽出について

    基本的な内容かもしれませんが、どうしてもわからないので教えてください。   A B C D 1 1 b 3 c 2 2 t 4 y 3 3 r 3 o 4 4 l 5 p 5 5 k 3 w 上記のようなデータベースがあったとします。このシートと異なるシートのあるセルにたとえば3と入力すると   A B C D 1 1 b 3 c 2 3 r 3 o 3 5 k 3 w のようにC列が3である行が抽出され、なおかつA列の昇順で並ぶということをしたいのですが、vlookup等ではうまくできません。 フィルタを使用せずに実現したいのです。お願いします。

  • Excelにおけるデーター抽出

    Excelのシートに記載されている内容は次の通りです。 (1) セルA5~A60の間に1~56の昇順の番号 (2) セルB5~B60には氏名 (3) セルC5~C60には○、×、△の記号 このシートからC列が ○ の記号が付与されている者だけの氏名を別のシートのB7~B**の間に抽出するのですが、抽出したシートの行に空白ができないようにするには式をExcel関数で作成することは可能でしょうか? 若し、不可能でしたらマクロで行う場合のプログラムを教えて下さい。

  • ExcelのVBAについて

    ExcelのVBAについて VBA全くの初心者です。 以下のような処理を行いたいのですが、どなたかご教授をお願いします。 以下のように支店(1)~(3)のシートがあります。 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、   一致しない行を不一致データシートに出力する もう一つ別のマクロで、 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、、   一致する行を一致データシートに出力し、D列に対象データがあるシート名を表示する   ※可能でしたら、E列に対象データがある行番号も表示する -------------------------------- シート名:支店(1) A      B     C 商品No   商品名   備考 011    商品A   備考A 009    商品B   備考B 015    商品C   備考C -------------------------------- シート名:支店(2) A      B     C 商品No   商品名   備考 008    商品A   備考A 023    商品B   備考B 004    商品C   備考C -------------------------------- シート名:支店(3) A      B     C 商品No   商品名   備考 007    商品A   備考A 033    商品B   備考B 018    商品C   備考C -------------------------------- シート名:入力シート A      B     C 商品No   商品名   備考 ※ここに複数行入力する -------------------------------- シート名:不一致データシート A      B     C 商品No   商品名   備考 ※ここに出力される -------------------------------- シート名:一致データシート A      B     C 商品No   商品名   備考 ※ここに出力される

  • Excelでデータを抽出

    エクセルでデータベースを作成しました。 このデータベースから目的のものだけを別のシートに抽出したいです。 データベース A ID1 B ID2 C 内容 この内容が100行書かれているとします。 ある20個のIDの内容だけを別のシートに抽出したいのです。 ID1を昇順にならべるとID2は昇順にならないようなIDになっています。 なので、VLOOKUPがつかえません。 ID1から抽出したいもの20個を選んで、シート2へ選んだ内容のID1と内容を抽出 ID2から抽出したいものを20個選んで、シート3へ選んだ内容のID2と内容を抽出 どの様にしたら出来ますか? うまく説明できなくてすみません。 宜しくお願いします。

  • EXECL・複数タブからのデータ抽出

    同一Book内での処理です。 今現在の処理内容です タブAには抽出されるデータがあります。 セルA1・・・抽出キー セルB1・・・抽出データ1 セルC1・・・抽出データ2 タブBには抽出キー・抽出結果を表示するようにしています。 セルA1・・・抽出キー1 セルB1・・・抽出キー2 セルC1・・・抽出キーを合成 <=CONCATENATE(A1,"→",B1)> セルD1・・・データ抽出 <=VLOOKUP(C1,タブA!$A:$C,2,FALSE)> したいことは タブAのデータと同一内容のデータが複数タブに存在するときのデータ抽出する場合はどうすればよいのでしょうか? タブA(リンゴ)には抽出されるデータがあります。 セルA1・・・抽出キー セルB1・・・抽出データ1 セルC1・・・抽出データ2 タブB(みかん)には抽出されるデータがあります。 セルA1・・・抽出キー セルB1・・・抽出データ1 セルC1・・・抽出データ2 タブCではセルA1の内容によって抽出するデータのタブを選択しデータを抽出したい セルA1・・・抽出キー1 セルB1・・・抽出キー2 セルC1・・・抽出キーを合成 <=CONCATENATE(A1,"→",B1)> セルD1・・・データ抽出 <=ここの計算式が知りたい タブCのセルA1の抽出キーに(リンゴ)と入力されていればタブA(リンゴ)のシートよりデータ抽出 タブCのセルA1の抽出キーに(みかん)と入力されていればタブB(みかん)のシートよりデータ抽出 単にいえば、データ抽出するタブを指定して<VLOOKUP関数>を利用できるのか? できないなら実現できる手法を教えていただきたいです。 説明が難しいですが、内容がわかっていただけたでしょうか? 達人からの回答よろしくお願いいたします

  • データ検索

    エクセル2003VBAの質問です。 AシートにAデータベースがあります。 そのデータベースには一つのセルに、日にちと時間が入力されています。(例 2008/10/07/ 16:29) BシートにもBデータベースがあります。 Aシートの先程のセル(日にちと時間)を、Bシートで検索したいです。 しかし、このBシートには、Aシートのセルが一致しないものもあります。 一致すれば、Aシートの先程のセルとAシートに入力されている、他の項目をCシートにコピーしたいです。 一致しなければ、そのデータベースは無視して、Aシートに入力されている次のデータ(次の行)を検索したいです。 どうすれば良いでしょうか? よろしくお願いします。

  • excel データの抽出について

    仕事でexcelの表からデータを抽出して資料を作成したいと思っています。 ≪シート1≫表から≪シート2≫表へ「1が立っているデータのタイトル(あ~お)を抜き出したいのです。どなたか方法があれば教えてください。(できればVBA等を使わないで作りたいです。) ≪シート1≫     あ い う え お A  1    1 B     1 1   1 C         1 1 ≪シート2≫ A あ う B い う お C え お

  • エクセル:同じデータがあれば、同じデータの隣のデータを抽出する。

    エクセル:同じデータがあれば、同じデータの隣のデータを抽出する。 以下のようなエクセルデータがあります。A1からA3の中にC1があれば、 あったセルの隣のセルの値をD1に抽出したいです。 何か方法がありますでしょうか? お願いいたします。  EX: A B  C D 1 2  3 2 5  2 3 9  1 結果: A B  C D 1 2  3 9 2 5  2 5 3 9  1 2

専門家に質問してみよう