Использование массива или словаря как из предложения в SQL в Excel VBA

Можно ли использовать массив или словарь в качестве таблицы в выражении SQL.

например strSQL = "SELECT * FROM" & myArray & ""

Заранее спасибо.

 Ralph16 июн. 2016 г., 15:51
Вставьте массив на пустой лист, а затем используйте ADO для запроса листа. Вот решение с примером кода для вашего рассмотрения:stackoverflow.com/questions/3955061/...
 D Stanley16 июн. 2016 г., 15:48
Не в VBA. VB.NET имеет Linq, которыйлайк SQL. SQL для запросовбазы данных, а не локальные переменные. Что вы ожидаете получить на выходе? Если у вас уже есть массив, для чего вам нужен SQL?
 user463723816 июн. 2016 г., 16:19
Привет, Тим, примером желаемого запроса будет «SELECT A, B, C FROM» & myArray & «WHERE B = 2. Честно говоря, я даже не знаю, возможно ли то, что я хочу сделать. Массив также 2 мерный.
 user463723816 июн. 2016 г., 15:52
Это был лишь грубый пример, на самом деле sql имел бы предложения WHERE и GROUP BY, возможно, с несколькими операторами sql, выполняемыми по данным.
 user463723816 июн. 2016 г., 15:54
Спасибо, Ральф, но это развертывается как XLA, поэтому я хотел, чтобы запись на листе была минимальной
 Tim Schmelter16 июн. 2016 г., 15:53
Что ты хочешь делать вообще? Какой будет желаемый запрос? Обычно вы должны использоватьJoin связать таблицы. Если вы добавляете таблицы через запятую, вы создаете декартово произведение всех возможных комбинаций строк между всеми таблицами.

Ответы на вопрос(3)

Dim a(3) As Variant

a(0) = 1
a(1) = 2
a(2) = 3
a(3) = 4

Debug.Print "select * from xyz where id in (" & Join(a, ",") & ")"
 user463723816 июн. 2016 г., 15:58
Что ты имеешь в виду Ральф
 Ralph16 июн. 2016 г., 15:56
Массив - это таблица, а не предложение where. Во всяком случае вам придется построить таблицу сUNION ALL, Итак, может быть что-то вроде этого:Debug.Print "select * from (" & Join(a, " UNION ALL ") & ") as tmp"
 Ralph16 июн. 2016 г., 16:03
Debug.Print "select * from (SELECT " & Join(a, " UNION ALL SELECT ") & ") as tmp" это почти то, что вы хотите. Но все еще отсутствует имя столбца.
 user463723816 июн. 2016 г., 16:09
Итак, скажем, столбцы «A», «B», «C», они определены в первой «строке» массива.
Решение Вопроса

В продолжение идеи, предоставленной @Nathan_Sav, следующий код должен:

Dim a(3) As String

a(0) = "1 as C1"
a(1) = 2
a(2) = 3
a(3) = 4

Debug.Print "select * from (SELECT " & Join(a, " UNION ALL SELECT ") & ") as tmp"
Обновить:

Вот короткая подпрограмма для ручной конкатенации / создания необходимой строки:

Option Explicit

Sub tmpTest()

Dim strSQL As String
Dim varArray As Variant
Dim lngRow As Long, lngColumn As Long

varArray = ThisWorkbook.Worksheets(1).Range("A1:G12")

strSQL = "select * from "
strSQL = strSQL & "(select "
For lngRow = LBound(varArray, 1) + 1 To UBound(varArray, 1)
    For lngColumn = LBound(varArray, 2) To UBound(varArray, 2)
        'First row must contain column names
        If lngRow = LBound(varArray, 1) + 1 Then
            strSQL = strSQL & varArray(lngRow, lngColumn) & _
                " as [" & varArray(lngRow - 1, lngColumn) & "], "
        Else
            strSQL = strSQL & varArray(lngRow, lngColumn) & ", "
        End If
        'Beyond the last column a UNION ALL SELECT must be added
        '  except for the last row
        If lngColumn = UBound(varArray, 2) And _
            lngRow < UBound(varArray, 1) Then
                strSQL = Mid(strSQL, 1, Len(strSQL) - 2) & _
                    " union all select "
        End If
    Next lngColumn
Next lngRow
strSQL = Mid(strSQL, 1, Len(strSQL) - 2) & ") as tmp"
Debug.Print strSQL

End Sub

Приведенный выше код предполагает, что данные находятся на листе 1 в диапазонеA1:G12 где первая строка содержит заголовки столбцов.

 user463723816 июн. 2016 г., 17:23
Извините, Ральф, я новичок в этом и не знаю этикета, рад, что на это указывают в правильном направлении.
 user463723816 июн. 2016 г., 16:40
спасибо, просто чтобы усложнить дело, массив является двухмерным, так что я получаю индекс из-за ошибки диапазона, когда я пытаюсь. Возможно ли для этого работать на 2-мерном массиве. спасибо за вашу помощь (все).

Массив SQL как функция поиска:

SELECT TABLEARRAY.*
FROM (
    SELECT P.*
    FROM Person P
    WHERE P.id IN (1, 2, 3, 4, 18) --This would be your array with ID's
     ) AS TABLEARRAY

Ваш ответ на вопрос