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:=xlOpenXMLWorkbook
たFileFormat:=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
この問題に関するヘルプをいただければ幸いです。