質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

4305閲覧

VBA 追加されたデータのみ転記

SSS_

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/10/15 01:19

VBAでデータの転記を行いたいです

具体的には
・元データと、転機先のブックが分かれている
・転記先では業者ごとにシートを作成
シートが既存⇒そのシートにデータを転記
シートがない⇒シートを作成しそこにデータを転記
・元データ数は最終的に6000を超える
★元データはどんどん追加されていく

★印のためにコードが書けずにいます
追加されたデータだけを転記したいのですが、すでに転記済みのデータも上積みされていっていしまいます。
これを解決する方法はありますでしょうか。

Sub test() '定義枠------------------------------------------------------------------------------------------- Dim ws As Worksheet, flg As Boolean Dim name As String, 業者名 As String, 業者 As String Dim ws1 As Object, ws3 As Object, ws2 As Object Dim wb As Workbook, motowb As Workbook, book1 As Workbook Set motowb = ActiveWorkbook Set wb = ThisWorkbook Set book1 = Workbooks("加工後.xlsm") Set ws1 = wb.Worksheets(1) Set ws3 = wb.Worksheets(2) Set ws2 = wb.Worksheets(3) Dim mrow As Integer, row As Integer, row2 As Integer mrow = ws1.Cells(Rows.Count, 1).End(xlUp).row Dim i As Long Dim Worksheet As Worksheet '----------------------------------------------------------------------------------------------- Workbooks.Open ThisWorkbook.Path & "\加工前データ.xlsm" Set motowb = ActiveWorkbook mrow = motowb.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).row With ws1.Range(ws1.Cells(9, 1), ws1.Cells(mrow, 12)) .Value = Worksheets(1).Range(Worksheets(1).Cells(9, 1), Worksheets(1).Cells(mrow, 12)).Value .RowHeight = 23.25 End With For i = 9 To mrow 業者名 = ws1.Cells(i, 5) flg = False For Each ws In book1.Worksheets If ws.name = 業者名 Then flg = True End If Next ws If flg = True Then On Error GoTo myError book1.Worksheets(業者名).Activate Set ws = wb.Worksheets(業者名) row = ws.Cells(Rows.Count, 1).End(xlUp).row ws.Range(ws.Cells(row + 1, 1), ws.Cells(row + 1, 12)).Value = ws1.Range(ws1.Cells(i, 1), ws1.Cells(i, 12)).Value ws.Cells(row + 2, 9).Value = "回数" ws.Cells(row + 2, 10).Formula = "=SUM(J9:J" & (row + 1) & " )" ws.Cells(row + 2, 11).Value = "合計" ws.Cells(row + 2, 12).Formula = "=SUM(L9:L" & (row + 1) & " )" Else myError: wb.Sheets("業者").Copy After:=Sheets(Sheets.Count) ActiveSheet.name = 業者名 Set ws = Worksheets(業者名) row2 = ws.Cells(Rows.Count, 1).End(xlUp).row ws.Range("F4").Value = 業者名 ws.Range(ws.Cells(row2 + 1, 1), ws.Cells(row2 + 1, 12)).Value = ws1.Range(ws1.Cells(i, 1), ws1.Cells(i, 12)).Value ws.Cells(row2 + 2, 10).Formula = Application.WorksheetFunction.Sum(Range("J9:J" & row2 & " ")) ws.Cells(row2 + 2, 9).Value = "回数" ws.Cells(row2 + 2, 11).Value = "合計" ws.Cells(row2 + 2, 12).Formula = Application.WorksheetFunction.Sum(Range("K12:K" & row2 & " ")) End If Next End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ad.sys.soleil

2020/10/15 05:02

>・・・・.Formula = "=SUM・・・・ 計算式入れてますから、VBAのSub前後にこれを入れると早くなりますよ。 (前)開始後 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual (後)終了前 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic 参考まで。
SSS_

2020/10/15 05:19

すごく早くなりました! ありがとうございます!
guest

回答2

0

ベストアンサー

hatena19さんの案でOKかと思いますが、
案4として、
転記先のシートのデータを全てクリア(見出し行があるなら見出し行はクリアしない)してから、
転記を行う。

元データが1万件以内なら、全データを処理しても処理時間は問題ないと思います。

投稿2020/10/15 04:40

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SSS_

2020/10/15 05:19

ありがとうございます! 今から試してみます!
guest

0

案1
元データに「転記済」列を追加して、転記した行はTrueに設定しておく。
転記するときは、「転記済」がFalseまたは未入力でフィルターをかけて転記する。

案2
元データに日付とか連番などの一意に並び順がきまるデータがあるなら、その値を転記先のシートのどこかに格納しておいて、その値以降のデータを転記する。一意に並び順がきまるデータがないなら行番号でも可。

案3
すべて転記してから重複データを削除する。

こんなところでしょうか。

投稿2020/10/15 02:10

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SSS_

2020/10/15 05:15

さっそくのご回答ありがとうございます! 案を3つも出していただき助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問