VBA: String == führt zu Fehler 1004

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: VBA: String == führt zu Fehler 1004
von: Marcel
Geschrieben am: 12.08.2015 12:52:30

Hallo zusammen,
grade in die Situation gekommen, dass ein VBA-Code, welcher schon seit Monaten fehlerfrei seinen Dienst verrichtet, plötzlich mit Fehler 1004 (Anwendungs- oder objektdefinierter Fehler) abbricht.
Ein Datenquader aus einem Intranet-Tool wird umformatiert und um zusätzliche Spalten ergänzt, deren Inhalt sich hauptsächlich aus Formeln ergeben. Abschließend werden die Ergebnisse als Text eingefügt, damit sich die Ergebnisse nicht mehr ändern können.

tbl_2.UsedRange = tbl_2.UsedRange.Value
Seit heute führt diese Zeile zu einem Laufzeitfehler 1004. Also habe ich den Fehler schrittweise eingegrenzt. Mit Range die betroffene Spalte identifiziert und letztlich auch die Zelle, die das Problem hervorruft.
Ergebnis:
Eins der Felder aus dem Ursprungs-Datenquader ist ein frei beschreibbares Textfeld. Durch Zufall sorgt ein Eintrag seit heute dafür, dass in einer Zelle als Formelergebnis der String == ausgegeben wird.
Und genau dieser String sorgt für den Laufzeitfehler 1004. Der Fehler ist auch reproduzierbar (siehe angehängte Datei).
https://www.herber.de/bbs/user/99508.xlsm
Meine Frage ist nun, ob dieser Fehler einerseits bekannt ist und vielleicht irgendwann mal gepatcht wird (oder in neueren Excel-Versionen bereits gepatcht wurde, auch wenn mir das nicht helfen würde, da die Firma vor noch nicht allzu langer Zeit grad erst den Schritt von 2003 zu 2007 gemacht hat), und zum anderen interessiert es mich jetzt sehr, ob ich mich auf weitere derartige Überraschungen einstellen sollte?
Gibt es weitere Strings, die VBA aus dem Tritt bringen können?

Bild

Betrifft: AW: VBA: String == führt zu Fehler 1004
von: Michael
Geschrieben am: 12.08.2015 14:18:13
Hi Marcel,
alles, was mit = (oder + oder -) anfängt, wird in Excel als Formel angesehen und läßt sich nicht ohne Weiteres mit .value zuweisen. Grundsätzlich würde ich aber auch auf der linken Seite .Value angeben. Das ändert zwar nix am Fehler, könnte aber einen Ticken schneller arbeiten.
Als einzige Abhilfe fällt mir ein, den Quellbereich zunächst daraufhin zu untersuchen, ob ein String mit einem der kritischen Zeichen anfängt und dem dann eine "'" voranzustellen - das ist Excels Indikator für einen Text, und das ' wird weder angezeigt (außer Du editierst die Zelle bzw. in der Bearbeitungsleiste) noch gedruckt.
Eine weitere Möglichkeit ist, die Zelle zuvor als TEXT zu formatieren: mit B41 als Text läuft Dein Makro durch!
So oder so wirst Du nicht drumherum kommen, jeden einzelnen Wert anzusehen.
Die von Dir verwendete Anweisung

  ActiveSheet.Range("b:b").Value = ActiveSheet.Range("a:a").Value

ist sowieso ein technisches Prachtstück von MS, denn so eine Anweisung wird z.B. in LO Calc nicht ausgeführt; da muß man das mit Schleifen lösen.
Was Anderes macht Excel im Grunde intern ja auch nicht, denn die Werte werden ja bis zum Fehler geschrieben.
Lösungsvorschlag:
Private Sub cmd_Beispiel_Click()
  Dim a As Variant
  Dim von&, bis&, i&
  Dim t1#, t2#
  von = 1: bis = 105
  ActiveSheet.Range("b" & von & ":b" & bis).Clear
  t1 = Timer
  a = ActiveSheet.Range("a" & von & ":a" & bis).Value
  For i = 1 To bis - von + 1
    If Mid(a(i, 1), 1, 1) = "=" Then a(i, 1) = "'" & a(i, 1)
  Next
  
  ActiveSheet.Range("b" & von & ":b" & bis) = a
  t2 = Timer
  MsgBox (t2 - t1) * 1000 & " ms"
End Sub

Das geht sauschnell, und Du solltest es mit VBA gut selbst an Deine Bedürfnisse anpassen können.
Happy Exceling,
Michael

Bild

Betrifft: AW: VBA: String == führt zu Fehler 1004
von: Rudi Maintaire
Geschrieben am: 12.08.2015 14:25:54
Hallo,
da reicht eigentlich

  With Range("b:b")
    .ClearContents
    .NumberFormat = "@"
    .Value = Range("A:A").Value
  End With

Gruß
Rudi

Bild

Betrifft: AW: VBA: String == führt zu Fehler 1004
von: Mullit
Geschrieben am: 12.08.2015 14:26:49
Hallo,
zu 'nem Patch kann ich Dir leider nichts sagen, aber da der Fehler reproduzierbar ist, kannst Du ihn ja z.B. mit der .Find-Methode eliminieren:

Option Explicit
Private Sub cmd_Beispiel_Click()
Dim objCell As Range
  With ActiveSheet
        .Range("b:b") = ""
        With .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)
            Set objCell = .Find(What:="==", LookIn:=xlValues, _
              LookAt:=xlWhole, MatchCase:=False)
            While Not objCell Is Nothing
                 objCell.ClearContents
                 Set objCell = .FindNext(After:=objCell)
            Wend
        End With
        .Cells(1, 2).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Value = _
          .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Value
  End With
End Sub

Gruß, Mullit

Bild

Betrifft: AW: VBA: String == führt zu Fehler 1004
von: Pit
Geschrieben am: 12.08.2015 14:29:06
Hi,
bei funzt auch:

Sub TT_1()
    Dim letzteZeile As Long
    letzteZeile = Range("A" & Rows.Count).End(xlUp).Row
    With Worksheets("Tabelle1")
        Worksheets("Tabelle1").Range("A1:A" & letzteZeile).Copy _
            Destination:=Worksheets("Tabelle1").Range("B1")
    End With
End Sub
Gruß Pit

Bild

Betrifft: AW: VBA: String == führt zu Fehler 1004
von: Herbert Grom
Geschrieben am: 12.08.2015 16:45:07
Hallo Pit,
wenn Du schreibst:

With Worksheets("Tabelle1")...
dann kannst Du Dir die weiteren "Worksheets("Tabelle1")" sparen:
With Worksheets("Tabelle1")
   .Range("A1:A" & letzteZeile).Copy Destination:=.Range("B1")
End With
Servus

 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA: String == führt zu Fehler 1004"