• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロでシート名を配列に格納して比較したい)

マクロでシート名を配列に格納して比較したい

このQ&Aのポイント
  • 異なるファイル間でそれぞれシート名を比較して、ないものがあればそのシートを元ファイルに追加したい。
  • マクロ記入ファイル(FARSTBOOK)とコピー先ファイル(OLDBOOK)とコピー元ファイル(NEWDBOOK)を開き、それぞれを配列に格納して処理を進めたい。
  • シート名の配列を作成し、それらの配列を比較して存在しないシートをコピー元ファイルに追加する処理が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

#1 です。連投すみません。 修正したものを再度掲載しておきます。 Sub Sample()   Dim wbSrc    As Workbook   Dim wbDst    As Workbook   Dim shSrc    As Object   Dim shDst    As Object      Set wbSrc = Workbooks("NEWBOOK.xls") ' // コピー元   Set wbDst = Workbooks("OLDBOOK.xls") ' // コピー先      ' // まず NEWBOOK.xls にあって OLDBOOK.xls にないシートを複写   For Each shSrc In wbSrc.Sheets     On Error Resume Next     Set shDst = wbDst.Sheets(shSrc.Name)     On Error GoTo 0     If shDst Is Nothing Then       shSrc.Copy After:=wbDst.Sheets(wbDst.Sheets.Count)     End If     Set shDst = Nothing ' <---- 追加   Next   ' // シート並べ替え   For Each shDst In wbDst.Sheets     shDst.Move Before:=wbDst.Sheets(wbSrc.Sheets(shDst.Name).Index)   Next End Sub

yokokama46
質問者

お礼

KenKen_SPさんへ ありがとうございました。お陰さまで肝心な所が出来上がりました。 複数と複数などと考えていましたが、ひとつずつ順次比較すればよかったのですね。また、ブックとシートの変数もスタートとデストネーションで分かり易くつけて頂き助かりました。 更に、shDst.Move Before:=wbDst.Sheets(wbSrc.Sheets(shDst.Name).Index) まで教えて頂きました。 後は、実際のものに組み入れてみます。ありがとうございます。 またよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

ごめんなさい。#1 です。 > shSrc.Copy Before:=wbDst.Sheets(shSrc.Index) だとエラーがでますね。確認もしないで投稿してしまいすみません。 同じ位置....というのがよく分からないのですが、NEWBOOK.xls 内 での並びのままというのであれば、  shSrc.Copy After:=wbDst.Sheets(wbDst.Sheets.Count) とでもして下さい。NEWBOOK.xls と OLDBOOK.xls のシートの並びを 完全に一緒にしたいのであれば、シートの並べ替え処理も加えないと いけないですね。

すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。 配列を使う必要性は感じません。メリットはほとんどないでしょう。 こんな感じではダメなのですか? Sub Sample()   Dim wbSrc    As Workbook   Dim wbDst    As Workbook   Dim shSrc    As Object   Dim shDst    As Object      Set wbSrc = Workbooks("NEWBOOK.xls") ' // コピー元   Set wbDst = Workbooks("OLDBOOK.xls") ' // コピー先      For Each shSrc In wbSrc.Sheets     On Error Resume Next     Set shDst = wbDst.Sheets(shSrc.Name)     On Error GoTo 0     If shDst Is Nothing Then       shSrc.Copy Before:=wbDst.Sheets(shSrc.Index)     End If   Next End Sub なお、単にシートと書いてありますが、ワークシートとシートは 別物です。上記は「シート」で書いてます。 [参考] Worksheets: ワークシートのみ Sheets  : ワークシートに加え、グラフ、マクロ、ダイアログシートを含む ゆえに   Dim shSrc As Worksheet ではなく、   Dim shSrc As Object です。

すると、全ての回答が全文表示されます。

関連するQ&A