簡體   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