Ich habe ein Makro für eine Datei erstellt. Zuerst funktionierte es einwandfrei, aber heute habe ich die Datei und das Makro hunderte Male geöffnet und neu gestartet. Ich erhalte immer die folgende Fehlermeldung: Excel VBA-Laufzeitfehler "13" Nichtübereinstimmung
Ich habe nichts am Makro geändert und weiß nicht, warum ich den Fehler bekomme. Darüber hinaus dauert es jedes Mal eine lange Zeit, das Makro zu aktualisieren, wenn es ausgeführt wird (das Makro muss etwa 9000 Zeilen ausführen).
Der Fehler liegt in der Mitte ** **.
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
Glaubst du, du kannst mir helfen? Ich verwende Excel 2010 unter Windows 7. Vielen Dank
Sie würden eine Typübereinstimmung erhalten, wenn Sheets(name).Cells(4 + i, 57)
einen nicht numerischen Wert enthält. Sie sollten die Felder bestätigen, bevor Sie annehmen, dass es sich um Zahlen handelt, und versuchen, von ihnen abzuziehen.
Sie sollten auch Leider ist Option Strict
aktivieren, damit Sie Ihre Variablen explizit konvertieren müssen, bevor Sie typabhängige Vorgänge wie Subtraktion ausführen. So können Sie auch in Zukunft Probleme erkennen und beheben.Option Strict
nur für VB.NET. Sie sollten jedoch nach bewährten Methoden für explizite Datentypkonvertierungen in VBA suchen.
Update:
Wenn Sie sich für die schnelle Korrektur Ihres Codes entscheiden, wickeln Sie die **
-Zeile und die folgende Zeile in der folgenden Bedingung ein:
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
Beachten Sie, dass Ihr x
-Wert jedoch möglicherweise nicht den erwarteten Wert in der nächsten Iteration enthält.
Danke euch allen für eure Hilfe! Endlich konnte ich es dank eines Freundes und auch Ihnen perfekt funktionieren lassen. Hier ist der endgültige Code, so dass Sie auch sehen können, wie wir es lösen.
Danke noch einmal!
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
Diogo
Justin hat dir ein paar sehr gute Tipps gegeben :)
Sie erhalten diesen Fehler auch, wenn die Zelle, in der Sie die Berechnung durchführen, einen Fehler aufgrund einer Formel aufweist.
Zum Beispiel, wenn Zelle A1 # DIV/0 hat! Wenn Sie diesen Code ausführen, erhalten Sie "Excel VBA-Laufzeitfehler" 13 "Typenkonflikt"
Sheets("Sheet1").Range("A1").Value - 1
Ich habe einige geringfügige Änderungen an Ihrem Code vorgenommen. Könnten Sie es bitte für mich testen? Kopieren Sie den Code mit den Zeilennummern, da ich sie absichtlich dort abgelegt habe.
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
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
Ich hatte das gleiche Problem, das Sie oben erwähnt haben, und mein Code lief gestern den ganzen Tag gut.
Heute Morgen habe ich weiter programmiert und als ich meine Anwendung (meine Datei mit einem Auto_Open-Sub) geöffnet habe, bekam ich den Laufzeitfehler '13'. Typenkonflikt, ich ging im Web nach Antworten, ich versuchte eine Menge Dinge, Modifikationen und irgendwann fiel mir ein, dass ich irgendwo über "Ghost" -Daten gelesen habe, die in einer Zelle bleiben, auch wenn wir sie nicht sehen.
Mein Code überträgt nur Daten von einer zuvor geöffneten Datei in eine andere und summiert sie. Mein Code wurde am dritten SheetTab angehalten (also ging es für das vorige SheetTab 2, bei dem derselbe Code ohne Stopp war) mit der Typenkonfliktnachricht richtig. Und das jedes Mal im selben SheetTab, wenn ich meinen Code neu starte.
Also wählte ich die Zelle aus, in der sie angehalten wurde, gab manuell den Wert 0,00 ein (weil der Typkonflikt von Summation-Variablen stammt, die in einem DIM als Double deklariert sind) und kopierte diese Zelle in alle nachfolgenden Zellen, in denen das gleiche Problem auftrat. Es hat das Problem gelöst. Ich hatte die Nachricht nie wieder. Nichts mit meinem Code zu tun, außer dem "Ghost" oder Daten aus der Vergangenheit. Es ist wie wenn Sie Control + End verwenden möchten und Excel Sie dorthin bringt, wo Sie einmal Daten hatten, und löschte sie. Müssen Sie "Speichern" und die Datei schließen, wenn Sie Strg + End verwenden wollten, um sicherzustellen, dass Excel auf die richtige Zelle verweist.
Für zukünftige Leser:
Diese Funktion wurde in Run-time error '13': Type mismatch
abgebrochen.
Function fnIsNumber(Value) As Boolean
fnIsNumber = Evaluate("ISNUMBER(0+""" & Value & """)")
End Function
In meinem Fall schlug die Funktion fehl, wenn ein #DIV/0!
- oder N/A
-Wert erreicht wurde.
Um es zu lösen, musste ich folgendes tun:
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