Live-Forum - Die aktuellen Beiträge
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
11.11.2019 14:27:24
Birgit
Hallo Dieter,
leider ist mein Beitrag wohl schon archiviert, zumindest finde ich ihn nicht mehr.
Ich habe aus diesem Grund einen aktuellen eröffnet.
Gruß
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. :)
Bezieht sich auf diese Nachricht:

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

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dieter // Gliederung
11.11.2019 17:19:45
Dieter
Hallo Birgit,
ich habe deine beiden Beiträge von heute 8:43 und 9:06 im Archiv gelesen. Vielen Dank für deine freundliche Rückmeldung.
Soweit ich dein erweitertes Problem verstehe, brauchst du keine 13 Hilfsblätter, sondern nur das eine.
Der Inhalt des Hilfsblattes wird vor jeder Verwendung gelöscht. Es wird nur dafür gebraucht, die Sätze in eine sortierfähige Struktur zu bringen und sie dann dort zu sortieren. Falls das Hilfsblatt optisch stört, dann kann es natürlich auch ausgeblendet werden, im Programm ändert sich dadurch nichts.
Wenn du das Hilfsblatt aktivierst und dann in den Direktbereich eingibst:
ActiveSheet.Visible = xlSheetVeryHidden (anschließend Eingabetaste)
dann kann es im manuellen Excel nicht wieder sichtbar gemacht werden.
(Du kannst es wieder sichtbar machen, wenn du deine Arbeitsmappe aktivierst und dann in den Direktbereich eingibst:
Worksheets("Hilfsblatt").Visible = True)
Melde dich bitte, wenn du weitere Unterstützung brauchst.
Viele Grüße
Dieter
Anzeige
AW: Dieter // Gliederung
12.11.2019 13:52:32
Birgit
Hallo Dieter,
ich habe nun dein Makro eingebaut und "angepasst". Anbei die Beispieldatei ergänzt um einen Reiter "Screenshot" um meine Originaltabelle zu verdeutlichen. Leider kann ich aus Datenschutzgründen nicht das gesamte Werk online stellen. Hoffe aber dennoch, dass meine Screenshots weiterhelfen.
Problem 1:
Sobald ich alle mit einem "X" markierten Daten übernehmen möchte arbeitet die Excel wie irre und stürzt dann ab.
Problem 2:
Ich habe auch das Modul eingefügt, das ich in deiner Datei gesehen habe.
In diesem Modul wird aber nur "Obst" angesprochen. Logisch, weil auch nur das vorhanden ist. Nun habe ich aber eine Vielzahl von Blättern. Wie kann ich die Abfrage von einem Blatt im Modul also auf die ganze Tabelle anwenden?
Problem 3:
Ich habe in der "Projektplanung" ab "W2" ein paar Definitionen eingefügt, muss sie aber um einige erweitern. Berücksichtigt das dein Makro?
Es tut mir leid das ich so schrecklich untalentiert bin und bin gleichzeitig total froh jemanden wie dich an der Seite zu haben :)
VG
Birgit
https://www.herber.de/bbs/user/133141.xlsm
Anzeige
AW: Dieter // Gliederung
13.11.2019 10:46:40
Dieter
Hallo Birgit,
Zu Problem 1 und 2:
Ich habe das Programm so angepasst, dass es von allen Blättern, die Gewerke enthalten, die mit "x" versehenen Gewerke übernimmt. Ausgenommen sind nur die 4 Blätter "Vorbemerkungen", "Projektplanung", "Zeiten_Material lt. SA" und "Hilfsblatt" (die Schreibweise dieser 4 Blattnamen müsstest du noch einmal überprüfen). Das Programm geht davon aus, dass alle anderen Blätter Gewerke enthalten und berücksichtigt werden müssen.
Zu Problem 3:
Im Blatt "Projektplanung" können in den Spalten W und X ab Zeile 3 beliebig viele Begriffe stehen. Das Programm berücksichtigt das.
Zum Hilfsblatt:
Dieses Blatt wird vom Programm automatisch auf xlVeryHidden gesetzt, so dass es den Anwender nicht irritiert.
Das Programm sieht jetzt folgendermaßen 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 wb As Workbook
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 wb = ThisWorkbook
If Not BlattExistiert(wb, "Hilfsblatt") Then
MsgBox Prompt:="Das Blatt ""Hilfsblatt"" Existiert nicht.", _
Buttons:=vbCritical
GoTo Ende
End If
Set wsH = wb.Worksheets("Hilfsblatt")
wsH.Visible = xlSheetVeryHidden
wsH.UsedRange.EntireRow.Delete
Set wsZ = wb.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
For Each wsQ In wb.Worksheets
' ########################################################################################## _
' Hier die Namen der von der Gewerkeübernahme auszuschließenden Blätter überprüfen,
' eventuell um weitere auszuschließende Blätter ergänzen!
' ########################################################################################## _
If wsQ.Name  "Vorbemerkungen" And _
wsQ.Name  "Projektplanung" And _
wsQ.Name  "Zeiten_Material lt. SA" And _
wsQ.Name  "Hilfsblatt" Then
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 & "), Blatt """ & wsQ.Name & """" & vbNewLine  _
& _
"steht nicht in der " & _
"Übersetzungstabelle """ & wsZ.Name & "!" & _
rngTransTab.Address(False, False) & """" & _
vbNewLine & vbNewLine & _
"Das Programm wird beendet!", _
Buttons:=vbCritical
GoTo Ende
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
End If
Next wsQ
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
wsZ.Activate
wsZ.Range("A1").Activate
Ende:
Application.ScreenUpdating = True
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
Function BlattExistiert(Mappe As Workbook, _
Blattname As String) As Boolean
Dim sh As Object
For Each sh In Mappe.Sheets
If UCase$(sh.Name) = UCase$(Blattname) Then
BlattExistiert = True
Exit Function
End If
Next sh
End Function
https://www.herber.de/bbs/user/133170.xlsm
Viele Grüße
Dieter
Anzeige
AW: Dieter // Gliederung
14.11.2019 07:53:29
Birgit
Guten Morgen Dieter,
ich bekomme hier einen Laufzeitfehler angezeigt:
End If
Set rngTransTab = wsZ.Range("W3").Resize(letzteZeileZ - 2, 2)
transTab = rngTransTab.Value
anzLeistBisher = WorksheetFunction.CountA(wsZ.Columns("D")) - 1
If anzLeistBisher > 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")) ===> hier
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
Gruß
Birgit
Anzeige
AW: Dieter // Gliederung
14.11.2019 16:27:46
Dieter
Hallo Birgit,
ich vermute, dass die Satzstruktur im Blatt "Projektplanung" nicht so aussieht, wie sie das Programm erwartet. Da lässt sich aber eine Prüfroutine einbauen, die so etwas abfängt.
Könntest du eine Arbeitsmappe hochladen, die nur das Blatt "Projektplanung" enthält und zwar in der Form, in der der Laufzeitfehler aufgetreten ist?
Die Daten in den Spalten E bis L können gelöscht sein.
Viele Grüße
Dieter
AW: Dieter // Gliederung
15.11.2019 08:34:33
Birgit
Guten Morgen Dieter,
ich weiß leider nicht was du mit

in der Form, in der der Laufzeitfehler aufgetreten ist
meinst, aber ich hab dir mal mein Original hochgeladen.
https://www.herber.de/bbs/user/133231.xlsx
Gruß
Birgit
Anzeige
AW: Dieter // Gliederung
16.11.2019 16:34:49
Dieter
Hallo Birgit,
das Blatt "Projektplanung" war schon OK, ich hatte es mir noch mit den Eingabedaten vorgestellt.
Immerhin habe ich gesehen, dass dein Datenbereich nicht bei Zeile 3 anfängt, sondern erst bei Zeile 54. Das habe ich jetzt im Programm berücksichtigt. Außerdem habe ich ein Prüfprogramm eingefügt, welches prüft, ob die Daten im Blatt "Projektplanung" die erwartete Struktur haben.
https://www.herber.de/bbs/user/133252.xlsm
Viele Grüße
Dieter
P.S. Vom 02. - 06.12.2019 habe ich einen VBA-Kurs bei der VHS Herne
http://www.vhs-herne.de/
Anzeige
AW: Dieter // Gliederung
18.11.2019 14:55:39
Birgit
Hallo Dieter,
eine absolut grandiose Meisterleistung! Vielen lieben Dank. Das funktioniert nun einwandfrei!!
Wenn Herne nicht so weit weg von mir wäre, würde ich mich höchst wahrscheinlich dazu hinreißen lassen :)
VLG
Birgit

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige