Vba 从同一文件夹中的多个工作簿获取数据[使用正确的函数添加具有wbook名称的列]

Vba 从同一文件夹中的多个工作簿获取数据[使用正确的函数添加具有wbook名称的列],vba,excel,Vba,Excel,通常我从不问任何问题,主要是因为我总是发现一些问题与我的问题相似,大多数情况下,答案都很好,我只是需要适应 下面是我正在使用的代码,可以在互联网上找到,不是我自己创建的 这是很好的工作,但我想/需要有,左或右列的数据提取,数据源工作簿的名称,是这么简单…我的知识是非常基本的vba,甚至认为这应该有一个简单的答案,我还不能做到这一点 Public strFileName As String Public currentWB As Workbook Public dataWB As Workbook

通常我从不问任何问题,主要是因为我总是发现一些问题与我的问题相似,大多数情况下,答案都很好,我只是需要适应

下面是我正在使用的代码,可以在互联网上找到,不是我自己创建的

这是很好的工作,但我想/需要有,左或右列的数据提取,数据源工作簿的名称,是这么简单…我的知识是非常基本的vba,甚至认为这应该有一个简单的答案,我还不能做到这一点

Public strFileName As String
Public currentWB As Workbook
Public dataWB As Workbook
Public strCopyRange As String

Sub GetDATA()
Dim strWhereToCopy As String, strStartCellColName As String
Dim strListSheet As String, strCopySheet As String

strListSheet = "List"

On Error GoTo ErrH
Sheets(strListSheet).Select
Range("B2").Select

'this is the main loop, we will open the files one by one and copy their data into the masterdata sheet
Set currentWB = ActiveWorkbook
Do While ActiveCell.Value <> ""

    strFileName = ActiveCell.Offset(0, 1) & ActiveCell.Value
    strCopyRange = ActiveCell.Offset(0, 2) & ":" & ActiveCell.Offset(0, 3)
    strWhereToCopy = ActiveCell.Offset(0, 4).Value
    strCopySheet = ActiveCell.Offset(0, 6).Value
    strStartCellColName = Mid(ActiveCell.Offset(0, 5), 2, 1)

    Application.Workbooks.Open strFileName, UpdateLinks:=False, ReadOnly:=True
    Set dataWB = ActiveWorkbook

    Sheets(strCopySheet).Select
    Range(strCopyRange).Select
    Selection.Copy

    currentWB.Activate
    Sheets(strWhereToCopy).Select
    lastRow = LastRowInOneColumn(strStartCellColName)
    Cells(lastRow + 1, 1).Select

    Selection.PasteSpecial xlPasteValues, xlPasteSpecialOperationNone
    Application.CutCopyMode = False
    dataWB.Close False
    Sheets(strListSheet).Select
    ActiveCell.Offset(1, 0).Select
Loop
Exit Sub

ErrH:
MsgBox "It seems some file was missing. The data copy operation is not complete."
Exit Sub
End Sub

Public Function LastRowInOneColumn(col)
'Find the last used row in a Column: column A in this example
'http://www.rondebruin.nl/last.htm
Dim lastRow As Long
With ActiveSheet
lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
End With
LastRowInOneColumn = lastRow
End Function
Public strFileName作为字符串
Public currentWB As工作簿
公共数据WB作为工作簿
作为字符串的公共strCopyRange
子GetDATA()
Dim strwhere复制为字符串,strStartCellColName复制为字符串
Dim strListSheet作为字符串,strCopySheet作为字符串
strListSheet=“列表”
关于错误转到错误
工作表(strListSheet)。选择
范围(“B2”)。选择
这是主循环,我们将逐个打开文件,并将其数据复制到主数据表中
设置currentWB=ActiveWorkbook
当ActiveCell.Value“”时执行此操作
strFileName=ActiveCell.Offset(0,1)&ActiveCell.Value
strCopyRange=ActiveCell.Offset(0,2)&“&ActiveCell.Offset(0,3)
strWhereToCopy=ActiveCell.Offset(0,4).Value
strCopySheet=ActiveCell.Offset(0,6).Value
strStartCellColName=Mid(ActiveCell.Offset(0,5,2,1)
Application.Workbooks.Open strFileName,UpdateLinks:=False,ReadOnly:=True
设置dataWB=ActiveWorkbook
工作表(strCopySheet)。选择
范围(strCopyRange)。选择
选择,复制
当前wb.Activate
图纸(strWhereToCopy)。选择
lastRow=LastRowInOneColumn(strStartCellColName)
单元格(lastRow+1,1)。选择
Selection.PasteSpecial xlPasteValues、XLPasteSpecialLoperationNone
Application.CutCopyMode=False
dataWB.Close为False
工作表(strListSheet)。选择
ActiveCell.Offset(1,0)。选择
环
出口接头
呃:
MsgBox“似乎缺少某个文件。数据复制操作未完成。”
出口接头
端接头
公共函数LastRowInOneColumn(列)
'查找列中最后使用的行:本例中的列a
'http://www.rondebruin.nl/last.htm
最后一排一样长
使用ActiveSheet
lastRow=.Cells(.Rows.Count,col).End(xlUp).Row
以
LastRowInOneColumn=lastRow
端函数

如果我理解正确,您希望源文件名在A列,而该文件中的数据从B列开始?这应该做到:

Sub GetDATA()
Dim strWhereToCopy As String, strStartCellColName As String
Dim strListSheet As String, strCopySheet As String

strListSheet = "List"

On Error GoTo ErrH
Sheets(strListSheet).Select
Range("B2").Select

'this is the main loop, we will open the files one by one and copy their
 data into the masterdata sheet
Set currentWB = ActiveWorkbook
Do While ActiveCell.Value <> ""

    strFileName = ActiveCell.Offset(0, 1) & ActiveCell.Value
    strCopyRange = ActiveCell.Offset(0, 2) & ":" & ActiveCell.Offset(0,3)
    strWhereToCopy = ActiveCell.Offset(0, 4).Value
    strCopySheet = ActiveCell.Offset(0, 6).Value
    strStartCellColName = Mid(ActiveCell.Offset(0, 5), 2, 1)

    Application.Workbooks.Open strFileName, UpdateLinks:=False, ReadOnly:=True
    Set dataWB = ActiveWorkbook

    Sheets(strCopySheet).Select
    Range(strCopyRange).Select
    Selection.Copy

    currentWB.Activate
    Sheets(strWhereToCopy).Select
    lastRow = LastRowInOneColumn(strStartCellColName)
    'Paste data starting in column #2 (B)
    Cells(lastRow + 1, 2).Select

    Selection.PasteSpecial xlPasteValues, xlPasteSpecialOperationNone
    Application.CutCopyMode = False
    'Paste the filename in Column 1 (A) for all the rows just populated
    Range(cells(LastRow + 1,1), cells(LastRowInOneColumn(strStartCellColName),1).value = strFileName
    dataWB.Close False
    Sheets(strListSheet).Select
    ActiveCell.Offset(1, 0).Select
Loop
Exit Sub

ErrH:
MsgBox "It seems some file was missing. The data copy operation is not     complete."
Exit Sub
End Sub
Sub-GetDATA()
Dim strwhere复制为字符串,strStartCellColName复制为字符串
Dim strListSheet作为字符串,strCopySheet作为字符串
strListSheet=“列表”
关于错误转到错误
工作表(strListSheet)。选择
范围(“B2”)。选择
'这是主循环,我们将逐个打开文件并复制它们的
将数据输入主数据表
设置currentWB=ActiveWorkbook
当ActiveCell.Value“”时执行此操作
strFileName=ActiveCell.Offset(0,1)&ActiveCell.Value
strCopyRange=ActiveCell.Offset(0,2)&“&ActiveCell.Offset(0,3)
strWhereToCopy=ActiveCell.Offset(0,4).Value
strCopySheet=ActiveCell.Offset(0,6).Value
strStartCellColName=Mid(ActiveCell.Offset(0,5,2,1)
Application.Workbooks.Open strFileName,UpdateLinks:=False,ReadOnly:=True
设置dataWB=ActiveWorkbook
工作表(strCopySheet)。选择
范围(strCopyRange)。选择
选择,复制
当前wb.Activate
图纸(strWhereToCopy)。选择
lastRow=LastRowInOneColumn(strStartCellColName)
'从第2(B)列开始粘贴数据
单元格(最后一行+1、2)。选择
Selection.PasteSpecial xlPasteValues、XLPasteSpecialLoperationNone
Application.CutCopyMode=False
'将刚填充的所有行的文件名粘贴到第1(A)列中
范围(单元格(LastRow+1,1),单元格(LastRowInOneColumn(strStartCellColName),1)。值=strFileName
dataWB.Close为False
工作表(strListSheet)。选择
ActiveCell.Offset(1,0)。选择
环
出口接头
呃:
MsgBox“似乎缺少某个文件。数据复制操作未完成。”
出口接头
端接头
关键是我注释的两行-粘贴从第2列开始,而不是第1列,然后用文件名填充第1列,从最后一个已知使用的行到当前最后一个使用的行。我在示例中有点懒,粘贴了完整路径,但在SE和整个Google上都有大量的示例仅从pat中提取文件名h


另外,我遵循了使用
.Select
的模式,但是如果您修改代码以消除所有
.Select
ActiveCell
引用,它将运行得更快。

我认为您希望此过程将复制的每一行附加源工作簿的名称。我修改了您的主过程要做到这一点:

Sub GetDATA()
Dim strWhereToCopy As String, strStartCellColName As String
Dim strListSheet As String, strCopySheet As String

strListSheet = "List"

On Error GoTo ErrH
Sheets(strListSheet).Select
Range("B2").Select

'this is the main loop, we will open the files one by one and copy their data into the masterdata sheet
Set currentWB = ActiveWorkbook
curLastCol = Cells.Find(what:="*", after:=Cells(1, 1), searchorder:=xlByColumns, searchdirection:=xlPrevious).Column    'gets right-most used column

Do While ActiveCell.Value <> ""

    strFileName = ActiveCell.Offset(0, 1) & ActiveCell.Value
    strCopyRange = ActiveCell.Offset(0, 2) & ":" & ActiveCell.Offset(0, 3)
    strWhereToCopy = ActiveCell.Offset(0, 4).Value
    strCopySheet = ActiveCell.Offset(0, 6).Value
    strStartCellColName = Mid(ActiveCell.Offset(0, 5), 2, 1)

    Application.Workbooks.Open strFileName, UpdateLinks:=False, ReadOnly:=True
    Set dataWB = ActiveWorkbook

    Sheets(strCopySheet).Select
    Range(strCopyRange).Select
    Selection.Copy

    currentWB.Activate
    Sheets(strWhereToCopy).Select
    LastRow = LastRowInOneColumn(strStartCellColName)
    Cells(LastRow + 1, 1).Select

    Selection.PasteSpecial xlPasteValues, xlPasteSpecialOperationNone
    Cells(LastRow + 1, curLastCol + 1).Value = dataWB.Caption        'puts source workbook name
    Application.CutCopyMode = False
    dataWB.Close False
    Sheets(strListSheet).Select
    ActiveCell.Offset(1, 0).Select
Loop
Exit Sub
Sub-GetDATA()
Dim strwhere复制为字符串,strStartCellColName复制为字符串
Dim strListSheet作为字符串,strCopySheet作为字符串
strListSheet=“列表”
关于错误转到错误
工作表(strListSheet)。选择
范围(“B2”)。选择
这是主循环,我们将逐个打开文件,并将其数据复制到主数据表中
设置currentWB=ActiveWorkbook
curLastCol=Cells.Find(what:=“*”,after:=Cells(1,1),searchorder:=xlByColumns,searchdirection:=xlPrevious)。Column'获取最常用的列
当ActiveCell.Value“”时执行此操作
strFileName=ActiveCell.Offset(0,1)&ActiveCell.Value
strCopyRange=ActiveCell.Offset(0,2)&“&ActiveCell.Offset(0,3)
strWhereToCopy=ActiveCell.Offset(0,4).Value
strCopySheet=ActiveCell.Offset(0,6).Value
strStartCellColName=Mid(ActiveCell.Offset(0,5,2,1)
Application.Workbooks.Open strFileName,UpdateLinks:=False,ReadOnly:=True
设置dataWB=ActiveWorkbook
工作表(strCopySheet)。选择
范围(strCopyRange)。选择
选择,复制
当前wb.Activate
图纸(strWhereToCopy)。选择
LastRow=LastRowInOneColumn(strStartCellColName)
单元格(LastRow+1,1)。选择
Selection.paste特殊XLPasteValue,xlPasteSpe