• 締切済み

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のフィルタコピペでは抜粋するだけだが逆の時には行番号が不確定である。不確定の行を指定できる方法は? 長々と申し訳ございません。宜しくお願いします。

みんなの回答

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.3

続きです。 ↓日別抽出シートで更新したデータの転記 Sub ExtrShtCopyToDataSht()   Dim DataSht As Worksheet   Dim ExtrSht As Worksheet   Dim Target As Range   Set DataSht = Worksheets("運行台帳")   Set ExtrSht = Worksheets("日別抽出")   With ExtrSht.Range("A1").CurrentRegion     .Resize(.Rows.Count - 1).Offset(1).Cut _       Destination:=DataSht.Range("A" & _         DataSht.Rows.Count).End(xlUp).Offset(1)     .Clear   End With   Set ExtrSht = Nothing   With DataSht     Set Target = .Range("A1").CurrentRegion     .Range("A1").AutoFilter Field:=5, Criteria1:="更新中"     .AutoFilter.Range.Offset(1).ClearContents     .AutoFilterMode = False     Target.Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes     .Activate   End With   Set DataSht = Nothing End Sub

fourpiece9
質問者

お礼

ご丁寧な回答ありがとうございました。 貼り付けてみましたが、エラーになってしまい解決に至りませんでした。これはOtenkiAmeさんに申し訳ないのですが、私の知識がないばかりに、活かすことが出来ていないところに原因がありまして... また、違う形式で再度質問を投げかけてみようと思います。 どうもありがとうございました。

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.2

こんにちは。 サンプルデータの位置と提示されたマクロのセル位置の関係が分かないのでサンプルデータのみで考えた参考処理です。 No.だけで整合性をとるなら、フィルタをかけたデータを運行台帳シートから日別抽出シートに転記する時、依頼先に“更新中”とFlagを立てておきます。 そして、更新したデータを日別抽出シートから運行台帳シートに転記した時、“更新中”データを削除して並べ替えたら如何でしょうか? ↓運行台帳シートでフィルタをかけたデータの転記 Sub DataShtCopyToExtrSht()   Dim DataSht As Worksheet   Dim ExtrSht As Worksheet   Dim Target As Range   Set DataSht = Worksheets("運行台帳")   Set ExtrSht = Worksheets("日別抽出")   With DataSht     With .Range("A1").CurrentRegion       For Each Target In .Resize(, 1).Offset(, .Columns.Count - 1)         If Target.Value = "更新中" Then           DataSht.AutoFilterMode = False           DataSht.Columns("E:E").AutoFilter Field:=1, Criteria1:="更新中"           MsgBox Prompt:="更新中のデータがあります。", _             Buttons:=vbExclamation, Title:="転記中止"           Application.Goto Reference:=ExtrSht.Range("A1"), Scroll:=True           DataSht.AutoFilterMode = False           Exit Sub         End If       Next Target     End With     If .AutoFilterMode = True Then       If .AutoFilter.Range.Rows.Count > 2 Then       ExtrSht.Cells.Clear       .Range("A1").CurrentRegion.Copy _           Destination:=ExtrSht.Range("A1")       Application.Goto Reference:=ExtrSht.Range("A1"), Scroll:=True       Set ExtrSht = Nothing       With .AutoFilter.Range         .Resize(.Rows.Count - 1, 1).Offset(1, _           .Columns.Count - 1).Value = "更新中"       End With       End If       .AutoFilterMode = False     End If   End With   Set DataSht = Nothing End Sub 続く。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

シート2の必要性が質問から読み取れませんでした オートフィルタでシート1の日付を抽出すれば シート2と同じ結果になるのでは? データ変更後にオートフィルタを解除すれば シート1は希望の結果を得られるのではと思いますが? 何か理由があってシート2を使用したいのであれば 簡単な方法を一つ シート1からデータを抽出してシート2へコピーした後 シート1の抽出したデータ行を削除する シート2のデータを変更等の入力を行う シート2のデータをすべてシート1の最終行へコピーする シート1のNO.項目で並べ替えを行う この様にすれば比較的簡単なコードで処理できると思います 以上参考まで

fourpiece9
質問者

お礼

ヒントのご提供ありがとうございます。 筋道を導いていただいたお陰で色々と模索中ではありますが 完成に向けてぼちぼちやっております。 ホントに知識が無いので、どういったコードを入力したら良いのかもよく判りませんが、試行錯誤しながら引き続きやってみます。 ありがとうございました。

関連するQ&A

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

    エクセルのマクロで検索・抽出したデータを修正及び更新して元データに反映させたい。 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 抽出結果の各セルデータを必要に応じて変更・修正(選出結果を直に)をしそれを元データ に反映(上書き?)させるようなマクロを作成したいです。 どなたかご指導よろしくお願いいたします。 うまく説明できないので画像を添付します。

  • フィルタオプションの設定の条件における文字について

    フィルタオプションの設定の検索条件範囲で指定した条件が半角・全角や大文字・小文字にかかわらず抽出するということはできますか? 商品情報というブックがあり、抽出シート(1枚目)と2枚目のシートにデータが入っています。 2枚目のシートのフィールド名を抽出シートのA1を基準に貼り付けています。 条件をA1:I3あたりに入力し、2枚目のシートの条件に合うものを抽出シートのA5以降に取り出すマクロを書いています。次回マクロを起動させたときにA5以降にデータがあれば削除させます。 いろいろな方に教えていただいて下記のようにできあがったのですが、ちょっと問題があって 質問しています。 Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets(2).Range("A" & Rows.Count).End(xlUp).Row myRow2 = Sheets("抽出").Range("A" & Rows.Count).End(xlUp).Row If myRow2 >= 5 Then Sheets("抽出").Range("A5:I" & myRow2).ClearContents Sheets("抽出").Range("A5:I" & myRow2).ClearFormats Sheets(2).Range("A1:I" & myRow1).AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Sheets("抽出").Range("A1").CurrentRegion, _ CopyToRange:=Sheets("抽出").Range("A5"), Unique:=False End Sub 現状では元データが全角だと半角で入力すると抽出されず、元データが小文字だと大文字は抽出されません。 いちいち元データの状態を把握しての検索になってしまいます。 このマクロを修正して全角・半角もしくは小文字・大文字にかかわらず抽出できるようにすることは可能でしょうか? どなたかご存知の方がいらっしゃれば教えていただけないでしょうか?

  • 【エクセルVBA】データの振り分けについて。

    エクセルVBAでのデータの振り分けについて教えて下さい。 シート(1)のA列には他のファイルから抽出したデータがあります。 各行のデータの中に、H20年度が含まれている場合はシート(2)のA列に移動させ、H21年度が含まれている場合にはシート(2)のC列に移動させたいと思っています。 以前に sheets(1).Range("H40").Value Like "*○○*" Then sheets(2).Range("H40").Value = 0 sheets(1).Range("G" & myRow).End(xlUp).Offset(1, 0).Value = _ sheets(2).Range("H40").Value こういうものを使ったことがある為これを応用するといいのかなとも思ったのですが、わからなくなってしまい質問させていただきました。 勉強不足ですいません。 教えて頂けないでしょうか。よろしくおねがいします。

  • VBA 重複する番号があるときは値を貼り付けない

    すみません。 理解しているのが少しなので、ちょっとシンプルなVBAを書いています。 1つのブックに 登録シート =Sheets("登録")           顧客情報シート=Sheets("顧客情報")          販売情報シート=Sheets("販売情報")          売り上げシート=Sheets("売り上げ") 登録シートのボタンを押すと、登録シートに入力した情報が、 各シートに分かれて値が入るようにしています。 下記がコードです。 Private Sub CommandButton1_Click() Dim row As Integer ★★★ row = WorksheetFunction.CountA(Sheets("顧客情報").Columns(2)) + 1 Sheets("顧客情報").Cells(row, 2).Value = Range("A2").Value Sheets("顧客情報").Cells(row, 3).Value = Range("A5").Value Sheets("顧客情報").Cells(row, 4).Value = Range("B8").Value ★★★ row = WorksheetFunction.CountA(Sheets("販売情報").Columns(2)) + 1 Sheets("販売情報").Cells(row, 2).Value = Range("C26").Value Sheets("販売情報").Cells(row, 3).Value = Range("J1").Value row = WorksheetFunction.CountA(Sheets("売り上げ").Columns(2)) + 1 Sheets("売り上げ").Cells(row, 2).Value = Range("H1").Value Sheets("売り上げ").Cells(row, 3).Value = Range("K6").Value End Sub もっと簡単な書き方あるよ。。。と言われるでしょうが、 私が理解して修正等ができるのが、上記でした。。 やりたいことは、2点です。 (1)重複は貼り付けをしない。  登録シートのセル A2に入った数字が、顧客情報シートのB列のどこかに、  既に入力がされていた場合は、★★★で囲まれた部分の値を貼り付けず、  その先の販売情報のシートに貼り付ける作業へと進めたい。  IF などを使えばできますでしょうか?   (2)各シートに入力したものを貼り付けた際、A2より下から順番に各シートのCells(row, 1)の位置に、連番をつけたい。 何卒宜しくお願い申し上げます。

  • VBAでエラー時にメッセージを表示したい

    こんばんわ! エクセルのVBAについて質問です。 以下のように組み込みDATAシートからフィルターをかけて抽出シートへ結果を表示するようになっていますが、DATAシートにデーターがない状態でするとエラーになりますがその際にDATAシートにデーターが入っていませんとメッセージボックスが出る様にするにはどうすればいいでしょうか? まだまだ勉強中の身ですので教えて頂ければ有難いです。 お手数ですが宜しくお願いします。 Sub 抽出() Application.ScreenUpdating = False Sheets("抽出").Activate Cells.Clear Sheets("抽出").Range("A1").Value = Sheets("DATA").Range("A2").Value Sheets("抽出").Range("B1").Value = Sheets("DATA").Range("B2").Value Sheets("抽出").Range("C1").Value = Sheets("DATA").Range("C2").Value Sheets("抽出").Range("D1").Value = Sheets("DATA").Range("D2").Value Sheets("DATA").Range("A3").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Sheets("検索").Range("A1:D2"), _ CopyToRange:=Sheets("抽出").Range("A1"), _ Unique:=False Sheets("抽出").Columns("A:D").AutoFit Application.ScreenUpdating = True End Sub

  • フィルタオプション設定をVBAで処理したものに、さらに連番(ナンバリング)もされるようにVBAを作成し直したい。

    よろしくおねがいします。 フィルタオプション設定を下記のようにVBAにて既に作成したものがあります。(ボタンをクリックするだけで、データが抽出されるようにしてあります。) Sub Macro1() Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets("職員名簿").Range("B65536").End(xlUp).Row myRow2 = Sheets("東京都").Range("B65536").End(xlUp).Row If myRow2 >= 5 Then Sheets("東京都").Range("B5:T" & myRow2).ClearContents End If Sheets("職員名簿").Range("A2:S" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("データ").Range("A2:F32"), CopyToRange:=Range("B5:T5"), _ Unique:=False End Sub この実行時に、A列に抽出されたデータの件数を自動的に1からの連番にて入る(ナンバリングされる)ように、VBAを追加作成し直したいのですが、 どうしたら良いか分からず、教えていただきたいと思います。 既に作成してある、VBAを実行した後に、A列のセル一つ一つに、 =SUBTOTAL(3,B$6:B6) などのように、関数を入れて抽出した行分、コピーしていけばいいのではないか。とおっしゃるかもしれませんが、 作成は私の仕事なのですが、実際これを使っていくのは、私ではなく上司なので(エクセル超初心者で使いこなせない)、 データ抽出と同時に、A列に番号が連番されていくように、 ボタン一つで、データ抽出とナンバリングができるように、 VBAを追加作成し直したいのです。 どういう命令文を追加すればよろしいのでしょうか。 よろしくおねがいいたします。

  • オートフィルタをマクロで書いたのですが、一部うまくいかなくて困っていま

    オートフィルタをマクロで書いたのですが、一部うまくいかなくて困っています。 わかる方がいらしたらぜひご教授ください。 商品情報というブックがあり、抽出シート(1枚目)と2枚目のシートにデータが入っています。 2枚目のシートのフィールド名を抽出シートのA1を基準に貼り付けています。 条件をA1:I2に入力し、2枚目のシートの条件に合うものを抽出シートのA5以降に取り出すマクロを書いています。次回マクロを起動させたときにA5以降にデータがあれば削除させます。 そこで問題なのですが、A1:I2の条件だとA列からI列までのフィールド名に対する条件を 1行入力することができますが、同じ行になるのでAND条件になってしまいます。 本当は条件列をI3までにして、条件を2行にわたって書いて または条件も検索したいのです。 ただ、または条件は入力する場合と入力がない場合があります。 条件をA1:I3(3行目)に変更してマクロを実行すると、または 条件がある場合はちゃんとでるのですが、条件がない場合はすべてでてきてしまいます。 どのようにすればA1:I3に変更して、2行目と3行目に条件があった場合はその条件で該当するものを 抽出し、特に3行目に条件がない場合は2行目だけの条件で抽出できるのでしょうか? (2行目のAnd条件検索と3行目のまたは条件検索ができますでしょうか?) Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets(2).Range("A" & Rows.Count).End(xlUp).Row myRow2 = Sheets("抽出").Range("A" & Rows.Count).End(xlUp).Row If myRow2 >= 5 Then Sheets("抽出").Range("A5:I" & myRow2).ClearContents Sheets("抽出").Range("A5:I" & myRow2).ClearFormats End If Sheets(2).Range("A1:I" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Worksheets("抽出").Range("A1:I2"), CopyToRange:=Sheets("抽出").Range("A5"), Unique:=False End Sub

  • フィルタ オプションの設定(データ抽出) マクロ

    マクロを使って、「sheet1」のデターを「sheet2」へ抽出するのですが、Webで最適なものがあったので、その指示通りにやりました。その例題は再現できました。しかし、それを自分に合うように設定し直すとどうしてもできません。そこで気づいたのは、「No. 月日 項目名 収入 支出 摘要 購入店名」の各セルが何らかの関係があるのではと思ったのです。この項目を変えたて自分独自のものにしたいのですが、変えたり消してしまうと抽出できません。どこをどのようにしたらよいのか教えて頂けませんか。 Sub Macro2() Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets("Sheet1").Range("B65536").End(xlUp).Row myRow2 = Sheets("Sheet2").Range("B65536").End(xlUp).Row If myRow2 >= 5 Then Sheets("Sheet2").Range("B5:H" & myRow2).ClearContents End If Sheets("Sheet1").Range("B2:H" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("B2:B3"), CopyToRange:=Range("B5"), Unique:=False End Sub

  • vba 記述をスマートにしたい

    お世話になります。 以下の記述をもっと簡略化させたいのですが、 列とシートが違うだけで、同じ処理を2回しているだけなので、 出来そうで、自分では出来ませんでした。 どなたかご教示頂きたく宜しくお願い致します。       記 Set myrngv = Workbooks("A.xls").Sheets("sheet1").Range("a:a") Set myrngYK = Workbooks("A.xls").Sheets("sheet1").Range("t:t") Set myrialz = Workbooks("A.xls").Sheets("sheet2").Range("b:b") Set myXBrialz = Workbooks("A.xls").Sheets("sheet3").Range("b:b") j = 3 Do j = j + 1 myhin = myrngv.Cells(j, 1).Value If myhin = "" Then Exit Do Set c = myrialz.Find(what:=myhin, Lookat:=xlWhole) If Not c Is Nothing Then firstaddress = c.Address Do myrow = c.Row myrngv.Cells(j, 9) = myrialz.Cells(myrow, 7).Value myrngv.Cells(j, 11) = myrialz.Cells(myrow, 8).Value myrngv.Cells(j, 13) = myrialz.Cells(myrow, 3).Value myrngv.Cells(j, 5) = myrialz.Cells(myrow, 3).Value + Cells(myrow, 7).Value - Cells(myrow, 8).Value Set c = myrialz.FindNext(c) Loop Until firstaddress = c.Address End If Loop 'ここより下が同じ様な処理 j = 3 Do j = j + 1 myhin = myrngYK.Cells(j, 1).Value If myhin = "" Then Exit Do Set c = myXBrialz.Find(what:=myhin, Lookat:=xlWhole) If Not c Is Nothing Then firstaddress = c.Address Do myrow = c.Row myrngYK.Cells(j, 8) = myXBrialz.Cells(myrow, 7).Value myrngYK.Cells(j, 10) = myXBrialz.Cells(myrow, 8).Value myrngYK.Cells(j, 12) = myXBrialz.Cells(myrow, 3).Value myrngYK.Cells(j, 6) = myXBrialz.Cells(myrow, 3).Value + Cells(myrow, 7).Value - Cells(myrow, 8).Value Set c = myXBrialz.FindNext(c) Loop Until firstaddress = c.Address End If Loop

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

専門家に質問してみよう