|
>現状のエラーは下記の通りです。
>アプリケーション定義またはオブジェクトのエラーです。
>.Value = vntField で止まります。
>
>1 セルの文字数は1000以上のものもあり今後増える可能性もあります。
>=で始まるセルも有り得ます。
ここで止まるのは、前回のレスの多分1、2、に該当すると思われます
「1、」に該当する部分は、フィールドの文字数が、911文字を超えた場合
セルへの代入方法を1セルづつに替えれば出来ると思います
ただし、セルの文字数の上限も有りますので(2000文字?)気を付けて下さい
「2、」の場合は、代入するセルの書式を文字列にするか、
「=」を違う文字に差し替えれば善いと思います
マイクロソフトの以下の資料を見て下さい
[XL2003] 長い文字列配列を代入すると "実行時エラー 1004" が発生する
http://support.microsoft.com/kb/818808/ja
Excel のセルに表示されるのは 1,024 文字のみ
http://support.microsoft.com/kb/211580/ja
以下のコードは、「1、」の問題に対処して見ました
Private Sub CSVRead(ByVal strFileName As String, _
ByRef rngWrite As Range, _
Optional ByRef lngRow As Long = 1, _
Optional strDelim As String = ",")
Dim i As Long '★追加
Dim blnNormal As Boolean '★追加
Dim dfn As Integer
Dim vntField As Variant
Dim strBuff As String
Dim blnMulti As Boolean
Dim strRec As String
'ファイルをOpen
dfn = FreeFile
Open strFileName For Input As dfn
Do Until EOF(dfn)
'1行読み込み
Line Input #dfn, strBuff
'論理レコードに物理レコードを追加
strRec = strRec & strBuff
'論理レコードをフィールドに分割 引数追加に因り変更
' vntField = SplitCsv(strRec, strDelim, , , blnMulti)
vntField = SplitCsv(strRec, strDelim, blnNormal, , , blnMulti) '★変更
'フィールド内で改行が有る場合
If Not blnMulti Then
With rngWrite.Offset(lngRow)
'出力範囲を文字列に設定(フィールド先頭の「=」対する対処)
' .Resize(, UBound(vntField) + 1).NumberFormat = "@" '★変更
'もし、全フィールドの文字数が911以内の場合
If blnNormal Then '★追加
'データを配列として出力
.Resize(, UBound(vntField) + 1).Value = vntField '★追加
Else '★追加
'データを1づつセルに代入
For i = 0 To UBound(vntField) '★追加
.Offset(, i).Value = vntField(i) '★追加
Next i '★追加
End If '★追加
End With '★追加
'出力行をインクリメント
lngRow = lngRow + 1
strRec = ""
Else
'セル内改行として残す場合
strRec = strRec & vbLf
End If
Loop
Close #dfn
End Sub
Private Function SplitCsv(ByVal strLine As String, _
Optional strDelimiter As String = ",", _
Optional blnNormal As Boolean, _
Optional strQuote As String = """", _
Optional strRet As String = vbCrLf, _
Optional blnMulti As Boolean) As Variant
' ★引数に「blnNormal As Boolean」を追加
Dim i As Long
Dim lngDPos As Long
Dim vntData() As Variant
Dim lngStart As Long
Dim vntField As Variant
Dim lngLength As Long
i = 0
lngStart = 1
lngLength = Len(strLine)
blnMulti = False
blnNormal = True '★追加
Do
ReDim Preserve vntData(i)
If Mid$(strLine, lngStart, 1) <> strQuote Then
lngDPos = InStr(lngStart, strLine, _
strDelimiter, vbBinaryCompare)
If lngDPos > 0 Then
vntField = Mid$(strLine, lngStart, _
lngDPos - lngStart)
If lngDPos = lngLength Then
ReDim Preserve vntData(i + 1)
End If
lngStart = lngDPos + 1
Else
vntField = Mid$(strLine, lngStart)
lngStart = lngLength + 1
End If
Else
lngStart = lngStart + 1
Do
lngDPos = InStr(lngStart, strLine, _
strQuote, vbBinaryCompare)
If lngDPos > 0 Then
vntField = vntField & Mid$(strLine, _
lngStart, lngDPos - lngStart)
lngStart = lngDPos + 1
Select Case Mid$(strLine, lngStart, 1)
Case ""
Exit Do
Case strDelimiter
lngStart = lngStart + 1
Exit Do
Case strQuote
lngStart = lngStart + 1
vntField = vntField & strQuote
End Select
Else
blnMulti = True
vntField = Mid$(strLine, lngStart)
lngStart = lngLength + 1
Exit Do
End If
Loop
End If
'フィールドの文字数が911を超えた場合
If Len(vntField) > 911 Then '★追加
blnNormal = False '★追加
End If '★追加
vntData(i) = vntField
vntField = Empty
i = i + 1
Loop Until lngLength < lngStart
SplitCsv = vntData()
End Function
尚、「2、」で「=」を別な文字に差し替えるなら、「Function SplitCsv」の中の
「vntData(i) = vntField」因り前で行えば善いと思います
|
|