VBからExcelのシートを操作する
VBからExcelを操作するのですが、
たとえば、Book1のSheet1 を Book2のSheet1の後ろへ
という形でシートをコピーしたいのですがうまくいきません。
Sheet1,Sheet2を Excel.Worksheet 型で定義した変数へそれぞれ取得し、Sheet1のcopyメソッドを使って試しています。
Sheet1.copy のみだと、新たなブックへきちんとコピーされるのですが、After:= Sheet2 をつけるとエラーが起きてしまいます。
この方法で、また、他の方法でもうまくいく方法を御存知の方、何卒御教授のほどをお願いします。
投稿日時 - 2002-03-19 19:36:49
遅くなりました!!
わたしが勘違いしていたようですね。
それにExcelオブジェクトの理解が浅はかだったようで、
ちょっと調べるのに時間がかかりました。
Dim EXObject As Object ''エクセルオブジェクト
Dim Book2 As Excel.Workbook
Dim Sheet2 As Excel.Worksheet
''EXCELオブジェクトの作成
Set EXObject = CreateObject("Excel.Application")
''EXCELのブック1を作成したオブジェクトの中に開く
EXObject.Workbooks.Open "D:\book1.xls"
''EXCELのブック2を作成したオブジェクトの中に開く
EXObject.Workbooks.Open "D:\book2.xls"
Set Book2 = EXObject.Workbooks("book2.xls")
Set Sheet2 = Book2.Sheets(1)
EXObject.Workbooks("Book1.xls").Sheets("Sheet1").Copy After:=Sheet2
''実際開いて確認
EXObject.Visible = True
これでどうでしょうか。
多分エラーが出るのは、GetObject("D:\book1.xls")で開くと、
エクセルのインスタンスが別に作成されてしまうからのような気がします。(多分)
これですと、一つのエクセルに、ブックを2枚開く形に
なりますので、コピーが可能です。
これじゃまずいでしょうか…。
また勘違いだったらごめんなさい。
投稿日時 - 2002-03-21 14:50:44
またまた回答ありがとうございます。
試行錯誤の結果、実は自己解決していました。
質問の締め切りが遅れて申し訳ありません。
まさにfisさんのご指摘どおりだと思います。
GetObject でブックを開くのではなく、Openでブックを開いておくと
Copy After:=Workbook("ブック名").sheets(1)
が使え、コピーがうまくできました。
ありがとうございました。
投稿日時 - 2002-03-21 17:29:22
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(2)
こんにちは!
Sheets("Sheet1").Copy After:=Sheets(2)
これでどうですか?
どうやらAfterはシート名ではなく、シートの番号を指定するようですね。
Excelで困ったときは、一度Excel上で同じ状態を作り、
ツール→マクロ→新しいマクロの記録
を行い、実際にやってみるとわかりやすいです。
登録が終了したマクロは、
ツール→マクロ→Visual Basic Editor
で確認できますよ^^
それでは、頑張って下さい!
投稿日時 - 2002-03-19 20:43:28
早速の回答ありがとうございます。
実は私もマクロの記録を利用してソースを読み、参考にしています。
便利ですよね。
Sheet2 を取得するときに、
dim Book2 as Excel.Workbook
dim Sheet2 as Excel.WorkSheet
set Book2 = GetObject("D:\book1.xls")
set Sheet2 = Book2.Sheets(1)
などと取得しているのですが、これで
Sheet1.Copy After:=Sheet2
とやるとうまくいきませんでした。
エラーメッセージも "_WorkSheet"がどうのこうのと出ていたので、Sheet2の型か何かが悪いのだと思うのですが…。
投稿日時 - 2002-03-19 21:07:39