如何解决访问VBA以使用导入按钮导入多个csv文件
我正在尝试创建一个带有对话框的表单,以便用户可以提供文件的位置并将其导入数据库。我提供了导入规范以及代码将追加和更新现有表。但是,在我的情况下,我使用的代码仅适用于一个文件(WM_3M)。我正在寻找将根据用户上传的CSV文件更新现有表的代码。例如,如果用户上载WM_3M的文件,则应更新与其关联的表,如果WM_5M然后是与其关联的表,依此类推。
对话框的代码:
Option Compare Database
Option Explicit
Public Sub ImportFile()
Const FORM_NAME As String = "ImportFile"
DoCmd.OpenForm FORM_NAME,acDialog
If formIsOpen(FORM_NAME) Then
ImportCSVFiles Forms(FORM_NAME).fileName
DoCmd.Close acForm,FORM_NAME,acSaveNo
MsgBox "Import Completed"
End If
End Sub
Public Function formIsOpen(ByVal formName As String) As Boolean
formIsOpen = SysCmd(acSysCmdGetobjectState,acForm,formName)
End Function
Public Sub RunImportProcedure(ByVal fileName As String)
MsgBox " RunImportProcedure called for file" & fileName
End Sub
导入代码:
Option Compare Database
Option Explicit
Public Sub ImportCSVFile(fileName As String)
Const TARGET_TABLE As String = "WM_3M_Export_Imported"
deleteTableIfExists TARGET_TABLE
DoCmd.TransferText acImportDelim,"WM Import Specification",TARGET_TABLE,_
fileName,True,1252
CurrentDb.Execute "qryWM_3M_Update",dbFailOnError
CurrentDb.Execute "qryWM_3M_Append",dbFailOnError
End Sub
Public Sub deleteTableIfExists(ByVal tableName As String)
Dim db As DAO.Database
Dim td As TableDef
Set db = CurrentDb
For Each td In db.TableDefs
If td.Name = tableName Then
db.TableDefs.Delete tableName
Exit For
End If
代码的形式:
Option Compare Database
Option Explicit
Private Sub Cancel_Click()
DoCmd.Close acForm,Me.Name,acSaveNo
End Sub
Private Sub ImportFile_Click()
If Len(Me.txtFileName.Value) > 0 Then
Me.Visible = False
Else
MsgBox " Please enter file name"
End If
End Sub
Public Property Get fileName() As String
fileName = Nz(Me.txtFileName.Value,"")
End Property
Private Sub Select_Click()
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogopen)
With fd
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Any file","*.*",1
.Filters.Add "Comma seperated file","*.csv;*.txt",2
.FilterIndex = 2
If .Show Then
Me.txtFileName.Value = .SelectedItems.Item(1)
End If
End With
End Sub
解决方法
在执行查询之前,您可以将表名传递给函数,并将qryWM_3M_Update
和qryWM_3M_Append
的QueryDef动态更新为目标表。
Public Sub ImportCSVFile(fileName As String,TARGET_TABLE as String)
deleteTableIfExists TARGET_TABLE
DoCmd.TransferText acImportDelim,"WM Import Specification",TARGET_TABLE,_
fileName,True,1252
Dim db As Database
Set db = CurrentDb
Dim qdf1 As QueryDef
Set qdf1 = db.QueryDefs("qry_Update")
qdf1.SQL = "UPDATE " & TARGET_TABLE & " SET Field1 = ...."
qdf1.Close
Set qdf1 = Nothing
Dim qdf2 As QueryDef
Set qdf2 = db.QueryDefs("qry_Append")
qdf2.SQL = "INSERT INTO " & TARGET_TABLE & " SELECT ...."
qdf2.Close
Set qdf2 = Nothing
db.Execute "qry_Update",dbFailOnError
db.Execute "qry_Append",dbFailOnError
End Sub
请根据您的结构自行完成SQL定义,但其想法是通过字符串串联来构建SQL。目标表应该存在才能正常工作。
如果需要表名的后缀,则可以像这样TARGET_TABLE
来构建Forms(FORM_NAME).fileName & "_Export_Imported"
名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。