Arbeitsmappe kann nicht anonymisiert werden; Fehlerausgabe: 13 Typen unverträglich

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Johanne.

    Arbeitsmappe kann nicht anonymisiert werden; Fehlerausgabe: 13 Typen unverträglich

    Hallo,
    ich wollte meine Arbeitsmappe anonymisieren und für weitere Hilfe hochladen.
    Leider klappt es nicht und ich weiß nicht warum.

    Ich beschäftige mich seit Anfang Juni mit VB, Excel 2016, bin also Anfängerin.

    Im Modul habe ich folgendes bei mir stehen:

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub anonymisieren()
    3. Randomize
    4. Dim rng_s As Range
    5. Dim rng_cell As Range
    6. Dim check As Integer
    7. Dim i As Integer
    8. Dim VK, VE
    9. With Application
    10. VK = .Calculation
    11. VE = .EnableEvents
    12. End With
    13. If TypeOf Selection Is Range Then
    14. check = IIf(MsgBox("Sollen auch Datumswerte und Zahlen ersetzt werden?", vbYesNo, "Was soll alles ersezt werden") = vbYes, 3, 2)
    15. On Error Resume Next
    16. Set rng_s = Intersect(ActiveSheet.UsedRange, Selection).SpecialCells(xlCellTypeConstants, check)
    17. If rng_s.Count > Selection.CountLarge Then Set rng_s = Selection
    18. If Err.Number = 0 Then
    19. On Error GoTo 0
    20. Call speedup(-4135, False, False)
    21. On Error GoTo errMsg
    22. For Each rng_cell In rng_s
    23. With rng_cell
    24. If IsDate(.Value) Then
    25. If .Value < 1 Then
    26. .Value = Rnd()
    27. Else
    28. .Value = .Value + Int(Rnd() * 365 + 1)
    29. End If
    30. ElseIf IsNumeric(.Value) Then
    31. .Value = f_num(.Value)
    32. Else
    33. .Value = f_txt(.Value)
    34. End If
    35. End With
    36. Next
    37. Else
    38. MsgBox "Bitte markieren sie Zellen mit Inhalt!", vbInformation
    39. End If
    40. Else
    41. MsgBox "Sie sollten zumindest eine Zelle markieren!", vbInformation
    42. End If
    43. Call speedup(VK, True, True)
    44. Exit Sub
    45. errMsg:
    46. Call speedup(VK, True, True)
    47. MsgBox Err.Number & " " & Err.Description
    48. End Sub
    49. Sub speedup(ByVal CalC As Integer, ByVal BolE As Boolean, BolScreenU As Boolean)
    50. With Application
    51. .Calculation = CalC
    52. .EnableEvents = BolE
    53. .ScreenUpdating = BolScreenU
    54. End With
    55. End Sub
    56. Function f_txt(str_txt As String) As String
    57. Dim i As Integer
    58. For i = 1 To Len(str_txt)
    59. Mid(str_txt, i, 1) = Chr(IIf(Rnd() > 0.5, 65, 97) + Int(Rnd() * 25 + 1))
    60. Next
    61. f_txt = str_txt
    62. End Function
    63. Function f_num(dbl_val As Variant) As Double
    64. Dim i As Integer
    65. For i = 1 To Len(dbl_val)
    66. If IsNumeric(Mid(dbl_val, i, 1)) Then
    67. Mid(dbl_val, i, 1) = Int(Rnd() * 10)
    68. End If
    69. Next
    70. f_num = CDbl(dbl_val)
    71. End Function


    Wenn ich nun meinen Bereich, den ich anonymisieren möchte markiere und dann im Modul auf ausführen gehe, passiert das:

    1. er nimmt nur die Überschriften und gibt den Fehler: 13 Typen unverträglich aus oder
    2. ich habe das Blatt ohne Überschriften markiert und er anonymisiert gar nichts, dafür kommt aber auch die gleiche Fehlermeldung wieder.

    Weiterhin ist es egal, ob er die Zahlenwerte mit anonymisieren möchte oder nicht, es funktioniert nicht.

    Ich würde mich sehr gerne über Hilfe freuen.

    Danke im voraus.
    Johanne

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Johanne“ ()

    1. Versuch: Ich weiß nicht, ob ich dich richtig verstanden habe, aber wenn ich den Debugger benutze kommt bei Zeile 47 kommt das Fenster mit: 13 Typen unverträglich, dann geht er nur noch in Zeile 48 (End Sub) und dann ist er durch.

    2. Versuch: alle Zeilen mit On Error gelöscht.
    Jetzt kommt das Fenster: Laufzeitfehler: 13: Typen unverträglich
    Zeile: 28

    ich hoffe deine Frage beantwortet zu haben.
    Zeile 28 ist .Value = .Value + Int(Rnd() * 365 + 1)Das ist eine Adressierung die ein With benötigt (das es hier nicht gibt).
    Überlege, auf welches Objekt sich das .Value bezieht und gib es mit an.

    Doch, das With gibt es.
    Dann könnte es ein Integer Overflow sein.
    Welchen Wert hat .Value + Int(Rnd() * 365 + 1) ?
    setze einen Breakpoint in die Zeile und schau dir die Variablen an.

    Allgemein gilt:
    Lerne, mit dem Debugger umzugehen, dann kannst du 90% aller Fehler selbst finden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Warum hast du deinen Text durchgestrichen, das verwirrt mich gerade sehr.


    Welchen Wert hat .Value + Int(Rnd() * 365 + 1) ?

    Das weiß ich leider nicht, da ich dir nicht mehr folgen kann.
    Ich steh echt auf dem Schlauch. (sorry)



    setze einen Breakpoint in die Zeile und schau dir die Variablen an.

    Ich weiß zwar nicht was du meinst, da ich dich nicht verstehe, aber ich werde es dennoch versuchen umzusetzen.



    Allgemein gilt:
    Lerne, mit dem Debugger umzugehen, dann kannst du 90% aller Fehler selbst finden.

    Deine Verlinkung habe ich mir abgespeichert und werde damit dann üben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Johanne“ ()

    Johanne schrieb:

    Warum hast du deinen Text durchgestrichen
    Weil ich bemerkte, dass er Blödsinn ist.

    Johanne schrieb:

    Ich weiß zwar nicht was du meinst, da ich dich nicht verstehe
    Fange damit an

    Johanne schrieb:

    Deine Verlinkung habe ich mir abgespeichert und werde damit dann üben.
    dann wirst du beginnen, mich zu verstehen.
    Der Debugger ist ein extrem wertvolles Tool, mit dem du ganz leicht rausfinden kannst, wo dein Programm nicht das tut, was du erwartest.

    Zu meiner obigen Vermutung:
    Ein Integer in VBA ist eine Datentyp, der nur den Wertebereich von -32.768 bis +32.767 umfasst.
    Willst du größere Zahlen in so eine Variable speichern gibt's Fehler.
    Wenn du das nicht sicher stellen kannst, solltest du Long oder Decimal oder Double verwenden, je nach dem, was sinnvoll ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ein Integer in VBA ist eine Datentyp, der nur den Wertebereich von -32.768 bis +32.767 umfasst.

    Zählen hier Spalten x Zeilen?
    Eigentlich hatte ich gedacht, dass nur die Zeilen oder Spalten zählen, aber das macht vermutlich nur Sinn, wenn der Gegenpart nur aus einer Zeile oder einer Spalte besteht. (Ich habe nach nachrechnen ca. min. 300.000 Zellen gefüllt.)


    Ich habe überall da wo Integer stand, ein Long hingeschrieben, leider hat er immer noch den Laufzeitfehler ausgegeben.
    Dann habe ich alle Long gegen Double ausgetauscht, aber immer noch mit Fehlern.
    Ich werde (wenn ich Luft habe) weiter versuchen den Fehler zu finden.

    Dann habe ich einzelne Spalten markiert und versucht diese zu anonymisieren.
    Das hat insoweit funktioniert, wenn ich nur 2-4 Spalten nahm und wenn es damit nicht zu viele Daten waren.

    Nur die erste Spalte "Inventarnummer" wollte er nicht nehmen, vielleicht weil sich in dieser Spalte nicht nur Zahlen, sondern auch Buchstaben befinden.

    Mein Fazit:
    Du bist sehr geduldig!
    Ich sage Danke :) für Deine Hilfe und werde versuchen mehr mit dem Debugger zu arbeiten.

    Grüße
    Johanne

    Johanne schrieb:

    Zählen hier Spalten x Zeilen?
    Nein.
    Das hat nichts mit dem Worksheet zu tun, sondern ist das Fassungsvermögen deiner Variablen.
    Wenn in einer deiner Zellen ein Wert > 32767 drin steht, dann kannst du den Inhalt nicht mehr einer Integer-Variablen zuweisen.
    Aber wenn es mit Double auch nicht läuft, scheint es wohl kein Überlauf zu sein.

    Johanne schrieb:

    Nur die erste Spalte "Inventarnummer" wollte er nicht nehmen, vielleicht weil sich in dieser Spalte nicht nur Zahlen, sondern auch Buchstaben befinden.
    Da müsste er ja in die Funktion f_text verzweigen.
    Setz da mal einen Breakpoint und steppe durch.
    Vielleicht optimierst du die Funktion auch ein wenig.

    Visual Basic-Quellcode

    1. Function f_txt(ByVal str_txt As String) As String
    2. Dim i As Integer
    3. For i = 1 To Len(str_txt)
    4. f_txt = f_txt & Chr(IIf(Rnd() > 0.5, 65, 97) + Int(Rnd() * 25 + 1))
    5. Next
    6. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    So, ich habe folgendes ausprobiert / gemacht.
    Mir fast meine vba "zerschossen" und dabei dann festgestellt, dass er bei Next (deine Zeile 5) einen Fehler aufwarf.
    Ich weiß nur nicht warum.
    Dann habe ich nochmal alles kontrolliert und wieder so gebaut, wie es vorher war und der Fehler bei Next war weg.

    Dann habe ich gerade das Double wieder durch das Integer ersetzt und meinen Code nach deinem Vorschlag geändert.
    Nun war es wieder egal, ob ich die Datums- und Zahlenwerte ersetzen möchte oder nicht, er wirft wieder Laufzeitfehler: 13 Typen unverträglich aus.
    Und auch an dieser Zeile

    Quellcode

    1. Zeile 28: .Value = .Value + Int(Rnd() * 365 + 1)

    .
    Ich habe es mit deiner Änderung auch mit Double und Decimal versucht, aber bei Double kommt auch Fehler: 13 und bei Decimal macht er mit gleich die nachfolgenden Zeilen rot und läuft nicht durch.

    Quellcode

    1. Dim check As Double
    2. Dim i As Double
    3. Sub speedup(ByVal CalC As Double, ByVal BolE As Boolean, BolScreenU As Boolean)
    4. Function f_txt(ByVal str_txt As String) As String
    5. Dim i As Double


    Ich versteh leider nicht, warum das Programm nicht mitspielt. Vielleicht erzählt es dir ja, wo der Fehler liegt.

    Johanne schrieb:

    Dim check As Double
    Dim i As Double
    Sub speedup(ByVal CalC As Double, ByVal BolE As Boolean, BolScreenU As Boolean)
    Function f_txt(ByVal str_txt As String) As String
    Dim i As Double
    ???
    Was wolltest du wirklich schreiben?
    Dieser Code zumindest kann nicht kompilieren.
    Zeig nochmals den Code, der tatsächlich drin steht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Entschuldige bitte, ich habe es wohl "undeutlich" geschrieben, weil ich die einzelnen Zeilen in "einen" Quellcode gepackt habe.

    So hatte ich es gemeint.

    Visual Basic-Quellcode

    1. Zeile 1: Dim check As Double
    2. Zeile 2: Dim i As Double
    3. Zeile 50: Sub speedup(ByVal CalC As Double, ByVal BolE As Boolean, BolScreenU As Boolean)
    4. Zeile 58: Function f_txt(ByVal str_txt As String) As String
    5. Zeile 59: Dim i As Double



    Hier kommt der tatsächliche Code.

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub anonymisieren()
    3. Randomize
    4. Dim rng_s As Range
    5. Dim rng_cell As Range
    6. Dim check As Double
    7. Dim i As Double
    8. Dim VK, VE
    9. With Application
    10. VK = .Calculation
    11. VE = .EnableEvents
    12. End With
    13. If TypeOf Selection Is Range Then
    14. check = IIf(MsgBox("Sollen auch Datumswerte und Zahlen ersetzt werden?", vbYesNo, "Was soll alles ersezt werden") = vbYes, 3, 2)
    15. 'On Error Resume Next
    16. Set rng_s = Intersect(ActiveSheet.UsedRange, Selection).SpecialCells(xlCellTypeConstants, check)
    17. If rng_s.Count > Selection.CountLarge Then Set rng_s = Selection
    18. If Err.Number = 0 Then
    19. 'On Error GoTo 0
    20. Call speedup(-4135, False, False)
    21. 'On Error GoTo errMsg
    22. For Each rng_cell In rng_s
    23. With rng_cell
    24. If IsDate(.Value) Then
    25. If .Value < 1 Then
    26. .Value = Rnd()
    27. Else
    28. .Value = .Value + Int(Rnd() * 365 + 1)
    29. End If
    30. ElseIf IsNumeric(.Value) Then
    31. .Value = f_num(.Value)
    32. Else
    33. .Value = f_txt(.Value)
    34. End If
    35. End With
    36. Next
    37. Else
    38. MsgBox "Bitte markieren sie Zellen mit Inhalt!", vbInformation
    39. End If
    40. Else
    41. MsgBox "Sie sollten zumindest eine Zelle markieren!", vbInformation
    42. End If
    43. Call speedup(VK, True, True)
    44. Exit Sub
    45. errMsg:
    46. Call speedup(VK, True, True)
    47. MsgBox Err.Number & " " & Err.Description
    48. End Sub
    49. Sub speedup(ByVal CalC As Double, ByVal BolE As Boolean, BolScreenU As Boolean)
    50. With Application
    51. .Calculation = CalC
    52. .EnableEvents = BolE
    53. .ScreenUpdating = BolScreenU
    54. End With
    55. End Sub
    56. Function f_txt(ByVal str_txt As String) As String
    57. Dim i As Double
    58. For i = 1 To Len(str_txt)
    59. f_txt = f_txt & Chr(IIf(Rnd() > 0.5, 65, 97) + Int(Rnd() * 25 + 1))
    60. Next
    61. End Function
    62. Function f_num(dbl_val As Variant) As Double
    63. Dim i As Double
    64. For i = 1 To Len(dbl_val)
    65. If IsNumeric(Mid(dbl_val, i, 1)) Then
    66. Mid(dbl_val, i, 1) = Int(Rnd() * 10)
    67. End If
    68. Next
    69. f_num = CDbl(dbl_val)
    70. End Function