こんにちはExcel 2007 on Win 7の環境でVBAを書いています。
ある別のアプリケーションがつかんでいるテキストファイルを新しい内容に置き換えたいのですが、うまくいかずに困っています。当初は「Open filename For Input As #n」の方法で開いて、編集して、保存することができていたのですが、アプリケーションの都合上、ファイルをUTF-8で保存する必要が出てきました。そのため、ADODB.Streamで書き直すことになったのですが、最後の「SaveToFile filename, 2」とすると、「アプリケーション定義またはオブジェクト定義のエラー」が出て書き込むことができません。
「Open file」して「Close」したり「Unlock」したりしたのですが、ADODB.StreamのSaveToFileで上書き保存できる状態になりません。
大元のアプリケーションをいったん終了させれば良いのでしょうが、それでは本末転倒なのです。
お知恵を貸してください
No.4ベストアンサー
- 回答日時:
こんにちは。
#3の回答者です。概ね、状況は理解しました。まだ、*ちょっと理解していない部分はあるけれども、私は、アプリ側の「排他制御」モードと読んでいます。アプリ側が許しているものとそうでないものがありますし、「排他」にするか、オプションで選べるものもあります。排他モードでも、種類を選べるものもあります。
だから、Open ~ For Input As ** でも、ADODB.Stream でも本来、ロックされた状態ですと、同じ結果というか、編集・保存は出来ないはずです。それで、ふつう、そういう場合は、一旦、ダミーファイルでコピーで作ってやって、それを加工して、アプリが終わった時点で戻すというようなステップにします。
*理解してない部分
#1の回答
>でも Open filename For Input As #n だと編集して保存できちゃうんですよ。
補足#3
>であれば、Open コマンドで開いて編集して保存できるのは何なんでしょう。
もしかしたら、ロック解除のタイミングがあるかもしれません。ロックが解除になる時が存在しているなら、それはループで書き込みできる時を調べればよいと思います。ただし、Excel 等のVBAでは長い時間は無理だと思います。メモリが累積していくはずですから。
最初の話の部分は、例えば、このようなことです。
'//モジュール始め
Const myPath = "D:\Test1\"
Const fName = "abc.txt"
Dim dummyFn As String
Sub MacroSample1()
Dim fn As String
Dim objFS As Object
Dim objFile As Object
''"他のアプリケーションが使用中のファイル"
dummyFn = "$" & fName 'ここでダミーに切り替える
Shell "cmd.exe /c copy " & myPath & fName & "," & myPath & dummyFn
fn = myPath & dummyFn
Open fn For Output As #1
Print #1, "open for output" & Now() & vbCrLf
Close #1
End Sub
Sub ADODBTest()
'fName = "D:\Test1\abc.txt"
'"他のアプリケーションが使用中のファイル"
Dim strm As Object
Set strm = CreateObject("ADODB.Stream")
strm.Type = 2
strm.Charset = "UTF-8"
strm.Open
strm.WriteText "ADODB" & Now() & vbCrLf
strm.Position = 0 '念のため、このコードがなくてもエラーになった
strm.SaveToFile myPath & dummyFn, 2 'ダミーファイルに書き込む
strm.Close
Set strm = Nothing
End Sub
'///
話が中途になっていますが、とりあえず、ここまで調べてみてください。
*の部分は、今は、ちょっと不安が残ります。
ループで断続的にファイルのロック状態を調べるのです……。
ダメなら、別のアプリが終わった時点でも、VBA側から戻してあげればよいと思います。
根本的な謎は解決していないのですが、やりたいことは実現できました。書いてくださったコードがヒントになりました。
まず、新たに生成するファイルは、まだ存在していない新規のダミーファイルにしました。
次のようなコードにしたところ、事実上上書き保存ができました。
strm.SaveToFile dummyFile, 2
cmd = "cmd.exe /c copy /Y """ & dummyFile & """ """ & fName & """"
Shell cmd
cmd = "cmd.exe /c del /Q """ & dummyFile
Shell cmd
やはり SaveToFile の上書きは、表現が適切かわかりませんが、「厳しい条件」があるように感じました。
No.3
- 回答日時:
こんちには。
このご質問は、一度、VBAコードを出してから話をしたほうがよいと思います。
>ある別のアプリケーションがつかんでいるテキストファイル
でも、Open filename for input で出来ていたというなら、別のアプリなど関係ないのではありませんか?別のアプリというのは、Excel以外という意味だと思いますが。
>Open filename For Input As #n だと編集して保存できちゃうんですよ。
ただ、これで保存ということではあっても、これだけでは、Application側のコマンドが実行中です。その後、Close #n で、始めて終わるわけなのです。
つまり、一連のコマンドのストーリーを終わらせるっていうのは、当たり前だと思うのです。
>編集して、保存することができていたのです
それが出来ているというなら、ロックは掛かっていません。
しかし、私の知っている範囲では、コマンド実行中で、オブジェクトの支配下にあるものを、横から割り込むことは出来なかった気がします。(やったことはないけれど)
私が想像するのは、コードの修正は、おそらくは、本当に簡単なことなんだろうと思うのです。
UTF-8 にするために、ADODB.Stream で云々はいいけれども、言葉だけでは伝わらないのです。
それに、Opne filename ~とは、別の流れなのです。こちらを一旦、終わらせていないのではないでしょうか。
ここの質問でも、話半分だったから、いえ、私の思い違いで、解決にまでは、二転三転してしまったのです。
http://oshiete.goo.ne.jp/qa/9054919.html
もし、見当はずれの内容でしたら、どうかスルーしてください。返事は不要です。
ありがとうございます。
Open コマンドと ADODB を比較するコードを作ってみました。
やはり、Open コマンド (for outputでした)だと保存でき、ADODB の SaveToFileでは保存できませんでした。
Sub OpenTest()
Dim fName As String
fName = "他のアプリケーションが使用中のファイル"
Open fName For Output As #1
Print #1, "open for output"
Close #1
'結果、対象ファイルの中身は「hoge」だけになります。
End Sub
Sub ADODBTest()
Dim fName As String
fName = "他のアプリケーションが使用中のファイル"
Dim strm As Object
Set strm = CreateObject("ADODB.Stream")
strm.Type = 2
strm.Charset = "UTF-8"
strm.Open
strm.WriteText "ADODB"
strm.Position = 0 '念のため、このコードがなくてもエラーになった
strm.SaveToFile fName, 2 'この時にファイルに書き込めないエラーが発生して止まる
strm.Close
Set strm = Nothing
End Sub
エラーは今試したところ、実行時エラー 3004 ファイルへ書き込めませんでした。となりました。以前は「70」のエラーも出ていたように思いますが。
No.2
- 回答日時:
それはOSの根幹部分でやっていることなのでVBA如きで歯が立たないのはあたりまえ。
ウイルス活動としてセキュリティソフトにブロックされるようなコードを書かないと無理だろう。
どうしても保存したいのであれば、
別名で保存して他で使用しているアプリケーションが終了したら書き換える
などの手段を講じてはどうか。
他で使用されて編集されていたらその内容を問答無用で破棄することになるが・・・。
ありがとうございます。
やっぱりアプリケーションをいっかい終了させてから、ファイルを上書き保存し、再度開き直すまでをすべてVBAに書き込もうと思います。
Open コマンドでは普通にできていたので、ADODB.Streamになったらとたんに使いづらく(ファイルが無駄に増える)ことになったのでどうにかならないかと思案していたところです。
No.1
- 回答日時:
>使用中(ロック)のファイルを上書き
いやいや、それこそむしろ本末転倒でしょう?
それをさせないためにロックしているのだから・・・
ありがとうございます。
そうなんですねー
でも Open filename For Input As #n だと編集して保存できちゃうんですよ。今まで通り、タイムスタンプと付けたファイル名で新規ファイルを作成してアプリケーションに読み込ませ直すか(これでと新規ファイルが増殖しちゃって汚いんですけど)、あるいはアプリケーションをいったん閉じてから上書き保存して再度起動するのが無難ですかねぇ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- USBメモリー・SDカード・フラッシュメモリー プリンタのドライバーをUSB Flash Diskに保存したい。 4 2023/05/23 23:30
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- 画像編集・動画編集・音楽編集 inkscapeで作成した図の保存の仕方とその保存したファイルの編集の仕方 1 2022/09/22 09:33
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
ちょっと先の未来クイズ第6問
2025年1月2日と1月3日に行われる、第101回箱根駅伝(東京箱根間往復大学駅伝競走)で、上位3位に入賞するチームはどこでしょう?
-
自分独自の健康法はある?
こうしていると調子がいい!みたいな自分独自の健康法、こだわりはありますか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAでCSVファイルが使用中かどうかの確認
Visual Basic(VBA)
-
いつもお世話になっております 以前と同様 VBAでフォルダ内のファイルを1つのブックに格納(ファイル
Excel(エクセル)
-
エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの
Excel(エクセル)
-
-
4
実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」
Visual Basic(VBA)
-
5
Excelファイルのマクロによる排他制御
Excel(エクセル)
-
6
ADODB.Streamを使用してUTF-8を出力
Visual Basic(VBA)
-
7
コンボボックスにリストが表示されません・・・
Excel(エクセル)
-
8
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
9
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
10
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
11
VBA 数式を残して値をクリアについて
Excel(エクセル)
-
12
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
13
バックグラウンドのプロセスのエクセルを閉じる方法
Visual Basic(VBA)
-
14
特定のファイルを他のプロセスが編集中か確認する方法
Visual Basic(VBA)
-
15
【ExcelVBA】各セルをダブルクォーテーションで括ってCSV保存したい
Visual Basic(VBA)
-
16
アクセスデータベースのUnicode圧縮について
その他(データベース)
-
17
Excel・Word リサーチ機能を無効にする。
Word(ワード)
-
18
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
19
AccessのSQL文で1件のみヒットしたら終了させる構文。
その他(データベース)
-
20
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでファイルの最終更新...
-
Excel VBAでほかのアプリケーシ...
-
読み取り専用ファイルを上書き...
-
Excel VBAで作成したマクロをxl...
-
意味不明のタグが挿入されてい...
-
Pivot table で集計されたデー...
-
VBScriptでのSaveAsについて
-
.NETアプリでパスワード等入力...
-
ASPでファイルを保存するダイア...
-
PHPで自動的にWEBページを保存...
-
htmlから取り込んだ を消...
-
VBScriptで日本語が変です
-
vbaでIEの名前を付けて保存(A)...
-
VBAで、強制保存してブックを閉...
-
VB6.0でエクセル保存する時の保...
-
Corel Digital Studioの動画をS...
-
一太郎でkindle文書が作成でき...
-
vlan internal allocation poli...
-
teratarmでコマンド入力すると...
-
論文に載せるグラフを作成したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでファイルの最終更新...
-
Excel VBAで作成したマクロをxl...
-
Excel VBAでほかのアプリケーシ...
-
読み取り専用ファイルを上書き...
-
VBAで、強制保存してブックを閉...
-
vbaでIEの名前を付けて保存(A)...
-
Pivot table で集計されたデー...
-
VBScriptでのSaveAsについて
-
コマンドプロンプトでデスクト...
-
エクセルで「名前を付けて保存...
-
VB.NETでEXCELファイルを開き、...
-
VBAでPDF作成をしたあと、指定...
-
AccessVBAでレポートをPDFで出力
-
EXCEL VBA Workbook_BeforeSave...
-
CImageのファイル名を指定して保存
-
タイトルバーやメニューバーの...
-
htmlから取り込んだ を消...
-
VBA メモ帳の上書き保存がしたい
-
Excel VBA で困っています。
-
VBScriptで日本語が変です
おすすめ情報
ちなみに、#3の回答で書いたコードの ADODBTestは、問題のアプリケーションを閉じると正常に動作します。
また、OpenTestでファイルを正常に更新できるのですが、そのあとも問題のアプリケーションでは古い内容のデータを扱っています。おそらくですが、問題のアプリケーションは対象ファイルの内容をいったん内部に取り込んで処理をしているので、リアル タイムには更新されないようにできているのだと思います。
さらに、コマンド プロンプトでOpenfilesを実行したところ、やはり問題のアプリケーションがこの対象ファイルを使用していると表示されました。ロックの仕組みについて詳しくないので正確な表現なのかわかりませんが、やはりこの状態は、問題のアプリケーションが対象ファイルを使用していると呼んで良いのだと思います。であれば、Open コマンドで開いて編集して保存できるのは何なんでしょう。