[[20190610142235]] 『同一フォルダ内にある複数ブックをまとめたい』(みみみ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『同一フォルダ内にある複数ブックをまとめたい』(みみみ)

同一フォルダ内にある複数ブックをまとめたく、
ネット上で拾った構文を利用してコピー範囲の変更はしたのですが、
「test」フォルダ内にある3つ目のファイルはうまく転記したものの、
1つ目と2つ目に関しては、タイトル行と最初の行のみしか転記できませんでした。

「test」フォルダ内のブックは、3行目に各データのタイトルがあり、
4行目が空欄で5行目よりデータが入っております。

根本的なことがわかっておらず丸投げで非常に申し訳ないのですが、
ド素人に修正個所をご教示ください。


 Sub ExcelbookCombine()
 Const Fol As String = "C:\Desktop\test\"
 Dim Fn
 Dim NewFile As Workbook
 Dim Wb As Workbook
 Dim Ws1 As Worksheet
 Dim Ws2 As Worksheet
 Dim R As Range
 Set NewFile = Workbooks.Add
 Set Ws1 = NewFile.Worksheets(1)
 Set R = Ws1.Range("A3")
 Fn = Dir(Fol, vbNormal)
 Do Until Fn = ""
 Set Wb = Workbooks.Open(Fol & Fn)
 Set Ws2 = Wb.Worksheets(1)
 Ws2.Range("A3", Ws2.Cells(Rows.Count, 1).End(xlUp)).Resiz(, 14).Copy R
 Set R = R.End(xlDown).Offset(1)
 Wb.Close
 'Debug.Print Fn
 Fn = Dir
 Loop
 Set R = Nothing
 Set Ws1 = Nothing: Set Ws2 = Nothing
 Set Wb = Nothing: Set NewFile = Nothing
 End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


原因は以下ですね。
Set R = R.End(xlDown).Offset(1)

End(xlDown)は、[End]キー[↓]キーを意味します。

1つ目のファイルの時は、Set R = Ws1.Range("A3") で、セルA3が指定されています。
セルA3で、[End]キー[↓]キーを押すとどのセルに移動しますか?
セル上で操作してみてください。
4行目が空白とのことですので、1つ目のデータのセルになると思います。

Offset(1)は、その1行下となるので、1つ目のデータの次の行に、2つ目のファイルがコピペされ、2つ目のファイルの1つ目のデータの下に3つ目のファイルがコピペされるため、最終的に、1つ目と2つ目のファイルは、タイトル行と1つ目のデータのみになります。

間に空白行が無ければ[End]キー[↓]キーで良いですが、空白行がある場合は下のセルから[End]キー[↑]を使うと良いです。(他にも方法はありますが。。。)
[End][↑]は、すでに使われてますよね。

(う) 2019/06/10(月) 15:50


(う)さん

問題のある個所はご指摘を頂いてわかったのですが
そもそもの構文を丸っきり理解していないので、
(う)さんの仰る“下のセルから”が、
どのセルを指しているのかも理解できておりません。

[End][↑] をどの様に入れ込むといいのでしょうか?

修正個所のヒントではなく、訂正して頂けると助かります。

(みみみ) 2019/06/10(月) 16:23


Set R = R.End(xlDown).Offset(1)  の上の行で、下のセルから[End][↑] を使っています。

以下のサイトの「<S3-1> 上方向に最終行を検索する(改)」が参考になります。
http://www.niji.or.jp/home/toru/notes/8.html

私は優しくないので、マルコピすればいいだけの訂正はしません。
最終行の判定はマクロを利用するのであれば、必ず必要になる知識です。

とりあえずマルコピして動けばいいやとお考えであれば、他の親切な方の回答をお待ちください。

(う) 2019/06/10(月) 16:35


(う)さん

私には限界だったのでカキコミしましたが、
これから知識を深めるにはゴールが見えないので、マクロを諦めます。
ありがとうございました。

(みみみ) 2019/06/10(月) 16:55


 Set R = R.End(xlDown).Offset(1)
 ↓
 Set R = Ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1)
 ですかね?

 もう見てらっしゃらないですかね?(^^;
 一回こっきりで使うマクロならコピペでもいいかなぁ…とは思いますが、もしも常用する予定であれば
 これを機に勉強してみてください。 というか、勉強して後輩とかに教えられるレベルになっていただかないと、
 引継ぎされる後輩は泣きます…。 現に自分がそうです。

(虎) 2019/06/10(月) 17:05


(虎)さんと被りましたが書いてしまったので。。。。

紹介したサイトがほぼ回答に近いですけどね。。。
修正を試してみたのでしょうか?

諦めるのであれば諦めた方が良いと思いますが、回答は書いておきます。

Set R = R.End(xlDown).Offset(1)
  ↓
Set R = Ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1)

Ws1:コピー先のシート(Set Ws1 = NewFile.Worksheets(1) でWs1にコピー先のシートを指定している)
Rows.Count:ワークシートの最終行(xlsx形式であれば1048576行)
(Rows.Count, 1)の「1」は列番号を指すので、A列
End(xlUp):[End][↑]

まとめると、Ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1) は
コピー先のシート(ws1)のA列の最終行Cells(Rows.Count, 1)=xlsx形式であればA1048576 から[End][↑]したセルの1行した(offset(1))という意味になります。
(う) 2019/06/10(月) 17:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.