我正在处理大量的历史数据,我制作了一个宏来将这些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
1 回答
Access将'used range'作为表导入,这与'所有带数据的单元'不完全相同 .
'UsedRange'属性选取空字符串,格式化和(有时)实时选择和命名范围......
...有时候,雷德蒙德以外的任何人都不会知道超大尺寸的使用范围 .
So your next job is to redefine the phrase 'Access-Friendly'
最友好的“访问友好”方法是导出csv文件 - 您可能会听到相反的意见,但不是任何经常在JET OLEDB 4 Excel驱动程序中遇到内存泄漏的人 .
但最简单的方法是在链接表中使用 specify the range ,或者 - 更好的是 - ODBC连接的SQL查询:
请注意指定工作表和范围的格式:'$',而不是'!'以分隔工作表名称和地址 . 你可以使用Sheet $,但你会回到整个猜测使用范围的东西 .
请注意,我已经说过有一个 Headers 行,单元格D3:E3,列出字段名称'HDR = YES' . 您没有,但我建议它:按名称调用列对于数据库引擎更容易 .
请注意,我've also specified ' IMEX = 0',这应该意味着猜测字段类型,它们都是文本'但是JET数据库驱动程序用骑士无视来对待它 . 因此,将其导入到包含文本列的表中,并将数据类型和格式设置在这些文本字段的后续MS-Access查询中 .
'IN'之后的那两个引号?不要问 .
我正在使用'.xls'文件,Excel版本8.0 . 查找ConnectionStrings.com以获取更高版本,或者在MS-Access中构建所需文件类型的链接表,并查询Tabledef.Connect属性 .
现在你可以动态地构建查询,为大量电子表格文件夹中的连续导入提供文件名和工作表名称;所以这是最后一段SQL,以及指定字段名称的原因:
JET SQL,用于将行直接从Excel范围插入MS-Access表:
这将在MS-Access数据库中运行:不要尝试从您导出的电子表格文件中的ADODB连接执行它 .