既存のExcelファイルのシートを新しいファイルにコピーして保存したいと思い、以下のプログラムを作成しました。
Private Sub Command1_Click()
Dim ExcelApp As New Excel.Application 'エクセルを宣言する
Dim Book As Object
Dim strConnect As String
Dim strConnect2 As String
Dim intSheetCnt As Integer 'シート数
Dim blnRet As Boolean '戻り値
strConnect = "C:\Excel04\Book.xls"
strConnect2 = "C:\Excel12\Book1.xls"
Set Book = CreateObject("Excel.Application")
Book.Application.Visible = False
Book.Application.Workbooks.Open FileName:=strConnect '指定したファイルを開く
Book.Worksheets(Book.Worksheets.Count).Copy '最後尾のシートを新規ブックへコピー
Book.ActiveSheet.Name = "ブック" 'シート名を設定
'名前をつけて保存
Book.ActiveWorkbook.SaveAs FileName:=strConnect2, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
Book.ActiveWorkbook.Close
Book.Workbooks(strConnect).Close SaveChanges:=False ←
ExcelApp.Quit
Set ExcelApp = Nothing
End Sub
しかし、コピー元のファイルを閉じるソース(矢印部分)が上手く起動されず、
開いたままプログラムが終了されて以降そのファイルを開こうとしても常に
「使用中」になってしまいます。
保存元ファイルを上手く終了させるにはどうしたらよいのでしょうか?
魚武さんへ
Dim ExcelApp As New Excel.Application 'エクセルを宣言する
Set Book = CreateObject("Excel.Application")'またエクセルを宣言している
上記、2行の意味がわかれば終了しますよ。
Private Sub Command1_Click()
Dim Book As New Excel.Application 'エクセルを宣言する
Dim strConnect As String
Dim strConnect2 As String
Dim intSheetCnt As Integer 'シート数
Dim blnRet As Boolean '戻り値
strConnect = "C:\VB\LRB0130テスト\Excel\Excel04\Book.xls"
strConnect2 = "C:\VB\LRB0130テスト\Excel\Excel12\Book1.xls"
Book.Application.Visible = False
Book.Application.Workbooks.Open FileName:=strConnect '指定したファイルを開く
Book.Worksheets(Book.Worksheets.Count).Copy '最後尾のシートを新規ブックへコピー
Book.ActiveSheet.Name = "ブック" 'シート名を設定
'名前をつけて保存
Book.ActiveWorkbook.SaveAs FileName:=strConnect2, FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
Book.ActiveWorkbook.Close
Book.Workbooks(1).Close SaveChanges:=False ←
Book.Quit
Set Book = Nothing
End Sub
VB梅さんの指示通りExcelの宣言をBookのみにして矢印部分も「Workbooks(strConnect)」から「Workbooks(1)」に
変更したら上手くいきました。
Workbooksはファイル名を指定する必要は無かったんですね。
VB から Excel を操作する場合、
>ActiveSheet
>ActiveWorkbook
といった Active〜系のプロパティや Selection は極力使用を避けます。
>「Workbooks(1)」に変更したら
これも、複数の WorkBook を扱うのであれば好ましくありません。
> Dim Book As New Excel.Application 'エクセルを宣言する
宣言を見れば分かるように、Excel.Application ですから、Excel.Workbook と
混同するような変数名は使用を避けるべきです。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060089.txt
参考にしてください。
ツイート | ![]() |