【问题标题】:VBA - Insert .xls into .xlsmVBA - 将 .xls 插入 .xlsm
【发布时间】:2017-11-20 14:56:03
【问题描述】:

这篇文章是我之前post关于同一主题的一个更好的问题。

我正在尝试从 .xls 文件的第一张表中复制数据并将其粘贴到我的 .xlsm 文件中。如果 .xlsm 的“Sheet1”中没有数据,则将源数据粘贴到 .xlsm 的“Sheet1”中。但是,所有其他数据,都会创建一个新工作表并将其粘贴到该新创建的工作表中。

但是,目前,我的代码会打开 .xls 文件并停止。我尝试按照一些建议添加Stop,但这只是关闭了所有窗口。对于如何解决这个问题,我将不胜感激。如果我可以通过按一个按钮输入一个复制和粘贴命令,那就太好了。此代码将供客户使用,因此只需按一个按钮即可直观且易于使用。提前致谢。

Sub ImportData()

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

    Set wkbCrntWorkBook = ActiveWorkbook
    fNameAndPath = Application.GetOpenFilename(FileFilter:="Excel 2007, *.xls; *.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)
        Application.ScreenUpdating = False

        Dim src As Workbook

        Set src = Workbooks.Open(filePath, False, False)
        Stop
        Application.Visible = False

    ' COPY DATA FROM SOURCE (CLOSE WORKGROUP) TO THE DESTINATION WORKBOOK.
    ' GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK.
    Dim srcRng As Range   ' last line from source
    Set srcRng = src.Worksheets("Sheet1").Range("A1",                         
    src.Worksheets("Sheet1").Range("A1")).End(xlDown)
    Set srcRng = srcRng.End(xlToRight)

    If Worksheets("Sheet1").Range("A1") = "" Then
        Worksheets("Sheet1").Range("A1") = srcRng
    Else:
        Worksheets.Add After:=(Sheets.Count)
        Worksheets("Sheet" & Sheets.Count).Range("A1") = srcRng
    End If


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

    Application.Visible = True
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 请删除StopApplication.Visible = False 并告诉我们会发生什么。
  • 您使用的是什么版本的 Excel,2013?
  • @ScottHoltzman - Worksheets.Add After:=(Sheets.Count) 存在调试问题
  • @Profex - 我使用的是 2007
  • 确保你使用src.Worksheets

标签: vba excel


【解决方案1】:

我已经重构了ReadDataCloseFile() 过程。有几个语法问题(可以通过预先编译代码来解决),并且在理解运行时发生的事情方面也存在一些错误。

最值得注意的是,在检查范围 Worksheets("Sheet1") 的值时,如果您不符合特定工作簿的条件,代码将使用 ActiveWorkbook,在这种情况下将是 src,而不是您要检查的工作簿,我假设是带有代码的工作簿。

Option Explicit

Sub ReadDataFromCloseFile(filePath As Variant)

    Application.ScreenUpdating = False

    Dim src As Workbook
    Set src = Workbooks.Open(filePath, False, False)

    ' COPY DATA FROM SOURCE (CLOSE WORKGROUP) TO THE DESTINATION WORKBOOK.
    ' GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK.
    Dim srcRng As Range   ' last line from source
    With src.Worksheets("Sheet1")
        Set srcRng = .Range(.Range("A1"), .Range("A1").End(xlDown).End(xlToRight))
    End With

    With ThisWorkbook
        If .Worksheets("Sheet1").Range("A1") = "" Then
            .Worksheets("Sheet1").Range("A1").Resize(srcRng.Rows.Count,srcRng.Columns.Count).Value = srcRng.Value
        Else:
            .Worksheets.Add After:=(.Sheets.Count)
            .Worksheets(.Sheets.Count).Range("A1").Resize(srcRng.Rows.Count,srcRng.Columns.Count).Value = srcRng.Value
        End If
    End With


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

End Sub

【讨论】:

  • 在第三行打开文件时,可能值得将名称从 ReadDataFromCloseFile 更改。
  • 它部分工作,它将数字 1 放入 Sheet1 "A1"
  • @ACohen - 现在看。我意识到您的 OP 中关于如何设置范围值的其他问题。
  • @ACohen,在 srcRng.Address 上添加手表(您必须自己添加 .Address),然后在 With ThisWorkbook 上暂停 [F9]
  • @ACohen - 我修改了原始答案中的 IF 块,以确保将整个源范围复制到新位置。请将代码复制到您的模块中并再次运行。
【解决方案2】:

@ScottHoltzman 喝咖啡时 :) 试试这个...

更改调用以包含当前工作簿。

Call ReadDataFromCloseFile(fNameAndPath, wkbCrntWorkBook)

对于主要工作人员...

Sub AppendDataFromFile(filePath As Variant, targetBook As Workbook)
Dim src As Workbook
    On Error GoTo errHandler
    Application.ScreenUpdating = False
    Application.EnableEvents = False

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

    ' COPY DATA FROM SOURCE (CLOSE WORKGROUP) TO THE DESTINATION WORKBOOK.
    ' GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK.
    src.Worksheets(1).Cells.Copy
    With targetBook
        If IsSheetBlank(.Worksheets(1)) Then
            .Worksheets(1).Cells(1, 1).Paste
        Else
            Dim x As Worksheet
            .Worksheets.Add After:=.Sheets(.Sheets.Count)
            .Worksheets(.Sheets.Count).Paste
        End If
    End With
    ' CLOSE THE SOURCE FILE.
    src.Close False             ' FALSE - DON'T SAVE THE SOURCE FILE.
    Set src = Nothing

errHandler:
    If Err <> 0 Then
        MsgBox "Runtime Error: " & Err.Number & vbCr & Err.Description, , "AppendDataFromFile"
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

辅助函数...

Function IsSheetBlank(Sheet As Worksheet) As Boolean
    IsSheetBlank = (WorksheetFunction.CountA(Sheet.Cells) = 0)
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2015-11-21
    相关资源
    最近更新 更多