使用VBA,如何在不打开xlsx文件的情况下将xlsx文件导入xlsm?

时间:2017-07-14 11:23:49

标签: excel vba excel-vba

这是我当前代码的一部分:

选项明确

Sub ImportData()

    Dim wkbCrntWorkBook As Workbook
    Dim wkbSourceBook   As Workbook
    Dim fNameAndPath As Variant

    Set wkbCrntWorkBook = ActiveWorkbook
    fNameAndPath = Application.GetOpenFilename(FileFilter:="Excel 2007, *.xlsx; *.xlsm; *.xlsa", Title:="Select File To Import")
    If fNameAndPath = False Then Exit Sub
    Call ReadDataFromCloseFile(fNameAndPath)


    Set wkbCrntWorkBook = Nothing
    Set wkbSourceBook = Nothing

End Sub

Sub ReadDataFromCloseFile(filePath As Variant)
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    Dim src As Workbook

    Set src = Workbooks.Open(filePath, True, True)

' COPY DATA FROM SOURCE (CLOSE WORKGROUP) TO THE DESTINATION WORKBOOK.
' GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK.
Dim lastLine As Long   ' last line from source
lastLine = src.Worksheets(source_sheet_1_name).Range("A" & Rows.count).End(xlUp).Row
Worksheets("abc").Range("A3:A40")).Value= src.Worksheets("cde").Range("A4:A41").Value


' CLOSE THE SOURCE FILE.
src.Close False             ' FALSE - DON'T SAVE THE SOURCE FILE.
Set src = Nothing

ErrHandler:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

根据this,数据的源工作簿将不会打开。但是,只要我在文件浏览器中单击文件名以选择要导入的文件,excel就会打开该文件。

有谁知道我应该如何实现目标(无论最后一段中的链接如何)?

(我的目标是在用户指示要导入的文件后,根据某些标准自动将某些列从xlsx文件复制/导入到xlsm文件中(无需打开要导入的文件)。但是,在我选择之后通过双击导入的文件,只是打开要导入的文件。在导入的文件打开后,程序不会继续导入相应的列。)

1 个答案:

答案 0 :(得分:2)

你可以在这做一些事情。需要以某种方式打开文件。但是,尽可能锁定/隐藏它将是关键。

你可以尝试一些不同的东西:

1)在打开工作簿之前,设置Application.ScreenUpdating = False,然后在关闭子服务器之前的最后,确保将其设置回True

2)使用src = workbooks.open...打开工作簿后,尝试设置Application.Visible = False。完成导入过程并关闭源工作簿后,请确保将其设置为true:Application.Visible = True

这应该允许您打开工作簿,保持更新,以便没有人能够看到发生了什么,并以最小的阻力/可见性关闭工作簿。

可能导致错误,或者直接无法正常工作的原因可能来自您尝试调用的工作簿工作表名称。我没有看到变量的分配,因此lastLine = src.Worksheets(source_sheet_1_name)实际上应该在其中说出工作表名称,例如lastLine = src.Worksheets("Sheet1")

给我一​​个机会让我知道。