搜索工作簿并提取数据而无需打开它excel vba

时间:2016-09-09 15:46:28

标签: excel vba excel-vba

我有一些vba代码可以根据filename-date打开excel文件(例如“test-09Sep2016.xlsm”。

打开文件后,它会搜索工作簿并尝试查找我正在查找的内容。一旦它返回结果,它将关闭工作簿并遍历文件夹以查找下一个文件等等....

问题是文件大小很大,打开文件需要很长时间,我想知道是否有办法在不打开实际文件的情况下这样做。

我目前的代码如下:

.bat

非常感谢任何帮助!!

由于

1 个答案:

答案 0 :(得分:0)

可以在不使用打开文件的情况下从Excel检索数据,但您必须(据我所知)知道至少第一列/行和最后一列目标文件中的数据集。您不需要知道最后一行。

例如,此代码调用两个单独的过程,一个从单个单元格返回值,另一个从名为GetDataInClosedWB的已关闭工作簿中返回定义范围中第一个单元格的值:

Sub Main()
    Call GetDataFromSingleCell("A1")
    Call GetDataFromRangeBlock("A2", "D")
End Sub
Sub GetDataFromSingleCell(cell As String)

    Dim CN As Object ' ADODB.Connection
    Dim RS As Object ' ADODB.Recordset

    Set CN = CreateObject("ADODB.Connection")
    Set RS = CreateObject("ADODB.Recordset")

        CN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=" & CStr("C:\Users\USERNAME\Desktop\GetDataInA1.xlsx") & _
                ";" & "Extended Properties=""Excel 12.0;HDR=No;"";"
    RS.Open "SELECT * FROM [Sheet1$" & cell & ":" & cell & "];", CN, 3, 1  'adOpenStatic, adLockReadOnly


    MsgBox (RS.Fields(0).Value)
End Sub
Sub GetDataFromRangeBlock(firstCell As String, lastCol As String)
    'firstCell is the upper leftmost cell in the target range
    'lastCol is the column reference (e.g. A,B,C,D...) of the last column in the 
    'target dataset

    Dim CN As Object ' ADODB.Connection
    Dim RS As Object ' ADODB.Recordset

    Set CN = CreateObject("ADODB.Connection")
    Set RS = CreateObject("ADODB.Recordset")

    CN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=" & CStr("C:\Users\USERNAME\Desktop\GetDataInA1.xlsx") & _
             ";" & "Extended Properties=""Excel 12.0;HDR=No;"";"
    RS.Open "SELECT * FROM [Sheet1$" & firstCell & ":" & lastCol & "];", CN, 3, 1  'adOpenStatic, adLockReadOnly


    MsgBox (RS.Fields(0).Value)
End Sub

GetDataInClosedWB文件在A1中的值为Hello World!,在范围A2中的值为FirstHeaderSecondHeaderThirdHeaderFourthHeader: D2,分别。第一个过程在消息框中返回Hello World!,第二个过程在消息框中返回FirstHeader

将数据加载到Recordset后,您可以遍历它并执行逻辑。

注意:如果您更喜欢早期绑定,则需要启用对Microsoft ActiveX数据对象库的引用。