MyTetra Share
Делитесь знаниями!
Разбор ошибки Type Mismatch Error
Время создания: 12.10.2019 20:23
Раздел: Разные закладки - VBA - Меню VB-справка
Запись: xintrea/mytetra_db_adgaver_new/master/base/1570882515y9yrcdqpxz/text.html на raw.githubusercontent.com

Разбор ошибки Type 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

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

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

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


1

2

3

4

5

6

7

8

9

Sub TypeMismatchStroka()

 

    ' Объявите переменную типа long integer

    Dim total As Long

     

    ' Назначение строки приведет к Type Mismatch Error

    total = "Иван"

     

End Sub

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

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


1

2

3

4

5

6

7

8

9

Sub TypeMismatchData()

 

    ' Объявите переменную типа Date

    Dim ReportDate As Date

     

    ' Назначение числа вызывает Type Mismatch Error

    ReportDate = "21-22"

     

End Sub

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


1

2

3

4

5

6

7

Dim x As Long

 

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

x = 99.66

 

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

x = "66"

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


1

2

3

4

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. Вы можете сузить ошибку, изучив отдельные части правой стороны.

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

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

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

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

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

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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 — это когда вы читаете из ячейки с ошибкой, например:

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


1

2

3

4

Dim sText As String

 

' Type Mismatch Error, если ячейка содержит ошибку

sText = Sheet1.Range("A1").Value

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


1

2

3

4

Dim sText As String

If IsError(Sheet1.Range("A1").Value) = False Then

    sText = Sheet1.Range("A1").Value

End If

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

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


1

2

3

4

5

6

Function CheckForErrors(rg As Range) As Long

 

    On Error Resume Next

    CheckForErrors = rg.SpecialCells(xlCellTypeFormulas, xlErrors).Count

 

End Function

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


1

2

3

4

5

6

7

8

9

10

Sub DoStuff()

 

    If CheckForErrors(Sheet1.Range("A1:Z1000")) > 0 Then

        MsgBox "На листе есть ошибки. Пожалуйста, исправьте и запустите макрос снова."

        Exit Sub

    End If

     

    ' Продолжайте здесь, если нет ошибок

 

End Sub

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

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

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

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


1

2

3

4

5

6

7

8

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

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


1

2

3

4

5

6

7

8

Function CheckForTextCells(rg As Range) As Long

 

    ' Подсчет числовых ячеек

    If rg.Count = rg.SpecialCells(xlCellTypeConstants, xlNumbers).Count Then

        CheckForTextCells = True

    End If

     

End Function

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


1

2

3

4

5

6

7

8

9

10

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.


1

2

3

4

5

6

Sub IspolzovanieImeniModulya()

     

    ' Type Mismatch Error

    Debug.Print module1

 

End Sub


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

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

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

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

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


1

2

3

4

5

6

7

8

9

10

11

12

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», если рабочая книга содержит лист с диаграммой.


1

2

3

4

5

6

7

8

9

Sub SheetsError()

 

    Dim sh As Worksheet

     

    For Each sh In ThisWorkbook.Sheets

        Debug.Print sh.Name

    Next sh

 

End Sub

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

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


1

2

3

4

5

6

7

8

9

10

11

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 .


1

2

3

4

5

6

7

8

9

10

11

Sub OshibkaIspolzovanieMassiva()

 

    Dim arr As Variant

     

    ' Присвойте диапазон массиву

    arr = Sheet1.Range("A1").Value

     

    ' Здесь будет происходить Type Mismatch Error

    Debug.Print arr(1, 1)

 

End Sub

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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. Если у вас есть ошибка несоответствия, которая не раскрыта, пожалуйста, дайте мне знать в комментариях.

Источник

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования