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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2013, 17:36   #1
KJ_ya
Пользователь
 
Регистрация: 18.08.2012
Сообщений: 10
По умолчанию Цикл с условиями и выход из цикла

Добрый вечер!
Требуется ваша помощь и совет. Я недавно начала осваивать макросы, поэтому не всегда представляю, в каком направлении двигаться, очень надеюсь на вашу помощь!
На первом этапе такие задачи:
1. Сотрудник может выбрать услугу из списка - ок
2. Сотрудник может не выбирать из списка, а ввести код услуги, если знает - ок
3. Если до ячейки "Дополнительные услуги" осталось меньше 1 пустой строчки, то вставить пустую - не сделала

Проблема в том, чтобы макрос давал возможность выбрать из списка, я подумала, может поможет условие на изменение ячеек (Если произошло изменение в диапазоне, то делать циклы и т.п.) или может есть еще какое нибудь решение?
И не могу настроить кнопку выхода из макроса (которая в будущем будет запускать макрос по копированию данных в таблицу)

*Информации нашла и прочитала очень много, мозг закипел и произошел ступор, не получается, хотя и понимаю, что, наверно, это далеко не самая сложная задача.

Код:
Sub Func()

Dim LastRow As Integer
   Dim i As Integer
   Dim r As Integer
   
     
With Sheets("1")
  LastRow = .Cells(20, 2).End(xlDown).Row - 2
  End With
 
  For i = 20 To LastRow
  Sheets("1").Activate
  
  
Sheets("1").Cells(i, 2).Select
  With Selection.Validation
 .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Введите"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
  
End With
Next

r = 20
For i = 20 To LastRow
    rNew = 5

 Do While Cells(r, 1) <> ""
  If Sheets("1").Cells(r, 1) = Sheets("cat").Cells(rNew, 1) Then
            Sheets("1").Cells(r, 2) = Sheets("cat").Cells(rNew, 2)
       
        If Sheets("1").Cells(r, 2) = Sheets("cat").Cells(rNew, 2) Then
            Sheets("1").Cells(r, 6) = Sheets("cat").Cells(rNew, 3)

        
            If Sheets("1").Cells(r, 1) <> Sheets("cat").Cells(rNew, 1) Then MsgBox ("Код введен неверно!")
            Sheets("1").Cells(r, 1).Clear
             
          End If
      GoTo 1
 End If
        rNew = rNew + 1
 Loop

1:
    r = r + 1

    Next

End Sub
Вложения
Тип файла: zip Test_Y.zip (23.0 Кб, 20 просмотров)
KJ_ya вне форума Ответить с цитированием
Старый 20.01.2013, 01:18   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я думаю можно сделать так:
1. Этот код забыть.
2. Заготовить заранее в ячейках с ценами ВПР по виду операции (если не нашли, то ставим пробел). Например 10 строк, или 20, или 30 - сколько может понадобиться.
3. Проверку ввода "смягчить" - разрешить вводить что угодно.
4. Скрыть лишние строки, оставить для начала одну и одну пустую над "Дополнительные услуги".
4. По событию изменения этих ячеек с операцией выполняем код - он сперва смотрит, не введён ли код из списка - если да, то меняет на описание операции. Можно делать тупо перебором - значений не много, тормозить не будет.
Далее смотрит, нет ли ниже скрытой строки - если есть, то её открывает.
Если данные стёрли - строку скрывает (хотя это можно делать вручную).
Ну и в общем всё. Цену вытянет ВПР().
В таком случае можно писать и любые другие пары, и не имеющиеся в списке - название ввести даст, ценой можно затереть ВПР() - потом её можно восстановить из любой другой копированием.
Привести бланк в исходный вид можно или вручную, или другим макросом по кнопке.

Вроде не сложно получается, как думаете? Сделаете? Мне лениво...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 20.01.2013, 13:44   #3
KJ_ya
Пользователь
 
Регистрация: 18.08.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я думаю можно сделать так:
1. Этот код забыть.
2. Заготовить заранее в ячейках с ценами ВПР по виду операции (если не нашли, то ставим пробел). Например 10 строк, или 20, или 30 - сколько может понадобиться.
3. Проверку ввода "смягчить" - разрешить вводить что угодно.
4. Скрыть лишние строки, оставить для начала одну и одну пустую над "Дополнительные услуги".
4. По событию изменения этих ячеек с операцией выполняем код - он сперва смотрит, не введён ли код из списка - если да, то меняет на описание операции. Можно делать тупо перебором - значений не много, тормозить не будет.
Далее смотрит, нет ли ниже скрытой строки - если есть, то её открывает.
Если данные стёрли - строку скрывает (хотя это можно делать вручную).
Ну и в общем всё. Цену вытянет ВПР().
В таком случае можно писать и любые другие пары, и не имеющиеся в списке - название ввести даст, ценой можно затереть ВПР() - потом её можно восстановить из любой другой копированием.
Привести бланк в исходный вид можно или вручную, или другим макросом по кнопке.

Вроде не сложно получается, как думаете? Сделаете? Мне лениво...
Спасибо за ответ!
Думаю, да, смогу это написать сама.
Получится, что цикл будет работать, только при внесении изменений в диапазон? И еще оставить Проверку данных, чтобы человек, если не знает кода, мог выбрать из списка. Или я недопоняла Вас?
KJ_ya вне форума Ответить с цитированием
Старый 20.01.2013, 13:54   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну да. Человек может выбрать из списка название, но может и забить туда код (макрос его меняет на название) - тогда цена подтянется сама формулой ВПР()
Или может записать вообще что-то другое и поставить свою цену - такое ведь тоже может понадобиться? Если это не нужно - можно такие данные макросом отсекать, или проверку сделать жёсткой и дать выбор и из названий, и из номеров (изменить список на втором листе).
Если введён/выбран номер - его макросом меняем на название.

Ну и цикл там нужен только для поиска названия по номеру по второму листу - строки с формулами заготавливаете заранее с запасом - у Вас ведь не будет неограниченное количество записей?
Так же и сумму внизу можно сразу установить с первой строки по последнюю. Ну и ненужные строки изначально скрыть - открывать их макросом по событию изменения ячейки в строке над скрытой.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 20.01.2013, 13:59   #5
KJ_ya
Пользователь
 
Регистрация: 18.08.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Ну да. Человек может выбрать из списка название, но может и забить туда код (макрос его меняет на название) - тогда цена подтянется сама формулой ВПР()
Или может записать вообще что-то другое и поставить свою цену - такое ведь тоже может понадобиться? Если это не нужно - можно такие данные макросом отсекать, или проверку сделать жёсткой и дать выбор и из названий, и из номеров (изменить список на втором листе).
Если введён/выбран номер - его макросом меняем на название.

Ну и цикл там нужен только для поиска названия по номеру по второму листу - строки с формулами заготавливаете заранее с запасом - у Вас ведь не будет неограниченное количество записей?
Так же и сумму внизу можно сразу установить с первой строки по последнюю. Ну и ненужные строки изначально скрыть - открывать их макросом по событию изменения ячейки в строке над скрытой.
Ок. Поняла! Спасибо. Так проще, конечно)
KJ_ya вне форума Ответить с цитированием
Старый 20.01.2013, 14:43   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я думаю так будет проще, оптимальнее.
Можно конечно добавлять строки, но тогда нужно и макросом прописывать проверку ввода, и тянуть цену или ставить ВПР().
А главное - при любом изменении снова будут добавляться строки - например выбрали не то, меняем - снова добавилась строка.
Или это нужно кодом отслеживать... В общем, всплывают всякие побочные проблемы.
Но я не настаиваю, может быть кто-то сделает/придумает и другой вариант.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из цикла (Delphi) qadhhj Помощь студентам 2 20.03.2012 16:20
Выход из цикла vandrouny Общие вопросы Delphi 5 27.05.2010 20:23
Выход из цикла Сергей089 Помощь студентам 6 17.03.2010 16:44
выход из цикла varelik Общие вопросы Delphi 13 24.12.2009 20:42
Выход из цикла RIO Помощь студентам 1 21.04.2008 22:55