VB显示输入超出文件尾

Private Sub Command1_Click()
Dim dm$, bzb$, dzb$, gc$, lx$, dq$
Dim sjk As String
Open Text2.Text For Input As #2
Do While Not EOF(2)
Input #2, dm, bzb, dzb, gc, lx, dq
sjk = "insert into kzd values ('" & Trim(dm) & "','" & Trim(bzb) & "','" & Trim(dzb) & "','" & Trim(gc) & "','" & Trim(lx) & "','" & Trim(dq) & "')"
cnn.Execute (sjk)
Loop
Close #2
cnn.CommitTrans
MsgBox "完成导入"
End Sub
这是一个从TXT导入到access的代码,但是在(Input #2, dm, bzb, dzb, gc, lx, dq
)出问题了。输入超出文件尾。。求大侠解释,,谢谢

Private Sub Command1_Click()
Dim s() as string, s1() as string, i as long
Dim sjk As String
Open Text2.Text For binary As #2
s=split(input(lof(1),#1),vbcrlf)
close #2
for i=0 to ubound(s)
if s(i)<>"" then
s1=split(s(i),",")
if ubound(s1)=5 then
sjk = "insert into kzd values ('" & Trim(s1(0)) & "','" & Trim(s1(1)) & "','" & Trim(s1(2)) & "','" & Trim(s1(3)) & "','" & Trim(s1(4)) & "','" & Trim(s1(5)) & "')"
cnn.Execute sjk
end if
end if
next
cnn.CommitTrans
MsgBox "完成导入"
End Sub追问

您这个也有问题,比如txt是这个样子的:
1,1,1,1,1,1
1, ,1,1,1,1
1,1,1,1,1,
这种类型,只能有1,1,1,1,1,1
这一行被导入,其他导不进去。。。怎么办呢

追答

你试了没有啊?只要该行有5个逗号就行,逗号之间有没有数据都可以的,比如
,,,,,
不过导入的字段就都是空的

追问

谢谢啦,现在可以了,我还想请问一个问题,就是它为什么不能连续导入呢,就是导入一个TXT,有导入第二个TXT。。只能关了程序重新才可以导入

追答

可能是你的程序的其他代码有问题。它的出错提示是什么?

另外我更正一下我代码中的这行:
s=split(input(lof(1),#1),vbcrlf)
改为
s=split(input(lof(2),#2),vbcrlf)

追问

恩恩,提示是“试着不先使用,begintrans而提交过退回事务

追答

把下面这行删掉即可:
cnn.CommitTrans
就是不使用事务处理方式。
如果一定要用,就要在前面
Dim sjk As String
的下面插入一行:
cnn.begintrans

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-20
建议对导入文件的数据格式规范做严格说明。
临时解决办法: 出异常时,直接忽略此输入行。

On Error Resume Next
Input #2, dm, bzb, dzb, gc, lx, dq
sjk = "insert into kzd values ('" & Trim(dm) & "','" & Trim(bzb) & "','" & Trim(dzb) & "','" & Trim(gc) & "','" & Trim(lx) & "','" & Trim(dq) & "')"
cnn.Execute (sjk)
Err.Clear

------------
To楼上...
1. 既然他原来的代码可以用,那应该是空格或则是TAB分隔
2. 其实这样,出错还是出错的,除非你再判断分隔后的数量是否正确。那不如直接存在异常直接忽略得了。。。
3. 其实他的问题也可以猜到,他出错是因为最后一行是空行导致...对于规范的数据文件,手动去修改一下也行...追问

On Error Resume Next
Input #2, dm, bzb, dzb, gc, lx, dq
sjk = "insert into kzd values ('" & Trim(dm) & "','" & Trim(bzb) & "','" & Trim(dzb) & "','" & Trim(gc) & "','" & Trim(lx) & "','" & Trim(dq) & "')"
cnn.Execute (sjk)
Err.Clear
Loop
按照您的这个方法原文本是

追答

? 这个问题还没好? 我有点晕了
直接用以下代码吧
-----------------------------
Private Sub Command1_Click()

' 异常捕捉
On Error GoTo HasError

' 变量声明
Dim strInput As String ' 读取的字符串行
Dim Items() As String ' 读取的项目
Dim Line As Long ' 读取的行数
Dim strSQL As String ' 组合后的SQL指令

' 初始化
Line = 0

' 从文件中获取数据
Open Text2.Text For Input As #2
Do While Not EOF(2)

' 行读取
Line = Line + 1
Line Input #2, strInput
If Len(strInput) > 0 Then

' 行元素检查
Items = Split(strInput, ",")
If UBound(Items) 5 Then
Call MsgBox("第" & Line & "行数据符合要求,此行已被忽略")
Exit Do
End If

' 写入数据库
strSQL = "INSERT INTO [kzd] VALUES " & _
"('" & Trim(Items(0)) & "'" & _
",'" & Trim(Items(1)) & "'" & _
",'" & Trim(Items(2)) & "'" & _
",'" & Trim(Items(3)) & "'" & _
",'" & Trim(Items(4)) & "'" & _
")"
Call cnn.Execute(strSQL)
End If
Loop
Close #2
Call cnn.CommitTrans
Call MsgBox("完成导入")
Exit Sub

' 异常处理段
HasError:
Call MsgBox(Err.Description)
Call Err.Clear

End Sub

第2个回答  2012-04-20
Input #2, dm, bzb, dzb, gc, lx, dq

这句有问题,因为Input #2, 是一次输入一行到一个字符串中。

你改为:Input #2, TempStr
然后在对TempStr处理,分别赋值给 dm, bzb, dzb, gc, lx, dq
就可以了追问

Input #2, TempStr,dm, bzb, dzb, gc, lx, dq
这个样子??

追答

不是
要 Input #2, TempStr

然后看你的数据是用什么分割的,
将TempStr分割成几个部分,再分别赋值给 dm, bzb, dzb, gc, lx, dq

Dim RefS As Variant
如果用“|”键分割:
RefS = Split(TempStr, “|”)
dm=RefS(0)
bzb=RefS(1)
dzb=RefS(2)
gc=Refs(3)
lx=RefS(4)
dq=RefS(5)

追问

不好意思呀。还是不得行。。。我的数据是这个样子的
比如:
1,2,3,4,5,6
1,2,3,4,5,6
1, ,2,2,2,2,
1,2,3,2, ,
每行六个,用逗号隔开,但是有的地方没有数据就是空格键。。

相似回答