DOBON.NET DOBON.NETプログラミング掲示板過去ログ

EXCELシートのコピーについて

環境/言語:[Win 2000 Pro VB.NET 2003]
分類:[.NET]

いつもお世話になります。

現在VB2003 EXCEL2000にて開発を行っています。

実現したい内容
 あるフォルダに複数EXCELのBOOKが存在しているのですが
 EXCEL BOOKを新規に作成してそのBOOKにフォルダ内の
 EXCELBOOK内のシートをコピーしたいのですが良い方法
 がみつかりません。
 (既存のファイルにコピーする方法には成功したのですが)
Dim File1 As New Excel.Application
Dim File1_book As Excel.Workbook ' コピー元ファイル
Dim File2_book As Excel.Workbook ' コピー先ファイル
Dim File3_book As Excel.Workbook ' コピー先ファイル

File1 = CreateObject("Excel.Application")
File1.Workbooks.Open("C:\Book1.xls")
File1.Workbooks.Open("C:\Book2.xls")
File1.Workbooks.Open("C:\Book3.xls")
File1_book = File1.Workbooks("Book1.xls")
File2_book = File1.Workbooks("Book2.xls")
File3_book = File1.Workbooks("Book3.xls")
File2_book.Sheets("Sheet1").Copy(after:=File1_book.Sheets("Sheet1"))
File3_book.Sheets("Sheet1").Copy(after:=File1_book.Sheets("Sheet1"))
File1.ScreenUpdating = True
File1.SaveWorkspace()

        〜

上記のでEXCELのシートをコピーすると
Sheet1,Sheet1(3),Sheet1(2)

のようにシートの順番がコピーした順番にならないのは
なぜなのでしょうか?
ちなみにシートの順番などをソートする方法などは
あるのでしょうか?

よろしくお願いします。
■No18539に返信(こうさんの記事)
> のようにシートの順番がコピーした順番にならないのはなぜなのでしょうか?

Before の方も指定すると意図どおりになりませんか?

それにしても...

> Dim File1 As New Excel.Application
> File1 = CreateObject("Excel.Application")

これ、無意味です。
最初の段階でインスタンス化しているのに、再度インスタンスを取得しています。
(しかも、暗黙の型変換つきで)

> File1.Workbooks.Open("C:\Book1.xls")
> File1.Workbooks.Open("C:\Book2.xls")
> File1.Workbooks.Open("C:\Book3.xls")
> File1_book = File1.Workbooks("Book1.xls")
> File2_book = File1.Workbooks("Book2.xls")
> File3_book = File1.Workbooks("Book3.xls")
> File2_book.Sheets("Sheet1").Copy(after:=File1_book.Sheets("Sheet1"))
> File3_book.Sheets("Sheet1").Copy(after:=File1_book.Sheets("Sheet1"))

同じことを何度も言っていると思いますが、参照カウントのデクリメントが漏れています。
http://jeanne.wankuma.com/tips/programing/releasecom.html
じゃんぬさんお返事ありがとうございます。

beforeやafterを使用した場合前や後ろにき
省略すると先頭にくると思うのですが、
常にシートの末尾に来るようにはできるの
でしょうか?
調べてみたのですがafter,before,省略
以外にはみつかりませんでした。

わかれば宜しくお願いします。
> 調べてみたのですがafter,before,省略
> 以外にはみつかりませんでした。

応用すればいいのでは
After:=Sheets(Worksheets.Count)

こちらの問題よりプロセスが解放されない方が大問題では。
VBレスキュー(花ちゃん) さんお返事ありがとうございす。

countを取る事で最後に挿入することが出来ました。

ちなみにプロセスの解放ですが

Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks
xlBooks = xlApp.Workbooks

Dim xlBook1 As Excel.Workbook
xlBook1 = xlBooks.Open(Path1)

Dim xlBook2 As Excel.Workbook
xlBook2 = xlBooks.Open(Path2)

Dim xlSheets1 As Excel.Sheets
xlSheets1 = xlBook1.Worksheets

Dim xlSheet1 As Excel.Worksheet
xlSheet1 = xlSheets1(xlSheets1.Count)

Dim xlSheets2 As Excel.Sheets
xlSheets2 = xlBook2.Worksheets

Dim xlSheet2 As Excel.Worksheet
xlSheet2 = xlSheets2(1)

xlSheet2.Copy(after:=xlSheet1)


xlBook1.Save()
xlBook2.Close()
    xlBook1.Close()

xlApp.Visible = False
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

と記述することで解放はされるようになりました。
(例外処理の実装はまだですが)

参考にしたページ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27802&forum=7

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板