|
▼es さん:
>▼UO3 さん:
解決後ですが、今しがた気づいたことで失礼します。
> temp = Space(FileLen(myfilenames(i)))
>
> Open myfilenames(i) For Binary As #i
>
> Get #i, , temp
>
> Close #i
>
> d = Split(temp, vbCrLf)
ですが、ちょっとまずいと思います。
例として、
---------------------------------------
ABCDE<改行>
あいうえお<改行>
---------------------------------------
のような2行のテキストファイルを例として考えてみます。
まず、
> temp = Space(FileLen(myfilenames(i)))
により、このファイルの長さの分だけのスペースが 文字列型変数temp
にセットされます。ファイルの長さ(FileLen)はバイト長で表示されます。
例に挙げたテキストファイルでいえば このファイルの長さすなわちバイト長は
1行目が 5バイト+2
2行目が 10バイト+2 (+2 は改行コード分)
で 合計 19バイトです。
ですので、上の一行は 今回の例では
temp = Space$(19)
ということになります。
で、(ここが重要なのですが)Space$(19) ということは 19個のスペース
を確保という意味で、19バイト確保ではない----これが第1のポイントです。
Windowsのテキストファイルは 文字コードが ShiftJIS ですが、VBA内では
文字コードは Unicode で処理されます。
どういうことかというと、
ファイル上の "A" は1バイトですが Unicode に変換されると "A" は2バイト
になるということです。ファイル上の1バイトが2バイトになるということです。
ですから、バイト単位でスペースを用意すると考えると、
半角英数字のばあいは "A" という1バイトが VBA上で "A"という2バイトに変換
されるから、問題ないのですが、
全角コードのばあい たとえば「あ」という1文字2バイト が Unicode でも文字
数・バイト数ともに変わらなく 1文字2バイト のままなので、上のテキストファ
イルを
temp = Space$(19)
で19文字分のスペースを用意して読み込むと、「あいうえお」の分だけスペース
が余ってきます。
テキストファイル メモリ (Unicode)
char バイト char バイト
-------- ---- ---- -------
A 1 A 2
B 1 B 2
C 1 C 2
D 1 D 2
E 1 E 2
<改行> 2 <改行> 4
あ 2 あ 2
い 2 い 2
う 2 う 2
え 2 え 2
お 2 お 2
<改行> 2 <改行> 4
上の表から分かる通り、Unicodeとして必要なのは19文字38バイトではなく、
「14文字 28バイト」なのです。
Unicode変換するのに必要な長さは バイト長ではなく、実は文字長なのです。
ところが、ファイルの長さ情報は 文字数ではなく、FileLenで得られるような
バイト長しかありませんから、そもそも String型の変数をスペースで文字数分
初期化しておいて、そこにUnicode変換した文字を埋め込むという方法は
テキストが2バイトコードを含むときには うまくいきません。(用意されたス
ペースは必要な数より漢字の個数分、余ってきます)
あと、もうひとつ。
> d = Split(temp, vbCrLf)
> .Cells(1, "A").Resize(UBound(d)).Value = _
WorksheetFunction.Transpose(d)
ですが、
たとえば、
"ABCDE▼1234▼あいうえお▼"
という文字列を Split(temp, "▼") で 分割しますと、
添字は (0) から始まりますから、
(0) "ABCDE"
(1) "1234"
(2) "あいうえお"
(3) ""
となります。UBbound(d) は 3 なのです。 もっとも UBound(d) である (3)
は 最後の改行コード▼ のさらにあとで、Empty ですから、これは シートに
貼り付ける必要はないので、 (0)〜 (2) までの 3行を貼り付ける、というこ
とになるので、
> .Resize(UBound(d))
というのは 結果オーライ ではあるのですが。
なので、文字列型変数にGet# はしなくて、バイト型配列に Get# してから
あとで Unicode文字列に変換します。こうすれば、お尻に余分なスペースが
つくことはありませんし、スピードもずっと速いです。
Dim buf() As Byte
Dim Filename As String
Dim io As Integer
Dim strArry As Variant
Dim i As Long
io = FreeFile()
Open Filename For Binary As io
ReDim buf(1 To LOF(io))
Get io, , buf
Close io
strArry = Split(StrConv(buf, vbUnicode), vbCrLf)
For i = 0 To UBound(strArry) - 1
Debug.Print strArry(i)
Next
|
|