Excel VBA質問箱 IV

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

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


8877 / 76732 ←次へ | 前へ→

【73423】Re:テキストファイルのデータをのセルに転記したい
発言  kanabun  - 13/1/6(日) 20:40 -

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

310 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 発言

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