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
А как в это части кода скорректировать, чтобы событие происходило по измению в любой ячейке (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
' Получаем сумму значений в ячейках 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
Не очень понятно, сейчас у вас макрос 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
i691198, мне нужно, чтобы я , допустим, поменял значения в ячейке C6 или F6 и макрос срабатывал,а сейчас получается, чтобы он сработал нужно менять значение в ячейке C6 и F6. Ни запятая, ни[vba]
Код
If Not Intersect(Target, Range("C6:F6")) Is Nothing And Target.Count =1 Then
[/vba] не помогли
Файл приложил.
i691198, мне нужно, чтобы я , допустим, поменял значения в ячейке C6 или F6 и макрос срабатывал,а сейчас получается, чтобы он сработал нужно менять значение в ячейке C6 и F6. Ни запятая, ни[vba]
Код
If Not Intersect(Target, Range("C6:F6")) Is Nothing And Target.Count =1 Then
Теперь понятно. Дело в том, что у вас в этих ячейках находятся формулы, а не константы. Событие Worksheet_Change не срабатывает на изменение значений ячеек формулами, оно возникает если значение изменилось при ручном редактировании или в результате работы какого то макроса. Есть варианты использовать другое событие - Worksheet.Calculate, но в вашем случае это совсем не нужно. Я не стал глубоко вникать в ваши формулы, вы сами определите - в результате изменения значений каких ячеек должен сработать ваш макрос (при ручном редактировании, в том числе и при выборе из списка), и просто впишите их адреса через запятую в строку макроса. Примерно это должно выглядеть так. [vba]
Код
If Not Intersect(Target, Range("B2,D2,E2,F2,G2")) Is Nothing And Target.Count =1 Then
Теперь понятно. Дело в том, что у вас в этих ячейках находятся формулы, а не константы. Событие Worksheet_Change не срабатывает на изменение значений ячеек формулами, оно возникает если значение изменилось при ручном редактировании или в результате работы какого то макроса. Есть варианты использовать другое событие - Worksheet.Calculate, но в вашем случае это совсем не нужно. Я не стал глубоко вникать в ваши формулы, вы сами определите - в результате изменения значений каких ячеек должен сработать ваш макрос (при ручном редактировании, в том числе и при выборе из списка), и просто впишите их адреса через запятую в строку макроса. Примерно это должно выглядеть так. [vba]
Код
If Not Intersect(Target, Range("B2,D2,E2,F2,G2")) Is Nothing And Target.Count =1 Then
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
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
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, обычной формулой.
Так здесь макрос и не нужен, пользовательская функция с этим вполне справится, и голову не нужно ломать как это запустить. Можно и без VBA, обычной формулой.
Не совсем макрос, хотя UDF и написан на VBA, есть одно существенное отличие - не требуется организовывать её запуск. Она ведет себя как обычная экселевская функция, при изменении значений аргументов она автоматически пересчитывается.
Не совсем макрос, хотя UDF и написан на VBA, есть одно существенное отличие - не требуется организовывать её запуск. Она ведет себя как обычная экселевская функция, при изменении значений аргументов она автоматически пересчитывается.i691198
Вы заблуждаетесь Все что написано кодом в VBA - это и есть макрос И организовывать запуск UDF тоже надо, хотя и не всегда приходится явно указывать событие для запуска
Что такое макрос? Макрос (другие названия: код, программа, подпрограмма, процедура, скрипт) - это набор команд (или одна команда), выполняющих заданные пользователем при написании кода макроса действий. Правильно называть все макросы Процедура, но в разговорном русском закрепилось название Макрос, поэтому мы будем далее все процедуры называть макросами.
Какие бывают макросы? Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.
Вы заблуждаетесь Все что написано кодом в VBA - это и есть макрос И организовывать запуск UDF тоже надо, хотя и не всегда приходится явно указывать событие для запуска
Что такое макрос? Макрос (другие названия: код, программа, подпрограмма, процедура, скрипт) - это набор команд (или одна команда), выполняющих заданные пользователем при написании кода макроса действий. Правильно называть все макросы Процедура, но в разговорном русском закрепилось название Макрос, поэтому мы будем далее все процедуры называть макросами.
Какие бывают макросы? Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.
Цитата , Что такое макросы VBA в Excel? ( писал(а)): Какие бывают макросы? Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.
Здравствуйте. Скажите, пожалуйста, а когда используется макрос-свойство? Вроде ж всё можно задать и в обычном макросе?..
Цитата , Что такое макросы VBA в Excel? ( писал(а)): Какие бывают макросы? Макросы бывают трёх видов: макрос - программа (или просто макрос), макрос - функция (или функция определённая пользователем) и макрос - свойство. Отличаются они тем, что макрос-программа может выполнять любые предусмотренные VBA действия, макрос-функция может только возвращать результат, аналогично функциям листа Excel, а макрос - свойство определяет заданный пользователем класс.
Здравствуйте. Скажите, пожалуйста, а когда используется макрос-свойство? Вроде ж всё можно задать и в обычном макросе?..Фомулист