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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2010, 16:35   #1
Julliet
Новичок
Джуниор
 
Регистрация: 31.05.2010
Сообщений: 2
По умолчанию Простановка наличия средствами VBA

Всем привет!

Помогите, пожалуйста, разобраться со следующей задачей.

Итак, есть прайс-лист примерно такого вида:


Нас интересует колонка "Наличие на складе". "+" или "-" проставляются в зависимости от того, сколько этого товара на складе лежит - если <5, то не считается, что этот товар есть.

Информация о наличии, как несложно догадаться, предоставляется складом. Вот в таком виде:


Наименование товаров несколько отличается, причем они идут не в таком порядке, как в прайс-листе.

Задача состоит в том, чтобы написать макрос по такому алгоритму:

Цикл по всем строкам прайса:

1. Выбрать наименование товара в прайсе
2. Найти аналогичную позицию в инфе со склада
3. В инфе просмотреть остаток по этой позиции
4. Если остаток >=5, то в прайсе у аналогичной позиции в столбце "Наличие" проставляется "-", иначе знак "+".

Алгоритм простой, но в реальности все усложняется тем, что наименования позиций в прайсе и в инфе не идентичны и идут не в таком же порядке.

Раньше мне не приходилось работать с VBA, заставила суровая необходимость, ибо вручную это делать просто очень нерационально и долго. Пожалуйста, подскажите пути реализации.
Вложения
Тип файла: rar primer.rar (8.8 Кб, 10 просмотров)

Последний раз редактировалось Julliet; 03.06.2010 в 16:39.
Julliet вне форума Ответить с цитированием
Старый 03.06.2010, 16:53   #2
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

При такой организации пожалуй не получиться...
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 03.06.2010, 17:10   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну почему же, макросом можно найти, я делал, из этого списка только "D40 + 2 аккум." смущает, если во втором списке не будет "2", "+" и "аккум.", то незнаю как... Хотя "D5000 кит" тоже портит картину, если я правильно понял.
А делал так - разбиваю в массив строку по пробелам, ищу первый элемент массива во второй таблице, если нашли - ищем второй в этой же ячейке и т.д. Всё совпало - копируем, нет - ищем дальше.
Но по этому примеру можно тупо искать только первое слово.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 03.06.2010 в 17:13.
Hugo121 вне форума Ответить с цитированием
Старый 03.06.2010, 17:17   #4
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

Так я о чем. системы нет..
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 04.06.2010, 07:29   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите вложение. Откройте оба файла и запустите макрос "Main". Реализован поиск для совпадений не одинаково заполненных ячеек только для тех случаев, которые Вы представили в примере. Если есть другие варианты - прикрепите файл с примерами всех возможных. Лучше, если в этом примере совпадающие (на Ваш взгляд) ячейки будут по парно окрашены.
Вложения
Тип файла: rar primer.rar (13.2 Кб, 11 просмотров)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 04.06.2010 в 08:00.
SAS888 вне форума Ответить с цитированием
Старый 04.06.2010, 11:15   #6
Julliet
Новичок
Джуниор
 
Регистрация: 31.05.2010
Сообщений: 2
По умолчанию

Уважаемый SAS888!

Очень-очень Вам благодарна, все просто замечательно работает! Вы - мой спаситель))) Задача решена просто блестяще!

Что касается
Цитата:
Если есть другие варианты - прикрепите файл с примерами всех возможных
то честно Вам скажу - оно того не стоит, ибо таких прайсов у меня 20+ шт., и в каждом позиций 20-150: сюда в качестве примера я выкладывала "рыбу"(и в принципе, все варианты наименований приведены).

Ваш чудесный макрос я добавлю в нужные прайсы самостоятельно, главное - что о работе вручную можно забыть, как о страшном сне)

Upd.

Погорячилась с самостоятельным добавлением)
Поразбиралась в коде... Так как в VBA новичок, наверняка неправа где-то, укажите пожалуйста на ошибки..

Итак, код:
Код:
Dim i As Long, x As Range: Application.ScreenUpdating = False: ThisWorkbook.Sheets(1).Activate
здесь мы задаем типы переменных , i для цикла будет использоваться, x - задается как диапазон (весь рабочий лист прайса (?))
Код:
 Range([C7], Cells(Rows.Count, 2).End(xlUp).Offset(, 1)).ClearContents
- здесь мы очищаем столбец "наличие" (и все? или еще что-то задаем? вот тут непонятно). в реальном прайс-листе переписала так
Код:
 Range("G33:G95").Select
    Selection.ClearContents
(можно так делать? или это уже принципиально поганит все? если да, то что конкретно)
дальше
Код:
With Workbooks("infa.xls").Sheets(1)
        For i = 7 To Cells(Rows.Count, 2).End(xlUp).Row
тут, как я поняла, запускаем цикл в книге с инфой, i начинаем с "7" (а "7" - это номер строки, с кот. надо начинать поиск, да? ) до последней снизу заполненной ячейки (так? причем эта последняя снизу заполненная ячейка по логике тоже относится к листу из книги с инфой, а не к листу книги с прайсом?)

Код:
If Cells(i, 2) <> "" Then
условие , если ячейка не пуста, то... продолжаем (да?)
Код:
  Set x = .[B:B].Find(Split(Application.Trim(Application.Substitute(Cells(i, 2), "-", "")), " ")(0))
проводим поиск по строке (по подстроке?) ... тут непонятно

дальше подстановка +/- и конец.

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

Где я ошиблась?

Последний раз редактировалось Julliet; 04.06.2010 в 17:34.
Julliet вне форума Ответить с цитированием
Старый 07.06.2010, 08:06   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите предложенный ранее макрос с подробными комментариями. Возможно, что это даст ответы на Ваши вопросы.
Код:
Sub Main()
'Определяем тип переменных, запрещаем обновление экрана и активируем 1-й лист книги с этим макросом.
'Это позволяет запускать данный макрос при любом активном листе в любой книге.
    Dim i As Long, x As Range: Application.ScreenUpdating = False: ThisWorkbook.Sheets(1).Activate
    
'Очищаем диапазон ячеек (оставляя формат, шрифт, заливку и т.п.) от ячейки "C7" до последней
'заполненной ячейки столбца "B" со смещением по столбцу на 1. Так сделано потому,
'что определяющим количество строк является столбец "B", в то время, как столбец "C" может быть
'заполнен произвольно, либо вовсе не заполнен.
    Range([C7], Cells(Rows.Count, 2).End(xlUp).Offset(, 1)).ClearContents
    
'Применяем мктод With. Теперь, где перед обращением к ячейке (диапазону) стоит точка,
'Excel будет понимать, как обращение к листу Workbooks("infa.xls").Sheets(1)
    With Workbooks("infa.xls").Sheets(1)
    
'Организуем цикл перебора ячеек с 7-й до последней заполненной строки столбца "B"
        For i = 7 To Cells(Rows.Count, 2).End(xlUp).Row
        
'Если ячейка не пуста, то...
            If Cells(i, 2) <> "" Then
            
'Ищем в столбце "B" на листе Workbooks("infa.xls").Sheets(1) (т.к. перед обращением стоит точка)
'значение текущей в цикле ячейки столбца "B" активного листа, в котором убираем знак "-",
'убираем "лишние" пробелы (в начале, в конце и повторные). При чем берем только первое до пробела значение.
'Поиск организован по вхождению части слова (LookAt:= xlPart) по умолчанию.
                Set x = .[B:B].Find(Split(Application.Trim(Application.Substitute(Cells(i, 2), "-", "")), " ")(0))
                
'Если находим такое значение, то сравниваем числовое значение ячейки столбца "C" найденной строки с 5.
'Если меньше, то в столбец "C" активного листа помещаем "+". Если иначе, то "-".
                If Not x Is Nothing Then If Val(.Cells(x.Row, 3)) < 5 Then Cells(i, 3) = "+" Else Cells(i, 3) = "-"
            End If
        Next
    End With
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление экспоненты средствами VBA fs444 Microsoft Office Excel 10 30.12.2009 10:42
Неразрывный пробел средствами VBA tolikman Microsoft Office Word 5 23.03.2009 05:11
Сжатие рисунков средствами VBA EducatedFool Microsoft Office Excel 1 17.01.2009 19:12
Условное форматирование средствами VBA Acro Microsoft Office Excel 5 01.12.2008 16:40
Макрос VBA EXCEl - простановка в ячейку номера страницы Обыватель Microsoft Office Excel 1 14.02.2008 12:49