vbaの条件付抽出ですが、別ブックにコピペするコードです。
なんとか下記のコードを書いたのですが、これだと1件しかコピペ出来ませんでした。
勉強している途中のため、支離滅裂なコードかも知れません。
①条件に合致するデータを全てコピペ
②抽出元データは日々増えていきます
③添付画像のA・C・D・F・G列のデータのみ必要です(今のコードは全列のコピペ)
④コピー先のデータを一度クリアしてから新たにコピペをするようにしたい
⑤抽出条件はE列の「種別」で、外注ならブック名「外注」に、仕入ならブック名「仕入」、未払ならブック名「未払」に抽出してコピペしたい。※一度に無理なら外注のデータのみを抽出するコードで、他は条件を書き換えてコピーして使います。
現在は1行しかコピー出来ません。また、外注のみになっています。
With ThisWorkbook.Worksheets("sheet1")このwithの所で、for-nextで調べていき、E列の文字が(外注)のときに外注ブックへコピペ・・・とIF分で指定するのだと思いますが・・・
何分、勉強中で前回も色々な方々が書き込みして下さいましたが・・・あれこれとゴチャ混ぜになってしまったために質問し直します。
出来ましたらコードを組んで頂けないでしょうか?
Sub データ抽出()
Dim myPath As String, fn As String
Dim lastRow As Long, myLst As Long
Application.ScreenUpdating = False
Dim ws As Worksheet
myPath = "*****" & "\" <----ここはパス名を入れます
fN = "外注.xls"
Workbooks.Open myPath & fn
Set ws = Workbooks(fn).Worksheets("sheet1")
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
Range(ws.Cells(1, "A"), ws.Cells(lastRow, "G")).ClearContents
End If
With ThisWorkbook.Worksheets("sheet1")
.Activate
myLst = .Cells(Rows.Count, "A").End(xlUp).Row
If myLst > 1 Then
Range(.Cells(2, "A"), .Cells(2, "G")).Copy <----ここが問題かと・・・
ws.Range("A2").PasteSpecial xlPasteValues
End If
End With
With Workbooks(fn)
.Save
.Close
End With
Application.ScreenUpdating = True
End Sub
長くなりますが、コードを書くコツというか順番を教えて頂けたら助かります。
自分は今回
1.やりたいことは何か
2.どのブック・シートからデータを抽出したいのか
3.どのブックへ書き出したいのか
4.どのデータが必要なのか(コピーしたいデータはどこなのか)
という順番で考えました。
まだまだ勉強中のため、検索や教えて頂いたものの応用でしかコードは書けません。
当然ながら、教えて頂く方々の書き方や癖もあるので少し違うだけで解らなくなったりします。
自分なりのコードが書けるように上達するにはどうしていったら良いかのアドバイスも頂けると幸いです。
No.1ベストアンサー
- 回答日時:
先の質問で回答したものです。
VBAの勉強と云う事で参考までに、コードを提示しておきますが
うまく作動しなかったとの事ですの参考程度です。
実は、この方法はあまり実用的ではありません。理由は
全ての行を2行目から最後までチェックして行きますが、当然
データが増えたら遅くなります。
そこで、別の提案をしておきます。
とりあえず、抽出結果を表示する為に別シートを準備します。
エクセルの機能でアドバンスフィルターを使います。
詳しくは
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
のサイトででも勉強してみてください。
一例です。A・C・D・F・G列のデータのみ必要なので
抽出結果を表示するシート
A B C D E F
1 種別 日付 得意先 適用 請求金額 支払金額
2 外注
3
とSheet1の一行目の項目を張り付けて準備します。
(一行目が良く見えないので上は適当です)
A1~A2 が抽出する条件を記載しています(種別が 外注 を抽出)
B~Fに 抽出する項目の名前になります。
このシートをアクティブにした状態で
Sub データ抽出()
Sheets("Sheet1").Columns("A:G").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("B1:F1"), Unique:=False
End Sub
を事項してみて下さい。E列が外注の行が抽出されます。
後は、A2セルを 仕入、未払 にすれば、それに対応した抽出が出来ます。
ここまで出来たら、後に
Columns("B:F").Copy
Workbooks.Open "*****" & "\" & Range("A2").Value & ".xls"
Sheets("Sheet1").Select
Columns("A:E").Select
ActiveSheet.Paste
ActiveWorkbook.Close SaveChanges:=True
と続ければご希望の動作になりませんでしょうか。
コードもシンプルになり、動作も軽いはずですし、A2セルを変更するだけで
他の対応も出来ます。
以下、参考コード
Sub データ抽出()
Dim myPath As String, fn As String
Dim lastRow As Long, myLst As Long
Dim ws As Worksheet
myPath = "*****" & "\" <----ここはパス名を入れます
fN = "外注.xls"
Workbooks.Open myPath & fn
Set ws = Workbooks(fn).Worksheets("sheet1")
’↓④コピー先のデータを一度クリアしてから新たにコピペをするようにしたい
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
ws.Range("A2:G" & lastRow).ClearContents
'↓外注のデータのみを抽出するコードで、
With ThisWorkbook.Worksheets("sheet1")
myLst = .Cells(Rows.Count, "A").End(xlUp).Row
for i=2 to myLst
If range("E" & i).Value="外注" Then
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row+1
ws.Range("A" & lastRow).Value=.Range("A" & i).Value
ws.Range("B" & lastRow).Value=.Range("C" & i).Value
ws.Range("C" & lastRow).Value=.Range("D" & i).Value
ws.Range("D" & lastRow).Value=.Range("F" & i).Value
ws.Range("E" & lastRow).Value=.Range("G" & i).Value
End If
Next
End With
'↓上書きして保存
Workbooks(fn).Close SaveChanges:=True
End Sub
何度も有難うございました。やっと思い通りのものになりました。
動作も速くスッキリしました。
業者が多く、外注や仕入を一つのブックで管理しきれないのでてこずりました。
本当に有難うございます。
vba、難しいですね(笑)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) 抽出結果を別シートに貼り付ける 2 2022/07/09 22:59
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクスプローラーで「2つの条件...
-
Excelの横軸の際の抽出について
-
エクセル Offset関数 飛び行の...
-
エクセルで部署ごとの退職者数...
-
5000万件の個人の名寄せ方法
-
Excel2007:Microsoft quaryで外...
-
サイトをオフラインでも閲覧し...
-
抽出したデータを修正して元の...
-
VBAでビット情報にてデータ抽出
-
<SQL>条件付きで最小値レコード...
-
MS-DOSコマンドプロンプトを途...
-
Excelで別のExcelファイルから...
-
アクセス クエリ-で空白以外の...
-
Accessで別テーブルの値をフォ...
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
Accessのクエリでフィールドの...
-
DataGridViewの内容をDBに反映...
-
access 自動採番 年が変わる...
-
Accessでのレコード存在チェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
抽出したデータを修正して元の...
-
ACCESSの集計クエリで3件ある...
-
ACCESSのクエリで同じSQL文だが...
-
エクセル関数 文字(ハイフン...
-
アクセス クエリ-で空白以外の...
-
MS-DOSコマンドプロンプトを途...
-
<SQL>条件付きで最小値レコード...
-
空白文字とスペースの検索
-
SQLを駆使したデータ抽出ってど...
-
商品テーブルからカテゴリ別の...
-
LIKE *ABC* が ACCESSでは使え...
-
SQLServerからエクセルにデータ...
-
VBA CSVファイルを文字列に
-
Excel VBA:セルを新旧1つずつ...
-
エクスプローラーで「2つの条件...
-
エクセルデータの末尾の改行を...
-
さくらレンタルサーバのMysqlの...
-
アクセスのクエリの抽出条件に...
-
Excelの横軸の際の抽出について
-
SQLの数値の編集について
おすすめ情報