これ何て呼びますか

VBAでCSVファイルの特定行をAccessのUPDATEのように、特定の行のみに対して上書き動作出来ないか方法を探しています。

【例】
ファイル:aaa.csv
データ:元
 1,1,1,1,1
 2,2,2,2,2
 3,3,3,3,3 ←この行に Dim a1 as string: a1="a,a,a,a,a"のデータで上書きしたい
 4,4,4,4,4
 5,5,5,5,5
データ:上書き後
 1,1,1,1,1
 2,2,2,2,2
 a,a,a,a,a
 4,4,4,4,4
 5,5,5,5,5

上記のような動作を、
・ブックで開いてシートを使用する
・もうひとつのファイルに対象行以外と新たなデータをコピーしての擬似上書き
を使用せずに実行する方法はあるのでしょうか?

A 回答 (3件)

前回の削除側で試しましたので、こちらは検証しておりません。



#1さんのご指摘で思い出しましたが、そういえば、ランダムアクセスがありましたね。このようなファイルにできるのか、もう遠い昔になってしまいました。CSVというのは、コンピュータの最も古典的なデータで、それを処理するために、いろんな方法が編み出されたそうです。

それから、Excelは、Accessを持っていなくても、Jet がついていますので、Excel自身でデータベースを備えているのですが、どうも忘れられた存在になってしまいました。もう少し、研究する価値はありそうです。


Sub TextLine_Replace()
 Dim Fname As String
 Dim FNo As Integer
 Dim TextLine As String
 Dim i As Long
 Dim ar1 As Object
 Set ar1 = CreateObject("System.Collections.ArrayList")
 Fname = "Test1.csv"
 FNo = FreeFile()
 Open Fname For Input As #FNo
 Do While Not EOF(FNo)
  Line Input #FNo, TextLine
  ar1.Add TextLine
 Loop
 Close #FNo

 ar1(2) = "a,a,a,a,a" '0から始まりますから、行は1引きます

 FNo = FreeFile()
 Open Fname For Output As #FNo
 For i = 0 To ar1.Count - 1
 Print #FNo, ar1(i)
 Next i
 Close #FNo
 MsgBox "Finish!"
End Sub
    • good
    • 0
この回答へのお礼

回答、ありがとうございました。
配列で速度等を検証してみます。

お礼日時:2016/08/27 22:14

CSVファイルは、原稿用紙にビッチリと文字が詰ったような状態です。



その置き換え前後でバイト数が同じならOpenのBinaryを使って
 書き換える場所を探す→上書きする
でできなくは無いです。
これは「原稿用紙の該当箇所を消しゴムで消して書き直す」ようなものです。


ですが、置き換え前後でバイト数が変わるなら、この方法は使えません。

原稿用紙を5マス消しゴムかけて、4文字書き込めば、1マス余ります。
これを埋めるには、1文字ずつ後の文字を書いては消し、を最後まで繰り返さなければなりません。

原稿用紙を5マス消しゴムかけて、6文字書き込もうとしても、1マス足りません。
これを空けるには、1文字ずつ後にずらして1マス空けるしかありません。

こんな面倒なことするくらいなら、新しい原稿用紙に書く方が楽です。
(人間がやるとそれも面倒かもしれませんが、コンピュータは面倒くさがらずにやってくれます)


> ・ブックで開いてシートを使用する
> ・もうひとつのファイルに対象行以外と新たなデータをコピーしての擬似上書き

この中間として
・文字列配列に全て読み込み→変更→ファイルに上書き
という方法があります。
    • good
    • 0
この回答へのお礼

バイト数は変わるので、やはり配列を使うしかないですか。
回答、ありがとうございました。この方法での速度等を検証してみます。

お礼日時:2016/08/27 22:12

残念ながら、一度取り込んで処理する事しかできません。


EXCEL2007 以降ならば使える行数も思いっきり増えていますが
EXCEL はデータベースでは有りませんので Access 等のデータベースを使うのが本来の姿です。
    • good
    • 0
この回答へのお礼

エクセルマクロで、とのお達しなので今回はAccessは使えないんです。
回答ありがとうございました。

お礼日時:2016/08/27 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A