2017-02-02 2 views
1

Я получил это:VBA цикл запроса scripting.dictionary

Set dict = CreateObject("Scripting.Dictionary") 

    rn = 2 
    Do While ThisWorkbook.Sheets("1").Range("B" & rn).Value <> "" 
     If (ThisWorkbook.Sheets("1").Range("B" & rn).Value <> "") Then dict("&&1") = dict & ThisWorkbook.Sheets("1").Range("B" & rn).Value & ", " 
     rn = rn + 1 
    Loop 

Но это не работает, я получаю ошибку 450 в VBA.

Что нужно сделать, так это следующее: каждое значение в столбце B (если оно не пустое) должно быть добавлено в dict, разделенное запятой. Если после последней строки он не может установить запятую.

Я думаю, что я на правильном пути, но там что-то не хватает.

+2

«Словарь» обычно используется для хранения уникальных ключей, а затем для каждого уникального ключа для добавления значений, относящихся к этому уникальному ключу. Зачем вам «Словарь» для вашей задачи? чего вы пытаетесь достичь? –

+0

С помощью dict я хочу искать у всех клиентов свои адреса. Поэтому я делаю именно то, что вы объяснили. – user7219039

ответ

0

Чтобы получить все уникальные значения в строку можно изменить код следующим образом

Обратите внимание, что вы должны использовать ThisWorkbook.Sheets(1) не ThisWorkbook.Sheets("1")

Pls использовать MsgBox Left$(strOut, Len(strOut) - 2) зафиксировать заднюю нетребуемые часть

Sub a() 
Dim ws As Worksheet 
Set dict = CreateObject("Scripting.Dictionary") 
Dim strOut As String 

Set ws = Sheets(1) 

    rn = 2 
    Do While ws.Range("B" & rn).Value <> "" 
     If Len(ws.Range("B" & rn).Value) > 0 Then 
      If dict.exists(ws.Range("B" & rn).Value) Then 
       Else 
       dict.Add ws.Range("B" & rn).Value, 1 
      strOut = strOut & (ws.Range("B" & rn).Value & ", ") 
      End If 
     End If 
     rn = rn + 1 
    Loop 
    MsgBox strOut 
End Sub 
+0

Это потрясающе, это работает! У меня есть несколько вопросов, чтобы понять это лучше. Вы использовали strOut для объединения всех значений, почему не dict («&& 1») является хорошим решением здесь? И, к сожалению, после последнего значения он помещает запятую, как это предотвратить? – user7219039

+0

Я использовал словарь, чтобы просто хранить уникальные значения. Хотя вы могли бы затем повторить через словарные статьи, чтобы получить значения, я сделал это напрямую с циклом. Исправит завершающие символы! – brettdj

+0

По-своему я исправляю это как strOut = Left (strOut, Len (strOut) - 2). К сожалению, когда я использую свой метод для его вызова, он не работает. Вызов MOD_SQL.ExecQuery (ThisWorkbook.Path & "\ SQL Files \ Info.sql", "QueryResult", dict, "B1", "QueryResult") Нужно ли мне вводить dict там или strOut или что-то еще? – user7219039

0

просто бросить в более сжатой версии brettdj решения

Sub main() 
    Dim cell As Range 
    Dim strOut As String 

    With CreateObject("Scripting.Dictionary") 
     For Each cell In Sheets(1).Range("B2", Sheets(1).Cells(.Rows.Count, "B")).SpecialCells(xlCellTypeConstants, xlTextValues) 
      .Item(cell.Value) = 1 
     Next 
     strOut = Join(.keys, ",") 
     MsgBox strOut 
    End With 
End Sub 
+0

К сожалению, когда я использую свой метод для его вызова, он не работает. Вызовите MOD_SQL.ExecQuery (ThisWorkbook.Path & "\ SQL Files \ Info.sql", "QueryResult", dict, "B1", "QueryResult") Нужно ли мне вводить dict там или strOut или что-то еще? – user7219039

+0

Не работает «ничего полезного». Но это совершенно другая проблема из вашего _original_ OP и гораздо шире: вы можете сделать новый пост со всеми необходимыми деталями, чтобы поймать проблему. – user3598756

+0

Я уже исправил это, глупая ошибка (см. комментарий выше вашего решения) – user7219039

Смежные вопросы