繁体   English   中英

通过 VBA 从另一个工作簿复制数据

[英]Copy data from another Workbook through VBA

我想从不同的文件中收集数据并将其插入到工作簿中,做这样的事情。

Do While THAT_DIFFERENT_FILE_SOMEWHERE_ON_MY_HDD.Cells(Rand, 1).Value <> "" And Rand < 65536
        then 'I will search if the last row in my main worksheet is in this file... 
End Loop           

如果我的主工作表的最后一行在文件中,我将退出While循环。 如果没有,我会复制所有内容。 我很难找到合适的算法。

我的问题是我不知道如何访问不同的工作簿。

将数据从工作簿复制到另一个工作簿的最佳(也是最简单)方法是使用 Excel 的对象模型。

Option Explicit
Sub test()
    Dim wb As Workbook, wb2 As Workbook
    Dim ws As Worksheet
    Dim vFile As Variant

    'Set source workbook
    Set wb = ActiveWorkbook
    'Open the target workbook
    vFile = Application.GetOpenFilename("Excel-files,*.xls", _
        1, "Select One File To Open", , False)
    'if the user didn't select a file, exit sub
    If TypeName(vFile) = "Boolean" Then Exit Sub
    Workbooks.Open vFile
    'Set targetworkbook
    Set wb2 = ActiveWorkbook

    'For instance, copy data from a range in the first workbook to another range in the other workbook
    wb2.Worksheets("Sheet2").Range("C3:D4").Value = wb.Worksheets("Sheet1").Range("A1:B2").Value
End Sub

您可能喜欢函数GetInfoFromClosedFile()


编辑:由于上面的链接似乎不再起作用,我添加了备用链接 1备用链接 2 + 代码:

Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
    wbName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
    GetInfoFromClosedFile = ""
    If Right(wbPath, 1) <> "" Then wbPath = wbPath & ""
    If Dir(wbPath & "" & wbName) = "" Then Exit Function
    arg = "'" & wbPath & "[" & wbName & "]" & _
        wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
    On Error Resume Next
    GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function

您是否正在寻找打开它们的语法:

Dim wkbk As Workbook

Set wkbk = Workbooks.Open("C:\MyDirectory\mysheet.xlsx")

然后,您可以使用wkbk.Sheets(1).Range("3:3") (或任何您需要的)

几乎没有理由不在 Excel 中打开多个工作簿。 关键代码行是:

Application.EnableEvents = False
Application.ScreenUpdating = False

...那么在代码运行时您将看不到任何内容,并且不会运行与打开第二个工作簿相关联的代码。 然后有...

Application.DisplayAlerts = False
Application.Calculation = xlManual

...以阻止您收到与第二个文件的内容相关的弹出消息,并避免任何缓慢的重新计算。 确保在编程结束时设置回 True/xlAutomatic

如果打开第二个工作簿不会导致性能问题,您不妨这样做。 实际上,如果某些辅助文件不符合预期格式,则在尝试调试代码时,打开第二个工作簿将非常有用

以下是有关使用多个 Excel 文件的一些专家指南,概述了可用于引用数据的不同方法

一个扩展问题是如何循环浏览同一文件夹中包含的多个文件。 您可以通过以下方式使用 Windows 文件夹选择器:

With Application.FileDialog(msoFileDialogFolderPicker)
.Show
     If .Selected.Items.Count = 1 the InputFolder = .SelectedItems(1)
End With

FName = VBA.Dir(InputFolder)

Do While FName <> ""
'''Do function here
FName = VBA.Dir()
Loop

希望上面的一些将是有用的

我有同样的问题,但应用提供的解决方案更改了要写入的文件。一旦我选择了新的 excel 文件,我也在该文件中写入,而不是在我的原始文件中。 我对这个问题的解决方案如下:

Sub GetData()

    Dim excelapp As Application
    Dim source As Workbook
    Dim srcSH1 As Worksheet
    Dim sh As Worksheet
    Dim path As String
    Dim nmr As Long
    Dim i As Long

    nmr = 20

    Set excelapp = New Application

    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        .Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls; *.xlsb", 1
        .Show
        path = .SelectedItems.Item(1)
    End With

    Set source = excelapp.Workbooks.Open(path)
    Set srcSH1 = source.Worksheets("Sheet1")
    Set sh = Sheets("Sheet1")

    For i = 1 To nmr
        sh.Cells(i, "A").Value = srcSH1.Cells(i, "A").Value
    Next i

End Sub

使用excelapp将调用一个新应用程序。 with块设置外部文件的路径。 最后,我将带有sourcesrcSH1的外部工作簿设置为外部工作表中的工作表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM