![](/img/trans.png)
[英]Different SQL queries in Excel VBA for csv files using ADODB connection
[英]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 Connection
和Microsoft.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.