tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVBからExcel起動でファイルを開く
記事No14747
投稿日: 2010/06/11(Fri) 15:23
投稿者はち
VBからExcelを起動し、ファイルを開き、シートし、書き込むのを作っています。
Excelを直接起動し、ファイルを開いた状態で、VBからExcelを起動し、ファイル
を開いた後、ファイルを閉じる処理でエラーとなります。
エラー時の処理は作っていません。

「サンプル.xls」というファイルを開く様にしています。
このファイルを、Excelで既に、開いている状態で、動かすと、
ファイルを閉じる処理で、エラーとなります。

ファイルを閉じる処理は、
    xlBook.SaveAs strExcelFile
    xlBook.Close
    xlApp.Quit
を行っていますが、
    xlBook.SaveAs strExcelFile
でエラーとなってしまいます。
どのよにすれば、正常に終了できますか。

もう1点、教えて欲しいのですが、
ファイルを開く際に、該当のファイルが、既に開かれているか確認して、
開かれている場合、メッセージを出して終了、開かれていない場合、処理を継続
したいのですが、どのようにすればよいですか。

お願いします。

--------------------------------------------------------------------------------
Private Sub Command1_Click()
    Dim Fso As FileSystemObject
    Dim xlApp   As Excel.Application
    Dim xlBook  As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim ws      As Excel.Worksheet

    Dim FileDir As String
    Dim strToday As String
    Dim strExcelFile As String
    Dim strExcelSheet As String
    Dim tmpSheet As String
    Dim wsCnt As Integer

    FileDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
    Set Fso = CreateObject("Scripting.FileSystemObject")
    If Fso.FolderExists(FileDir) = False Then
        Fso.CreateFolder FileDir
    End If

    strExcelFile = FileDir & "\" & "サンプル.xls"
    strExcelSheet = "サンプル"

    Set xlApp = New Excel.Application
    xlApp.SheetsInNewWorkbook = 1
    If Fso.FileExists(strExcelFile) = True Then
        Set xlBook = xlApp.Workbooks.Open(strExcelFile)
        Set xlSheet = xlBook.Worksheets.Add(after:=xlBook.Worksheets(xlBook.Worksheets.Count))
    Else
        Set xlBook = xlApp.Workbooks.Add
        Set xlSheet = xlBook.Worksheets(1)
    End If

    wsCnt = 0
    For Each ws In xlBook.Worksheets
        tmpSheet = ws.Name
        If InStr(1, tmpSheet, strExcelSheet, 1) <> 0 Then
            wsCnt = wsCnt + 1
        End If
    Next
    If wsCnt <> 0 Then
        strExcelSheet = strExcelSheet & " (" & wsCnt + 1 & ")"
    End If

    xlApp.Visible = False
    xlSheet.Activate

    DoEvents

    '処理

    xlApp.DisplayAlerts = False
    xlSheet.Name = strExcelSheet
    xlBook.SaveAs strExcelFile
    xlBook.Close
    xlApp.Quit

    If Fso.FileExists(strExcelFile) = False Then
        MsgBox strExcelFile & Chr(13) & Chr(10) & "が作成できません。"
    Else
        MsgBox strExcelFile & Chr(13) & Chr(10) & "に作成しました。"
    End If

    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    Set Fso = Nothing
End Sub

[ツリー表示へ]
タイトルRe: VBからExcel起動でファイルを開く
記事No14748
投稿日: 2010/06/11(Fri) 16:54
投稿者花ちゃん
>     xlBook.SaveAs strExcelFile
> でエラーとなってしまいます。

名前を付けて保存と上書き保存では処理方法が違いますよ。
http://www.hanatyan.sakura.ne.jp/vbhlp/excel02.htm

xlApp.DisplayAlerts = False の部分をコメントにして実行したら、どのような
メッセージのダイアログが表示されますか?


> もう1点、教えて欲しいのですが、
> ファイルを開く際に、該当のファイルが、既に開かれているか確認して、
> 開かれている場合、メッセージを出して終了、開かれていない場合、処理を継続
> したいのですが、どのようにすればよいですか。
簡易的な方法なら
http://www.hanatyan.sakura.ne.jp/vbhlp/excel03.htm

[ツリー表示へ]
タイトルRe^2: VBからExcel起動でファイルを開く
記事No14749
投稿日: 2010/06/11(Fri) 19:41
投稿者はち
>  xlApp.DisplayAlerts = False の部分をコメントにして実行したら、どのような
> メッセージのダイアログが表示されますか?

ファイルが存在しない状態で実行すると、正常にファイルが作成されます。

「ファイルが存在する状態で実行すると、以下のメッセージが表示される。
 この場所に 'C:\Documents and Settings\〜\サンプル.xls' という名前のファイルが既にあります。置き換えますか?
 はい いいえ キャンセル」
のメッセージがでいます。

はいを押下すると正常に終了する。

いいえを押下すると、以下のメッセージを表示して、エラーとなる。
「実行エラー '1004'
 SaveAs' メソッドは失敗しました。 'Wookbook' オブジェクト」


Excelですでにファイルを開いている状態で、VBから起動し開くと、
以下のメッセージを表示して、エラーとなる。
「実行エラー '1004'
サンプル.xls' は読み取り専用です。アクセスできません。」

となります。

[ツリー表示へ]
タイトルRe^3: VBからExcel起動でファイルを開く
記事No14750
投稿日: 2010/06/11(Fri) 19:47
投稿者花ちゃん
> >  xlApp.DisplayAlerts = False の部分をコメントにして実行したら、どのような
> > メッセージのダイアログが表示されますか?
>
> ファイルが存在しない状態で実行すると、正常にファイルが作成されます。
>
> 「ファイルが存在する状態で実行すると、以下のメッセージが表示される。
>  この場所に 'C:\Documents and Settings\〜\サンプル.xls' という名前のファイルが既にあります。置き換えますか?
>  はい いいえ キャンセル」
> のメッセージがでいます。
>
> はいを押下すると正常に終了する。
>
> いいえを押下すると、以下のメッセージを表示して、エラーとなる。
> 「実行エラー '1004'
>  SaveAs' メソッドは失敗しました。 'Wookbook' オブジェクト」
>
>
> Excelですでにファイルを開いている状態で、VBから起動し開くと、
> 以下のメッセージを表示して、エラーとなる。
> 「実行エラー '1004'
> サンプル.xls' は読み取り専用です。アクセスできません。」
>
> となります。

だったらどうすればいいのか、解りますよね。
(前の回答をよく読んで下さい)

[ツリー表示へ]
タイトルRe^4: VBからExcel起動でファイルを開く
記事No14752
投稿日: 2010/06/14(Mon) 10:50
投稿者はち
> だったらどうすればいいのか、解りますよね。
> (前の回答をよく読んで下さい)

ありがとうございます。
Excelが既に起動中か、指定ファイルが既に開いているかでできます。

そこでなんですが、
On Error Resume Nextを使って、エラーになってもひっかからないようにしています。
プロシージャの先頭に書いていますが、
On Error Goto 〜も使っています。
併用などれきる。?

「On Error Resume Next」 を使って、エラーになってもひっかからないようにしていますが、
プロシージャの先頭に書いていますが、
実際は、「On Error Goto 〜」 を使っています。

併用できるのですか。
切替できるのですか。
ここの部分は、On Error Resume Nextを、ここの部分は、On Error Goto 〜を使う
といった使い分けができるのですか。

[ツリー表示へ]
タイトルRe^5: VBからExcel起動でファイルを開く
記事No14753
投稿日: 2010/06/14(Mon) 12:14
投稿者花ちゃん
> ここの部分は、On Error Resume Nextを、ここの部分は、On Error Goto 〜を使う
> といった使い分けができるのですか。

聞くよりご自分で試した方が早いですよ。
又は、ヘルプを確認するとか?

少なくても、ご自分で試した結果を質問するようにして下さい。

[ツリー表示へ]
タイトルRe^6: VBからExcel起動でファイルを開く
記事No14754
投稿日: 2010/06/14(Mon) 20:29
投稿者はち
> > ここの部分は、On Error Resume Nextを、ここの部分は、On Error Goto 〜を使う
> > といった使い分けができるのですか。
>
> 聞くよりご自分で試した方が早いですよ。
> 又は、ヘルプを確認するとか?
>
> 少なくても、ご自分で試した結果を質問するようにして下さい。

ご指摘ありがとうございます。
試してみます。
そこで、疑問などがでたら質問させていただきます。

[ツリー表示へ]
タイトルRe^7: VBからExcel起動でファイルを開く
記事No14760
投稿日: 2010/06/15(Tue) 20:19
投稿者はち
> > > ここの部分は、On Error Resume Nextを、ここの部分は、On Error Goto 〜を使う
> > > といった使い分けができるのですか。
> >
> > 聞くよりご自分で試した方が早いですよ。
> > 又は、ヘルプを確認するとか?
> >
> > 少なくても、ご自分で試した結果を質問するようにして下さい。
>
ありがとうございます。

以下の様にしたら上手く動きました。この様な考え方になるのでしょうか。

On Error GoTo ErrHandle
  処理1
On Error GoTo 0

On Error Resume Next
    If Len(Dir$(strExcelFile)) <> 0 Then
        Name strExcelFile As strExcelFile
        If Err.Number Then
            MsgBox "ファイルが使用中です。処理を終了します。"
            Err.Clear
            Exit Sub
        End If
    End If
On Error GoTo 0

On Error GoTo ErrHandle
  処理3

On Error GoTo ErrHandle
  エラー処理
End Sub

[ツリー表示へ]