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

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

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

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

Q&A

解決済

1回答

1225閲覧

ループしたときの、上書きされていかない空白行の取得の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2018/01/12 05:05

編集2018/01/12 06:23

以前の質問(https://teratail.com/questions/102850)で、
複数のファイルデータをループで一気に取り込む仕組みが理解でき、
そこでまた別の種類の見積りデータを取り込んでみることまでできるようになりました。

しかし、ペーストされた先のシートで、転記元のファイルの次のファイルが、空白行が取得できず、一行ずつずれて取り込まれ、一個前のファイルでペーストしたセルの上に上書きされてしまう現象に陥っています。

例えば、下記で「1個目」のセルたちは、1個目の転記元データが取り込まれたセルです。
その上に2個目の転記元データが2行目から、上書きされて取り込まれてしまいます。

イメージ説明

試してみたこと

'出力する空白セルの指定
Dim pasteCell As Excel.Range
Set pasteCell = pasteWs.Cells(pasteWs.Rows.Count, "D").End(xlUp).Offset(1)

Dim pasteCell As Excel.Range
Set pasteCell = pasteWs.Cells(pasteWs.Rows.Count, "D").End(xlleft).Offset(1)
もしくは
Dim pasteCell As Excel.Range
Set pasteCell = pasteWs.Cells(pasteWs.Rows.Count, "D").End(xlUp).End(xlleft).Offset(1)
としたり、
'転記したら出力行を1行進める
iPasteRow = iPasteRow + 1
を削除してみたりしました。
しかし、自分でコードをいじると、実行したとたんに
エラー1004やエラー6が出てしまいます。

現在の全体のソースコードは下記です。

Option

1 2Sub 見積読込() 3 '前提条件 4 5 '- 転記先のシートがこのマクロが書かれいるブックであること 6 7 '転記元ファイルの取得用変数 8 Const FILE_PATH = "H:+++++" 9 Dim sFileName As String 10 11 '転記元のシートの変数 12 Dim copyWb As Excel.Workbook 13 Dim copyWs As Excel.Worksheet 14 '転記先のシートの変数 15 Dim pasteWs As Excel.Worksheet 16 '出力行 17 Dim iPasteRow As Integer 18 19 '転記先のシートを取得 20 'マクロが書かれているブックの、アクティブなシート 21 Set pasteWs = Excel.ThisWorkbook.ActiveSheet 22 23 '出力する空白セルの指定 24 Dim pasteCell As Excel.Range 25 Set pasteCell = pasteWs.Cells(pasteWs.Rows.Count, "D").End(xlUp).Offset(1) 26 27 '出力行を取得(先頭行) 28 iPasteRow = pasteCell.Row 29 30 '対象フォルダからExcelファイル名を取得 31 sFileName = Dir(FILE_PATH & "*.xlsx*") 32 If sFileName = "" Then 33 'フォルダにExcelファイルが1つもない場合は処理終了 34 Exit Sub 35 End If 36 37 '対象フォルダ内のすべてのExcelファイルをループ処理 38 Do 39 '転記元ブックをオープン 40 Set copyWb = Workbooks.Open(FILE_PATH & "\" & sFileName) 41 '転記元シートを取得 42 Set copyWs = copyWb.Worksheets(1) '先頭シート 43 44 '除外するものがあればここで条件を指定して転記処理に入れない 45 If True = True Then 46 '除外するもの以外は転記処理 47 48 '発行日を開いている転記元からコピーして転記先にペースト 49 Set pasteCell = pasteWs.Cells(iPasteRow, "A") 50 51 Dim hakkobiCell As Excel.Range 52 Set hakkobiCell = copyWs.Range("A6") 53 54 hakkobiCell.Copy 55 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 56 Operation:=xlNone, _ 57 SkipBlanks:=False, _ 58 Transpose:=False 59 60 '見積番号'を開いている転記元からコピーして転記先にペースト 61 Set pasteCell = pasteWs.Cells(iPasteRow, "B") 62 63 Dim quotenoCell As Excel.Range 64 Set quotenoCell = copyWs.Range("A7") 65 66 quotenoCell.Copy 67 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 68 Operation:=xlNone, _ 69 SkipBlanks:=False, _ 70 Transpose:=False 71 72 '品名'を開いている転記元からコピーして転記先にペースト 73 Set pasteCell = pasteWs.Cells(iPasteRow, "C") 74 75 Dim hinmeiCell As Excel.Range 76 Set hinmeiCell = copyWs.Range("A17") 77 78 hinmeiCell.Copy 79 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 80 Operation:=xlNone, _ 81 SkipBlanks:=False, _ 82 Transpose:=False 83 84 85 '作業内容'を開いている転記元からコピーして転記先にペースト 86 Set pasteCell = pasteWs.Cells(iPasteRow, "D") 87 88 Dim sagyoCell As Excel.Range 89 With copyWs 90 Set sagyoCell = _ 91 .Range( _ 92 .Range("B38"), _ 93 .Range("B38").End(xlDown) _ 94 ) 95 End With 'copyWs 96 97 sagyoCell.Copy 98 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 99 Operation:=xlNone, _ 100 SkipBlanks:=False, _ 101 Transpose:=False 102 103 '数量'を開いている転記元からコピーして転記先にペースト 104 Set pasteCell = pasteWs.Cells(iPasteRow, "F") 105 106 Dim suryoCell As Excel.Range 107 With copyWs 108 Set suryoCell = _ 109 .Range( _ 110 .Range("J38"), _ 111 .Range("J38").End(xlDown) _ 112 ) 113 End With 'copyWs 114 115 suryoCell.Copy 116 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 117 Operation:=xlNone, _ 118 SkipBlanks:=False, _ 119 Transpose:=False 120 121 '単価'を開いている転記元からコピーして転記先にペースト 122 Set pasteCell = pasteWs.Cells(iPasteRow, "G") 123 124 Dim tankaCell As Excel.Range 125 With copyWs 126 Set tankaCell = _ 127 .Range( _ 128 .Range("L38"), _ 129 .Range("L38").End(xlDown) _ 130 ) 131 End With 'copyWs 132 133 tankaCell.Copy 134 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 135 Operation:=xlNone, _ 136 SkipBlanks:=False, _ 137 Transpose:=False 138 '金額'を開いている転記元からコピーして転記先にペースト 139 Set pasteCell = pasteWs.Cells(iPasteRow, "H") 140 141 Dim kingakuCell As Excel.Range 142 With copyWs 143 Set kingakuCell = _ 144 .Range( _ 145 .Range("M38"), _ 146 .Range("M38").End(xlDown) _ 147 ) 148 End With 'copyWs 149 150 kingakuCell.Copy 151 pasteCell.PasteSpecial Paste:=xlPasteValues, _ 152 Operation:=xlNone, _ 153 SkipBlanks:=False, _ 154 Transpose:=False 155 156 157 '転記したら出力行を1行進める 158 iPasteRow = iPasteRow + 1 159 End If 160 161 '転記元ブックを閉じる 162 copyWb.Close SaveChanges:=False 163 164 '次のファイル名を取得 165 sFileName = Dir 166 167 Loop Until sFileName = "" 'ファイル名が取得できなくなるまで繰り返す 168 169End Sub 170

理解が遅く、同じような質問ばかりで恐縮ですが、何卒アドバイスいただければ幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

iPasteRow の値が
処理が進むごとにどのようにどうなっているか
追っていけば自ずとわかると思います。

一時的に
iPasteRow = iPasteRow + 1

iPasteRow = iPasteRow + 5
とかに変えてやるとわかりやすいかもしれないですね。

投稿2018/01/12 05:59

torisan

総合スコア678

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

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

退会済みユーザー

退会済みユーザー

2018/01/12 06:22

早速のご回答ありがとうございます! いただいたヒントを元に 観察してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問