Как выполнить макрос VBA по заранее заданным действиям?

Автор uatotal, 27.04.2012, 10:39

« назад - далее »

uatotal

Подскажите пожалуйста как правильно написать макрос чтобы при определенных условиях выполнялось то или иное действие/набор действий, которые были заданы заранее (в начале макроса)
что то вроде этого

Sub Макрос()

Действие1
         например
            Sheets("SOA").Select
            Cells(stroka, 2).Select
            ActiveCell.Formula = billing1
            Cells(stroka, 3).Select
            ActiveCell.Formula = billing2
            Cells(stroka, 4).Select
            ActiveCell.Formula = Sum
Действие2
Действие3

If А = В Then
Действие1

Else
Действие2
Действие3
End If
End Sub

Т.е. чтобы в функции If Then можно было написать одно слово (Действие2 ) а не писать полностью что нужно делать.
Спасибо заранее. Очень нужно.  :)

Poltava

#1
Ну во первых попробуйте посмотреть здесь
Во вторых смотрите ниже.
Ну а в третьих практический совет вам почаще пользуйтесь первый вариантом

Sub Действие1()
        например
           Sheets("SOA").Select
           Cells(stroka, 2).Select
           ActiveCell.Formula = billing1
           Cells(stroka, 3).Select
           ActiveCell.Formula = billing2
           Cells(stroka, 4).Select
           ActiveCell.Formula = Sum
EndSub
Sub Действие2()
Действие2
EndSub
Sub Действие3()
Действие3
EndSub
Sub Макрос()
If А = В Then
Действие1
Elseif А > В
Действие2
else
Действие3
End If
End Sub

Ну либо так
Sub Варианты_Действий(номерварианта)
Select Case номерварианта
   Case 1
           например
           Sheets("SOA").Select
           Cells(stroka, 2).Select
           ActiveCell.Formula = billing1
           Cells(stroka, 3).Select
           ActiveCell.Formula = billing2
           Cells(stroka, 4).Select
           ActiveCell.Formula = Sum
   Case 2
       Действие2
   Case Else
       Действие3
End Select
EndSub
Sub Макрос()
If А = В Then
Варианты_Действий(1)
Elseif А > В
Варианты_Действий(2)
else
Варианты_Действий(3)
End If
End Sub
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

uatotal


uatotal

Пардон, теперь столкнулся с тем, что при выполнении действий отдельно - во 2-м не используются данные полученные в 1-м действии.
Сделал функцией - то же самое. Ругается.
вот точный пример

Function Действие0()
' Найдем ячейку в таблице SOA с номером инвойса
    Sheets("SOA").Select
With Range("A1:A100000")
    .Find(What:=Number, After:=.Cells(.Rows.Count, 1)).Activate
End With
'получим номер строки
    stroka = ActiveCell.Row
End Function
Function Действие1()
' Запомним значения нужных данных
    Sheets("Invoice").Select
    Range("billing1").Select
    billing1 = ActiveCell.Value
    Range("billing2").Select
    billing2 = ActiveCell.Value
    Range("sum").Select
    Sum = ActiveCell.Value
    Range("number").Select
    Number = ActiveCell.Value
End Function
Function Действие2()
            ' Вставим значения в таблицу SOA
            Sheets("SOA").Select
            Cells(stroka, 2).Select
            ActiveCell.Formula = billing1
            Cells(stroka, 3).Select
            ActiveCell.Formula = billing2
            Cells(stroka, 4).Select
            ActiveCell.Formula = Sum
End Function

Действие2 не знает что такое stroka, хотя выполняются друг за другом 0,1,2
Подскажите что тут не так? :o

Poltava

А как вы пишете если не умеете даже ЧИТАТЬ
А я смотрю вы намеков не понимаете  ;)
Вы мой первый пост видать не прочитали полностью!
Обращаю ваше внимание на первые три строки перечитайте их еще раз и подумайте!
Больше на ваши вопросы отвечать не буду если вы не потрудитесь загуглить!!!
Я дольше писал чем искал ссылки!!!
Variable not defined или что такое Option Explicit и зачем оно нужно
Переменные, типы данных и константы
Функции-процедуры VBA
Офисное программирование - Процедуры и функции VBA
Потрудитесь почитать статьи по этим ссылкам вопросы у вас сами отпадут!!!
ну а так скажу
Либо объявляйте переменные общими для модуля либо передавайте в процедуру как аргумент!!!
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

GWolf

Цитата: uatotal от 27.04.2012, 16:12
...
Действие2 не знает что такое stroka, хотя выполняются друг за другом 0,1,2
Подскажите что тут не так? :o

Добрый вечер!
Во-первых, прошу извинить форумчанина Poltava. Его возмущение понятно, но ...
Во-вторых, по существу заданного Вами вопроса:

возможно, что Ваша версия настроек среды VBA не требует ЯВНОГО ОБЪЯВЛЕНИЯ переменных до их использования. Я кстати тоже пользуюсь этой возможностью, ведь не всегда сходу можешь определить тип переменной. Например, во всех "книжных" примерах переменная отслеживающая номер строки, объявляется так: Dim nRw As Integer, а в реальных программах следует обьявлять так: Dim nRw As Long. Это вызвано тем, что диапазон строк 65 000 превышает границу Integer, но входит в диапазон Long.
Пример, наверное, несколько надуман - это связано с предположением что следует ПОДУМАТЬ, но на самом деле иногда прежде чем думать нужно ЗНАТЬ.

Ув. Poltava прав:
ЦитироватьЛибо объявляйте переменные общими для модуля либо передавайте в процедуру как аргумент!!!
А вот как это сделать?

1) переменные общими для модуля

В модуле листа, до макроса Function Действие0()
пишем:
Public billing1 As Double, billing2 As Double
и тогда значения записанные в эти переменные, будут доступны для ЛЮБОГО программного модуля, данного проекта. Впрочем, про видимость и невидимость, сможете прочесть подробнее по ссылкам предложенным Poltava.

2) передавайте в процедуру как аргумент

Поскольку функции Действие1 и Действие2 вызываются не Действие2 из Действие1 а, в зависимости от некоего условия управлляющей программы, то передача в процедуру функцию, нв мой взгляд не имеет смысла. Т.о. остается первый вариант. Хотя, судя по приведенному коду Действие1 и Действие2, должен быть ВЫЗОВ Действие1 Действие2. Вообщем, ув. uatotal, внимательно посмотрите что Вы хотите и в соответствии с этим предложите описание, что бы получить КОРРЕКТНЫЙ ответ.

Успеха! и ... обращайтесь  ;).
Путей к вершине - множество. Этот один из многих!

uatotal

 :) Всем ОГРОМНОЕ спасибо !!!
Пишу на уровне интуиции... я не программист а экономист по образованию, по-этому такие глупые вопросы задаю.
Это пытаюсь упростить себе рутинные одинаковые действия с Ексель файлами.
Спасибо что не потрудились написать. Гуглить пытался - но не правильно спрашивал.
Больше не мучаю. Впринципе все понятно стало.

GWolf

Цитата: uatotal от 27.04.2012, 20:32
:) Всем ОГРОМНОЕ спасибо !!!
Пишу на уровне интуиции... я не программист а экономист по образованию, по-этому такие глупые вопросы задаю.
Это пытаюсь упростить себе рутинные одинаковые действия с Ексель файлами.
Спасибо что не потрудились написать. Гуглить пытался - но не правильно спрашивал.
Больше не мучаю. Впринципе все понятно стало.

;D ;D ;D я ведь тоже экономист! Привет коллега!
А что бы не писать "на уровне интуиции", полистайте Гарнаева. Я почти что с него начинал. Правда до того еще был SuprCalc. Посмотрите, я где то в своих постах приводил список книг Гарнаева, да и коллеги давали ссылки на источники.

Успехов Вам! И "мучайте" пожалуйста нас, "мучайте". Только, вот может быть с более четким описанием того, чего хотите получить, ну и примерчиками не обделяйте!!!  ;)
Путей к вершине - множество. Этот один из многих!

uatotal

GWolf - спасибо за понимание. Рад помощи от коллеги!  :)

Тогда еще вопрос задам
Есть таблица - с шапкой

Code   Destination   Price for min   Currency   Calls   Volume   Price

Шапка находится всегда в строке 3
И макрос для определения номера последней строки и номера столбца

Sub Номер_стр_столб()
    Sheets("CDR").Select
    lastRow = Range("a100000").End(xlUp).Row
    lastColumn = Cells.SpecialCells(xlCellTypeLastCell).Column
   
    Range("K5").Select
    ActiveCell.Formula = lastRow
    Range("L5").Select
    ActiveCell.Formula = lastColumn
 
'
End Sub

Для проверки полученных значений они подставляются в ячейки K5=32 и L5=7
При первом запуске макрося значения выводятся правильно,
но если их удалить из ячеек и запустить макрос еще раз - то
выводятся значения K5=32 и L5=12
т.е. не смотря на то что ячейку L5  обнулил - макрос ее воспринимает заполенной и выдает номер её столбца.
Файл с таблицей в приложении. Макрос привязан к кнопке для упрощения его запуска.   
Кстати с определением последней строки такого глюка нет.
Подскажите как определить последний столбец? (по заполенной шапке таблицы в строке 3)

GWolf

Доброй ночи!

попробуйте заменить:    lastColumn = Cells.SpecialCells(xlCellTypeLastCell).Column
на:    lastColumn = Cells(3, Columns.Count).End(xlToLeft).Column

P.S.
Вот здесь: http://www.excel-vba.ru/chto-umeet-excel/kak-opredelit-poslednyuyu-yachejku-na-liste-cherez-vba/ более подробно.
Путей к вершине - множество. Этот один из многих!

uatotal


uatotal

 GWolf, подскажите пожалуйста еще
как выделить диапазон ячеек - например с 5 по 15
но при условии что диапазон задается
переменными
    lastRow = 15
    FirstRow = 5

     Rows("5:15").Select   - так выделяет как нужно

     Rows("FirstRow:lastRow").Select  - а так ругается. не могу найти ответ что не так в синтаксисе.

_Boroda_

#12
Rows(FirstRow & ":" & lastRow).Select   -выделит строки
Rows("A" & FirstRow & ":D" & lastRow).Select   -выделит диапазон ячеек в столбцах A:D

хоть я и не GWolf
На будущее - если обращаетесь на форуме к кому-то конкретно, то пишите в личку (если, конечно, это не благодарность за решение), а если хотите, чтобы Вам ответили, то персонализировать вопрос не стоит.
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

uatotal

Ок. Спасибо за ответ. блин элементарно как всегда - а не догадался. :)

GWolf

Добрый вечер!

Уважаемый _Boroda_ ответил и, как всегда верно. Не берусь спорить про личку. Этак мы весь форум растащим по личным сообщениям. А как же "смотри и учись"?  ;) ;D

А по существу Вами заданного вопроса, осмелюсь пояснить. Но, это чисто мой подход! Воля Ваша его принять или нет.
Итак: при "конструировании" своих макросов стараюсь избегать .Select. Почему? Да потому что макросу вообщем-то совершенно не нужно "селектить" ту область в которой он призван что-либо исполнить. Ну "зпселектили" область, а дальше то, все равно:

do
...
loop while cells(nR,nC)<>empty, например. Т.е. идем то по каждой или не каждой, но определяемой отнюдь не "сэлектированой" областью ячейке!
М.б. я ошибаюсь, коллеги поправят, но на мой взгляд имеет смысл использовать Range(Cells(nR1,nC1),Cells(nR2,nC2)).Select, лишь тогда когда нужна ДЕМОНСТРАЦИЯ пользователю работы макроса.

Вот как то так. Успеха.
Путей к вершине - множество. Этот один из многих!