| 
    
     |  | ▼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
 
 |  |