Я создаю инструмент, с помощью которого пользователи могут запрашивать ODBC через Excel. Мне нужна функция, которая будет просматривать столбец идентификаторов элементов, которые вставил пользователь, а затем создавать текстовую строку, которую можно использовать в части Sql VBA. Количество идентификаторов элементов может варьироваться.
Используя аналогичную функцию (не созданную мной), я могу сослаться на одну ячейку и вставить ' и , где это необходимо, но я не могу заставить это работать для нескольких ячеек в одном столбце.
'Вот код, который я использовал для существующей функции:
Function CreateSQLAndQry(field_input As String, input_string As String) As String
cleaned_string = Replace(input_string, " ", "")
Dim xArray() As String
xArray() = Split(cleaned_string, ",")
Dim lenArray As Integer
lenArray = UBound(xArray())
Dim new_string As String
new_string = ""
For I = 0 To lenArray
xArray(I) = "'" & xArray(I) & "'"
new_string = xArray(I) & "," & new_string
Next
If input_string = "" Then
new_string = ""
Else: new_string = Left(new_string, Len(new_string) - 1)
End If
If input_string = "" Then
new_qry = ""
Else: new_qry = " AND " & field_input & " IN (" & new_string & ") "
End If
Если бы столбец данных выглядел так:
тест1 тест2
Мне нужно, чтобы вывод выглядел так:
в ('тест2', 'тест1')
Формула у вас неполная, она не показывает окончание, но вот функция, которая перебирает любое количество ячеек и создает строку, похожую на то, что вы ищете. Вы можете изменить префикс в константах в верхней части формулы или повозиться с ним, чтобы выполнить любые манипуляции, которые вы хотите.
Function PullTextTogether(rng As Range) As String
Const xSepx As String = ","
Const preText As String = "in "
Const ignoreText As String = " " ''characters you want stripped out
Dim aCell As Range
For Each aCell In Intersect(rng, rng.Worksheet.UsedRange).Cells
If aCell.Value2 <> "" Then
PullTextTogether = PullTextTogether & "'" & xSepx & "'" & aCell.Value2
'Duplicate this with more text you would want to strip out
PullTextTogether = Replace(PullTextTogether, ignoreText, "")
End If
Next aCell
If PullTextTogether <> "" Then
'cleans up
PullTextTogether = preText & "('" & Right(PullTextTogether, Len(PullTextTogether) - 3) & "')"
End If
End Function
Это сработало отлично и дало результат "в ('Test1','Test2','Test3','Test4','Test5','Test6','Test7','Test8','Test9',' Test10’, ‘Test11’, ‘Test12’,’Test13’, ‘Test14’, ‘Test15’, ‘Test16’)» из выбранного столбца. Спасибо за помощь!