質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

11976閲覧

VBA実行エラー3004

starsecond

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/01/13 03:33

前提

VBAで編集したcsvデータ(文字コード:ANSI)をUTF-8のBOM無しで書き出そうとしています。
VBA実行時に同名で上書き保存しようとするとエラー3004が発生します。
14行目で名前を変えればエラーは出ません。

実現したいこと

同名で上書き保存

発生している問題・エラーメッセージ

実行時エラー'3004': ファイルへ書き込めませんでした。

該当のソースコード

Excel

1Sub CSV書き出し() 2 Dim i As Long 3 Dim j As Long 4 Dim strList As String 5 Dim wb As Workbook 6 Dim ws As Worksheet 7 8 Dim csvFile As String 9 MsgBox "編集元のファイルを選択してください。" 10 Workbooks.Open Application.GetOpenFilename 11 Set wb = ActiveWorkbook 12 Set ws = wb.Worksheets(1) 13 MsgBox "保存するファイルに任意の名前を付けてください" 14 csvFile = Application.GetSaveAsFilename(filefilter:="CSVブック,*.csv") 15 16 Dim strA As String 17 Dim strB As String 18 Dim strC As String 19 Dim adoSt As Object 20 Set adoSt = CreateObject("ADODB.Stream") 21 With adoSt 22 .Type = adTypeText 23 .Charset = "UTF-8" 24 .Open 25 End With 26 With ActiveSheet.UsedRange 27 For i = 1 To .Rows.Count 28 strList = "" 29 For j = 1 To .Columns.Count 30 If j > 1 Then 31 strList = strList & "," 32 End If 33 If InStr(.Cells(i, j), "(") > 0 Then 34 strA = Left(.Cells(i, j), InStr(.Cells(i, j), "(") - 1) 35 strB = Mid(.Cells(i, j), InStr(.Cells(i, j), "(") + 1) 36 strC = Left(strB, InStr(strB, ")") - 1) 37 strC = """" & strA & "(" & """" & """" & strC & """" & """" & ")" & """" 38 strList = strList & strC 39 Else 40 strList = strList & .Cells(i, j) 41 End If 42 Next 43 adoSt.WriteText strList, adWriteLine 44 Next 45 End With 46 Dim byteData() As Byte 47 With adoSt 48 .Position = 0 49 .Type = adTypeBinary 50 .Position = 3 51 byteData = .Read 52 .Close 53 .Open 54 .Write byteData 55 .SaveToFile csvFile, adSaveCreateOverWrite '←ここで3004エラー 56 .Close 57 End With 58 Set adoSt = Nothing 59End Sub

試したこと

ネット検索で権限について書かれていたのでマクロファイルのプロパティからセキュリティ権限を確認しましたが実行アカウントにフルコントロール付与済でした。

補足情報(FW/ツールのバージョンなど)

Microsoft 365(Excelバージョン2211,ビルド15831.20208)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

他のアプリがそのテキストファイルを開いているということはありません。もし、そうなら、そのアプリを閉じてから試してみてください。

下記で同様の質問がありますが、回答者さんは、ADODBで一時ファイルに保存してから、それをcopyコマンドで上書きコピーして解決しているようです。

Excel VBAでほかのアプリケーションで使用中(ロック)のファイルを上- その他(プログラミング・Web制作) | 教えて!goo

投稿2023/01/14 01:13

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

回答頂いた内容をヒントに、一旦別名で保存してから、FileSystemObjectで元ファイルを削除、別名で保存したファイルを元のファイル名にリネームで解決しました。
ありがとうございました。

投稿2023/01/23 08:32

starsecond

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問