Ошибка type mismatch в excel это

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

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

ThaiAZ

0 / 0 / 0

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

Сообщений: 22

1

Excel

Сегодня, 11:28. Показов 127. Ответов 5

Метки #vba #excel (Все метки)


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

Задание: Извлечь корень из числа a, если оно кратно 11, в противном случае вычесть из числа a число 6. При выполнении следующего кода возникает ошибка run-time error ’13’ type mismatch. Как можно исправить?

Visual Basic
1
2
3
4
5
6
7
8
9
10
Public Sub ИзвлечениеКорня()
Dim a, Result As Single
    a = Range("A2:A6").Value
    Result = Range("B2:B6").Value
If a / 11 Then
    Result = Sqr(a)
Else
    Result = a - 6
End If
    End Sub



0



Programming

Эксперт

94731 / 64177 / 26122

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

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

Сегодня, 11:28

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

Ошибка 13:Type mismatch
Ошибка 13:Type mismatch
Здравствуйте,если не сложно посмотрите и скажите,что же я делаю не так?

Ошибка Type Mismatch
Здравствуйте, нам консультанты составили калькулятор в excel и честно говоря пропали. У нас к…

Ошибка 13 type mismatch
Добрый день. Помогите пожалуйста с вложенными циклами.
Код должен проверять значения ячеек и…

Ошибка 13 type mismatch
Помогите пожалуйста разаобаться с ошибкой
в коде.Буду признателен.

Ошибка 13
type mismath

5

SergioJek

307 / 197 / 40

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

Сообщений: 300

Сегодня, 11:47

2

Цитата
Сообщение от ThaiAZ
Посмотреть сообщение

Visual Basic
1
2
    a = Range("A2:A6").Value
    Result = Range("B2:B6").Value

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

Кратность числа а числу 11 можно проверить так

Visual Basic
1
if (a mod 11)=0 then ...



0



Narimanych

2632 / 1637 / 745

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

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

Сегодня, 11:49

3

ThaiAZ,

Visual Basic
1
2
3
4
5
6
7
8
9
Sub mmm()
a = InputBox("enter A >=0")
    If a Mod 11 = 0 Then
     Result = Sqr(a)
    Else
     Result = a - 6
    End If
MsgBox "Result= " & Result
End Sub



0



ᴁ®

Эксперт MS Access

3070 / 1736 / 361

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

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

Записей в блоге: 4

Сегодня, 11:53

4

Цитата
Сообщение от ThaiAZ
Посмотреть сообщение

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

1 вариант обращаться к переменной как к массиву, ведь вы передаете переменной целый диапазон ячеек
2 вариант превратить это в функцию, которой передается значение 1-й ячейки, а возвращается то , что вы посчитали.
Условие кратности тоже определяете не правильно.



0



344 / 206 / 78

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

Сообщений: 591

Сегодня, 12:15

5

ThaiAZ, Ошибок несколько
— в строке 4 вы пытаетесь присвоить простой переменной типа Single значения из диапазона, то есть создать массив. Это ошибка. Переменная должна быть типа Variant. И вообще эта строчка не нужна, удалите ее.
— в строке 5 две ошибки — переменная a это массив, поскольку в строке 3 вы присвоили переменной типа Variant значения диапазона и обращаться к ней нужно с указанием индекса a(0)…a(5), и вторая ошибка — неверно записано условие проверки на кратность, должно быть так a(0) Mod 11 = 0.
В результате будет обработано значение из ячейки A2, если нужно обработать значения из всего диапазона, то потребуется цикл.
И последнее, в макросе не предусмотрен никакой вывод результатов.



0



0 / 0 / 0

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

Сообщений: 22

Сегодня, 12:15

 [ТС]

6

Спасибо большое!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

Сегодня, 12:15

6

 

Nkor

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

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

Добрый день.
Необходимо просуммировать произведения ячеек  3 и 5 столбцов  при условии, что ячейка 6 столбца той же строки >0 и вывести
в ячейке В17 сумму этих произведений.

Но при нажатии на кнопку Рассчитать возникает ошибка 13 Type Mismatch — ошибка типа данных.
Не могу понять, где именно ошибка Интересно, что если поставить условие <0 или = ,то расчет происходит, а если больше нуля, то ошибка..
Подскажите плиз.

Прикрепленные файлы

  • Книга1.xls (68.5 КБ)

Изменено: Nkor20.03.2015 20:55:58

 

МВТ

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

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

#2

20.03.2015 21:09:11

Попробуйте так

Код
Sub CMD_Click()
Dim Sm As Double
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(i, 6).Value > 0 Then Sm = Sm + Cells(i, 3) * Cells(i, 5)
Next i
Cells(17, 2).Value = Sm
End Sub

 

Используйте формулу =СУММПРОИЗВ((F2:F14>0)*C2:C14*E2:E14)

 

Hugo

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

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

#4

20.03.2015 21:32:16

Цитата
Nkor написал: Не могу понять, где именно ошибка

А слабо посмотреть что в тех ячейках, которые суммируются в той строке, на которой ошибка?

 

Nkor

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

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

Да, посмотрела. И толку? Программа ясно пишет — ошибка типа данных.  Я типы даже насильно меняла с помощью CDbl() и на листе типы к одному типу приводила. Не помогает. Перечитала статью о типах данных — не понимаю, в чем дело, что программу не устраивает. Может, все же подскажете?

 

Владимир

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

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

Игорь, скажи пожалуйста, а как просматривать  ошибки в принципе.. Дабы понимать, что тутова такое .. Может переменная неправильно обозванна или …
————-
В формуле можно нажать F9. А как это можно сделать в VBA-писаниии.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Nkor

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

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

#7

20.03.2015 22:45:10

Цитата
AKSENOV048 написал: =СУММПРОИЗВ((F2:F14>0)*C2:C14*E2:E14)

Спасибо за формулу. У меня вот такая формула на массивах работает:{ =СУММ(ЕСЛИ(F2:F14>0;C2:C14*E2:E14;0))}. Ваша версия тоже отличная, как то про СУММРОИЗВ я не догадалась, она гораздо проще. Но я VBA учу. Никак форматы данных не даются. Вечная ошибка 13

Изменено: Nkor21.03.2015 02:34:05

 

Alexander88

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

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

#8

20.03.2015 22:55:16

Так попробуйте:

Код
For i = 2 To n - 1
 

Nkor

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

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

МВТ, да, макрос отлично работает. Спасибо за пример, освою обязательно.
Одно плохо — у меня с типами данных какие то нелады, хожу по кругу и из раза в раз ошибки по типам данных.
А не подскажете все-таки, что я с типом данных в своем коде не так сделала? Иначе потом опять на форуме людей по ерунде беспокоить.
Все равно, большое спасибо!

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

Вообще основной косяк в том, что Вы с первой строки обрабатываете. А там заголовки. Значит тип данных — текст. Значит и умножить его нельзя. Отсюда и ошибка типа данных.
For i = 1 To n
нужно
For i = 2 To n

Владимир, по сути есть несколько способов посмотреть(все никак руки не дойдут накатать статью по отладке кода):
Как только появилось окно ошибки, нажать Debug и посмотреть строку ошибки. Навести мышь на переменную — появится всплывающая подсказка, показывающая текущее значение этой переменной.
Однако есть случаи, когда наведение не даст результата. Как правило это не объявленные как переменные объекты(как в этом случае — Cells). Этот объект не всегда может быть вычислен в памяти в момент отладки. Поэтому здесь нужно сначала отобразить окно Immediate(отобразить можно сочетанием клавиш Ctrl+G или через меню View-Immediate Window). Затем скопировать полностью нужную переменную(Cells(i, 3).Value) и в окне Immediate написать:
?
и после вопр.знака вставить скопированное. Должно получиться:
?Cells(i, 3).Value

И нажать Enter. Строкой ниже в этом окне будет выведено значение для объекта(если оно может быть получено)

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Hugo

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

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

#11

20.03.2015 23:03:22

Цитата
Nkor написал: Да, посмотрела. И толку?

И что в тех ячейках? Получится это сложить и перемножить?

Для Владимира — в данном коде при ошибке выделяется жёлтым строка кода, наводим курсор на перенную i — видим её значение, смотрим на лист в эту строку.
Так же можно посмотреть значение переменной в окне Locals.
Можно временно добавить в код строку Debug.Print Cells(i, 3).Value выше строки с ошибкой и смотреть что выводится в окно Immediate при пошаговом прогоне кода.

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

По сути, если не уверены в данных — можно сделать отдельную функцию, которая будет проверять, является ли числом. Или применить IsNumeric(). Все зависит от задачи и от обрабатываемых данных. Я часто делал именно отдельную функцию, которая преобразовывала «неверные» числа в нормальные для пересчета(приводила к нужному типу, заменяя пробелы и иные знаки на нужные). Если текст вообще ничего общего с числом не имел — функция возвращала 0.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Владимир

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

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

Я тот, кто только  начал изучать VBA — интересная штука оказывается..
Но иной раз натыкаюсь на ошибку и целые сутки её… Вообщем, как решать проблему, когда строка становится жёлтой?

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Nkor

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

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

#14

20.03.2015 23:26:37

Цитата
Hugo написал: А слабо посмотреть что в тех ячейках, которые суммируются в той строке, на которой ошибка?

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

 

Nkor

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

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

#15

20.03.2015 23:33:20

Цитата
Alexander88 написал:  For   i = 2   To   n — 1

Действительно. Только не n-1 а n+1 — так все корректно работает. Оказалось, что у меня в коде счетчик захватывает первую строку, где вместо чисел — текст. Отсюда несоответствие типов и ошибка 13. Спасибо!

 

Nkor

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

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

Дада, спасибо большое, я это уже обнаружила. Плохо то, что такая ошибка из раза в раз. Теперь проблема — как со своей внимательностью бороться, чтобы косяков таких глупых не было :-))))
Огромное спасибо и приятных выходных!

 

Юрий М

Модератор

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

Контакты см. в профиле

Nkor, кнопка цитирования НЕ ДЛЯ ответа. Неужели нельзя просто ответить?

 

JeyCi

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

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

#18

19.08.2017 19:05:23

Цитата
The_Prist написал: Я часто делал именно отдельную функцию, которая преобразовывала «неверные» числа в нормальные для пересчета

The_Prist

спасибо!
действительно, помогло!

Код
Public Function ISNUMBER(S As String) As Long
    On Error Resume Next
    ISNUMBER = 1 * S
End Function

и проверка в Основной процедуре: ISNUMBER(CStr(a(i, 1))) <> 0 … когда по массиву встречаются, как числа, так и текст… нулевых нет и быть не может… поэтому на скорую руку так (для моего случая)

Изменено: JeyCi20.08.2017 18:13:06

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

I receive Runtime Error ’13’: Type Mismatch when I try to run the code. Debug highlights the ‘IF’ and ‘ElseIF’ statements, but I can’t figure out where the mistake is. Any help would be appreciated. Thanks

Dim lColumn As Long
lColumn = ws.Cells(2, Columns.Count).End(xlToLeft).Column

Dim rgMonth As Range
Dim rgTaxExp As Range

Dim i As Long, j As Long
Set rgTaxExp = Range(Cells(lRow, 10), Cells(lRow, lColumn))

Set rgMonth = Range(Cells(2, 10), Cells(2, lColumn))
For i = 1 To rgMonth.Rows.Count
For j = 1 To rgMonth.Columns.Count

If Month(date2) >= Month(rgMonth.Cells(i, j).Value) Then 'Runtime Error '13':_
Type Mismatch
Cells(lRow, 9).Copy rgTaxExp.Cells(i, j)
ElseIf Month(date2) < Month(rgMonth.Cells(i, j).Value) Then 'Runtime Error '13':_
Type Mismatch
rgTaxExp.Cells(i, j) = 0

Community's user avatar

asked Jun 28, 2013 at 15:18

user2532363's user avatar

5

As the error message states, either Month(date2) or Month(rgMonth.Cells(i, j).Value) is failing at some point in your loop.

Insert two debug statements before the If statement that is causing the error:

For j = 1 To rgMonth.Columns.Count

Debug.Print "date2 is " & date2
Debug.Print "rgMonth.Cells(i, j).Value is " & rgMonth.Cells(i, j).Value

If Month(date2) >= Month(rgMonth.Cells(i, j).Value) Then 'Runtime Error '13':_
Type Mismatch

Run your code. When you get to the error, debug and take a look at the Immediate window. The last 2 lines should show you why the error is occurring.

If you don’t see the Immediate window, you can open it by selecting View —> Immediate Window from within the Visual Basic Editor.

answered Jun 28, 2013 at 21:08

Jon Crowell's user avatar

Jon CrowellJon Crowell

21.5k14 gold badges88 silver badges110 bronze badges

Home / VBA / VBA Type Mismatch Error (Error 13)

Type Mismatch (Error 13) occurs when you try to specify a value to a variable that doesn’t match with its data type. In VBA, when you declare a variable you need to define its data type, and when you specify a value that is different from that data type you get the type mismatch error 13.

In this tutorial, we will see what the possible situations are where runtime error 13 can occurs while executing a code.

Type Mismatch Error with Date

In VBA, there is a specific data type to deal with dates and sometimes it happens when you using a variable to store a date and somehow the value you specify is different.

In the following code, I have declared a variable as the date and then I have specified the value from cell A1 where I am supposed to have a date only. But as you can see the date that I have in cell one is not in the correct format VBA is not able to identify it as a date.

Sub myMacro()
Dim iVal As Date
iVal = Range("A1").Value
End Sub

Type Mismatch Error with Number

You’re gonna have you can have the same error while dealing with numbers where you get a different value when you trying to specify a number to a variable.

In the following example, you have an error in cell A1 which is supposed to be a numeric value. So when you run the code, VBA shows you the runtime 13 error because it cannot identify the value as a number.

Sub myMacro()
Dim iNum As Long
iNum = Range("A6").Value
End Sub

Runtime Error 6 Overflow

In VBA, there are multiple data types to deal with numbers and each of these data types has a range of numbers that you can assign to it. But there is a problem when you specify a number that is out of the range of the data type.

In that case, we will show you runtime error 6 overflow which indicates you need to change the data type and the number you have specified is out of the range.

Other Situations When it can Occurs

There might be some other situations in that you could face the runtime error 14: Type Mismatch.

  1. When you assign a range to an array but that range only consists of a single cell.
  2. When you define a variable as an object but by writing the code you specify a different object to that variable.
  3. When you specify a variable as a worksheet but use sheets collection in the code or vice versa.

How to Fix Type Mismatch (Error 13)

The best way to deal with this error is to use to go to the statement to run a specific line of code or show a message box to the user when the error occurs. But you can also check the court step by step before executing it. For this, you need to use VBA’s debug tool, or you can also use the shortcut key F8.

Понравилась статья? Поделить с друзьями:
  • Ошибка temp word windows 10
  • Ошибка stdole32 tlb excel 2007 на виндовс 10
  • Ошибка save в word
  • Ошибка runtime error 1004 excel
  • Ошибка out of memory excel vba