0

xlamさまざまなファイルの操作を処理する (Excel 2007 アドイン) ファイルを作成しました。xlamそのファイルに、開いているファイルからいくつかのワークシートを削除し、それを(マクロなしで)xlsmとして保存する手順を書き込もうとしています。xlsx

これまでのところ、確実にできる唯一のことは、.SaveAs呼び出しに到達するたびに Excel をクラッシュさせることです。クラッシュは、Windows ダイアログに次のように表示されます。

Microsoft Office Excel が動作を停止しました。Windows は情報の回復とプログラムの再起動を試みることができます。【プログラムの再起動】 【プログラムのデバッグ】

保存先のフォルダーでは、クラッシュするたびに、保存しようとしたフォルダーに一時ファイル (例: ファイル名: 7A275000 、サイズ: 0) が残ります。

ここの後世のために、私が試したいくつかのこと、そしてすべてが同じクラッシュを引き起こしました:

  • ハードコードされたファイル名の値 (「C:\Users\myUserName\Desktop\temp.xlsx」)
  • ユーザーから要求されたファイル名 (以下のコードに表示)
  • パスなしのファイル名 (「temp.xlsx」)
  • 拡張子のないファイル名 (「C:\Users\myUserName\Desktop\temp」)
  • filename 拡張子なしの既存のファイル名
  • .xlsx 拡張子を持つ既存のファイル名としてのファイル名
  • を使用する代わりにwb.SaveAs、私はwb.Activate続いて使用しましたActiveWorkbook.SaveAs
  • 私は試してみましFileFormat:=xlOpenXMLWorkbookFileFormat:=xlWorkbookNormal
  • さまざまな長さのいくつかの異なるディレクトリに保存されます
  • 呼び出しの周りにエラー トラップ ステートメントを追加しました.SaveAs(エラーはトラップされず、Excel は同じようにクラッシュします)。

最後の奇妙な点は、呼び出し後に手動でファイルに名前を付けて保存しようとすると (つまり、自分で [名前を付けて保存] メニューに移動する) ws.delete、Excel が同じようにクラッシュすることです。自分でワークシートを手動で削除してから、手動で名前を付けて保存すると、問題なく保存されます。


問題のあるコードは次のとおりです。

Public Sub ConvertToStagingFile(ByRef wb As Workbook)
    Dim reWS As Object, reFILE As Object
    Dim ws As Worksheet

    Set reWS = CreateObject("VBScript.regexp")
    reWS.IgnoreCase = True: reWS.Global = False: reWS.MultiLine = False

    Set reFILE = CreateObject("VBScript.regexp")
    reFILE.IgnoreCase = True: reFILE.Global = False: reFILE.MultiLine = False

    reWS.Pattern = "^(home|location settings|date reference|[\w\s]{1,8} (rating|inquire) data|pkl data - \w{1,8}|verbs - \w{1,8})"
    reFILE.Pattern = "\.xlsm$"

    For Each ws In wb.Worksheets
        If (ws.Visible = xlSheetHidden) Or (ws.Visible = xlSheetVeryHidden) Then
            ws.Visible = xlSheetVisible
        End If

        Select Case True
            Case reWS.test(ws.name)
                '// Do Nothing
            Case Else
                Application.DisplayAlerts = False
                ws.Delete
                Application.DisplayAlerts = True
        End Select
    Next ws

    ActiveWindow.TabRatio = 0.75

    If (reFILE.test(Cached.getAdhocReportFull)) Then
        Dim newName As Variant

        newName = Application.GetSaveAsFilename(reFILE.Replace(Cached.getAdhocReportFull, ""), "*.xlsx")
        If newName = False Then Exit Sub

        wb.Activate

        Application.EnableEvents = False
        '// CODE RELIABLY CRASHES HERE
        wb.SaveAs _
            FileName:=newName, _
            FileFormat:=xlOpenXMLWorkbook, _
            CreateBackup:=False

        Application.EnableEvents = True

    End If
End Sub

この問題に関するヘルプをいただければ幸いです。

4

1 に答える 1