На чтение 8 мин. Просмотров 27.8k.
Содержание
- Объяснение Type Mismatch Error
- Использование отладчика
- Присвоение строки числу
- Недействительная дата
- Ошибка ячейки
- Неверные данные ячейки
- Имя модуля
- Различные типы объектов
- Коллекция Sheets
- Массивы и диапазоны
- Заключение
Объяснение Type Mismatch Error
Type Mismatch Error VBA возникает при попытке назначить значение между двумя различными типами переменных.
Ошибка отображается как:
run-time error 13 – Type mismatch
Например, если вы пытаетесь поместить текст в целочисленную переменную 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.
- Запустите код, чтобы появилась ошибка.
- Нажмите Debug в диалоговом окне ошибки. Это выделит строку с ошибкой.
- Выберите View-> Watch из меню, если окно просмотра не видно.
- Выделите переменную слева от equals и перетащите ее в окно Watch.
- Выделите все справа от равных и перетащите его в окно 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 — это когда вы читаете из ячейки с ошибкой, например:
Если вы попытаетесь прочитать из этой ячейки, вы получите 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 в коде.
Если мы прочитаем эти данные в числовую переменную, то получим
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 у нас также есть объекты, которые являются более сложными. Примерами являются объекты 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. Есть очень тонкая разница.
- Worksheets — сборник рабочих листов в Workbook
- Sheets — сборник рабочих листов и диаграммных листов в Workbook
Лист диаграммы создается, когда вы перемещаете диаграмму на собственный лист, щелкая правой кнопкой мыши на диаграмме и выбирая «Переместить».
Если вы читаете коллекцию 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. Если у вас есть ошибка несоответствия, которая не раскрыта, пожалуйста, дайте мне знать в комментариях.
Nkor Пользователь Сообщений: 14 |
Добрый день. Но при нажатии на кнопку Рассчитать возникает ошибка 13 Type Mismatch — ошибка типа данных. Прикрепленные файлы
Изменено: Nkor — 20.03.2015 20:55:58 |
МВТ Пользователь Сообщений: 1198 |
#2 20.03.2015 21:09:11 Попробуйте так
|
||
Используйте формулу =СУММПРОИЗВ((F2:F14>0)*C2:C14*E2:E14) |
|
Hugo Пользователь Сообщений: 23371 |
#4 20.03.2015 21:32:16
А слабо посмотреть что в тех ячейках, которые суммируются в той строке, на которой ошибка? |
||
Nkor Пользователь Сообщений: 14 |
Да, посмотрела. И толку? Программа ясно пишет — ошибка типа данных. Я типы даже насильно меняла с помощью CDbl() и на листе типы к одному типу приводила. Не помогает. Перечитала статью о типах данных — не понимаю, в чем дело, что программу не устраивает. Может, все же подскажете? |
Владимир Пользователь Сообщений: 8196 |
Игорь, скажи пожалуйста, а как просматривать ошибки в принципе.. Дабы понимать, что тутова такое .. Может переменная неправильно обозванна или … «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Nkor Пользователь Сообщений: 14 |
#7 20.03.2015 22:45:10
Спасибо за формулу. У меня вот такая формула на массивах работает:{ =СУММ(ЕСЛИ(F2:F14>0;C2:C14*E2:E14;0))}. Ваша версия тоже отличная, как то про СУММРОИЗВ я не догадалась, она гораздо проще. Но я VBA учу. Никак форматы данных не даются. Вечная ошибка 13 Изменено: Nkor — 21.03.2015 02:34:05 |
||
Alexander88 Пользователь Сообщений: 400 |
#8 20.03.2015 22:55:16 Так попробуйте:
|
||
Nkor Пользователь Сообщений: 14 |
МВТ, да, макрос отлично работает. Спасибо за пример, освою обязательно. |
The_Prist Пользователь Сообщений: 14264 Профессиональная разработка приложений для MS Office |
Вообще основной косяк в том, что Вы с первой строки обрабатываете. А там заголовки. Значит тип данных — текст. Значит и умножить его нельзя. Отсюда и ошибка типа данных. Владимир, по сути есть несколько способов посмотреть(все никак руки не дойдут накатать статью по отладке кода): И нажать Enter. Строкой ниже в этом окне будет выведено значение для объекта(если оно может быть получено) Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Hugo Пользователь Сообщений: 23371 |
#11 20.03.2015 23:03:22
И что в тех ячейках? Получится это сложить и перемножить? Для Владимира — в данном коде при ошибке выделяется жёлтым строка кода, наводим курсор на перенную i — видим её значение, смотрим на лист в эту строку. |
||
The_Prist Пользователь Сообщений: 14264 Профессиональная разработка приложений для MS Office |
По сути, если не уверены в данных — можно сделать отдельную функцию, которая будет проверять, является ли числом. Или применить IsNumeric(). Все зависит от задачи и от обрабатываемых данных. Я часто делал именно отдельную функцию, которая преобразовывала «неверные» числа в нормальные для пересчета(приводила к нужному типу, заменяя пробелы и иные знаки на нужные). Если текст вообще ничего общего с числом не имел — функция возвращала 0. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Владимир Пользователь Сообщений: 8196 |
Я тот, кто только начал изучать VBA — интересная штука оказывается.. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Nkor Пользователь Сообщений: 14 |
#14 20.03.2015 23:26:37
Спасибо, повнимательнее потаращила глаза на ячейки и обнаружила, что мой код пытается считывать данные столбца с первой строки. а в первой ячейке вместо числа — название столбца, текст. Отсюда и ошибка несоответствия типов данных. Сдвинула нумерацию считываемых ячеек на 1 вниз и получила результат. Благодарю еще раз. |
||
Nkor Пользователь Сообщений: 14 |
#15 20.03.2015 23:33:20
Действительно. Только не n-1 а n+1 — так все корректно работает. Оказалось, что у меня в коде счетчик захватывает первую строку, где вместо чисел — текст. Отсюда несоответствие типов и ошибка 13. Спасибо! |
||
Nkor Пользователь Сообщений: 14 |
Дада, спасибо большое, я это уже обнаружила. Плохо то, что такая ошибка из раза в раз. Теперь проблема — как со своей внимательностью бороться, чтобы косяков таких глупых не было :-)))) |
Юрий М Модератор Сообщений: 60763 Контакты см. в профиле |
Nkor, кнопка цитирования НЕ ДЛЯ ответа. Неужели нельзя просто ответить? |
JeyCi Пользователь Сообщений: 3387 |
#18 19.08.2017 19:05:23
The_Prist спасибо!
и проверка в Основной процедуре: ISNUMBER(CStr(a(i, 1))) <> 0 … когда по массиву встречаются, как числа, так и текст… нулевых нет и быть не может… поэтому на скорую руку так (для моего случая) Изменено: JeyCi — 20.08.2017 18:13:06 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
Contents
- 1 VBA Type Mismatch Explained
- 2 VBA Type Mismatch YouTube Video
- 3 How to Locate the Type Mismatch Error
- 4 Assigning a string to a numeric
- 5 Invalid date
- 6 Cell Error
- 7 Invalid Cell Data
- 8 Module Name
- 9 Different Object Types
- 10 Sheets Collection
- 11 Array and Range
- 12 Conclusion
- 13 What’s Next?
VBA Type Mismatch Explained
A VBA Type Mismatch Error occurs when you try to assign a value between two different variable types.
The error appears as “run-time error 13 – Type mismatch”.
For example, if you try to place text in a Long integer variable or you try to place text in a Date variable.
Let’s look at a concrete example. Imagine we have a variable called Total which is a Long integer.
If we try to place text in the variable we will get the VBA Type mismatch error(i.e. VBA Error 13).
' https://excelmacromastery.com/ Sub TypeMismatchString() ' Declare a variable of type long integer Dim total As Long ' Assigning a string will cause a type mismatch error total = "John" End Sub
Let’s look at another example. This time we have a variable ReportDate of type Date.
If we try to place a non-date in this variable we will get a VBA Type mismatch error
' https://excelmacromastery.com/ Sub TypeMismatchDate() ' Declare a variable of type Date Dim ReportDate As Date ' Assigning a number causes a type mismatch error ReportDate = "21-22" End Sub
In general, VBA is very forgiving when you assign the wrong value type to a variable e.g.
Dim x As Long ' VBA will convert to integer 100 x = 99.66 ' VBA will convert to integer 66 x = "66"
However, there are some conversions that VBA cannot do
Dim x As Long ' Type mismatch error x = "66a"
A simple way to explain a VBA Type mismatch error, is that the items on either side of the equals evaluate to a different type.
When a Type mismatch error occurs it is often not as simple as these examples. For these more complex cases we can use the Debugging tools to help us resolve the error.
VBA Type Mismatch YouTube Video
Don’t forget to check out my YouTube video on the Type Mismatch Error here:
How to Locate the Type Mismatch Error
The most important thing to do when solving the Type Mismatch error is to, first of all, locate the line with the error and then locate the part of the line that is causing the error.
If your code has Error Handling then it may not be obvious which line has the error.
If the line of code is complex then it may not be obvious which part is causing the error.
The following video will show you how to find the exact piece of code that causes a VBA Error in under a minute:
The following sections show the different ways that the VBA Type Mismatch error can occur.
Assigning a string to a numeric
As we have seen, trying to place text in a numeric variable can lead to the VBA Type mismatch error.
Below are some examples that will cause the error
' https://excelmacromastery.com/ Sub TextErrors() ' Long is a long integer Dim l As Long l = "a" ' Double is a decimal number Dim d As Double d = "a" ' Currency is a 4 decimal place number Dim c As Currency c = "a" Dim d As Double ' Type mismatch if the cell contains text d = Range("A1").Value End Sub
Invalid date
VBA is very flexible when it comes to assigning a date to a date variable. If you put the month in the wrong order or leave out the day, VBA will still do it’s best to accommodate you.
The following code examples show all the valid ways to assign a date followed by the cases that will cause a VBA Type mismatch error.
' https://excelmacromastery.com/ Sub DateMismatch() Dim curDate As Date ' VBA will do it's best for you ' - These are all valid 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 curDate = "19/19/2016" curDate = "19/Au/2016" curDate = "19/Augusta/2016" curDate = "August" curDate = "Some Random Text" End Sub
Cell Error
A subtle cause of the VBA Type Mismatch error is when you read from a cell that has an error e.g.
If you try to read from this cell you will get a type mismatch error
Dim sText As String ' Type Mismatch if the cell contains an error sText = Sheet1.Range("A1").Value
To resolve this error you can check the cell using IsError as follows.
Dim sText As String If IsError(Sheet1.Range("A1").Value) = False Then sText = Sheet1.Range("A1").Value End If
However, checking all the cells for errors is not feasible and would make your code unwieldy. A better way is to check the sheet for errors first and if errors are found then inform the user.
You can use the following function to do this
Function CheckForErrors(rg As Range) As Long On Error Resume Next CheckForErrors = rg.SpecialCells(xlCellTypeFormulas, xlErrors).Count End Function
The following is an example of using this code
' https://excelmacromastery.com/ Sub DoStuff() If CheckForErrors(Sheet1.Range("A1:Z1000")) > 0 Then MsgBox "There are errors on the worksheet. Please fix and run macro again." Exit Sub End If ' Continue here if no error End Sub
Invalid Cell Data
As we saw, placing an incorrect value type in a variable causes the ‘VBA Type Mismatch’ error. A very common cause is when the value in a cell is not of the correct type.
A user could place text like ‘None’ in a number field not realizing that this will cause a Type mismatch error in the code.
If we read this data into a number variable then we will get a ‘VBA Type Mismatch’ error error.
Dim rg As Range Set rg = Sheet1.Range("B2:B5") Dim cell As Range, Amount As Long For Each cell In rg ' Error when reaches cell with 'None' text Amount = cell.Value Next rg
You can use the following function to check for non numeric cells before you use the data
Function CheckForTextCells(rg As Range) As Long ' Count numeric cells If rg.Count = rg.SpecialCells(xlCellTypeConstants, xlNumbers).Count Then CheckForTextCells = True End If End Function
You can use it like this
' https://excelmacromastery.com/ Sub UseCells() If CheckForTextCells(Sheet1.Range("B2:B6").Value) = False Then MsgBox "One of the cells is not numeric. Please fix before running macro" Exit Sub End If ' Continue here if no error End Sub
Module Name
If you use the Module name in your code this can cause the VBA Type mismatch to occur. However in this case the cause may not be obvious.
For example let’s say you have a Module called ‘Module1’. Running the following code would result in the VBA Type mismatch error.
' https://excelmacromastery.com/ Sub UseModuleName() ' Type Mismatch Debug.Print module1 End Sub
Different Object Types
So far we have been looking mainly at variables. We normally refer to variables as basic data types.
They are used to store a single value in memory.
In VBA we also have objects which are more complex. Examples are the Workbook, Worksheet, Range and Chart objects.
If we are assigning one of these types we must ensure the item being assigned is the same kind of object. For Example
' https://excelmacromastery.com/ Sub UsingWorksheet() Dim wk As Worksheet ' Valid Set wk = ThisWorkbook.Worksheets(1) ' Type Mismatch error ' Left side is a worksheet - right side is a workbook Set wk = Workbooks(1) End Sub
Sheets Collection
In VBA, the workbook object has two collections – Sheets and Worksheets. There is a very subtle difference
- Worksheets – the collection of worksheets in the Workbook
- Sheets – the collection of worksheets and chart sheets in the Workbook
A chart sheet is created when you move a chart to it’s own sheet by right-clicking on the chart and selecting Move.
If you read the Sheets collection using a Worksheet variable it will work fine if you don’t have a chart sheet in your workbook.
If you do have a chart sheet then you will get the VBA Type mismatch error.
In the following code, a Type mismatch error will appear on the Next sh line if the workbook contains a chart sheet.
' https://excelmacromastery.com/ Sub SheetsError() Dim sh As Worksheet For Each sh In ThisWorkbook.Sheets Debug.Print sh.Name Next sh End Sub
Array and Range
You can assign a range to an array and vice versa. In fact this is a very fast way of reading through data.
' https://excelmacromastery.com/ Sub UseArray() Dim arr As Variant ' Assign the range to an array arr = Sheet1.Range("A1:B2").Value ' Print the value a row 1, column 1 Debug.Print arr(1, 1) End Sub
The problem occurs if your range has only one cell. In this case, VBA does not convert arr to an array.
If you try to use it as an array you will get the Type mismatch error
' https://excelmacromastery.com/ Sub UseArrayError() Dim arr As Variant ' Assign the range to an array arr = Sheet1.Range("A1").Value ' Type mismatch will occur here Debug.Print arr(1, 1) End Sub
In this scenario, you can use the IsArray function to check if arr is an array
' https://excelmacromastery.com/ Sub UseArrayIf() Dim arr As Variant ' Assign the range to an array arr = Sheet1.Range("A1").Value ' Type mismatch will occur here If IsArray(arr) Then Debug.Print arr(1, 1) Else Debug.Print arr End If End Sub
Conclusion
This concludes the post on the VBA Type mismatch error. If you have a mismatch error that isn’t covered then please let me know in the comments.
What’s Next?
Free VBA Tutorial If you are new to VBA or you want to sharpen your existing VBA skills then why not try out the The Ultimate VBA Tutorial.
Related Training: Get full access to the Excel VBA training webinars and all the tutorials.
(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)
I created a macro for a file and first it was working fine, but today I’ve been opening and restarting the file and macro hundreds of times and I’m always getting the following error:
Excel VBA Run-time error ’13’ Type mismatch
I didn’t change anything in the macro and don’t know why am I getting the error. Furthermore it takes ages to update the macro every time I put it running (the macro has to run about 9000 rows).
The error is on the line in the between ** **.
VBA:
Sub k()
Dim x As Integer, i As Integer, a As Integer
Dim name As String
name = InputBox("Please insert the name of the sheet")
i = 1
Sheets(name).Cells(4, 58) = Sheets(name).Cells(4, 57)
x = Sheets(name).Cells(4, 57).Value
Do While Not IsEmpty(Sheets(name).Cells(i + 4, 57))
a = 0
If Sheets(name).Cells(4 + i, 57) <> x Then
If Sheets(name).Cells(4 + i, 57) <> 0 Then
If Sheets(name).Cells(4 + i, 57) = 3 Then
a = x
Sheets(name).Cells(4 + i, 58) = Sheets(name).Cells(4 + i, 57) - x
x = Cells(4 + i, 57) - x
End If
**Sheets(name).Cells(4 + i, 58) = Sheets(name).Cells(4 + i, 57) - a**
x = Sheets(name).Cells(4 + i, 57) - a
Else
Cells(4 + i, 58) = ""
End If
Else
Cells(4 + i, 58) = ""
End If
i = i + 1
Loop
End Sub
I’m using excel 2010 on windows 7.
Vega
27.6k27 gold badges95 silver badges103 bronze badges
asked Jan 16, 2012 at 19:52
1
You would get a type mismatch if Sheets(name).Cells(4 + i, 57)
contains a non-numeric value. You should validate the fields before you assume they are numbers and try to subtract from them.
Also, you should enable Option Strict
so you are forced to explicitly convert your variables before trying to perform type-dependent operations on them such as subtraction. That will help you identify and eliminate issues in the future, too.
Unfortunately Option Strict
is for VB.NET only. Still, you should look up best practices for explicit data type conversions in VBA.
Update:
If you are trying to go for the quick fix of your code, however, wrap the **
line and the one following it in the following condition:
If IsNumeric(Sheets(name).Cells(4 + i, 57))
Sheets(name).Cells(4 + i, 58) = Sheets(name).Cells(4 + i, 57) - a
x = Sheets(name).Cells(4 + i, 57) - a
End If
Note that your x
value may not contain its expected value in the next iteration, however.
answered Jan 16, 2012 at 19:55
Devin BurkeDevin Burke
13.6k12 gold badges55 silver badges82 bronze badges
5
Thank you guys for all your help! Finally I was able to make it work perfectly thanks to a friend and also you!
Here is the final code so you can also see how we solve it.
Thanks again!
Option Explicit
Sub k()
Dim x As Integer, i As Integer, a As Integer
Dim name As String
'name = InputBox("Please insert the name of the sheet")
i = 1
name = "Reserva"
Sheets(name).Cells(4, 57) = Sheets(name).Cells(4, 56)
On Error GoTo fim
x = Sheets(name).Cells(4, 56).Value
Application.Calculation = xlCalculationManual
Do While Not IsEmpty(Sheets(name).Cells(i + 4, 56))
a = 0
If Sheets(name).Cells(4 + i, 56) <> x Then
If Sheets(name).Cells(4 + i, 56) <> 0 Then
If Sheets(name).Cells(4 + i, 56) = 3 Then
a = x
Sheets(name).Cells(4 + i, 57) = Sheets(name).Cells(4 + i, 56) - x
x = Cells(4 + i, 56) - x
End If
Sheets(name).Cells(4 + i, 57) = Sheets(name).Cells(4 + i, 56) - a
x = Sheets(name).Cells(4 + i, 56) - a
Else
Cells(4 + i, 57) = ""
End If
Else
Cells(4 + i, 57) = ""
End If
i = i + 1
Loop
Application.Calculation = xlCalculationAutomatic
Exit Sub
fim:
MsgBox Err.Description
Application.Calculation = xlCalculationAutomatic
End Sub
bpeterson76
12.9k4 gold badges48 silver badges82 bronze badges
answered Jan 17, 2012 at 16:50
DiogoDiogo
1511 gold badge1 silver badge5 bronze badges
1
Diogo
Justin has given you some very fine tips
You will also get that error if the cell where you are performing the calculation has an error resulting from a formula.
For example if Cell A1 has #DIV/0! error then you will get «Excel VBA Run-time error ’13’ Type mismatch» when performing this code
Sheets("Sheet1").Range("A1").Value - 1
I have made some slight changes to your code. Could you please test it for me? Copy the code with the line numbers as I have deliberately put them there.
Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim x As Integer, i As Integer, a As Integer, y As Integer
Dim name As String
Dim lastRow As Long
10 On Error GoTo Whoa
20 Application.ScreenUpdating = False
30 name = InputBox("Please insert the name of the sheet")
40 If Len(Trim(name)) = 0 Then Exit Sub
50 Set ws = Sheets(name)
60 With ws
70 If Not IsError(.Range("BE4").Value) Then
80 x = Val(.Range("BE4").Value)
90 Else
100 MsgBox "Please check the value of cell BE4. It seems to have an error"
110 GoTo LetsContinue
120 End If
130 .Range("BF4").Value = x
140 lastRow = .Range("BE" & Rows.Count).End(xlUp).Row
150 For i = 5 To lastRow
160 If IsError(.Range("BE" & i)) Then
170 MsgBox "Please check the value of cell BE" & i & ". It seems to have an error"
180 GoTo LetsContinue
190 End If
200 a = 0: y = Val(.Range("BE" & i))
210 If y <> x Then
220 If y <> 0 Then
230 If y = 3 Then
240 a = x
250 .Range("BF" & i) = Val(.Range("BE" & i)) - x
260 x = Val(.Range("BE" & i)) - x
270 End If
280 .Range("BF" & i) = Val(.Range("BE" & i)) - a
290 x = Val(.Range("BE" & i)) - a
300 Else
310 .Range("BF" & i).ClearContents
320 End If
330 Else
340 .Range("BF" & i).ClearContents
350 End If
360 Next i
370 End With
LetsContinue:
380 Application.ScreenUpdating = True
390 Exit Sub
Whoa:
400 MsgBox "Error Description :" & Err.Description & vbNewLine & _
"Error at line : " & Erl
410 Resume LetsContinue
End Sub
answered Jan 16, 2012 at 23:15
Siddharth RoutSiddharth Rout
147k17 gold badges206 silver badges250 bronze badges
3
For future readers:
This function was abending in Run-time error '13': Type mismatch
Function fnIsNumber(Value) As Boolean
fnIsNumber = Evaluate("ISNUMBER(0+""" & Value & """)")
End Function
In my case, the function was failing when it ran into a #DIV/0!
or N/A
value.
To solve it, I had to do this:
Function fnIsNumber(Value) As Boolean
If CStr(Value) = "Error 2007" Then '<===== This is the important line
fnIsNumber = False
Else
fnIsNumber = Evaluate("ISNUMBER(0+""" & Value & """)")
End If
End Function
answered Jun 21, 2018 at 15:45
cssyphuscssyphus
37.5k18 gold badges91 silver badges110 bronze badges
Sub HighlightSpecificValue()
'PURPOSE: Highlight all cells containing a specified values
Dim fnd As String, FirstFound As String
Dim FoundCell As Range, rng As Range
Dim myRange As Range, LastCell As Range
'What value do you want to find?
fnd = InputBox("I want to hightlight cells containing...", "Highlight")
'End Macro if Cancel Button is Clicked or no Text is Entered
If fnd = vbNullString Then Exit Sub
Set myRange = ActiveSheet.UsedRange
Set LastCell = myRange.Cells(myRange.Cells.Count)
enter code here
Set FoundCell = myRange.Find(what:=fnd, after:=LastCell)
'Test to see if anything was found
If Not FoundCell Is Nothing Then
FirstFound = FoundCell.Address
Else
GoTo NothingFound
End If
Set rng = FoundCell
'Loop until cycled through all unique finds
Do Until FoundCell Is Nothing
'Find next cell with fnd value
Set FoundCell = myRange.FindNext(after:=FoundCell)
'Add found cell to rng range variable
Set rng = Union(rng, FoundCell)
'Test to see if cycled through to first found cell
If FoundCell.Address = FirstFound Then Exit Do
Loop
'Highlight Found cells yellow
rng.Interior.Color = RGB(255, 255, 0)
Dim fnd1 As String
fnd1 = "Rah"
'Condition highlighting
Set FoundCell = myRange.FindNext(after:=FoundCell)
If FoundCell.Value("rah") Then
rng.Interior.Color = RGB(255, 0, 0)
ElseIf FoundCell.Value("Nav") Then
rng.Interior.Color = RGB(0, 0, 255)
End If
'Report Out Message
MsgBox rng.Cells.Count & " cell(s) were found containing: " & fnd
Exit Sub
'Error Handler
NothingFound:
MsgBox "No cells containing: " & fnd & " were found in this worksheet"
End Sub
Neil
54.4k8 gold badges60 silver badges72 bronze badges
answered Oct 9, 2015 at 10:10
I had the same problem as you mentioned here above and my code was doing great all day yesterday.
I kept on programming this morning and when I opened my application (my file with an Auto_Open sub), I got the Run-time error ’13’ Type mismatch, I went on the web to find answers, I tried a lot of things, modifications and at one point I remembered that I read somewhere about «Ghost» data that stays in a cell even if we don’t see it.
My code do only data transfer from one file I opened previously to another and Sum it. My code stopped at the third SheetTab (So it went right for the 2 previous SheetTab where the same code went without stopping) with the Type mismatch message. And it does that every time at the same SheetTab when I restart my code.
So I selected the cell where it stopped, manually entered 0,00 (Because the Type mismatch comes from a Summation variables declared in a DIM as Double) and copied that cell in all the subsequent cells where the same problem occurred. It solved the problem. Never had the message again. Nothing to do with my code but the «Ghost» or data from the past. It is like when you want to use the Control+End and Excel takes you where you had data once and deleted it. Had to «Save» and close the file when you wanted to use the Control+End to make sure Excel pointed you to the right cell.
TylerH
20.7k65 gold badges73 silver badges98 bronze badges
answered Oct 11, 2013 at 19:14
This error occurs when the input variable type is wrong. You probably have written a formula in Cells(4 + i, 57)
that instead of =0
, the formula = ""
have used. So when running this error is displayed. Because empty string is not equal to zero.
answered Dec 13, 2016 at 21:12
gadolfgadolf
1,01511 silver badges19 bronze badges
title | keywords | f1_keywords | ms.prod | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|
Type mismatch (Error 13) |
vblr6.chm1011290 |
vblr6.chm1011290 |
office |
cbc7e902-b468-c335-5620-1ff9a2026b9b |
08/14/2019 |
medium |
Visual Basic is able to convert and coerce many values to accomplish data type assignments that weren’t possible in earlier versions.
However, this error can still occur and has the following causes and solutions:
- Cause: The variable or property isn’t of the correct type. For example, a variable that requires an integer value can’t accept a string value unless the whole string can be recognized as an integer.
Solution: Try to make assignments only between compatible data types. For example, an Integer can always be assigned to a Long, a Single can always be assigned to a Double, and any type (except a user-defined type) can be assigned to a Variant.
- Cause: An object was passed to a procedure that is expecting a single property or value.
Solution: Pass the appropriate single property or call a method appropriate to the object.
-
Cause: A module or project name was used where an expression was expected, for example:
Solution: Specify an expression that can be displayed.
-
Cause: You attempted to mix traditional Basic error handling with Variant values having the Error subtype (10, vbError), for example:
Solution: To regenerate an error, you must map it to an intrinsic Visual Basic or a user-defined error, and then generate that error.
-
Cause: A CVErr value can’t be converted to Date. For example:
Solution: Use a Select Case statement or some similar construct to map the return of CVErr to such a value.
- Cause: At run time, this error typically indicates that a Variant used in an expression has an incorrect subtype, or a Variant containing an array appears in a Print # statement.
Solution: To print arrays, create a loop that displays each element individually.
For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).
[!includeAdd-ins note]
[!includeSupport and feedback]