Ошибка несовпадение типов excel

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

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

I am trying to compare the values from one column of one sheet, with the values of another column of a different sheet, same workbook, though. It steps through each cell in the other column, and if the cell value, a string, does not exist in sheet2, then the row from sheet1 is copied over to sheet3. You can think of it like I’m comparing two arrays. I want to see if there are any values in Array1 that do not appear in Array2, and if they do not appear in Array1, the value is copied into Array3.

My main issue is I’m getting a type-mismatch error in line 5. The values contain strings. I am fairly new at Excel VBA and am trying to learn it on the fly. Any help would be greatly appreciated.

Sub search()
Dim count As Integer
count = 0

For Each i In Worksheets("Sheet1").Range("C2:C4503")
    Set first_cell = Worksheets("Sheet1").Cells(i, 3) <-- Mismatch eror

    For Each j In Worksheets("Sheet2").Range("X2:X4052")
        Set second_cell = Worksheets("Sheet2").Cells(j, 24)
        If second_cell = first_cell Then Exit For
    Next j

    count = count + 1
    Set Worksheets("Sheet3").Cells(count, 1) = Worksheets("Sheet1").Cells(j, 1).Select
Next i

End Sub

Добрый день. немогу никак разобраться с кодом…  
Есть форма… на ней есть три текстбокса. Вношу в них числовые данные…в четвертом текстбоксе показывается их сумма:    

  Private Sub costotpravki_Change()  
Dim a1 As Double  
Dim a2 As Double  
Dim A3 As Double  
a1 = costotpravki.Value  
a2 = pochtrashod.Value  
A3 = doprashod.Value  
zatraty0.Value = a1 + a2 + A3  
End Sub  
Private Sub pochtrashod_Change()  
Dim a1 As Double  
Dim a2 As Double  
Dim A3 As Double  
a1 = costotpravki.Value  
a2 = pochtrashod.Value  
A3 = doprashod.Value  
zatraty0.Value = a1 + a2 + A3  
End Sub  
Private Sub doprashod_Change()  
Dim a1 As Double  
Dim a2 As Double  
Dim A3 As Double  
a1 = costotpravki.Value  
a2 = pochtrashod.Value  
A3 = doprashod.Value  
zatraty0.Value = a1 + a2 + A3  
End Sub  

  Далее, при нажатии кнопки данные из этих трех переношу на лист в таблицу, таким образом:    
WS111.Cells(i, 23).Value = costotpravki.Value  
WS111.Cells(i, 24).Value = pochtrashod.Value  
WS111.Cells(i, 25).Value = doprashod.Value  

  Вносится на лист без ошибок. При следующей загрузке формы, при нажатии кнопки, данные этих текстбоксов должны заполняться из ячеек листа, куда их и вносил (то есть обратно на форму):  
costotpravki.Value = WS111.Cells(i, 23).Value  
pochtrashod.Value = WS111.Cells(i, 24).Value  
doprashod.Value = WS111.Cells(i, 25).Value  

  но выскакивает ошибка несовпадение типов(на операциях сложения)  
и еще: данные вносятся в таблицу в столбцы с форматом денежный, а вносятся получается как текст. :(( Что не так?

   Koliaff

16.01.12 — 22:26

Доброго времени суток, господа форумчани. Пишу обработку загрузки данных из Excel в 1C 7.7.

 В файле из которого идет загрузка присутствуют ячейки с формулами и из-за того что некоторые формулы написаны не правильно, в них пишется текст типа =D15-#ССЫЛКА!-K15

 Удалять все такие ячейки в которых битая ссылка нет возможности, т.к. таких ячеек очень много и они в перемешку с нормальными ячейками. При попытке считать значение проблемной ячейки, например вот таким кодом : Excel.Cells(х, 15).Value

Возникает ошибка «Несовпадение типов» и 1С виснет!

Конструкция Попытка Исключение КонецПопытки не срабатывает !

Приходится снимать задачу с 1С. Подскажите пожалуйста как можно проверять такие ячейки чтобы 1С прололжала после этого работать ? ) Заранее большое спасибо !

   БибиГон

1 — 16.01.12 — 22:29

что значит «Попытка не срабатывает»?

   Koliaff

2 — 16.01.12 — 22:31

Для х = 1 По Строк Цикл    

     Попытка

                 Состояние(«Обрабатывается строка номер «+ Строка(х));

             
               Колонка1       = СокрЛП(Строка(Excel.Cells(х, 1).Value));  

               Колонка2       = СокрЛП(Строка(Excel.Cells(х, 2).Value));  

               Колонка3       = СокрЛП(Строка(Excel.Cells(х, 3).Value));  

               Колонка4       = СокрЛП(Строка(Excel.Cells(х, 4).Value));  

               Колонка5       = СокрЛП(Строка(Excel.Cells(х, 5).Value));  

               Колонка6       = СокрЛП(Строка(Excel.Cells(х, 6).Value));  

               Колонка7       = СокрЛП(Строка(Excel.Cells(х, 7).Value));  

               Колонка8       = СокрЛП(Строка(Excel.Cells(х, 8).Value));  

               Колонка9       = СокрЛП(Строка(Excel.Cells(х, 9).Value));  

               Колонка10       = СокрЛП(Строка(Excel.Cells(х, 10).Value));

               Колонка11       = СокрЛП(Строка(Excel.Cells(х, 11).Value));

               Колонка12       = СокрЛП(Строка(Excel.Cells(х, 12).Value));

               Колонка13       = СокрЛП(Строка(Excel.Cells(х, 13).Value));

               Колонка14       = СокрЛП(Строка(Excel.Cells(х, 14).Value));

               Колонка15       = СокрЛП(Строка(Excel.Cells(х, 15).Value));

                   
                   Если (ПустоеЗначение(Колонка15)=0) Тогда

                       
                       Если СокрЛП(Колонка15)<>»долг»  Тогда  

                           
                           
                           Если ПустоеЗначение(Колонка14)<>1 Тогда

                               
                                   Если (Дата(Колонка14)>=НачДата) и (Дата(Колонка14)<=КонДата) Тогда

                                       ТЗ.НоваяСтрока();

                                       ТЗ.Долг = Колонка15;

                                       ТЗ.Сумма = Колонка4;

                                       ТЗ.ДатаБухСпрвки=Колонка14;

                                       ТЗ.ДатаСФ = Колонка3;

                                         ТЗ.НомерСФ = Колонка7;

                                     КонецЕсли;

                                                                       
                            КонецЕсли;    

                         КонецЕсли;                      

                         
               
                   КонецЕсли;    

       Исключение

           Сообщить(«Не обработать строку номер «+ Строка(х));

       КонецПопытки;    

   
   Конеццикла;    

Вот код. 1С выдает сообщение Несовпадение типов и виснет ! Сообщение внизу не появляется о не удачной обработке строки…

   filh

3 — 16.01.12 — 22:34

попробуй через йоксель.

   IvanovIV

4 — 16.01.12 — 22:35

http://zalil.ru/32512420

попробуй эту обработку

когда-то скачал ее с инфостарта

больше с загрузкой из xls  не  парюсь

   Koliaff

5 — 16.01.12 — 22:35

(filh) Сори, ВК не пользуюсь …

   filh

6 — 16.01.12 — 22:37

(5) внешнюю обработку сделай, в ней подгрузи ВК. Или через табло.

   Koliaff

7 — 16.01.12 — 22:41

(filh) Я пользуюсь ВК только если стандартными способами не возможно сдлеать задуманное, пока я надеюсь найти выход …

   Koliaff

8 — 16.01.12 — 22:43

(IvanovIV) Спасибо, но эта обработка так же выпала с такой же ошибкой и подвесила 1С.

   ШтушаКутуша

9 — 16.01.12 — 22:45

а если убрать СокрЛП и Строка?

   ШтушаКутуша

10 — 16.01.12 — 22:46

+9 попробовать, пройдет ли?

   IvanovIV

11 — 16.01.12 — 22:46

(8) ну извини, чем мог тем помог

а файл екселевский в каком екселе создан и как сохранен?

   IvanovIV

12 — 16.01.12 — 22:53

если не жалко

файлик выложи

не надо цликом весь

пару строк

одну, которая проходит

а другую, где ругается

   filh

13 — 16.01.12 — 22:54

(12) сделай сам :)

   Koliaff

14 — 16.01.12 — 22:55

(IvanovIV) Сейчас выложу

(ШтушаКутуша) СокрЛП — не причем, пробовал и так и так

   filh

15 — 16.01.12 — 22:56

(14) ну попробуй еще для полного ой

Колонка1       = СокрЛП(«»+Excel.Cells(х, 1).Value);

   IvanovIV

16 — 16.01.12 — 22:57

(13) ) Накуа я буду пытаться моделировать, то что есть уже … и меня никак не касается?

   Koliaff

17 — 16.01.12 — 22:58

   Koliaff

18 — 16.01.12 — 23:00

(filh) В отладчике при попытке посмотреть значение Excel.Cells(х, 1).Value вылетает ошибка, так что по-любому не пойдет….

   filh

19 — 16.01.12 — 23:00

(17) а сохранить в 2003 и попробовать?

   IvanovIV

20 — 16.01.12 — 23:01

(17)

см 11

   Koliaff

21 — 16.01.12 — 23:02

Файл изначально в 2003 был, просто пересохранял в 2007, так что не в Excel дело

   IvanovIV

22 — 16.01.12 — 23:02

я сейчас у предков

офиса тут нет

но думаю проблема в формате сохранения

   IvanovIV

23 — 16.01.12 — 23:03

тогда завтра посмотрю на работе)

   Koliaff

24 — 16.01.12 — 23:04

   filh

25 — 16.01.12 — 23:10

(24) тоже посмотрю завтра с утра, сейчас лень.

   Koliaff

26 — 16.01.12 — 23:17

Вопрос закрыт, друг помог, который ещё не спал )

Кому интересно код такой :

   Если Найти (Excel.Cells(х, 15).Formula,»#REF») =0 Тогда

                   Колонка15       = СокрЛП(Строка(Excel.Cells(х, 15).Value));

               Иначе    

                   Сообщить(«Не удалось обработать строку номер «+ Строка(х));

                   Продолжить;

               КонецЕсли;

  

Tatitutu

27 — 16.01.12 — 23:18

Содержание

  1. Несоответствие типов (ошибка 13)
  2. Поддержка и обратная связь
  3. Как исправить ошибку во время выполнения 13
  4. Обзор «Type mismatch»
  5. Почему происходит ошибка времени выполнения 13?
  6. Типичные ошибки Type mismatch
  7. Создатели Type mismatch Трудности
  8. Разбор ошибки Type Mismatch Error
  9. Объяснение Type Mismatch Error
  10. Использование отладчика
  11. Присвоение строки числу
  12. Недействительная дата
  13. Ошибка ячейки
  14. Неверные данные ячейки
  15. Имя модуля
  16. Различные типы объектов
  17. Коллекция Sheets
  18. Массивы и диапазоны
  19. Заключение

Visual Basic может преобразовать и привести большое число значений для присвоений типа данных, которые не были возможны в предыдущих версиях.

Тем не менее, эта ошибка может по-прежнему повторяться и имеет следующие причины и решения:

  • Причина:Переменная или свойство имеют неверный тип. Например, переменная целого типа, не может принимать строковые значения, которые не распознаются как целые числа.

Решение: Попробуйте выполнять задания только между совместимыми типами данных. Например, значение типа Integer всегда можно присвоить типу Long, значение Single — типу Double, а любой тип (за исключением пользовательского) — типу Variant.

  • Причина: В процедуру, требующую отдельное свойство или значение, передан объект.

Решение: Передайте отдельное свойство или вызовите метод, соответствующий объекту.

Причина: Используется имя модуля или проекта, где требуется выражение, например:

Решение: Укажите выражение, которое будет отображаться.

Причина: Попытка использовать традиционный механизм обработки ошибок Basic со значениями Variant с подтипом Error (10, vbError), например:

Решение: Чтобы воссоздать ошибку, необходимо сопоставить ее с пользовательской или внутренней ошибкой Visual Basic, после чего снова создать ее.

Причина: Значение CVErr не может быть преобразовано в тип Date. Например:

Решение: Используйте оператор Select Case или аналогичную конструкцию, чтобы сопоставить возвращаемое значение CVErr с соответствующим значением.

  • Причина: Во время выполнения эта ошибка указывает на то, что переменная Variant, используемая в выражении, имеет неверный подтип, либо переменная Variant, содержащая массив, используется в операторе Print #.

Решение: Для печати массивов используйте цикл в котором каждый элемент отображается отдельно.

Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh).

Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Как исправить ошибку во время выполнения 13

Номер ошибки: Ошибка во время выполнения 13
Название ошибки: Type mismatch
Описание ошибки: Visual Basic is able to convert and coerce many values to accomplish data type assignments that weren’t possible in earlier versions.
Разработчик: Microsoft Corporation
Программное обеспечение: Windows Operating System
Относится к: Windows XP, Vista, 7, 8, 10, 11

Обзор «Type mismatch»

«Type mismatch» часто называется ошибкой во время выполнения (ошибка). Когда дело доходит до Windows Operating System, инженеры программного обеспечения используют арсенал инструментов, чтобы попытаться сорвать эти ошибки как можно лучше. Тем не менее, возможно, что иногда ошибки, такие как ошибка 13, не устранены, даже на этом этапе.

Ошибка 13, рассматриваемая как «Visual Basic is able to convert and coerce many values to accomplish data type assignments that weren’t possible in earlier versions.», может возникнуть пользователями Windows Operating System в результате нормального использования программы. Когда это происходит, конечные пользователи программного обеспечения могут сообщить Microsoft Corporation о существовании ошибки 13 ошибок. Команда программирования может использовать эту информацию для поиска и устранения проблемы (разработка обновления). Чтобы исправить любые документированные ошибки (например, ошибку 13) в системе, разработчик может использовать комплект обновления Windows Operating System.

Почему происходит ошибка времени выполнения 13?

Сбой устройства или Windows Operating System обычно может проявляться с «Type mismatch» в качестве проблемы во время выполнения. Проанализируем некоторые из наиболее распространенных причин ошибок ошибки 13 во время выполнения:

Ошибка 13 Crash — Номер ошибки вызовет блокировка системы компьютера, препятствуя использованию программы. Это возникает, когда Windows Operating System не реагирует на ввод должным образом или не знает, какой вывод требуется взамен.

Утечка памяти «Type mismatch» — последствия утечки памяти Windows Operating System связаны с неисправной операционной системой. Повреждение памяти и другие потенциальные ошибки в коде могут произойти, когда память обрабатывается неправильно.

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

Как правило, ошибки Type mismatch вызваны повреждением или отсутствием файла связанного Windows Operating System, а иногда — заражением вредоносным ПО. Большую часть проблем, связанных с данными файлами, можно решить посредством скачивания и установки последней версии файла Microsoft Corporation. Помимо прочего, в качестве общей меры по профилактике и очистке мы рекомендуем использовать очиститель реестра для очистки любых недопустимых записей файлов, расширений файлов Microsoft Corporation или разделов реестра, что позволит предотвратить появление связанных с ними сообщений об ошибках.

Типичные ошибки Type mismatch

Частичный список ошибок Type mismatch Windows Operating System:

  • «Ошибка Type mismatch. «
  • «Ошибка программного обеспечения Win32: Type mismatch»
  • «Извините за неудобства — Type mismatch имеет проблему. «
  • «К сожалению, мы не можем найти Type mismatch. «
  • «Type mismatch не найден.»
  • «Ошибка запуска программы: Type mismatch.»
  • «Type mismatch не работает. «
  • «Отказ Type mismatch.»
  • «Type mismatch: путь приложения является ошибкой. «

Обычно ошибки Type mismatch с Windows Operating System возникают во время запуска или завершения работы, в то время как программы, связанные с Type mismatch, выполняются, или редко во время последовательности обновления ОС. Выделение при возникновении ошибок Type mismatch имеет первостепенное значение для поиска причины проблем Windows Operating System и сообщения о них вMicrosoft Corporation за помощью.

Создатели Type mismatch Трудности

Проблемы Type mismatch могут быть отнесены к поврежденным или отсутствующим файлам, содержащим ошибки записям реестра, связанным с Type mismatch, или к вирусам / вредоносному ПО.

В частности, проблемы с Type mismatch, вызванные:

  • Поврежденная или недопустимая запись реестра Type mismatch.
  • Зазаражение вредоносными программами повредил файл Type mismatch.
  • Type mismatch злонамеренно удален (или ошибочно) другим изгоем или действительной программой.
  • Другое программное обеспечение, конфликтующее с Windows Operating System, Type mismatch или общими ссылками.
  • Поврежденная установка или загрузка Windows Operating System (Type mismatch).

Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11

Источник

Разбор ошибки Type Mismatch Error

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

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

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

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

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

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

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

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

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

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

Простой способ объяснить 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Имя модуля

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

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

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

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

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

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

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

Коллекция Sheets

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Источник

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

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

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's user avatar

Vega

27.1k27 gold badges91 silver badges98 bronze badges

asked Jan 16, 2012 at 19:52

Diogo's user avatar

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 Burke's user avatar

Devin BurkeDevin Burke

13.5k11 gold badges54 silver badges81 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's user avatar

bpeterson76

12.9k4 gold badges48 silver badges82 bronze badges

answered Jan 17, 2012 at 16:50

Diogo's user avatar

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 Rout's user avatar

Siddharth RoutSiddharth Rout

145k17 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

cssyphus's user avatar

cssyphuscssyphus

36.6k18 gold badges93 silver badges108 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's user avatar

Neil

54k8 gold badges60 silver badges72 bronze badges

answered Oct 9, 2015 at 10:10

chetan dubey's user avatar

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's user avatar

TylerH

20.4k62 gold badges75 silver badges96 bronze badges

answered Oct 11, 2013 at 19:14

Youbi's user avatar

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.

enter image description here

answered Dec 13, 2016 at 21:12

gadolf's user avatar

gadolfgadolf

9879 silver badges19 bronze badges

 

Gagarin13

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

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

#1

20.08.2018 00:08:55

Код
Sub Del_Array_SubStr_Расщепление_Неточно_Соответствие()
    Dim sSubStr As String    'искомое слово или фраза
    Dim lCol As Long    'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim avArr, lr As Long
    Dim arr

    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "Запрос параметра", 12))
    If lCol = 0 Then Exit Sub
    Application.ScreenUpdating = 0
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    'заносим в массив значения листа, в котором необходимо удалить строки
    arr = Cells(1, lCol).Resize(lLastRow).Value
    'Получаем с Расщепление значения, которые надо удалить в активном листе
    With Sheets("Расщепление") 'Имя листа с диапазоном значений на удаление
        avArr = .Range(.Cells(3, 14), .Cells(.Rows.Count, 14).End(xlUp))
    End With
    'удаляем
    Dim rr As Range
    For lr = 1 To UBound(avArr, 1)
        sSubStr = avArr(lr, 1)
        For li = 1 To lLastRow 'цикл с первой строки до конца
            If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then
                If rr Is Nothing Then
                    Set rr = Cells(li, 12)
                Else
                    Set rr = Union(rr, Cells(li, 12))
                End If
            End If
            DoEvents
        Next li
        DoEvents
    Next lr
   If Not rr Is Nothing Then rr.Rows.Interior.Color = 65535
    Application.ScreenUpdating = 1
End Sub

Здравствуйте уважаемые форумчане, такая проблема: вылазит в некоторых макросах такая ошибка:Run-time error «13» type mismatch

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

Ошибку показывает в этой строке:

Код
For lr = 1 To UBound(avArr, 1)

Что именно ему тут не нравиться, не понимаю)
Заранее спасибо за помощь

 

vikttur

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

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

#2

20.08.2018 00:11:22

Цитата
Она то есть, то ее нету.

Ну да. Подсунули программе неправильные данные — есть ошибка. Дали корректные — нет ошибки.
Ошибка говорит о несоответствии типов данных. Вместо даты текст, вместо числа пустая строка «», в переменную типа Вyte пытаетесь записать число 300… Поверяйте исходные данные.
Когда высветится ошибка, нажмите Debug — Вам редактор покажет подсвеченную желтым строку. Наведите курсор на переменую, ссылку… — в подсказке увидите значение.

Все?
Как Вы тему назовете, так она и поплыват… Если нужно решение по конкретному коду — название темы должно отражать суть задачи. Предложите новое. Модераторы заменят. И файл-пример поможет.

 

Gagarin13

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

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

#3

20.08.2018 09:24:55

Цитата
vikttur написал:
Вместо даты текст, вместо числа пустая строка «», в переменную типа Вyte пытаетесь записать число 300… Поверяйте исходные данные

Да но данные всегда одинаковы, это текст да цифры и пустых строк никогда не бывает, но тем не менее иногда ошибка вылазит.

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

vikttur, Спасибо, извиняюсь если глупые вопросы, с макросами я слабо)

Цитата
vikttur написал: Наведите курсор на переменую, ссылку… — в подсказке увидите значение.

У меня нету подсказок, не знаю почему

Изменено: Gagarin1320.08.2018 11:21:07

 

ivanok_v2

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

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

#4

20.08.2018 10:04:47

Цитата
Gagarin13 написал:For lr = 1 To UBound(avArr, 1)

этот код не всегда нормально срабатывает

Код
  avArr = .Range(.Cells(3, 14), .Cells(.Rows.Count, 14).End(xlUp))

тоесть, масив пустой или не двухмерный

Код
UBound(avArr, 1)
 

Gagarin13

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

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

..

Изменено: Gagarin1320.08.2018 11:21:13

 

vikttur

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

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

Загоняйте в массив два столбца, добавьте с помощью ReDim второй столбец, уберите единицу — UBound(avArr). Вариантов много…

 

Gagarin13

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

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

Изменено: Gagarin1320.08.2018 11:21:17

 

Gagarin13

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

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

#8

20.08.2018 10:46:20

Цитата
.

Изменено: Gagarin1320.08.2018 11:20:10

 

vikttur

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

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

#9

20.08.2018 10:50:00

Gagarin13, я Вам поставлю ограничение на создание сообщений — не более 3 в день! Сколько можно просить?! Не создавайте сообщения через несколько миут. Можно вернуться и изменить предыдущее.
Вернитесь и в своих темах наведите порядок. Модераторы удалят лишнее.

Цитата
с макросами я слабо)

а с поиском по необъятному И-нету? Получили подсказку — поискали самостоятельно. Разжевывать на форуме  справку по ReDim?

 

ivanok_v2

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

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

#10

20.08.2018 10:50:50

Цитата
Gagarin13 написал: У меня нету подсказок, не знаю почему

В чем сложность? массив создать? или проверить, что переменная есть массив?

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.

There’s More VBA Errors

Subscript Out of Range (Error 9) | Runtime (Error 1004) | Object Required (Error 424) | Out of Memory (Error 7) | Object Doesn’t Support this Property or Method (Error 438) | Invalid Procedure Call Or Argument (Error 5) | Overflow (Error 6) | Automation error (Error 440) | VBA Error 400

Make sure to check out this VBA Error Handling technique and if you want to learn more don’t forget to jump to this VBA Tutorial.

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

Ошибка несоответствия типа VBA в Excel — это тип «ошибки времени выполнения», и это ошибка номер 13 в этой категории.

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

Обычно мы объявляем переменные и присваиваем им типы данных. Когда мы присваиваем значение этим переменным, нам нужно помнить, какие данные они могут хранить. Если присвоенное значение не соответствует типу данных, мы получим «Ошибка времени выполнения 13: несоответствие типов».

Ошибка несоответствия типа VBA

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

Как исправить ошибку 13 во время выполнения несоответствия типа VBA?

Давайте посмотрим на несколько примеров, чтобы понять эту ошибку несоответствия типа VBA.

Вы можете скачать этот шаблон Excel несоответствия типов VBA здесь — Несоответствие типа VBA шаблону Excel

Несоответствие типов VBA — пример №1

Например, посмотрите на ниже код VBAКод VBA относится к набору инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи.читать далее.

Код:

Sub Type_MisMatch_Example1()

Dim k As Byte

k = "Hiii"

MsgBox k

End Sub

пример несоответствия vba 1.1

Я объявил переменную «k» как Byte.

Это означает, что переменная «k» может содержать значения от 0 до 255. Но в следующей строке я присвоил переменной «k» значение «Hiii».

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

пример несоответствия vba 1.2

Несоответствие типов VBA — пример № 2

Теперь взгляните на еще один пример с другим типом данных. Посмотрите на приведенный ниже код.

Код:

Sub Type_MisMatch_Example2()

Dim x As Boolean

x = 4556

MsgBox x

End Sub

пример несоответствия vba 2.1

Мы объявили переменную «x» как логическую.

Булев тип данныхBoolean — это встроенный тип данных в VBA, используемый для логических ссылок или логических переменных. Значение, которое содержит этот тип данных, равно TRUE или FALSE и используется для логического сравнения. Объявление этого типа данных аналогично всем другим типам данных.читать далее который может содержать значение TRUE или FALSE.

В приведенном выше коде мы присвоили значение 4556, которое не соответствует значениям типа данных TRUE или FALSE.

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

Пример несоответствия vba 2.2

Вам должно быть интересно, почему это не дает ошибки времени выполнения 13 ошибки несоответствия типа.

Причина этого заключается в том, что Excel рассматривает все числа как ИСТИНА, кроме нуля. Нулевое значение будет рассматриваться как FALSE. Вот почему мы получили результат TRUE, а не ошибку.

Теперь смотрите, я назначу числовое значение с текстом.

Код:

Sub Type_MisMatch_Example2()

Dim x As Boolean

x = "4556a"

MsgBox x

End Sub

пример несоответствия vba 2.3

Это определенно вызовет ошибку времени выполнения 13: несоответствие типов.

пример несоответствия vba 2.4

Несоответствие типов VBA — пример №3

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

Код:

Sub Type_MisMatch_Example4()

Dim x As Integer
Dim y As String

x = 45
y = "2019 Jan"

MsgBox x + y

End Sub

пример 3.1

Переменная «x» представляет собой целочисленный тип данных, а «y» — строковый тип данных.

X = 45 и y = 2019 января.

В окне сообщения я добавил x + y.

Но это не идеальный код, потому что мы не можем складывать числа со строковыми текстами. Мы столкнемся с ошибкой времени выполнения 13.

пример 3.2

Несоответствие типов VBA — пример № 4

Исключительные случаи

Бывают ситуации, когда Excel прощает неправильные данные, присвоенные типу данных переменной. Например, посмотрите на приведенный ниже код.

Код:

Sub Type_MisMatch_Example3()

Dim x As Long
Dim y As Long

x = 58.85

y = "85"

MsgBox x & vbNewLine & y

End Sub

пример 4.1

Две объявленные переменные — «x» и «y».

Для этой переменной назначен тип данных «Длинный».

Тип данных Long принимает только целые числа, а не десятичные значения.

Таким образом, общее восприятие состоит в том, чтобы получить ошибку времени выполнения 13 из-за ошибки несоответствия типа.

Но давайте посмотрим, что произойдет, когда мы запустим этот код.

пример 4.2

Ух ты!!! Мы получили значения 59 и 85.

Это связано с тем, что VBA преобразует десятичное значение 58,85 в ближайшее целое значение, и даже если числа заключены в двойные кавычки, оно все равно преобразуется только в целочисленное значение.

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

Post Views: 484

Summary:

This post is written with the main prospective of providing you all with ample amount of detail regarding Excel runtime error 13.  So go through this complete guide to know how to fix runtime error 13 type mismatch.

In our earlier blogs, we have described the commonly found Excel file runtime error 1004, 32809 and 57121. Today in this article we are describing another Excel file runtime error 13.

Run-time error ‘13’: Type Mismatch usually occurs meanwhile the code is executed in Excel. As a result of this, you may get terminated every time from all the ongoing activities on your Excel application.

This run time error 13 also put an adverse effect on XLS/XLSX files. So before this Excel Type Mismatch error damages your Excel files, fix it out immediately with the given fixes.

Apart from that, there are many reasons behind getting the Excel file runtime error 13 when the Excel file gets corrupted this starts showing runtime error.

To recover lost Excel data, we recommend this tool:

This software will prevent Excel workbook data such as BI data, financial reports & other analytical information from corruption and data loss. With this software you can rebuild corrupt Excel files and restore every single visual representation & dataset to its original, intact state in 3 easy steps:

  1. Download Excel File Repair Tool rated Excellent by Softpedia, Softonic & CNET.
  2. Select the corrupt Excel file (XLS, XLSX) & click Repair to initiate the repair process.
  3. Preview the repaired files and click Save File to save the files at desired location.

Error Detail:

Error code: Run-time error ‘13’

Declaration: Excel Type Mismatch error

Here is the screenshot of this error:

Excel Runtime Error 13 Type Mismatch

Why Am I Getting Excel Runtime Error 13 Type Mismatch?

Following are some reasons for run time error 13 type mismatch:

  • When multiple methods or files require to starts a program that uses Visual Basic (VB) environment
  • Runtime error 13 often occurs when mismatches occur within the software applications which you require to use.
  • Due to virus and malware infection as this corrupts the Windows system files or Excel-related files.
  • When you tap on the function or macro present on the menu which is created by another Macro then also you will receive the same run time error 13.
  • The runtime error commonly occurs due to the conflict between the software and the operating system.
  • Due to the corrupt or incomplete installation of Microsoft Excel software.
  • The Run-time Error 13 appears when the users try to run VBA code that includes data types that are not matched correctly. Thus it starts displaying Runtime error 13 type mismatch.
  • Due to conflict with other programs while opening the VBA Excel file.

Well, these are some of the common reasons for getting the Excel file runtime error 13.

How To Fix Excel Runtime Error 13 Type Mismatch?

Learn how to Fix Excel Runtime Error 13 Type Mismatch.

1: Using Open and Repair Utility

2. Uninstall The Program

3. Scan For Virus/Malware

4. Recover Missing Macros

5.  Run The ‘Regedit’ Command In CMD

6: Create New Disk Partition And Reinstall Windows

7: Use MS Excel Repair Tool

1: Using Open and Repair Utility

There is a ‘File Recovery’ mode within Excel which gets activated automatically when any corruption issue hits your worksheet or workbook.

But in some cases, Excel won’t offer this ‘File Recovery’ mode and at that time you need to use Excel inbuilt tool ‘Open and Repair’.

Using this inbuilt utility tool you can recover corrupted/damaged Excel files. Try the following steps to fix Visual Basic runtime error 13 type mismatch in Excel.

Here follow the steps to do so:

  • In the File menu> click “Open”
  • And select corrupt Excel file > from the drop-down list of open tab > select “Open and Repair”

Open-and-Repair

  • Lastly, click on the “Repair” button.

excel open and repair

However, it is found that the inbuilt repair utility fails to repair the severely damaged Excel file.

2. Uninstall The Program

It is found some application and software causes the runtime error.

So, to fix the Excel file error, simply uninstall the problematic apps and programs.

  • First, go to the Task Manager and stop the running programs.
  • Then in the start menu > select Control Panel.
  • In the Control Panel > choose Add or Remove Program.

Reinstall The Microsoft Office Application

  • Here, you will get the list of installed programs on your PC.

ms office repair from control panel

  • Then from the list select Microsoft Work.
  • Click on uninstall to remove it from the PC.

Uninstall The Program

Hope doing this will fix the Excel file Runtime error 13, but if not then follow the third solution.

3. Scan For Virus/Malware

Virus intrusion is quite a big problem for all Windows users, as it causes several issues for PC and Excel files.

This can be the great reason behind this Runtime 13 error. As viruses damage the core program file of MS Office which is important for the execution of Excel application.

This makes the file unreadable and starts generating the following error message: Visual Basic runtime error 13 type mismatch in Excel

To avoid this error, you need to remove all virus infections from your system using the reliable anti-virus removal tool.

Well, it is found that if your Windows operating system in having viruses and malware then this might corrupt Excel file and as a result, you start facing the runtime file error 13.

So, it is recommended to scan your system with the best antivirus program and make your system malware-free. Ultimately this will also fix runtime error 13.

4. Recover Missing Macros

Well, as it is found that users are getting the runtime error 13 due to the missing macros, So try to recover the missing Macros.

Here follow the steps to do so:

  • Open the new Excel file > and set the calculation mode to Manual
  • Now from the Tools menu select Macro > select Security > High option.
  • If you are using Excel 2007, then click the Office button > Excel Options > Trust Center in the left panel
  • And click on Trust Center Settings button > Macro Settings > Disable All Macros without Notification in the Macro Settings section > click OK twice.

enable excel macros 1

  • Now, open the corrupted workbook. If Excel opens the workbook a message appears that the macros are disabled.
  • But if in case Excel shut down, then this method is not workable.
  • Next press [Alt] + [F11] for opening the Visual Basic Editor (VBE).
  • Make use of the Project Explorer (press [Ctrl]+R) > right-click a module > Export File.

Copy Macros in the Personal Macro Workbook 3

  • Type name and folder for the module > and repeat this step as many times as required to export the entire module.
  • Finally, close the VBE and exit.

Now open the new blank workbook (or the recently constructed workbook that contains recovered data from the corrupted workbook) and import the modules.

5.  Run The ‘Regedit’ Command In CMD

This Excel error 13 can also be fixed by running the ‘Regedit’ command in the command prompt.

  • In the search menu of your system’s start menu type run command.
  • Now in the opened run dialog box type “regedit” command. After that hit the OK
  • This will open the registry editor. On its right side there is a ‘LoadApplnit_DLLs value.’ option, just make double-tap to it.
  • Change the value from 1 to ‘0‘and then press the OK.

Run The ‘Regedit’ Command In CMD

  • Now take exit from this opened registry editor.
  • After completing all this, restart your PC.

Making the above changes will definitely resolve the Runtime Error 13 Type Mismatch.

6: Create New Disk Partition And Reinstall Windows 

If even after trying all the above-given fixes Excel type mismatched error still persists. In that case, the last option left here is to create the new partition and reinstall Windows.

  • In your PC insert windows DVD/CD and after that begin the installation procedure.
  • For installation, choose the language preference.
  • Tap to the option” I accept” and then hit the NEXT
  • Select the custom advance option and then choose the  Disk O partition 1

Create New Disk Partition And Reinstall Windows 

  • Now hit the delete> OK button.
  • The same thing you have to repeat after selecting the Disk O partition 2.
  • Now hit the delete> OK button to delete this too.
  • After completing the deletion procedure, tap to create a new partition.
  • Assign the disk size and tap to the Apply.

Create New Disk Partition And Reinstall Windows  1

  • Now choose the Disk 0 partition 2 and then hit the Formatting.
  • After complete formatting, hit the NEXT button to continue.

Note: before attempting this procedure don’t forget to keep a complete backup of all your data.

However, if you are still facing the Excel Runtime file error 13 then make use of the third party automatic repair tool.

7: Use MS Excel Repair Tool

It is recommended to make use of the MS Excel Repair Tool. This is the best tool to repair all sort of issues, corruption, errors in Excel workbooks. This tool allows to easily restore all corrupt excel file including the charts, worksheet properties cell comments, and other important data.

* Free version of the product only previews recoverable data.

This is a unique tool to repair multiple excel files at one repair cycle and recovers the entire data in a preferred location. It is easy to use and compatible with both Windows as well as Mac operating systems.

Steps to Utilize MS Excel Repair Tool:

Final Verdict:

After reading the complete post you must have got enough idea on Visual Basic runtime error 13 type mismatch in Excel. Following the listed given fixes you are able to fix the Excel runtime file error 13.

I tried my best to provide ample information about the runtime error and possible workarounds that will help you to fix the Excel file error.

So, just make use of the solutions given and check whether the Excel error is fixed or not.

In case you have any additional workarounds that proved successful or questions concerning the ones presented, do tell us in the comments.

Hope you find this post informative and helpful.

Thanks for reading…!

Summary

5 Ways To Fix Excel Runtime Error 13 Type Mismatch

Article Name

5 Ways To Fix Excel Runtime Error 13 Type Mismatch

Description

Read the complete guide to know how to fix Excel runtime error 13 type mismatch. Also know the exact reason behind this error.

Author

Publisher Name

Repair MS Excel Blogs

Publisher Logo

Repair MS Excel Blogs

Priyanka Sahu

Priyanka is an entrepreneur & content marketing expert. She writes tech blogs and has expertise in MS Office, Excel, and other tech subjects. Her distinctive art of presenting tech information in the easy-to-understand language is very impressive. When not writing, she loves unplanned travels.

VBA Type Mismatch

Excel VBA Type Mismatch

In this article, we will see an outline on Excel VBA Type Mismatch. This is the most usual thing that we all have faced while working on VBA Macro. Sometimes, when we create a macro, due to the selection of incorrect data types or values assignment, we end up getting the error as Type Mismatch. Such kind of error mostly happens at the time of variable assignment and declaration. VBA Type Mismatch gives the “Run Time Error” message with the error code 13. To avoid such errors it is advised to assign the variables properly with proper selection of data types and objects. Also, we need to understand each data type with the type of values it can hold.

How to Fix Type Mismatch Error in VBA?

We will learn how to fix Type Mismatch Error in Excel by using the VBA Code.

You can download this VBA Type Mismatch Excel Template here – VBA Type Mismatch Excel Template

Example #1 – VBA Type Mismatch

To demonstrate the type mismatch error, we need to open a module. For this, follow the below steps:

Step 1: We will go to the Insert menu tab and select the Module from there.

Insert Module

Step 2: Now write the subprocedure for VBA Type mismatch as shown below. We can choose any name here to define the subprocedure.

Code:

Sub VBA_TypeMismatch()

End Sub

VBA Type Mismatch Example 1-1

Step 3: Now we will define a variable let say “A” as an Integer data type.

Code:

Sub VBA_TypeMismatch()

Dim A As Integer

End Sub

VBA Type Mismatch Example 1-2

Step 4: As we all know, Integer data type only stores numbers and that to Whole Numbers. But, just to demonstrate here we will be assigning a text value to variable A.

Code:

Sub VBA_TypeMismatch()

Dim A As Integer
A = "Ten"

End Sub

Integer Data Type Example 1-3

Step 5: And to see the values stored in variable A we will use the Message box.

Code:

Sub VBA_TypeMismatch()

Dim A As Integer
A = "Ten"
MsgBox A

End Sub

VBA Type Mismatch Example 1-4

Step 6: Now run the code by pressing the F5 key or by clicking on the Play Button. As we can see, we really got the error message as “Run-Time Error ‘13’” as shown below with the additional message as “Type Mismatch”.

VBA Type Mismatch Example 1-5

As we already know that Integer can only store whole numbers. So giving it a text will definitely show the error. If we consider the same code and compiled it before we run it, we would have got this error message earlier also. For directly compiling the code, press the F8 function key.

Step 7: If we assign the correct value incorrect format to the variable we define, we will get the proper output.

Code:

Sub VBA_TypeMismatch()

Dim A As Integer
A = 10
MsgBox A

End Sub

VBA Type Mismatch Example 1-6

Step 8: Run the code by pressing the F5 key or by clicking on the Play Button. We will get the message as 10 which we assigned in variable A.

VBA Type Mismatch Example 1-7

Example #2 – VBA Type Mismatch

Let’s see another example of Type Mismatch. For this, follow the below steps:

Step 1: Write the subprocedure for VBA Type Mismatch.

Code:

Sub VBA_TypeMismatch2()

End Sub

VBA Type Mismatch Example 2-1

Step 2: Again assign a new variable, let’s say “A” as Byte data type.

Code:

Sub VBA_TypeMismatch2()

Dim A As Byte

End Sub

VBA Type Mismatch Example 2-2

Let’s understand the Byte Data type here. Byte can only store the numerical value from 0 to 255. And it doesn’t consider any negative value.

Step 3: Now let’s assign any value other than a number. Here we have considered the text “TEN”.

Code:

Sub VBA_TypeMismatch2()

Dim A As Byte
A = "Ten"

End Sub

VBA Type Mismatch Example 2-3

Step 4: And then we will message box for output.

Code:

Sub VBA_TypeMismatch2()

Dim A As Byte
A = "Ten"
MsgBox A

End Sub

VBA Type Mismatch Example 2-4

Step 5: Run the code by pressing the F5 key or by clicking on the Play Button. And we got the error message again. The message is the same as we got in example-1.

VBA Type Mismatch Example 2-5

Step 6: As we have entered value in incorrect format, so the error message we got as “Type Mismatch”. What if we entered a value that is greater than 255? Let’s consider 1000 here.

Code:

Sub VBA_TypeMismatch2()

Dim A As Byte
A = 1000
MsgBox A

End Sub

VBA Type Mismatch Example 2-6

Step 7: This time we got the error as “Run-Time Error ‘6’” overflow. Which means we have entered the value beyond the allow capacity of selected data type.

Run-Time Error ‘6 Example 2-7

Example #3 – VBA Type Mismatch

Let’s see another example. Here we will try to 2 data types and use them as any mathematical operation. For this, follow the below steps:

Step 1: Write the subprocedure for VBA Type Mismatch.

Code:

Sub VBA_TypeMismatch3()

End Sub

Excel VBA Type Mismatch Example 3-1

Step 2: Now let’s consider 2 variables A and B as Integer.

Code:

Sub VBA_TypeMismatch3()

Dim A As Integer
Dim B As Integer

End Sub

VBA Type Mismatch Example 3-2

Step 3: As we all have seen in the previous example, Integer only allows numbers as a whole. So we will be assigning one numeric value to one of the integers and assign any text to another variable as shown below.

Code:

Sub VBA_TypeMismatch3()

Dim A As Integer
Dim B As Integer
A = 10
B = "Ten"

End Sub

VBA Type Mismatch Example 3-3

Step 4: Let’s multiply the above variables here in the message box.

Code:

Sub VBA_TypeMismatch3()

Dim A As Integer
Dim B As Integer
A = 10
B = "Ten"
MsgBox A * B

End Sub

Message Box Example 3-4

Step 5: After running the code, we will get a message box with the error message “Run-time error ’13’”. It is because we have used one text to variable B and then multiplied A with B.

Run-time error ’13 Example 3-5

Step 6: And if we change the data type from Integer to Long. And also change the format of values.

Code:

Sub VBA_TypeMismatch4()

Dim A As Long
Dim B As Long
A = 10
B = "10"
MsgBox A * B

End Sub

Integer to Long Example 3-6

Step 7: If Run the code by pressing the F5 key or by clicking on the Play Button, this code will be successfully executed. Even if we have kept the value 10 in inverted colons in variable B.

VBA Type Mismatch Example 3-8

Pros of VBA Type Mismatch:

  • We actually get to know the mistake where it happened.
  • Error message is so to the point, that even if we do not compile the code, we will get the point of error in the code.

Things to Remember

  • Even if there is a small bracket where we considered a slightly different value, we will definitely get Type Mismatch Error.
  • Understand the type of data types we are going to use and the values permitted in those data types. This will allow us to avoid such silly errors and run the code successfully.
  • All the basic data types have some constraint of input values. It is better to choose those data types which don’t give such error as the wide range of input such as String, Long, Variant mainly. The rest of the data types have some limitations.
  • Once you are done with coding, it is better to save the code in a Macro Enabled Excel format.

Recommended Articles

This is a guide to VBA Type Mismatch. Here we discuss how to Fix Type Mismatch Error in Excel using VBA code along with practical examples and downloadable excel template. You can also go through our other suggested articles –

  1. VBA DateDiff
  2. VBA Square Root
  3. VBA SendKeys
  4. VBA Name Worksheet

In this Article

  • VBA Type Mismatch Errors
    • What is a Type Mismatch Error?
    • Mismatch Error Caused by Worksheet Calculation
      • Mismatch Error Caused by Entered Cell Values
      • Mismatch Error Caused by Calling a Function or Sub Routine Using Parameters
      • Mismatch Error Caused by using Conversion Functions in VBA Incorrectly
      • General Prevention of Mismatch Errors
      • Define your variables as Variant Type
      • Use the OnError Command to Handle Errors
      • Use the OnError Command to Supress Errors
      • Converting the Data to a Data Type to Match the Declaration
      • Testing Variables Within Your Code
      • Objects and Mismatch Errors

VBA Type Mismatch Errors

What is a Type Mismatch Error?

A mismatch error can often occur when you run your VBA code.  The error will stop your code from running completely and flag up by means of a message box that this error needs sorting out

Note that if you have not fully tested your code before distribution to users, this error message will be visible to users, and will cause a big loss of confidence in your Excel application.  Unfortunately, users often do very peculiar things to an application and are often things that you as the developer never considered.

A type mismatch error occurs because you have defined a variable using the Dim statement as a certain type e.g. integer, date, and your code is trying to assign a value to the variable which is not acceptable e.g. text string assigned to an integer variable as in this example:

Here is an example:

PIC 01

Click on Debug and the offending line of code will be highlighted in yellow.  There is no option on the error pop-up to continue, since this is a major error and there is no way the code can run any further.

In this particular case, the solution is to change the Dim statement to a variable type that works with the value that you are assigning to the variable. The code will work if you change the variable type to ‘String’, and you would probably want to change the variable name as well.

PIC 02

However, changing the variable type will need your project resetting, and you will have to run your code again right from the beginning again, which can be very annoying if a long procedure is involved

PIC 03

Mismatch Error Caused by Worksheet Calculation

The example above is a very simple one of how a mismatch error can be produced and, in this case, it is easily remedied

However, the cause of mismatch errors is usually far deeper than this, and is not so obvious when you are trying to debug your code.

As an example, suppose that you have written code to pick up a value in a certain position on a worksheet and it contains a calculation dependent other cells within the workbook (B1 in this example)

The worksheet looks like this example, with a formula to find a particular character within a string of text

PIC 04

From the user’s point of view, cell A1 is free format and they can enter any value that they want to.  However, the formula is looking for an occurrence of the character ‘B’, and in this case it is not found so cell B1 has an error value.

The test code below will produce a mismatch error because a wrong value has been entered into cell A1

Sub TestMismatch()
Dim MyNumber As Integer
MyNumber = Sheets("Sheet1").Range("B1").Value
End Sub

The value in cell B1 has produced an error because the user has entered text into cell A1 which does not conform to what was expected and it does not contain the character ‘B’

The code tries to assign the value to the variable ‘MyNumber’ which has been defined to expect an integer, and so you get a mismatch error.

This is one of these examples where meticulously checking your code will not provide the answer. You also need to look on the worksheet where the value is coming from in order to find out why this is happening.

The problem is actually on the worksheet, and the formula in B1 needs changing so that error values are dealt with. You can do this by using the ‘IFERROR’ formula to provide a default value of 0 if the search character is not found

PIC 05

You can then incorporate code to check for a zero value, and to display a warning message to the user that the value in cell A1 is invalid

Sub TestMismatch()
Dim MyNumber As Integer
MyNumber = Sheets("Sheet1").Range("B1").Text
If MyNumber = 0 Then
    MsgBox "Value at cell A1 is invalid", vbCritical
    Exit Sub
End If
End Sub

You could also use data validation (Data Tools group on the Data tab of the ribbon) on the spreadsheet to stop the user doing whatever they liked and causing worksheet errors in the first place. Only allow them to enter values that will not cause worksheet errors.

You could write VBA code based on the Change event in the worksheet to check what has been entered.

Also lock and password protect the worksheet, so that the invalid data cannot be entered

Mismatch Error Caused by Entered Cell Values

Mismatch errors can be caused in your code by bringing in normal values from a worksheet (non-error), but where the user has entered an unexpected value e.g. a text value when you were expecting a number.  They may have decided to insert a row within a range of numbers so that they can put a note into a cell explaining something about the number. After all, the user has no idea how your code works and that they have just thrown the whole thing out of kilter by entering their note.

PIC 06

The example code below creates a simple array called ‘MyNumber’ defined with integer values

The code then iterates through a range of the cells from A1 to A7, assigning the cell values into the array, using a variable ‘Coun’ to index each value

When the code reaches the text value, a mismatch error is caused by this and everything grinds to a halt

By clicking on ‘Debug’ in the error pop-up, you will see the line of code which has the problem highlighted in yellow. By hovering your cursor over any instance of the variable ‘Coun’ within the code, you will be able to see the value of ‘Coun’ where the code has failed, which in this case is 5

Looking on the worksheet, you will see that the 5th cell down has the text value and this has caused the code to fail

PIC 07

You could change your code by putting in a condition that checks for a numeric value first before adding the cell value into the array

Sub TestMismatch()
Dim MyNumber(10) As Integer, Coun As Integer
Coun = 1
Do
    If Coun = 11 Then Exit Do
    If IsNumeric(Sheets("sheet1").Cells(Coun, 1).Value) Then
            MyNumber(Coun) = Sheets("sheet1").Cells(Coun, 1).Value
    Else
            MyNumber(Coun) = 0
    End If
    Coun = Coun + 1
Loop
End Sub

The code uses the ‘IsNumeric’ function to test if the value is actually a number, and if it is then it enters it into the array. If it is not number then it enters the value of zero.

This ensures that the array index is kept in line with the cell row numbers in the spreadsheet.

You could also add code that copies the original error value and location details to an ‘Errors’ worksheet so that the user can see what they have done wrong when your code is run.

The numeric test uses the full code for the cell as well as the code to assign the value into the array.  You could argue that this should be assigned to a variable so as not to keep repeating the same code, but the problem is that you would need to define the variable as a ‘Variant’ which is not the best thing to do.

You also need data validation on the worksheet and to password protect the worksheet.  This will prevent the user inserting rows, and entering unexpected data.

Mismatch Error Caused by Calling a Function or Sub Routine Using Parameters

When a function is called, you usually pass parameters to the function using data types already defined by the function. The function may be one already defined in VBA, or it may be a User Defined function that you have built yourself. A sub routine can also sometimes require parameters

If you do not stick to the conventions of how the parameters are passed to the function, you will get a mismatch error

Sub CallFunction()
Dim Ret As Integer
Ret = MyFunction(3, "test")
End Sub

Function MyFunction(N As Integer, T As String) As String
MyFunction = T
End Function

There are several possibilities here to get a mismatch error

The return variable (Ret) is defined as an integer, but the function returns a string. As soon as you run the code, it will fail because the function returns a string, and this cannot go into an integer variable.  Interestingly, running Debug on this code does not pick up this error.

If you put quote marks around the first parameter being passed (3), it is interpreted as a string, which does not match the definition of the first parameter in the function (integer)

If you make the second parameter in the function call into a numeric value, it will fail with a mismatch because the second parameter in the string is defined as a string (text)

Mismatch Error Caused by using Conversion Functions in VBA Incorrectly

There are a number of conversion functions that your can make use of in VBA to convert values to various data types. An example is ‘CInt’ which converts a string containing a number into an integer value.

If the string to be converted contains any alpha characters then you will get a mismatch error, even if the first part of the string contains numeric characters and the rest is alpha characters e.g. ‘123abc’

General Prevention of Mismatch Errors

We have seen in the examples above several ways of dealing with potential mismatch errors within your code, but there are a number of other ways, although they may not be the best options:

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Define your variables as Variant Type

A variant type is the default variable type in VBA. If you do not use a Dim statement for a variable and simply start using it in your code, then it is automatically given the type of Variant.

A Variant variable will accept any type of data, whether it is an integer, long integer, double precision number, boolean, or text value. This sounds like a wonderful idea, and you wonder why everyone does not just set all their variables to variant.

However, the variant data type has several downsides. Firstly, it takes up far more memory than other data types.  If you define a very large array as variant, it will swallow up a huge amount of memory when the VBA code is running, and could easily cause performance issues

Secondly, it is slower in performance generally, than if you are using specific data types.  For example, if you are making complex calculations using floating decimal point numbers, the calculations will be considerably slower if you store the numbers as variants, rather than double precision numbers

Using the variant type is considered sloppy programming, unless there is an absolute necessity for it.

Use the OnError Command to Handle Errors

The OnError command can be included in your code to deal with error trapping, so that if an error does ever occur the user sees a meaningful message instead of the standard VBA error pop-up

Sub ErrorTrap()
Dim MyNumber As Integer
On Error GoTo Err_Handler
MyNumber = "test"
Err_Handler:
MsgBox "The error " & Err.Description & " has occurred"
End Sub

This effectively prevents the error from stopping the smooth running of your code and allows the user to recover cleanly from the error situation.

The Err_Handler routine could show further information about the error and who to contact about it.

From a programming point of view, when you are using an error handling routine, it is quite difficult to locate the line of code the error is on. If you are stepping through the code using F8, as soon as the offending line of code is run, it jumps to the error handling routine, and you cannot check where it is going wrong.

A way around this is to set up a global constant that is True or False (Boolean) and use this to turn the error handling routine on or off using an ‘If’ statement.  When you want to test the error all you have to do is set the global constant to False and the error handler will no longer operate.

Global Const ErrHandling = False
Sub ErrorTrap()
Dim MyNumber As Integer
If ErrHandling = True Then On Error GoTo Err_Handler
MyNumber = "test"
Err_Handler:
MsgBox "The error " & Err.Description & " has occurred"
End Sub

The one problem with this is that it allows the user to recover from the error, but the rest of the code within the sub routine does not get run, which may have enormous repercussions later on in the application

Using the earlier example of looping through a range of cells, the code would get to cell A5 and hit the mismatched error.  The user would see a message box giving information on the error, but nothing from that cell onwards in the range would be processed.

VBA Programming | Code Generator does work for you!

Use the OnError Command to Supress Errors

This uses the ‘On Error Resume Next’ command. This is very dangerous to include in your code as it prevents any subsequent errors being shown.  This basically means that as your code is executing, if an error occurs in a line of code, execution will just move to the next available line without executing the error line, and carry on as normal.

This may sort out a potential error situation, but it will still affect every future error in the code. You may then think that your code is bug free, but in fact it is not and parts of your code are not doing what you think it ought to be doing.

There are situations where it is necessary to use this command, such as if you are deleting a file using the ‘Kill’ command (if the file is not present, there will be an error), but the error trapping should always be switched back on immediately after where the potential error could occur using:

On Error Goto 0

In the earlier example of looping through a range of cells, using ‘On Error Resume Next’, this would enable the loop to continue, but the cell causing the error would not be transferred into the array, and the array element for that particular index would hold a null value.

Converting the Data to a Data Type to Match the Declaration

You can use VBA functions to alter the data type of incoming data so that it matches the data type of the receiving variable.

You can do this when passing parameters to functions.  For example, if you have a number that is held in a string variable and you want to pass it as a number to a function, you can use CInt

There are a number of these conversion functions that can be used, but here are the main ones:

CInt – converts a string that has a numeric value (below + or – 32,768) into an integer value. Be aware that this truncates any decimal points off

CLng – Converts a string that has a large numeric value into a long integer.  Decimal points are truncated off.

CDbl – Converts a string holding a floating decimal point number into a double precision number.  Includes decimal points

CDate – Converts a string that holds a date into a date variable. Partially depends on settings in the Windows Control Panel and your locale on how the date is interpreted

CStr – Converts a numeric or date value into a string

When converting from a string to a number or a date, the string must not contain anything other that numbers or a date.  If alpha characters are present this will produce a mismatch error. Here is an example that will produce a mismatch error:

Sub Test()
MsgBox CInt("123abc")
End Sub

Testing Variables Within Your Code

You can test a variable to find out what data type it is before you assign it to a variable of a particular type.

For example, you could check a string to see if it is numeric by using the ‘IsNumeric’ function in VBA

MsgBox IsNumeric("123test")

This code will return False because although the string begins with numeric characters, it also contains text so it fails the test.

MsgBox IsNumeric("123")

This code will return True because it is all numeric characters

There are a number of functions in VBA to test for various data types, but these are the main ones:

IsNumeric – tests whether an expression is a number or not

IsDate – tests whether an expression is a date or not

IsNull – tests whether an expression is null or not. A null value can only be put into a variant object otherwise you will get an error ‘Invalid Use of Null’. A message box returns a null value if you are using it to ask a question, so the return variable has to be a variant. Bear in mind that any calculation using a null value will always return the result of null.

IsArray – tests whether the expression represents an array or not

IsEmpty – tests whether the expression is empty or not.  Note that empty is not the same as null. A variable is empty when it is first defined but it is not a null value

Surprisingly enough, there is no function for IsText or IsString, which would be really useful

Objects and Mismatch Errors

If you are using objects such as a range or a sheet, you will get a mismatch error at compile time, not at run time, which gives you due warning that your code is not going to work

Sub TestRange()
Dim MyRange As Range, I As Long
Set MyRange = Range("A1:A2")
I = 10
x = UseMyRange(I)
End Sub
Function UseMyRange(R As Range)
End Function

This code has a function called ‘UseMyRange’ and a parameter passed across as a range object. However, the parameter being passed across is a Long Integer which does not match the data type.

When you run VBA code, it is immediately compiled, and you will see this error message:

PIC 08

The offending parameter will be highlighted with a blue background

Generally, if you make mistakes in VBA code using objects you will see this error message, rather than a type mismatch message:

PIC 09

Что такое ошибка несоответствия типа?

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

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

Ошибка несоответствия типа возникает из-за того, что вы определили переменную с помощью оператора Dim как определенный тип, например. целое число, дата и ваш код пытается присвоить значение переменной, которое неприемлемо, например. текстовая строка, присвоенная целочисленной переменной, как в этом примере:

Вот пример:

Нажмите «Отладка», и вызывающая нарушение строка кода будет выделена желтым цветом. Во всплывающем окне с ошибкой нет возможности продолжить, так как это серьезная ошибка, и код не может работать дальше.

В этом конкретном случае решение состоит в том, чтобы изменить оператор Dim на тип переменной, который работает со значением, которое вы присваиваете переменной. Код будет работать, если вы измените тип переменной на «String», и вы, вероятно, захотите также изменить имя переменной.

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

Ошибка несоответствия, вызванная расчетом рабочего листа

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

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

В качестве примера предположим, что вы написали код для выбора значения в определенной позиции на листе, и он содержит зависимые от вычислений другие ячейки в книге (B1 в этом примере).

Рабочий лист выглядит как этот пример, с формулой для поиска определенного символа в строке текста.

С точки зрения пользователя, ячейка A1 имеет свободный формат, и они могут вводить любое значение, которое захотят. Однако формула ищет вхождение символа «B», и в этом случае он не найден, поэтому в ячейке B1 содержится значение ошибки.

Приведенный ниже тестовый код приведет к ошибке несоответствия, поскольку в ячейку A1 было введено неправильное значение.

1234 Sub TestMismatch ()Dim MyNumber как целое числоMyNumber = Sheets («Sheet1»). Range («B1»). ValueКонец подписки

Значение в ячейке B1 вызвало ошибку, потому что пользователь ввел текст в ячейку A1, который не соответствует ожидаемому и не содержит символа «B».

Код пытается присвоить значение переменной «MyNumber», которая была определена как ожидание целого числа, и поэтому вы получаете ошибку несоответствия.

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

Проблема на самом деле находится на рабочем листе, и формулу в B1 нужно изменить, чтобы значения ошибок были обработаны. Вы можете сделать это, используя формулу «ЕСЛИОШИБКА», чтобы указать значение по умолчанию 0, если поисковый символ не найден.

Затем вы можете включить код для проверки нулевого значения и отображения предупреждающего сообщения для пользователя о том, что значение в ячейке A1 недопустимо.

12345678 Sub TestMismatch ()Dim MyNumber как целое числоMyNumber = Sheets («Sheet1»). Range («B1»). TextЕсли MyNumber = 0, тоMsgBox «Недопустимое значение в ячейке A1», vbCriticalВыйти из подводной лодкиКонец, еслиКонец подписки

Вы также можете использовать проверку данных (группа «Инструменты данных» на вкладке «Данные» на ленте) в электронной таблице, чтобы не дать пользователю делать все, что ему нравится, и в первую очередь вызвать ошибки на листе. Разрешите им вводить только значения, которые не вызовут ошибок на листе.

Вы можете написать код VBA на основе события Change на листе, чтобы проверить, что было введено.

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

Ошибка несоответствия, вызванная введенными значениями ячеек

Ошибки несоответствия могут быть вызваны в вашем коде путем ввода нормальных значений из рабочего листа (без ошибок), но когда пользователь ввел неожиданное значение, например текстовое значение, когда вы ожидали число. Возможно, они решили вставить строку в диапазон чисел, чтобы они могли поместить заметку в ячейку, объясняющую что-то о числе. В конце концов, пользователь понятия не имеет, как работает ваш код, и что он просто выбросил все из строя, введя свою заметку.

В приведенном ниже примере кода создается простой массив с именем MyNumber, определенный с целочисленными значениями.

Затем код выполняет итерацию по диапазону ячеек от A1 до A7, присваивая значения ячеек в массив, используя переменную «Coun» для индексации каждого значения.

Когда код достигает текстового значения, это вызывает ошибку несоответствия, и все останавливается

Нажав «Отладка» во всплывающем окне с ошибкой, вы увидите строку кода, в которой проблема выделена желтым цветом. Наведя курсор на любой экземпляр переменной «Coun» в коде, вы сможете увидеть значение «Coun», в котором произошел сбой кода, которое в данном случае равно 5.

Посмотрев на лист, вы увидите, что 5th ячейка вниз имеет текстовое значение, и это привело к сбою кода

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

12345678910111213 Sub TestMismatch ()Dim MyNumber (10) как целое число, счетчик как целоеCoun = 1ДелатьЕсли Coun = 11, то выйти из DoЕсли IsNumeric (Sheets («sheet1»). Cells (Coun, 1) .Value), тоMyNumber (Coun) = Sheets («sheet1»). Cells (Coun, 1) .ValueЕщеMyNumber (Coun) = 0Конец, еслиCoun = Coun + 1ПетляКонец подписки

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

Это гарантирует, что индекс массива будет соответствовать номерам строк ячеек в электронной таблице.

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

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

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

Ошибка несоответствия, вызванная вызовом функции или подпрограммы с использованием параметров

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

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

12345678 Дополнительная функция вызова ()Dim Ret As IntegerRet = MyFunction (3, «тест»)Конец подпискиФункция MyFunction (N как целое число, T как строка) как строкаMyFunction = TКонечная функция

Здесь есть несколько возможностей получить ошибку несоответствия

Возвращаемая переменная (Ret) определяется как целое число, но функция возвращает строку. Как только вы запустите код, он завершится ошибкой, потому что функция возвращает строку, а это не может быть передано в целочисленную переменную. Интересно, что запуск Debug для этого кода не обнаруживает эту ошибку.

Если вы поместите кавычки вокруг первого передаваемого параметра (3), он интерпретируется как строка, которая не соответствует определению первого параметра в функции (целое число)

Если вы сделаете второй параметр в вызове функции числовым значением, он завершится ошибкой с несоответствием, потому что второй параметр в строке определен как строка (текст)

Ошибка несоответствия, вызванная неправильным использованием функций преобразования в VBA

Существует ряд функций преобразования, которые вы можете использовать в VBA для преобразования значений в различные типы данных. Примером является «CInt», который преобразует строку, содержащую число, в целочисленное значение.

Если преобразуемая строка содержит какие-либо буквенные символы, вы получите ошибку несоответствия, даже если первая часть строки содержит числовые символы, а остальные — буквенные символы, например. «123abc»

Общее предотвращение ошибок несоответствия

В приведенных выше примерах мы видели несколько способов борьбы с потенциальными ошибками несоответствия в вашем коде, но есть ряд других способов, хотя они могут быть не лучшими вариантами:

Определите свои переменные как тип варианта

Вариантный тип — это тип переменной по умолчанию в VBA. Если вы не используете оператор Dim для переменной и просто начинаете использовать его в своем коде, то ему автоматически присваивается тип Variant.

Переменная Variant принимает данные любого типа, будь то целое число, длинное целое число, число двойной точности, логическое или текстовое значение. Это звучит как прекрасная идея, и вы задаетесь вопросом, почему все не устанавливают все свои переменные на вариант.

Однако вариантный тип данных имеет несколько недостатков. Во-первых, он занимает гораздо больше памяти, чем другие типы данных. Если вы определите очень большой массив как вариант, он поглотит огромный объем памяти при выполнении кода VBA и может легко вызвать проблемы с производительностью.

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

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

Используйте команду OnError для обработки ошибок

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

1234567 Sub ErrorTrap ()Dim MyNumber как целое числоПри ошибке GoTo Err_HandlerMyNumber = «тест»Err_Handler:MsgBox «Произошла ошибка» & Описание ошибки & «Произошла»Конец подписки

Это эффективно предотвращает остановку бесперебойной работы вашего кода из-за ошибки и позволяет пользователю полностью восстановиться из ситуации с ошибкой.

Подпрограмма Err_Handler может показать дополнительную информацию об ошибке и с кем связаться по этому поводу.

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

Один из способов обойти это — установить глобальную константу, имеющую значение True или False (логическое значение), и использовать ее для включения или выключения процедуры обработки ошибок с помощью оператора «If». Если вы хотите проверить ошибку, все, что вам нужно сделать, это установить для глобальной константы значение False, и обработчик ошибок больше не будет работать.

1 Global Const ErrHandling = False
1234567 Sub ErrorTrap ()Dim MyNumber как целое числоЕсли ErrHandling = True, то при ошибке Перейти к Err_HandlerMyNumber = «тест»Err_Handler:MsgBox «Произошла ошибка» & Описание ошибки & «Произошла»Конец подписки

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

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

Используйте команду OnError для подавления ошибок

Для этого используется команда «Возобновить при ошибке». Это очень опасно включать в ваш код, поскольку это предотвращает отображение любых последующих ошибок. Это в основном означает, что если ваш код выполняется, если в строке кода возникает ошибка, выполнение просто переместится на следующую доступную строку, не выполняя строку ошибки, и продолжится как обычно.

Это может устранить потенциальную ошибку, но все равно повлияет на каждую будущую ошибку в коде. Тогда вы можете подумать, что ваш код не содержит ошибок, но на самом деле это не так, и части вашего кода не делают то, что вы думаете, что они должны делать.

Есть ситуации, когда необходимо использовать эту команду, например, если вы удаляете файл с помощью команды ‘Kill’ (если файл отсутствует, будет ошибка), но перехват ошибок всегда должен быть переключен обратно сразу после того, как могла произойти потенциальная ошибка, используя:

В предыдущем примере цикла по диапазону ячеек с использованием ‘On Error Resume Next’ это позволило бы продолжить цикл, но ячейка, вызвавшая ошибку, не будет перенесена в массив, а элемент массива для этого конкретного индекса будет содержать нулевое значение.

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

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

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

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

CInt — преобразует строку с числовым значением (ниже + или — 32 768) в целочисленное значение. Имейте в виду, что это обрезает все десятичные точки.

CLng — преобразует строку с большим числовым значением в длинное целое число. Десятичные точки обрезаются.

CDbl — преобразует строку, содержащую число с плавающей десятичной запятой, в число с двойной точностью. Включает десятичные дроби

CDate — преобразует строку, содержащую дату, в переменную даты. Частично зависит от настроек в Панели управления Windows и вашего языкового стандарта от того, как интерпретируется дата.

CStr — преобразует числовое значение или значение даты в строку.

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

123 Подтест ()MsgBox CInt («123abc»)Конец подписки

Тестирование переменных в вашем коде

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

Например, вы можете проверить строку, чтобы узнать, является ли она числовой, используя функцию «IsNumeric» в VBA.

1 MsgBox IsNumeric («123test»)

Этот код вернет False, потому что, хотя строка начинается с числовых символов, она также содержит текст, поэтому тест не пройден.

1 MsgBox IsNumeric («123»)

Этот код вернет True, потому что это все числовые символы.

В VBA есть ряд функций для тестирования различных типов данных, но это основные из них:

IsNumeric — проверяет, является ли выражение числом

IsDate — проверяет, является ли выражение датой.

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

IsArray — проверяет, представляет ли выражение массив или нет

IsEmpty — проверяет, является ли выражение пустым или нет. Обратите внимание, что пустой — это не то же самое, что и null. При первом определении переменная пуста, но не является нулевым значением.

Как ни странно, для IsText или IsString нет функции, которая была бы действительно полезной.

Объекты и ошибки несоответствия

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

123456 Sub TestRange ()Dim MyRange As Range, I As LongУстановить MyRange = Range («A1: A2»)I = 10x = UseMyRange (I)Конец подписки
12 Функция UseMyRange (R как диапазон)Конечная функция

В этом коде есть функция под названием UseMyRange и параметр, переданный как объект диапазона. Однако передаваемый параметр представляет собой длинное целое число, которое не соответствует типу данных.

Когда вы запускаете код VBA, он немедленно компилируется, и вы увидите это сообщение об ошибке:

Неверный параметр будет выделен синим фоном.

Как правило, если вы делаете ошибки в коде VBA, используя объекты, вы увидите это сообщение об ошибке, а не сообщение о несоответствии типа:

Заполняю ТЗ из Excel. Бывает что пользователи в excelе собьют формулу или еще что и в ячейке, значение которой нужно установить получается #ЗНАЧ!. 1С выдает ошибку Несовпадение типов и намертво зависает. Попробовал вставить попытку не помогло: Что еще можно придумать?

Попробовать отловить конкретное место ошибки. Выяснить какое значение у Value, если в ячейке #ЗНАЧ! . Может достаточно написать Если Value = Что_То Тогда и т.д.

Это из 7.7. В 8-ке можно попробовать через ТипЗнч определить тип значения, но я лично не пробовал.

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

и переведи код на использование ComSafeArray — благо в 8-ке он поддерживается штатно.

Вроде рубрика «7.7 и ранние»?..

а блин, не увидел :) лови готовый код На вход подаешь ВходExcel.ActiveSheet и на форме ТаблицаЗначений «ТЗ» заполняется данными с листа.

Чето как то я очкую работать со скриптами)

попробуй грузануть большую таблицу своим методом и с помощью скрипта — перестанешь очковать.

В принципе мне и нравится, но 1 чето не получается получить значение Value.

Сделал как в — Спасибо!!! Еще не скромный вопрос: как код убирать в спойлер?

Предложил универсальный способ … Вот так можно еще Если Excel.IsError(Excel.ActiveSheet.Cells(1,1)) = True Тогда

Хотя и предложенный вариант вроде верный только тип нужно проверить

хороший метод, лучше чем 2 (там только для двух языков сработает, а если локаль не рус/анг — то облом). Тока в 7.7 True нет. Я лично уже давно гружу через ComSafeArray — разница в скорости огромна.

движок форума автоматом это делает для «простыней»

Тэги: 1С 7.7 и ранее

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

Понравилась статья? Поделить с друзьями:
  • Ошибка несовпадение контрольной суммы ошибка 12
  • Ошибка несовместимые типы выразить
  • Ошибка несовместимости windows
  • Ошибка несмонтированный том торрент
  • Ошибка несбалансированная разблокировка after effects