Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8873 / 76735 ←次へ | 前へ→

【73430】Re:テキストファイルのデータをのセルに転記したい
お礼  es  - 13/1/8(火) 20:53 -

引用なし
パスワード
   ▼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

1 hits

【73400】テキストファイルのデータをのセルに転記したい es 13/1/5(土) 14:58 質問
【73401】Re:テキストファイルのデータをのセルに転... UO3 13/1/5(土) 15:32 発言
【73402】Re:テキストファイルのデータをのセルに転... es 13/1/5(土) 15:47 発言
【73403】Re:テキストファイルのデータをのセルに転... UO3 13/1/5(土) 15:57 発言
【73405】Re:テキストファイルのデータをのセルに転... es 13/1/5(土) 16:34 質問
【73407】Re:テキストファイルのデータをのセルに転... UO3 13/1/5(土) 17:35 発言
【73408】Re:テキストファイルのデータをのセルに転... es 13/1/5(土) 18:22 お礼
【73423】Re:テキストファイルのデータをのセルに転... kanabun 13/1/6(日) 20:40 発言
【73424】Re:テキストファイルのデータをのセルに転... UO3 13/1/7(月) 6:29 発言
【73430】Re:テキストファイルのデータをのセルに転... es 13/1/8(火) 20:53 お礼
【73410】Re:テキストファイルのデータをのセルに転... es 13/1/5(土) 20:04 質問
【73411】Re:テキストファイルのデータをのセルに転... UO3 13/1/5(土) 20:20 発言
【73412】Re:テキストファイルのデータをのセルに転... es 13/1/5(土) 20:29 お礼
【73404】Re:テキストファイルのデータをのセルに転... UO3 13/1/5(土) 16:03 発言

8873 / 76735 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free