Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1800to1804
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Laufzeitfehler '1004'

Laufzeitfehler '1004'
29.12.2020 16:49:13
Marko
Hallo,
mit diesem Marko erhalte ich einen Laufzeitfehler '1004'. und ich finde den Fehler nicht.
Aus der Tabelle 19 sollen die Werte aus Zelle F4 (Zahl), G4 (Text), G6, G8 und G10 (jeweils Zahlen) in die Tabelle 6 in Spalte A bis E übertragen werden.
Hierbei benötige ich Eure Hilfe. Vielen Dank.
Private Sub CommandButton1_Click()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Dim raBereich As Range
Dim KndProd As Variant
Dim WerteTab6 As Variant
Dim Zeile As Long, zeiTab As Long
With Worksheets("Tabelle19")
Set raBereich = Union(.Range("F4"), .Range("G4"), .Range("G6"), .Range("G8"), .Range(" _
G10"))
KndProd = .Range("G4").Text & " | " & .Range("G10")
With Worksheets("Tabelle6")
zeiTab = .Cells(.Rows.Count, 1).End(xlUp).Row
WerteTab6 = .Range(.Cells(2, 1), .Cells(zeiTab, 2))
zeiTab = 1
For Zeile = LBound(WerteTab6) To UBound(WerteTab6)
zeiTab = zeiTab + 1
If KndProd = WerteTab6(Zeile, 1) & " | " & WerteTab6(Zeile, 2) Then
If MsgBox("Treue-Bonus ist bereits vorhanden" & vbLf _
& KndProd & vbLf _
& "Daten überschreiben?", vbQuestion + vbYesNo, "Daten übertragen") = vbYes  _
_
Then
raBereich.Copy
.Cells(zeiTab, 1).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End If
GoTo Weiter
End If
Next
raBereich.Copy
.Cells(zeiTab + 1, 1) _
.PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
Weiter:
Application.CutCopyMode = False
.Range("G4").ClearContents
.Range("G6").ClearContents
.Range("G8").ClearContents
.Range("G10").ClearContents
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler '1004'
29.12.2020 16:53:14
onur
"mit diesem Marko erhalte ich einen Laufzeitfehler '1004'" - und zwar WO GENAU?
Laufzeitfehler '1004'
29.12.2020 16:56:56
Marko
...im Code: raBereich.Copy
GoTo Weiter
End If
Next
raBereich.Copy
.Cells(zeiTab + 1, 1) _
.PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
AW: Laufzeitfehler '1004'
29.12.2020 16:59:28
onur
Poste mal die datei.
AW: Laufzeitfehler '1004'
29.12.2020 17:44:10
Yal
Hallo Marko,
Immer vorsichtig mit Goto: Du machst einen Absprung aus einem Code-Bereich, wo "With" eine bestimmte Tabelle referenziert, in ein anderen Bereich, wo "With" ein anderen Element referenziert. Der Code-Compiler kann keine Gedanken lesen.
Zwei Tipps für eine bessere Lesbarkeit vom Code:
_ arbeite lieber mit Variablen statt "With", besonders, wenn diesen ineinander verschachtelt sind(*).
_ modularisiere deinen Code. Lege wiederkehrende Aufgaben in separaten Sub/Function.
(*): Nachtrag, weil sonst Onur mich tadeln wird ;-)
Ja, es gibt durchaus viele Fälle, wo ein "With" Sinn macht. Nutze ich auch gern. Aber dann bitte nur bei kurzen, übersichtlichen Sub/Function. Hier ist eine gesamte Code-Tapette mit 4 With, davon 2 verschachtelt und ein Goto dazwischen...
Viel Erfolg
Yal
Anzeige
AW: Laufzeitfehler '1004'
29.12.2020 17:50:17
Matthias
Moin!
Der Laufzeitfehler kommt m.E. durch den Aufbau deiner UNion. Wenn die so aussieht, wie bei dir solltest du alle Zellen der Union einzeln kopieren. Bei deiner Variante würde auch gehen, f4 einzeln kopieren und den REst als Union. Das klappt. F4 und der Rest führt zum Fehler.
VG
AW: Laufzeitfehler '1004'
29.12.2020 17:59:19
Yal
Hallo Matthias,
bei mir laufen sowohl
Range("A6,A10,A13").Select

als auch
Union(Range("A6"), Range("A10"), Range("A13")).Select
Einzel kopieren, bzw. Wert übernehmen (es muss nicht der schweren "Copy-Paste" sein), wäre bei einer festgelegten, überschaubaren Liste auf alle Fälle ratsam.
VG
Yal
Anzeige
AW: Laufzeitfehler '1004'
29.12.2020 19:40:34
Matthias
Moin!
Dein Beispiel läuft ja auch. Das habe ich ja so geschrieben. Bei dir sind alle WErte in der selben Spalte. Teste mal das hier:
Set temp = Union(Range("A6"), Range("A10"), Range("A13"))
temp.Copy
Set temp = Union(Range("A6"), Range("A10"), Range("A13"), Range("B6"))
temp.Copy

DA läuft der Code wieder in den Fehler 1004. Da ist halt noch ein Range in Spalte B. Ähnlich ist es auch in der Ausgangsfrage. Eine Range in Spalte F der Rest in G.
VG
Fehler '1004' wegen Mehrfachauswahl
29.12.2020 17:56:04
ralf_b
das hättest du auch dazu schreiben können.
mein nachgestellter Code will deine nicht zusammenhängenden Bereiche auch nicht kopieren.
wirst wohl die Bereiche einzeln kopieren müsssen.
gruß
RB
Anzeige
AW: Fehler '1004' wegen Mehrfachauswahl
29.12.2020 18:05:47
Yal
... idealerweise modularisiert in einer separaten Sub:
Sub InsZiel_kopieren(Ra As Range, ZielTab As String, Zeile As Integer, Spalte As Integer)
Dim r As Range
Dim Z As Range
Set Z = Worksheets(ZielTab).Cells(Zeile, Spalte)
For Each r In Ra.Areas
Z = r.Range("A1").Value
Set Z = Z.Offset(0, 1)
Next
End Sub
VG Yal
Laufzeitfehler '1004'
29.12.2020 20:19:14
Marko
Sorry und Danke für Eure Hilfe, doch bekomme ich es nicht hin.
AW: Laufzeitfehler '1004'
29.12.2020 21:46:25
Matthias
Moin!
Da der Fehler durch deine Range auftaucht, kannst du das Kopieren auch in 2 Teile splitten. F4 einzeln kopieren und den Rest als Union wie bisher. Habe den Code mal angepasst. Die Union habe ich aufgelöst. Die brauchst du eh nur zum kopieren. Beim Einfügen habe ich dann F4 extra genommen und danach die Union. Die muss aber eine Zeile tiefer, da du ja transpose true hast. DAs kopiren am Ende der SChleife habe ich mal rausgenommen. DAs könnte nach der selben Art wieder rein (1 zu 1 kopieren). Der COde würde dann so aussehen.
Private Sub CommandButton1_Click()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Dim raBereich As Range
Dim KndProd As Variant
Dim WerteTab6 As Variant
Dim Zeile As Long, zeiTab As Long
With Worksheets("Tabelle19")
Set raBereich = Union(.Range("G4"), .Range("G6"), .Range("G8"), .Range("G10")) _
KndProd = .Range("G4").Text & " | " & .Range("G10")
With Worksheets("Tabelle6")
zeiTab = .Cells(.Rows.Count, 1).End(xlUp).Row
WerteTab6 = .Range(.Cells(2, 1), .Cells(zeiTab, 2))
zeiTab = 1
For Zeile = LBound(WerteTab6) To UBound(WerteTab6)
zeiTab = zeiTab + 1
If KndProd = WerteTab6(Zeile, 1) & " | " & WerteTab6(Zeile, 2) Then
If MsgBox("Treue-Bonus ist bereits vorhanden" & vbLf _
& KndProd & vbLf _
& "Daten überschreiben?", vbQuestion + vbYesNo, "Daten übertragen" _
) = vbYes Then
Worksheets("Tabelle19").Range ("F4")
.Cells(zeiTab, 1).PasteSpecial Paste:=xlPasteValues, Transpose:= _
True
raBereich.Copy
.Cells(zeiTab + 1, 1).PasteSpecial Paste:=xlPasteValues, Transpose:= _
True
End If
GoTo Weiter
End If
Next
End With
Weiter:
Application.CutCopyMode = False
.Range("G4").ClearContents
.Range("G6").ClearContents
.Range("G8").ClearContents
.Range("G10").ClearContents
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub

Ist aber jetzt ungetestet. Dazu müsste man die Datei sehen.
VG
Anzeige
AW: Laufzeitfehler '1004'
30.12.2020 00:33:07
Yal
Hallo Marko,
(@Matthias: in deinem Code haben sich komische Dinge reingeschlichen: Worksheets("Tabelle19").Range ("F4") ?)
@Marko:
In deinem Code gibt es zu viele Umwege. Ich habe versucht zu bereinigen, kann aber -magels Datei- nicht garantieren, dass ich alles getroffen habe.
Lass es im Schritt-Modus laufen und setzt Überwachungsausdrücke oder öffne das Lokale Fenster.
Const cTrennzeichen = ","
Const T1 = "Treue-Bonus ist bereits vorhanden" & vbLf
Const T2 = vbLf & "Daten überschreiben?"
Private Sub CommandButton1_Click()
Dim WQ As Worksheet 'Quelle
Dim WZ As Worksheet 'Ziel
Dim Z As Long
Dim bGefunden As Boolean
Dim G4, G10
On Error GoTo Catch
Init
Set WQ = Worksheets("Tabelle19")
Set WZ = Worksheets("Tabelle6")
G4 = WQ.Range("G4").Text
G10 = WQ.Range("G10").Text
For Z = 2 To WZ.Range("A10000").End(xlUp).Row
If (G4 & G10) = (WZ.Cells(Z, 1) & WZ.Cells(Z, 2)) Then
If MsgBox(T1 & G4 & " | " & G10 & T2, vbQuestion + vbYesNo, "Daten übertragen") =  _
vbYes Then
WZ.Cells(Z, 1) = WQ.Range("G4").Value
WZ.Cells(Z, 2) = WQ.Range("G6").Value
WZ.Cells(Z, 3) = WQ.Range("G8").Value
WZ.Cells(Z, 4) = WQ.Range("G10").Value
End If
bGefunden = True
Exit For
End If
Next
If Not bGefunden Then
WZ.Cells(Z + 1, 1) = WQ.Range("G4").Value
WZ.Cells(Z + 1, 2) = WQ.Range("G6").Value
WZ.Cells(Z + 1, 3) = WQ.Range("G8").Value
WZ.Cells(Z + 1, 4) = WQ.Range("G10").Value
End If
Zellen_bereinigen WQ, "G4,G6,G8,G10"
GoTo Finally
Catch:
'zur Zeit kein Fehlerbehandlung
Finally:
Closing
End Sub
Private Sub Init()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
End Sub
Private Sub Closing()
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub
Private Sub Zellen_bereinigen(W As Worksheet, ZellListe As String)
Dim Z
For Each Z In Split(ZellListe, cTrennzeichen)
W.Range(Z).ClearContents
Next
End Sub
Viel Erfolg
Yal
Anzeige
AW: Laufzeitfehler '1004'
30.12.2020 00:44:58
Yal
@Matthias: Sorry, jetzt habe ich den "F4" entdeckt.
AW: Laufzeitfehler '1004'
30.12.2020 00:59:21
Yal
Also jetzt eine Version mit F4.
Ich habe den Fehlerhandling rausgemacht und auch das Reinpasten faktorisiert: in einem separaten Sub abgelagert.
Const cTrennzeichen = ","
Const T1 = "Treue-Bonus ist bereits vorhanden" & vbLf
Const T2 = vbLf & "Daten überschreiben?"
Private Sub CommandButton1_Click()
Dim WQ As Worksheet 'Quelle
Dim WZ As Worksheet 'Ziel
Dim Z As Long
Dim bGefunden As Boolean
Dim G4, G10
Langsam False
Set WQ = Worksheets("Tabelle19")
Set WZ = Worksheets("Tabelle6")
G4 = WQ.Range("G4").Text
G10 = WQ.Range("G10").Text
For Z = 2 To WZ.Range("A10000").End(xlUp).Row
If (G4 & G10) = (WZ.Cells(Z, 1) & WZ.Cells(Z, 2)) Then
If MsgBox(T1 & G4 & " | " & G10 & T2, vbQuestion + vbYesNo, "Daten übertragen") =  _
vbYes Then
Werte_reinpasten WQ, "F4,G4,G6,G8,G10", WZ, WZ.Cells(Z, 1).Address
End If
bGefunden = True
Exit For
End If
Next
If Not bGefunden Then Werte_reinpasten WQ, "F4,G4,G6,G8,G10", WZ, WZ.Cells(Z + 1, 1). _
Address
Zellen_bereinigen WQ, "G4,G6,G8,G10"
Langsam True
End Sub
Private Sub Werte_reinpasten(WQ As Worksheet, RgQ As String, WZ As Worksheet, StartAdresse As  _
String)
Dim CellQ, CellZ
Set CellZ = WZ.Range(RgZ)
For Each CellQ In Split(RgQ, cTrennzeichen)
CellZ = WQ.Range(CellQ).Value
Set CellZ = CellZ.Offset(0, 1)
Next Z
End Sub
Private Sub Langsam(Schalter As Boolean)
Application.ScreenUpdating = Schalter
Application.EnableEvents = Schalter
Application.Calculation = IIf(Schalter, xlCalculationAutomatic, xlCalculationManual)
End Sub
Private Sub Zellen_bereinigen(W As Worksheet, ZellListe As String)
Dim Z
For Each Z In Split(ZellListe, cTrennzeichen)
W.Range(Z).ClearContents
Next
End Sub
VG
Yal
Anzeige
Laufzeitfehler '1004'
30.12.2020 09:20:08
Marko
Moin, vielen Dank für Eure Unterstützung !!!
@Yal Zu dem separaten Sub erscheint diese Meldung! Was denkst Du, warum?
Fehler beim Kompilieren
Ungültiger Verweis auf Next-Steuervariable
bei Next Z (markiert wurde das Z)
Private Sub Werte_reinpasten(WQ As Worksheet, RgQ As String, WZ As Worksheet, StartAdresse As _
String)
Dim CellQ, CellZ
Set CellZ = WZ.Range(RgZ)
For Each CellQ In Split(RgQ, cTrennzeichen)
CellZ = WQ.Range(CellQ).Value
Set CellZ = CellZ.Offset(0, 1)
Next Z
End Sub

AW: Laufzeitfehler '1004'
30.12.2020 10:11:14
ralf_b
warum? weil du Code umschreibst, bei ziehmlich wenig Ahnung davon was du tust.
lösche das z
gruß
rb
Anzeige
Laufzeitfehler '1004'
30.12.2020 10:21:14
Marko
Das habe ich. Nützt leider nichts.
AW: Laufzeitfehler '1004'
30.12.2020 10:34:18
ralf_b
es gibt kein Rgz. woher kommt das?
was ist mit StartAdresse? wird nicht genutzt.
wieso splittest du die Range?
"for each" schaut auch in einzelne Zellen einer Range
AW: Laufzeitfehler '1004'
30.12.2020 10:58:31
Yal
Hallo zusammen,
beide Fehler kamen von mir. Ich habe wohl gestern Nacht zu schnell gearbeitet.
Marko hat an den Code nichts geändert, aber der Wissenstand ist nicht ausreichend, um mit Unvollständigkeit zu recht zu kommen.
RgZ war ursprünlich als Parameter, ich habe als "StartAdresse" geändert, aber nicht im Coding aufgepasst.
Z war die ursprüngliche Schleifen-Variable. Ich habe sie in CellQ geändert und den Next Z übersehen.
Marko: setzt Dich mit diesen Information auseinander, um zu verstehen, wie die Zusammenhänge funktionieren. Nur so wird sich deine Coding-Kompetenz steigern.
Private Sub Werte_reinpasten(WQ As Worksheet, RgQ As String, WZ As Worksheet, StartAdresse As _
String)
Dim CellQ, CellZ
Set CellZ = WZ.Range(StartAdresse)
For Each CellQ In Split(RgQ, cTrennzeichen)
CellZ = WQ.Range(CellQ).Value
Set CellZ = CellZ.Offset(0, 1)
Next
End Sub
VG
Yal
Anzeige
@Yal, das hätte ich nicht von dir gedacht.....
30.12.2020 11:04:27
dir
solche Fehler zu später Stunde sind eigentlich nur mein Ding ;)
Feedback
30.12.2020 11:11:46
Marko
Hallo Yal,
Danke für Deine und Eure Hilfe. Und ja, ich habe zu wenig Ahnung von diesen komplexen Themen in der Welt von Makros und VBAs. Ich probiere viel aus, kopiere und teste ganz nach dem Motto "learning bei doing". Ich möchte einfach lernen und mehr davon verstehen. Und bin sehr dankbar über dieses Forum! Auch wenn ich den einen oder anderen Profi von Euch mit meiner Unwissenheit nerve, sorry dafür Ralf.
;-)
30.12.2020 13:30:33
Yal
Kein Stress, Marko,
Von unserer erfahrenen Seite waren die Fehler leicht zu erkennen, bedeutet aber nicht, dass jeder es schon kann.
Daher meine ausführliche Erklärung, weil hier ein guter Beispiel, um etwas zu lernen.
Wir freuen uns natürlich auf alle lernwilligen und unterstützen gern.
VG
Yal
@Ralf: Fehler kann ich auch ganz gut, um jeden Uhrzeiten ;-)
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige