Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:从其他工作簿中提取数据的更有效方法?_Vba_Excel - Fatal编程技术网

Excel VBA:从其他工作簿中提取数据的更有效方法?

Excel VBA:从其他工作簿中提取数据的更有效方法?,vba,excel,Vba,Excel,作为将流程转移到CRM系统之前的临时修复,我使用Excel/VBA编写了一个工具,允许用户进行一些区域规划 此工具打开位于共享目录上的工作簿。然后,它将数据拉入用户的隐藏工作表上的工作簿。然后,用户通过可以看到的工作表进行所需的更改(这些工作表上有一个保存按钮,用于更改隐藏工作表上的相应数据) 当用户完成所有需要的更改后,他们点击“确认”按钮。然后会有一个宏重新连接到共享目录上的工作簿。它将数据推回共享目录上的此工作簿。此工作簿是[共享]的,因此多个用户可以同时进行更改,并且设置代码以防止数据被

作为将流程转移到CRM系统之前的临时修复,我使用Excel/VBA编写了一个工具,允许用户进行一些区域规划

此工具打开位于共享目录上的工作簿。然后,它将数据拉入用户的隐藏工作表上的工作簿。然后,用户通过可以看到的工作表进行所需的更改(这些工作表上有一个保存按钮,用于更改隐藏工作表上的相应数据)

当用户完成所有需要的更改后,他们点击“确认”按钮。然后会有一个宏重新连接到共享目录上的工作簿。它将数据推回共享目录上的此工作簿。此工作簿是[共享]的,因此多个用户可以同时进行更改,并且设置代码以防止数据被不适当地覆盖

也就是说,我遇到了一个恼人的问题。我们在世界各地都有办事处。看来用户的连接速度差别很大。连接速度较慢的用户遇到以下错误:

“Microsoft Office Excel正在等待另一个应用程序完成OLE操作。”

我怀疑这是由于连接速度较慢,因为microsoft的支持站点指出,当excel尝试与另一个未及时响应的应用程序交互时,可能会出现此错误

当宏试图在共享目录中打开工作簿时,会出现此错误,因此连接速度是有意义的主要问题

我发现我可以通过使用
Application.DisplayAlerts=False
来阻止此错误,但更好的修复方法是使此过程更高效

所以我真正的问题是,除了打开工作簿之外,还有什么更有效的方法可以用来提取数据吗

编辑:工作表打开共享工作簿的代码:

Dim xlo As New Excel.Application
Dim xlw As New Excel.Workbook
Dim xlz As String, regions As String


xlz = Sheet1.Range("o1").Value & "\Region Planning\TestDB.xlsx"
Set xlw = xlo.Workbooks.Open(xlz)

单元格O1包含共享驱动器的驱动器号。

从共享Excel工作表“拉入数据”的效率几乎完全与VBA代码有关,很少与连接有关(即您可以更改的任何内容)。如果您不向我们展示该代码,也不告诉我们有关该代码的任何信息,我们将无法就该代码向您提供建议。另一方面,您正在经历的阻塞似乎是尝试将Excel电子表格用作共享数据库的可能结果。更好的方法是使用实际数据库作为共享数据库(最好是DBMS服务器)。我编辑了本文的主要内容,其中包含工作簿试图访问共享工作簿的代码。正如在主要帖子中所述,我相信这个错误是在宏实际尝试将任何数据从共享工作簿写入目标工作簿之前出现的。不幸的是,(由于这是一个临时修复),我无法使用合法的数据库来存储中心数据。代码在excel的新实例中打开工作簿,因为我不希望共享工作簿可见。通常RBarryYoung是100%正确的,使用数据库共享数据访问比使用非常有限的共享工作簿更好。。。。不管怎么说,你是以只读方式打开的吗?您可以传递一个参数,告诉您正在为
Open
方法以只读方式打开,这样可以避免错误。从技术上讲,您应该以只读方式打开该工作簿,然后复制数据并关闭该对象。人们以不同的速度工作,你不想一直打开工作簿。让已使用的用户操作复制的数据,然后重新打开工作簿以更新数据。但请记住,从共享工作簿中提取的数据在提取后即已过期。您可能正在覆盖其他人的工作等。我不知道整个共享过程在您的位置是如何“工作”的,但您应该重新考虑将所有内容转移到关系数据库中。您所描述的正是我如何设置工作簿的。它被打开,数据被拉入目标工作簿(在隐藏的工作表上),然后共享工作簿被关闭。然后,在用户关闭工作簿并将新数据推送到共享工作簿之前,它会再次打开。只有用户已更改的数据才会推送到新工作簿,以防止意外的数据覆盖。我现在猜测,这个问题是由于共享目录所在的服务器的位置和/或用户的连接速度造成的。