Ошибка макроса run time error 13

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

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 receiving «Run time error 13» when i try to submit the user form.

dTotal1 = CDbl(sval1) + CDbl(sval2) + CDbl(sval3) + CDbl(sval4) + CDbl(sval6)

Here is the complete code. Please help.

Private Sub AddTextBox()

 Dim sval1 As Variant
 Dim sval2 As String
 Dim sval3 As String
 Dim sval4 As String
 Dim sval5 As String
 Dim sval6 As String
 Dim sval7 As String
 Dim sval8 As String
 Dim sval9 As String
 Dim sval10 As String
 Dim sval11 As String
 Dim sval12 As String
 Dim sval13 As String
 Dim sval14 As String
 Dim sval15 As String
 Dim sval16 As String
 Dim sval17 As String
 Dim sval18 As String
 Dim sval19 As String
 Dim sval20 As String
 Dim sval21 As String
 Dim sval22 As String
 Dim sval23 As String
 Dim sval24 As String
 Dim sval25 As String

 Dim sval100 As String
 Dim sval101 As String
 Dim sval102 As String
 Dim sval103 As String
 Dim sval104 As String

 Dim sval105 As String
 Dim sval106 As String
 Dim sval107 As String
 Dim sval108 As String

 Dim sval109 As String
 Dim sval110 As String
 Dim sval111 As String
 Dim sval112 As String

 Dim sval113 As String
 Dim sval114 As String
 Dim sval115 As String

 Dim sval116 As String
 Dim sval117 As String



 Dim sval31 As String
 Dim sval32 As String
 Dim sval33 As String
 Dim sval34 As String
 Dim sval35 As String
 Dim sval36 As String
 Dim sval37 As String
 Dim sval38 As String
 Dim sval39 As String
 Dim sval40 As String
 Dim sval41 As String
 Dim sval42 As String
 Dim sval43 As String
 Dim sval44 As String
 Dim sval45 As String
 Dim sval46 As String
 Dim sval47 As String
 Dim sval48 As String




 Dim dTotal1 As String
 Dim dTotal2 As String
 Dim dTotal3 As String
 Dim dTotal4 As String
 Dim dTotal5 As String
 Dim dTotal6 As String
 Dim dTotal11 As String
 Dim dTotal12 As String
 Dim dTotal13 As String
 Dim dTotal14 As String
 Dim dTotal15 As String
 Dim dTotal16 As String
 Dim dTotal17 As String

With Me

    sval1 = .CB1.Value
    sval2 = .CB2.Value
    sval3 = .CB3.Value
    sval4 = .CB4.Value
    sval6 = .CB6.Value
    sval100 = .CB1.Value
    sval101 = .CB2.Value
    sval102 = .CB3.Value
    sval103 = .CB4.Value
    sval104 = .CB6.Value
    sval31 = .CB1.Value
    sval32 = .CB2.Value
    sval33 = .CB3.Value
    sval34 = .CB4.Value
    sval35 = .CB6.Value



    sval7 = .CB7.Value
    sval8 = .CB8.Value
    sval9 = .CB9.Value
    sval10 = .CB10.Value
    sval105 = .CB7.Value
    sval106 = .CB8.Value
    sval107 = .CB9.Value
    sval108 = .CB10.Value
    sval36 = .CB7.Value
    sval37 = .CB8.Value
    sval38 = .CB9.Value
    sval39 = .CB10.Value



    sval11 = .CB11.Value
    sval12 = .CB12.Value
    sval13 = .CB13.Value
    sval14 = .CB14.Value
    sval109 = .CB11.Value
    sval110 = .CB12.Value
    sval111 = .CB13.Value
    sval112 = .CB14.Value
    sval40 = .CB11.Value
    sval41 = .CB12.Value
    sval42 = .CB13.Value
    sval43 = .CB14.Value



    sval15 = .CB15.Value
    sval16 = .CB16.Value
    sval17 = .CB17.Value
    sval113 = .CB15.Value
    sval114 = .CB16.Value
    sval115 = .CB17.Value
    sval44 = .CB15.Value
    sval45 = .CB16.Value
    sval46 = .CB17.Value


    sval18 = .CB18.Value
    sval19 = .CB19.Value
    sval116 = .CB18.Value
    sval117 = .CB19.Value
    sval47 = .CB18.Value
    sval48 = .CB19.Value


    If sval1 = "" Or sval1 = "NA" Then sval1 = 0
    If sval2 = "" Or sval2 = "NA" Then sval2 = 0
    If sval3 = "" Or sval3 = "NA" Then sval3 = 0
    If sval4 = "" Or sval4 = "NA" Then sval4 = 0
    If sval6 = "" Or sval6 = "NA" Then sval6 = 0
  If sval100 = "NA" Then sval100 = 0 Else sval100 = 5
  If sval101 = "NA" Then sval101 = 0 Else sval101 = 3
  If sval102 = "NA" Then sval102 = 0 Else sval102 = 3
  If sval103 = "NA" Then sval103 = 0 Else sval103 = 4
  If sval104 = "NA" Then sval104 = 0 Else sval104 = 5
    If sval7 = "" Or sval7 = "NA" Then sval7 = 0
    If sval8 = "" Or sval8 = "NA" Then sval8 = 0
    If sval9 = "" Or sval9 = "NA" Then sval9 = 0
    If sval10 = "" Or sval10 = "NA" Then sval10 = 0
  If sval105 = "NA" Then sval105 = 0 Else sval105 = 7
  If sval106 = "NA" Then sval106 = 0 Else sval106 = 3
  If sval107 = "NA" Then sval107 = 0 Else sval107 = 2
  If sval108 = "NA" Then sval108 = 0 Else sval108 = 2
    If sval11 = "" Or sval11 = "NA" Then sval11 = 0
    If sval12 = "" Or sval12 = "NA" Then sval12 = 0
    If sval13 = "" Or sval13 = "NA" Then sval13 = 0
    If sval14 = "" Or sval14 = "NA" Then sval14 = 0
  If sval109 = "NA" Then sval109 = 0 Else sval109 = 5
  If sval110 = "NA" Then sval110 = 0 Else sval110 = 3
  If sval111 = "NA" Then sval111 = 0 Else sval111 = 8
  If sval112 = "NA" Then sval112 = 0 Else sval112 = 10
    If sval15 = "" Or sval15 = "NA" Then sval15 = 0
    If sval16 = "" Or sval16 = "NA" Then sval16 = 0
    If sval17 = "" Or sval17 = "NA" Then sval17 = 0
  If sval113 = "NA" Then sval113 = 0 Else sval113 = 8
  If sval114 = "NA" Then sval114 = 0 Else sval114 = 10
  If sval115 = "NA" Then sval115 = 0 Else sval115 = 10
    If sval18 = "" Or sval18 = "NA" Then sval18 = 0
    If sval19 = "" Or sval19 = "NA" Then sval19 = 0
  If sval116 = "NA" Then sval116 = 0 Else sval116 = 5
  If sval117 = "NA" Then sval117 = 0 Else sval117 = 7




    dTotal11 = CDbl(sval100) + CDbl(sval101) + CDbl(sval102) + CDbl(sval103) + CDbl(sval104)
    dTotal12 = CDbl(sval105) + CDbl(sval106) + CDbl(sval107) + CDbl(sval108)
    dTotal13 = CDbl(sval109) + CDbl(sval110) + CDbl(sval111) + CDbl(sval112)
    dTotal14 = CDbl(sval113) + CDbl(sval114) + CDbl(sval115)
    dTotal15 = CDbl(sval116) + CDbl(sval117)





    dTotal1 = CDbl(sval1) + CDbl(sval2) + CDbl(sval3) + CDbl(sval4) + CDbl(sval6)
    dTotal2 = CDbl(sval7) + CDbl(sval8) + CDbl(sval9) + CDbl(sval10)
    dTotal3 = CDbl(sval11) + CDbl(sval12) + CDbl(sval13) + CDbl(sval14)
    dTotal4 = CDbl(sval15) + CDbl(sval16) + CDbl(sval17)
    dTotal5 = CDbl(sval18) + CDbl(sval19)



    .TextBox1 = Format(dTotal1, "0")
    .TextBox8 = Format(dTotal11, "0")
    .TextBox2 = Format(dTotal2, "0")
    .TextBox9 = Format(dTotal12, "0")
    .TextBox3 = Format(dTotal3, "0")
    .TextBox10 = Format(dTotal13, "0")
    .TextBox4 = Format(dTotal4, "0")
    .TextBox11 = Format(dTotal14, "0")
    .TextBox5 = Format(dTotal5, "0")
    .TextBox12 = Format(dTotal15, "0")


  End With



With Me
    If dTotal1 = "" Then dTotal1 = 0
    If dTotal2 = "" Then dTotal2 = 0
    If dTotal3 = "" Then dTotal3 = 0
    If dTotal4 = "" Then dTotal4 = 0
    If dTotal5 = "" Then dTotal5 = 0


    If dTotal11 = "" Then dTotal11 = 0
    If dTotal12 = "" Then dTotal12 = 0
    If dTotal13 = "" Then dTotal13 = 0
    If dTotal14 = "" Then dTotal14 = 0
    If dTotal15 = "" Then dTotal15 = 0




    dTotal6 = CDbl(dTotal1) + CDbl(dTotal2) + CDbl(dTotal3) + CDbl(dTotal4) + CDbl(dTotal5)
    dTotal16 = CDbl(dTotal11) + CDbl(dTotal12) + CDbl(dTotal13) + CDbl(dTotal14) + CDbl(dTotal15)


       .TextBox6 = Format((dTotal6 / dTotal16), "Percent")

  End With

End Sub

lfrandom's user avatar

lfrandom

1,0132 gold badges10 silver badges32 bronze badges

asked Jul 30, 2013 at 13:38

user2634232's user avatar

1

This code is a big mess… You could use arrays, but, more important then that, you should care about types!

Anyway, your problem should be CDbl(...) applied on a empty string.

EDIT: Improvement suggestions

  1. Declare your numeric variables as Double, instead of String
  2. Replace your block svalX = .CBX.Value and If svalX="" Then svalX=## Else svalX=## with If IsNumeric(.CB#.Value) Then sval#=.CB#.Value Else sval#=#
  3. You may use your dTotal#=CDbl(sval#)+..., but CDbl will not be needed anymore.

answered Jul 30, 2013 at 13:56

LS_ᴅᴇᴠ's user avatar

LS_ᴅᴇᴠLS_ᴅᴇᴠ

10.8k1 gold badge23 silver badges46 bronze badges

3

You could probably fix it by replacing all CDbl() calls with Val(), but that won’t really solve the underlying problem.

As LS_Dev said: mind your data types. Try to avoid the use of Variants and don’t store numeric values in string variables to use them as numeric again a bit further on.

Anyway, you’re probably calling CDbl on a string that contains something that’s not a number.
You’re trying to avoid that higher up, but you must be missing something.
Are all «NA» really written in upper case, for example? No other special cases besides empty strings and «NA»?

answered Jul 30, 2013 at 14:09

Luc VdV's user avatar

Luc VdVLuc VdV

1,0989 silver badges14 bronze badges

1

 

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 написал: У меня нету подсказок, не знаю почему

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

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

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

Dim rgMonth As Range
Dim rgTaxExp As Range

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

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

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

Community's user avatar

asked Jun 28, 2013 at 15:18

user2532363's user avatar

5

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

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

For j = 1 To rgMonth.Columns.Count

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

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

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

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

answered Jun 28, 2013 at 21:08

Jon Crowell's user avatar

Jon CrowellJon Crowell

21.7k14 gold badges89 silver badges110 bronze badges

0 / 0 / 0

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

Сообщений: 3

1

24.05.2009, 23:12. Показов 66893. Ответов 25


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

В приложении файл с таблицей эксель и макросом.
Для работы макроса — выделите ячейки ((1,3)23,5))
выдает ошщибку, причем раз через раз, до некоторых пор с этим куском все работало отменно.
Что это может быть? баг?
Очень нужна помощь



0



886 / 681 / 101

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

Сообщений: 1,582

24.05.2009, 23:31

2

Это не «баг». Это «отсутствие проверки входных данных».

При калькуляции возникает ситуация, когда код пытается сконвертировать текстовое значение «-» в число.
Ессессно, у VB это не выходит…



0



Джонни21

0 / 0 / 0

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

Сообщений: 14

19.05.2015, 06:58

3

Люди, такая же проблема! Объявил переменные с типом Double, присвоил переменным значения из TextBox1.Text с помощью CDbl, вывожу тоже из переменной типа Double, вся программа с этим типом чёртовым, но, увы и ах, VBA умудряется выдать мне Run-time error 13 — Type Dismatch! Помогите дураку) Вот код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub CommandButton1_Click()
Dim a, b, c, d, e, f, x, y As Double
a = CDbl(TextBox1.Text)
b = CDbl(TextBox2.Text)
x = CDbl(TextBox3.Text)
y = CDbl(TextBox4.Text)
 
c = a * (x / y)
d = Math.Tan(c)
e = b * (y / b)
c = 1 / (Math.Tan(e))
e = d - c
c = a * (x ^ 2)
d = b * (y ^ 2)
f = c + d
c = e / f
d = Math.Sqr(a * x)
e = Math.Sqr(b * y)
f = d + e
d = Math.Exp(f)
f = c * d
 
Label1.Caption = CStr(f)
 
End Sub



0



es geht mir gut

11267 / 4749 / 1183

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

Сообщений: 11,439

19.05.2015, 07:34

4

В 3-6 -й строке?Скорее всего из-за десятичных разделителей
И объявите переменные нормально.



0



Pro_grammer

6794 / 2818 / 527

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

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

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

19.05.2015, 07:36

5

Цитата
Сообщение от Джонни21
Посмотреть сообщение

вся программа с этим типом чёртовым

При таком объявлении переменных

Visual Basic
1
Dim a, b, c, d, e, f, x, y As Double

У вас Double только y , остальные Variant
Для каждой пишите As Double, или #



1



SoftIce

es geht mir gut

11267 / 4749 / 1183

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

Сообщений: 11,439

19.05.2015, 07:38

6

Цитата
Сообщение от Джонни21
Посмотреть сообщение

Dim a, b, c, d, e, f, x, y As Double

Visual Basic
1
Dim a As Double, b As Double, c As Double, d As Double, e As Double, f As Double, x As Double, y As Double

Лень писать так? Через копипасту дело 10 секунд

Pro_grammer опередил



0



Джонни21

0 / 0 / 0

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

Сообщений: 14

19.05.2015, 09:02

7

Попробовал прописать на каждую переменную тип — ошибка та же самая…

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub CommandButton1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim e As Double
Dim f As Double
Dim x As Double
Dim y As Double
a = CDbl(TextBox1.Text)
b = CDbl(TextBox2.Text)
x = CDbl(TextBox3.Text)
y = CDbl(TextBox4.Text)
 
c = a * (x / y)
d = Math.Tan(c)
e = b * (y / b)
c = 1 / (Math.Tan(e))
e = d - c
c = a * (x ^ 2)
d = b * (y ^ 2)
f = c + d
c = e / f
d = Math.Sqr(a * x)
e = Math.Sqr(b * y)
f = d + e
d = Math.Exp(f)
f = c * d
 
Label1.Caption = CStr(f)
 
End Sub



0



SoftIce

es geht mir gut

11267 / 4749 / 1183

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

Сообщений: 11,439

19.05.2015, 09:08

8

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

Скорее всего из-за десятичных разделителей

Вы хоть читаете. что вам пишут?

И Вам трудно написать в какой строке ошибка?

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

Visual Basic
1
a = CDbl(Replace(TextBox1.Text,".",","))



0



0 / 0 / 0

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

Сообщений: 14

19.05.2015, 09:26

9

Попробовал и с точкой и с запятой вписывать значения — ноль эмоций.

А ошибку выдаёт на строке присвоения переменной значения из TextBox, т.е. если у меня вещественное число во второй ячейке прописано из 4-х, то ошибка на b = CDbl(TextBox2.Text)



0



Hugo121

6919 / 2829 / 543

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

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

19.05.2015, 10:34

10

Если

Visual Basic
1
Dim a As Double

то в строке

Visual Basic
1
a = CDbl(TextBox1.Text)

это CDbl() уже лишнее.

Проверьте:

Visual Basic
1
2
3
4
Dim a As Double
Dim s$: s = "12.13"
a = s
a = CDbl(s)



1



0 / 0 / 0

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

Сообщений: 14

19.05.2015, 10:46

11

Я Вас не очень понял. для чего мне это нужно? Мне надо текстовую строку из элемента TextBox1.Text перевести в число типа Double. Самое интересное, что если прописать лишь целые значения программа считает это всё!

Вот сама программка, может, так наглядней будет)



0



6919 / 2829 / 543

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

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

19.05.2015, 11:23

12

Работает без проблем. С точкой.



0



SoftIce

es geht mir gut

11267 / 4749 / 1183

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

Сообщений: 11,439

19.05.2015, 11:46

13

Пробуй так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub CommandButton1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim e As Double
Dim f As Double
Dim x As Double
Dim y As Double
'a = CDbl(TextBox1.Text)
a = Val(Replace(TextBox1.Text, ",", "."))
'b = CDbl(TextBox2.Text)
b = Val(Replace(TextBox2.Text, ",", "."))
'x = CDbl(TextBox3.Text)
x = Val(Replace(TextBox3.Text, ",", "."))
'y = CDbl(TextBox4.Text)
y = Val(Replace(TextBox4.Text, ",", "."))



1



0 / 0 / 0

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

Сообщений: 14

19.05.2015, 17:11

14

Спасибо огромное, так заработало!))



0



6919 / 2829 / 543

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

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

19.05.2015, 17:28

15

А говорили пробовали с точкой… Наврали?



0



0 / 0 / 0

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

Сообщений: 14

20.05.2015, 06:20

16

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

А говорили пробовали с точкой… Наврали?

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



0



6919 / 2829 / 543

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

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

20.05.2015, 08:51

17

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



0



0 / 0 / 0

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

Сообщений: 14

20.05.2015, 18:03

18

В любом случае, спасибо за помощь)



0



odua

0 / 0 / 0

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

Сообщений: 1

16.08.2017, 16:58

19

Доброго времени суток,
в продолжении по ошибке 13

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub F1_OST()
    Dim arrLink As Variant
    Dim newBook As Workbook
    Dim sLink As Variant
    ThisWorkbook.Sheets(Array(3, 4, 5, 6, 7)).Copy
    Set newBook = Application.Workbooks(Application.Workbooks.Count)
    arrLink = newBook.LinkSources(XlLink.xlExcelLinks)
    For Each sLink In arrLink
    newBook.BreakLink sLink, xlLinkTypeExcelLinks
    Next
End Sub

тормозит тут

Visual Basic
1
For Each sLink In arrLink

можете что посоветовать?
заранее благодарю



0



pashulka

4131 / 2235 / 940

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

Сообщений: 4,624

16.08.2017, 17:11

20

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Test()
    Dim arrLink As Variant, varLink As Variant
    
    If ThisWorkbook.Worksheets.Count < 7 Then Exit Sub
    ThisWorkbook.Worksheets(Array(3, 4, 5, 6, 7)).Copy
 
    arrLink = ActiveWorkbook.LinkSources(xlExcelLinks)
    If Not IsArray(arrLink) Then Exit Sub
 
    For Each varLink In arrLink
        ActiveWorkbook.BreakLink varLink, xlExcelLinks
    Next
End Sub



0



Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Ошибка макроса procedure too large
  • Ошибка ман тгх 03792 10
  • Ошибка ман тга alternator display defective
  • Ошибка ман ebs 04157 04
  • Ошибка макроса overflow

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии