6

サブルーチンでは、ワークブックを開いて、そこから読み取りを行い、閉じたいと思います。
何らかの理由で、エラーが発生します。

Run-time error '1004':

Method 'Close' of object _Workbook failed

問題を再現するための最小限のコードスニペットを特定しました。
新しいExcelファイルを作成します。その中で、ユーザーフォームを作成します。その上で、次のClickイベントコードを使用してコマンドボタンを作成します。

Private Sub CommandButton1_Click()
    Dim filename As String
    Dim opened_workbook As Workbook

    filename = Application.GetOpenFilename()    ' User selects valid Excel file
    Set opened_workbook = Application.Workbooks.Open(filename)
    ' File operations would occur here
    opened_workbook.Close    ' Exception thrown here

    MsgBox "If you got here, it worked!"
    Unload Me
End Sub

私を本当に困惑させているのは、コマンドボタンがユーザーフォーム上にない場合(ワークシート上にあるプレーンボタン上)、同じコードではこのエラーが発生しないことです。

他に何を報告するか、この動作を説明するためにどこを見ればよいかさえわかりません(StackOverflow以外!)。私はExcelforMac 2011を使用してVBAを作成していますが、違いが生じた場合はWindowsExcel2010に移行できます。

4

2 に答える 2

7

はい、Excel 2011 ではバグです (文書化されていない - まだ文書が見つかりません)。コードを少し変更する必要があります。これを試して

Private Sub CommandButton1_Click()
    Dim filename As String
    Dim opened_workbook As Workbook

    filename = Application.GetOpenFilename()    ' User selects valid Excel file
    Set opened_workbook = Application.Workbooks.Open(filename)

    Unload Me

    opened_workbook.Close    

    MsgBox "If you got here, it worked!"
End Sub
于 2012-05-16T08:17:33.827 に答える
1

Mac 上の Excel 11 (Windows 上の Excel 2013 で正常に動作) でこの正確な問題が発生しましたが、UserForm から呼び出されたモジュール サブルーチンでのみエラーが発生しました。誰か (私のような) がユーザー フォーム自体の内部にないモジュール (または別の場所) のサブ/関数から workbook.close メソッドを使用しようとしている場合、「Me」は使用できません。「Me」は、UserForm コード自体の中でのみ使用できます。

「Unload Me」の代わりに、unload 関数とユーザー フォームの名前を使用します。

Unload UserFormName
于 2016-08-31T18:29:15.023 に答える