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

Excelabsturz bei Hinzufügen einer Tabellenzeile

Excelabsturz bei Hinzufügen einer Tabellenzeile
12.08.2019 09:31:08
Katharina
Hallo liebes Herber-Forum,
ich übertrage Daten mit Hilfe eines Makros in eine Tabelle. Das klappt auch wunderbar.
Wenn ich dann allerdings eine UserForm öffne, und über diese ebenfalls Zeilen in die Tabelle hinzufügen möchte, dann stürzt die Datei sofort ab, wenn man eine Zeile in die Tabelle einfügt.
Vor dem Import klappte alles über die Userform.
Hier der Code des Imports (ist leider relativ lang, alle hier nicht definierten Variablen wurden über ein anderes Modul definiert) :
wb = Workbook. ws = das Worksheet mit der betreffenden Tabelle
Dim wbSource As Excel.Workbook
Global wsSource As Excel.Worksheet
Public Sub ImportData()
Dim sCol As String
Dim nrow As Integer
Dim nRowDest As Integer
Dim nCol As Byte
Dim nColDest As Byte
Dim nLastCol As Byte
Dim sDatei As String
Dim firstEditedRow As Integer
With Application
.ScreenUpdating = False
.EnableEvents = True
.Calculation = xlCalculationManual
.DisplayAlerts = False
End With
firstEditedRow = ws.Range("F2:F9999").Find(what:="").Row
'ProtectionOff
Set wsSource = wb.Worksheets("Import")
wsSource.Activate
nLastCol = wsSource.Range("A1:AF1").Find(what:="").Column - 1 'anpassen, falls Bericht sich   _
_
verschiebt. Beginnt momentan ab Zeile 9
For nrow = 2 To 9999
ws.Activate
If wsSource.Cells(nrow, 1) = "" Then Exit For
If wsSource.Cells(nrow, 27)  wsSource.Cells(nrow - 1, 27) Or wsSource.Cells(nrow, 27) =  _
_
"" Then
nRowDest = ws.Range("F2:F9999").Find(what:="").Row
For nCol = 1 To nLastCol
sCol = wsSource.Cells(1, nCol)
If Not ws.Range("A2:ZZ2").Find(what:=sCol, MatchCase:=True) Is Nothing Then
nColDest = ws.Range("A2:ZZ2").Find(sCol).Column
If Right(sCol, 5) = "datum" Or Right(sCol, 8) = "zeitraum" Then
ws.Cells(nRowDest, nColDest).Value = Format(wsSource.Cells(nrow, nCol).Value, "dd. _
_
mm.yyyy")
ElseIf sCol = "Objektnummer" And wsSource.Cells(nrow, 27)  "" Then
ws.Cells(nRowDest, nColDest).Value = "Diverse Center"
Else
ws.Cells(nRowDest, nColDest).Value = wsSource.Cells(nrow, nCol).Value
End If
End If
Next nCol
End If
If wsSource.Cells(nrow, 27)  "" Then
nRowDest = wb.Sheets("Paketverträge").Range("F1:F9999").Find(what:="").Row
For nCol = 1 To nLastCol
sCol = wsSource.Cells(1, nCol)
wb.Sheets("Paketverträge").Activate
If Not wb.Sheets("Paketverträge").Range("A1:ZZ1").Find(what:=sCol, MatchCase:=True)   _
_
Is Nothing Then
nColDest = wb.Sheets("Paketverträge").Range("A1:ZZ1").Find(sCol).Column
wb.Sheets("Paketverträge").Cells(nRowDest, nColDest).Value = wsSource.Cells(nrow,   _
_
nCol).Value
End If
Next nCol
End If
Next nrow
'filling out missing values
For nrow = firstEditedRow To 9999
ws.Activate
If ws.Cells(nrow, 6) = "" Then Exit For
ws.Cells(nrow, 1) = Right(Date, 2)
ws.Cells(nrow, 2) = "'0023"
ws.Cells(nrow, 3) = "MKTG"
Select Case True
Case ws.Cells(3, 4) = ""
lZeile = 3
Case ws.Cells(4, 4) = ""
lZeile = 4
Case Else
lZeile = ws.Range("Tabelle2[lfdNr.]").End(xlDown).Row + 1
End Select
ws.Cells(nrow, 4) = Format(lZeile - 2, "0000")
ws.Cells(nrow, 5) = Format(Date, "dd.mm.yyyy")
ws.Cells(nrow, 9) = "1000031032"
If ws.Cells(nrow, 6) = "Diverse Center" Then
ws.Cells(nrow, 8) = "Diverse Center"
ws.Cells(nrow, 10) = "Diverse Center"
ws.Cells(nrow, 42) = ws.Cells(nrow, 56)
Set rng = wb.Sheets("Paketverträge").Range("Tabelle12").Find(ws.Cells(nrow, 56))
If rng Is Nothing Then
Else
'Summe ziehen bei allen Beträgen und Tagesanzahl bei PKG Verträgen
ws.Cells(nrow, 49) = "=SUMIF(Tabelle12[PKG NR],[@[PKG NR]],Tabelle12[Anzahl Einheiten  _
_
Dauer])"
ws.Cells(nrow, 50) = "=SUMIF(Tabelle12[PKG NR],[@[PKG NR]],Tabelle12[Nebenkosten])"
ws.Cells(nrow, 51) = "=SUMIF(Tabelle12[PKG NR],[@[PKG NR]],Tabelle12[Stromkosten])"
ws.Cells(nrow, 52) = "=SUMIF(Tabelle12[PKG NR],[@[PKG NR]],Tabelle12[Miete netto])"
ws.Cells(nrow, 53) = "=SUMIF(Tabelle12[PKG NR],[@[PKG NR]],Tabelle12[Dekokosten])"
ws.Cells(nrow, 54) = "=SUMIF(Tabelle12[PKG NR],[@[PKG NR]],Tabelle12[Montagekosten])"
End If
Else
ws.Cells(nrow, 8) = Application.VLookup((ws.Cells(nrow, 6)), wbLegende.Sheets(" _
Objektliste").Range("Objektliste[[Teilprojektnummer]:[Kostenstelle]]"), 3, False)
ws.Cells(nrow, 10) = Application.VLookup((ws.Cells(nrow, 6)), wbLegende.Sheets(" _
Objektliste").Range("Objektliste[[Teilprojektnummer]:[Kostenstelle]]"), 4, False)
End If
ws.Cells(nrow, 12) = ws.Cells(nrow, 44) & "-" & ws.Cells(nrow, 45) & "_" & ws.Cells(nrow,  _
_
11) & "_" & ws.Cells(nrow, 8) 'Buchungstext
ws.Cells(nrow, 14) = "EUR"
ws.Cells(nrow, 15) = CDbl(Format(Round(CDbl(ws.Cells(nrow, 50)) + CDbl(ws.Cells(nrow, 51)) _
_
+ CDbl(ws.Cells(nrow, 52)) + CDbl(ws.Cells(nrow, 53)) + CDbl(ws.Cells(nrow, 54)) + CDbl(ws. _
Cells(nrow, 16)), 2), "#,##0.00"))
ws.Cells(nrow, 16) = CDbl(0.19)
ws.Cells(nrow, 17) = CDbl(Format(Round(ws.Cells(nrow, 15) * (1 + CDbl(ws.Cells(nrow, 16))) _
_
, 2), "#,##0.00"))
ws.Cells(nrow, 18) = "Ines Grafe"
ws.Cells(nrow, 19) = "Tel: +49 (0) 40 60606 9130"
ws.Cells(nrow, 20) = "Ines.Grafe@ece.com"
ws.Cells(nrow, 25) = ws.Cells(nrow, 1) & ws.Cells(nrow, 2) & "-" & ws.Cells(nrow, 3) & "-" _
_
& ws.Cells(nrow, 4) 'Rechnungsnummer
ws.Cells(nrow, 27) = "A1"
ws.Cells(nrow, 34) = CDbl(0.19)
If ws.Cells(nrow, 6) = "Diverse Center" Then
ws.Cells(nrow, 35) = "'" & ws.Cells(nrow, 2) & Application.VLookup(ws.Cells(nrow, 13),   _
_
wbLegende.Sheets("MKTG_Legende").Range("Tabelle5[[Leistungsart]:[PSP-Element]]"), 2, False)
Else
ws.Cells(nrow, 35) = "C-" & Left(ws.Cells(nrow, 6), 4) & "-" & ws.Cells(nrow, 2) &  _
Application.VLookup(ws.Cells(nrow, 13), wbLegende.Sheets("MKTG_Legende").Range("Tabelle5[[ _
Leistungsart]:[PSP-Element]]"), 2, False)
End If
Select Case True 'Fälligkeitsdatum
Case CDate(ws.Cells(nrow, 44)) > DateAdd("d", 40, CDate(ws.Cells(nrow, 5)))
ws.Cells(nrow, 37) = DateAdd("d", -30, CDate(ws.Cells(nrow, 44)))
Case CDate(ws.Cells(nrow, 44)) 

' Liefert den String der eingestellten Sprache
Function getStringRessource(strRes As String, nLanguage As Integer)
maxrow = wsMLT.Cells(ws.Rows.Count, 1).End(xlUp).Row
For Each c In wsMLT.Range("B1:B" & maxrow)
If c.Value = strRes Then ' gefunden
getStringRessource = c.Offset(0, nLanguage)
Exit For
End If
Next c
End Function
Sub setUpRechnungstexte(nrow As Integer)
nCol = 1
Select Case ws.Cells(nrow, 33)
Case "Rechnung"
ws.Cells(nrow, 46) = getStringRessource("Rechnung_15", nCol) & " " & CDate(ws.Cells(nrow, 43)) & ", " & ws.Cells(nrow, 42) & " " & getStringRessource("Rechnung_16", nCol)
If ws.Cells(nrow, 37) "" Then ws.Cells(nrow, 47) = getStringRessource("Rechnung_22", nCol) & Chr(10) & Chr(10) & getStringRessource("Rechnung_21", nCol) & " " & CDate(ws.Cells(nrow, 37)) & "."
Case "Rechnungsstorno"
ws.Cells(nrow, 46) = getStringRessource("Rechnung_32", nCol) & " " & ws.Cells(nrow, 21) & " " & getStringRessource("Rechnung_33", nCol)
ws.Cells(nrow, 47) = ""
Case "Gutschriftsstorno"
ws.Cells(nrow, 46) = getStringRessource("Rechnung_32", nCol) & " " & ws.Cells(nrow, 21) & " " & getStringRessource("Rechnung_33", nCol)
ws.Cells(nrow, 47) = ""
Case "Gutschrift"
ws.Cells(nrow, 46) = getStringRessource("Rechnung_15", nCol) & " " & CDate(ws.Cells(nrow, 43)) & ", schreiben wir Ihnen wie folgt gut:"
Case "Rechnungskorrektur"
ws.Cells(nrow, 46) = getStringRessource("Rechnung_15", nCol) & " " & CDate(ws.Cells(nrow, 43)) & ", korrigieren wir Ihnen wie folgt:"
Case "Gutschriftskorrektur"
ws.Cells(nrow, 46) = getStringRessource("Rechnung_15", nCol) & " " & CDate(ws.Cells(nrow, 43)) & ", korrigieren wir Ihnen wie folgt:"
End Select
End Sub
Sub printingInvoices()
basMain.InitRAB
Dim c As Range
For Each c In ws.Range("Tabelle2[gedruckt]").Cells
If c = "" Then
frmErfassung.Rechnungserstellung_Click c.Row
ws.Cells(c.Row, 59) = "x"
End If
Next c
wbLegende.Close False
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excelabsturz bei Hinzufügen einer Tabellenzeile
12.08.2019 10:46:21
fcs
Hallo Katharina,
es ist schwierig, auf Basis des Improt-Codes festzustellen, ob irgendeine Änderung passiert/fehlt, die die dazu führt, dass anschliessend die Aktion im Userform zum Absturz führt.
Kannst du die Makro-Zeile herausfinden, die das Problem auslöst? Dazu im Makro einen Haltepunkt setzen und dann das Makro im Schrittmodus (Taste F8) Zeile für Zeile ausführen.
Hast du schon einmal versucht nach dem Import manuell die Aktionen auszuführen, die das Userform durchführen soll?
Stürzt Excel dabei auch ab.
Du arbeitest mit Tabellenobjekten. Ist der Bereich in den die Daten importiert werden auch eine Tabelle?
Wird die Größe dieser Tabelle während des Imports korrekt angepasst?
Versuche mal die Datei nach dem Import zu speichern bevor du das Userform startest, um Zeilen einzufügen.
Ansonsten müsstets du mal eine Testdateien vorbereiten mit anonymiserten Daten in der der Fehler auftritt.
Dann kommt man bei der Fehlersuche evtl. weiter.
LG
Farnz
Anzeige
AW: Excelabsturz bei Hinzufügen einer Tabellenzeile
12.08.2019 13:38:53
Katharina
Hallo Farnz,
vielen Dank für deine schelle und ausführliche Antwort!
Kannst du die Makro-Zeile herausfinden, die das Problem auslöst? Dazu im Makro einen Haltepunkt setzen und dann das Makro im Schrittmodus (Taste F8) Zeile für Zeile ausführen.
-- Habe ich probiert und das ist die folgende:
lZeile = ws.Range("Tabelle2[lfdNr.]").End(xlDown).Row + 1
---Tabelle2.Cells(lZeile, 4) = Format(lZeile - 2, "0000")---
Hast du schon einmal versucht nach dem Import manuell die Aktionen auszuführen, die das Userform durchführen soll?
-- Ja habe ich, auch da stürzt Excel ab, es sei denn, die UserForm ist geschlossen, dann klappt alles.
Du arbeitest mit Tabellenobjekten. Ist der Bereich in den die Daten importiert werden auch eine Tabelle
-- Es soll eine neue Zeile an die Tabelle hinzugefügt werden, Manipulationen von bestehennden Zeilen funktionieren einwandfrei.
Wird die Größe dieser Tabelle während des Imports korrekt angepasst?
--Ja
Versuche mal die Datei nach dem Import zu speichern bevor du das Userform startest, um Zeilen einzufügen.
-- Leider keine Verbesserung
Vielen Lieben Dank :)
Anzeige
AW: Excelabsturz bei Hinzufügen einer Tabellenzeile
12.08.2019 14:53:04
fcs
Hallo Katharina,
ich hab jetzt festgestellt, dass dein Makro in bestimmten Fälen (Tabelle enthält unter Titelzeile nur eine Leerzeile oder Tabelle hat nur eine Datenzeile) die nächste auszufüllende Zeile nicht korrekt berechnet.
Als Ergebnis wird die letzte Zeile des Tabellenblatts + 1 ermittelt. Dies führt dann zu einem Fehler im Makro. Bei mir aber nicht zum Absturz der Datei.
Passe die Berechnung der nächsten auszufüllenden Zeile wie folgt an:
    If ws.Range("Tabelle2[[#Headers],[lfdNr.]]").Offset(1, 0) = "" Then
lZeile = ws.Range("Tabelle2[[#Headers],[lfdNr.]]").Row + 1
Else
lZeile = ws.Range("Tabelle2[[#Headers],[lfdNr.]]").End(xlDown).Row + 1
End If
Tabelle2.Cells(lZeile, 4) = Format(lZeile - 2, "0000")

Ob dies deine Probleme beseitigt: ?
Wenn das Problem mit dem angezeigten Userform zu tun hat - warum ? - dann kannst du das Userform zeitweise ausblenden während eine neue Zeile eingefügt wird.
Mit
Me.Hide
das Userform zu Beginn des Makros ausblenden und am Ende mit
Me.Show
wieder einblenden.
Ein Problem in dieser Richtung war mir bisher nur bei der Anzeige der Druck-Seitenvorschau bekannt.
LG
Franz
Anzeige
AW: Excelabsturz bei Hinzufügen einer Tabellenzeile
15.08.2019 08:31:28
Katharina
Guten Morgen Franz,
me.hide und me.show hat leider nicht funktioniert,
aber ich habe jetzt ein Workaround gebaut, dass die Daten mit Hilfe einer temp Datei importiert und jetzt scheint es zu klappten :)
Danke dir für die Tips !

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige