Здравствуйте, всем! Подскажите, плз. Нужно чтобы выполнение макроса прерывалось если в столбце есть ошибка (Н/Д). Пробовал несколько способов, но никак не соображу. Вот один из них. [vba]
Код
If IsError(Range("A:A")) Then MsgBox "Есть НД" End If
[/vba] (В файле формула исключительно для формирования ошибки)
Здравствуйте, всем! Подскажите, плз. Нужно чтобы выполнение макроса прерывалось если в столбце есть ошибка (Н/Д). Пробовал несколько способов, но никак не соображу. Вот один из них. [vba]
Код
If IsError(Range("A:A")) Then MsgBox "Есть НД" End If
[/vba] (В файле формула исключительно для формирования ошибки)pabchek
wild_pig, не работает, если ошибка не в первой строке _Boroda_, Саш, к сожалению, ввел в заблуждение проставив цифры. На самом деле в колонке текстовые значения. Не подумал, что это важно. Но второй вариант работает. Но почему? Там же сумма.
wild_pig, не работает, если ошибка не в первой строке _Boroda_, Саш, к сожалению, ввел в заблуждение проставив цифры. На самом деле в колонке текстовые значения. Не подумал, что это важно. Но второй вариант работает. Но почему? Там же сумма.pabchek
"Учиться, учиться и еще раз учиться!" WM: R399923528092
Сообщение отредактировал pabchek - Вторник, 24.05.2016, 10:58
Сумма текста = 0. Первый вариант как раз не учитывал то, что там или текст, или все нули, или +1,-1,+1,-1 А сумма чего угодно, если в этом что угодно есть ошибка, даст ошибку.
wild_pig, не работает, если ошибка не в первой строке
Не совсем так. Обрати внимание на кусок Cells(1, 1).CurrentRegion - это текущая область относительно ячейки А1. Попробуй нажать F5 - выделить - Текущая область и поймешь сам. Только встань сначала вовнутрь таблицы.
Сумма текста = 0. Первый вариант как раз не учитывал то, что там или текст, или все нули, или +1,-1,+1,-1 А сумма чего угодно, если в этом что угодно есть ошибка, даст ошибку.
wild_pig, не работает, если ошибка не в первой строке
Не совсем так. Обрати внимание на кусок Cells(1, 1).CurrentRegion - это текущая область относительно ячейки А1. Попробуй нажать F5 - выделить - Текущая область и поймешь сам. Только встань сначала вовнутрь таблицы._Boroda_
Не совсем. Текущая область равна одной ячейке - А1.
А вообще если, то CurrentRegion может именно из-за наличия пустых строк/столбцов дать не совсем нужный результат. Поэтому я, например, его практически не использую - у меня-то в таблицах безобразия с пустыми строками-столбцами не бывает, но завтра с моим файлом начнет работать девочка Виолетта (с ресницами длиннее ногтей, которые длиннее пальцев [ногти и пальцы на руках, естественно]) и с файлом может случиться что угодно.
Если очень нужно, то использую [vba]
Код
Dim d_ As Range ActiveSheet.UsedRange Set d_ = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell))
[/vba] а обычно считаю считаю строки и столбцы там, где точно знаю, что заполнено всегда [vba]
Код
Dim d_ As Range r1_ = Range("A" & Rows.Count).End(xlUp).Row c1_ = Cells(1, Columns.Count).End(xlToLeft).Column Set d_ = Range(Cells(1, 1), Cells(r1_, c1_))
[/vba] В первом куске ActiveSheet.UsedRange очень желательно - эта штука нормализует диапазон. Например, ты написал случайно в ячейке L999 цифру 5, потом понял, что ошибся и стер ее. А таблица у тебя А1:В9 и все, больше ничего на листе нет. Тогда SpecialCells(xlLastCell) даст тебе ячейку L999 (и без разницы, что там уже ничего нет, главное, что было). Убрать это из памяти можно или сохранением файла, или строкой ActiveSheet.UsedRange
Не совсем. Текущая область равна одной ячейке - А1.
А вообще если, то CurrentRegion может именно из-за наличия пустых строк/столбцов дать не совсем нужный результат. Поэтому я, например, его практически не использую - у меня-то в таблицах безобразия с пустыми строками-столбцами не бывает, но завтра с моим файлом начнет работать девочка Виолетта (с ресницами длиннее ногтей, которые длиннее пальцев [ногти и пальцы на руках, естественно]) и с файлом может случиться что угодно.
Если очень нужно, то использую [vba]
Код
Dim d_ As Range ActiveSheet.UsedRange Set d_ = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell))
[/vba] а обычно считаю считаю строки и столбцы там, где точно знаю, что заполнено всегда [vba]
Код
Dim d_ As Range r1_ = Range("A" & Rows.Count).End(xlUp).Row c1_ = Cells(1, Columns.Count).End(xlToLeft).Column Set d_ = Range(Cells(1, 1), Cells(r1_, c1_))
[/vba] В первом куске ActiveSheet.UsedRange очень желательно - эта штука нормализует диапазон. Например, ты написал случайно в ячейке L999 цифру 5, потом понял, что ошибся и стер ее. А таблица у тебя А1:В9 и все, больше ничего на листе нет. Тогда SpecialCells(xlLastCell) даст тебе ячейку L999 (и без разницы, что там уже ничего нет, главное, что было). Убрать это из памяти можно или сохранением файла, или строкой ActiveSheet.UsedRange_Boroda_
. Кстати, я на это уже натыкался и знаю. На автомате удаляю пустой конец файла с последующим сохранением. И да, спасибо за код подсчета строк/столбцов!
. Кстати, я на это уже натыкался и знаю. На автомате удаляю пустой конец файла с последующим сохранением. И да, спасибо за код подсчета строк/столбцов!pabchek
"Учиться, учиться и еще раз учиться!" WM: R399923528092
Так у тебя будет пропускать вообще все ошибки. И в Вычислениях_1 тоже. А вдруг там ошибка в коде? on error resume next в самом начале пишут обычно тогда, когда отдают код кому-то наружу. Чтобы на дебаг не выскакивало в случае чего. Да, в случае ошибки отрабатывать может неверно, но пугать пользователя окном VBA не будет. А при написании/отладке On Error... нужно писать только там, где он действительно необходим. Возможно, второй вариант из поста 3 все-таки лучше. Что-то типа [vba]
Код
Sub dd() 'вычисления 1 'вычисления 2 Err.Clear'на всякий случай, вдруг ошибка уже была в коде раньше, мы ее пропустили, но не обнулили On Error Resume Next a = WorksheetFunction.Sum(Range("A:A")) If Err.Number Then MsgBox "Есть ошибка" Exit Sub ' здесь "on error goto 0" не нужно - мы все равно уже вышли из Sub End If ' здесь "on error goto 0" не нужно - ошибки и так не было End Sub
Так у тебя будет пропускать вообще все ошибки. И в Вычислениях_1 тоже. А вдруг там ошибка в коде? on error resume next в самом начале пишут обычно тогда, когда отдают код кому-то наружу. Чтобы на дебаг не выскакивало в случае чего. Да, в случае ошибки отрабатывать может неверно, но пугать пользователя окном VBA не будет. А при написании/отладке On Error... нужно писать только там, где он действительно необходим. Возможно, второй вариант из поста 3 все-таки лучше. Что-то типа [vba]
Код
Sub dd() 'вычисления 1 'вычисления 2 Err.Clear'на всякий случай, вдруг ошибка уже была в коде раньше, мы ее пропустили, но не обнулили On Error Resume Next a = WorksheetFunction.Sum(Range("A:A")) If Err.Number Then MsgBox "Есть ошибка" Exit Sub ' здесь "on error goto 0" не нужно - мы все равно уже вышли из Sub End If ' здесь "on error goto 0" не нужно - ошибки и так не было End Sub
Не совсем. В файле я смоделировал ситуацию, в которой если On Error... не поставить первым, получается ошибка функции. И если во втором случае не поставить Err.Clear, то запоминается ошибка из первых вычислений и выскакивает MsgBox.
Не совсем. В файле я смоделировал ситуацию, в которой если On Error... не поставить первым, получается ошибка функции. И если во втором случае не поставить Err.Clear, то запоминается ошибка из первых вычислений и выскакивает MsgBox.pabchek
Public Sub www() On Error Resume Next Set r = [A:a].CurrentRegion.SpecialCells(xlCellTypeFormulas, 16) If Err = 0 Then MsgBox "ERROR!" Err.Clear End Sub
[/vba]
[vba]
Код
Public Sub www() On Error Resume Next Set r = [A:a].CurrentRegion.SpecialCells(xlCellTypeFormulas, 16) If Err = 0 Then MsgBox "ERROR!" Err.Clear End Sub