繁体   English   中英

合并查询中的.csv文件以通过UDF和ADODB连接从Excel检索其数据

[英]Merging .csv files in query to retrieve its data from Excel through a UDF and ADODB connection

我的目标是在vba运行一些代码,并从Excel单元vba用该函数,以从关闭的.csv文件或.xlsx文件中检索一些数据。

这可以通过多种方式完成,但是我尝试过的所有方法都有一个重要的约束。

我从一个非常大的.csv文件开始。 非常大,大约4,000行,超过1,000列。

第一次尝试:

.csv保存在Excel工作表中,然后使用ExecuteExcel4Macro检索数据。 在运行Sub甚至运行Function时,此方法都可以正常工作。 但是,不幸的是,您不能使用ExecuteExcel4Macro并从Excel单元格中调用它。 第一次尝试完成。

第二次尝试

使用ADODB Connection并直接从.csv文件或已保存的.xlsx文件运行查询。 可以从一个单元格中使用它,但是,令人惊讶的是,它有255个列或字段的限制。 我的意思是,当您运行查询并尝试读取位于大于255的列号中的字段时,该功能不执行任何操作。 第二次尝试完成。

第三次(也是最后一次(到目前为止))尝试。 在这里需要您的帮助!

好的,我可以将原始表(该表具有太多字段)划分为几个表,每个表最多包含255个字段。

注意:第一列包含公司,银行或任何其他机构的ID。 其余字段的名称分别为x1,x2,... x1050,它们与财务报表的字段相对应,因此它们都是数字形式,对分析很有用。

如果将大表拆分为不同的表,则方面将如下所示:

Table 1:
Name     x1     x2     x5    x6    x15...
myName1  15025  1546   6546  548   98663
myName2  867486 4684   68786 876   68997
myName3  87663  43397  87987 457   -4554
etc.

...

Table n:
Name     x928     x929     x940    x1005    x1250
myName1  765454   541546   76546   74548    18663
myName2  6564     544684   686     41876    58997
myName3  4687     64397    9887    879457   8554

我可以通过在存储文件之前运行一些vba来做到这一点,所以现在我有了n .csv文件。 关键是我希望从像这样的单元格中调用公式:

=GetData(path,file,name,operations)

我的意思是,用户希望在file找到一个name ,并使用“全部”可用字段(从1到1250)进行一些operations

让我们假设第一个拆分表从x1字段到x250字段。 第二个从x251到x500,依此类推。当然,所有表的第一列都包含names字段,并且所有表的行数都相同(不是相同的列数,因为不是所有x都一样)字段存在)。

但是,重要的是,该operations被用户调用可能是这样的:

"x3"                      --> User requests only one field.
"x5+x150"                 --> User requests the sum of two fields that would be in the same table (as the x150 field is not greater than x250 field)
"x452+x535-x900+x1200-x1" --> User requests operations with many fields that would be kept in different files. 

当用户只请求一个字段时,我可以在函数的开头编写一个小的例程,以告诉该函数该字段存储在哪个.csv文件中,例如:

if singleField<=250 then 
  fileToLookAt="SplittedCSV_1"
end if 
if singleField>250 and singleField<=500 then 
  fileToLookAt="SplittedCSV_2"
end if 

然后,使用ADODB ConnectionMicrosoft.Jet.OLEDB.4.0提供程序,我将运行查询,如下所示:

MyQuery = "SELECT x" & singleField & " AS MyData FROM [" & fileToLookAt & ".csv] WHERE Name='" & name & "'"

但是,当用户想要一个涉及存储在所有不同文件中的x字段的操作时会发生什么,就像我给出的第三个示例一样? 我将必须“合并”所有表,然后使用“ Name字段作为合并的键。

您将如何进行? 是否将“ Select最佳”选项中的表合并? Select会如何?

我的意思是查询将是这样的:

MyQuery = "SELECT x452+x535-x900+x1200-x1 AS MyData FROM [" & MergedTable & ".csv] WHERE Name='" & name & "'"

非常感谢您的宝贵时间。

您可以使用ado将数据填充到mdb文件中,并绕过256列限制。 但是,如果您使用的UDF数量过多,则使用UDF直接从任何外部数据源检索数据的速度将非常慢。 我将创建一个类来保存数据,并使用打开电子表格时调用的load方法,并让您的函数查询该对象。 因此,您的load方法将csv作为数据流,并填充定义为静态变量的不连续的ado记录集,然后定义一个getdata方法,该方法根据传递给它的参数返回所需的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM