另一个工作簿中的VBA查找

我有一个与Excel的VBA问题。 所以我有这本工作手册,“图书工具 – 2017年2月更新.xlsb”,我目前正在更新,将分发给约10名团队成员用于跟踪他们的工作。 我想要做的是从外部文档“Team Data”中查找数据,将其放在“Book Tool – 2017年2月更新的.xlsb”文件的DE列中。 所以我编写了下面的代码,当团队成员按下button时,打开查找文件,在外部文件的“SICcode”表的A列中查找数据,并将其与“Book工作表“文件的”工作表“,并返回查找文件的D列中的值。 它运行“Book Sheet”的长度,closures外部文件,并获得数据添加完成的popup窗口。

现在当我自己做这个代码的时候,效果很好。 自动打开外部文档,查找,返回正确的值,closures外部文档,popup。 所以我把这个macros的文件发给了我的经理,然后把它给了我的团队的其他成员,但是macros不起作用。 当macros运行时,外部文档打开,好像它正在运行查找,closures外部文件,popup窗口出现,但DE列中没有值,也没有查找公式。 我的经理没有更改工具文件的名称,他没有篡改任何代码。 他通过电子邮件发回给我,并与该副本公式不起作用,但我检查了我的主副本公式,即使它是相同的,macros不会填充数据。

我们必须将外部数据保存在一个单独的文件中,否则带查找数据的工具将超过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 

一定要正确地限定你的陈述,而且把适当的工作簿分配给一个variables也是明智的。 请参阅下面的修改代码:

 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 

我还build议浏览SO,以避免.Select.Activate提示,因为这可能会使您的代码不可靠,并在某些情况下,可能会显着减慢您的代码。

最后,如果性能是一个问题,您可能需要考虑将查找值加载到数组中并以这种方式查找相应的值。 这将完全取决于你正在使用什么样的数据。 我有一个工作簿使用filldown的vlookups从5-10分钟或更长的时间内运行,通过将VLOOKUPSreplace为循环数组,可以在不到20秒的时间内持续运行。