Anzeige
Archiv - Navigation
1720to1724
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

Dieter // Gliederung

Dieter // Gliederung
04.11.2019 14:01:19
Birgit
Hallo Dieter,
nach zwei wöchiger Abwesenheit hab ich nun deinen Beitrag gefunden. Vorab, herzlichen Dank!
Hallo Birgit, das wird natürlich etwas komplizierter. Ich übernehme die Daten zuerst in ein Hilfsblatt, sortiere sie da und baue dann das Blatt " _ Projektplanung" neu auf. Das sieht dann so aus:

Sub LeistungenÜbernehmen()
Dim aktLeistung As String
Dim anzLeistBisher As Long
Dim letzteZeileH As Long
Dim letzteZeileQ As Long
Dim letzteZeileZ As Long
Dim bisherLeistung As String
Dim i As Long
Dim sp As Long
Dim transTab As Variant
Dim wsH As Worksheet
Dim wsQ As Worksheet
Dim wsZ As Worksheet
Dim zeileH As Long
Dim zeileQ As Long
Dim zeileZ As Long
Application.ScreenUpdating = False
Set wsH = ThisWorkbook.Worksheets("Hilfsblatt")
wsH.UsedRange.EntireRow.Delete
Set wsQ = ThisWorkbook.Worksheets("Obst")
Set wsZ = ThisWorkbook.Worksheets("Projektplanung")
letzteZeileZ = wsZ.Cells(wsZ.Rows.Count, "W").End(xlUp).Row
If letzteZeileZ  0 Then
' Daten von Projektplanung nach Hilfsblatt übernehmen
letzteZeileZ = wsZ.Cells(wsZ.Rows.Count, "D").End(xlUp).Row
zeileZ = 3
Do Until zeileZ > letzteZeileZ
If Not IsEmpty(wsZ.Cells(zeileZ, "C")) Then
aktLeistung = wsZ.Cells(zeileZ, "C")
zeileZ = zeileZ + 1
Else
Do Until IsEmpty(wsZ.Cells(zeileZ, "D"))
zeileH = zeileH + 1
wsH.Cells(zeileH, "C") = aktLeistung
wsZ.Cells(zeileZ, "D").Resize(, 9).Copy Destination:=wsH.Cells(zeileH, "D")
zeileZ = zeileZ + 1
Loop
End If
Loop
End If
' Neu einzufügende Leistungen dem Hilfsblatt hinzufügen
letzteZeileQ = wsQ.Cells(wsQ.Rows.Count, "B").End(xlUp).Row
For zeileQ = 5 To letzteZeileQ
If wsQ.Cells(zeileQ, "A") = "x" Then
If Len(wsQ.Cells(zeileQ, "B")) > 6 Then
zeileH = zeileH + 1
aktLeistung = Mid$(wsQ.Cells(zeileQ, "B"), 3, 4)
wsH.Cells(zeileH, "C") = WorksheetFunction.VLookup(aktLeistung, transTab, 2, 0)
wsQ.Cells(zeileQ, "B").Resize(, 9).Copy Destination:=wsH.Cells(zeileH, "D")
End If
End If
Next zeileQ
letzteZeileH = zeileH
' Sortierung des Hilfsblattes
With wsH.Sort
With .SortFields
.Clear
.Add Key:=wsH.Range("C1")
.Add Key:=wsH.Range("D1")
End With
.SetRange Rng:=wsH.Range("C1").Resize(letzteZeileH, 10)
.Header = xlNo
.Apply
End With
' Daten aus dem Hilfsblatt nach Projektplanung übernehmen
' Bisherigen Inhalt von Blatt "Projektplanung" löschen
If Not Intersect(wsZ.UsedRange, wsZ.Range("A3").Resize(wsZ.Rows.Count - 2, 12)) Is Nothing  _
Then
Intersect(wsZ.UsedRange, wsZ.Range("A3").Resize(wsZ.Rows.Count - 2, 12)).ClearContents
End If
zeileZ = 3
For zeileH = 1 To letzteZeileH
aktLeistung = wsH.Cells(zeileH, "C")
If aktLeistung  bisherLeistung Then
' Wechsel der Leistungsart
wsZ.Cells(zeileZ, "C") = aktLeistung
zeileZ = zeileZ + 1
bisherLeistung = aktLeistung
End If
wsH.Cells(zeileH, "D").Resize(, 9).Copy
wsZ.Cells(zeileZ, "D").PasteSpecial Paste:=xlValues
Application.CutCopyMode = xlCut
zeileZ = zeileZ + 1
Next zeileH
Application.ScreenUpdating = True
wsZ.Activate
wsZ.Range("A1").Activate
End Sub
https://www.herber.de/bbs/user/132559.xlsm
Viele Grüße
Dieter Allerdings bekomme ich in deiner Beispieldatei folgende "Fehlermeldung":
"Laufzeitfehle 1004: Die VLookup-Eigenschaft des WorksheetFunction-Objektes kann nicht zugeordnet werden."
        wsH.Cells(zeileH, "C") = WorksheetFunction.VLookup(aktLeistung, transTab, 2, 0)
Gruß
Birgit

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

Betreff
Datum
Anwender
Anzeige
AW: Dieter // Gliederung
05.11.2019 08:01:02
Birgit
Guten Morgen,
oder jemand anderes vielleicht? :)
Gruß
Birgit
AW: Dieter // Gliederung
05.11.2019 11:05:22
Matthias
Moin!
ALso habe mal gestestet, bei mir kommt da keine Fehlermeldung. Kannst du sonst ggf. mal deine Datei hochladen, damit man schauen kann, ob ggf. etwas anders ist.
Ansonsten wäre es vllt. hilfreich, auf den alten Thread mal zu verlinken. Damit könnte man schauen, was gefragt wurde und den Code notfalls auch ändern.
Ansonsten mal als Frage:
Du trägst Werte in das Blatt Obst ein. Die Felder mit einem X in Spalte A sollen dann in die Projektplanung an der richtigen Stelle eingefügt werden bzw. Wenn es die noch nicht gab, ein neuer Absatz erstellt werden?
VG
Anzeige
AW: Dieter // Gliederung
05.11.2019 11:21:10
Dieter
Hallo Birgit,
das Problem liegt daran, dass der SVERWEIS (VLOOKUP) in Blatt "Projektplanung" Spalten W und X keinen gültigen Wert findet.
Der Wert nach dem gesucht wird, entsteht aus dem entsprechenden Wert in Spalte B von Blatt "Obst" einfach dadurch, dass ab Stelle 3 4 Zeichen herausgeschnitten werden. Deine Beispieldaten waren so, dass das funktioniert hat. Vielleicht sind deine Originaldaten komplizierter, dann müsstest du mal ein Beispiel mit den kompletten Möglichkeiten Schicken.
Ich habe das Programm jetzt so ergänzt, dass nicht mehr der Laufzeitfehler erscheint, sondern eine programmierte Fehlermeldung. An der Fehlermeldung kannst du erkennen, nach welchem Begriff mit SVERWEIS gesucht wird. Außerdem habe ich das Programm so ergänzt, dass doppelte Sätze vermieden werden.
Es sieht jetzt so aus:
Sub LeistungenÜbernehmen()
Dim aktLeistung As String
Dim anzLeistBisher As Long
Dim letzteZeileH As Long
Dim letzteZeileQ As Long
Dim letzteZeileZ As Long
Dim bisherLeistung As String
Dim i As Long
Dim rngTransTab As Range
Dim sätzeGleich As Boolean
Dim spalte As Long
Dim transTab As Variant
Dim übersLeistung As Variant ' aktLeistung wird mit Hilfe der
' Übersetzungstabelle Projektpalnung!W:X
' in übersLeistung übersetzt
Dim wsH As Worksheet  ' Hilfsblatt
Dim wsQ As Worksheet  ' Quelle (Blatt "Obst")
Dim wsZ As Worksheet  ' Ziel (Blatt "Projektplanung")
Dim zeileH As Long
Dim zeileQ As Long
Dim zeileZ As Long
Application.ScreenUpdating = False
Set wsH = ThisWorkbook.Worksheets("Hilfsblatt")
wsH.UsedRange.EntireRow.Delete
Set wsQ = ThisWorkbook.Worksheets("Obst")
Set wsZ = ThisWorkbook.Worksheets("Projektplanung")
letzteZeileZ = wsZ.Cells(wsZ.Rows.Count, "W").End(xlUp).Row
If letzteZeileZ  0 Then
' Daten von Projektplanung nach Hilfsblatt übernehmen
letzteZeileZ = wsZ.Cells(wsZ.Rows.Count, "D").End(xlUp).Row
zeileZ = 3
Do Until zeileZ > letzteZeileZ
If Not IsEmpty(wsZ.Cells(zeileZ, "C")) Then
aktLeistung = wsZ.Cells(zeileZ, "C")
zeileZ = zeileZ + 1
Else
Do Until IsEmpty(wsZ.Cells(zeileZ, "D"))
zeileH = zeileH + 1
wsH.Cells(zeileH, "C") = aktLeistung
wsZ.Cells(zeileZ, "D").Resize(, 9).Copy Destination:=wsH.Cells(zeileH, "D")
zeileZ = zeileZ + 1
Loop
End If
Loop
End If
' Neu einzufügende Leistungen dem Hilfsblatt hinzufügen
letzteZeileQ = wsQ.Cells(wsQ.Rows.Count, "B").End(xlUp).Row
For zeileQ = 5 To letzteZeileQ
If wsQ.Cells(zeileQ, "A") = "x" Then
If Len(wsQ.Cells(zeileQ, "B")) > 6 Then
zeileH = zeileH + 1
aktLeistung = Mid$(wsQ.Cells(zeileQ, "B"), 3, 4)
übersLeistung = Übersetzung(aktLeistung, transTab)
If IsError(übersLeistung) Then
MsgBox Prompt:="Der Begriff """ & aktLeistung & """" & vbNewLine & _
"(entstanden aus """ & wsQ.Cells(zeileQ, 2) & _
""" Zeile " & zeileQ & ")" & vbNewLine & _
"steht nicht in der " & _
"Übersetzungstabelle """ & wsZ.Name & "!" & _
rngTransTab.Address(False, False) & """" & _
vbNewLine & vbNewLine & _
"Das Programm wird beendet!", _
Buttons:=vbCritical
Exit Sub
End If
wsH.Cells(zeileH, "C") = übersLeistung
wsQ.Cells(zeileQ, "B").Resize(, 9).Copy Destination:=wsH.Cells(zeileH, "D")
End If
End If
Next zeileQ
letzteZeileH = zeileH
If letzteZeileH > 0 Then
' Sortierung des Hilfsblattes
With wsH.Sort
With .SortFields
.Clear
.Add Key:=wsH.Range("C1")
.Add Key:=wsH.Range("D1")
End With
.SetRange Rng:=wsH.Range("C1").Resize(letzteZeileH, 10)
.Header = xlNo
.Apply
End With
End If
' Doppelte Sätze aus dem Hilfsblatt entfernen
For zeileH = letzteZeileH To 2 Step -1
sätzeGleich = True
For spalte = 3 To 12
If wsH.Cells(zeileH, spalte)  wsH.Cells(zeileH - 1, spalte) Then
sätzeGleich = False
Exit For
End If
Next spalte
If sätzeGleich Then
wsH.Rows(zeileH).Delete
End If
Next zeileH
' Daten aus dem Hilfsblatt nach Projektplanung übernehmen
' Bisherigen Inhalt von Blatt "Projektplanung" löschen
If Not Intersect(wsZ.UsedRange, wsZ.Range("A3").Resize(wsZ.Rows.Count - 2, 12)) _
Is Nothing Then
Intersect(wsZ.UsedRange, wsZ.Range("A3").Resize(wsZ.Rows.Count - 2, 12)).ClearContents
End If
zeileZ = 3
For zeileH = 1 To letzteZeileH
aktLeistung = wsH.Cells(zeileH, "C")
If aktLeistung  bisherLeistung Then
' Wechsel der Leistungsart
wsZ.Cells(zeileZ, "C") = aktLeistung
zeileZ = zeileZ + 1
bisherLeistung = aktLeistung
End If
wsH.Cells(zeileH, "D").Resize(, 9).Copy
wsZ.Cells(zeileZ, "D").PasteSpecial Paste:=xlValues
Application.CutCopyMode = xlCut
zeileZ = zeileZ + 1
Next zeileH
Application.ScreenUpdating = True
wsZ.Activate
wsZ.Range("A1").Activate
End Sub
Function Übersetzung(Leistung As String, _
Tabelle As Variant) As Variant
On Error GoTo Fehlerbehandlung
Übersetzung = WorksheetFunction.VLookup(Leistung, Tabelle, 2, 0)
Exit Function
Fehlerbehandlung:
Übersetzung = CVErr(xlErrNA)
End Function
https://www.herber.de/bbs/user/132957.xlsm
Viele Grüße
Dieter
Anzeige
AW: Dieter // Gliederung
11.11.2019 08:43:59
Birgit
Guten Morgen Dieter,
das ist sowas von sensationell, vielen vielen Dank.
Bevor ich mich nun ans Werk mache eine Frage. Kann man sich grundsätzlich das Hilfsblatt "sparen" und die Definition der verschiedenen Produktgruppen gleich in das Blatt "Obst" integrieren?
Ich habe nämlich 13 verschiedene Blätter und müsste mir nun dazu 13 verschiedene Hilfsblätter generieren, wenn ich das nun richtig gelesen habe.
Aus dem Grund würde ich nun in Spalte "A" die Definitionen ergänzen und das Makro so umschreiben, dass es ab Spalte "B" die "X" ausliest.
Solltest du mir aber nun sagen das es nicht umsetzbar ist, dann lass ich es und arbeite mit den Hilfsblättern weiter :)
VG
Birgit
Anzeige
AW: Dieter // Gliederung
11.11.2019 09:06:00
Birgit
Hm, irgendwie kam meine Nachricht nicht durch. Dann halt ein zweites Mal :)
Ich würde mich nun dran setzen und die Definition der einzelnen Gruppen in das Blatt "Obst" integrieren, da ich 13 verschiedene Blätter habe und ungern nun 13 verschiedene Hilfsblätter anlegen möchte. Das Umschreiben des Makros bekomme ich vielleicht sogar hin.
Geht das aus deiner Sicht? Wenn nicht, dann würde ich es lassen. :)
Gruß
Birgit
PS: Ich hab mich in meiner ersten Nachricht von Herzen bedankt für deine Unterstützung. :)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige