Vba excel проверка ячейки на ошибку

 

N1K0

Пользователь

Сообщений: 70
Регистрация: 01.01.1970

Имеется ячейка с формулой, которая может выдавать значения ошибок (#Н/Д и т.п)  
требуется если Ячейка не содержит ошибку Then выполнить код  

  или if Ячейка является числом Then выполнить код  

  помогите!

 

ytk5kyky

Пользователь

Сообщений: 2410
Регистрация: 01.01.1970

If IsNumeric(ячейка.Value) Then  

  Если известен вид ошибки, то можно проверить значение, например, для #Н/Д:  
If ячейка.Value <> «#N/A»  Then  

  Или так:  
If Not Application.WorksheetFunction.IsError(ячейка.Value) Then  
‘IsError = ЕОШИБКА, IsNA = ЕНД

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

Или так: If Not IsError(ActiveCell) Then MsgBox «Нет ошибки»

 

N1K0

Пользователь

Сообщений: 70
Регистрация: 01.01.1970

Перепробовал все способы, работает.  
Спасибо.

 

Здравствуйте. Решил не создавать новую тему а эту освежить, таким вопросом. Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. Знаю что ексель хранит дату и время в числовом формате, но может есть какой то способ? Спасибо!

 

{quote}{login=}{date=06.04.2011 06:40}{thema=Как проверить что в ячейке формат даты}{post}Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. {/post}{/quote}  

  If IsDate(ActiveCell) Then MsgBox «В активной ячейке находится дата!»  

    Вот только IsDate почему-то распознаёт дату даже в ячейке, где содержится текст 1,2,2011  
(Excel не распознаёт этот текст как дату)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Игорь, я так понял из вопроса, надо на конкретную дату проверить, что-то вроде:  
If ActiveCell = #1/1/2011# Then MsgBox «В активной ячейке находится дата!»  
Но может я и ошибаюсь.

Я сам — дурнее всякого примера! …

 

Guest

Гость

#8

06.04.2011 07:29:07

Да Игорь все правильно вы поняли, надо именно на формат проверить, а не на конкретную дату, я думаю если к вашему методу добавить такую проверку:  

  If (IsDate(ActiveCell) And ActiveCell.Value Like «*.*.*» Then MsgBox «В активной ячейке находится дата!»  
Тогда исключится вариант с запятыми

Q: How do i determine if an error is in any cell in the entire workbook with Excel VBA?

Normally errors will be divide by 0 or #value errors, but this list is not exhaustive (or is it? — i don’t know if more exist)

Is there a way to determine if a cell contains an error then to skip over further processing in my script without spitting out a debug/warning/error message.

something such like

          if value in current.Workbook.cell is error then go to <jump>
           OR
          if value in old.Workbook.cell is error then go to <jump>

where jump is a marker at the end of an if statement but within a loop.

the script compares values between two workbooks and updates the current workbook with colours to show difference.

I have no VBA experience at all. but i get the gist of the script i have been given.

thank you kindly.

asked Nov 22, 2011 at 17:00

Mat's user avatar

MatMat

1,2211 gold badge22 silver badges46 bronze badges

1

You can skip cells with errors by using the VarType function. For example:

If VarType(ActiveCell.Value) <> vbError Then
    ' do something
End If

The VarType function is also very useful to validate the data type. For example if your code expects a date value but sometimes encounters text, you can use this function to vet the data and handle exceptions gracefully.

answered Nov 22, 2011 at 19:18

Rachel Hettinger's user avatar

Rachel HettingerRachel Hettinger

7,8322 gold badges22 silver badges31 bronze badges

1

Here’s an snippet of code that records in the Immediate Window, the worksheet name, cell address and formula, where there is a spreadsheet formula error…

Dim ws As Worksheet, r As Range

For Each ws In Worksheets
    For Each r In ws.UsedRange
        If IsError(r.Value) Then
            Debug.Print r.Parent.Name, r.Address, r.Formula
        End If
    Next
Next

answered Nov 22, 2011 at 21:39

SkipVought's user avatar

1

Given your initial question was how do you detect errors in any cell of the workbook with VBA then you should be looking for a very efficient approach — looking at each cell is very expensive time wise!

Two options for this are:

  1. Use Excel’s SpecialCells to shortcut the process
  2. use my Mappit! addin which is configured to report on spreadsheet errors

For SpecialCells please see the code below. This takes advantage of the ready-made collection of errors that exist as formulas

Please that that constants also have an errors collection, so if you have copied then run a paste special as value on a formula error then you would need to use Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors) to detect these

You can use also detect SpecialCells manually by

  • Select all cells in the area of interest
  • Press F5
  • Click Special
  • select ‘Errors’ under ‘Formulas’ (or ‘Constants’)

enter image description here

Please be aware that prior to xl2010 there is a limit of 8192 areas that SpecialCells can handle

Sub ErrorList()
    Dim ws As Worksheet
    Dim rng1 As Range
    Dim strOut As String
    For Each ws In ActiveWorkbook.Sheets
        Set rng1 = Nothing
        On Error Resume Next
        Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
        On Error GoTo 0
        If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
    Next ws
    If Len(strOut) > 0 Then
        MsgBox "Error List:" & vbNewLine & strOut
    Else
        MsgBox "No Errors", vbInformation
    End If
End Sub

answered Nov 23, 2011 at 9:35

brettdj's user avatar

brettdjbrettdj

54.6k16 gold badges113 silver badges176 bronze badges

There’s another way to do handle this: add On Error Resume Next into your code (usually just put it before the loop).

If a cell is an error, it’ll just skip it and move to the next element in the loop :)

answered Nov 23, 2011 at 0:33

Gaijinhunter's user avatar

GaijinhunterGaijinhunter

14.5k4 gold badges50 silver badges57 bronze badges

4

se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

1

Как задается условие «если ошибка» — #ЗНАЧ!

13.03.2018, 10:39. Показов 9203. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Подскажите, пожалуйста, как правильно задается условие «если ошибка»
Мне необходимо указать ошибку: #ЗНАЧ!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test3()
 
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To lastRow
        If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
        If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
'        If Cells(i, 6).Value = "#ЗНАЧ!" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = Error And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = "#Error" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = "#N/A" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
        
    Next i
    
End Sub

Вложения

Тип файла: zip If_Error.zip (13.7 Кб, 1 просмотров)



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

13.03.2018, 10:39

Ответы с готовыми решениями:

Какой функцией задать условие «Если область ячеек пустая» ?
Есть некий макрос, который шагает по рядам и окрашивает их в нужный цвет, или прячет, в зависимости…

Почему ошибка: «Next without for» если For абсолютно точно есть?
На строчку 23 мне тыкает

Sub isColNum()
Dim x As String, r As Long, c As Integer, numCount…

Если str довольно длинная,то выскакивает ошибка «type mismatch»
Делаю ODBC запрос,пишу .commandtext=array(str),где str=&quot;……..&quot;.Если str довольно длинная,то…

Создать цикл Анализ «что если»-«Подбор параметра.»
Добрый день.
В excel на работе есть классическая задача, которая решается с помощью подбора…

7

Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.03.2018, 10:41

2

Visual Basic
1
If Cells(i, 6).Value = CVErr(xlErrNA)



1



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

13.03.2018, 11:52

3

se_arts, #ЗНАЧ! это CVErr(xlErrValue)
Если любое значение ошибки, то

Visual Basic
1
If iserror(Cells(i, 6).Value) then



2



se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

13.03.2018, 11:54

 [ТС]

4

Hugo121, выдает ошибку
Run-time error ’13’:
Type mismatch

Visual Basic
1
2
3
4
5
6
7
8
Sub test3()
   lastRow = Cells(Rows.Count, 1).End(xlUp).Row
   For i = 4 To lastRow
       If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
       If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
       If Cells(i, 6).Value = CVErr(xlErrNA) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
   Next i
End Sub

Данные:

Кликните здесь для просмотра всего текста

5 6

0 0
0 2
3 3
5 4
5
6 6
2 8
2
5 6
4 8
5
5 3
1 1
4 #ЗНАЧ!
6 5
5 6
2 8
4 9
6 8
7 8
7 8
5 2
4 7
4 8
3 4
3 5
3 1
3 2
4 7
4 6
4 8



0



se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

13.03.2018, 12:23

 [ТС]

5

Казанский,

убрал проверку 2-ого условия (And Cells(i, 5).Value <> «»), попробовал CVErr(xlErrValue) и для любой ошибки
тоже выдает ошибку:
Run-time error ’13’:
Type mismatch

Что я неправильно пишу или указываю в коде?
Находит только перове правильное значение с строке 4 и дальше переходит к макросу и показывает ошибку «13».

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub test3()
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To LastRow
        If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
        If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
'        If IsError(Cells(i, 6).Value) Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = CVErr(xlErrNA) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = CVErr(xlErrValue) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
        If Cells(i, 6).Value = CVErr(xlErrValue) Then Cells(i, 7).Value = 15
    Next i
End Sub

Миниатюры

Как задается условие "если ошибка" - #ЗНАЧ!
 

Как задается условие "если ошибка" - #ЗНАЧ!
 

Вложения

Тип файла: zip If_Error.zip (13.8 Кб, 4 просмотров)



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

13.03.2018, 15:16

6

IsError(Cells(i, 6).Value) не подошел?
и по моему у вас ЕСЛИ не правильно устроин.

Добавлено через 1 минуту
вариант

Visual Basic
1
2
3
4
5
6
7
8
9
10
If Cells(i, 5).Value <> "" Then
          If IsError(Cells(i, 6).Value) Then
             Cells(i, 7).Value = 15
          Else
             Select Case Cells(i, 6).Value
                 Case 2: Cells(i, 7).Value = 5
                 Case 5: Cells(i, 7).Value = 10
             End Select
          End If
End If



1



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.03.2018, 22:37

7

Лучший ответ Сообщение было отмечено se_arts как решение

Решение

Посмотрел наконец файл — точно xlErrValue нужно:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test2()
 
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To lastRow
        If Cells(i, 5).Value <> "" Then
            Select Case CStr(Cells(i, 6).Value)
            Case CStr(CVErr(xlErrValue)): Cells(i, 7).Value = 15
            Case "2": Cells(i, 7).Value = 5
            Case "5": Cells(i, 7).Value = 10
            End Select
            End If
        Next i
 
    End Sub

Добавлено через 1 минуту
Или можно конечно искать просто «Error 2015»



1



0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

14.03.2018, 00:09

 [ТС]

8

Hugo121, заработало
Hugo121, Vlad999, Казанский — всем спасибо.



0



 

N1K0

Пользователь

Сообщений: 70
Регистрация: 01.01.1970

Имеется ячейка с формулой, которая может выдавать значения ошибок (#Н/Д и т.п)  
требуется если Ячейка не содержит ошибку Then выполнить код  

  или if Ячейка является числом Then выполнить код  

  помогите!

 

ytk5kyky

Пользователь

Сообщений: 2410
Регистрация: 01.01.1970

If IsNumeric(ячейка.Value) Then  

  Если известен вид ошибки, то можно проверить значение, например, для #Н/Д:  
If ячейка.Value <> «#N/A»  Then  

  Или так:  
If Not Application.WorksheetFunction.IsError(ячейка.Value) Then  
‘IsError = ЕОШИБКА, IsNA = ЕНД

 

ZVI

Пользователь

Сообщений: 4325
Регистрация: 23.12.2012

Или так: If Not IsError(ActiveCell) Then MsgBox «Нет ошибки»

 

N1K0

Пользователь

Сообщений: 70
Регистрация: 01.01.1970

Перепробовал все способы, работает.  
Спасибо.

 

Здравствуйте. Решил не создавать новую тему а эту освежить, таким вопросом. Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. Знаю что ексель хранит дату и время в числовом формате, но может есть какой то способ? Спасибо!

 

{quote}{login=}{date=06.04.2011 06:40}{thema=Как проверить что в ячейке формат даты}{post}Как в коде VBA проверить, что в ячейке находится дата ну например 01.01.2011. {/post}{/quote}  

  If IsDate(ActiveCell) Then MsgBox «В активной ячейке находится дата!»  

    Вот только IsDate почему-то распознаёт дату даже в ячейке, где содержится текст 1,2,2011  
(Excel не распознаёт этот текст как дату)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Игорь, я так понял из вопроса, надо на конкретную дату проверить, что-то вроде:  
If ActiveCell = #1/1/2011# Then MsgBox «В активной ячейке находится дата!»  
Но может я и ошибаюсь.

Я сам — дурнее всякого примера! …

 

Guest

Гость

#8

06.04.2011 07:29:07

Да Игорь все правильно вы поняли, надо именно на формат проверить, а не на конкретную дату, я думаю если к вашему методу добавить такую проверку:  

  If (IsDate(ActiveCell) And ActiveCell.Value Like «*.*.*» Then MsgBox «В активной ячейке находится дата!»  
Тогда исключится вариант с запятыми

Q: How do i determine if an error is in any cell in the entire workbook with Excel VBA?

Normally errors will be divide by 0 or #value errors, but this list is not exhaustive (or is it? — i don’t know if more exist)

Is there a way to determine if a cell contains an error then to skip over further processing in my script without spitting out a debug/warning/error message.

something such like

          if value in current.Workbook.cell is error then go to <jump>
           OR
          if value in old.Workbook.cell is error then go to <jump>

where jump is a marker at the end of an if statement but within a loop.

the script compares values between two workbooks and updates the current workbook with colours to show difference.

I have no VBA experience at all. but i get the gist of the script i have been given.

thank you kindly.

asked Nov 22, 2011 at 17:00

Mat's user avatar

MatMat

1,2211 gold badge22 silver badges46 bronze badges

1

You can skip cells with errors by using the VarType function. For example:

If VarType(ActiveCell.Value) <> vbError Then
    ' do something
End If

The VarType function is also very useful to validate the data type. For example if your code expects a date value but sometimes encounters text, you can use this function to vet the data and handle exceptions gracefully.

answered Nov 22, 2011 at 19:18

Rachel Hettinger's user avatar

Rachel HettingerRachel Hettinger

7,7122 gold badges22 silver badges31 bronze badges

1

Here’s an snippet of code that records in the Immediate Window, the worksheet name, cell address and formula, where there is a spreadsheet formula error…

Dim ws As Worksheet, r As Range

For Each ws In Worksheets
    For Each r In ws.UsedRange
        If IsError(r.Value) Then
            Debug.Print r.Parent.Name, r.Address, r.Formula
        End If
    Next
Next

answered Nov 22, 2011 at 21:39

SkipVought's user avatar

1

Given your initial question was how do you detect errors in any cell of the workbook with VBA then you should be looking for a very efficient approach — looking at each cell is very expensive time wise!

Two options for this are:

  1. Use Excel’s SpecialCells to shortcut the process
  2. use my Mappit! addin which is configured to report on spreadsheet errors

For SpecialCells please see the code below. This takes advantage of the ready-made collection of errors that exist as formulas

Please that that constants also have an errors collection, so if you have copied then run a paste special as value on a formula error then you would need to use Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors) to detect these

You can use also detect SpecialCells manually by

  • Select all cells in the area of interest
  • Press F5
  • Click Special
  • select ‘Errors’ under ‘Formulas’ (or ‘Constants’)

enter image description here

Please be aware that prior to xl2010 there is a limit of 8192 areas that SpecialCells can handle

Sub ErrorList()
    Dim ws As Worksheet
    Dim rng1 As Range
    Dim strOut As String
    For Each ws In ActiveWorkbook.Sheets
        Set rng1 = Nothing
        On Error Resume Next
        Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
        On Error GoTo 0
        If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
    Next ws
    If Len(strOut) > 0 Then
        MsgBox "Error List:" & vbNewLine & strOut
    Else
        MsgBox "No Errors", vbInformation
    End If
End Sub

answered Nov 23, 2011 at 9:35

brettdj's user avatar

brettdjbrettdj

54.4k15 gold badges112 silver badges175 bronze badges

There’s another way to do handle this: add On Error Resume Next into your code (usually just put it before the loop).

If a cell is an error, it’ll just skip it and move to the next element in the loop :)

answered Nov 23, 2011 at 0:33

Gaijinhunter's user avatar

GaijinhunterGaijinhunter

14.4k4 gold badges50 silver badges57 bronze badges

4

Q: How do i determine if an error is in any cell in the entire workbook with Excel VBA?

Normally errors will be divide by 0 or #value errors, but this list is not exhaustive (or is it? — i don’t know if more exist)

Is there a way to determine if a cell contains an error then to skip over further processing in my script without spitting out a debug/warning/error message.

something such like

          if value in current.Workbook.cell is error then go to <jump>
           OR
          if value in old.Workbook.cell is error then go to <jump>

where jump is a marker at the end of an if statement but within a loop.

the script compares values between two workbooks and updates the current workbook with colours to show difference.

I have no VBA experience at all. but i get the gist of the script i have been given.

thank you kindly.

asked Nov 22, 2011 at 17:00

Mat's user avatar

MatMat

1,2211 gold badge22 silver badges46 bronze badges

1

You can skip cells with errors by using the VarType function. For example:

If VarType(ActiveCell.Value) <> vbError Then
    ' do something
End If

The VarType function is also very useful to validate the data type. For example if your code expects a date value but sometimes encounters text, you can use this function to vet the data and handle exceptions gracefully.

answered Nov 22, 2011 at 19:18

Rachel Hettinger's user avatar

Rachel HettingerRachel Hettinger

7,7122 gold badges22 silver badges31 bronze badges

1

Here’s an snippet of code that records in the Immediate Window, the worksheet name, cell address and formula, where there is a spreadsheet formula error…

Dim ws As Worksheet, r As Range

For Each ws In Worksheets
    For Each r In ws.UsedRange
        If IsError(r.Value) Then
            Debug.Print r.Parent.Name, r.Address, r.Formula
        End If
    Next
Next

answered Nov 22, 2011 at 21:39

SkipVought's user avatar

1

Given your initial question was how do you detect errors in any cell of the workbook with VBA then you should be looking for a very efficient approach — looking at each cell is very expensive time wise!

Two options for this are:

  1. Use Excel’s SpecialCells to shortcut the process
  2. use my Mappit! addin which is configured to report on spreadsheet errors

For SpecialCells please see the code below. This takes advantage of the ready-made collection of errors that exist as formulas

Please that that constants also have an errors collection, so if you have copied then run a paste special as value on a formula error then you would need to use Set rng1 = ws.Cells.SpecialCells(xlConstants, xlErrors) to detect these

You can use also detect SpecialCells manually by

  • Select all cells in the area of interest
  • Press F5
  • Click Special
  • select ‘Errors’ under ‘Formulas’ (or ‘Constants’)

enter image description here

Please be aware that prior to xl2010 there is a limit of 8192 areas that SpecialCells can handle

Sub ErrorList()
    Dim ws As Worksheet
    Dim rng1 As Range
    Dim strOut As String
    For Each ws In ActiveWorkbook.Sheets
        Set rng1 = Nothing
        On Error Resume Next
        Set rng1 = ws.Cells.SpecialCells(xlFormulas, xlErrors)
        On Error GoTo 0
        If Not rng1 Is Nothing Then strOut = strOut & (ws.Name & " has " & rng1.Cells.Count & " errors" & vbNewLine)
    Next ws
    If Len(strOut) > 0 Then
        MsgBox "Error List:" & vbNewLine & strOut
    Else
        MsgBox "No Errors", vbInformation
    End If
End Sub

answered Nov 23, 2011 at 9:35

brettdj's user avatar

brettdjbrettdj

54.4k15 gold badges112 silver badges175 bronze badges

There’s another way to do handle this: add On Error Resume Next into your code (usually just put it before the loop).

If a cell is an error, it’ll just skip it and move to the next element in the loop :)

answered Nov 23, 2011 at 0:33

Gaijinhunter's user avatar

GaijinhunterGaijinhunter

14.4k4 gold badges50 silver badges57 bronze badges

4

se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

1

Как задается условие «если ошибка» — #ЗНАЧ!

13.03.2018, 10:39. Показов 8792. Ответов 7

Метки нет (Все метки)


Подскажите, пожалуйста, как правильно задается условие «если ошибка»
Мне необходимо указать ошибку: #ЗНАЧ!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test3()
 
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To lastRow
        If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
        If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
'        If Cells(i, 6).Value = "#ЗНАЧ!" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = Error And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = "#Error" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = "#N/A" And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
        
    Next i
    
End Sub

Вложения

Тип файла: zip If_Error.zip (13.7 Кб, 1 просмотров)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

13.03.2018, 10:39

Ответы с готовыми решениями:

Какой функцией задать условие «Если область ячеек пустая» ?
Есть некий макрос, который шагает по рядам и окрашивает их в нужный цвет, или прячет, в зависимости…

Почему ошибка: «Next without for» если For абсолютно точно есть?
На строчку 23 мне тыкает

Sub isColNum()
Dim x As String, r As Long, c As Integer, numCount…

Если str довольно длинная,то выскакивает ошибка «type mismatch»
Делаю ODBC запрос,пишу .commandtext=array(str),где str=&quot;……..&quot;.Если str довольно длинная,то…

Создать цикл Анализ «что если»-«Подбор параметра.»
Добрый день.
В excel на работе есть классическая задача, которая решается с помощью подбора…

7

Hugo121

6874 / 2806 / 533

Регистрация: 19.10.2012

Сообщений: 8,550

13.03.2018, 10:41

2

Visual Basic
1
If Cells(i, 6).Value = CVErr(xlErrNA)

1

Казанский

15131 / 6405 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

13.03.2018, 11:52

3

se_arts, #ЗНАЧ! это CVErr(xlErrValue)
Если любое значение ошибки, то

Visual Basic
1
If iserror(Cells(i, 6).Value) then

2

se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

13.03.2018, 11:54

 [ТС]

4

Hugo121, выдает ошибку
Run-time error ’13’:
Type mismatch

Visual Basic
1
2
3
4
5
6
7
8
Sub test3()
   lastRow = Cells(Rows.Count, 1).End(xlUp).Row
   For i = 4 To lastRow
       If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
       If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
       If Cells(i, 6).Value = CVErr(xlErrNA) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
   Next i
End Sub

Данные:

Кликните здесь для просмотра всего текста

5 6

0 0
0 2
3 3
5 4
5
6 6
2 8
2
5 6
4 8
5
5 3
1 1
4 #ЗНАЧ!
6 5
5 6
2 8
4 9
6 8
7 8
7 8
5 2
4 7
4 8
3 4
3 5
3 1
3 2
4 7
4 6
4 8

0

se_arts

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

13.03.2018, 12:23

 [ТС]

5

Казанский,

убрал проверку 2-ого условия (And Cells(i, 5).Value <> «»), попробовал CVErr(xlErrValue) и для любой ошибки
тоже выдает ошибку:
Run-time error ’13’:
Type mismatch

Что я неправильно пишу или указываю в коде?
Находит только перове правильное значение с строке 4 и дальше переходит к макросу и показывает ошибку «13».

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub test3()
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To LastRow
        If Cells(i, 6).Value = 2 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 5
        If Cells(i, 6).Value = 5 And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 10
'        If IsError(Cells(i, 6).Value) Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = CVErr(xlErrNA) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
'        If Cells(i, 6).Value = CVErr(xlErrValue) And Cells(i, 5).Value <> "" Then Cells(i, 7).Value = 15
        If Cells(i, 6).Value = CVErr(xlErrValue) Then Cells(i, 7).Value = 15
    Next i
End Sub

Миниатюры

Как задается условие "если ошибка" - #ЗНАЧ!
 

Как задается условие "если ошибка" - #ЗНАЧ!
 

Вложения

Тип файла: zip If_Error.zip (13.8 Кб, 4 просмотров)

0

Vlad999

3815 / 2244 / 749

Регистрация: 02.11.2012

Сообщений: 5,894

13.03.2018, 15:16

6

IsError(Cells(i, 6).Value) не подошел?
и по моему у вас ЕСЛИ не правильно устроин.

Добавлено через 1 минуту
вариант

Visual Basic
1
2
3
4
5
6
7
8
9
10
If Cells(i, 5).Value <> "" Then
          If IsError(Cells(i, 6).Value) Then
             Cells(i, 7).Value = 15
          Else
             Select Case Cells(i, 6).Value
                 Case 2: Cells(i, 7).Value = 5
                 Case 5: Cells(i, 7).Value = 10
             End Select
          End If
End If

1

Hugo121

6874 / 2806 / 533

Регистрация: 19.10.2012

Сообщений: 8,550

13.03.2018, 22:37

7

Лучший ответ Сообщение было отмечено se_arts как решение

Решение

Посмотрел наконец файл — точно xlErrValue нужно:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test2()
 
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To lastRow
        If Cells(i, 5).Value <> "" Then
            Select Case CStr(Cells(i, 6).Value)
            Case CStr(CVErr(xlErrValue)): Cells(i, 7).Value = 15
            Case "2": Cells(i, 7).Value = 5
            Case "5": Cells(i, 7).Value = 10
            End Select
            End If
        Next i
 
    End Sub

Добавлено через 1 минуту
Или можно конечно искать просто «Error 2015»

1

0 / 0 / 0

Регистрация: 15.10.2016

Сообщений: 91

14.03.2018, 00:09

 [ТС]

8

Hugo121, заработало
Hugo121, Vlad999, Казанский — всем спасибо.

0

Точно так же, как мы используем ЕСЛИОШИБКА в Excel, чтобы знать, что делать, когда возникает ошибка перед каждой функцией, у нас есть встроенная функция ЕСЛИОШИБКА в VBA, которая используется таким же образом, поскольку это функция рабочего листа, мы используем эту функцию с worksheet.function метод в VBA, а затем мы предоставляем аргументы для функции.

Ожидать, что код будет работать без ошибок, — преступление. Для обработки ошибок в VBA у нас есть несколько способов использования таких операторов, как При ошибке Возобновить следующий VBAОператор VBA On Error Resume — это аспект обработки ошибок, используемый для игнорирования строки кода, из-за которой возникла ошибка, и продолжения со следующей строки сразу после строки кода с ошибкой.читать далее, При ошибке Возобновить Перейти к 0, При ошибке Перейти к метке. Обработчики ошибок VBA могут переходить только к следующей строке кода. Но в случае, если вычисление не происходит, нам нужно заменить ошибку на какое-то другое идентификационное слово. В этой статье мы увидим, как добиться этого с помощью VBA. ЕСЛИОШИБКА Функция в ExcelФункция ЕСЛИОШИБКА в Excel проверяет формулу (или ячейку) на наличие ошибок и возвращает указанное значение вместо ошибки.читать далее.

ЕСЛИ ОШИБКА VBA

Вы можете использовать это изображение на своем веб-сайте, в шаблонах и т. д. Пожалуйста, предоставьте нам ссылку на авторствоСсылка на статью должна быть гиперссылкой
Например:
Источник: VBA IFERROR (wallstreetmojo.com)

Как использовать ЕСЛИОШИБКА в VBA?

Здесь следует помнить, что это не Функция VBAФункции VBA служат основной цели для выполнения определенных вычислений и возврата значения. Поэтому в VBA мы используем синтаксис для указания параметров и типа данных при определении функции. Такие функции называются пользовательскими функциями.читать далее скорее просто как функция рабочего листа.

Вы можете скачать этот шаблон Excel VBA IFERROR здесь — Шаблон Excel для VBA ЕСЛИОШИБКА

Для примера возьмем приведенные выше данные только для демонстрации.

ЕСЛИ ОШИБКА VBA Пример 2

Шаг 1: Определите переменную как целое число.

Код:

Sub Iferror_Example1()

  Dim i As Integer

End Sub

Шаг 2: Для выполнения расчета откройте For Следующий цикл.

Код:

Sub Iferror_Example1()

  Dim i As Integer

  For i = 2 To 6

  Next i

End Sub

Шаг 3: Внутри напишите код как Ячейки(I,3).Значение =

Код:

Sub Iferror_Example1()

  Dim i As Integer

  For i = 2 To 6
     Cells(i,3).Value =
  Next i

End Sub

Шаг 4: Чтобы получить доступ к функции ЕСЛИОШИБКА, мы не можем просто ввести формулу; скорее, нам нужно использовать «Функция рабочего листа» класс.

Код:

Sub Iferror_Example1()

  Dim i As Integer

  For i = 2 To 6
    Cells(i, 3).Value = WorksheetFunction.If
  Next i

End Sub

ЕСЛИ ОШИБКА VBA Пример 2-1

Шаг 5: Как вы можете видеть на изображении выше, после вставки класса команды «WorksheetFunction» мы получаем формулу ЕСЛИОШИБКА. Выберите формулу.

Код:

Sub Iferror_Example1()

  Dim i As Integer

  For i = 2 To 6
    Cells(i, 3).Value = WorksheetFunction.IfError(
  Next i

End Sub

Пример 2-2

Шаг 6: Одна из проблем в VBA при доступе к функциям рабочего листа: мы не видим аргументы, подобные тому, что мы видели на рабочем листе. Вы должны быть уверены в аргументах, которые мы используем.

По этой причине, прежде чем я покажу вам IFERROR в VBA, я показал вам синтаксис функции рабочего листа.

Первый аргумент здесь — «Значение», т. е. какую ячейку вы хотите проверить? Перед этим примените расчет в Cell.

Пример 2-3

Теперь в VBA примените приведенные ниже коды.

Код:

Sub Iferror_Example1()

  Dim i As Integer

  For i = 2 To 6
    Cells(i, 4).Value = WorksheetFunction.IfError(Cells(i, 3).Value, "Not Found")
  Next i

End Sub

Теперь функция ЕСЛИОШИБКА проверяет наличие ошибок в столбце C. Если обнаруживается какая-либо ошибка, в столбце D отображается результат «Не найдено».

Пример 2-4

Таким образом, используя функцию ЕСЛИОШИБКА, мы можем изменить результаты по своему желанию. В этом случае я изменил результат как «Не обнаружена.» Вы можете изменить это по своему требованию.

Типы ошибок, VBA IFERROR, можно найти

Важно знать виды Эксель ошибкиОшибки в Excel распространены и часто возникают во время применения формул. Список из девяти наиболее распространенных ошибок Excel: #DIV/0, #N/A, #NAME?, #NULL!, #NUM!, #REF!, #VALUE!, #####, Circular Reference.читать далее функция ЕСЛИОШИБКА может обработать. Ниже приведены типы ошибок, которые может обработать IFERROR.

#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? или #NULL!.

УЗНАТЬ БОЛЬШЕ >>

Post Views: 805

В этом учебном материале вы узнаете, как использовать Excel функцию ЕОШИБКА с синтаксисом и примерами.

Описание

Функцию Microsoft Excel ЕОШИБКА можно использовать для проверки таких значений ошибок, как #Н/Д, #ЗНАЧ!, #ССЫЛКА!, #ДЕЛ/0!, #ЧИСЛО!, #ИМЯ? или #ПУСТО!.
Функция ЕОШИБКА — это встроенная в Excel функция, которая относится к категории информационных функций.
Её можно использовать как функцию рабочего листа (WS) и функцию VBA в Excel.
Как функцию рабочего листа, функция ЕОШИБКА может быть введена как часть формулы в ячейке рабочего листа.
В качестве функции VBA вы можете использовать функцию ISERROR в коде макросов, который вводится через редактор Microsoft Visual Basic.

Синтаксис

Синтаксис функции ЕОШИБКА в Microsoft Excel:

ЕОШИБКА(значение)

Аргументы или параметры

значение
Значение, которое вы хотите проверить.
Если значение является значением ошибки (#Н/Д, #ЗНАЧ!, #ССЫЛКА!, #ДЕЛ/0!, #ЧИСЛО!, #ИМЯ? или #ПУСТО!), функция ЕОШИБКА вернет ИСТИНА. В противном случае она вернет ЛОЖЬ.

Возвращаемое значение

Функция ЕОШИБКА возвращает ИСТИНА, если значение является любым значением ошибки (#Н/Д, #ЗНАЧ!, #ССЫЛКА!, #ДЕЛ/0!, #ЧИСЛО!, #ИМЯ? или #ПУСТО!).
В противном случае функция ЕОШИБКА возвращает ЛОЖЬ.

Применение

  • Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000

Тип функции

  • Функция рабочего листа (WS)
  • Функция VBA

Пример (как функция рабочего листа)

Рассмотрим несколько примеров функции ЕОШИБКА, чтобы понять, как использовать Excel функцию ЕОШИБКА в качестве функции рабочего листа в Microsoft Excel:

На основании, приведенной выше электронной таблицы Excel функция ЕОШИБКА вернет ИСТИНА, поскольку ячейка C2 содержит ошибку #ДЕЛ/0!:

=ЕОШИБКА(C2)

Результат: ИСТИНА

Однако функция ЕОШИБКА в ячейке E3 вернет ЛОЖЬ, потому что C3 содержит значение $0.50 и не является ошибкой:

=ЕОШИБКА(C3)

Результат: ЛОЖЬ

ЕОШИБКА не должна просто смотреть на значение в ячейке, вы также можете использовать функцию ЕОШИБКА для проверки результата формулы, например:

=ЕОШИБКА(9.75/0)

Результат: ИСТИНА

Если вы проверили, было ли деление 9,75 на 0 ошибкой, функция ЕОШИБКА также вернет ИСТИНА, поскольку эта формула вернет ошибку #ДЕЛ/0!.
См. еще примеры функции ЕОШИБКА:
как подсчитать ячейки, содержащие ошибки
как подсчитать ячейки, которые не содержат ошибок.

Затем рассмотрим пример использования функции ISERROR в коде Excel VBA. В нашем примере электронной таблицы мы создали кнопку на Листе2, которая называется «Содержит ли ячейка A2 ошибку?».
iserror
Когда мы нажимаем на эту кнопку, запускается следующий код VBA:

Sub TestIsErrorFunction()

‘Отображение функции IsError для ячейки A2 на Листе2

   MsgBox IsError(Лист2.Range(«A2»)), vbOKOnly, «В ячейке A2 есть ошибка?»

End Sub

Этот код VBA отобразит окно сообщения, в котором будет показано, содержит ли значение в ячейке A2 на листе Лист2 ошибку.
iserror_02
Поскольку ячейка A2 на листе Лист2 содержит ошибку #ДЕЛ/0!, в окне сообщения отображается True.

На чтение 8 мин. Просмотров 24k.

Mismatch Error

Содержание

  1. Объяснение Type Mismatch Error
  2. Использование отладчика
  3. Присвоение строки числу
  4. Недействительная дата
  5. Ошибка ячейки
  6. Неверные данные ячейки
  7. Имя модуля
  8. Различные типы объектов
  9. Коллекция Sheets
  10. Массивы и диапазоны
  11. Заключение

Объяснение Type Mismatch Error

Type Mismatch Error VBA возникает при попытке назначить значение между двумя различными типами переменных.

Ошибка отображается как:
run-time error 13 – Type mismatch

VBA Type Mismatch Error 13

Например, если вы пытаетесь поместить текст в целочисленную переменную Long или пытаетесь поместить число в переменную Date.

Давайте посмотрим на конкретный пример. Представьте, что у нас есть переменная с именем Total, которая является длинным целым числом Long.

Если мы попытаемся поместить текст в переменную, мы получим Type Mismatch Error VBA (т.е. VBA Error 13).

Sub TypeMismatchStroka()

    ' Объявите переменную типа long integer
    Dim total As Long
    
    ' Назначение строки приведет к Type Mismatch Error
    total = "Иван"
    
End Sub

Давайте посмотрим на другой пример. На этот раз у нас есть переменная ReportDate типа Date.

Если мы попытаемся поместить в эту переменную не дату, мы получим Type Mismatch Error VBA.

Sub TypeMismatchData()

    ' Объявите переменную типа Date
    Dim ReportDate As Date
    
    ' Назначение числа вызывает Type Mismatch Error
    ReportDate = "21-22"
    
End Sub

В целом, VBA часто прощает, когда вы назначаете неправильный тип значения переменной, например:

Dim x As Long

' VBA преобразует в целое число 100
x = 99.66

' VBA преобразует в целое число 66
x = "66"

Тем не менее, есть некоторые преобразования, которые VBA не может сделать:

Dim x As Long

' Type Mismatch Error
x = "66a"

Простой способ объяснить Type Mismatch Error VBA состоит в том, что элементы по обе стороны от равных оценивают другой тип.

При возникновении Type Mismatch Error это часто не так просто, как в этих примерах. В этих более сложных случаях мы можем использовать средства отладки, чтобы помочь нам устранить ошибку.

Использование отладчика

В VBA есть несколько очень мощных инструментов для поиска ошибок. Инструменты отладки позволяют приостановить выполнение кода и проверить значения в текущих переменных.

Вы можете использовать следующие шаги, чтобы помочь вам устранить любую Type Mismatch Error VBA.

  1. Запустите код, чтобы появилась ошибка.
  2. Нажмите Debug в диалоговом окне ошибки. Это выделит строку с ошибкой.
  3. Выберите View-> Watch из меню, если окно просмотра не видно.
  4. Выделите переменную слева от equals и перетащите ее в окно Watch.
  5. Выделите все справа от равных и перетащите его в окно Watch.
  6. Проверьте значения и типы каждого.
  7. Вы можете сузить ошибку, изучив отдельные части правой стороны.

Следующее видео показывает, как это сделать.

На скриншоте ниже вы можете увидеть типы в окне просмотра.

VBA Type Mismatch Watch

Используя окно просмотра, вы можете проверить различные части строки кода с ошибкой. Затем вы можете легко увидеть, что это за типы переменных.

В следующих разделах показаны различные способы возникновения Type Mismatch Error VBA.

Присвоение строки числу

Как мы уже видели, попытка поместить текст в числовую переменную может привести к Type Mismatch Error VBA.

Ниже приведены некоторые примеры, которые могут вызвать ошибку:

Sub TextErrors()

    ' Long - длинное целое число
    Dim l As Long
    l = "a"
    
    ' Double - десятичное число
    Dim d As Double
    d = "a"
    
   ' Валюта - 4-х значное число
    Dim c As Currency
    c = "a"
    
    Dim d As Double
    ' Несоответствие типов, если ячейка содержит текст
    d = Range("A1").Value
    
End Sub

Недействительная дата

VBA очень гибок в назначении даты переменной даты. Если вы поставите месяц в неправильном порядке или пропустите день, VBA все равно сделает все возможное, чтобы удовлетворить вас.

В следующих примерах кода показаны все допустимые способы назначения даты, за которыми следуют случаи, которые могут привести к Type Mismatch Error VBA.

Sub DateMismatch()

    Dim curDate As Date
    
    ' VBA сделает все возможное для вас
    ' - Все они действительны
    curDate = "12/12/2016"
    curDate = "12-12-2016"
    curDate = #12/12/2016#
    curDate = "11/Aug/2016"
    curDate = "11/Augu/2016"
    curDate = "11/Augus/2016"
    curDate = "11/August/2016"
    curDate = "19/11/2016"
    curDate = "11/19/2016"
    curDate = "1/1"
    curDate = "1/2016"
   
    ' Type Mismatch Error
    curDate = "19/19/2016"
    curDate = "19/Au/2016"
    curDate = "19/Augusta/2016"
    curDate = "August"
    curDate = "Какой-то случайный текст"

End Sub

Ошибка ячейки

Тонкая причина Type Mismatch Error VBA — это когда вы читаете из ячейки с ошибкой, например:

VBA Runtime Error

Если вы попытаетесь прочитать из этой ячейки, вы получите Type Mismatch Error.

Dim sText As String

' Type Mismatch Error, если ячейка содержит ошибку
sText = Sheet1.Range("A1").Value

Чтобы устранить эту ошибку, вы можете проверить ячейку с помощью IsError следующим образом.

Dim sText As String
If IsError(Sheet1.Range("A1").Value) = False Then
    sText = Sheet1.Range("A1").Value
End If

Однако проверка всех ячеек на наличие ошибок невозможна и сделает ваш код громоздким. Лучший способ — сначала проверить лист на наличие ошибок, а если ошибки найдены, сообщить об этом пользователю.

Вы можете использовать следующую функцию, чтобы сделать это:

Function CheckForErrors(rg As Range) As Long

    On Error Resume Next
    CheckForErrors = rg.SpecialCells(xlCellTypeFormulas, xlErrors).Count

End Function

Ниже приведен пример использования этого кода.

Sub DoStuff()

    If CheckForErrors(Sheet1.Range("A1:Z1000")) > 0 Then
        MsgBox "На листе есть ошибки. Пожалуйста, исправьте и запустите макрос снова."
        Exit Sub
    End If
    
    ' Продолжайте здесь, если нет ошибок

End Sub

Неверные данные ячейки

Как мы видели, размещение неверного типа значения в переменной вызывает Type Mismatch Error VBA. Очень распространенная причина — это когда значение в ячейке имеет неправильный тип.

Пользователь может поместить текст, такой как «Нет», в числовое поле, не осознавая, что это приведет к Type Mismatch Error в коде.

VBA Error 13

Если мы прочитаем эти данные в числовую переменную, то получим
Type Mismatch Error VBA.

Dim rg As Range
Set rg = Sheet1.Range("B2:B5")

Dim cell As Range, Amount As Long
For Each cell In rg
    ' Ошибка при достижении ячейки с текстом «Нет»
    Amount = cell.Value
Next rg

Вы можете использовать следующую функцию, чтобы проверить наличие нечисловых ячеек, прежде чем использовать данные.

Function CheckForTextCells(rg As Range) As Long

    ' Подсчет числовых ячеек
    If rg.Count = rg.SpecialCells(xlCellTypeConstants, xlNumbers).Count Then
        CheckForTextCells = True
    End If
    
End Function

Вы можете использовать это так:

Sub IspolzovanieCells()

    If CheckForTextCells(Sheet1.Range("B2:B6").Value) = False Then
        MsgBox "Одна из ячеек не числовая. Пожалуйста, исправьте перед запуском макроса"
        Exit Sub
    End If
    
    ' Продолжайте здесь, если нет ошибок

End Sub

Имя модуля

Если вы используете имя модуля в своем коде, это может привести к
Type Mismatch Error VBA. Однако в этом случае причина может быть не очевидной.

Например, допустим, у вас есть модуль с именем «Module1». Выполнение следующего кода приведет к о
Type Mismatch Error VBA.

Sub IspolzovanieImeniModulya()
    
    ' Type Mismatch Error
    Debug.Print module1

End Sub

VBA Type Mismatch Module Name

Различные типы объектов

До сих пор мы рассматривали в основном переменные. Мы обычно называем переменные основными типами данных.

Они используются для хранения одного значения в памяти.

В VBA у нас также есть объекты, которые являются более сложными. Примерами являются объекты Workbook, Worksheet, Range и Chart.

Если мы назначаем один из этих типов, мы должны убедиться, что назначаемый элемент является объектом того же типа. Например:

Sub IspolzovanieWorksheet()

    Dim wk As Worksheet
    
    ' действительный
    Set wk = ThisWorkbook.Worksheets(1)
    
    ' Type Mismatch Error
    ' Левая сторона - это worksheet - правая сторона - это workbook
    Set wk = Workbooks(1)

End Sub

Коллекция Sheets

В VBA объект рабочей книги имеет две коллекции — Sheets и Worksheets. Есть очень тонкая разница.

  1. Worksheets — сборник рабочих листов в Workbook
  2. Sheets — сборник рабочих листов и диаграммных листов в Workbook
  3.  

Лист диаграммы создается, когда вы перемещаете диаграмму на собственный лист, щелкая правой кнопкой мыши на диаграмме и выбирая «Переместить».

Если вы читаете коллекцию Sheets с помощью переменной Worksheet, она будет работать нормально, если у вас нет рабочей таблицы.

Если у вас есть лист диаграммы, вы получите
Type Mismatch Error VBA.

В следующем коде Type Mismatch Error появится в строке «Next sh», если рабочая книга содержит лист с диаграммой.

Sub SheetsError()

    Dim sh As Worksheet
    
    For Each sh In ThisWorkbook.Sheets
        Debug.Print sh.Name
    Next sh

End Sub

Массивы и диапазоны

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

Sub IspolzovanieMassiva()

    Dim arr As Variant
    
    ' Присвойте диапазон массиву
    arr = Sheet1.Range("A1:B2").Value
    
    ' Выведите значение в строку 1, столбец 1
    Debug.Print arr(1, 1)

End Sub

Проблема возникает, если ваш диапазон имеет только одну ячейку. В этом случае VBA не преобразует arr в массив.

Если вы попытаетесь использовать его как массив, вы получите
Type Mismatch Error .

Sub OshibkaIspolzovanieMassiva()

    Dim arr As Variant
    
    ' Присвойте диапазон массиву
    arr = Sheet1.Range("A1").Value
    
    ' Здесь будет происходить Type Mismatch Error
    Debug.Print arr(1, 1)

End Sub

В этом сценарии вы можете использовать функцию IsArray, чтобы проверить, является ли arr массивом.

Sub IspolzovanieMassivaIf()

    Dim arr As Variant
    
    ' Присвойте диапазон массиву
    arr = Sheet1.Range("A1").Value
    
    ' Здесь будет происходить Type Mismatch Error
    If IsArray(arr) Then
        Debug.Print arr(1, 1)
    Else
        Debug.Print arr
    End If

End Sub

Заключение

На этом мы завершаем статью об Type Mismatch Error VBA. Если у вас есть ошибка несоответствия, которая не раскрыта, пожалуйста, дайте мне знать в комментариях.

Проверка переменных и выражений с помощью встроенных функций VBA Excel: IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject.

Проверка переменных и выражений

Встроенные функции VBA Excel — IsArray, IsDate, IsEmpty, IsError, IsMissing, IsNull, IsNumeric, IsObject — проверяют значения переменных и выражений на соответствие определенному типу данных или специальному значению.

Синтаксис функций для проверки переменных и выражений:

Expression — выражение, переменная или необязательный аргумент для IsMissing.

Все функции VBA Excel для проверки переменных и выражений являются логическими и возвращают значение типа Boolean — True или False.

Функция IsArray

Описание функции

Функция IsArray возвращает значение типа Boolean, указывающее, является ли переменная массивом:

  • True — переменная является массивом;
  • False — переменная не является массивом.

Пример с IsArray

Sub Primer1()

Dim arr1(), arr2(1 To 10), arr3

    Debug.Print IsArray(arr1)  ‘Результат: True

    Debug.Print IsArray(arr2)  ‘Результат: True

    Debug.Print IsArray(arr3)  ‘Результат: False

arr3 = Array(1, 2, 3, 4, 5)

    Debug.Print IsArray(arr3)  ‘Результат: True

End Sub

Как показывает пример, функция IsArray возвращает True и в том случае, если переменная только объявлена как массив, но еще не содержит значений.

Функция IsDate

Описание функции

Функция IsDate возвращает логическое значение, указывающее, содержит ли переменная значение, которое можно интерпретировать как дату:

  • True — переменная содержит дату, выражение возвращает дату, переменная объявлена с типом As Date;
  • False — в иных случаях.

Пример с IsDate

Sub Primer2()

Dim d1 As String, d2 As Date

    Debug.Print IsDate(d1)  ‘Результат: False

    Debug.Print IsDate(d2)  ‘Результат: True

d1 = «14.01.2023»

    Debug.Print IsDate(d1)  ‘Результат: True

    Debug.Print IsDate(Now)  ‘Результат: True

End Sub

Функция IsEmpty

Описание функции

Функция IsEmpty возвращает значение типа Boolean, указывающее, содержит ли переменная общего типа (As Variant) значение Empty:

  • True — переменная содержит значение Empty;
  • False — переменной присвоено значение, отличное от Empty.

Пример с IsEmpty

Sub Primer3()

Dim s As String, v As Variant

    Debug.Print IsEmpty(s)  ‘Результат: False

    Debug.Print IsEmpty(v)  ‘Результат: True

v = 125

    Debug.Print IsEmpty(v)  ‘Результат: False

Range(«A1»).Clear

    Debug.Print IsEmpty(Range(«A1»))  ‘Результат: True

Range(«A1») = 123

    Debug.Print IsEmpty(Range(«A1»))  ‘Результат: False

End Sub

Как видно из примера, функцию IsEmpty можно использовать для проверки ячеек на содержание значения Empty (пустая ячейка общего формата).

Функция IsError

Описание функции

Функция IsError возвращает логическое значение, указывающее, является ли аргумент функции значением ошибки, определенной пользователем:

  • True — аргумент функции является значением ошибки, определенной пользователем;
  • False — в иных случаях.

Пользователь может определить одну или несколько ошибок для своей процедуры или функции с рекомендациями действий по ее (их) исправлению. Возвращается номер ошибки с помощью функции CVErr.

Пример с IsError

Допустим, пользователь определил, что ошибка №25 означает несоответствие аргумента функции Vkuba числовому формату:

Function Vkuba(x)

    If IsNumeric(x) Then

        Vkuba = x ^ 3

    Else

        Vkuba = CVErr(25)

    End If

End Function

Sub Primer4()

    Debug.Print Vkuba(5)  ‘Результат: 125

    Debug.Print IsError(Vkuba(5))  ‘Результат: False

    Debug.Print Vkuba(«пять»)  ‘Результат: Error 25

    Debug.Print IsError(Vkuba(«пять»))  ‘Результат: True

End Sub

Функция IsMissing

Описание функции

Функция IsMissing возвращает значение типа Boolean, указывающее, был ли необязательный аргумент типа данных Variant передан процедуре:

  • True — если в процедуру не было передано значение для необязательного аргумента;
  • False — значение для необязательного аргумента было передано в процедуру.

Пример с IsMissing

Function Scepka(x, Optional y)

    If Not IsMissing(y) Then

        Scepka = x & y

    Else

        Scepka = x & » (а необязательный аргумент не подставлен)»

    End If

End Function

Sub Primer5()

    Debug.Print Scepka(«Тропинка», » в лесу»)  ‘Результат: Тропинка в лесу

    Debug.Print Scepka(«Тропинка»)  ‘Результат: Тропинка (а необязательный аргумент не подставлен)

End Sub

Функция IsNull

Описание функции

Функция IsNull возвращает логическое значение, указывающее, является ли Null значением переменной или выражения:

  • True — значением переменной или выражения является Null;
  • False — в иных случаях.

Пример с IsNull

Функция IsNull особенно необходима из-за того, что любое условие с выражением, в которое входит ключевое слово Null, возвращает значение False:

Sub Primer6()

Dim Var

Var = Null

    If Var = Null Then Debug.Print Var  ‘Результат: «»

    If Var <> Null Then Debug.Print Var  ‘Результат: «»

    If IsNull(Var) Then Debug.Print Var  ‘Результат: Null

End Sub

Функция IsNumeric

Описание функции

Функция IsNumeric возвращает значение типа Boolean, указывающее, можно ли значение выражения или переменной рассматривать как число:

  • True — если аргумент функции может рассматриваться как число;
  • False — в иных случаях.

Пример с IsNumeric

Sub Primer7()

Debug.Print IsNumeric(«3,14»)  ‘Результат: True

Debug.Print IsNumeric(«четыре»)  ‘Результат: False

End Sub

Функция IsObject

Описание функции

Функция IsObject возвращает логическое значение, указывающее, является ли переменная объектной:

  • True — переменная содержит ссылку на объект или значение Nothing;
  • False — в иных случаях.

Функция IsObject актуальна для переменных типа Variant, которые могут содержать как ссылки на объекты, так и значения других типов данных.

Пример с IsObject

Sub Primer8()

Dim myObj As Object, myVar As Variant

    Debug.Print IsObject(myObj)  ‘Результат: True

    Debug.Print IsObject(myVar)  ‘Результат: False

Set myVar = ActiveSheet

    Debug.Print IsObject(myVar)  ‘Результат: True

End Sub


Понравилась статья? Поделить с друзьями:
  • Vba excel проверка типов данных
  • Vba excel проверка существования объекта
  • Vba excel проверка символа в ячейке
  • Vba excel проверка объединения ячеек
  • Vba excel проверка на целое число