Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
900to904
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
900to904
900to904
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

flexible Tabellenprogrammierung

flexible Tabellenprogrammierung
29.08.2007 23:34:03
Eva
Hallo nochmal, ich möchte die Frage nochmal in die Runde stellen, weil ich das Problem dringend lösen muss. Falls es nicht über Makroprogrammierung gelöst werden kann, lasst es mich bitte wissen. Falls jemand einen Lösungsansatz hat, wäre ich sehr glücklich, sitze schon ziemlich lange daran. Hier nochmal die Frage:
Ich benötige ein Makro, das für eine flexible Anzahl von Daten diese gruppiert. Bsp:
Daten:
A1;A;10%
A2;A;20%
A3;A;5%
B1;B;15%
B2;B;3%
B3;B;2%
B4;B;10%
C1;C;20%
C2;C;10%
D1;D;10%
A,B,C,D sind Gruppen, A1,... die Mitglieder dieser Gruppe. Es müssen nicht alle 4 Gruppen vorhanden sein, aber es sind höchstens diese 4. Die Anzahl der Gruppenmitglieder ist variabel.
Als Ergebnis benötige ich eine Exceltabelle, die diese Daten nach Gruppen und innerhalb der Gruppe nach Gewicht sortiert, wie folgendermaßen dargestellt:
A(in Spalte 1)
A2;20% (Spalte 1;Spalte 2)
A1;10% (Spalte 1;Spalte 2)
A3;5% (Spalte 1;Spalte 2)
B (in Spalte 1)
B1;15% (Spalte 1;Spalte 2)
B4;10% (Spalte 1;Spalte 2)
B2;3% (Spalte 1;Spalte 2)
B3;2% (Spalte 1;Spalte 2)
C (in Spalte 1)
C1;20% (Spalte 1;Spalte 2)
C2;10% (Spalte 1;Spalte 2)
D (in Spalte 1)
D1;10% (Spalte 1;Spalte 2)
Bei nicht vorhandenen Gruppen sollten natürlich auch keine Überschriften angezeigt werden und zwischen den Gruppen dürfen keine Leerzeilen auftreten.
Was sehr wichtig ist, ist dass ich als Ergebnis nur noch wie oben dargestellt zwei Spalten erhalte, in Spalte 1 direkt in der Zelle über A1 die Überschrift A, dann wo B1 beginnt muss sozusagen eine Zeile eingefügt werden mit Überschrift B usw. In Spalte 2 dann die Gewichtung.
Vielen Dank schonmal an alle! Grüße, Eva

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: flexible Tabellenprogrammierung
29.08.2007 23:49:00
Oberschlumpf
Hi Eva
Noch schneller könntest du vllt zu einer Lösung kommen, wenn du uns per Upload eine Bsp-Datei mit Bsp-Daten und in der Datei nochmals Erklärungen zur Verfügung stellst.
So wie jetzt müssten wir erst mal mit Hilfe deiner nur-Erklärungen eine Datei "basteln", was aber vllt im Ansatz schon zu Fehlern führen kann, weil wir deine Erklärungen vllt falsch interpretieren.
Thx + Ciao
Thorsten

AW: flexible Tabellenprogrammierung
30.08.2007 01:14:00
fcs
Hi Eva,
hier mein Lösungsvorschlag. Die Startzeile und Startspalte des aufzubereitendne Datenbereichs muss du ggf. noch anpassen. Im Moment müssten deine Daten in Zelle A1 beginnen, damit das Makro korrekt funktioniert.
Gruß
Franz

Sub btest()
Dim wks As Worksheet, Zeile1 As Long, ZeileL As Long, Zeile As Long
Dim Spalte1 As Integer, Bereich As Range
Set wks = ActiveSheet
Zeile1 = 1 '1. Zeile der Daten
Spalte1 = 1 'Linke Spalte der Daten
With wks
ZeileL = .Cells(.Rows.Count, Spalte1).End(xlUp).Row
Set Bereich = .Range(.Cells(Zeile1, Spalte1), .Cells(ZeileL, Spalte1 + 2))
Bereich.Sort Key1:=Bereich.Range("B1"), order1:=xlAscending, _
Key2:=Bereich.Range("C1"), order2:=xlDescending, Header:=xlNo
For Zeile = ZeileL To Zeile1 Step -1
Gruppe = .Cells(Zeile, Spalte1 + 1).Value
If Zeile = Zeile1 Then
.Cells(Zeile, Spalte1 + 1).ClearContents
.Cells(Zeile, Spalte1).Range("A1:C1").Insert Shift:=xlShiftDown
.Cells(Zeile, Spalte1).Value = Gruppe
Else
If .Cells(Zeile, Spalte1 + 1).Value = .Cells(Zeile - 1, Spalte1 + 1).Value Then
.Cells(Zeile, Spalte1 + 1).ClearContents
Else
.Cells(Zeile, Spalte1 + 1).ClearContents
.Cells(Zeile, Spalte1).Range("A1:C1").Insert Shift:=xlShiftDown
.Cells(Zeile, Spalte1).Value = Gruppe
End If
End If
Next
ZeileL = .Cells(.Rows.Count, Spalte1).End(xlUp).Row
.Range(.Cells(Zeile1, Spalte1 + 1), .Cells(ZeileL, Spalte1 + 1)).Delete Shift:=xlToLeft
End With
End Sub


Anzeige
Franz AW: flexible Tabellenprogrammierung
30.08.2007 09:36:46
Eva
Hallo Franz, vielen Dank für Dein Makro, hatte jetzt erst die Möglichkeit, es zu testen. Funktioniert prima, wenn ich es auch nicht komplett verstehe :-) Habe noch eine ergänzende Frage dazu: Wie kann ich mir das Ergebnis in einem anderen Sheet in einen bestimmten Bereich (D20:E40) ausgeben lassen?
Vielen Dank nochmal! Grüße, Eva

Franz AW: flexible Tabellenprogrammierung
30.08.2007 10:19:00
Oberschlumpf
Hi Eva
Wenns passt, muss ich ja nich auch noch ran :-)
Schönen Tag + viele Grüße
Thorsten

Franz AW: flexible Tabellenprogrammierung
30.08.2007 11:02:23
Eva
Hallo Thorsten,
wäre aber lieb, wenn Du oder Franz mir vielleicht noch sagen könntest, wie ich das Ergebnis in ein anderes Sheet bekomme und wie mir hinter den Überschriften (A, B,...) die Summe der darunter aufgeführten Gruppenmitglieder ausgewiesen werden kann. Vielen Dank für eure Hilfe!!! Grüße, Eva

Anzeige
Franz AW: flexible Tabellenprogrammierung
30.08.2007 12:13:00
Oberschlumpf
Hi Eva
Versuch es mal mit dieser Datei:
https://www.herber.de/bbs/user/45535.xls
Ich habe deine Bsp-Daten in Tabelle1 in den Bereich ab D20 verschoben.
Über Extras/Makro/Makros kannst du das Makro "Gruppe" starten.
Das Makro im Einzelnen
...zuerst wird das erste Zeichen in Spalte D als Gruppenüberschrift ausgefiltert (A,B,C und D)
...dann werden alle zugehörigen Zeilen unterhalb der richtigen Gruppe ausgegeben
...zusätzlich werden alle Teilgruppen für sich sortiert - der größte Wert zuerst
Wenn deine Gruppen gar nicht A,B,C usw heißen, dann gib mal ein paar Infos, wie sie richtig heißen.
Mir fällt gerade auf, dass das Makro bei anderen Gruppennamen warsch. nicht laufen wird, oder?
Teste einfach erst mal mit dieser Datei und verrate, ob ich grundsätzlich schon mal auf dem richtigen Weg bin.
Ciao
Thorsten

Anzeige
Franz AW: flexible Tabellenprogrammierung
30.08.2007 23:56:00
Eva
Hallo Thorsten, ebenfalls vielen vielen Dank für das Makro, es läuft ebenfalls. Ich muss mir das Makro auch noch genauer anschauen, bin erst spät zu Hause gewesen und habe erstmal das von Franz angesehen, da kannte ich halt die erste Version schon ein wenig, ich möchte gern beide Versionen verstehen, hoffe, da komme ich noch hin :-) Es gibt noch ein zwei Sachen, die ich nicht so umsetzen kann (die, wie ich eigentlich hoffte, mit dem Grundgerüst allein zu schaffen), habe ich auch gerade an Franz geschrieben. Vielleicht ist einer von euch beiden so nett und kann mir da noch weiterhelfen (habt ihr schon sehr getan). Auf jeden Fall finde ich es prima, dass ihr mir helft, alleine wäre ich ziemlich aufgeschmissen... Liebe Grüße, Eva

Anzeige
AW: flexible Tabellenprogrammierung
30.08.2007 07:32:00
Eva
Hallo Thorsten,
die Beispieldatei findest Du unter https://www.herber.de/bbs/user/45529.xls.
Vielen Dank schon einmal im Voraus.
Viele Grüße
Eva

AW: flexible Tabellenprogrammierung
30.08.2007 07:56:00
Oberschlumpf
Hi Eva
Soll das Ziel auch wie in deiner Bsp-Datei unter den "Rohdaten" liegen, oder soll die geordnete Tabelle in einem extra Sheet erscheinen?
Handelt es sich um ein und dieselbe Datei, oder soll das Ziel in eine neue Datei?
Die Fragen deshalb noch, weil jede Antwort einen anderen Programmieransatz erfordert.
Und mit einem möglichen Ergebnis musst du noch ne Weile warten, weil ich jetzt erst mal zur Arbeit muss. Aber während der Arbeit find ich sicher Zeit.
Ciao erst mal
Thorsten

Anzeige
AW: flexible Tabellenprogrammierung
30.08.2007 09:03:00
Eva
Hallo Thorsten,
die geordnete Tabelle soll in einem neuen Sheet eingefügt werden, und immer in dieselben Felder, d.h. beispielsweise in den Bereich D20:E40, die Daten starten immer in D20, E20. Es handelt sich um ein und dieselbe Datei.
Danke und einen schönen Tag! Grüße, Eva

AW: flexible Tabellenprogrammierung
30.08.2007 12:13:00
fcs
Hallo Eva,
nachdem ich ja schon ein Grundgerüst erstellt hatte hier eine komplette Fassung mit deinen neuen Wünschen.
Im Code muss du noch die Startwerte für Zeilen und Spalten und ggf. die Startzelle für die aufbereiteten Daten anpassen.
Gruß
Franz

Sub btest()
Dim wks As Worksheet, Zeile1 As Long, ZeileL As Long, Zeile As Long
Dim wksZiel As Worksheet, ZielZelle As Range
Dim Spalte1 As Integer, Bereich As Range, SumGruppe As Double
'Basisdaten setzen
Set wks = ActiveSheet
Zeile1 = 20 '1. Zeile der Daten in Quelltabelle
Spalte1 = 4 'Linke Spalte der Daten in Quelltabelle
'Neue Tabelle einfügen
Set wksZiel = Worksheets.Add
wksZiel.Move after:=wks
Set ZielZelle = wksZiel.Range("D20") 'Startzelle für Daten in Zieltabelle
'Bereich mit Daten kopieren
With wks
ZeileL = .Cells(Zeile1, Spalte1).End(xlDown).Row 'hier ggf. festen Wert zuweisen
Set Bereich = .Range(.Cells(Zeile1, Spalte1), .Cells(ZeileL, Spalte1 + 2))
Bereich.Copy Destination:=ZielZelle
End With
With wksZiel
Set Bereich = ZielZelle.Range(Cells(1, 1), Cells(Bereich.Rows.Count, 3))
Spalte1 = ZielZelle.Column
Zeile1 = ZielZelle.Row
'Daten in Zieltabelle nach Gruppen/Prozente sortieren
Bereich.Sort Key1:=Bereich.Range("B1"), order1:=xlAscending, _
Key2:=Bereich.Range("C1"), order2:=xlDescending, Header:=xlNo
'Prozente je Gruppe summieren und Gruppenzeile einfügen
'Bereich wird von unten nach oben abgearbeitet
SumGruppe = 0
For Zeile = Zeile1 + Bereich.Rows.Count - 1 To Zeile1 Step -1
Gruppe = .Cells(Zeile, Spalte1 + 1).Value
If Zeile = Zeile1 Then
.Cells(Zeile, Spalte1 + 1).ClearContents
SumGruppe = SumGruppe + .Cells(Zeile, Spalte1 + 2).Value
.Cells(Zeile, Spalte1).Range("A1:C1").Insert Shift:=xlShiftDown
.Cells(Zeile + 1, Spalte1).Range("A1:C1").Copy
.Cells(Zeile, Spalte1).Range("A1:C1").PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
.Cells(Zeile, Spalte1).Value = Gruppe
.Cells(Zeile, Spalte1 + 2).Value = SumGruppe
.Cells(Zeile, Spalte1).Range("A1:C1").Font.Bold = True
Else
If .Cells(Zeile, Spalte1 + 1).Value = .Cells(Zeile - 1, Spalte1 + 1).Value Then
.Cells(Zeile, Spalte1 + 1).ClearContents
SumGruppe = SumGruppe + .Cells(Zeile, Spalte1 + 2).Value
Else
.Cells(Zeile, Spalte1 + 1).ClearContents
SumGruppe = SumGruppe + .Cells(Zeile, Spalte1 + 2).Value
.Cells(Zeile, Spalte1).Range("A1:C1").Insert Shift:=xlShiftDown
.Cells(Zeile, Spalte1).Value = Gruppe
.Cells(Zeile, Spalte1 + 2).Value = SumGruppe
.Cells(Zeile, Spalte1).Range("A1:C1").Font.Bold = True
SumGruppe = 0
End If
End If
Next
'Zellen in denen die Gruppen standen löschen
ZeileL = ZielZelle.End(xlDown).Row
.Range(.Cells(Zeile1, Spalte1 + 1), .Cells(ZeileL, Spalte1 + 1)).Delete Shift:=xlToLeft
End With
End Sub


Anzeige
AW: flexible Tabellenprogrammierung
30.08.2007 23:44:00
Eva
Hallo Franz,
sorry, dass ich erst jetzt reagiere, es war soviel zu tun auf der Arbeit, und dann gab es noch ein Teamevent...
Auf jeden Fall vielen, vielen Dank für die hilfreichen Makros, ich bin noch dabei, sie nachzuvollziehen :-) funktionieren tut es, aber es gibt noch ein zwei Fragen, die ich nicht lösen konnte, leider sind meine VBA Kenntnisse noch zu bescheiden... was muss ich denn noch ergänzen/ändern, wenn ich kein neues Tabellenblatt erstellen, sondern die Daten in ein bestehendes, Name z.B. "xxx", einfügen will? Weiter ist noch auf einem gesonderten Tabellenblatt eine Auswahl in verschiedenen Sprachen (Spalte A) möglich durch Setzen eines x in Spalte B (siehe Bsp.datei https://www.herber.de/bbs/user/45570.xls) Die Auswahl steuert nur die Überschriften, die dann in der jeweiligen Sprache erscheinen sollen, die Namen der Gruppenmitglieder bleiben unverändert. Ist denke ich durch eine Wenn Abfrage zu lösen, gekoppelt mit suchen ersetzen (ich kann es leider nur mit aufzeichnen für eine feste Sprache, flexibel lässt es sich ja nicht aufzeichnen). Ich würde mich freuen, wenn du mir da auch weiterhelfen könntest. Das Problem ist leider vielschichtiger, als ich zunächst dachte... Liebe Grüße, Eva

Anzeige
AW: flexible Tabellenprogrammierung
31.08.2007 12:54:04
fcs
Hallo Eva,
ich hab die Vorgabe eines Namens für das Ergebnisblatt, die Auswahl der Sprache und das Eintragen der Gruppenbezeichnung entsprechend gewählter Sprache eingebaut. Ich musste leider mit For...Next-Schleifen und If-Abfragen arbeiten, da die eigentlich für so etwas vorgesehene, schnellere Tabellen-Funktion "Lookup" aus unbekantem Grund nicht so wie ich wollte.
Das überarbeitete Makro hat den Namen "DatenAufbereiten". Achte vor dem Starten bitte darauf das die Tabelle 'das' für alle Gruppen und Sprachen komplett ausgefüllt ist.
https://www.herber.de/bbs/user/45586.xls
Gruß
Franz

Anzeige
AW: flexible Tabellenprogrammierung
01.09.2007 09:58:07
Eva
Hallo Franz, genauso sollte es funktionieren, vielen vielen Dank für Deine Mühe, das hätte ich niemals allein geschafft. Jetzt habe ich noch eine Bitte an Dich: da ich die entsprechende Datei leider nicht zu Hause habe kann ich es nur an einer Datei testen, die ich mir hier entsprechend zusammenbaue. Es könnte noch eine Schwierigkeit geben (zumindest für mich) da ich die Ausgangsdaten auch schon durch Ausführen eines Makros erhalte und da dann noch Leerfelder enthalten sind, die es aber als gefüllt erkennt. Kann man so schlecht verstehen, ich weiss. Ich möchte gern am Montag probieren, das Makro mit meiner Datei zu verbinden und mich gern nochmal an Dich wenden, falls noch ein Problem auftritt. Wärst Du so nett und könntest am Montag abend nochmal "reinschauen", das wäre echt toll! Eine kleine Sache würde ich gern noch wissen: kannst Du mir sagen, wie die Befehlszeile lautet, wenn ich eine aufpoppende Abfrage während das Makro läuft, automatisch bestätigen lassen möchte (z.B. datei überspeichern? ja) Vielen herzlichen Dank und ein schönes Wochenende! Liebe Grüße, Eva

Anzeige
AW: flexible Tabellenprogrammierung
01.09.2007 12:50:52
fcs
Hallo Eva,
um Warnmeldung zu unterdrücken kannst du die Warnmeldungen deaktivieren/aktivieren. Die beiden Befehle sollten immer als Pärchen eingesetzt werden.
Falls du alle Warnmeldungen während des Makroablaufs unterdrücken willst, dann plazierst die beiden Befehle jeweils am Anfang und Ende des Codes.
Meist ist es aber sinnvoller unmittelbar vor bzw. nach der Anweisung, die ggf. die Warnmeldung auslöst diese beiden Zeilen einzufügen.
Beispiel:

Sub SpeichernUnter()
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs FileName:="C:\Test\Mappe1.xls"
Application.DisplayAlerts = True
End Sub


Das Problem mit den scheinbar leeren Zellen liegt wohl darin, dass vermutlich ein Leerstring oder auch Leerzeichen in die Zellen eingetragen wird.
Passe folgenden Abschnitt des Makros an, dann sollte dies Problem auch bereinigt werden.


'Daten in Zieltabelle aufbereiten
With wksZiel
Set Bereich = .Range(ZielZelle, ZielZelle.Offset(Bereich.Rows.Count - 1, 2))
Spalte1 = ZielZelle.Column
Zeile1 = ZielZelle.Row
'Inhalte von Zellen entfernen, die scheinbar leer sind oder nur Leerzeichen enthalten
For iZeile = 1 To Bereich.Rows.Count
For ispalte = 1 To Bereich.Columns.Count
If Trim(Bereich(iZeile, ispalte).Value) = "" Then
Bereich(iZeile, ispalte).ClearContents
End If
Next
Next
'Daten in Zieltabelle nach Gruppen/Prozente sortieren
Bereich.Sort Key1:=Bereich.Range("B1"), order1:=xlAscending, _
Key2:=Bereich.Range("C1"), order2:=xlDescending, Header:=xlNo
'Prozente je strGruppe summieren und Gruppenzeile einfügen
'Bereich wird von unten nach oben abgearbeitet
SumGruppe = 0
For Zeile = ZielZelle.End(xlDown).Row To Zeile1 Step -1
strGruppe = .Cells(Zeile, Spalte1 + 1).Value
'Spracheintrag zur Gruppe ermitteln


Gruß
Franz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige