vba - 在VBA中设置数据结构

标签 vba excel data-structures

我正在寻找set Excel VBA 中使用的数据结构。到目前为止我发现的是 Scripting.Dictionary ,它似乎是 map .

VBA中也有类似集合的东西吗?

基本上,我正在寻找一种数据结构,可以有效地查找是否已添加特定值。

最佳答案

看看.NET ArrayList ,它有AddContainsSort等方法。您可以在VBS和VBA环境中实例化该对象:

Set ArrayList = CreateObject("System.Collections.ArrayList")

Scripting.Dictionary 也可能满足需求,它具有唯一的键,Exists 方法允许检查键是否已在字典中。

但是,对于这种情况,通过 ADODB 进行 SQL 请求可能会更有效。以下示例展示了如何通过对工作表的 SQL 查询检索唯一行:

Option Explicit

Sub GetDistinctRecords()

    Dim strConnection As String
    Dim strQuery As String
    Dim objConnection As Object
    Dim objRecordSet As Object

    Select Case LCase(Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")))
        Case ".xls"
            strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 8.0;HDR=YES;"";"
        Case ".xlsm", ".xlsb"
            strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"
    End Select

    strQuery = "SELECT DISTINCT * FROM [Sheet1$]"
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open strConnection
    Set objRecordSet = objConnection.Execute(strQuery)
    RecordSetToWorksheet Sheets(2), objRecordSet
    objConnection.Close

End Sub

Sub RecordSetToWorksheet(objSheet As Worksheet, objRecordSet As Object)

    Dim i As Long

    With objSheet
        .Cells.Delete
        For i = 1 To objRecordSet.Fields.Count
            .Cells(1, i).Value = objRecordSet.Fields(i - 1).Name
        Next
        .Cells(2, 1).CopyFromRecordset objRecordSet
        .Cells.Columns.AutoFit
    End With

End Sub

源数据应放置在Sheet1上,结果输出到Sheet2。该方法的唯一限制是 ADODB 连接到驱动器上的 Excel 工作簿,因此应在查询之前保存任何更改以获得实际结果。

如果您只想获取非不同行的集合,则查询应如下所示(仅作为示例,您必须将字段集放入查询中):

    strQuery = "SELECT CustomerID, CustomerName, ContactName, Address, City, PostalCode, Country FROM [Sheet1$] GROUP BY CustomerID, CustomerName, ContactName, Address, City, PostalCode, Country HAVING Count(*) > 1"

关于vba - 在VBA中设置数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41720284/

相关文章:

vba - 复制并粘贴整行

excel - 如果在列中按下 Enter 键如何触发代码

java - 从java中的excel获取多项式函数的值

vba - "Type"中的 Const 变量 - 语句 vba

algorithm - 基于位置和半径的对象快速查询

c++ - 具有随机访问元素删除的类队列数据结构

vba - 如果单元格值等于 "blank",则删除 Excel 中多个工作表上的行

excel - 大型数据集 VBA 的 For 循环崩溃

algorithm - 在给定的 ASCII 文本文件中匹配最接近的文件

excel - 发现要使用的 SAP 事务字段的组件标识符