首页 文章

Excel to Access导入false列

提问于
浏览
1

我正在处理大量的历史数据,我制作了一个宏来将这些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 回答

  • 3

    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查询:

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

    请注意指定工作表和范围的格式:'$',而不是'!'以分隔工作表名称和地址 . 你可以使用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表:

    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连接执行它 .

相关问题