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

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

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

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

Q&A

解決済

2回答

5260閲覧

2回実行しないと思った処理が出来ません。

nekoze71

総合スコア1

VBA

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

0グッド

0クリップ

投稿2020/12/13 13:49

前提・実現したいこと

ExcelVBAで、1回のマクロ実行で、元データから、集計表シートに伝票番号毎に転記・集計を行いたいです。

発生している問題・エラーメッセージ

1回のマクロで処理が完結出来ません。
転記先の集計表シートの情報が空の状態で、
1回マクロの実行をすると、明細の転記が行われません。
続けて、もう1度実行すると、明細の転記が行われます。

該当のソースコード

Option Explicit Sub 支払明細() Dim A As New Collection Dim i As Long, n As Long, sLastRow As Long, dLastRow As Long, r As Long Dim sourceData As Worksheet, resultData As Worksheet Dim Kotae As Range, sArea1 As Range, sArea2 As Range, sKey2 As Range Set sourceData = Sheets("元データ") Set resultData = Sheets("集計表") Set Kotae = sourceData.Range("O:O") '仕入額 Set sArea1 = sourceData.Range("B:B") '伝票番号 Set sArea2 = sourceData.Range("W:W") '勘定 Set sKey2 = resultData.Range("D12") '手数料 sLastRow = sourceData.Cells(Rows.Count, 2).End(xlUp).Row '元データの最終行取得 dLastRow = resultData.Cells(Rows.Count, 2).End(xlUp).Row '集計表の最終行取得 sourceData.Cells.Replace what:=" ", Replacement:="", matchbyte:=False '半角スペースを削除 sourceData.Range("A1").CurrentRegion.Columns.AutoFit '列幅を自動調整 resultData.Range("A12").CurrentRegion.Offset(1, 0).ClearContents '前回集計結果をクリア '伝票番号を重複しないで転記 With sourceData On Error Resume Next For i = 2 To sLastRow .Cells(i, 2) = "'" & .Cells(i, 2) A.Add .Cells(i, 2), .Cells(i, 2) Next i On Error GoTo 0 For i = 1 To A.Count resultData.Cells(i + 12, 2) = A(i) Next i End With With resultData '-----------明細を転記-------------- For n = 13 To dLastRow .Cells(n, 1) = .Cells(n, 1).Row - 12 '行番号付与 .Cells(n, 3) = WorksheetFunction.SumIfs(Kotae, sArea1, .Cells(n, 2)) '納品番号毎の支払総額集計 .Cells(n, 4) = WorksheetFunction.SumIfs(Kotae, sArea1, .Cells(n, 2), sArea2, sKey2) '納品番号毎の手数料集計 .Cells(n, 5) = .Cells(n, 3) - .Cells(n, 4) '手数料を除いた支払額を計算 For i = 2 To sLastRow If .Cells(n, 4) = 0 Then .Cells(n, 9) = 1 '手数料が0ならば、振込払欄に1 If .Cells(n, 2) = sourceData.Cells(i, 2) Then If sourceData.Cells(i, 3) = 1 Then .Cells(n, 6) = sourceData.Cells(i, 7) '処理年月日 .Cells(n, 7) = sourceData.Cells(i, 5) '商品区分 .Cells(n, 8) = sourceData.Cells(i, 18) '商品名 End If End If Next i Next n '------------並び替え-------------- .Range("A12").CurrentRegion.Offset(0, 1).Sort _ key1:=.Range("F12"), order1:=xlAscending, _ key2:=.Range("B12"), order2:=xlAscending, _ Header:=xlYes '-----------合計を集計------------- r = resultData.Cells(Rows.Count, 2).Row .Range("C3") = WorksheetFunction.SumIf(.Range(.Cells(13, 9), .Cells(r, 9)), "1", .Range(.Cells(13, 3), .Cells(r, 3))) '振込払の合計集計 .Range("C4") = WorksheetFunction.Sum(.Range(.Cells(13, 3), .Cells(r, 3))) '支払合計集計 .Range("C6") = WorksheetFunction.Sum(.Range(.Cells(13, 4), .Cells(r, 4))) '手数料合計集計 End With End Sub

試したこと

ステップインをしていくと、
1回目は、伝票番号を重複しないで転記の後、明細を転記を飛ばして、並び替えに進んでしまっています。
集計表シートには、伝票番号のみが転記された状態です。
その状態で、2回目の実行をすると、明細を転記の処理が反映されました。

補足情報(FW/ツールのバージョンなど)

Excel2019

見様見真似で作ってみましたが、お見苦しい点ばかりだと思います。
わかりやすいコードの書き方ありましたら、合わせてお教えいただきたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

resultDataが空の状態でdLastRowを取得しているので、一回目はdLastRow = 1などになっていると思います。
コードを読んだ感じでは、おそらく「伝票番号を重複しないで転記」のあとにdLastRowを取得すれば狙い通りの挙動になるかと思います。

投稿2020/12/14 02:13

Usirow

総合スコア364

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

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

nekoze71

2020/12/14 06:08

集計表シートに転記した伝票番号の最終行を取得したかったのですが、伝票番号転記前に、最終行を取得していて見出し行を取得しておりました。伝票番号を重複しないで転記の後にすることで思った通りの動作になりました。ありがとうございました。
guest

0

ベストアンサー

転記前の dLastRow を取得していればそうなると思います。

もう一度そのままステップインして、
For n = 13 To dLastRow の時の dLastRow を見ればすぐ分かると思います。

憶測ですが、12 になっているのかなと。

投稿2020/12/13 15:32

編集2020/12/13 15:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nekoze71

2020/12/14 06:06

おっしゃる通り、dLastRowは12となっておりました。 伝票番号を重複しないで転記の後にすることで、思った通りの動作になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問