[解決済み] XLSMをCSVで保存しようとすると、「オブジェクト_workbookのメソッドsaveasに失敗しました」エラーが発生する
質問
マクロが使えるExcelワークブックをcsvファイルとして、古いものを上書き保存しようとしています(以下、フォルダとシートの名前を変更する必要がありましたが、それは問題ではないようです)。
Sub SaveWorksheetsAsCsv()
Dim SaveToDirectory As String
Dim CurrentWorkbook As String
Dim CurrentFormat As Long
CurrentWorkbook = ThisWorkbook.FullName
CurrentFormat = ThisWorkbook.FileFormat
SaveToDirectory = "\MyFolder\"
Application.DisplayAlerts = False
Application.AlertBeforeOverwriting = False
Sheets("My_Sheet").Copy
ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
ActiveWorkbook.Close SaveChanges:=False
ThisWorkbook.Activate
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat
Application.DisplayAlerts = True
Application.AlertBeforeOverwriting = True
End Sub
で失敗することがあります。
ランタイムエラー1004:オブジェクト_workbookのメソッドsaveasに失敗しました**)
デバッガで指摘される。
ActiveWorkbook.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
ググってみたところ、試した解決策はいくつかありました。
- ディレクトリが文字列であることを指定する。
- ファイル名やフォルダに特殊文字が含まれないようにする。 ここで )
- .csvとして保存する前に、ワークシートを値としてコピーペーストします(参照 ここで )
- FileFormatを.csvのコード番号で指定する(参照 ここで )
- 一部のアラートの無効化/再有効化
- ActiveWorkbook.SaveAsの行に、パスワードやバックアップの作成など、他のフィールドを追加することができます。
それでも、50~60回くらいは連続で正しく動作して、ある時点でまた失敗することがあります。
このタスクにVBA/Excelを使うのをやめる以外に何か提案があれば、すぐにでもそうしたいのですが、今のところできません。
EDIT: Degustafの提案のおかげで解決しました。Degustafの提案したコードに2つだけ変更を加えました。
-
ThisWorkbook.Sheets
ではなくCurrentWorkbook.Sheets
-
FileFormat:=6
ではなくFileFormat:=xlCSV
(より堅牢であるらしい は、異なるバージョンのExcelに対応するために)
Sub SaveWorksheetsAsCsv()
Dim SaveToDirectory As String
Dim CurrentWorkbook As String
Dim CurrentFormat As Long
Dim TempWB As Workbook
Set TempWB = Workbooks.Add
CurrentWorkbook = ThisWorkbook.FullName
CurrentFormat = ThisWorkbook.FileFormat
SaveToDirectory = "\\MyFolder\"
Application.DisplayAlerts = False
Application.AlertBeforeOverwriting = False
ThisWorkbook.Sheets("My_Sheet").Copy Before:=TempWB.Sheets(1)
ThisWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=6
TempWB.Close SaveChanges:=False
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat
ActiveWorkbook.Close SaveChanges:=False
Application.DisplayAlerts = True
Application.AlertBeforeOverwriting = True
End Sub
解決方法は?
私は一般的に
ActiveWorkbook
がこのような場合の問題です。 つまり、どういうわけかそのワークブック(または他のワークブック)が選択されていないため、Excelがどうすればいいかわからないということです。 残念ながら
copy
は何も返さないので(コピーしたワークシートがあればいいのですが)、これはこの問題に対する標準的なアプローチ方法です。
そこで、このシートを新しいワークブックにコピーして、そのワークブックへの参照を取得するにはどうすればよいかというアプローチをとります。 新しいワークブックを作成し、そのシートをコピーすることができます。
Dim wkbk as Workbook
Set Wkbk = Workbooks.Add
CurrentWorkbook.Sheets("My_Sheet").Copy Before:=Wkbk.Sheets(1)
Wkbk.SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
Wkbk.Close SaveChanges:=False
あるいは、このような状況では、さらに優れた方法があります。
WorkSheet
がサポートする
SaveAs
メソッドを使用します。 コピーは必要ありません。
CurrentWorkbook.Sheets("My_Sheet").SaveAs Filename:=SaveToDirectory & "My_Sheet" & ".csv", FileFormat:=xlCSV
ワークブックが開いたままになっている場合は、後で元の名前に再保存するように警告しますが、あなたのコードではすでにそうなっていますね。
関連
-
excel カラーレコードの値を設定する方法
-
[解決済み] どのようにvbaコードで "名前を付けて保存 "を行うには、datestampと私の現在のExcelワークブックを保存するには?
-
[解決済み] ExcelでのIF - ELSE IF - ELSE構造
-
[解決済み] エクセルVBAで行を削除する
-
[解決済み] UTF8エンコーディングでExcelからCSVに変換する【終了しました
-
[解決済み] エクセルファイルの正しいcontent-typeは何ですか?重複
-
[解決済み】VBAの関数から結果を返す方法
-
[解決済み】Excel:文字列の最後の文字/文字列の一致
-
[解決済み】Excel VBAでSelectを使用しないようにする方法
-
[解決済み] VBAを使わずにExcelで文字列の逆引き検索を行うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] VBAのエラーです。"コンパイルエラーです。期待される End Sub"
-
[解決済み] セル内に改行文字を追加する(CSV)
-
[解決済み] VBAでイミディエイトウィンドウを消すには?
-
[解決済み] Excelのセルに画像を挿入する【終了
-
[解決済み] VBAでファイルが存在するかどうかを確認する
-
[解決済み] "ピボットテーブルのフィールド名が有効ではありません。ピボットテーブルレポートを作成するには、ラベル付き列のリストとして構成されたデータを使用する必要があります」エラー
-
[解決済み] エクセルVBAで行を削除する
-
[解決済み] VBA+エクセル+トライキャッチ
-
[解決済み] Excel =CELL("color",[Cell])関数
-
[解決済み] データ列全体の先頭または末尾の空白を削除する