Excelマクロ実行時の「実行時エラー70 書き込みできません」解決ガイド

Excel VBAで「実行時エラー70 書き込みできません」が出たら、止まった行と、その行が操作しているファイル・フォルダー・オブジェクトを先に確認します。最初からユーザーを管理者へ変更したり、すべてのマクロを有効にしたりする必要はありません。

特に、既存のExcelブックをVBAのOpen文でFor Outputとして開くと、ブックをテキスト出力先として扱ってしまいます。大切な.xlsxファイルで書き込みテストをしないでください。以下では、アクセス権、使用中のファイル、保存先、コード上の操作を分けて確認します。

目次

実行時エラー70の意味

MicrosoftのVBA資料では、エラー70はアクセスが拒否された状態を示し、書き込み保護されたファイルやディスク、別のプロセスによるロック、アクセスできないリソースなどが例として挙げられています。番号だけではどの対象が拒否したか分からないため、失敗した命令と実際のパスを確認します。

最初に止まった行を確認する

作業中のブックと対象ファイルを退避し、元データではなく検証用コピーで調べます。VBAのエラーダイアログで「デバッグ」が選べる場合は、黄色く表示された行を確認します。コードを編集する前に、Err.Number、エラー文、対象の操作、発生時刻を記録してください。

エラー処理が先に捕捉していて行が分からない場合は、保守担当者がブレークポイントやステップ実行で対象を絞ります。何が失敗したか分からないままResume Nextで続行すると、保存できていないのに処理が完了したように見えることがあります。

症状ごとに確認すること

ファイルを新規作成する行なら、親フォルダーが存在するか、そのユーザーがそこへ作成できるか、保存先を想定どおり解決できているかを確認します。既存ファイルの上書き・削除・名前変更なら、読み取り専用属性、他のアプリによる使用、必要なアクセス権も確認します。

同じユーザーがエクスプローラーで無害な新規テキストファイルを作成できるかは切り分けの一つです。ただし、ファイルを作れることだけで、既存ファイルの置換・削除やExcelプロセスのアクセスも許可されるとは限りません。既存の業務ファイルを削除して試すことは避けてください。

別ユーザーでのみ失敗する場合は、ユーザー別パス、共有フォルダーの権限、接続先、ログイン資格情報、組織ポリシーを比較します。他人のパスワードで試したり、Everyoneへフルコントロールを追加したりするのではなく、管理者に必要な操作と対象を伝えて最小限の権限を確認します。

保存先のパスとブックの状態を確認

C:\Users\Usernameのような固定パスは、実際のユーザー名やフォルダー移動と一致しないことがあります。OneDriveへ移動したドキュメント、ネットワークドライブ、URL形式のブック保存先も、ローカルファイルのパスと同じとは限りません。ThisWorkbook.Pathなどの値を確認し、未保存ブックなら空文字列になる点も考慮します。

パスの間違いは、必ずエラー70になるわけではありません。ファイル未検出、パス未検出、Excelの保存処理などでは別の番号が出ることもあるため、番号と止まった行をセットで見ます。「保存できない」という症状だけで、すべてをエラー70と扱わないでください。

別のExcelやアプリで対象ファイルを開いている場合は、利用者へ確認し、通常の終了操作で閉じてもらいます。ロックを解除するために他人の処理を強制終了したり、共有ファイルを削除したりしないでください。同期中やオフラインの場所では、まず承認されたローカルの検証フォルダーとの違いを調べます。

Excelブックとテキスト出力を混同しない

VBAのOpen文による順次ファイル入出力は、テキストファイルなどを読み書きする仕組みで、ExcelのWorkbooks.Openとは別です。Microsoftの日本語VBAガイドも、Excelスプレッドシートなどアプリ固有形式のファイルをOpen文で扱うと破損する可能性を警告しています。既存の.xlsxをFor Outputで開いてWriteする例は、診断用に使わないでください。

既存ブックを更新するなら、Workbooks.Openなどでブックとして開き、Workbook.SaveまたはSaveAsを使います。SaveAsでは保存先・形式・マクロの有無を確認し、警告を隠して既存ファイルを上書きする設計にしないでください。テキストを作る場合は、新しい.txtなどの出力ファイルを別に用意します。

新規テキストファイルだけで切り分ける例

次の例は、Windows版Excelで、利用が許可された検証用フォルダーに無害な新規テキストファイルを作成するためのものです。既存ファイルを上書きしない作成方法を使い、処理が失敗した場合は後続の書き込みを続けません。会社のルールでマクロが禁止されている場合は、実行せず管理者へ相談してください。

標準モジュールに次のコードを貼り付け、CheckNewTextFileSafelyを実行します。フォルダーを選び、表示された新規ファイルのパスを確認して、許可できる場合だけYesを選びます。VBEのイミディエイトウィンドウはCtrl+Gで表示できます。コードは静的確認のみで、実際のExcelでのコンパイル・動作テストは行っていません。

Option Explicit

' Draft for Windows desktop Excel. Not runtime-tested in Excel.
' Run only reviewed code in a folder approved for a new harmless .txt file.
' Existing files are never opened for writing or deleted by this procedure.
Public Sub CheckNewTextFileSafely()
    Dim picker As Object, fso As Object, ownStream As Object
    Dim folderPath As String, testPath As String, stage As String
    Dim errorNumber As Long, errorDescription As String, errorSource As String
    Dim cleanupError As String

    On Error GoTo Failed
    stage = "Choose an approved folder"
    Set picker = Application.FileDialog(4) ' msoFileDialogFolderPicker
    With picker
        .Title = "Choose a folder approved for a NEW test .txt file"
        .AllowMultiSelect = False
        If .Show <> -1 Then Exit Sub
        folderPath = .SelectedItems(1)
    End With

    stage = "Prepare a new test filename"
    Set fso = CreateObject("Scripting.FileSystemObject")
    testPath = fso.BuildPath(folderPath, _
        "ittrip_error70_test_" & Format$(Now, "yyyymmdd_hhnnss") & ".txt")

    If MsgBox("Create this NEW harmless text file?" & vbCrLf & _
        testPath & vbCrLf & vbCrLf & _
        "No existing file will be overwritten." & vbCrLf & _
        "The new file will remain for you to inspect or remove.", _
        vbYesNo Or vbQuestion Or vbDefaultButton2, "Confirm test") <> vbYes Then
        Exit Sub
    End If

    stage = "CreateTextFile: new file only"
    ' False forbids replacement even if the proposed name already exists.
    Set ownStream = fso.CreateTextFile(testPath, False, True)
    stage = "WriteLine: harmless fixed text"
    ownStream.WriteLine "ITtrip diagnostic: new text file creation test."
    stage = "Close: this procedure's stream only"
    ownStream.Close
    Set ownStream = Nothing

    Debug.Print "Test completed: "; testPath
    MsgBox "Created and closed this new text file:" & vbCrLf & _
        testPath & vbCrLf & vbCrLf & _
        "This does NOT prove that saving or replacing a workbook will work.", _
        vbInformation, "Limited test succeeded"
    Exit Sub

Failed:
    ' Save the original error BEFORE cleanup can change Err.
    errorNumber = Err.Number
    errorDescription = Err.Description
    errorSource = Err.Source
    cleanupError = CloseOwnedTextStream(ownStream)

    Debug.Print "Time: "; Format$(Now, "yyyy-mm-dd hh:nn:ss")
    Debug.Print "Stage: "; stage
    Debug.Print "Path: "; testPath
    Debug.Print "Error: "; errorNumber; " / "; errorDescription
    Debug.Print "Source: "; errorSource
    If Len(cleanupError) > 0 Then Debug.Print "Close error: "; cleanupError

    MsgBox "Stopped at: " & stage & vbCrLf & _
        "Error " & CStr(errorNumber) & ": " & errorDescription & vbCrLf & _
        "Details are in the VBE Immediate window." & vbCrLf & _
        "A new test file may remain; inspect the reported path manually.", _
        vbExclamation, "Test stopped"
    Exit Sub
End Sub

Private Function CloseOwnedTextStream(ByRef ownStream As Object) As String
    On Error GoTo CloseFailed
    If Not ownStream Is Nothing Then
        ownStream.Close
        Set ownStream = Nothing
    End If
    Exit Function

CloseFailed:
    CloseOwnedTextStream = CStr(Err.Number) & ": " & Err.Description
    Set ownStream = Nothing
End Function

CreateTextFileの第2引数Falseは既存ファイルの上書きを禁止し、第3引数TrueはUnicodeテキストを指定しています。同じ秒に同名ファイルが存在する場合も、置き換えずにエラーで停止します。マクロの参照設定追加は不要ですが、WindowsのScripting.FileSystemObjectを使うためMac版やWeb版向けの例ではありません。

この結果は「そのフォルダーへ、この方法で、新しいテキストファイルを書けるか」の切り分けです。既存ブックの上書き、ネットワーク共有全体、別ユーザー、すべてのVBA処理の正常性を保証しません。失敗時に部分的な検証ファイルが残る場合は、内容と作成者を確認してから手動で片付けます。

セキュリティ設定を一律に緩めない

すでにVBAが実行され、特定のファイル操作でエラー70になっている場合、「警告を表示せずにすべてのマクロを有効にする」へ変更しても、そのファイル操作の権限を与えることにはなりません。信頼できる場所の追加も、NTFSや共有フォルダーのアクセス権を修正する機能ではありません。

セキュリティ製品やフォルダー保護が関係する可能性があるときは、対象時刻の通知や組織の監査記録を確認し、管理者へ相談します。ウイルス対策やファイアウォールを広く停止したり、ドライブ全体を例外にしたりする対処は避けてください。管理者としてExcelを動かすことも、日常の標準対策にしません。

共有フォルダー・ネットワーク環境での注意

共有フォルダーでは、共有側とファイルシステム側の権限、実際に使われる資格情報、ネットワーク接続を確認します。ネットワークドライブの文字が別環境で同じ場所を指すとは限りません。ユーザー、起動方法、接続先をそろえて比較します。

接続障害やアクセス拒否が確認されたら、管理者へ対象フォルダー、実行ユーザー、必要な操作(新規作成・読み取り・置換など)を伝えます。アカウントを管理者にすることと、サーバー側で必要な権限を与えることは同じではありません。

問い合わせに必要な情報

Excelの版とビット数、Windowsの版、エラー番号と全文、止まった行、ローカル/共有/同期フォルダーの区別、対象ファイルが使用中か、直前の変更、試した結果を整理します。コードやログを送るときは、パスに含まれる氏名、顧客情報、資格情報などを除き、機密ファイルそのものを公開掲示板へ添付しないでください。

よくある質問

管理者権限を付ければ解決しますか?

原因によります。ファイルが使用中、読み取り専用、保存先の誤り、サーバー側の権限、コードの誤りなどは、PCの管理者権限だけで解消するとは限りません。まず失敗した操作を特定します。

エラーを無視して続けてもよいですか?

保存や書き込みの失敗を無視すると、出力欠落や不完全な処理につながります。Err.Numberなどを保存し、開いたリソースを安全に閉じて処理を中止する設計にします。限定的な後片付け以外に、無条件のResume Nextを使うのは避けてください。

新しいテキストファイルは作れるのに、Excel保存は失敗します

新規作成と既存ファイルの置換では、必要な権限やロック状態が異なります。Workbookの保存処理、ファイル形式、既存ファイルの使用状態、実際の保存先を確認してください。

まとめ

エラー70は、止まった行と対象を確認してから、権限・ロック・パス・コードを切り分けます。既存の.xlsxをFor Outputで開かず、管理者化やマクロ保護の解除を最初の対処にしないことが重要です。元データを保護し、無害な新規ファイルで確認できる範囲から調べましょう。

参考:Microsoft公式資料

書き込みできません(エラー70)/ファイルへのデータの書き込みと注意点/Workbook.SaveAs。

CreateTextFile/Application.FileDialog/On Errorとエラー情報の保存/マクロのセキュリティ設定。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次