另一本工作簿中的VBA查找

时间:2017-02-17 17:01:07

标签: excel vba excel-vba

我遇到了Excel的vba问题。所以我有这本工作簿,#34;书籍工具 - 2017年2月更新.xlsb",我目前正在更新,并将分发给大约10名团队成员用于跟踪他们的工作。我想要做的是从外部文档查找数据,"团队数据",将其放在"书籍工具的列DE中 - 2017年2月更新.xlsb"文件。所以我编写了下面的代码,当团队成员按下按钮时,它会打开查找文件,查找" SICcode"的A列中的数据。该外部文件的表格将其与" Book Sheet"的B列相匹配。 "书籍工具" file,并返回查找文件的D列中的值。它运行的时间长度为" Book Sheet",关闭外部文件,然后你会得到一个数据添加完成的弹出窗口。

现在,当我自己编写代码时,效果很好。自动打开外部文档,执行查找,返回正确的值,关闭外部文档,弹出。因此,我将带有宏的文件发送给我的经理,然后将其发送给我的团队其他成员,但宏不起作用。当宏运行时,外部文档打开,似乎它正在运行查找,关闭外部文件,弹出窗口,但DE列中没有值,也没有查找公式。我的经理没有更改工具文档的名称,他没有乱用任何代码。他通过电子邮件将它发回给我,并且该副本的公式不起作用,但是我使用我的主副本公式检查了它,即使它是相同的,宏也不会填充数据。

我们必须将外部数据保存在单独的文件中,否则具有查找数据的工具超过2MB并且需要永久运行或崩溃。

是否存在关于使用该文件来回发送电子邮件的信息,或者是否存在一些我需要查看的格式问题导致它无法正常工作?使用我的计算机上的主副本,无论我是在虚拟桌面中工作,还是在不同的文件夹中,无论如何,代码始终都能正常工作。

我对vba没关系,我不知道这个过程的所有技术细节,所以也许我忽略了我如何设置或Excel限制的一些缺陷。任何指导或帮助将不胜感激。

Sub AddData()

On Error Resume Next


'Open External Data Source
Workbooks.Open Filename:= _
    "W:\USB\Reporting\Book Tool\Attachments\Team Data.xls"

'View sheet where data will go into    
 Windows("Book Tool - Updated Feb. 2017.xlsb").Activate

 'Gets last row of Tool sheet
 Sheets("Book").Select
 lastrow = Cells(Rows.Count, "B").End(xlUp).Row

'Lookup in External File
Sheets("Book").Select
Range("DE2:DE" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-108],'[Team Data.xls]SICcode'!C[-109]:C[-104],5,FALSE)"


'Close External Data File
Windows("Team Data.xls").Activate
ThisWorkbook.Saved = True
Application.DisplayAlerts = False
ActiveWindow.Close


MsgBox "Data Add Done"


End Sub

1 个答案:

答案 0 :(得分:1)

确保对您的陈述进行适当的限定,并且将适当的工作簿分配给变量也是明智之举。请参阅以下修改后的代码:

Sub AddData()

On Error Resume Next ' I also suggest removing this since it wont warn you on an error.

Dim wb as Workbook
Dim wbExternal as Workbook

Dim ws as Worksheet
Dim wsExternal as Worksheet

'Open External Data Source
Set wbExternal = Workbooks.Open Filename:= _
    "W:\USB\Reporting\Book Tool\Attachments\Team Data.xls"

' Depending on the location of your file, you may run into issues with workbook.Open
' If this does become an issue, I tend to use Workbook.FollowHyperlink()


'View sheet where data will go into
' Windows("Book Tool - Updated Feb. 2017.xlsb").Activate
' Set wb = ActiveWorkbook

' As noted by Shai Rado, do this instead:
Se wb = Workbooks("Book Tool - Updated Feb. 2017.xlsb")

' Or if the workbook running the code is book tool
' Set wb = ThisWorkbook

 'Gets last row of Tool sheet
 Set ws = wb.Sheets("Book")
 lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

'Lookup in External File
Set wsExternal = wbExternal.Sheets("Book")
wsExternal.Range("DE2:DE" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-108],'[Team Data.xls]SICcode'!C[-109]:C[-104],5,FALSE)"


'Close External Data File

ThisWorkbook.Saved = True
Application.DisplayAlerts = False
Windows("Team Data.xls").Close


MsgBox "Data Add Done"


End Sub

我还建议浏览SO以获取有关避免.Select.Activate的提示,因为这可能会使您的代码不可靠,并且在某些情况下会显着降低您的代码速度。

最后,如果性能受到关注,您可能需要考虑将查找值加载到数组中并以这种方式查找相应的值。它完全取决于您使用的数据类型。我有一个使用filldown vlookups的工作簿,它通过在5到10分钟或更长的时间内运行,在不到20秒的时间内通过用循环数组替换VLOOKUPS来持续运行。