您的例子经过测试,我的两个表1个是10列,一个是13列,我将模块内n=13,提示运行时错误“3265”,在对应所需名称或序数的集合中,未找到项目。
另外,实现一个按钮,一张表导入后,能否默认将文件夹内所有CSV文件全部导入,不用的文件我人工消除,谢谢!
If InStr(1, strFileName, "n") > 0 Then
n = 13
Else
n = 13
End If
Set connA = CurrentProject.Connection
conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=" & strFilePath & ";Extensions=asc,csv,tab,txtersist Security Info=False" '打开数据链接关键
With rs
.CursorType = 2
.LockType = 3
.CursorLocation = 3
.ActiveConnection = connA
End With
sqlcsv = "SELECT * FROM [TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=" & strFilePath & "].[" & strFileName & "]"
Debug.Print sqlcsv
rs.Open sqlcsv, connA
rs.Move (0) '移动到指定记录
sql = "Select * From tbl_Export"
rs1.Open sql, connA, 1, 3
Do Until rs.EOF
rs1.AddNew
For i = 0 To n
rs1.Fields(i + 0) = rs.Fields(i)
'rs1(i + 1) = rs(i)
Next
rs.MoveNext
Loop
rs1.UpdateBatch
rs1.Close
rs.Close
conn.Close
Set rs = Nothing
Set rs1 = Nothing
Set conn = Nothing
End Function 作者: aslxt 时间: 2013-4-12 10:40 本帖最后由 aslxt 于 2013-4-12 11:02 编辑
If InStr(1, strFileName, "n") > 0 Then
n = 13
Else
n = 13
End If
第一个"n" 是判断表名称是否带有【n】这个字符,根据不同的情况处理第二个n的值:
If InStr(1, strFileName, "n") > 0 Then '判断表名称是否带有【n】这个字符
n = 13 '如果表名称是带有【n】这个字符,那么这个表的列数是多少,就填比列数少1的数:例如有13列,就“n=12”
Else
n = 13 '如果表名称不是带有【n】这个字符,那么这个表的列数是多少,就填比列数少1的数:例如有10列,就“n=9”
End If
aslxt 发表于 2013-4-12 10:40
If InStr(1, strFileName, "n") > 0 Then
n = 13
Else
感谢您的回复,太详细了,每条语句都有解释,收益匪浅,再次向您表示感谢!
按照您的指点,我的数据库也改好了,非常满意!
我默认是导入待导入数据文件夹里的所有CSV文件,现在需要在CSV窗体List1列表框内一个一个的选择文件,因为文件数量比较多,所以有点麻烦。但我发现其实按Shift键同时点击List1列表框内的最后一个文件,也可以做到全选,但是还是存在人差错,造成有文件没有导入,所以有点美中不足。
所以我想能否CSV窗体中List1列表框内默认是全部选中状态,有个别不需要的文件我在List1列表框内点击它,可以成为不选中状态(同List1列表框目前状态正好相反),然后点击导入按钮,导入我需要导入的CSV文件。作者: aslxt 时间: 2013-4-12 19:57
Sub ShowFolderList(strFolderPath As String) '向待导入数据列表矿添加数据的过程
Dim i As Long
Dim fso As Object
Dim objFolder As Object
Dim objFile As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFolder = fso.GetFolder(strFolderPath)
Me.List1.RowSource = ""
For Each objFile In objFolder.Files
Me.List1.AddItem (objFile.Name)
Next
'**********添加以下三行
For i = 0 To List1.ListCount
List1.Selected(i) = True
Next i
'***************
Set objFile = Nothing
Set objFolder = Nothing
Set fso = Nothing
目前只能用逐行读取文本文件的方式可以保存数据的原样,参考代码如下:
Private Sub Command0_Click()
Dim varItem As Variant
With Application.FileDialog(3) 'msoFileDialogFilePicker
.AllowMultiSelect = True '允许选择多个文件
.Filters.Clear
.Filters.Add "CSV Files", "*.CSV" '只显示CSV文件,可根据需要改变
If .Show Then
For Each varItem In .SelectedItems
DR varItem
Next
End If
End With
End Sub
Function DR(ByVal MYspath As String)
Dim SQL, STR
Dim i As Long
Dim A
Close #1
i = 0
Open MYspath For Input As #1
Do While Not EOF(1)
Line Input #1, STR ' 逐行读入
i = i + 1
A = Split(STR, ",") '这里不允许csv文件的数据设为千分位,文本字符间不能有半角逗号
If i > 1 Then
SQL = "INSERT INTO tbl_Export ( [VENDOR NO], [CUSTOMER NO], [INVOICE NO], [BL DATE], [MODEL NO], QTY, PRICE, AMOUNT ) VALUES (" & _
"""" & A(0) & """" & "," & """" & A(1) & """" & ", " & """" & A(2) & """" & ", " & "#" & A(3) & "#" & "," & """" & A(4) & """" & ", " & A(5) & ", " & A(6) & ", " & A(7) & " )"
Debug.Print SQL
CurrentProject.Connection.Execute SQL
End If
Loop
Close #1
End Function 作者: aslxt 时间: 2013-5-10 19:35
当然“SQL=....” 的语法要根据自己的表重新改过,才能实际运用作者: efcndi 时间: 2013-5-12 10:02