子宝どっとこむ

 

 Openステートメントの使い方

  • Sep072005
  • Author: Vulcan
  • Categories: 駄文

Openステートメントはテキストファイルを高速に読み書きすることができますが、データを抽出したり、一括して更新したりといった操作を行なう場合は、リレーショナルデータベースに対してADOでアクセスするやり方が適していますので、結局のところ、使いどころはテキストファイルの特性に引きずられることになるでしょう。

したがって、一番オーソドックスな使い方としては、会計ソフト等から書き出したテキストファイルを整形し(勘定奉行の場合csv保存したファイルはデータとしてとても扱いにくい)、中間ファイルとして扱いやすい形で保存しておく場合が挙げられ、ここでOpenステートメントの真価が発揮されると思います。

Dim Buffer() As Byte, MyText As String
Dim i As Long, kugiri As Byte
Dim StDate As String, myDate As Long, KanjoNum As Long
Dim LineArray, myLineData, myData
Open strPath & FileName For Binary As #1 'バイナリーモードで開く
ReDim Buffer(LOF(1))
Get #1, , Buffer      '一気にバッファに読み込む
Close #1'ここまででBufferにファイルの情報がバイナリデータとして保存
MyText = StrConv(Buffer, vbUnicode) 'ユニコードに変換
LineArray = Split(MyText, vbCrLf) '行に分割する
StDate = Mid(LineArray(0), 14, 11)'ここに年月日の文字列が存在している
myDate = CDate(StDate) * 1'文字列を日付リテラル値に変換
Open strPath & "部門別試算表DB\" & Format(myDate, "yyyymm") & ".txt" For Output As #1
Open strPath & "全社試算表DB\" & Format(myDate, "yyyymm") & ".txt" For Output As #2
kugiri = 1
For i = 3 To UBound(LineArray) - 1
myLineData = Split(LineArray(i), ",")'各行のデータをカンマ区切りで分割
myData = Mid(myLineData(0), 2, 4)'文字列から数値部分を抜き出し
If kugiri = 1 Then
KanjoNum = myData * 1
kugiri = 0
ElseIf IsNumeric(myData) Then'小計の行以外は勘定コードか部門コードが入っている
If KanjoNum >= 500 Then
Write #1, myDate, KanjoNum, myData * 1, myLineData(5) * 1
End If
kugiri = 0
Else
If KanjoNum = 230 Then
Write #2, myDate, KanjoNum, -myLineData(5) * 1
Else
Write #2, myDate, KanjoNum, myLineData(5) * 1
End If
kugiri = 1
End If
Next i
Close #1
Close #2
ちょっと、これだけ見ても何をやっているのかわかりにくいと思いますが、要するに、読み込むテキストファイルは1行目から3行目まではヘッダ情報があり、それ以降も、勘定科目を示す行があり、そこから部門別残高が1行から数行にわたって記されており、最後に小計が記載されて次の勘定科目のデータが続く、というように非常に扱いにくい状態のものを、テーブル形式に変換したい、というのが目的で、たいした負荷ではないのですが、なるべく速く、エレガントに処理したいということで、バイナリモードで一気に読み込み、Split関数で配列に落とし込み、各行毎にデータを加工しながら、その都度書き出すというやり方を取っています。

ミソは『スプレッドシートに展開する必要はない』という点です。

以前は、ADOで同様の操作をしていましたが(スプレッドシートへの展開は無し)、3倍ぐらい速くなった気がします(といっても1秒がコンマ3秒程度に縮まった程度ですが)。

参考にしたサイト
Excelでお仕事!
外部テキストファイルとの接続方法
テキストファイルを高速に読み込む
VBAの小技集

 Trackback Pings(0)

No trackbacks found.

 Comments(0)

No comments found.

 Post a Comment

コメント用フィード