我的问题如下: 我给多个人提供了一本工作簿。他们将此工作簿放在他们选择的文件夹中。所有人的工作簿名称都相同,但文件夹位置不同。 我们假设公共文件名是MyData-1.xls。 现在我已经更新了工作簿,并想把它交给这些人。然而,当他们收到新的(我们称之为MyData-2.xls)时,我希望从他们的文件(MyData-1)中提取他们数据的特定部分并自动放入提供的新数据(MyData-2)。 要复制/导入的列和单元格对于两个工作簿都是相同的。假设我想将单元格数据(仅限值)从MyData-1.xls,Sheet 1,单元格B8到C25 ......导入到MyData-2.xls工作簿中的相同位置。如何在代码中指定(可能附加到宏驱动的导入数据现在按钮)我希望将此数据带入此新工作簿。我通过打开两个工作簿并使用链接进程复制/粘贴特殊功能在我自己的位置尝试了它。它工作得很好,但它似乎在两个物理工作簿之间创建了一个硬链接。我更改了源工作簿的名称,它仍然有效。这让我相信两者之间存在“硬链接”,这使我无法将目标(MyData-2.xls)工作簿交给其他人并让它找到他们的源工作簿。
答案 0 :(得分:2)
为了澄清我的理解,每个用户都有一个名为MyData-1.xls的电子表格,但位置不同。您想向每个人发送一个新的电子表格MyData-2,它会自动从My8-1.xls中的范围B8:C25中提取数据?
这样做有各种各样的选择,下面我提供了一种方法。简而言之,用户将打开MyData-2,单击一个按钮,代码将在其目录中搜索MyData-1,打开工作簿,获取数据,将其粘贴到MyData-2中,然后关闭MyData-1。
Sub UpdateWorkbook()
'Identify workbook you would like to pull data from (same for all users)
Dim TargetWorkbook As String
TargetWorkbook = "MyData-1"
'Get the full path of that workbook by searching in a specified directory
Dim TargetPathName As String
TargetPathName = GetFilePath(TargetWorkbook)
'Retrieve data in range B8:C25, copy and paste, then close workbook
Dim TargetRng As Range
Application.ScreenUpdating = False
Workbooks.Open Filename:=TargetPathName
Set TargetRng = Sheets("Sheet1").Range("B8:C25")
TargetRng.Copy Destination:=ThisWorkbook.Worksheets(1).Range("B8:C25")
ActiveWorkbook.Close
Application.ScreenUpdating = True
End Sub
Function GetFilePath(TargetWkbook As String) As String
Dim FullFilePath As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
On Error Resume Next
With Application.FileSearch
.NewSearch
.LookIn = "C:\"
.FileType = msoFileTypeExcelWorkbooks
.SearchSubFolders = True
.Filename = TargetWkbook
If .Execute > 0 Then
FullFilePath = .FoundFiles(1)
End If
End With
GetFilePath = FullFilePath
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Function
作为解释:
请注意,屏幕更新已关闭,以创建复制数据时尚未打开工作簿的“幻觉”。另外,我在MyData-2的工作表上添加了一个按钮来触发代码,即用户打开工作簿,按下按钮,然后导入数据。
最后,此代码可能会显着增强,您可能需要调整它。例如,错误检查是否找不到文件,在多个目录中搜索(例如C:\,D :) ...
希望这能让你开始走上正确的道路
答案 1 :(得分:1)
您应该仅对值使用copy / paste-special:
Private Sub ImportData_Click()
On Error GoTo OpenTheSheet
Workbooks("MyData-1.xls").Activate
GoTo SheetOpen
OpenTheSheet:
Workbooks.Open "MyData-1.xls"
Workbooks("MyData-1.xls").Activate
SheetOpen:
On Error GoTo 0
Workbooks("MyData-1.xls").Worksheets("sheetwhatever").firstRange.Copy
Workbooks("MyData-2.xls").Worksheets("anothersheet").yourRange.PasteSpecial(xlPasteValues)
End Sub
这可以清理一下,但是在VBA中执行文件时总是很麻烦,我可能会把开放代码放在一个函数中。 确保他们将新文件放在与旧文件相同的目录中。