Excel VBA Ошибка времени выполнения '13' Несоответствие типов - PullRequest
9 голосов
/ 16 января 2012

Я создал макрос для файла, и сначала он работал нормально, но сегодня я сотни раз открывал и перезапускал файл и макрос и всегда получаю следующую ошибку: Excel VBA Run-time error '13 'Несоответствие типов

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

Ошибка находится в пределах ** **.

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

Как вы думаете, вы можете мне помочь?Я использую Excel 2010 на Windows 7. Большое спасибо

Ответы [ 7 ]

9 голосов
/ 16 января 2012

Вы получите несоответствие типов, если Sheets(name).Cells(4 + i, 57) содержит нечисловое значение. Вы должны проверить поля, прежде чем предположить, что они являются числами и попытаться вычесть из них.

Кроме того, вы должны включить Option Strict, чтобы вы были вынуждены явно преобразовать ваши переменные, прежде чем пытаться выполнять над ними зависящие от типа операции, такие как вычитание. Это также поможет вам выявлять и устранять проблемы в будущем. К сожалению, Option Strict только для VB.NET. Тем не менее, вам следует ознакомиться с рекомендациями по явному преобразованию типов данных в VBA.


Обновление:

Однако если вы пытаетесь быстро исправить код, оберните строку ** и следующую за ней в следующем состоянии:

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

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

4 голосов
/ 17 января 2012

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

Еще раз спасибо!

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
1 голос
/ 21 июня 2018

Для будущих читателей:

Эта функция отключалась в Run-time error '13': Type mismatch

Function fnIsNumber(Value) As Boolean
  fnIsNumber = Evaluate("ISNUMBER(0+""" & Value & """)")
End Function

В моем случае функция перестала работать, когда она достигла значения #DIV/0! или N/A.

Чтобы решить эту проблему, я должен был сделать это:

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
1 голос
/ 17 января 2012

Диого

Джастин дал вам несколько очень хороших советов:)

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

Например, если ячейка A1 имеет # DIV / 0! ошибка, то вы получите "Excel VBA Run-time error '13' Несоответствие типов" при выполнении этого кода

Sheets("Sheet1").Range("A1").Value - 1

Я сделал несколько небольших изменений в вашем коде. Не могли бы вы проверить это для меня? Скопируйте код с номерами строк, как я специально их там поместил.

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
0 голосов
/ 14 декабря 2016

Эта ошибка возникает, когда тип входной переменной неправильный.Вы, вероятно, написали формулу в Cells(4 + i, 57), которую вместо =0 использовали формулу = "".Так что при запуске эта ошибка отображается.Поскольку пустая строка не равна нулю.

enter image description here

0 голосов
/ 09 октября 2015
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
0 голосов
/ 11 октября 2013

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

Я продолжал программировать этим утром, и когда я открыл свое приложение (мой файл с подпрограммой Auto_Open), я получил ошибку времени выполнения '13' Несоответствие типов, я пошел в Интернет, чтобы найти ответы, я много пробовал вещей, модификаций, и в какой-то момент я вспомнил, что где-то читал о «призрачных» данных, которые остаются в ячейке, даже если мы ее не видим.

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

Таким образом, я выбрал ячейку, в которой она остановилась, вручную ввел 0,00 (поскольку несоответствие типов происходит из переменных суммирования, объявленных в DIM как Double) и скопировал эту ячейку во все последующие ячейки, где возникла та же проблема. Это решило проблему. Никогда не было сообщение снова. Ничего общего с моим кодом, кроме «Призрака» или данных из прошлого. Это как когда вы хотите использовать Control + End, а Excel берет вас туда, где у вас были данные, и удаляет их. Пришлось «Сохранить» и закрыть файл, когда вы хотели использовать Control + End, чтобы убедиться, что Excel указал вам на нужную ячейку.

...