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

Вход

Регистрация

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

 

= Мир MS Excel/Две процедуры с одинаковым именем - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Две процедуры с одинаковым именем (Макросы/Sub)
Две процедуры с одинаковым именем
Oh_Nick Дата: Понедельник, 21.08.2023, 11:11 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
Всем доброго времени суток!

У меня в листе есть две процедуры :

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("G6")) Is Nothing Then
        Application.EnableEvents = False
        frm = Range("N4").Text
        If frm <> "" Then
            If InStr(frm, "Базовая ставка таможенной пошлины:") > 0 Then
                frm = Mid(frm, InStr(frm, "Базовая ставка таможенной пошлины:") + Len("Базовая ставка таможенной пошлины:"))
            Else
                Range("I6").Value = "Нет данных"
            End If

            Range("I6").Value = Trim(Split(frm, ",")(0))    'извлечение числа после двоеточия до запятой

            If Range("I6").Value = "" Then Range("I6").Value = "Нет данных"
            
        Else
            Range("I6").Value = "Отрезок не найден"
        End If
        Application.EnableEvents = True
    End If
End Sub
[/vba]

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Проверяем, были ли изменены ячейки C6 или F6
    If Not Intersect(Target, Range("C6:F6")) Is Nothing Then
        ' Запускаем макрос CalculateM6
        CalculateM6
    End If
End Sub
[/vba]

Ругается на вторую процедуру и пишет ambiguous name detected worksheet_change. Как это можно поправить? Вводил Private Sub Worksheet_Change1 , ошибку не выдает, но ничего не происходит по событию...
 
Ответить
СообщениеВсем доброго времени суток!

У меня в листе есть две процедуры :

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("G6")) Is Nothing Then
        Application.EnableEvents = False
        frm = Range("N4").Text
        If frm <> "" Then
            If InStr(frm, "Базовая ставка таможенной пошлины:") > 0 Then
                frm = Mid(frm, InStr(frm, "Базовая ставка таможенной пошлины:") + Len("Базовая ставка таможенной пошлины:"))
            Else
                Range("I6").Value = "Нет данных"
            End If

            Range("I6").Value = Trim(Split(frm, ",")(0))    'извлечение числа после двоеточия до запятой

            If Range("I6").Value = "" Then Range("I6").Value = "Нет данных"
            
        Else
            Range("I6").Value = "Отрезок не найден"
        End If
        Application.EnableEvents = True
    End If
End Sub
[/vba]

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Проверяем, были ли изменены ячейки C6 или F6
    If Not Intersect(Target, Range("C6:F6")) Is Nothing Then
        ' Запускаем макрос CalculateM6
        CalculateM6
    End If
End Sub
[/vba]

Ругается на вторую процедуру и пишет ambiguous name detected worksheet_change. Как это можно поправить? Вводил Private Sub Worksheet_Change1 , ошибку не выдает, но ничего не происходит по событию...

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 11:11
i691198 Дата: Понедельник, 21.08.2023, 11:39 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

Как это можно поправить?

Просто перенесите код из второй процедуры в первую.
 
Ответить
Сообщение
Как это можно поправить?

Просто перенесите код из второй процедуры в первую.

Автор - i691198
Дата добавления - 21.08.2023 в 11:39
Oh_Nick Дата: Понедельник, 21.08.2023, 11:50 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
i691198, вроде получилось, спасибо

А как в это части кода скорректировать, чтобы событие происходило по измению в любой ячейке (C6 или F6), а не только когда ты меняешь значения и там и там?

[vba]
Код
Проверяем, были ли изменены ячейки C6 или F6
    If Not Intersect(Target, Range("C6:F6")) Is Nothing Then
        ' Запускаем макрос CalculateM6
        CalculateM6
    End If
End Sub
[/vba]
 
Ответить
Сообщениеi691198, вроде получилось, спасибо

А как в это части кода скорректировать, чтобы событие происходило по измению в любой ячейке (C6 или F6), а не только когда ты меняешь значения и там и там?

[vba]
Код
Проверяем, были ли изменены ячейки C6 или F6
    If Not Intersect(Target, Range("C6:F6")) Is Nothing Then
        ' Запускаем макрос CalculateM6
        CalculateM6
    End If
End Sub
[/vba]

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 11:50
Oh_Nick Дата: Понедельник, 21.08.2023, 11:53 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
i691198, макрос CalculateM6 выглядит так:

[vba]
Код
Sub CalculateM6()
    Dim total As Double
    
    ' Получаем сумму значений в ячейках C6 и F6
    total = Range("C6").Value + Range("F6").Value
    
    ' Проверяем условия и записываем соответствующие значения в ячейку M6
    If total <= 200000 Then
        Range("M6").Value = 775
    ElseIf total >= 200000.1 And total <= 450000 Then
        Range("M6").Value = 1550
    ElseIf total >= 450000.1 And total <= 1200000 Then
        Range("M6").Value = 3100
    ElseIf total >= 1200000.1 And total <= 2700000 Then
        Range("M6").Value = 8530
    ElseIf total >= 2700000.1 And total <= 4200000 Then
        Range("M6").Value = 12000
    ElseIf total >= 4200000.1 And total <= 5500000 Then
        Range("M6").Value = 15500
    ElseIf total >= 5500000.1 And total <= 7000000 Then
        Range("M6").Value = 20000
    ElseIf total >= 7000000.1 And total <= 8000000 Then
        Range("M6").Value = 23000
    ElseIf total >= 8000000.1 And total <= 9000000 Then
        Range("M6").Value = 25000
    ElseIf total >= 9000000.1 And total <= 10000000 Then
        Range("M6").Value = 27000
    ElseIf total >= 10000000.1 Then
        Range("M6").Value = 30000
    End If
End Sub
[/vba]
 
Ответить
Сообщениеi691198, макрос CalculateM6 выглядит так:

[vba]
Код
Sub CalculateM6()
    Dim total As Double
    
    ' Получаем сумму значений в ячейках C6 и F6
    total = Range("C6").Value + Range("F6").Value
    
    ' Проверяем условия и записываем соответствующие значения в ячейку M6
    If total <= 200000 Then
        Range("M6").Value = 775
    ElseIf total >= 200000.1 And total <= 450000 Then
        Range("M6").Value = 1550
    ElseIf total >= 450000.1 And total <= 1200000 Then
        Range("M6").Value = 3100
    ElseIf total >= 1200000.1 And total <= 2700000 Then
        Range("M6").Value = 8530
    ElseIf total >= 2700000.1 And total <= 4200000 Then
        Range("M6").Value = 12000
    ElseIf total >= 4200000.1 And total <= 5500000 Then
        Range("M6").Value = 15500
    ElseIf total >= 5500000.1 And total <= 7000000 Then
        Range("M6").Value = 20000
    ElseIf total >= 7000000.1 And total <= 8000000 Then
        Range("M6").Value = 23000
    ElseIf total >= 8000000.1 And total <= 9000000 Then
        Range("M6").Value = 25000
    ElseIf total >= 9000000.1 And total <= 10000000 Then
        Range("M6").Value = 27000
    ElseIf total >= 10000000.1 Then
        Range("M6").Value = 30000
    End If
End Sub
[/vba]

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 11:53
i691198 Дата: Понедельник, 21.08.2023, 12:07 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

Не очень понятно, сейчас у вас макрос CalculateM6 запускается при изменении значения в диапазоне C6:F6. Если нужно чтобы срабатывало при изменении значений только в ячейках C6 и F6, тогда вместо двоеточия нужно поставить запятую. Кроме того если вы меняете значения сразу в нескольких ячейках диапазона (например при удалении значений), то макрос также сработает. Если это не требуется, тогда первую строку нужно дополнить
[vba]
Код
If Not Intersect(Target, Range("C6:F6")) Is Nothing And Target.Count =1 Then
[/vba]
 
Ответить
СообщениеНе очень понятно, сейчас у вас макрос CalculateM6 запускается при изменении значения в диапазоне C6:F6. Если нужно чтобы срабатывало при изменении значений только в ячейках C6 и F6, тогда вместо двоеточия нужно поставить запятую. Кроме того если вы меняете значения сразу в нескольких ячейках диапазона (например при удалении значений), то макрос также сработает. Если это не требуется, тогда первую строку нужно дополнить
[vba]
Код
If Not Intersect(Target, Range("C6:F6")) Is Nothing And Target.Count =1 Then
[/vba]

Автор - i691198
Дата добавления - 21.08.2023 в 12:07
Oh_Nick Дата: Понедельник, 21.08.2023, 12:56 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
i691198, мне нужно, чтобы я , допустим, поменял значения в ячейке C6 или F6 и макрос срабатывал,а сейчас получается, чтобы он сработал нужно менять значение в ячейке C6 и F6. Ни запятая, ни[vba]
Код
If Not Intersect(Target, Range("C6:F6")) Is Nothing And Target.Count =1 Then
[/vba] не помогли

Файл приложил.
К сообщению приложен файл: total_cost.xlsm (31.5 Kb)


Сообщение отредактировал Oh_Nick - Понедельник, 21.08.2023, 12:57
 
Ответить
Сообщениеi691198, мне нужно, чтобы я , допустим, поменял значения в ячейке C6 или F6 и макрос срабатывал,а сейчас получается, чтобы он сработал нужно менять значение в ячейке C6 и F6. Ни запятая, ни[vba]
Код
If Not Intersect(Target, Range("C6:F6")) Is Nothing And Target.Count =1 Then
[/vba] не помогли

Файл приложил.

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 12:56
Апострофф Дата: Понедельник, 21.08.2023, 14:06 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 449
Репутация: 124 ±
Замечаний: 0% ±

Excel 1997
ElseIf total >= 200000.1 And total <= 450000 Then

total = 200000.05 не попадет ни под одно из ваших условий.
Но кучу ваших буков легко сократить!
 
Ответить
Сообщение
ElseIf total >= 200000.1 And total <= 450000 Then

total = 200000.05 не попадет ни под одно из ваших условий.
Но кучу ваших буков легко сократить!

Автор - Апострофф
Дата добавления - 21.08.2023 в 14:06
Oh_Nick Дата: Понедельник, 21.08.2023, 14:08 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
Апострофф, подскажите как, чтобы работало?
 
Ответить
СообщениеАпострофф, подскажите как, чтобы работало?

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 14:08
i691198 Дата: Понедельник, 21.08.2023, 14:09 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

не помогли

Теперь понятно. Дело в том, что у вас в этих ячейках находятся формулы, а не константы. Событие Worksheet_Change не срабатывает на изменение значений ячеек формулами, оно возникает если значение изменилось при ручном редактировании или в результате работы какого то макроса. Есть варианты использовать другое событие - Worksheet.Calculate, но в вашем случае это совсем не нужно. Я не стал глубоко вникать в ваши формулы, вы сами определите - в результате изменения значений каких ячеек должен сработать ваш макрос (при ручном редактировании, в том числе и при выборе из списка), и просто впишите их адреса через запятую в строку макроса. Примерно это должно выглядеть так.
[vba]
Код
If Not Intersect(Target, Range("B2,D2,E2,F2,G2")) Is Nothing And Target.Count =1 Then
[/vba]
 
Ответить
Сообщение
не помогли

Теперь понятно. Дело в том, что у вас в этих ячейках находятся формулы, а не константы. Событие Worksheet_Change не срабатывает на изменение значений ячеек формулами, оно возникает если значение изменилось при ручном редактировании или в результате работы какого то макроса. Есть варианты использовать другое событие - Worksheet.Calculate, но в вашем случае это совсем не нужно. Я не стал глубоко вникать в ваши формулы, вы сами определите - в результате изменения значений каких ячеек должен сработать ваш макрос (при ручном редактировании, в том числе и при выборе из списка), и просто впишите их адреса через запятую в строку макроса. Примерно это должно выглядеть так.
[vba]
Код
If Not Intersect(Target, Range("B2,D2,E2,F2,G2")) Is Nothing And Target.Count =1 Then
[/vba]

Автор - i691198
Дата добавления - 21.08.2023 в 14:09
Oh_Nick Дата: Понедельник, 21.08.2023, 14:20 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
i691198,

Благодарствую, все получилось)
 
Ответить
Сообщениеi691198,

Благодарствую, все получилось)

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 14:20
Апострофф Дата: Понедельник, 21.08.2023, 14:40 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 449
Репутация: 124 ±
Замечаний: 0% ±

Excel 1997
[vba]
Код
If total <= 200000 Then
        Range("M6").Value = 775
    ElseIf total >= 200000.1 And total <= 450000 Then
        Range("M6").Value = 1550
    ElseIf total >= 450000.1 And total <= 1200000 Then
        Range("M6").Value = 3100
    ElseIf total >= 1200000.1 And total <= 2700000 Then
        Range("M6").Value = 8530
    ElseIf total >= 2700000.1 And total <= 4200000 Then
        Range("M6").Value = 12000
    ElseIf total >= 4200000.1 And total <= 5500000 Then
        Range("M6").Value = 15500
    ElseIf total >= 5500000.1 And total <= 7000000 Then
        Range("M6").Value = 20000
    ElseIf total >= 7000000.1 And total <= 8000000 Then
        Range("M6").Value = 23000
    ElseIf total >= 8000000.1 And total <= 9000000 Then
        Range("M6").Value = 25000
    ElseIf total >= 9000000.1 And total <= 10000000 Then
        Range("M6").Value = 27000
    ElseIf total >= 10000000.1 Then
        Range("M6").Value = 30000
    End If
[/vba]
меняйте на
[vba]
Код
If total <= 200000 Then
        Range("M6").Value = 775
    ElseIf  total <= 450000 Then
        Range("M6").Value = 1550
    ElseIf  total <= 1200000 Then
        Range("M6").Value = 3100
    ElseIf  total <= 2700000 Then
        Range("M6").Value = 8530
    ElseIf  total <= 4200000 Then
        Range("M6").Value = 12000
    ElseIf  total <= 5500000 Then
        Range("M6").Value = 15500
    ElseIf  total <= 7000000 Then
        Range("M6").Value = 20000
    ElseIf  total <= 8000000 Then
        Range("M6").Value = 23000
    ElseIf  total <= 9000000 Then
        Range("M6").Value = 25000
    ElseIf  total <= 10000000 Then
        Range("M6").Value = 27000
    Else
        Range("M6").Value = 30000
    End If
[/vba]
 
Ответить
Сообщение[vba]
Код
If total <= 200000 Then
        Range("M6").Value = 775
    ElseIf total >= 200000.1 And total <= 450000 Then
        Range("M6").Value = 1550
    ElseIf total >= 450000.1 And total <= 1200000 Then
        Range("M6").Value = 3100
    ElseIf total >= 1200000.1 And total <= 2700000 Then
        Range("M6").Value = 8530
    ElseIf total >= 2700000.1 And total <= 4200000 Then
        Range("M6").Value = 12000
    ElseIf total >= 4200000.1 And total <= 5500000 Then
        Range("M6").Value = 15500
    ElseIf total >= 5500000.1 And total <= 7000000 Then
        Range("M6").Value = 20000
    ElseIf total >= 7000000.1 And total <= 8000000 Then
        Range("M6").Value = 23000
    ElseIf total >= 8000000.1 And total <= 9000000 Then
        Range("M6").Value = 25000
    ElseIf total >= 9000000.1 And total <= 10000000 Then
        Range("M6").Value = 27000
    ElseIf total >= 10000000.1 Then
        Range("M6").Value = 30000
    End If
[/vba]
меняйте на
[vba]
Код
If total <= 200000 Then
        Range("M6").Value = 775
    ElseIf  total <= 450000 Then
        Range("M6").Value = 1550
    ElseIf  total <= 1200000 Then
        Range("M6").Value = 3100
    ElseIf  total <= 2700000 Then
        Range("M6").Value = 8530
    ElseIf  total <= 4200000 Then
        Range("M6").Value = 12000
    ElseIf  total <= 5500000 Then
        Range("M6").Value = 15500
    ElseIf  total <= 7000000 Then
        Range("M6").Value = 20000
    ElseIf  total <= 8000000 Then
        Range("M6").Value = 23000
    ElseIf  total <= 9000000 Then
        Range("M6").Value = 25000
    ElseIf  total <= 10000000 Then
        Range("M6").Value = 27000
    Else
        Range("M6").Value = 30000
    End If
[/vba]

Автор - Апострофф
Дата добавления - 21.08.2023 в 14:40
Oh_Nick Дата: Понедельник, 21.08.2023, 14:57 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 445
Репутация: 8 ±
Замечаний: 20% ±

Excel 2019
Апострофф, благодарю!
 
Ответить
СообщениеАпострофф, благодарю!

Автор - Oh_Nick
Дата добавления - 21.08.2023 в 14:57
Serge_007 Дата: Понедельник, 21.08.2023, 15:26 | Сообщение № 13
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
как, чтобы работало?
Я бы так сделал:[vba]
Код
Sub CalculateM7()
    Dim total&
    total = [C6] + [F6]
        Select Case total
            Case Is <= 200000: [m6] = 775
            Case Is <= 450000: [m6] = 1550
            Case Is <= 1200000: [m6] = 3100
            Case Is <= 2700000: [m6] = 8530
            Case Is <= 4200000: [m6] = 12000
            Case Is <= 5500000: [m6] = 15500
            Case Is <= 7000000: [m6] = 20000
            Case Is <= 8000000: [m6] = 23000
            Case Is <= 9000000: [m6] = 25000
            Case Is <= 10000000: [m6] = 27000
            Case Else: [m6] = 30000
        End Select
End Sub
[/vba]


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
как, чтобы работало?
Я бы так сделал:[vba]
Код
Sub CalculateM7()
    Dim total&
    total = [C6] + [F6]
        Select Case total
            Case Is <= 200000: [m6] = 775
            Case Is <= 450000: [m6] = 1550
            Case Is <= 1200000: [m6] = 3100
            Case Is <= 2700000: [m6] = 8530
            Case Is <= 4200000: [m6] = 12000
            Case Is <= 5500000: [m6] = 15500
            Case Is <= 7000000: [m6] = 20000
            Case Is <= 8000000: [m6] = 23000
            Case Is <= 9000000: [m6] = 25000
            Case Is <= 10000000: [m6] = 27000
            Case Else: [m6] = 30000
        End Select
End Sub
[/vba]

Автор - Serge_007
Дата добавления - 21.08.2023 в 15:26
i691198 Дата: Вторник, 22.08.2023, 13:30 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

Так здесь макрос и не нужен, пользовательская функция с этим вполне справится, и голову не нужно ломать как это запустить.
Можно и без VBA, обычной формулой.
Код
=ВЫБОР(ПОИСКПОЗ(C6+F6;{1000000000000000000;10000000;9000000;8000000;7000000;5500000;4200000;2700000;1200000;450000;200000};-1);30000;27000;25000;23000;20000;15500;12000;8530;3100;1550;775)
 
Ответить
СообщениеТак здесь макрос и не нужен, пользовательская функция с этим вполне справится, и голову не нужно ломать как это запустить.
Можно и без VBA, обычной формулой.
Код
=ВЫБОР(ПОИСКПОЗ(C6+F6;{1000000000000000000;10000000;9000000;8000000;7000000;5500000;4200000;2700000;1200000;450000;200000};-1);30000;27000;25000;23000;20000;15500;12000;8530;3100;1550;775)

Автор - i691198
Дата добавления - 22.08.2023 в 13:30
Serge_007 Дата: Вторник, 22.08.2023, 13:48 | Сообщение № 15
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Если уж формулой, то тогда можно и попроще:
Код
=ВПР((C6+F6)%%%;{0;775:0,2;1550:0,45;3100:1,2;8530:2,7;12000:4,2;15500:5,5;20000:7;23000:8;25000:9;27000:10;30000};2)


макрос и не нужен, пользовательская функция с этим вполне справится
А пользовательская функция - это не макрос что ли? ;) :D


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеЕсли уж формулой, то тогда можно и попроще:
Код
=ВПР((C6+F6)%%%;{0;775:0,2;1550:0,45;3100:1,2;8530:2,7;12000:4,2;15500:5,5;20000:7;23000:8;25000:9;27000:10;30000};2)


макрос и не нужен, пользовательская функция с этим вполне справится
А пользовательская функция - это не макрос что ли? ;) :D

Автор - Serge_007
Дата добавления - 22.08.2023 в 13:48
i691198 Дата: Вторник, 22.08.2023, 13:52 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

то тогда можно и попроще

Согласен, хороший вариант.
 
Ответить
Сообщение
то тогда можно и попроще

Согласен, хороший вариант.

Автор - i691198
Дата добавления - 22.08.2023 в 13:52
i691198 Дата: Вторник, 22.08.2023, 14:03 | Сообщение № 17
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

А пользовательская функция не макрос что ли?

Не совсем макрос, хотя UDF и написан на VBA, есть одно существенное отличие - не требуется организовывать её запуск. Она ведет себя как обычная экселевская функция, при изменении значений аргументов она автоматически пересчитывается.
 
Ответить
Сообщение
А пользовательская функция не макрос что ли?

Не совсем макрос, хотя UDF и написан на VBA, есть одно существенное отличие - не требуется организовывать её запуск. Она ведет себя как обычная экселевская функция, при изменении значений аргументов она автоматически пересчитывается.

Автор - i691198
Дата добавления - 22.08.2023 в 14:03
Serge_007 Дата: Вторник, 22.08.2023, 16:35 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Не совсем макрос
Вы заблуждаетесь
Все что написано кодом в VBA - это и есть макрос
И организовывать запуск UDF тоже надо, хотя и не всегда приходится явно указывать событие для запуска

обычная экселевская функция, при изменении значений аргументов она автоматически пересчитывается
Не все функции Excel пересчитываются при этом, некоторые пересчитываются и при любом изменении на листе, а некоторые и вовсе не имеют аргументов

Что такое макрос?
Макрос (другие названия: код, программа, подпрограмма, процедура, скрипт) - это набор команд (или одна команда), выполняющих заданные пользователем при написании кода макроса действий. Правильно называть все макросы Процедура, но в разговорном русском закрепилось название Макрос, поэтому мы будем далее все процедуры называть макросами.


Какие бывают макросы?
Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.


Макрос - программа всегда выглядит так:
[vba]
Код
Sub Название_макроса()  
текст макроса (иначе называется телом макроса)  
End Sub  
[/vba]
Макрос - функция всегда выглядит так:
[vba]
Код
Function Название_макроса()  
текст макроса  
End Function  
[/vba]
Макрос - свойство всегда выглядит так:
[vba]
Код
Property Get/let Название_макроса()  
текст макроса  
End Property  
[/vba]
К сообщению приложен файл: 5061608.jpg (15.3 Kb)


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Не совсем макрос
Вы заблуждаетесь
Все что написано кодом в VBA - это и есть макрос
И организовывать запуск UDF тоже надо, хотя и не всегда приходится явно указывать событие для запуска

обычная экселевская функция, при изменении значений аргументов она автоматически пересчитывается
Не все функции Excel пересчитываются при этом, некоторые пересчитываются и при любом изменении на листе, а некоторые и вовсе не имеют аргументов

Что такое макрос?
Макрос (другие названия: код, программа, подпрограмма, процедура, скрипт) - это набор команд (или одна команда), выполняющих заданные пользователем при написании кода макроса действий. Правильно называть все макросы Процедура, но в разговорном русском закрепилось название Макрос, поэтому мы будем далее все процедуры называть макросами.


Какие бывают макросы?
Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.


Макрос - программа всегда выглядит так:
[vba]
Код
Sub Название_макроса()  
текст макроса (иначе называется телом макроса)  
End Sub  
[/vba]
Макрос - функция всегда выглядит так:
[vba]
Код
Function Название_макроса()  
текст макроса  
End Function  
[/vba]
Макрос - свойство всегда выглядит так:
[vba]
Код
Property Get/let Название_макроса()  
текст макроса  
End Property  
[/vba]

Автор - Serge_007
Дата добавления - 22.08.2023 в 16:35
i691198 Дата: Вторник, 22.08.2023, 16:58 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 219
Репутация: 85 ±
Замечаний: 0% ±

Serge_007, Спасибо за ликбез. Впредь буду осторожен с терминологией.
 
Ответить
СообщениеSerge_007, Спасибо за ликбез. Впредь буду осторожен с терминологией.

Автор - i691198
Дата добавления - 22.08.2023 в 16:58
Фомулист Дата: Вторник, 29.08.2023, 10:41 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 397
Репутация: 9 ±
Замечаний: 80% ±

Excel 2003
Цитата , Что такое макросы VBA в Excel? ( писал(а)):
Какие бывают макросы?
Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.

Здравствуйте.
Скажите, пожалуйста, а когда используется макрос-свойство? Вроде ж всё можно задать и в обычном макросе?..


Терпение и труд всё перетрут!
 
Ответить
Сообщение
Цитата , Что такое макросы VBA в Excel? ( писал(а)):
Какие бывают макросы?
Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.

Здравствуйте.
Скажите, пожалуйста, а когда используется макрос-свойство? Вроде ж всё можно задать и в обычном макросе?..

Автор - Фомулист
Дата добавления - 29.08.2023 в 10:41
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Две процедуры с одинаковым именем (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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