Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2010, 13:25   #1
ELE-COM
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 48
По умолчанию Поиск строки с тремя искомыми ячейками

Существует проблема:
В прайсе нужно организовать поиск (при выполнении макроса) по трем сразу значениям ячеек одной строки, т. к. некоторые значения повторяются в разных строках (марка, номинал, поставщик). Ничего, кроме как добавить столбец идентификатор со сцепленными значениями всех искомых значений строки (заполняется автоматически при вводе данных в новую строку), не придумал.
В принципе все работает, но при кол-ве позиций в 10-15 тыс, много лишних ячеек. Может существует еще какой-то способ?
Заранее благодарен.
Вложения
Тип файла: rar Пример.rar (2.5 Кб, 10 просмотров)
ELE-COM вне форума Ответить с цитированием
Старый 10.05.2010, 13:41   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
нужно организовать поиск (при выполнении макроса)
Где код вашего макроса?
Как должен быть организован поиск?
(откуда и в каком виде берутся исходные данные, куда и как выводить результат поиска)

Цитата:
Может существует еще какой-то способ?
Способов множество, но... непонятно, что всё-таки вам надо.

Я бы сделал так:
1) Считываем в массив значения диапазона [a2:e10000]
2) Специальной функцией получаем список строк, удовлетворяющих нужным критериям.

Выглядеть это будет примерно так:

Код:
Sub ПоискТоваров()
    On Error Resume Next
    arrS = Range([a2], Range("e" & Rows.Count).End(xlUp)).Value
    номинал = "10 Ом"
    ' ищем 10-омные МЛТ поставщика А
    СписокНомеровПодходящихСтрок = ArrAutofilter(arrS, "1=МЛТ*", "2=" & номинал, "5=А")

    For Each r In Split(СписокНомеровПодходящихСтрок, ",")
        MsgBox "Найдена подходящая строка: " & r + 1, vbInformation, _
               "Ищем 10-омные МЛТ поставщика А"
    Next r
End Sub
Пример в файле:

EducatedFool вне форума Ответить с цитированием
Старый 10.05.2010, 14:57   #3
EugeneS
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 472
По умолчанию

можно, например, так, см. вложение (Лист2)
Вложения
Тип файла: zip Пример1.zip (15.5 Кб, 17 просмотров)
EugeneS вне форума Ответить с цитированием
Старый 10.05.2010, 17:34   #4
ELE-COM
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 48
По умолчанию

Принцип работы такой:
Выбираю номинал и марку компонента (ячейки А и В)
Вычитаю из соотв. ячейки "С" кол-во для продажи
Переношу в товарный чек, далее на лист продаж. Все это ес-но через простенькие макросы...
Но если на каком-то этапе покупатель передумал, мне нужно вернуть компонент на склад, тут и возникает необходимость искать по всем трем параметрам (марка, номинал, поставщик) сразу.
Из за "структуры" - применение фильтра приводит к зависанию файла. Полная версия файла около 10 мб. Урезанную коппию прилагаю.
Вложения
Тип файла: rar Склад.rar (45.5 Кб, 9 просмотров)
ELE-COM вне форума Ответить с цитированием
Старый 10.05.2010, 18:20   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот что у меня получилось:

Код:
Sub Склад()
    If ActiveCell.Column <> 2 Then MsgBox _
       "Не правильный выбор!!! Нужно выбрать марку компонента (второй столбец)": Exit Sub
    Application.ScreenUpdating = False
    Set MySheet = ActiveSheet    'Ззапоминание активного листа
    ' (проще использовать кодовые имена листов - для возврата на нужный лист)
    ' а в данном варианте вообще нет никакой необходимости активировать лист СКЛАД...

    MyChar = Application.InputBox( _
             prompt:="ВВЕДИТЕ КОЛИЧЕСТВО ВОЗВРАТА НА СКЛАД " & ActiveCell.Value2, _
             Default:=1, Title:="ВЫБОР КОЛЛИЧЕСТВА", Left:=280, Top:=1, Type:=1)    'Ввод кол-ва

    If MyChar = False Then Exit Sub   'При отмене ввода

    If ActiveCell.EntireRow.Cells(3) < Val(MyChar) Then _
       MsgBox "Не получится перенести на склад так много товара", vbCritical: Exit Sub

    On Error Resume Next
    arrS = skl.Range(skl.[a2], skl.Range("e" & skl.Rows.Count).End(xlUp)).Value
    Наименование = ActiveCell.EntireRow.Cells(1)    ' берем из 1-й ячейки выделенной строки
    Марка = ActiveCell.EntireRow.Cells(2)    ' берем из 2-й ячейки выделенной строки

    СписокНомеровПодходящихСтрок = ArrAutofilter(arrS, "1=" & Наименование, "2=" & Марка)

    МассивНомеровНайденныхСтрок = Split(СписокНомеровПодходящихСтрок, ",")
    Select Case UBound(МассивНомеровНайденныхСтрок)

        Case -1: MsgBox "Подходящие позиции на складе отсутствуют!", vbCritical, "Ошибка": Exit Sub

        Case Is > 0: MsgBox "Найдено НЕСКОЛЬКО подходящих позиций!", vbExclamation, "Ошибка": Exit Sub

        Case 0:    ' найдена одна позиция - переносим обратно на склад
            Dim Строка As Range: Set Строка = skl.Rows(СписокНомеровПодходящихСтрок + 1)
            'MsgBox Строка.Address(, , , True)
            Строка.Cells(3) = Val(Строка.Cells(3)) + Val(MyChar)    ' увеличиваем количество на складе
            ' уменьшаем количество в продажах
            ActiveCell.EntireRow.Cells(3) = Val(ActiveCell.EntireRow.Cells(3)) - Val(MyChar)
    End Select
End Sub
Проверяйте:



Цитата:
Из за "структуры" - применение фильтра приводит к зависанию файла
При таких объёмах данных автофильтр, даже если и будет работать, то будет сильно тормозить - потому я и не предлагал вариант решения с его использованием.


Цитата:
искать по всем трем параметрам (марка, номинал, поставщик)
Не совсем понял, где искать поставщика (на листе продаж)
Впрочем, вы легко сможете доработать макрос самостоятельно.
Выглядеть это будет примерно так:

Код:
    Марка = ActiveCell.EntireRow.Cells(2)    ' берем из 2-й ячейки выделенной строки
    Поставщик = ActiveCell.EntireRow.Cells(99)    ' берем из 99-й ячейки выделенной строки
    
    СписокНомеровПодходящихСтрок = ArrAutofilter(arrS, "1=" & Наименование, "2=" & Марка, "6=" & Поставщик)
PS: Для упрощения кода присвоил листу СКЛАД кодовое имя skl

Последний раз редактировалось EducatedFool; 10.05.2010 в 18:28.
EducatedFool вне форума Ответить с цитированием
Старый 10.05.2010, 22:36   #6
ELE-COM
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 48
По умолчанию

EducatedFool,
Огромное спасибо!
Синтаксиса не знаю толком. Такие варианты выбора ячейки в активной строке как "ActiveCell.EntireRow.Cells(2)" я почему-то не использовал.
В книге еще много связей, листов: статистики, диаграмм, листов заказов... Предложенные примеры я тщательно изучу, частично урежу (например "Подходящие позиции на складе отсутствуют!" - не нужно, т.к. по определению такая строка есть)
Еще раз огромное спасибо за помощь!
P.S. Не подскажете, где скачать книжку по теме, чтобы в ней был описан синтаксис использования функций, команд, свойств? Например: почему "Val" а не "Value"?
ELE-COM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с ячейками и со строками ytzm2hsD3X0HVxwl Microsoft Office Excel 1 01.01.2010 08:41
Поиск ячеек в книге, совпадающих с ячейками в столбце А, листа1 данной книги TiG Microsoft Office Excel 1 10.12.2009 19:32
Работа с тремя файлами одновременно ShamanK Microsoft Office Excel 4 10.12.2009 14:27
Messagedlg с тремя кнопками Detka Общие вопросы Delphi 8 10.07.2008 23:16
Выручте пожалуйста с тремя задачками ByteMan Помощь студентам 8 07.06.2007 23:39