0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
1

Вставка данных из словаря по условию

02.07.2018, 16:42. Показов 2012. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помощи, так как код выдает ошибку и я не понимаю что надо исправить. По задумке в словарь попадают ключи и элементы, которые если ключ совпадают, добавляются через запятую. Потом эти склеиные элементы надо выгрузить в файл по совпадению ключа и данных из столбика А. Написала код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim dicDom 'переменная словаря
Dim keyNum As Variant 'переменная для договора
  A = ActiveSheet.UsedRange
  Set dicDom = CreateObject("Scripting.Dictionary")
  With Sheets("èñõ")
    For i = 1 To UBound(A)
        keyNum = CStr(.Cells(i, 1).Value) 'получаем ключ
        dicDom(keyNum) = dicDom(keyNum) & ", " & CStr(.Cells(i, 3).Value) 'добавляем значение элемента
    Next i
    For i = 1 To UBound(A) 'выгружаем элементы из словаря по условию
    If dicDom.Keys(keyNum) = .Cells(i, 1) Then
    .Cells(i, 4) = dicDom.Items(keyNum)
    End If
    Next i
  End With
Выдает ошибку на строке:
Visual Basic
1
If dicDom.Keys(keyNum) = .Cells(i, 1) Then
У меня есть подозрение, что это из-за того что нет параллельного цикла по словарю, но как это сделать не знаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2018, 16:42
Ответы с готовыми решениями:

Вставка данных по условию
Можем ли мы вставить данные в таблицу не применяя стороннюю таблицу? Что то типо: INSERT INTO...

Вставка рисунков по условию
Добрый день! Подскажите, пожалуйста, может у кого-то есть написанный макрос для выполнения...

Вставка таблицы по условию
День добрый! В примере в первых двух строках содержатся условия, обозначенные разными цветами,...

Вставка строк по условию
Добрый день! Подскажите, пожалуйста, как реализовать следующие условие: Если в первом...

11
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.07.2018, 16:49 2
Makroshka, файл-пример приложите
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
02.07.2018, 17:19  [ТС] 3
Прикладываю файл пример. В реальном документе 200 тыс+ строк. Поэтому скорость тоже имеет немалое значение.
Вложения
Тип файла: xlsx пример_словарь.xlsx (9.5 Кб, 8 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.07.2018, 19:23 4
Чуть недокрутили... но принципиально.
Visual Basic
1
2
3
4
5
6
        For i = 1 To UBound(A)    'выгружаем элементы из словаря по условию
            keyNum = CStr(.Cells(i, 1).Value)    'получаем ключ
            If dicDom.exists(keyNum) Then
                .Cells(i, 4) = dicDom.Item(keyNum)
            End If
        Next i
Добавлено через 1 минуту
А вообще под это дело давно есть UDF, например я такую написал и применяю:
Visual Basic
1
=VLOOKUPCOUPLE(A:C;1;A2;3;", ")
код где-то здесь на форуме есть.
Вот нашёл: Поиск и сохранение данных на другой лист разделенных "; "
0
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.07.2018, 19:29 5
Цитата Сообщение от Makroshka Посмотреть сообщение
Поэтому скорость тоже имеет немалое значение
Поэтому не надо обращаться в цикле к ячейкам, ведь все данные уже в массиве:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub gg()
Dim dicDom 'переменная словаря
Dim keyNum As Variant 'переменная для договора
Dim A(), i&
  Set dicDom = CreateObject("Scripting.Dictionary")
  A = ActiveSheet.UsedRange.Value
  For i = 1 To UBound(A)
      keyNum = CStr(A(i, 1)) 'получаем ключ
      dicDom(keyNum) = dicDom(keyNum) & ", " & A(i, 3) 'добавляем значение элемента
  Next i
  ReDim B$(1 To UBound(A), 1 To 1)
  For i = 1 To UBound(A) 'выгружаем элементы из словаря по условию
    B(i, 1) = Mid$(dicDom(CStr(A(i, 1))), 3)
  Next i
  Range("D1").Resize(UBound(B)).Value = B
End Sub
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.07.2018, 19:37 6
Да, на 200 тыс. строк конечно такую UDF применять нет смысла, долго... Но можно например написать массивную - только заносить её будет трудно
P.S. не обратил внимания что там ячейки перебираются
Но если там 200000 строк, то вся usedrange может не поместиться в память (вдруг там правее ещё есть данные), берите только нужные столбцы. И ещё - не всегда usedrange начинается с первой строки листа, и тут тоже в таком коде может ожидать подвох
0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
03.07.2018, 11:21  [ТС] 7
Казанский, спасибо, использовала ваш вариант. Не могли бы вы пояснить откуда берутся переменные Mid$ и CStr. Они нигде не назначаются, значит вписаны непосредственно в алгоритм словаря. Где об этом можно поподробнее почитать, а то я этой инфы нигде не находила.

Hugo121, я прислала конечную таблицу, поэтому использование только нужных столбцов не критично. Но на будущее хотелось бы для себя прояснить вопрос: если только определенные столбца, то я завожу такую строку кода:
Visual Basic
1
A = ActiveSheet.Range("A:A","C:C").Value
Правильно?
0
Заблокирован
03.07.2018, 12:02 8
Makroshka, ВЫ без малого три года в VBA - пора бы основы языка освоить.
Цитата Сообщение от Makroshka Посмотреть сообщение
откуда берутся переменные Mid$ и CStr
https://msdn.microsoft.com/ru-... d-function
https://msdn.microsoft.com/ru-... -functions
0
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
03.07.2018, 12:09 9
Makroshka, Cstr в вашем коде было. Это функция, которая возвращает текстовое представление аргумента. Для словаря это необязательно, но если вдруг в разных строках NUM будет представлен как число 7 и текст "7", то с этой функцией это будет один и тот же ключ, а без нее - разные ключи.
Mid - функция, которая возвращает часть строки. Поставьте курсор в слово Mid и нажмите F1 - это вообще универсальный метод
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
03.07.2018, 12:10 10
Цитата Сообщение от Makroshka Посмотреть сообщение
Правильно?
неправильно.
В массив можно (я говорю про "легко") взять только смежные столбцы, можете допустить пару/несколько лишних, но нет никакого смысла брать возможно десятки лишних правее.
Если нужные например второй и двадцать второй, то я обычно делаю два отдельных массива. Или можно делать массив массивов, что в общем только усложнит понимание кода
0
Hugo121
03.07.2018, 12:12
  #11

Не по теме:

Я думал только у меня глючит - оказалось форум подглюкивает :)

0
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 163
03.07.2018, 12:54  [ТС] 12
Спасибо, все поняла)
0
03.07.2018, 12:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2018, 12:54
Помогаю со студенческими работами здесь

Вставка R1C1 формулы по условию
Добрый вечер! Прошу подсказать с задачей: Как в столбец В вставить для Апельсинов одну R1C1...

Вставка новых столбцов по условию
Добрый день! подскажите пожалуйста, как по диапазону A1:M1 проверить каждую ячейку, и если в ней...

Вставка строк по условию из значений по умолчанию
Здравствуйте! Никогда такое не делал и поэтому просто не знаю возможно ли такое сделать. Вот,...

Из словаря создается объект, именами атрибутов которого будут ключи словаря
Из словаря создается объект, именами атрибутов которого будут ключи словаря, а значениями -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru