Добрый вечер! Есть столбец с шестизначными числами, около 3500. Макрос проверяет введённое данное на соответствие с этими числами. Сделал это с помощью цикла. Знаю, что есть формулы для работы с массивом. Но для этого надо будет вручную вбивать это огромное количество кодов в макрос вручную, что нереально. Есть ли возможность сделать это, чтоб проверка на соответствие шла в самом макросе, без дополнительной активации страницы с этим массивом? Спасибо!
Создание массива в макросе
07.02.2013 22:02:17
|
|
|
|
07.02.2013 22:10:24
Пример файла надо.
Соответствие с чем? Совпадает или нет с одним из других чисел в списке?? Или ищет сколько совпадений? Ничего непонятно=)
Изменено: |
|||
|
|
07.02.2013 22:11:31
А в какой момент проверяет и куда вводят данные?
Если на листе и только в одном месте то можно и формулами обойтись:) |
|
|
|
07.02.2013 22:46:48
Одним словом, как создать массив Spisok=Аrray("000123", "000222", ...... ) из 3500 чисел этого списка не вручную?
|
|
|
|
07.02.2013 22:53:59
Или так - из текста:
или короче
Изменено: |
|||||
|
|
07.02.2013 22:59:43
Можно узнать, как создаётся этот "публичный словарь"? Не придётся ли для пользования им прибегать к каким-либо дополнительным установкам непросвящённым пользователям?
|
|
|
|
07.02.2013 23:02:38
Hugo, спасибо большое за ответ и желание помочь, но список не в текстовом файле, а в Excel.
|
|
|
|
07.02.2013 23:32:35
|
|||
|
|
07.02.2013 23:38:33
Алгоритм макроса такой: 1.Открыть нужный файл, с помощью Workbook.Open 2.Объявить диапазон ячеек с нужными данными - set MyRng = range("a1:a3500" ![]() 2.1. Загнать диапазон значений сразу в массив - MyArr = MyRng.value 2.1. Пройтись циклом по значениям диапазона и записать значения в словарь Scritping Dictionary 3.Ну, и дальнейшая Ваша обработка Ps. Если Вы хотите, чтобы Вам быстрее помогли - выложите маленький файл-пример с данными.
Изменено:
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
|
|||
|
|
08.02.2013 00:03:54
Спасибо всем!)
|
|
|
|
08.02.2013 05:01:56
А эта строка MsgBox oDict.Item([a2].Value) что будет выводить на экран?
И еще вопросик oDict.Item(a(i, 1)) = i Правильно ли я понимаю, что в этой строке мы i-тому элементу словаря присваиваем i-тое значение массива? Тогда запись какая-то странная
Изменено: |
|
|
|
08.02.2013 12:15:48
Изменено: |
|||
|
|
09.02.2013 03:12:54
Hugo Извиняюсь за назойливость, но можно поподробнее.
Вот вы пишите комментарий 'перебираем в цикле массив (первый столбец), 'помещаем в словарь анализируемые значения и к каждому 'его позицию в массиве (номер строки массива) Ну понятно, что часть комента обрезалась, но это не страшно, т.к. смысл донесен. Но непонятна реализациявот этого момента: "помещаем в словарь анализируемые значения". Вот это и есть процесс помещения значения массива в словарь: oDict.Item(a(i, 1))? Ну а тут похоже просто ошибка: If oDict.exists([a25].Value) Then MsgBox oDict.Item([a2].Value) Вместо [a25] должно быть [a2], правильно? Или мы берем значение из ячейки А25 проверяем его наличие в словаре и если оно там есть, то тогда печатаем значение А2? |
|
|
|
09.02.2013 03:40:05
Да, с 25 ошибся - в одном месте исправил, в другом забыл...
![]() Должно быть одинаковое значение - исправил пост выше, чтоб других тоже с толку не сбивал... Комменты вроде как не обрезались - это я так коряво выразился ![]() Вот это и есть процесс помещения значения массива в словарь: oDict.Item(a(i, 1))="любое значение" Это альтернативный способ, в хелпе и учебниках делают иначе, но так короче ![]() Словами можно описать так - в словаре у этого значения массива будет итем такой-то. Что подразумевает, что мы это значение с таким-то итемом туда заносим. Есть один момент - если значение повторится, то его итем перезапишется на новый. Это в зависимости от задачи нужно учитывать.
Изменено: |
|
|
|
09.02.2013 04:16:17
При задании нового значения этого свойства: oDict.Item(<Key>) = "NewValue" Если КЛЮЧ "Key" в словаре есть, то ассоциированное с ним ЗНАЧЕНИЕ заменяется на заданное "NewValue" Если КЛЮЧ "Key" в словаре отсутствует, то создается новая ЗАПИСЬ с КЛЮЧОМ "Key" и ЗНАЧЕНИЕМ "NewValue" Многое стало на места. Т.е. вы значения массива используете как ключ. А я почему-то думал, что значение массива это просто значение, но для него должен быть какой-то ключ. Короче это все от недостатка знаний :-( Бум будем дальше курить форум, Уокенбаха и иже с ними Большое спасибо, стало чуть понятней |
|||
|
|
09.02.2013 12:38:24
Ознакомьтесь с вложением, хорошо написано
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
|
|
|
|
09.02.2013 13:30:33
Ну да, ключём является само анализируемое/проверяемое/сравниваемое выражение.
Ну а ему в Item можно что-то "прикрепить" - номер строки, какой-то признак, массив значений или коллекцию, или даже другой словарь, и это "приклепление" можно оперативно менять, смотря какая стоит задача. |
|
|
|
10.02.2013 03:50:35
Спасибо. Именно из этого файла я и взял эти строчки: oDict.Item(<Key>) = "NewValue" Если КЛЮЧ "Key" в словаре есть, то ассоциированное с ним ЗНАЧЕНИЕ заменяется на заданное "NewValue" Если КЛЮЧ "Key" в словаре отсутствует, то создается новая ЗАПИСЬ с КЛЮЧОМ "Key" и ЗНАЧЕНИЕМ "NewValue" Просто не совсем понятна была реализация в макросе Hugo. Поэтому и столько вопросов. Но с вашей помощью все стало понятно. |
||||
|
|
|||
Читают тему