• ベストアンサー

VBAエクセル、項目検索からデータ抽出

お世話になります。早速ですがsheets("データ元").Range("A2")にNo.、Range("B2")に日付、Range("C2")に曜日、Range("D2")に項目、Range("E2")に詳細、Range("F2")に金額があり A3~F3以下LastRowまでデータが入っています。 Range("D3")以下LastLowの中から1会社名を検索するとその会社名すべてのデータが新規ブックSheet1に書き出され、そのシートのRange("G3")に合計額を出す構文をどなたかご教示ください宜しくお願いします。エクセル2003と2013を各パソコンで使用しています。

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

  • ベストアンサー
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

AdvancedFilterでやってみました。 #確認はExcel2010でしかやっていません。 Sub Sample() '新規ブック追加 Workbooks.Add '抽出条件を新規ブックに仮作成   Range("H1") = ThisWorkbook.Sheets("データ元").Range("D2")   Range("H2") = "会社名" '←抽出する会社名   sNewBook = ActiveWorkbook.Name   'AdvancedFilterで抽出   With ThisWorkbook.Worksheets("データ元")     nLastRow = .Cells(Rows.Count, 1).End(xlUp).Row     .Range("A2:F" & nLastRow).AdvancedFilter _       Action:=xlFilterCopy, _       CriteriaRange:=Workbooks(sNewBook).Sheets("Sheet1").Range("H1:H2"), _       CopyToRange:=Workbooks(sNewBook).Sheets("Sheet1").Range("A2")   End With      '新規ブックの抽出条件を消して、合計金額を入れる   With Workbooks(sNewBook).Sheets("Sheet1")     .Range("H1:H2").Clear     .Range("G3") = WorksheetFunction.Sum(Range("F:F"))   End With End Sub

nebikitorikai
質問者

お礼

できました有難うございます。 少し触らせていただきましたごめんなさい、感謝しています '新規ブック追加 Workbooks.Add '抽出条件を新規ブックに仮作成 Range("H1") = ThisWorkbook.Sheets("データ元").Range("D2") Range("H2") = InputBox("") '←抽出する会社名 sNewBook = ActiveWorkbook.Name 'AdvancedFilterで抽出 With ThisWorkbook.Worksheets("データ元") nLastRow = .Cells(Rows.Count, 1).End(xlUp).Row .Range("A2:F" & nLastRow).AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Workbooks(sNewBook).Sheets("Sheet1").Range("H1:H2"), _ CopyToRange:=Workbooks(sNewBook).Sheets("Sheet1").Range("A2") End With '新規ブックの抽出条件を消して、合計金額を入れる With Workbooks(sNewBook).Sheets("Sheet1") .Range("H1:H2").Clear .Range("G3") = WorksheetFunction.Sum(Range("F:F")) End With Sheets("Sheet1").Columns("A:F").EntireColumn.AutoFit

その他の回答 (6)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.7

No1です。 会社 = "1会社名" の"1会社名"の部分にInqutBoxの値を セットしましたか?

nebikitorikai
質問者

お礼

有難うございました。感謝です

nebikitorikai
質問者

補足

やってみましたが結果は同じです。ほかの方も教示を待っていると思いますので、また回答No.3のmt2015 さまのマクロで動作していますのでそちらを組み込んでいこうと思います。長いことお付き合いさせてしまってごめんなさい。

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

#2です。#2で書いた4つのロジックのほかにもう一つ思い出したので書いておきます。 あくまでそういう方法もあるということ。 紙の表があってコンピュターがない時代は、下記のような手順でやっていたと思う。 小生は昔、表を1行=社ずつカッターで切り離し、その会社だけを別にして、、別の白紙にその会社分だけ張り付けていたこともある。それをコンピュターでやったもの。 (5)ソート法 データを注目している検索データのある列でソート。 望む該当の初出行をFindメソッドで見つけ、件数をCountif関数で見つけ、 その範囲をSheet2にコピー貼り付けする。 例データ ソート後 Sheet1(ソート前は本当はバラバラのデータ) 会社 計数 aa 1 aa 5 aa 4 aa 6 b 3 b 1 b 2 b 2 c 22 c 3 d 3 f 44 s 2 v 11 x 5 標準モジュールに Sub Macro1() Worksheets("Sheet1").Range("A1").Select lr = Range("A10000").End(xlUp).Row '--- ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A2:B" & lr) 'データ範囲。 .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With '--以上ソートのマクロの記録をそのまま参考にすした lr = Range("A10000").End(xlUp).Row 'MsgBox ”データ最終行=" & lr Set x = Worksheets("Sheet1").Range("A1:B" & lr).Find("b") 'bに探している会社名などを指定 xr = x.Row MsgBox "最初行=" & xr 'x.Address k = WorksheetFunction.CountIf(Worksheets("Sheet1").Range("A1:B" & lr), "b") MsgBox "bの存在行数・件数=" & k Worksheets("Sheet1").Range("A" & xr & ":B" & (xr + k - 1)).Select Selection.Copy Worksheets("Sheet2").Range("a2") End Sub 実行後 結果 Sheet2 b 3 b 1 b 2 b 2

nebikitorikai
質問者

お礼

有難うございました。

nebikitorikai
質問者

補足

エラーが出ますがどのあたりでと聞かれても答えられません、ごめんなさいこの数式は諦めます。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.5

No1です。    nBk.SaveAs _     Filename:=dBk.Path & "\集計" & Format(Now(), "yyyymmdd hhmmss") & ".xls", _     FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _     ReadOnlyRecommended:=False, CreateBackup:=False を    nBk.SaveAs _     Filename:=dBk.Path & "\集計" & Format(Now(), "yyyymmdd hhmmss") & ".xls", _     FileFormat:=56, Password:="", WriteResPassword:="", _     ReadOnlyRecommended:=False, CreateBackup:=False     nBk.Close と差し替えて実行してみて下さい。

nebikitorikai
質問者

お礼

有難うございます。

nebikitorikai
質問者

補足

差し替えましたが、今度は対象データ無しとなります。私の説明不足だと思うのですが、sheets("データ元").Range("A2")にNo.、Range("B2")に日付、Range("C2")に曜日、Range("D2")に項目、Range("E2")に詳細、Range("F2")に金額。 以下A3~F3各LastRowまでデータが入っています。 Range("D3")以下LastLowの中から会社名をインプットボックスに入力するとRange("D3")以下のデータの中から入力された会社のデータすべてがWorkBooks.AddのSheets("Sheet1")に書き出すようにしたいのですが...

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

#2の補足のことだが、Pivotを使う方法もマクロの記録を取って、適当に変更部分を 自由にする変更をしたり、結果を印刷することもできるよ。 だいたい、ここに丸投げ的に質問するまでもなく、フィルター法などは、マクロの記録を取ればVBAコードがわかるはず。マクロの記録という方法があるのは知っているだろうね。

nebikitorikai
質問者

お礼

ご指摘有難うございます、感謝しています

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

VBAでも、4つぐらい方法が考えられる。関数でもできるが(略)。 総なめ法 (1)第2行からLastLowまで1行づつ、会社名(第何列か?Noは会社のNOか?質問にはっきり書くこと)を判別し、一致したものは書き出すとか金額を足しこむ。全会社について行うなら、会社NOを配列に出も持って、その会社該当の配列要素に金額を足しこむ。 Find法 (2)第2行からLastLowまで会社名で可視社名のある列でデータを探し、見つかった行で書き出すか金額を足しこむ。 Filter法 (3)会社名でフィルタして、金額合計を出す PIVOTTable法 (4)ピボットテーブルでNoごとに表を作れば、前者の合計データが出る。明細も出せる。会社の限定・任意選択も操作で容易。 (4)は操作が便利だが、マクロの記録やVBAのPivottabls.Addでできる。 元データ 会社NO 金額 1  1 2  2 4  1 5  3 2  2 3  5 6  6 1  1 2  2 とする。 挿入ーピボットテーブルーOK 行へNO、Σ値へ金額をそれぞれD&D 結果 行ラベルをクリックして、2,6をチェック 結果 2,6だけフィルタされて 行ラベル 合計 / 金額 2 6 6 6 総計 12 明細を出したかったら 仮に空き列に行番号を振って 会社NO 金額 行 行番号 1 1 1 2  2  2 4  1  3 5  3  4 2  2  5 3  5  6 6  6  7 1  1  8 2  2  9 行に会社NO次に行番号をD&D、Σ値に金額をD&D ピボットでやりだしたら、VBAでやるなど「ちゃんちゃら」手数がかかる。

nebikitorikai
質問者

お礼

有難うございました

nebikitorikai
質問者

補足

ご指摘有難うございます。Noは行番号です、ピボットのご教示有難うございます。今回はピボット抜きの作成を考えています、ワンクリックで印刷まで持っていきたいからです。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは Sub test()   Dim dBk As Workbook   Dim dSh As Worksheet   Dim nBk As Workbook   Dim 会社 As String      Set dBk = ThisWorkbook   Set dSh = dBk.Worksheets("データ元")   Set nBk = Workbooks.Add      会社 = "1会社名"      With dSh     .AutoFilterMode = False     With .Range("A2:F" & .Range("A" & Rows.Count).End(xlUp).Row)       .AutoFilter Field:=4, Criteria1:=会社       With .SpecialCells(xlCellTypeVisible)         If .Rows.Count > 1 Then           .Copy nBk.Worksheets("Sheet1").Range("A2")                      With nBk.Worksheets("Sheet1").Range("G2")             .Formula = "=SUBTOTAL(9,F:F)"             .Value = .Value           End With                      nBk.SaveAs _             Filename:=dBk.Path & "\集計" & Format(Now(), "yyyymmdd hhmmss") & ".xls", _             FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _             ReadOnlyRecommended:=False, CreateBackup:=False         Else           MsgBox "対象データ無し"           nBk.Close False         End If       End With     End With     .AutoFilterMode = False   End With End Sub こんな感じでしょうか?

nebikitorikai
質問者

お礼

ご教示有難うございます。(尚、エラーは実行時エラー1004 SaveAsメソッドは失敗しました。ワークブックオブジェクトです。)

nebikitorikai
質問者

補足

nBk.SaveAs _ Filename:=dBk.Path & "\集計" & Format(Now(), "yyyymmdd hhmmss") & ".xls", _ FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False 有難うございます上記でエラーが出ます203,2013共。宜しくお願いします

関連するQ&A

  • エクセルVBA シートにある日付1週間分転記

    お世話になります、Sheet1,Range(”A3")からFirstRow、Range(”A")にナンバーSheet1Range(”B")に日付Range(”C")に曜日Range(”D3")に会社名Range(”E")に行先名があります。 Sheet1Range(”B")にある日付1週間分をsheet2~sheet8に転記。sheet2には今日の日付をsheet3には翌日の日付を~sheet8までそれぞれ1週間分転記し、これを1日ごとクリアーかデリートしてから更新する構文をどなたかご教示お願いします。

  • エクセルのマクロで検索・抽出したデータを修正及び更新して元データに反映

    エクセルのマクロで検索・抽出したデータを修正及び更新して元データに反映させたい。 Sheet1に元データが行単位で入力されています。。   A   B    C    D    E F 1 日付 顧客名 契約料 担当 回収日 回収金額 2 3 | 50 Sheet2で複数条件でフィルタオプションをマクロで実行し結果を表示ています。   A    B    C   D    E 1 日付~ 日付マデ 顧客名 担当者 2 1/1   2/28     高橋      --------->検索条件 3 4 日付 顧客名 担当 回収日 回収金額 5 -------------------------------------->抽出結果 6 -------------------------------------->抽出結果 7 -------------------------------------->抽出結果 マクロは下記の通りです。 Public Sub 検索() Dim myRow1 As Long, myRow2 As Long '----Sheet1とSheet2のA列で最終行を捜します。 myRow1 = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row myRow2 = Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row '----Sheet2のA5以下が入力されていたらクリアします。 If myRow2 >= 5 Then Sheets("Sheet2").Range("A5:P" & myRow2).ClearContents End If '----フィルタオプションの設定で抽出します。 '----元データはSheet1、抽出条件はSheet2のA1:D2、抽出先はSheet2のA4:E4です。 Sheets("Sheet1").Range("A1:F" & myRow1).AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Sheets("Sheet2").Range("A1:D2"), _ CopyToRange:=Sheets("Sheet2").Range("A4:E4"), _ Unique:=False End Sub 抽出結果の各セルデータを必要に応じて変更・修正(選出結果を直に)をしそれを元データ に反映(上書き?)させるようなマクロを作成したいです。 どなたかご指導よろしくお願いいたします。 うまく説明できないので画像を添付します。

  • エクセルVBA Range3か所に合致する合計額

    お世話になります。エクセルRange("A")からRange("L") & LastRowまで入力してあります。 Range("B3")列以下には会社名Range("D3")列以下には班名Range("J3")列以下には品名がありRange("L3")列以下に合計額が入力されています。 この入力された中から(A,D,Jに合致する合計額)これをWorkBooks.Add  sheets("sheet1").Range("A2")に出力したいのです.どなたか宜しくお願いします。

  • excel vba DATAの日集計

    excel vba DATAの日集計 いつもお世話になっています。 "DATA"シートのセル"D2"の日付を変えると表の数値が変わるようにしています。 その日毎のデータを"集計"シートの日別の表に飛ぶようにしているのですが、 1日分の転記するセル数が多く、Select Caseで31日分のコードを書くと、あまりにも プロシージャーが大きくなります。(Case1からCase31・・・結果分割してますが) FOR NEXT なのかな~、もっと効率のいい書き方がありましたらよろしくお願いします。 例:"集計"シート1日分は、9行となります。それぞれ"DATA"シートからの転記です。"DATA"シートのF5+F10,G5+G10~AC5+AC10までそれぞれの値を"集計"シートのG5からAD5まで、F6+F12,G6+G12~AC6+AC12までそれぞれの値を"集計"シートのG13からAD13までといった具合です (日の9行はそれぞれ決まったある行とある行の加算です、これが31日分の行があります) Sub macro() Dim myrng As Range Dim c As Range Set myrng = Sheets("DATA").Range("D2") For Each c In myrng Select Case c.Value Case 1 '1行目 Sheets("集計").Range("G5").Value = Sheets("DATA").Range("F5") + Sheets("DATA").Range("F10") | | Sheets("集計").Range("AD5").Value = Sheets("DATA").Range("AC5") + Sheets("DATA").Range("AC10") | | '9行目Sheets("集計").Range("G13").Value = Sheets("DATA").Range("F6") + Sheets("DATA").Range("F12") | | Sheets("集計").Range("AD13").Value = Sheets("DATA").Range("AC6") + Sheets("DATA").Range("AC12")

  • エクセルVBA来年成人式を迎える人の抜出

    お世話になります。Range("C3")からLastRowまで生年月日が入りRange(”D3")からLastRowまで氏名が入っています。ここから来年成人式を迎える方のデータを新規ブックに抜出したいのですが何方かご教示お願いします

  • エクセルVBA  どうしても動きません。

    お世話になります。 なかなか上達しない超初心者です。 ↓↓ですが、Activesheetにすると動くのに、シート名を元々存在するシート”実験"に指定すると動きません(データ内容はまったく同じで、A列に色んな名前が入っていて、重複しているとC列に重複と入力します)。 2日間試行錯誤したのですが、やっぱり動かず・・・ ちなみに、Activateにするとアクティブになるし、CurrentRegionも選択できるのに なんでうごかないんでしょうか・・・ 何卒ご指導くださいませ。よろしくお願いいたします!!!!!! Sub Test2() With Sheets("実験").Range("A1").CurrentRegion Dim i As Long Dim LastRow As Long LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To LastRow If WorksheetFunction.CountIf(Range("A:A"), Cells(i, 1)) > 1 Then Cells(i, 3) = "重複" End If Next i End With End Sub Sheets("実験")をActivesheetに変えると別のシートがしっかり動いてくれます・・・が、なんとしてでも”実験”シートに動いていただきたいです・・・。

  • VBAによる検索、置換

    新しい台帳を作ろうとしています。 2つのシートを用いてデータベース(シート1)そのデータを日別に抽出したもの(シート2)を使い作業をしたいと思ってます。 1ブックにつき、一ヶ月分を入力するが月末には約1000件にもデータが増えてしまう。シート1には一ヶ月通して全件表示(+随時追加可能)。しかし、シート1には未入力セルがある。シート2には日付毎に抽出転記。入力内容の変更・訂正や更新は、シート2で行いたい。シート2では入力内容が判明し次第、随時入力しシート1へ反映させたい。 シート1 A B C D E 1 No. 日付 顧客 商品名 依頼先 2 1  1/2 **商店 N-01 (  ) 3 2  1/4 **商店 M-50 (  ) 4 3  1/5 ++販売 O-04 (  ) 5 4  1/4 --産業 H-07 (  ) 6 5  1/6 ##商事 M-50 (  ) 7 6  1/4 ++販売 A-30 (  ) ※そこへ日付「1/4」を選択する シート2 A B C D E 1 No. 日付 顧客 商品名 依頼先 2 2  1/4 **商店 M-50 (  ) 3 4  1/4 --産業 H-07 (  ) 4 6  1/4 ++販売 A-30 (  ) 5 ※依頼先が決まりこれを少し編集,追加し シート2 A B C D E 1 No. 日付 顧客 商品名 依頼先 2 2  1/4 **商店 M-500 "○○店" 3 4  1/4 --産業 H-07 "▲▲会社" 4 6  1/4 ++販売 A-300 "○○店" 5 終了… シート1 A B C D E 1 No. 日付 顧客 商品名 依頼先 2 1  1/2 **商店 N-01  (  ) 3 2  1/4 **商店 M-500 "○○店" 4 3  1/5 ++販売 OS-04 (  ) 5 4  1/4 --産業 H-07 "▲▲会社" 6 5  1/6 ##商事 M-500 (  ) 7 6  1/4 ++販売 A-300 "○○店"  "日付を操作できるマクロボタンがある" ボタンをクリックするとシート1の内容をシート2へ再更新するようになっている。 日付を記載しているセルがあり、マクロボタン1をクリックすると日付が進み、マクロボタン2だと戻るように なっている。  現行VBA Sub ReturnDate() Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets("運行台帳").Range("C65536").End(xlUp).Row myRow2 = Sheets("日別抽出").Range("C65536").End(xlUp).Row Sheets("日別抽出").Range("F4").Value = Format(DateValue(Sheets("日別抽出").Range("F4").Value) _ - 1, "yyyy/mm/dd") If myRow2 >= 6 Then Sheets("日別抽出").Range("C6:AB" & myRow2).ClearContents End If Sheets("運行台帳").Range("C6:AB" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("F3:F4"), CopyToRange:=Range("C6"), Unique:=False End Sub 上記フォームを用いたうえで追加処理は次のとおりです(出来ないところ)  (1)上記載のシート2からコピーしてシート1へ貼り付けたいときにどのようにしたらいいのか? ※(2)シート1→シート2のフィルタコピペでは抜粋するだけだが逆の時には行番号が不確定である。不確定の行を指定できる方法は? 長々と申し訳ございません。宜しくお願いします。

  • エクセルVBA記録から月毎の抽出

    お世話になります、A3にナンバー、B3に日付、C3に曜日、D3に項目、E3に詳細、F3に金額が、ここからデータFirstRowとして入力されていきます。入力されたデータから月毎12枚のシートに抽出していきたいのですが何方かご教示お願いします。できましたら年別も抽出出来たらうれしく思います。宜しくお願いします

  • エクセルVBAでデータ検索の方法

    自分は技術者ではないのですがエクセルのVBAで質問があります。 エクセルで作ったデータをフォームから検索して一件ずつ表示するにはどうしたらよいでしょうか? 途中まで作ったのですが、自分の方法としては「シート1」にあるデータを変数に入れ、その変数をフォームに出力させるというものなんですが、もっと簡単な方法はないでしょうか? 変数a = 2 : 変数b = 1 For 変数a = 2 To 65536 If Sheets("シート1").Range("A" & 変数a) = Empty And 変数a = 2 Then MsgBox "データがありません" GoTo 終わり ElseIf Sheets("シート1").Range("A" & 変数a) <> Empty Then 項目1(変数b) = Sheets("シート1").Range("A" & 変数a) 項目2(変数b) = Sheets("シート1").Range("B" & 変数a) 項目3(変数b) = Sheets("シート1").Range("C" & 変数a) 変数b = 変数b + 1 ElseIf Sheets("シート1").Range("A" & 変数a) = Empty Then GoTo 終わり End If Next 終わり: こんな感じにしたいです。↓ ​http://hp1.cafesta.com/hp/album_photo_read.do?hpid=miya05&menu_...​

  • エクセルマクロ 抽出したデータを別のシートへコピーしたい

    マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 【1】シート名「データ」をA列でオートフィルタ抽出して、別シートにコピーする。 【2】別シートにコピーしたデータに外枠罫線をつける。 【3】シート名「データ」には塗りつぶしがあるので、別シートにコピーされた塗りつぶしは「なし」する。 【4】シート名「Sheet1」の1~2行目をコピーし、別シートの1~2行目に挿入し、シート名「データ」に戻る。 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、今はコピーして「あ行」の部分を書き換えています。(かなり面倒です) 最終的には、抽出されたそれぞれのシートを別々のブックにしたいとも思っています。 長々とすみませんが、どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 Sheets("データ").Select Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ行", Operator:=xlAnd Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy Sheets("あ行").Select Range("A1").Select ActiveSheet.Paste Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells.Select Selection.Interior.ColorIndex = xlNone Sheets("Sheet1").Select Rows("1:2").Select Selection.Copy Sheets("あ行").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown Range("A1").Select Sheets("データ").Select Range("A1").Select

専門家に質問してみよう