Рассмотрите возможность использования SQL при использовании Excel для Windows.Ниже показаны строки подключения с драйвером, использующим ODBC, и провайдер, использующий OLEDB.Однако ваш текущий SQL, который выглядит как диалект Oracle, должен быть переведен на диалект SQL Jet / ACE (очень движок MS Access).Кроме того, ниже предполагается, что ваши данные поддерживают заголовки и начинаются в самой верхней левой ячейке в A1 и на пустом листе с именем РЕЗУЛЬТАТЫ для вывода запроса.
SQL (используется вНиже приведена строка VBA, настройте SheetName в FROM
)
SELECT agg.[name],
agg.sum_count AS [count],
agg.sum_net AS [net],
IIF(sub.sum_net > 0, 'C',
IIF(sub.sum_net < 0, 'D', '0')
) AS [CD]
FROM
(SELECT s.[name],
SUM(s.[count]) AS sum_count,
SUM(IIF(CD = 'C', ROUND(net,2), ROUND(net,2) * -1)) AS sum_net
FROM [SheetName$] s
WHERE INSTR(s.[name], 'DGPS') = 0 OR INSTR(s.[name], 'PART') = 0
GROUP BY s.[name]
) AS agg
ORDER BY UCASE(agg.[name]);
VBA (без циклов или с логикой)
Sub RunSQL()
Dim conn As Object, rst As Object
Dim strConnection As String, strSQL As String
Dim LastRow As Integer
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' TWO CONNECTION STRINGS FOR DRIVER OR PROVIDER
' strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
' & "DBQ=" & ThisWorkbook.FullName & ";"
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source='" & ThisWorkbook.FullName & "';" _
& "Extended Properties=""Excel 12.0;HDR=YES;"";"
' OPEN DB CONNECTION
conn.Open strConnection
' OPEN QUERY RECORDSET
strSQL = "SELECT agg.[name], " _
& " agg.sum_count AS [count], " _
& " agg.sum_net AS [net], " _
& " IIF(sub.sum_net > 0, 'C', " _
& " IIF(sub.sum_net < 0, 'D', '0') " _
& " ) AS [CD] " _
& " FROM " _
& " (SELECT s.[name], " _
& " SUM(s.[count]) AS sum_count, " _
& " SUM(IIF(CD = 'C', ROUND(net,2), ROUND(net,2) * -1)) AS sum_net " _
& " FROM [SheetName$] s " _
& " WHERE INSTR(s.[name], 'DGPS') = 0 OR INSTR(s.[name], 'PART') = 0 " _
& " GROUP BY s.[name] " _
& " ) AS agg " _
& " ORDER BY UCASE(agg.[name]);"
rst.Open strSQL, conn
' COPY DATA TO WORKSHEET
Worksheets("RESULTS").Range("A2").CopyFromRecordset rst
rst.Close: conn.Close
Set rst = Nothing: Set conn = Nothing
End Sub