4.5k Aufrufe
Gefragt in Tabellenkalkulation von
ein Hallo an Alle,

habe folgendes Problem:

Worksheets(TABELL).Range(Cells(ZAE, 1), Cells(ZANZ, 40)).Select
Delete.Row.Selection

mit diesem Modul-Ausschnitt möchte ich einen Zellenblock markieren und anschließend die Zeilen dieses Blocks löschen.
im ersten Augenschein einfach, doch ich beschäftige mich schon seit Tagen mit der Lösung.
Besonderheit dabei: das angesprochene, selektierte Sheet ist 1 Detail-Sheet aus 1 Pivot-Tabelle.
Kurzbeschreibung der Vorgehensweise: aus 1 Pivot wird duch Drill-Down ein neues Sheet erstellt, welches nachbearbeitet wird. Dabei sollen überflüssige Zeilen gelöscht werden und die Zahlen vernünftig formatiert werden.
Vielleicht fällt ja Jemanden etwas zur Lösung ein.
Würde mich freuen, was zu hören.
Karlheinz

22 Antworten

0 Punkte
Beantwortet von
http://www.file-upload.net/download-4531601/Test2.xlsm.html

Sorry, da habe ich wohl nicht geschalten. Muß dazu sagen, dass ich bis jetzt keine Erfahrung mit Foren hatte. Hoffe, ich stelle mich nicht allzu ungeschickt an.

Gruß
Karlheinz
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi ^^

es wird ein string vorausgesetzt bei einem namen

sollte eine zahl uebergeben werden ist es ein index

string gewollt ?

index gewollt ?

gruss nighty
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Karlheinz,

kein Problem, jeder fängt mal an ;-),

Noch eine Frage zu deinem Makro; Soll die Outputdatei Tabelle5 sein?

Hat es einen besonderen Grund, dass das Makro im VBA-Modul des Tabellenblatts steht und nicht in einem Modul?

Gruß

M.O.
0 Punkte
Beantwortet von
Guten Morgen M.O.
der Output Name wird vom Drill-Down vergeben. Der legt pro Session eine neue Output an mit aufsteigendem Namen(Tabelle1,..2, usw), d.h. bei jedem Drill-Down ein neues Sheet mit fortlaufendem Namensnummerierung.
wenn Du in der Pivot Tabelle mit Doppel-Klick auf irgendeine Zelle klickst, dann legt er hier eine neue Output-Tabelle an, die Tabelle5 war nur als Beispiel gedacht, ich denke der nächste Drill-Down hat wieder "Tabelle1"

Das mit VBA-Modul habe ich unbewußt gemacht. Frage: hat es einen Vorteil wenn ich das Makro in ein Modul stelle ?, wenn ja, wie muß ich da vorgehen ?

Gruß

Karlheinz
0 Punkte
Beantwortet von
Hallo Nighty,
schön, dass Du dazu kommst.
Der mit dem Drill-Down vergebene Tabellenname(der ja nicht vorher bestimmt werden kann) ist ein String und wird mit einer Input-Box vom User abgefragt, ebenso die Spalte, die den Drill-Down ausgelöst hat, also die zu untersuchende Spalte.
Beides als String.
Gruß
Karlheinz
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Karlheinz,

wenn du das betreffende Arbeitsblatt löschst, dann ist das Makro weg.
Wie du das Makro in ein allgemeines Modul einfügst, kannst du hier mit Hilfe einer bebilderten Anleitung sehen: Klick mich!

Ich habe dein Makro leicht geändert. Kopiere es in dein Standardmodul:

Option Explicit

Sub Output()
Dim TABELL As String, BU As String, SK As String, LIST As String, KS As String
Dim SP As Integer
Dim WERT As Double
Dim WK1 As Worksheet
Dim ZAE As Long, LETZTE As Long, ZANZ As Long, i As Long
TABELL = InputBox("Eingabe Output-Tabelle") ' Ausgabedatei eingaben
' Ausgabedatei eingaben
BU = InputBox("Eingabe Report-BU") ' Report BU
Set WK1 = Worksheets(TABELL)
WK1.Select
Selection.AutoFilter


WK1.Cells(2, 1).Activate

Application.ScreenUpdating = False
KS = "N1" 'KSt Spalte"
ZAE = 2
Select Case BU
Case Is = "4-132"
SP = 2
Case Is = "4-134"
SP = 3
Case Is = "4-138"
SP = 4
Case Is = "4-139"
SP = 5
Case Is = "5-053"
SP = 6
Case Is = "5-054"
SP = 7
Case Is = "5-055"
SP = 8
End Select

Select Case SP
Case Is = 2
SK = "B1"
Case Is = 3
SK = "C1"
Case Is = 4
SK = "D1"
Case Is = 5
SK = "E1"
Case Is = 6
SK = "F1"
Case Is = 7
SK = "G1"
Case Is = 8
SK = "H1"
End Select

Worksheets(TABELL).ListObjects(TABELL).Sort.SortFields. _
Add Key:=Range(SK), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets(TABELL).ListObjects(1).Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'****
ZAE = 2
Debug.Print ZANZ

Do Until WK1.Cells(ZAE, SP) = ""
ZAE = ZAE + 1
Loop

ZANZ = ZAE
Do Until IsEmpty(WK1.Cells(ZANZ, 1))
ZANZ = ZANZ + 1
Loop


'WK1.Cells(ZAE, 1).Activate

For i = ZAE To ZANZ
Rows(i).EntireRow.Delete
Next i
ZANZ = ZAE - 1

ZAE = 2

'WK1.Cells(ZAE, 1).Select
For ZAE = 2 To ZANZ
WERT = Format(WK1.Cells(ZAE, SP).Value, "##,##0")
WK1.Cells(ZAE, SP).Value = WERT
WK1.Cells(ZAE, SP).Font.Bold = True
WK1.Cells(ZAE, SP).Font.Size = 12
'WEITER:
Next ZAE
'WK1.Cells(ZAE, 1).Activate

Worksheets(TABELL).Columns().NumberFormat = "#,##0"
Worksheets(TABELL).ListObjects(TABELL).Sort.SortFields. _
Add Key:=Range(KS), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets(TABELL).ListObjects(1).Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Application.ScreenUpdating = True

End Sub


Bei deiner Testdatei funktioniert es. Mir ist aber folgendes aufgefallen:
Legt man eine neue Outputdatei an, so kann es vorkommen, dass der Name der neuen Tabelle nicht mit dem definierten Namen in der Entwurfsansicht übereinstimmt. Ändert man in der Entwurfsansicht den definierten Namen auf den Tabellennamen ab, so funktioniert das Makro. Ansonsten gibt es Fehlermeldungen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.,
ehrlich gesagt, sehe ich da keine wesentliche Änderung.
Der Grund, warum ich mich ans Forum gewandt habe, war in erster Linie dieser Abschnitt:
'************************************
For i = ZAE To ZANZ
Rows(i).EntireRow.Delete
Next i
ZANZ = ZAE - 1
'***********************************
den wollte ich durch Blockbildung - mit ZAE bis ZANZ sind bereits die Grenzen abgesteckt -markieren und in 1 Rutsch löschen.
Auf die Art, wie er drinnen steht, dauert es zulange(teilweise > 2 Min.)

Da war Dein erster Vorschlag ja vielversprechend:
Worksheets(TABELL).Range(Cells(ZAE, 1), Cells(ZANZ, 1)).EntireRow.Delete xlShiftUp

Nachdem Du hier keine Änderung vorgenommen hast, folgere ich daraus, dass dies doch nicht machbar ist. Ist dies korrekt ?

danke für Deine Mühe

Gruß
Karlheinz
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Karlheinz,

sorry, daran habe ich gar nicht mehr gedacht. Ersetze den Ausdruck

For i = ZAE To ZANZ
Rows(i).EntireRow.Delete
Next i


durch die folgende Zeile:

Range(Cells(ZAE, 1), Cells(ZANZ, 1)).EntireRow.Delete


Funktioniert in der Testmappe auch.

Gruß

M.O.
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi :-)

Worksheets(CStr(DeineVariable) ).Range(Cells(ZAE, 1), Cells(ZANZ, 1)).EntireRow.Delete xlShiftUp

oder

Worksheets(DeineVariable + "").Range(Cells(ZAE, 1), Cells(ZANZ, 1)).EntireRow.Delete xlShiftUp

geschuetzte bereiche wie verbundene zellen sind zu beachten

gruss nighty
0 Punkte
Beantwortet von
Hallo M.O.,
Hallo Nighty,

M.O.: Dein Vorschlag hat den Vorteil, dass er keine Fehlermeldung bringt, tut so, als ob alles i.O. wäre, hat aber nichts getan, der Löschvorgang findet nicht statt.

Nighty: Dein Vorschlag bringt 1 'Laufzeitfehler 1004"

Hoffe, das uns da noch was Besseres einfällt.

Vielen Dank jedenfalls für Eure Bemühungen

Gruß
Karlheinz
...