Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2016)
複数ブックを1つにまとめるVBAコードについて
投稿日時: 23/02/01 12:56:19
投稿者: マイルストン

いつもお世話になっております。
 
ネット上で公開されている転記のマクロについて自分なりに勉強しています。
分からないのは、変数Aには行数だけでなく、データも含まれており、下記の順番で実行されていく
という理解であっているでしょうか。(大まかな流れです。)
 
@ 転記元シートの対象データ(全体)を選択
A @の2行名から最終行までを選択し変数Aに格納する ※最終行を6と想定。
B 転記先シートのB列の最終行(1,2)を取得し、それを1行下げる(2,2)
B' Bを("2:6",2)にリサイズ(拡大)し変数Aの値を代入
C 転記元ファイル名を代入する 
 
Sub TESTマクロ()
   
  Dim A, B, C
  Set B = ThisWorkbook.Worksheets("Sheet1")
   
  'フォルダ内のブック名を取得
  C = Dir(ThisWorkbook.Path & "\TEST\*")
   
  Do While C <> ""
    'ブックを開く
     Workbooks.Open ThisWorkbook.Path & "\TEST\" & C
     
    'データ部分を取得
    With ActiveWorkbook.Worksheets("Sheet1").Range("A1").CurrentRegion  @
      A = .Rows("2:" & .Rows.Count) A
       
    End With
     
    'データを入力
    B.Cells(Rows.Count, "B").End(xlUp).Offset(1, 0).Resize(UBound(A, 1), 2) = A  B
    'ブック名を入力
    B.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(UBound(A, 1)) = ActiveWorkbook.Name C
     
    ActiveWorkbook.Close False 'ブックを閉じる
    C = Dir() '次のブック名を取得
   
  Loop
   
End Sub
 
 

回答
投稿日時: 23/02/01 15:31:30
投稿者: simple

どこのサイトを参考にされたか提示できますか?
どうしてもということはありませんが、参考までにということです。

回答
投稿日時: 23/02/01 16:13:27
投稿者: Suzu

CurrentRegion は データだけではなく、書式設定や、罫線を設定されたセルを含みます。
 

引用:
B.Cells(Rows.Count, "B")

Bのセルを指定しているのですが、Rows.Count は アクティブなブックの最終行を取得します。
アクティブブックが、xlsxファイル、かつ、B が xls形式の場合、
B の最終行より、アクティブブックの最終行の方が数値が大きくなり、問題が発生する場合があります。
 
Dir関数 は、
パスにUnicode文字しかない文字が含まれいる場合や、ネットワーク共有ファイルの場合
問題が発生する場合があります。
 
Dir関数の制限について
https://excel-ubara.com/excelvba4/EXCEL262.html

回答
投稿日時: 23/02/01 16:29:14
投稿者: simple

> 分からないのは、変数Aには行数だけでなく、データも含まれており、
> 下記の順番で実行されていくという理解であっているでしょうか。
 
OKかと思いますが、表現だけの話です。
 
A = .Rows("2:" & .Rows.Count)

A = .Rows("2:" & .Rows.Count).Value
の省略形ですから、その値を持つ配列です。
配列の大きさを見ることで行数はわかりますが、
それは行数が含まれているとは言わないかもしれません。
データが含まれているというか、データ(値)そのものですね。
Rangeオブジェクトとの差異は理解されているとは思いますが。
 
内容の妥当性は、実行結果で検証することもできると思います。
 
なお、
Dim A, B, C
と言った変数の使い方は推奨されません。もっと内容を表す変数のほうがよいでしょう。
変数のネーミングもコードの分かりやすさにつながるので大切です。
説明のためにわざわざ変更されたのか、
元の記事がそうなっているのか知りませんが。(出所を尋ねたのはそのため)
 
また適切な型宣言をすべきです。
Dim B
ではなく、
Dim ws As Worksheet
のように。
 
取り急ぎ気づいた点をコメントしました。

回答
投稿日時: 23/02/02 22:22:26
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

  C = Dir(ThisWorkbook.Path & "\TEST\*")

このコードでは、Excel以外のファイルも対象となってしまいますが、
「TEST」フォルダ内には、Excelファイルしか存在しないという前提でしょうか?
 
引用:

B' Bを("2:6",2)にリサイズ(拡大)し変数Aの値を代入

Resizeを拡大と考えていると思いますが、
A(配列)の列が2より大きい場合は、2でカットされてしまいます。
 
私的には、
>.CurrentRegion
との違和感を感じる。
Resize(UBound(A, 1), UBound(A, 2))
とすると整合すると思います。
[/quote]

回答
投稿日時: 23/02/03 09:03:18
投稿者: 半平太

これ、本当ですか?
 ↓

引用:
CurrentRegion は データだけではなく、書式設定や、罫線を設定されたセルを含みます。

以下のテストではA1:B100になりませんでしたけども。
Sub TEST()
    With ThisWorkbook.Worksheets.Add
        .Range("A1:B3").Value = 1
        .Range("A1:B100").Interior.Color = vbYellow '書式設定
        
        Debug.Print .Range("A1").CurrentRegion.Address '→$A$1:$B$3
    End With
End Sub

回答
投稿日時: 23/02/03 11:31:51
投稿者: Suzu

半平太 さんの引用:
これ、本当ですか?
 ↓
引用:
CurrentRegion は データだけではなく、書式設定や、罫線を設定されたセルを含みます。


 
UsedRangeプロパティ と混同していました。
取り消させてください。 失礼いたしました。
 
半平太さん、ご指摘ありがとうございました。

トピックに返信