Excel来访问导入错误的列

我正在处理大量的历史数据,并且我制作了一个macros来将这些excel电子表格格式化为Access友好的信息。 不过,我将这些excel文件导入到Access时遇到问题。 无论我编码到VBA,Access仍然认为在实际数据的前四个之后有大约30个空白列。 防止这种情况的唯一方法是手动进入并删除列。 出于某种原因,我的VBA代码不会阻止它。 我正在处理很多电子表格,所以手动删除这些列需要花费相当长的时间。 我的代码在下面; 关于如何使Access可以正确解释这些的任何想法?

Public CU_Name As String Sub RegulatorFormat() Dim wks As Worksheet Dim wks2 As Worksheet Dim iCol As Long Dim lastRow As Long Dim Desc As Range Dim lastCol As Long Application.ScreenUpdating = False Worksheets.Select Cells.Select Selection.ClearFormats Call FormulaBeGone ActiveSheet.Cells.Unmerge CU_Name = [B1].Value lastRow = Range("C" & Rows.Count).End(xlUp).Row Set Desc = Range("A1", "A57") Desc.Select For Each wks In ActiveWindow.SelectedSheets With wks On Error Resume Next For iCol = 16 To 4 Step -1 Dim PerCol As Date PerCol = Cells(1, iCol) .Columns(iCol).Insert Range(Cells(1, iCol), Cells(lastRow, iCol)) = CU_Name .Columns(iCol).Insert Range(Cells(1, iCol), Cells(lastRow, iCol)) = Desc.Value .Columns(iCol).Insert Cells(1, iCol).Value = PerCol Range(Cells(1, iCol), Cells(lastRow, iCol)) = Cells(1, iCol) Range(Cells(1, iCol), Cells(lastRow, iCol)).NumberFormat = "mm/dd/yyyy" Next iCol End With Next wks Rows("1:2").EntireRow.Delete Columns("A:C").EntireColumn.Delete lastCol = ws.Cells.Find(What:="*", _ After:=ws.Cells(1, 1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column For Each wks2 In ActiveWindow.SelectedSheets With wks2 On Error Resume Next For iCol = 52 To 6 Step -4 lastRow = Range("C" & Rows.Count).End(xlUp).Row Set CutRange = Range(Cells(1, iCol), Cells(54, iCol - 3)) CutRange.Select Selection.Cut Range("A" & lastRow + 1).Select ActiveSheet.Paste Next iCol End With Next wks2 Columns("E:ZZ").Select Selection.EntireColumn.Delete Application.ScreenUpdating = True Rows("1").Insert [A1] = "Period" [B1] = "Line#" [C1] = "CU_Name" [D1] = "Balance" Columns("E:BM").Select Selection.Delete Shift:=xlToLeft Call Save End Sub Sub FormulaBeGone() Worksheets.Select Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues ActiveSheet.Select Application.CutCopyMode = False End Sub Sub Save() Dim newFile As String newFile = CU_Name ChDir ("W:\ALM\Statistics\MO Automation\2015") 'Save folder ActiveWorkbook.SaveAs Filename:=newFile 'Later should seperate CU's into folder by province and year End Sub 

Access正在将“使用的范围”作为表格导入,这与“所有包含数据的单元格”并不完全相同。

“UsedRange”属性select空string,格式化和(有时)实时select和命名范围…

…有时候,雷蒙德以外的任何人都无法知道,所以它有时候会占用过大的使用范围。

所以你的下一个工作是重新定义“访问友好”

所有的“访问友好”方法都是导出csv文件 – 您可能会听到相反的意见,但不是任何经常遇到JET OLEDB 4 Excel驱动程序中的内存泄漏的人。

但最简单的方法是在一个链接表中指定范围 ,或者更好的是一个ODBC连接的SQL查询:

SELECT * FROM [Sheet1$D3:E24] IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls];
SELECT * FROM [Sheet1$D3:E24] IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls]; 

请注意指定表单和范围的格式:“$”,而不是“!” 分离工作表名称和地址。 你可以使用Sheet $,但是你又回到了整个猜测 – 使用范围的东西。

请注意,我说过有一个标题行,单元格D3:E3,列出字段名称“HDR = YES”。 你不需要,但是我推荐它:按名称调用列对数据库引擎来说更容易。

请注意,我还指定了“IMEX = 0”,这意味着“不要猜测字段types,它们都是文本”,但是JET数据库驱动程序会将其视为傲慢无视的。 因此,将其导入到包含文本列的表中,并在这些文本字段的后续MS-Access查询中执行您的数据types和格式。

“IN”后的那两个引号? 不要问。

而我正在使用'.xls'文件,Excel版本8.0。 查找ConnectionStrings.com以获取更高版本,或者在MS-Access中构build一个链接表,以查找所需的文件types,然后询问Tabledef.Connect属性。

到目前为止,您会发现您可以dynamic构build查询,为从电子表格的大量文件夹连续导入提供文件名和表名; 所以这是SQL的最后一部分,也是指定字段名称的原因:

JET SQL,用于将行直接插入到Excel范围内的MS-Access表中:

INSERT INTO Table1 (Name, PX_Last, USD, Shares) SELECT * FROM [Sheet1$D3:E24] IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls];
INSERT INTO Table1 (Name, PX_Last, USD, Shares) SELECT * FROM [Sheet1$D3:E24] IN "" [Excel 8.0;HDR=YES;IMEX=0;DATABASE=C:\Temp\Portfolio.xls]; 

这将在MS-Access数据库中运行:不要尝试从导出的​​电子表格文件中的ADODB连接执行它。