Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1568to1572
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

Laufzeitfehler
02.08.2017 11:43:00
Herbert
Ich hoffe, dass mir jemand helfen kann.
Ich habe eine VBA Prozedur geschrieben. Wenn ich diese nun ablaufen lasse kommt fast am Schluss eine Fehlermeldung:
Laufzeitfehler ‘1004’ Die Auswahl ist nicht gültig. Stellen Sie sicher, dass Kopier- und Einfügefunktionen sich nicht überlappen, es sei denn, sie haben dieselbe Grösse und Form.
Wenn ich nun die VBA Prozedur in 2 Teile schreibe (identische Prozedur) und diese nacheinander durchlaufen lasse, funktioniert dies.
Ich wäre dankbar, wenn mir jemand meinen Knopf lösen könnte.
Herbert

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Wir wären dankbar, wenn wir den Code kennen, owT
02.08.2017 13:54:42
Michael
AW: Wir wären dankbar, wenn wir den Code kennen, owT
02.08.2017 14:01:51
Herbert
Die ganze Prozedur ist folgende :
Der Fehler passiert hier => '(!!! Die folgende Programmlinie funktionniert nicht)
Vielen Dank für einen Tipp. Gruss Herbert
Sub Anpassenbuchungen()
Application.ScreenUpdating = False
' In welcher Sprache soll die Ausgabe erfolgen (Z64,90,154,155 + eingefügt anpassen)?
Dim Sprache As String
Range("A1").Select
If Range("A1") = "Liste des écritures" Then
Sprache = "F"
Else
Sprache = "D"
End If
' Uebernahme der zweiten Buchungstextzeile
Range("E4").Select
ActiveCell.FormulaR1C1 = "=IF(R[1]C[-2]"""","""",R[1]C[-1])"
ActiveCell.Offset(1, 0).Range("A1").Select
Range("E4").Select
' Kopiert die Formel bis zur Zelle 30000
Selection.Copy
Range("E5:E30000").Select
ActiveSheet.Paste
' Nimmt die Formel raus und behaltet nur den Inhalt
Columns("E:E").Select
Range("E3").Activate
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Einfügen einer Kolonne und zusammenfügen des Buchungstextes
Columns("F:F").Select
Range("F2").Activate
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("F4").Select
ActiveCell.FormulaR1C1 = "=RC[-2]&"" ""&RC[-1]"
Range("F4").Select
Selection.Copy
Range("F5:F30000").Select
ActiveSheet.Paste
' Nimmt die Formel raus und behaltet nur den Inhalt
Columns("F:F").Select
Range("F3").Activate
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Löschen unntötiger Spalten und der 1. und 2. Linie
Columns("D:E").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("f:h").Select
Selection.Delete Shift:=xlToLeft
Columns("A:G").Select
Columns("A:G").EntireColumn.AutoFit
Rows("1:2").Select
Selection.Delete Shift:=xlUp
Range("A1").Select
'Sortieren nach Kontonummer und Datum
Rows("2:30000").Select
ActiveWorkbook.Worksheets("Buchungen").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Buchungen").Sort.SortFields.Add Key:=Range _
("C2:C30000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Buchungen").Sort.SortFields.Add Key:=Range _
("B2:B30000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Buchungen").Sort
.SetRange Range("A2:L30000")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Füge den Saldo der Buchungen ein
Range("H1").Select
If Sprache = "F" Then
ActiveCell.FormulaR1C1 = "Solde"
Else
ActiveCell.FormulaR1C1 = "Saldo"
End If
Range("H2").Select
ActiveCell.FormulaR1C1 = "=RC[-2]-RC[-1]"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-5]=R[-1]C[-5],R[-1]C+RC[-2]-RC[-1],RC[-2]-RC[-1])"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.Offset(-1, 0).Range("A1").Select
Selection.Copy
ActiveCell.Offset(1, 0).Range("A1:A30000").Select
ActiveSheet.Paste
'Springe auf die letzte Zahlenzeile um die anderen zu Löschen
Range("A1").Select
Selection.End(xlUp).Select
Selection.End(xlDown).Select
ActiveWindow.SmallScroll Down:=3
ActiveCell.Offset(1, 0).Rows("1:30000").EntireRow.Select
Selection.ClearContents
ActiveCell.Select
'Kolonne H formatieren und Formel herausnehmen sowie Ueberschrift Kolonne D
Columns("H:H").Select
Selection.Style = "Comma"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("D1").Select
If Sprache = "F" Then
ActiveCell.FormulaR1C1 = "Texte d'écriture"
Else
ActiveCell.FormulaR1C1 = "Buchungstext"
End If
'Ueberschriftszeile formatieren und Kader erstellen
Range("A1:H1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection.Font
.FontStyle = "Kursiv"
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
End With
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
'Einfügen eines Titels
Rows("1:1").Select
'  (!!! Die folgende Programmlinie funktionniert nicht)
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select
Dim NameGesellschaft As String
Dim Periode As String
If Sprache = "F" Then
NameGesellschaft = InputBox("Quel est le nom de la société ?", "à indiquer le nom")
Periode = InputBox("Il s'agit des écritures de la période ?", "période ")
Else
NameGesellschaft = InputBox("Wie heisst die Gesellschaft ?", "bitte Name eingeben")
Periode = InputBox("Für welche Periode sind diese Buchungen ?", "Periode ")
End If
Range("A1").Value = NameGesellschaft
Range("E1").Value = Periode
'Einfügen eines Filters um die Kontis zu isolieren
Rows("2:2").Select
Selection.AutoFilter
Application.ScreenUpdating = True
Range("A1").Select
End Sub

Anzeige
Wahnsinn...
02.08.2017 14:37:17
Michael
Herbert,
...dass der Code überhaupt bis zu dieser Zeile läuft ist schon beeindruckend. Der Code braucht dringendst Überarbeitung.
Grds. sollte die von Dir bezeichnete Programmzeile funktionieren; denn in der Zeile davor wird lediglich die erste Zeile auf dem aktiven Blatt ausgewählt, und dann mit der aktuellen Auswahl (gesamte erste Zeile des aktiven Blatts) eine Zeile eingefügt - auch isoliert funktioniert das problemlos.
Aber bereits davor tummelt sich so Einiges:
- Zunächst das Eintragen von Formeln inkl. Ersetzen derselben mit ihren Werten: Du solltest unbedingt komplette Bereich füllen, hier mal am Bsp. von E4:E30000
With Range("E4:E30000")
.FormulaR1C1 = "=IF(R[1]C[-2]"""","""",R[1]C[-1])"
.Value = .Value
End With
Und schon wird's übersichtlicher; die gesamte Selektiererei und Aktiviererei kannst Du Dir sparen.
- Auch für das Löschen von Bereichen, Einfügen bzw. Anpassen von Spaltengrößen musst Du nicht vorher Selektier-Verrenkungen machen, nutze die Methoden für ganze Bereiche direkt:
Columns("D:E").Delete Shift:=xlToLeft
Columns("F:H").Delete Shift:=xlToLeft
Columns("A:G").EntireColumn.AutoFit
Rows("1:2").Delete Shift:=xlUp
- Völlig fassungslos sitze ich vor diesem Teil in Deinem Code, das ist schon so verquer gescriptet, dass ich nicht mal mehr verstehe, worum's Dir geht, um es zu kürzen:
Range("H2").Select
ActiveCell.FormulaR1C1 = "=RC[-2]-RC[-1]"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-5]=R[-1]C[-5],R[-1]C+RC[-2]-RC[-1],RC[-2]-RC[-1])"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.Offset(-1, 0).Range("A1").Select
Selection.Copy
ActiveCell.Offset(1, 0).Range("A1:A30000").Select
ActiveSheet.Paste
Denn das
ActiveCell.Offset(1, 0).Range("A1").Select
ist wirklich irgendwas - was soll das Range("A1") in dieser Zeile?
- Und dann gäb's noch kosmetische Verbesserungen, wie bspw.
Sprache = IIf(Range("A1") = "Liste des écritures", "F", "D")
anstatt
    Range("A1").Select
If Range("A1") = "Liste des écritures" Then
Sprache = "F"
Else
Sprache = "D"
End If
was auch der Übersichtlichkeit zuträglich wäre. Und...
- das totale Chaos im Code wird auch noch durch zwischendrin eingestreute Variablen-Deklarationen vermehrt.
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select
Dim NameGesellschaft As String
Dim Periode As String
If Sprache = "F" Then
Variablen-Deklarationen gehören IMMER gesammelt in den Prozedurkopf.
Dein Code sollte also im Gesamten überarbeitet werden, dazu wäre aber sicher eine kleine Beispiel-Datei mit Anleitung, was der Ausgangs- und der Zielstand sein soll, hilfreich, denn aus diesem Code kann bspw. ich nicht vollständig ableiten was Du willst. Wichtig ist auch, einfach zu beschreiben, worum es Dir geht - nicht unbedingt schon an eine bestimmte Vorgehensweise zu denken, denn evtl. gibt es bessere.
Soweit mal von mir.
LG
Michael
Anzeige
AW: Wahnsinn...
02.08.2017 16:18:44
Herbert
Hallo Michael,
Vielen Dank für die ausführlichen Erklärungen. Ich bin vermultlich als Programmierer weniger geeignet.
Gruss
Iwo, das wird schon...
02.08.2017 16:25:43
Michael
Herbert,
...wir haben alle mal angefangen. Und hier im Forum erhältst Du bereitwillig Hilfe und Tipps zur Verbesserung. In Deinem Fall gehe ich aber davon aus, dass es Sinn macht, wenn Du Dir einmal ein paar VBA-Grundlagen zulegst (es gibt auch ein sehr gutes Wiki-Book dazu https://de.wikibooks.org/wiki/VBA_in_Excel)
Zu Deinem Code: brauchst Du jetzt noch Hilfe? Falls ja, dann lad eine Beispiel-Mappe hoch, und wir schauen uns das an (wie ich Dir schon geschrieben habe).
Lg
Michael
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige