Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
複数のファイルから特定のシートをコピーする際の順番について
投稿日時: 23/01/28 17:15:00
投稿者: マイルストン

お世話になっております。
 
現在、下記のコードを参考にデータの取り込みをしています。
 
https://www.moug.net/tech/exvba/0060003.html
 
ご教示頂きたいことは、最初にコピーしたシートをAllReports.xlsのシートの左端から2番目に配置し、2番目にコピーしたシートはその右となり、3番目にコピーしたシートはまたその右となりに配置されるようにし、その後も同じようにコピーを配置していきたい。要は、左から順に昇順で並べたいです。
 
現状は、一番最初にコピーしたシートが右端に配置され、2番目以降にコピーしたシートは、その前に取り込んだシートの左となりに配置されています。右から昇順で並んでいます。
 
宜しくお願い致します。

回答
投稿日時: 23/01/28 18:21:12
投稿者: simple

前の投稿の話の続きですか?それとも別ですか?
ご自分で、コードの途中に
・取得したファイル名
・書き込んだ列の列番号
を Debug.Printでイミディエイトウインドウに出力して
まずは事実関係を再確認されたらいかがですか?
 
また、具体的な助言を希望されるなら、動作させたコードを示したほうがよいと思いますよ。
参考したコードから、あなたの間違い(もしそれがあるとして)を推察するのは不可能でしょう。

投稿日時: 23/01/28 18:42:32
投稿者: マイルストン

simple 様
 
 
お世話になっております。
宜しくお願い致します。
 
> 前の投稿の話の続きですか?それとも別ですか?
 
別となります。
前回は複数のワークブックのシート【データ】を1つのシートにまとめましたが、今回は、60個のファイルのシートを1つのワークブックにコピーするパターンを想定しています。
 
> また、具体的な助言を希望されるなら、動作させたコードを示したほうがよいと思いますよ。
 
恐れ入ります。宜しくお願い致します。コードは下記の通りです。
 
Sub シート取りまとめ結果()
 
    Dim sFile As String
    Dim sWB As Workbook
    Dim dWB As Workbook
    Dim dSheetCount As Long
    Dim i As Long
    Const SOURCE_DIR As String = "C:\Users\アドレス\"
    Const DEST_FILE As String = "C:\Users\アドレス\AllReport.xlsx"
     
    Application.ScreenUpdating = False
     
    '指定したフォルダ内にあるブックのファイル名を取得
    sFile = Dir(SOURCE_DIR & "*.xlsx*")
     
    'フォルダ内にブックがなければ終了
    If sFile = "" Then Exit Sub
     
    '集約用ブックを作成
    Set dWB = Workbooks.Add
     
    '集約用ブック作成時のシート数を取得
    dSheetCount = dWB.Worksheets.Count
     
    Do
        'コピー元のブックを開く
        Set sWB = Workbooks.Open(FileName:=SOURCE_DIR & sFile)
         
        'コピー元の「報告書」シートを集約用ブックにコピー
        sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(dSheetCount)
         
        'シート名をセルA1の値に変更
        ActiveSheet.Name = sFile
                 
        'コピー元ファイルを閉じる
        sWB.Close
         
        '次のブックのファイル名を取得
        sFile = Dir()
    Loop While sFile <> ""
         
 
    Application.DisplayAlerts = True
       
    '集約用ブックを保存して閉じる
    dWB.SaveAs FileName:=DEST_FILE
    dWB.Close
     
    Application.ScreenUpdating = False
 
End Sub
 
 
 

回答
投稿日時: 23/01/28 18:51:21
投稿者: simple

>sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(dSheetCount)
これだと固定値のdSheetCountの位置の次にコピーしていくので、
結果的に、新しいシートが前のシートの左に追加されていくことになりますね。

sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(dWB.Worksheets.Count)
などとすれば、新しいシートが順次右に追加されていくのでは?

回答
投稿日時: 23/01/28 22:58:24
投稿者: simple

補足説明です。
・dWBファイルには、Sheet1,Sheet2というシートがあったとします。
     (なお、新規作成ブックのシートの数は、各人のオプション設定に依存して変わります。
      Application.SheetsInNewWorkbook プロパティに管理されています。)
・これにA,B,Cというシートが追加される前提で以下説明します。
(1)------------------
現行の処理では、dSheetCount (= dWB.Worksheets.Count)は、
最初に一回計算され、以後は変わりません。
従って、
sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(dSheetCount)
は、
sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(2)
と同じなので、必ず2番目のシートの後ろに追加されます。

Sheet1,Sheet2
  ↓
Sheet1,Sheet2,A     (Aは2番目の後ろに追加される)
  ↓
Sheet1,Sheet2,B,A   (Bは2番目の後ろに追加される)
  ↓
Sheet1,Sheet2,C,B,A (Cは2番目の後ろに追加される)
となります。
(2)------------------
一方、
sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(dWB.Worksheets.Count)
とすると、dWB.Worksheets.Countは、処理の都度再計算されて 2,3,4と変わっていきます。
従って、
Sheet1,Sheet2
  ↓
Sheet1,Sheet2,A     (Aは2番目の後ろに追加される)
  ↓
Sheet1,Sheet2,A,B   (Bは3番目の後ろに追加される)
  ↓
Sheet1,Sheet2,A,B,C (Cは4番目の後ろに追加される)
となります。

回答
投稿日時: 23/01/29 09:48:01
投稿者: WinArrow
投稿者のウェブサイトに移動

あなたが意図する結果にならない
原因は、simpleさんが詳細に説明されています。
 
他のスレでも書きましたが、
コードそのもの意味を理解することをお勧めします。
 
その手助けになるツールとして
ステップ実行が有効な手段です。
 
まず、確認すべきは
> sWB.Worksheets("回答(送付用)").Copy After:=dWB.Worksheets(dSheetCount)
です。
この中で使用している
変数:dSheetCoun
の値を見れば、
複写する都度、変化していないことが分かります。
そうすると
> dSheetCount = dWB.Worksheets.Count
このコードは最初の1回だけしか実行されていませんから、
実行のタイミングに問題があります。
 
このコードの実行タイミングを変更するだけで対応することができます。
 
ステップ実行は、1度だけの値確認ではなく、2度以上確認しないと分かりません。
そのことも覚えておきましょう。

投稿日時: 23/01/30 07:35:52
投稿者: マイルストン

simple 様
 
おはようございます!
いつもお世話になっております。
 
エラーの原因やその対応方法について、分かり易くご教示頂き大変助かりました。
WinArro様からもご指摘いただいているように、記載しているコードの意味内容を
もっとしっかり理解できるようにしていきたいと思います。
 
WinArrow 様
 
おはようございます!
いつもお世話になっております。
 
> ステップ実行は、1度だけの値確認ではなく、2度以上確認しないと分かりません。
> そのことも覚えておきましょう。
 
ご指摘いただいた箇所については、指摘を受けるとなるほど確かにと思うのですが、
なかなかそこに気づけない自分がいてもどかしさを感じるときもあります。上達して
いくためには、みなさまにご指摘いただきたことを実践していくことが早道だと思い
ますので今後も頑張っていきます。
 
ありがとうございました。