Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Массив, как перечень исключений для конструкции If..Then - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Массив, как перечень исключений для конструкции If..Then (Макросы/Sub)
Массив, как перечень исключений для конструкции If..Then
Normanjazz Дата: Среда, 25.04.2018, 19:55 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Здравствуйте!
Помогите, пожалуйста, с решением следующей проблемы:
Дано: Книга "ArrayTest.xls" с 2-мя листами: "Список" и "Сводная". Лист "Список" содержит перемешанные названия месяцев, дней недели и числа (от 1 до 10).
Задача: Перенести в лист "Сводная" все данные, НЕ удовлетворяющие условиям, перечисленным в массиве.
В данном случае массив содержит дни недели. Т.о. в лист "Сводная" должно попасть всё, кроме дней недели.
Обратная задача (с переносом только дней недели) решается...а вышеупомянутая не дает ожидаемого результата.
Привожу свой код, подскажите, пожалуйста, в чем ошибка?

[vba]
Код
Sub GetMonthsFromList()
Dim Svod As Object
Dim IndexCell As Range
Dim i As Integer
Dim MyArray() As Variant
Dim Ai As Variant
Set Svod = ThisWorkbook.Sheets("Сводная")
MyArray = Array("Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")
ThisWorkbook.Sheets(1).Activate
i = 1
For Each IndexCell In Range("A1:A29")
    For Ai = 0 To 6
        If IndexCell.Value <> MyArray(Ai) Then
                Svod.Cells(i, 1).Value = IndexCell.Value
                i = i + 1
        End If
    Next Ai
Next IndexCell
Erase MyArray
End Sub
[/vba]
К сообщению приложен файл: ArrayTest.xls (34.5 Kb)


Сообщение отредактировал Normanjazz - Среда, 25.04.2018, 20:03
 
Ответить
СообщениеЗдравствуйте!
Помогите, пожалуйста, с решением следующей проблемы:
Дано: Книга "ArrayTest.xls" с 2-мя листами: "Список" и "Сводная". Лист "Список" содержит перемешанные названия месяцев, дней недели и числа (от 1 до 10).
Задача: Перенести в лист "Сводная" все данные, НЕ удовлетворяющие условиям, перечисленным в массиве.
В данном случае массив содержит дни недели. Т.о. в лист "Сводная" должно попасть всё, кроме дней недели.
Обратная задача (с переносом только дней недели) решается...а вышеупомянутая не дает ожидаемого результата.
Привожу свой код, подскажите, пожалуйста, в чем ошибка?

[vba]
Код
Sub GetMonthsFromList()
Dim Svod As Object
Dim IndexCell As Range
Dim i As Integer
Dim MyArray() As Variant
Dim Ai As Variant
Set Svod = ThisWorkbook.Sheets("Сводная")
MyArray = Array("Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")
ThisWorkbook.Sheets(1).Activate
i = 1
For Each IndexCell In Range("A1:A29")
    For Ai = 0 To 6
        If IndexCell.Value <> MyArray(Ai) Then
                Svod.Cells(i, 1).Value = IndexCell.Value
                i = i + 1
        End If
    Next Ai
Next IndexCell
Erase MyArray
End Sub
[/vba]

Автор - Normanjazz
Дата добавления - 25.04.2018 в 19:55
bmv98rus Дата: Среда, 25.04.2018, 20:08 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4098
Репутация: 766 ±
Замечаний: 0% ±

Excel 2013/2016
Normanjazz,
вариант 1. использовать словарь для исключений, и проверять не перебором а проверкой наличия в словаре.
Вариант 2. Использовать автофильтр и масиив исключений для фильтрации, результат просто переносится простым копированием.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеNormanjazz,
вариант 1. использовать словарь для исключений, и проверять не перебором а проверкой наличия в словаре.
Вариант 2. Использовать автофильтр и масиив исключений для фильтрации, результат просто переносится простым копированием.

Автор - bmv98rus
Дата добавления - 25.04.2018 в 20:08
Normanjazz Дата: Среда, 25.04.2018, 20:20 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Normanjazz,
вариант 1. использовать словарь для исключений, и проверять не перебором а проверкой наличия в словаре.
Вариант 2. Использовать автофильтр и масиив исключений для фильтрации, результат просто переносится простым копированием.


Огромное спасибо за ответ, буду штудировать интернет по вопросу словаря.
А по поводу Варианта 2 - не подходит. Данная задача умышлено примитивизирована для акцента на вопросе о массиве/ словаре. На деле, огромное кол-во книг и листов с информацией инженерно-технического характера, спецификаций и пр...
 
Ответить
Сообщение
Normanjazz,
вариант 1. использовать словарь для исключений, и проверять не перебором а проверкой наличия в словаре.
Вариант 2. Использовать автофильтр и масиив исключений для фильтрации, результат просто переносится простым копированием.


Огромное спасибо за ответ, буду штудировать интернет по вопросу словаря.
А по поводу Варианта 2 - не подходит. Данная задача умышлено примитивизирована для акцента на вопросе о массиве/ словаре. На деле, огромное кол-во книг и листов с информацией инженерно-технического характера, спецификаций и пр...

Автор - Normanjazz
Дата добавления - 25.04.2018 в 20:20
bmv98rus Дата: Среда, 25.04.2018, 21:10 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4098
Репутация: 766 ±
Замечаний: 0% ±

Excel 2013/2016
штудировать интернет по вопросу словаря.

не означает размещать дубли


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение
штудировать интернет по вопросу словаря.

не означает размещать дубли

Автор - bmv98rus
Дата добавления - 25.04.2018 в 21:10
Karataev Дата: Среда, 25.04.2018, 21:18 | Сообщение № 5
Группа: Проверенные
Ранг: Старожил
Сообщений: 1334
Репутация: 533 ±
Замечаний: 0% ±

Excel

PS. Не цитируйте посты целиком. Чтобы ответить, не нужно щелкать кнопку "Цитата", а достаточно прокрутить страницу вниз и там будет поле для написания поста. Если хотите к кому-то обратиться, то просто напишите ник.
 
Ответить
Сообщение

PS. Не цитируйте посты целиком. Чтобы ответить, не нужно щелкать кнопку "Цитата", а достаточно прокрутить страницу вниз и там будет поле для написания поста. Если хотите к кому-то обратиться, то просто напишите ник.

Автор - Karataev
Дата добавления - 25.04.2018 в 21:18
Normanjazz Дата: Среда, 25.04.2018, 21:24 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Karataev, Спасибо Вам огромное!
Прошу прощения за пост целиком. Первый раз в жизни пишу на форуме.
 
Ответить
СообщениеKarataev, Спасибо Вам огромное!
Прошу прощения за пост целиком. Первый раз в жизни пишу на форуме.

Автор - Normanjazz
Дата добавления - 25.04.2018 в 21:24
Normanjazz Дата: Среда, 25.04.2018, 22:13 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Вновь надеюсь на Вас и уповаю в силу своей некомпетентности в вопросах программирования, не могу справиться со следующей задачей:
[vba]
Код
If IndexCell.Value = MyArray(Ai) Then
[/vba]
обуславливает точное совпадение значения ячейки с элементом массива,
в случае с указанием в массиве лишь части слов:
[vba]
Код
MyArray = Array("Понедел", "орник", "ред", "Четв", "Пятниц", "ббота", "кресен")
[/vba]
Замена кода на:
[vba]
Код
If InStr(1, IndexCell.Value, MyArray(Ai)) Then
[/vba]
также не дает желаемого результата.
Подскажите, пожалуйста, что не так.
Заранее спасибо.


Сообщение отредактировал Normanjazz - Среда, 25.04.2018, 22:15
 
Ответить
СообщениеВновь надеюсь на Вас и уповаю в силу своей некомпетентности в вопросах программирования, не могу справиться со следующей задачей:
[vba]
Код
If IndexCell.Value = MyArray(Ai) Then
[/vba]
обуславливает точное совпадение значения ячейки с элементом массива,
в случае с указанием в массиве лишь части слов:
[vba]
Код
MyArray = Array("Понедел", "орник", "ред", "Четв", "Пятниц", "ббота", "кресен")
[/vba]
Замена кода на:
[vba]
Код
If InStr(1, IndexCell.Value, MyArray(Ai)) Then
[/vba]
также не дает желаемого результата.
Подскажите, пожалуйста, что не так.
Заранее спасибо.

Автор - Normanjazz
Дата добавления - 25.04.2018 в 22:13
InExSu Дата: Среда, 25.04.2018, 23:13 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Привет!
Попробуйте

[vba]
Код
If InStr(1, IndexCell.Value, MyArray(Ai)) Then
[/vba]

Заменить на:
[vba]
Код
If InStr(1, IndexCell.Value, MyArray(Ai)) > 0 Then
[/vba]


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
СообщениеПривет!
Попробуйте

[vba]
Код
If InStr(1, IndexCell.Value, MyArray(Ai)) Then
[/vba]

Заменить на:
[vba]
Код
If InStr(1, IndexCell.Value, MyArray(Ai)) > 0 Then
[/vba]

Автор - InExSu
Дата добавления - 25.04.2018 в 23:13
Апострофф Дата: Среда, 25.04.2018, 23:41 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 444
Репутация: 122 ±
Замечаний: 0% ±

Excel 1997
InExSu, для данного случая это абсолютно идентичные записи.
Проблема где-то в другом месте.
 
Ответить
СообщениеInExSu, для данного случая это абсолютно идентичные записи.
Проблема где-то в другом месте.

Автор - Апострофф
Дата добавления - 25.04.2018 в 23:41
InExSu Дата: Среда, 25.04.2018, 23:50 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Цитата Апострофф, 25.04.2018 в 23:41, в сообщении № 9 ()
в другом

а другого не предоставили, файла не было


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
Цитата Апострофф, 25.04.2018 в 23:41, в сообщении № 9 ()
в другом

а другого не предоставили, файла не было

Автор - InExSu
Дата добавления - 25.04.2018 в 23:50
bmv98rus Дата: Среда, 25.04.2018, 23:53 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4098
Репутация: 766 ±
Замечаний: 0% ±

Excel 2013/2016
ну можно медленный Like попробовать.
[vba]
Код
IF IndexCell.Value like  "*" & MyArray(Ai) & "*"  then
[/vba]


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщениену можно медленный Like попробовать.
[vba]
Код
IF IndexCell.Value like  "*" & MyArray(Ai) & "*"  then
[/vba]

Автор - bmv98rus
Дата добавления - 25.04.2018 в 23:53
Pelena Дата: Четверг, 26.04.2018, 09:16 | Сообщение № 12
Группа: Админы
Ранг: Местный житель
Сообщений: 19160
Репутация: 4412 ±
Замечаний: ±

Excel 365 & Mac Excel
Приложите файл, где исправленный макрос
не дает желаемого результата


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеПриложите файл, где исправленный макрос
не дает желаемого результата

Автор - Pelena
Дата добавления - 26.04.2018 в 09:16
StoTisteg Дата: Четверг, 26.04.2018, 10:29 | Сообщение № 13
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Karataev, прошу прощения, но переменная boolFound у Вас лишняя. Проще так:
[vba]
Код

    For Ai = 0 To 6
        If IndexCell.Value = MyArray(Ai) Then Exit For
    Next Ai
    If Ai = 7 Then
[/vba]


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеKarataev, прошу прощения, но переменная boolFound у Вас лишняя. Проще так:
[vba]
Код

    For Ai = 0 To 6
        If IndexCell.Value = MyArray(Ai) Then Exit For
    Next Ai
    If Ai = 7 Then
[/vba]

Автор - StoTisteg
Дата добавления - 26.04.2018 в 10:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Массив, как перечень исключений для конструкции If..Then (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!