アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel2000のVBAマクロで、CSVファイルを読み込んで
マッチング処理をしたいと考えています。

CSVファイルはコードテーブルで参照のみ。
中身は、「コード,名前,区分」の配列になっております。
コードは"0012345"と"12345"は別物として扱いたいので
文字列として読み込む必要があります。

CSVファイルの中身は以下の感じです。
12345,名前1,区分1
0012345,名前2,区分2
0000022222,名前3,区分1
...

そこで、以下のようなコードを書いて見ました。

Sub OpenCSV()
Workbooks.OpenText Filename:="C:\CSV.txt" _
DataType:=xlDelimited, Comma:=True, _
TextQualifier:=xlTextQualifierNone, _
FieldInfo:=Array(Array(1,2),Array(2,2), _
Array(3,2))
End Sub

ところが開いたシートではコード部分が文字列として
取り込まれておらず、セルの書式も標準になっています。

FieldInfoの設定方法を変えて、
Sub OpenCSV()
Dim tmpInfo(256) As Variant
Dim i As Integer

For i = 1 to 256
tmpInfo(i) = Array(i,2)
Next
Workbooks.OpenText Filename:="C:\CSV.txt" _
DataType:=xlDelimited, Comma:=True, _
TextQualifier:=xlTextQualifierNone, _
FieldInfo:=tmpInfo
End Sub
このようなコードにしたところ、「型が一致しない(エラー13)」というエラーになってしまいます。

結局、FieldInfoが効いてない動きなのですが、
どこが悪いのか皆目見当が付きません。

アドバイスを頂けますと幸甚です。

A 回答 (2件)

一番目のコードでOKだと思います。


当方で一番目のコードを試したところOKでした。
ちょっと不思議ですねぇ。


回避策として、TextFileを開くのではなくて、ThisWorkbookの使ってないシート等にインポートし、
それで処理をするというのはどうでしょうか。

外部データの取り込みから、テキストファイルのインポートをマクロ記録し、修正等加え実行してみて下さい。
これも試してみましたがOKでした。



それから、2番目のコードがエラーになる理由ですが。

For i = 1 to 256
tmpInfo(i) = Array(i,2)
Next

For が1~256ということは、
tmpInfo(0) には何も入ってないですよね。
それにも拘わらず

FieldInfo:=tmpInfo

とやってますので当然、エラーに成りますよね。
配列は、0からですので
Option base 1 が必要かと。


解決策ではなく申し訳ありませぬ。(^^;;;
    • good
    • 0

本当はFieldInfoの質問であることは承知してます。


テキスト、CSVファイルの読みこみ時の、数字データの先頭0落ちの問題だと思うのですが、時々本OKWEBでも載ります。
正面の回答が判らないので、
もしよい回答が無ければ最後の手段として、下記を試してください。原始的な方法です。
Sub test01()
Open "aaa22.csv" For Input As #1
j = 1
k = 1
While Not EOF(1)
Line Input #1, a
' MsgBox a
s = Split(a, ",")
For i = 0 To UBound(s)
Cells(j, k) = s(i)
'msgbox s(i)
k = k + 1
Next i
k = 1
j = j + 1
Wend
Close #1
End Sub
CSVファイル名は修正してください。
(1)Line Input #1, aをInput #1, aとしてしまうと変数に入る段階で0落ちするようです。
(2)受けるエクセルシートの方で、A列の書式は、「読み込む前」(ここが大切、後では何もならない)に、文字列に設定しておいてください。文字列の列は全部。
ここがポイント・要領です。

この回答への補足

ご回答ありがとうございます。

結局、Opentextではどうしても出来ず、代わりにQuaryTables.Addで対応することにしました。
以下ソースです。ご参考まで。
(一応当方環境では正常動作しています)

Sub GetInfo()
Dim m As Integer
Dim n As Integer
Dim A As Integer

Dim Text_Code As String
Dim Filefullpath As String
Dim MyDir As String

'####################################
'情報ファイルのフルパス取得
'####################################
MyDir = Application.Workbooks(Workbooks.Count).Path
Filefullpath = MyDir & "\infotable.csv"
'####################################
'CSVファイルの読み込み
'####################################
Workbooks.Add
n = Workbooks.Count
Sheets("Sheet1").Select
Sheets("Sheet1").Name = "InfoTable"
Range("A1").Select

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & Filefullpath, Destination:=Range("A1"))
.Name = "InfoTable"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierNone
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2, 2, 2)
.Refresh BackgroundQuery:=False
End With
'######################
' ここから処理ロジック
'######################
......
Application.Workbooks(n).Worksheets("InfoTable").Activate
A = 1
Text_Code = Cells(A, 1)
......
'********************************
'終了処理
'********************************
......
Application.Workbooks(n).Close SaveChanges:=False
......
End Sub

補足日時:2004/10/08 15:35
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

文字数制限に引っ掛かってしまったので、
補足欄に当方対応ロジックを書きましたので、
ご参考まで。
引き続き、OpenTextで動かす方法の情報があれば
宜しくお願い致します。

お礼日時:2004/10/08 15:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています