用于查询Excel的多个打开命令oledb连接
Private Function CreateConnString(ByVal Str As String) As String Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Str & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""" End Function ... For Each sMatl_Num As String In alMaterialNumbers ifileNo = 1 dbConnection.ConnectionString = CreateConnString(sExcelDBPath) dbCommand.Connection = dbConnection dbCommand.CommandText = "SELECT [col1], [col2], [col3], [col4], [col5], [col6] FROM [sheet$] WHERE [material]='" & sMatl_Num & "'" & " AND [col3] IS NOT NULL" & " AND [col6] IS NOT NULL" dbConnection.Open() dbReader = dbCommand.ExecuteReader() If dbReader.HasRows Then Do While dbReader.Read sCol1= dbReader.GetString(0).ToString sCol2= dbReader.GetString(1).ToString sCol3= dbReader.GetString(2).ToString sCol4= dbReader.GetString(3).ToString sCol5= dbReader.GetString(4).ToString sCol6= dbReader.GetString(5).ToString 'Write txt file with name and content derived from these strings Loop End If dbReader.Close() dbConnection.Close() Next
我正在使用oledb查询Excel文件。 有相当多的列从每行获取数据。 这是疯狂地运行缓慢。 有没有一种方法可以优化这个? 数组列表的数量大约是23k。
尝试只打开连接一次,然后处理它返回的行作为logging集,然后closures它。
所以你可以改变SQL来按照sMatl_Num来sorting行,并有一个where子句只selectalMaterialNumbers中的MaterialNumbers(这可能是一个IN子句或一个子查询 – 它取决于可能有多less个值)
所以得到一个logging,你可以通过它循环写出每个MaterialNumbers行,当数字改变写出下一个文件…
这是否有道理?
问题是,对于每个sMatl_Num
(我假设有23k?),你打开一个OLEDB连接,读取一个logging,然后逐个抓取字段,写入它们,然后closures连接。 打开和closures连接,在过滤其他字段的同时查询单个物料编号,并从返回的字段中提取数据非常昂贵。
这可能会更快,如果你一次带来整个logging集(复制和粘贴),使用自动filter或过滤掉col3=null and col6=null
,然后使用本机vlookup
function拉入Col1
– Col6
值。 而且它仍然可以在VBA中完成。
你正在使用的方法将更适合一个快速查找一个巨大的文件。 就像在Excel中有一个用户可以input材料编号的UI一样,你可以将OLEDB添加到材料主数据中,并获取所需的属性并将它们返回给用户界面。 一旦。