SQL ADODB Recordset select distict находится в алфавитном порядке

Я использую набор записей ADODB в VBA. Когда я использую Select Distinct в SQL-запросе записи ADODB, результаты отображаются в алфавитном порядке. Мне нужны результаты в том порядке, в котором они находятся в данных. Это возможно?

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

DatPath = ThisWorkbook.Path & "\Temp\" & TB.Name

strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DatPath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

cn.Open strCon

strSQL = "SELECT Distinct(Period) from [Data$] "


rs.Open strSQL, cn, 3, 3

ThisWorkbook.Sheets("ADO Out").Cells.Clear
ThisWorkbook.Sheets("ADO Out").Activate
ThisWorkbook.Sheets("ADO Out").Cells(1, 1).CopyFromRecordset rs

1 ответ

Вот два обходных пути, которые оба включают извлечение всех Period записей.

Range.RemoveDuplicates удалит дубликаты при сохранении заказа

Sub UnorderedPeriod()
    Dim DatPath As String, strCon As String, strSQL As String
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    DatPath = ThisWorkbook.Path & "\Temp\" & TB.Name

    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DatPath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    cn.Open strCon

    strSQL = "SELECT [Period] from [Data$]"


    rs.Open strSQL, cn, 3, 3

    With ThisWorkbook.Sheets("ADO Out")
        .Cells.Clear
        .Cells(1, 1).CopyFromRecordset rs
        .Activate
        .Columns(1).RemoveDuplicates Columns:=1
    End With

End Sub

Используйте ArrayList удалить дубликаты

Function CopyDistinctFromRecordset(rs As Object, Target As Range)
    Dim list As Object
    Dim data
    Dim x As Long
    rs.MoveFirst
    data = rs.getRows
    Set list = CreateObject("System.Collections.ArrayList")

    For x = 0 To UBound(data, 2)
        If Not list.Contains(data(0, x)) Then list.Add data(0, x)
    Next

    Target.Resize(list.Count).Value = Application.Transpose(list.ToArray)

End Function
Другие вопросы по тегам