【发布时间】:2016-06-10 01:17:31
【问题描述】:
对于帖子的长度,我深表歉意...我想为您提供尽可能详细的信息。我仍然是 Access 的业余爱好者,还在学习 VBA,所以请耐心等待。该代码是从我为满足我的需要而更改的其他代码中一起解析的。
正在执行的任务:
1.) 我正在使用 VBA 将文件夹中的几个 excel 文件导入到 Access 表中。
2.) 因为文件在一列中包含所有信息,所以我将分离该列以隔离每条数据。
问题: 每个导入的 Excel 文件的第一行都有一个文件引用名称(例如:CA051607GA)。我需要将其作为每个文件导入的一行删除,并希望将其设为在从该文件导入的每一行上重复的新列。如果该记录有问题,它将帮助我稍后能够追踪该文件。
1 导入未更改示例:
F1(
第 1 行:CS16052702
第 2 行:00602498878941;US1A100037;US-G8;US1A100037;US-10
第 3 行:00602498878941;US1A100037;US-G8;US1A100037;US-10
2 导入后更改示例(宏):
(每列的字段名称,但我不知道如何添加表格,因此用句点分隔每个字段)
第 1 行:CS16052702
第 2 行:00602498878941....US1A100037....US-G8....US1A100037....US-10
第 3 行:00602498878941....US1A100037....US-G8....US1A100037....US-10
3 所需输出示例(添加到宏):
第 1 行:CS16052702....00602498878941....US1A100037....US-G8....US1A100037....US-10
第 2 行:CS16052702....00602498878941....US1A100037....US-G8....US1A100037....US-10
其他信息:
如果这很重要,我会说很明显,根据宏的性质,导入的文件是一个在另一个之上。上面的示例只显示了一个文件导入,为了演示两个文件,您只需复制原始 3 行下方的 3 行(更改第一行以使其唯一)。我还包括我正在使用的宏供您参考。
Private Sub Command2_Click()
Dim strFile As String 'Filename
Dim strFileList() As String 'File Array
Dim intFile As Integer 'File Number
Dim filename As String
Dim path As String
DoCmd.SetWarnings False
path = "C:\Users\BrooksJ\Desktop\Test\"
Dim rs As DAO.Recordset ' Moved from below
'Loop through the folder & build file list
strFile = Dir(path & "*.xls")
While strFile <> ""
'add files to the list
intFile = intFile + 1
ReDim Preserve strFileList(1 To intFile)
strFileList(intFile) = strFile
strFile = Dir()
Wend
'see if any files were found
If intFile = 0 Then
MsgBox "No files found"
Exit Sub
End If
'cycle through the list of files
For intFile = 1 To UBound(strFileList)
filename = path & strFileList(intFile)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "Compare_Files", filename, False
Next intFile
DoCmd.SetWarnings True
'change import field name
' CurrentDb().TableDefs("Compare_Files").Fields("F1").Name = "UPC"
'create fields to sparse out original data field
' CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN UPC Text;")
' CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SR_Profit_Center Text;")
' CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SR_Super_Label Text;")
' CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SAP_Profit_Center Text;")
' CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN SAP_Super_Label Text;")
'Seperate data by ";" from original file
' Const YOUR_TABLE_NAME As String = "Compare_Files"
' Const SQL_UPDATE_DATA As String = "SELECT * FROM [" & YOUR_TABLE_NAME & "] WHERE SR_Profit_Center Is Null"
'
' Dim rs As DAO.Recordset
' Dim strF1Data As String
' Dim varData As Variant
'
' Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA)
' With rs
' Do Until .EOF
' strF1Data = !UPC
' varData = Split(strF1Data, ";")
' If UBound(varData) = 4 Then
' .Edit
' !UPC = varData(0)
' !SR_Profit_Center = varData(1)
' !SR_Super_Label = varData(2)
' !SAP_Profit_Center = varData(3)
' !SAP_Super_Label = varData(4)
' .Update
' End If
' .MoveNext
' Loop
' .Close
' End With
'
' Set rs = Nothing
'======================================================================================
CurrentDb.Execute ("ALTER TABLE Compare_Files ADD COLUMN UPC Text, SR_Profit_Center Text, SR_Super_Label Text, SAP_Profit_Center Text, SAP_Super_Label Text;")
CurrentDb.TableDefs("Compare_Files").Fields("F1").Name = "ref_val"
'Dim rs As DAO.Recordset
Dim ref_val As String
Set rs = db.OpenRecordset("SELECT TOP 1 ref_val FROM Compare_Files;", dbOpenDynaset)
ref_val = rs.Fields(0).Value
rs.Close
db.Execute "DELETE FROM [Compare_Files] WHERE ref_val = '" & ref_val & "';"
Const YOUR_TABLE_NAME As String = "Compare_Files"
Dim SQL_UPDATE_DATA As String
SQL_UPDATE_DATA = "SELECT *, ';' & '" & ref_val & "' FROM [" & YOUR_TABLE_NAME & "] WHERE SR_Profit_Center Is Null"
'Dim rs As DAO.Recordset
Dim strF1Data As String
Dim varData As Variant
Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA)
With rs
Do Until .EOF
strF1Data = !ref_val
varData = Split(strF1Data, ";")
If UBound(varData) = 4 Then
.Edit
!ref_val = ref_val
!UPC = varData(0)
!SR_Profit_Center = varData(1)
!SR_Super_Label = varData(2)
!SAP_Profit_Center = varData(3)
!SAP_Super_Label = varData(4)
.Update
End If
.MoveNext
Loop
.Close
End With
Set rs = Nothing
'==========================================================================================
End Sub
某些代码无法在代码框中捕获,因此我尝试尽我所能隔离代码。如果您需要我更改其读取方式以使其更易于理解,请告诉我。
补充说明:被拉入的文件的行数不同。
感谢任何人提供的有关此问题的任何帮助或建议。如果您需要更多信息,请告诉我。我试图在我的问题中详细而彻底。
【问题讨论】: