タイトル
エクセルで複数列から任意の値を検索しその隣の値を表示したい。
以下のような処理をエクセルでしたいのですが、色々検索してみましたが、できませんでした。
関数や数式を教えていただけると助かります。
また、データが重いので、できれば処理の軽め数式でできると助かります。
シート1
名称 金額コード1 金額1 金額コード2 金額2 金額コード3 金額3・・・
***1 1234 10,000 1345 12,000 1500 1,000
***2 1345 1,000 1500 2,000
***3 1100 500 1234 100 1500 600
***4 1600 2,500 1700 1,200 1800 4,500
***5 1234 2,000
・・・
(説明)シート1には、10万件以上の行があります。
金額コード1で1列、金額1で1列で、1~99まであります。金額コード99、金額99が最後の列です。
シート1から、金額コード「1234」が1,000円以上のものを抽出したい→結果:名称「***1」と「***5」といった処理をしたいです。
1列にまとまっていないので、抽出方法に苦慮しています。
エクセルに詳しい方、どうか知恵を貸してください。
よろしくお願いいたします。
No.9ベストアンサー
- 回答日時:
重ねてすみません。
「(」が多いのではなくて「)」が足りなかったようです (冷汗
=IF(SUMPRODUCT((MOD(COLUMN(B2:GR2),2)=0)*1,(B2:GR2=1234)*1,(C2:GS2>=1000)*1)>0,GU1+1,GU1)
に直してみてください。
MOD(COLUMN(B2:GR2),2)=0『)』*1 これで、(列番号÷2の余りが0?→TRUE)*1となるので数字と判定され1が出てきます。
括弧が無い為、列番号÷2の余りが0*1?→TRUE となってしまい、TRUEは数字ではないので判定が0となってました。
申し訳ありません。
ありがとうございます!
抽出できました!
長期に及び、すみませんでした!
丁寧に説明していただいてありがとうございます!助かりました。
No.6
- 回答日時:
No4ですが、金額が1234になる場合もあるとの事ですので、がらっと式を変更します。
ただ、表示する内容は一緒ですので、AAAとした列の式を修正します。
この際、データの入力されている最終列の右側は空白の列が必要になりますので、
ZYまでデータが入っていて、ZZは空白、AAAにカウントする式、AABに名称 といった具合になります。
AAAの式ですが、
AAA2=IF(SUMPRODUCT((MOD(COLUMN(B2:ZY2),2)=0*1,(B2:ZY2=1234)*1,(C2:ZZ2>=1000)*1)>0,AAA1+1,AAA1)
これは、もし該当するものが存在すれば(>0なら)1つ上のセルに1加えて表示。存在しなければ上のセルをそのまま表示。というのは同じです。
該当するものについてですが、MOD(COLUMN(B2:ZY2),2)=0というのが、B2~ZY2のセルの中で、列番号を2で割った余りが0の場合。つまり、偶数列目(=金額コードの列)であるならば、1(*1の部分)とします。(違う場合は0です)
更に、(B2:ZY2=1234)というのが、B2~ZY2のセルの中で1234に該当する場合1(以下同様)
更に、(C2:ZZ2>=1000)というのが、C2~ZZ2のセル(つまりB2~ZY2のセルの右隣)が1000以上である場合1
これら3種類の判別をした結果の合計(全てに該当する場合1*1*1=1とカウントされ、どこかに該当しない物があれば*0が含まれるので0となります。 それらの合計なので、全てに該当したセルの個数を表示します)が(最初の説明文に戻り)、>0ならば・・・ となります。
いかがでしょうか?
No.5
- 回答日時:
これを数式で実装してしまうと運用に耐えられないと思います。
ひとつ値を変える度にクルクル回ってしまうでしょう。または、値を変えるときは手動計算にしておくとか…。やはり、マクロでの実装が現実的です。
プログラムを手打ちしなければならないということなので、できるだけ短い(機能も限定)ものにしてみました。こんな感じです。
Sub sample()
Set sr = Range("A1")
For Each r In Selection
If r.Column Mod 2 = 0 And _
r.Offset(0, 1).Value >= 1000 Then
Set sr = Union(sr, Cells(r.Row, "A"))
End If
Next r
sr.Select
End Sub
上記のVBAを標準モジュールに打ち込んでから、次のように操作してください。
①「ホーム」タブの「検索と選択」から「検索」をクリック。
②検索文字列(1234)を入力して「すべて検索」をクリック。
③Ctrl+aですべてを選択状態にして、「×」でウィンドウを閉じる。
④上記のマクロを実行する(選択されているセルのA列が選択状態になります)。
⑤上記⑤で選択されたセルをCtrl+cでコピーし、適当なセルにペーストすればできあがり。
No.4
- 回答日時:
とりあえずこちらの思っているとおりとして説明しますが、再確認したいこととして、
金額が1234円となる事はありませんか?
名称が1234となる事はありませんか?
なる場合改良するか考えを変えなければならない可能性がありますので。
最後尾の列番号が分からない(計算してないだけですが)ので、ZZ列までデータがあり、AAA列に新しい式を入れるとして記入します。
また、1行目がタイトル行、2行目からデータとしています。
そしてAAA1は空白であること前提としています。
AAA2=IF(COUNTIF(A2:ZZ2,1234)=1,IF(INDIRECT(ADDRESS(ROW(),MATCH(1234,A2:ZZ2,0)+1,4))<1000,AAA1,AAA1+1),AAA1)
これは、A2~ZZ2に1234があった場合、「それが何番目だったかを取得し、同じ行のその次の列のセルに入っているデータを取得。もしそれが1000より小さければ1つ上のセルと同じ数、1000以上であればそれに1つ加えた数を表示する」なかった場合は1つ上のセルと同じ数を表示する。 というものです。
長いので打ち間違えがあったらすみません。
これにより、該当した行では上の数から1つ増えた数を表示し、そうでなければ同じ数を表示することができます。
AAB2=A2 次の検索の関係で、先ほどの数字の右側に名称を表示しておきたいので。
表示したいセルが分かりませんのでAACの列で2行目以降(2行目に1つ目の該当を表示)とします。
AAC2=VLOOKUP(ROW()-1,AAA:AAB,2,FALSE)
その行数より1少ない数をAAAで検索し、該当する一番上の行の2つ目の列(=AAB)にある値=名称を表示します。
これでできていればいいのですが。試してみてください。
No.3
- 回答日時:
No.2です。
>できればマクロを使用しないでできればありがたいです。
結局関数で処理したい!というコトですよね?
元データのSheet1に作業用の列を設けてみます。
A列を挿入 → 元データが右へ列ずつずれます。
A2セルに
=IF(COUNTIFS(C2:QQ2,1234,D2:QR2,">=1000"),ROW(),"")
という数式を入れフィルハンドルでダブルクリック!
これで「1234」の右側セルが1000以上の場合その行の行番号が表示されます。
そしてSheet2のA2セルに
=IFERROR(INDEX(Sheet1!B:B,SMALL(Sheet1!A:A,ROW(A1))),"")
という数式を入れフィルハンドルでずぃ~~~!っと下へコピーしてみてください。
※ 前回も書いたようにデータ数が10万行以上あるというコトですので、
検証はしていませんが、フリーズ状態になるかもしれません。
>データが重いので、できれば処理の軽め数式で・・・
とありますが、今はこの程度しか思いつきません。m(_ _)m
No.2
- 回答日時:
こんばんは!
「金額コード○」が「1234」でその右となりの「金額○」が1000以上が1組以上あれば
その行のA列「名称」データを表示すればよいのですよね?
データが10万件以上あるというコトですので、関数ですべての行に数式をいれると相当重くなると思います。
そこでVBAになりますが、一例です。
↓の画像のように元データはSheet1にあり、Sheet2のA列に羅列してみました。
標準モジュールにしてください。
Sub Sample1() 'この行から//
Dim lastRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
Application.ScreenUpdating = False
wS.Range("A:A").Clear
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
.Range("A:A").Insert
.Range("A1") = .Range("B1")
With Range(.Cells(2, "A"), .Cells(lastRow, "A"))
.Formula = "=IF(COUNTIFS(C2:QQ2,1234,D2:QR2,"">=1000""),B2,"""")"
.Value = .Value
End With
.Range("A:A").AutoFilter field:=1, Criteria1:="<>"
Range(.Cells(1, "A"), .Cells(lastRow, "A")).SpecialCells(xlCellTypeVisible).Copy wS.Range("A1")
.AutoFilterMode = False
.Range("A:A").Delete
End With
Application.ScreenUpdating = True
wS.Activate
MsgBox "完了"
End Sub 'この行まで//
※ 上記VBAでも砂時計がくるくる回る(「応答なし」になる)可能性がありますので
腕組して画面とにらめっこし待ってみてください。
※ 関数でないのでデータ変更があるたびにマクロを実行する必要があります。m(_ _)m
No.1
- 回答日時:
同じ行に金額コード1234が複数出てくる可能性はあるのでしょうか?
ある場合、名称****は複数回表示するのでしょうか?それとも何度出ようが同じ行なら1回なのでしょうか?
金額の所にも1234が含まれる可能性はあるのでしょうか?
金額は1000円以上か比較するだけで、抽出する必要はないということでよろしいでしょうか?
抽出したデータはどこにどのような形で表示するのでしょうか?
縦一列にずらっと並べるのでしょうか?抽出した列に合わせて横にも並べるのでしょうか?
それとも同じ行に複数回出た場合のみ横に並べるのでしょうか?
はたまた全てのデータを1つのセルに***1、***5、****・・・といったように入れるのでしょうか?
同じ行には最大1個で金額に1234が含まれないのであれば、以下の様にできると思います。
条件が曖昧なので式の詳細は省略して流れだけの説明をします。
(それ以外の条件の場合はもっと複雑になりますので、条件をきちんと確認した上で考えます)
まず、1234がその行にあるかどうかを判定し、ある場合はそのセルの位置を取得し、その隣のセルの値を1000と比較し、
1000以上であればこれが上から何個目の該当であるかを表示する。 という列①を作ります。
列①の右に、その行の名称を表示する列②を作ります。(先ほど作った列①を左端に挿入できるのでしたら、列②は不要です)
結果を表示したい所に、VLOOKUPを用いて①を検索して②を表示する式を作ります。
これを該当する数だけコピーすれば抽出完了です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで割り振りをする方法 7 2022/08/02 14:02
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
- Java Javaについて質問です。 勉強し始めたばかりの初心者です。 相続税について課税額を算出するコードを 1 2022/05/31 19:02
- その他(Microsoft Office) エクセルで1行の長いデータを指定の桁数で分割する方法が知りたいです。 4 2022/05/20 21:55
- Excel(エクセル) 別ファイルを開かず、INDIRECT関数を使用せずに、別ファイルのデータを求めたい 2 2023/01/17 15:54
- 数学 複利毎月積み立てで年利からの計算方法 3 2023/01/11 15:56
- Visual Basic(VBA) VBAで質問があります 1 2022/10/19 10:32
- Excel(エクセル) 関数を教えてください。 2 2023/08/01 10:59
- Excel(エクセル) エクセルで最初に値が入っているセルを見つける方法はありますか? 2 2023/07/18 14:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の文字列のいずれかが含ま...
-
Excelの入力規則で2列表示したい
-
列の数字に100をかけたい
-
SUMに含まれる範囲から特定のセ...
-
Excel上でのデータ数字が連番で...
-
別のセルに値が入力されたら、...
-
数式が入ったセルを含めて、数...
-
エクセル:横長の表を改行して...
-
エクセルでセルの値分の個数の...
-
入退社日より各月末の在籍者数...
-
エクセルで、毎日の走行距離(...
-
HYPERLINKとADDRESSとMATCHの組...
-
スペースとスペースの間の文字...
-
エクセルにデータを入力すると...
-
エクセルで表示されている数字...
-
時間を「昼間」と「夜間」に分...
-
エクセルで1列全部10倍したい
-
エクセルで小数を含む数値の抽出
-
エクセルで2行まとめて並び替...
-
EXCELのハイホン区切りの数字並...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数の文字列のいずれかが含ま...
-
Excelの入力規則で2列表示したい
-
SUMに含まれる範囲から特定のセ...
-
数式が入ったセルを含めて、数...
-
Excel上でのデータ数字が連番で...
-
スペースとスペースの間の文字...
-
エクセル:横長の表を改行して...
-
エクセルでセルの値分の個数の...
-
列の数字に100をかけたい
-
エクセルで表示されている数字...
-
VBA 同一シート内での転記の仕方
-
別のセルに値が入力されたら、...
-
エクセルのsumifでかけ算してか...
-
エクセルで曜日に応じた文字を...
-
Excelのセル内文字の並び替えに...
-
入退社日より各月末の在籍者数...
-
HYPERLINKとADDRESSとMATCHの組...
-
エクセルで小数を含む数値の抽出
-
Excel 漢字二文字の先頭と最後 ...
-
エクセルにデータを入力すると...
おすすめ情報
すみません、仕事で帰りが遅くなり返信が遅れました。
説明が不足していて、すみませんでした。
同じ行に金額コードは複数は出てきません。あるか、ないかで一つだけです。
金額のところには、1234のコードは表示されず金額のみが表示されています。
金額は抽出(表示)されていなくても、1000円以上か比較できていれば大丈夫です。
抽出したデータは縦一列に並んでいればいいです。
該当する行の、名称(***1や-***2)が縦一列に並んでいるものが希望です。
回答いただいた内容で理想のような感じですので、どの関数や数式を使えばいいか教えていただけると助かります。ありがとうございます。
ありがとうございます!処理結果、理想です。
ただ、この数式をコピーできない環境にデータがありまして(ネットワークから断絶された端末内)、(見ながら手入力すればいいんだとは思いますが)できればマクロを使用しないでできればありがたいです。
質問の時点で説明が不足していて申し訳ありません。
ありがとうございます。
すみません、名称は1234になることはありませんが、金額は1234円になることはありました。。
そうすると、前提が狂ってしまいますよね。
そうすると他の方の回答も金額1234円を拾ってしまうということになりますね。。私が質問の時にちゃんと前提を詳細に書いていなくて申し訳ありませんでした。
1列おきに指定ができるでしょうか。。
ありがとうございます!実際のファイルと同じ形式のテストデータにB2:ZY2などの範囲を合わせて貼り付けてみたのですが、「入力した数式は正しくありません。」とメッセージが出てきてしまいます(汗)実際に貼り付けた画像を添付しました。何度もすみません(汗)
返信が遅くてすみません(汗)
入力した数式は以下です。
=IF(SUMPRODUCT((MOD(COLUMN(B2:GR2),2)=0*1,(B2:GR2=1234)*1,(C2:GS2>=1000)*1)>0,GU1+1,GU1)
ありがとうございます!エラーでなくなりました!
そして何度も何度もすみません(滝汗)
すべて0になってしまいます。数式の説明をきくと理想なので、これでできると助かるのですが。。