Excel VBA質問箱 IV

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

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


3447 / 13644 ツリー ←次へ | 前へ→

【62143】CSVファイルの読み込みについて 困り猫 09/6/24(水) 16:23 質問[未読]
【62144】Re:CSVファイルの読み込みについて neptune 09/6/24(水) 16:54 発言[未読]
【62152】Re:CSVファイルの読み込みについて 困り猫 09/6/25(木) 11:07 質問[未読]
【62153】Re:CSVファイルの読み込みについて neptune 09/6/25(木) 11:20 回答[未読]
【62145】Re:CSVファイルの読み込みについて イブX 09/6/24(水) 17:35 発言[未読]
【62155】Re:CSVファイルの読み込みについて 困り猫 09/6/25(木) 12:54 お礼[未読]
【62157】Re:CSVファイルの読み込みについて kanabun 09/6/25(木) 14:06 発言[未読]
【62163】Re:CSVファイルの読み込みについて 困り猫 09/6/25(木) 16:28 お礼[未読]
【62174】Re:CSVファイルの読み込みについて kanabun 09/6/26(金) 11:53 発言[未読]
【62158】Re:CSVファイルの読み込みについて イブX 09/6/25(木) 14:45 発言[未読]
【62164】Re:CSVファイルの読み込みについて 困り猫 09/6/25(木) 16:34 お礼[未読]
【62146】Re:CSVファイルの読み込みについて kanabun 09/6/24(水) 20:31 発言[未読]
【62147】Re:CSVファイルの読み込みについて neptune 09/6/24(水) 20:48 発言[未読]
【62154】Re:CSVファイルの読み込みについて 困り猫 09/6/25(木) 11:45 お礼[未読]
【62148】Re:CSVファイルの読み込みについて 困り猫 09/6/24(水) 21:02 お礼[未読]

【62143】CSVファイルの読み込みについて
質問  困り猫  - 09/6/24(水) 16:23 -

引用なし
パスワード
   データ内に、記号"|"が含まれるCSVファイルをVBAでExcelファイルへ読み込むと、
"|"以降のデータが勝手に削除されてしまいます。
削除されずに、ありのままのデータを読み込む方法はございますでしょうか?
具体的には、以下のような現象です。

●CSVデータ
1,3,8,0,1|5,9
↓VBAで読み込み↓
●Excelファイル
1,3,8,0,1,9
※5番目のデータの"|5"が消えてしまう。

とても困っています。
どうぞよろしくお願いいたします。

※念のため、ソースも掲載させて頂きます↓

Sub READ_TextFile()
  Const cnsTITLE = "テキストファイル読み込み処理"
  Const cnsFILTER = "全てのファイル (*.*),*.*"
  Dim xlAPP As Application    ' Applicationオブジェクト
  Dim intFF As Integer      ' FreeFile値
  Dim strFILENAME As String    ' OPENするファイル名(フルパス)
  Dim X(1 To 43) As Variant    ' 読み込んだレコード内容
  Dim GYO As Long         ' 収容するセルの行
  Dim RETSU As Integer      ' 収容するセルの列
  Dim lngREC As Long       ' レコード件数カウンタ
  
  ' Applicationオブジェクト取得
  Set xlAPP = Application
  ' 「ファイルを開く」のフォームでファイル名の指定を受ける
  xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
  strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
    Title:=cnsTITLE)
  ' キャンセルされた場合は以降の処理は行なわない
  If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub
  
  ' FreeFile値の取得(以降この値で入出力する)
  intFF = FreeFile
  ' 指定ファイルをOPEN(入力モード)
  Open strFILENAME For Input As #intFF
  GYO = 1
  ' ファイルのEOF(End of File)まで繰り返す
  Do Until EOF(intFF)
    ' レコード件数カウンタの加算
    lngREC = lngREC + 1
    xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)"
    ' レコードを読み込む(番号〜設問40までの全データ)
    For RETSU = 1 To 43
      Input #intFF, X(RETSU)
    Next RETSU
    ' 行を加算しA〜AQ列にレコード内容を表示(先頭は2行目)
    GYO = GYO + 1
    Range(Cells(GYO, 1), Cells(GYO, 43)).Value = X  ' 配列渡し
  Loop
  ' 指定ファイルをCLOSE
  Close #intFF
  xlAPP.StatusBar = False
  ' 終了の表示
  MsgBox "ファイル読み込みが完了しました。" & vbCr & _
    "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub

【62144】Re:CSVファイルの読み込みについて
発言  neptune  - 09/6/24(水) 16:54 -

引用なし
パスワード
   ▼困り猫 さん:
こんにちは

>※念のため、ソースも掲載させて頂きます↓
これがあったからResつける気になりました。

1,3,8,0,1|5,9
で、textファイルを作成して、最小条件で検証しました。
再現します。

で、少しだけ調べたんですが、原因は正直わかりません。
Inputステートメントで、"|"は何か特別な意味を持つのかもしれませんね。

そこでなんですが、
line input で1行全部読み込んで、split関数でカンマで分割すると
正常に読み込めることは確認しました。

原因はわかりませんが、これで回避しては如何ですか?

本当に最小限のテストソースですが、一応まともに取得できるようです。
Sub t()
Dim fNum As Long
Dim sLine() As String, sBuf As String
Const csPath As String = "E:\hoge\test.txt"

  fNum = FreeFile()
  
  Open csPath For Input As #fNum
  Line Input #fNum, sBuf
  sLine = Split(sBuf, ",")
  Close #fNum
End Sub

【62145】Re:CSVファイルの読み込みについて
発言  イブX  - 09/6/24(水) 17:35 -

引用なし
パスワード
   文字列にしてみてください。
>  Dim X(1 To 43) As Variant    ' 読み込んだレコード内容
   ↓
  Dim X(1 To 43) As String

【62146】Re:CSVファイルの読み込みについて
発言  kanabun  - 09/6/24(水) 20:31 -

引用なし
パスワード
   ▼困り猫 さん:
>データ内に、記号"|"が含まれるCSVファイルをVBAでExcelファイルへ読み込むと、

> ●CSVデータ
> 1,3,8,0,1|5,9
> ↓VBAで読み込み↓
> ●Excelファイル
> 1,3,8,0,1,9

VBAで読み込むといっても 方法はいろいろあると思いますが、
「Input#ステートメントで」読み込むと、
>"|"以降のデータが勝手に削除されてしまいます。

↑ぼくも初めて経験しましたが、Input# はMS-DOSの時代からのファイル
読み込み法なので、読み方に独特の解釈があり、この独自の仕様が
あるときは 制約になります。
(例)
,1st Project, 
  ↓
 ,1 , "Project" のように "1st" が数値として解釈され、
              2項目データに分割される。
(以下同様で) "2nd Floor", "3rd Base", "4TH Statement" なども同様。
スペースが区切り記号になることも Input#ステートメントの特徴ですね。

>削除されずに、ありのままのデータを読み込む方法はございますでしょうか?

すべて文字列として配列に読み込めば、「1|5」が「1」になってしまうことは
避けられますが、全ての数値データも「文字列」データとしてセルに代入され
てしまうので、数値データ、文字列データ混在のときはVariant配列に
読み込んだほうがよくないですか?

Sub Example1()
  Dim io As Integer
  Dim Buf() As Byte
  Dim v, vv, t
  Dim i As Long, j As Long
  Dim y As Long, x As Long
  Dim myFile
  myFile = Application.GetOpenFilename("CSVファイル,*.csv;*.txt")
  If myFile = False Then Exit Sub
  
  io = FreeFile()
  Open myFile For Binary As io
   ReDim Buf(1 To LOF(io))
   Get #io, , Buf       '全Text 読み込み(ShiftJIS)
  Close io
  v = StrConv(Buf(), vbUnicode) 'Unicodeに変換
  v = Split(v, vbCrLf)     '行に分割
  y = UBound(v)        '最終行
  x = UBound(Split(v(0), ",")) '最終列
  ReDim vv(y, x)
  For i = 0 To y - 1
   t = Split(v(i), ",")
   For j = 0 To x
     vv(i, j) = t(j)    '列に分割
   Next j
  Next i
  ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1) _
   .Resize(y, x + 1).Value2 = vv
  
End Sub

それか、
拡張子が "*.csv" なら、Excelメニュー[ファイル]-[開く]で
単純に開く操作(のマクロ記録からVBAにする Workbooks.Open) とか、

既存のシートにインポートするなら、
[データ]-[外部データの取り込み]-[テキストファイルのインポート]
メニューを使ってインポートすればよいです。
後者の方法なら 列ごとの「データ型」が指定できますので、
文字列として読み込みたい列のデータ型を「テキスト」とか、
日付として読み込みたい列のデータ型を「YMD」とか、明示的に指定
することができます。(マクロ記録 → QueryTables.Add... )

【62147】Re:CSVファイルの読み込みについて
発言  neptune  - 09/6/24(水) 20:48 -

引用なし
パスワード
   みなさんこんにちは

>  Dim X(1 To 43) As Variant    ' 読み込んだレコード内容
  Dim X(1 To 43) As String
そういえば、Variant型ってのを意識してませんでした。
Variant型だからか。。。
数値型になってしまいますからね。納得。

後は、必要に応じて皆さんのアドバイスを検討して下さい。

【62148】Re:CSVファイルの読み込みについて
お礼  困り猫  - 09/6/24(水) 21:02 -

引用なし
パスワード
   neptuneさん、イブXさん、kanabunさん、コメントありがとうございます!!
今日はもう自宅に帰ってきて環境が無いので、すぐに試すことができませんが、
明日また皆様からのアドバイスを参考にチャレンジしてみます。
取り急ぎ、本日のお礼まで。

【62152】Re:CSVファイルの読み込みについて
質問  困り猫  - 09/6/25(木) 11:07 -

引用なし
パスワード
   ▼neptune さん:

教えて頂いたテストソースを、自分のソースに組み込んで試してみたところ、
 ・CSVファイルの1行目のデータが読み飛ばされる
 ・やはり"|"以降のデータが削除される
という結果になってしまいました。
私の組み込み方が悪いような気がしますが、原因がわかりません。

※組み込み後のソースです↓
Sub READ_TextFile()
  Const cnsTITLE = "テキストファイル読み込み処理"
  Const cnsFILTER = "全てのファイル (*.*),*.*"
  Dim xlAPP As Application    ' Applicationオブジェクト
  Dim strFILENAME As String    ' OPENするファイル名(フルパス)
  Dim X(1 To 43) As Variant    ' 読み込んだレコード内容
  Dim GYO As Long         ' 収容するセルの行
  Dim RETSU As Integer      ' 収容するセルの列
  Dim lngREC As Long       ' レコード件数カウンタ
  
  Dim fNum As Long
  Dim sLine() As String, sBuf As String
  
  ' Applicationオブジェクト取得
  Set xlAPP = Application
  ' 「ファイルを開く」のフォームでファイル名の指定を受ける
  xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
  strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
    Title:=cnsTITLE)
  ' キャンセルされた場合は以降の処理は行なわない
  If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub
  
  ' FreeFile値の取得(以降この値で入出力する)
  fNum = FreeFile()
  ' 指定ファイルをOPEN(入力モード)
  Open strFILENAME For Input As #fNum
  Line Input #fNum, sBuf
  sLine = Split(sBuf, ",")
  GYO = 1
  ' ファイルのEOF(End of File)まで繰り返す
  Do Until EOF(fNum)
    ' レコード件数カウンタの加算
    lngREC = lngREC + 1
    xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)"
    ' レコードを読み込む(番号〜設問40までの全データ)
    For RETSU = 1 To 43
      Input #fNum, X(RETSU)
    Next RETSU
    ' 行を加算しA〜AQ列にレコード内容を表示(先頭は2行目)
    GYO = GYO + 1
    Range(Cells(GYO, 1), Cells(GYO, 43)).Value = X  ' 配列渡し
  Loop
  ' 指定ファイルをCLOSE
  Close #fNum
  xlAPP.StatusBar = False
  ' 終了の表示
  MsgBox "ファイル読み込みが完了しました。" & vbCr & _
    "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub

【62153】Re:CSVファイルの読み込みについて
回答  neptune  - 09/6/25(木) 11:20 -

引用なし
パスワード
   ▼困り猫 さん:

>やはり"|"以降のデータが削除される
は既に他の方からアドバイスがありますよね。
>  Dim X(1 To 43) As Variant    ' 読み込んだレコード内容
Dim X(1 To 43) As String    ※先ずはこれ。
途中省略
>  fNum = FreeFile()
>  ' 指定ファイルをOPEN(入力モード)
>  Open strFILENAME For Input As #fNum
>  Line Input #fNum, sBuf
>  sLine = Split(sBuf, ",")
sLineがどこにも出力されていない。だから
>・CSVファイルの1行目のデータが読み飛ばされる

do loopの中では最初のVariant型が変更されていないので
>Input #fNum, X(RETSU)
としているが、これでは何も変わっていない。全ての行を1行ずつ読み込むなら
それで最後までやった方がわかり易い。

ぱっと見た感じでも以上が指摘できます。

中途半端に改造するより
open ステートメントからCloseステートメントまでの間を考えながら
見直して見てください。

【62154】Re:CSVファイルの読み込みについて
お礼  困り猫  - 09/6/25(木) 11:45 -

引用なし
パスワード
   ▼kanabun さん:

困り猫です。

>[データ]-[外部データの取り込み]-[テキストファイルのインポート]
>メニューを使ってインポートすればよいです。
>後者の方法なら 列ごとの「データ型」が指定できますので、
>文字列として読み込みたい列のデータ型を「テキスト」とか、
>日付として読み込みたい列のデータ型を「YMD」とか、明示的に指定
>することができます。(マクロ記録 → QueryTables.Add... )

これは盲点でした!
初めからソースを書くことしか頭になく、恥ずかしながらExcelにこういう
インポート機能があること自体知りませんでした。
たしかにこの方法だと"|"以降が消えることもなく、正しく読み込めます。
ひとつ勉強になりました。

【62155】Re:CSVファイルの読み込みについて
お礼  困り猫  - 09/6/25(木) 12:54 -

引用なし
パスワード
   ▼イブX さん:

困り猫です。

ご指摘の通りString型にしてみたところ、希望通り読み込むことができました!
ありがとうございました!!

【62157】Re:CSVファイルの読み込みについて
発言  kanabun  - 09/6/25(木) 14:06 -

引用なし
パスワード
   ▼困り猫 さん:

> String型にしてみたところ、希望通り読み込むことができました!


それは意図したとおりにデータが読み込めた、ということでしょうか?

データはすべて String型なのですか?

> 1,3,8,0,1|5,9

のうち、 "1|5" 以外は 数値データではないのですか?
すべて文字列型として「セルに」読み込むと、
セルの左上コーナーに緑の「エラーインジケータ」が点灯して
これを消す後処理が必要になりません?

【62158】Re:CSVファイルの読み込みについて
発言  イブX  - 09/6/25(木) 14:45 -

引用なし
パスワード
   最初に書き込んだ物を消さない方が良かったのかな。
以下そのままです。

Dim St as string
>    For RETSU = 1 To 43
      Input #intFF, St
      X(RETSU) = St
>    Next RETSU

って、やったらどうなりますか?


【62163】Re:CSVファイルの読み込みについて
お礼  困り猫  - 09/6/25(木) 16:28 -

引用なし
パスワード
   ▼kanabun さん:

>データはすべて String型なのですか?
>> 1,3,8,0,1|5,9
>のうち、 "1|5" 以外は 数値データではないのですか?

はい。おっしゃる通りです。

>すべて文字列型として「セルに」読み込むと、
>セルの左上コーナーに緑の「エラーインジケータ」が点灯して
>これを消す後処理が必要になりません?

こちらもご指摘通りです。
"1|5"が読み込めたことに感動して、緑のエラーインジケータは
後で何とかなるかな・・と諦めていたのですが、その後、イブXさんの
アドバイスに倣って下記のように書き換えたところ、"1|5"もきちんと
読み込まれ、エラーインジケータも点灯しないようになりました!

無事、次の段階に進めそうです。
ありがとうございました!!

【62164】Re:CSVファイルの読み込みについて
お礼  困り猫  - 09/6/25(木) 16:34 -

引用なし
パスワード
   ▼イブX さん:

>Dim St as string
>>    For RETSU = 1 To 43
>      Input #intFF, St
>      X(RETSU) = St
>>    Next RETSU
>
>って、やったらどうなりますか?

やってみました。
まさに、期待通りの結果が得られました!
"1|5"もきちんと読み込まれ、エラーインジケータも点灯しません。
無事、次の段階に進めそうです。
ありがとうございました!!

【62174】Re:CSVファイルの読み込みについて
発言  kanabun  - 09/6/26(金) 11:53 -

引用なし
パスワード
   ▼困り猫 さん:

>無事、次の段階に進めそうです。

困り猫さんはどうも最初のサンプルコードの方法
Input#ステートメントにこだわりをお持ちのようですが、
Input#文を使っての読み込みは今回のCSVファイルの形式に
は不適当なことを具体例で検証してみたいと思います。
まず、同じシート上にある同じデータを
  Print# と
  Write# を使って出力してみます。
データは簡単のために、(Sheetではなく)
以下のように Array関数で与えるものとします。

>----------------- Openステートメント関係による 入出力テスト
Option Explicit
'--------- テストで共通に使用する2つの形式のCSVファイルの宣言
Private Const myFileP = "D:\(Data)\test_Print.csv"
Private Const myFileW = "D:\(Data)\test_Write.csv"

Sub test_Print() '▲Print#ステートメントで出力
 Dim Arry
 Arry = Array("青木", 1, 3, 8, 0, "1|5", 9, Date)
 
 Dim io As Integer
 io = FreeFile()
 Open myFileP For Output As io
 Print #io, Join(Arry, ",")
 Close io
End Sub

Sub Test_Write() '▲Write#ステートメントで出力
 Dim Arry
 Arry = Array("青木", 1, 3, 8, 0, "1|5", 9, Date)
 
 Dim io As Integer
 Dim j As Long
 io = FreeFile()
 Open myFileW For Output As io
 For j = 0 To UBound(Arry) - 1
   Write #io, Arry(j);
 Next
 Write #io, Arry(UBound(Arry))
 Close io
End Sub


出力結果ですが、▲Print# 文で出力したものはこうなります。
 青木,1,3,8,0,1|5,9,2009/06/26

これは 困り猫さんが読み込もうとしているCSVファイルと(たぶん)
同じ形式のデータレイアウトです。
またこの形式は、Excelメニューから
  「名前を付けて保存」[ファイルの種類:CSV形式]で、
  xlCSV出力したときのファイル形式と(このばあいは)
  同じです。↓
  青木,1,3,8,0,1|5,9,2009/6/26

 Print #文は、いわば文章をそのままのかたちでファイルに
 書き込むのに適しています。逆に、今回のように 1行内で
 データを区切る必要があるときは、自前で区切り記号を
 挿入する必要があります。

一方、▲Write#文で出力した結果はこうなります。
"青木",1,3,8,0,"1|5",9,#2009-06-26#

 Write#文は、Print# 文と異なり、ファイルにデータを書き
 込むときにデータ項目の間にカンマ (,) を挿入します。
 文字列データは、ダブルクォート("")で囲んで出力されます。
 日付データは、#で囲んで出力されます。


さて、この2つの形式のCSVファイルの読み込みですが、
ヘルプの「Print # ステートメント」の解説にあるように、
>  通常、Print # ステートメントを使用して書き込んだ
>  データは、Line Input # ステートメントまたは
>  Input 関数を使用して読み込みます。

一方、ヘルプの「Write # ステートメント」の解説にあるように、
> Write # ステートメントを使用して書き込んだデータは、
> Input # ステートメントで読み込みます。

同じくInput#ステートメントの「メモ」にあるように、
>  Input # ステートメントを使用してファイルから変数へデータを
>  正しく読み込むことができるように、データをファイルに書き込む
>  場合は、Print # ステートメントではなく、必ず Write # ステー
>  トメントを使用してください。


そこで、以下、2つのCSVファイルの読み込みの実験です。
まず、Print#文で出力したCSVファイルのほうから。

'▼Print#で出力したCSVを読む (その1: Line Input#)
Sub test_LineInput()
 Dim io As Integer
 Dim L&
 Dim sLine$, Arry As Variant
 
 io = FreeFile()
 Open myFileP For Input As io
 L = Cells(Rows.Count, 1).End(xlUp).Offset(1).Row
 Do Until EOF(io)
   Line Input #io, sLine
   L = L + 1
   Arry = Split(sLine, ",")
   Cells(L, 1).Resize(, UBound(Arry) + 1).Value = Arry
 Loop
 Close io
End Sub

sheet への出力結果は以下のイメージとなります。
>---------------------------------------------------------
 A  | B | C | D | E | F | G |  H
青木  '1  '3  '8  '0  1|5  '9  2009/6/26
                      ↑文字列
>---------------------------------------------------------
 上のイメージ図で 数値の前のアポストロフィ―(') は
 セルの左上コーナーのエラーインジケータを表しています。
 つまり、この方法で読み込むと、全てのデータが「文字列」
 として読み込まれていることを示しています。

Print#文で出力したCSVを読み込むにはもう一つの方法があります。
この方法はテキストファイルを高速に読み込むことができますが、
配列を使用していますのでコードがやや長くなります。

'▼Print#で出力したCSVを読む (その2: Get#)
Sub test_Get()
 Dim io As Integer
 Dim Buf() As Byte, Arry As Variant
 Dim i&, j&, y&, x&
 Dim v
 Dim outArry
 
 io = FreeFile()
 Open myFileP For Binary As io
  ReDim Buf(1 To LOF(io))
  Get #io, , Buf    '全文一括読み込み(ShiftJIS)
 Close io
             ' ↓ Unicodeに変換し行に分割
 Arry = Split(StrConv(Buf, vbUnicode), vbCrLf)
 y = UBound(Arry) - 1  '最終行
 x = UBound(Split(Arry(0), ",")) '最終列
 ReDim outArry(y, x)
 For i = 0 To y
   v = Split(Arry(0), ",") '一行を列に分割
   For j = 0 To x
     outArry(i, j) = v(j) '出力用配列に格納
   Next
 Next
 '               シートに吐き出す
 ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(2) _
  .Resize(y + 1, x + 1).Value = outArry
End Sub
'
Get#ステートメントによる 読み込みの
sheet への出力結果は以下のイメージとなります。
>---------------------------------------------------------
 A  | B | C | D | E | F | G |  H
青木    1  3   8   0 1|5    9  2009/6/26
>---------------------------------------------------------

こんどは文字列は左詰め、数値データは右詰めに配置され、
元のシートデータを正しく読み込むことができました。
CSVファイル形式が(Print#文で出力された)文字列データが
("")で囲まれていない、また日付データが(# #)で囲まれていない
テキストのときは、このGet#による方法が適当と思われます。

他方、文字列データが("")で囲まれていたり、日付型データが
(##)で囲まれているような Write#文で出力した データ型情報付き
CSVテキストを読むときは、ヘルプの解説に明らかなように、
「Input#文」で読み込むのがベターということになります。↓

'▼Write#で出力したCSVを読む (Input#)
Sub test_Input()
 Dim io As Integer
 Dim Arry As Variant
 Dim j&, x&, L&

 io = FreeFile()
 Open myFileW For Input As io
 x = 8      'testのため 列数 決め打ち
 ReDim Arry(1 To x)
 L = Cells(Rows.Count, 1).End(xlUp).Offset(1).Row
 Do Until EOF(io)
   For j = 1 To x
     Input #io, Arry(j)
   Next
   L = L + 1
   Cells(L, 1).Resize(, x).Value = Arry
 Loop
 Close io
End Sub

Write#文で出力したCSVテキストを Input#文で項目ごとに
読んだ結果(シートに貼り付けた結果)は以下のようになります。
>---------------------------------------------------------
 A  | B | C | D | E | F | G |  H
青木    1  3   8   0 1|5    9  2009/6/26
>---------------------------------------------------------
データ型の情報(文字列、日付、エラー値、論理値など)が
テキスト内に付随しているときは、(少々時間はかかりますが)
Input#文を使って読み込むとデータの誤変換、自動削除が発生し
ません。
ただ、ファイルにより列数が不定の場合は、何らかの方法で
ファイルの先頭行を 先読みして 列数を把握しておく必要がありますが。


大変ながくなりましたが、以上のコメントは Openステートメントを
使うとしたら、という仮定でのお話です。
文字列データが ("")で括られていても、Excelの一般機能である
テキストファイルウィザードをマクロ化(Workbooks>OpenText
ActiveSheet.QueryTables.Add...) すれば、区切り記号を指定して
かつ、列のデータ型を指定して データベース風テキストが適切に
読めるのですから、それを使わない手はない、、
というのがぼくのスタンスですけど。

ではでは (^^

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