| 
    
     |  | ▼kanabun さん: メール確認していなくて、お礼遅くなりました。
 詳細にありがとうございます。
 私の知識では
 ゆっくりゆっくり読み解かないとすぐには理解できないのですが^_^;
 とにかくバグる可能性があるということですね。
 ありがとうございます!
 またよろしくお願いいたします。
 
 >▼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
 
 
 |  |