may the VBA be with you

Excel VBAとか業務自動化とか

VBAなんだかんだ その1 シートを別ブックにコピー

はじめに

前回、

vba-belle-equipe.hatenablog.com

マクロを作るまでの過程を詳らかにせんと書き始めた記事が色々端折った感じになりましたので、補足記事その1です。

やりたいこと

ここに2つのExcelブックがあります。

ファイルの名前 シート
コピー元.xlsx コピー元1 コピー元2 コピー元3
Book2.xlsx Sheet1 Sheet2 Sheet3

[コピー元.xlsx]の[コピー元1]シートを[Book2.xlsx]にコピーしたい。

(ちなみに「Book2」は「Workbooks.Add」で追加された状態です)


調べる

とりあえず「vba シート コピー」とでも検索しましょう。

次の書き方でシートをコピーできるという情報をゲット。

Worksheets("[シート名]").Copy After:=Worksheets("[シート名]")

試す

実際に書いて実行してみます。

Sub bbb()
  Worksheets("コピー元1").Copy After:=Worksheets("Sheet1")
End Sub

怒られる

インデックスが有効範囲にありません。

意味がわからない。

vba シート コピー インデックスが有効範囲にありません」で検索します。


・・・・・・・・



なんとなく、シートの指定がおかしいのかな?

シートの指定方法

vba シート指定」で、シート名ではなくシートのインデックスで指定できるという耳寄りな情報をゲット。

Sub bbb()
  Worksheets("コピー元1").Copy After:=Worksheets(1)
End Sub

お、実行されましたよ

ファイルの名前 シート
コピー元.xlsx コピー元1コピー元1(2) コピー元2 コピー元3
Book2.xlsx Sheet1 Sheet2 Sheet3


ヤッタネ!!

・・・いや、そうじゃないんだよ。

他のブックにコピーしたいんだよー

vba 他のブックにシートをコピー」で仕切り直しです。

Sub bbb()
  Worksheets("コピー元1").Copy After:=Workbooks("Book2").Worksheets(1)
End Sub


どうかな?

ファイルの名前 シート
コピー元.xlsx コピー元1 コピー元2 コピー元3
Book2.xlsx Sheet1コピー元1 Sheet2 Sheet3


いやー、できたできた。

余韻に浸る

よーし。もう1回やってみようかな。

ファイルの名前 シート
コピー元.xlsx コピー元1 コピー元2 コピー元3
Book2.xlsx Sheet1 Sheet2 Sheet3

コピーしたシートを消して...

Sub bbb()
  Worksheets("コピー元1").Copy After:=Workbooks("Book2").Worksheets(1)
End Sub

を実行、と。

怒られる

インデックスが有効範囲にありません。

どゆこと?

さっきはできたじゃん! 俺たちうまくいってたじゃん!


vba さっきはできたのにできない」で検索します。


・・・・・・・・


いやあ、サスガに出てこないですね。


でもちょい待ち。

このエラー、さっきも出ましたな。

Sub bbb()
  Worksheets(1).Copy After:=Workbooks("Book2").Worksheets(1)
End Sub

こういうこと?

ファイルの名前 シート
コピー元.xlsx コピー元1 コピー元2 コピー元3
Book2.xlsx Sheet1Sheet1(2) Sheet2 Sheet3

ムッ?

Book2のシートがコピーされてる...


じゃあ、

Sub bbb()
  Workbooks("コピー元").Worksheets(1).Copy After:=Workbooks("Book2").Worksheets(1)
End Sub

こういうこと?

怒られる

インデックスが有効範囲にありません。

ハイハイ。

vba ブックの指定」でちゃんと調べましょう。


・・・・・・・・


ふーん、そうかあ、なるほどねえ。

Windowsのフォルダ設定で「拡張子を表示する」になっている場合は、「Workbooks("コピー元")」じゃなくて「Workbooks("コピー元.xlsx")」じゃないとダメなのか。

え? でも「Workbooks("Book2")」は怒られなかったのに。


・・・・・・・・


はあ。保存してないブックは逆に拡張子をつけちゃいけないのね。

Book2は「Workbooks.Add」したてだもんね。


じゃあ、

Sub bbb()
  Workbooks("コピー元.xlsx").Worksheets(1).Copy After:=Workbooks("Book2").Worksheets(1)
End Sub

こういうことでしょうか。

ファイルの名前 シート
コピー元.xlsx コピー元1 コピー元2 コピー元3
Book2 Sheet1コピー元1 Sheet2 Sheet3

できた...のか?

まとめ

とても疲れました(書くのが)