4.7k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,

ich habe mehrere Tabellenblätter - je Mitarbeiter, alle mit der gleichen Struktur, was die Zeilen betrifft (nämlich 1 Tag/Zeile), jedoch ist eine unterschiedliche Anzahl von Spalten möglich. Die Spalten stellen Projekte dar, die mittels Listbox ausgewählt werden. Die Stunden je Tag/je Projekt werden entsprechend in der Matrix eingegeben. Bei dem einen Mitarbeiter kann das Projekt A jedoch in der Spalte D ausgewählt worden sein, bei einem anderen Mitarbeiter in der Spalte G usw.

Auf einer Übersichtsseite möchte ich jetzt eine Matrix, in der zeilenweise Monate stehen und in den Spalten wiederum ein Projekt ausgewählt werden kann. Jetzt muss die Summe über alle bestehenden Tabellenblätter gebildet werden können, wieviel Aufwand für Projekt A je Tag geplant ist.

Das an sich ist für mich schon eine Herausforderung - diese wird aber dadurch getoppt, dass Tabellenblätter für neue Mitarbeiter hinzukommen können und diese "automatisch" auf der Übersichtsseite berücksichtigt werden sollen.

Es wäre super, wenn hierfür jemand eine Lösung (oder zumindest Denkanstöße) hätte.

Vielen Dank schon mal, Gruß
Jojo

20 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Jojo,

Die Reihenfolge der Projekte möchte ich nicht bei jedem Mitarbeiter gleich haben


das bedarf dann einer gründlichen Überarbeitung, die mir allerdings vor Weinachten nicht mehr möglich ist.
Ausserdem werden dann komplexere Formeln nötig, die die Rechengeschwindigkeit negativ beeinflussen können.

Zwei Fragen sind dabei noch von Bedeutung:" Wieviele Mitarbeiter und Projekte können maximal ins Spiel kommen"?

Vielleicht kannst du mir aber noch beantworten, was "MTRANS" bedeutet


... MTRANS() dreht eine Matrix um 90°.
Ich habe es im Beispiel verwendet um die Werte in der grün gekennzeichneten Matrix zu drehen. Anders würde die Formel nicht funktionieren.
Anbei noch mal die selbe Datei ohne MTRANS() mit horizontal angeordneten Mitarbeitern.

Testmappe2


Feedback wäre nett
Gruss Rainer
_____________________
Windows 7 Ultimate (x64)
Office 2007 Ultimate
Office 2003 Professional
0 Punkte
Beantwortet von
Hallo Rainer,

danke für die Erklärung bzgl. MTRANS. Das ist jetzt klar und ich kann es so verwenden. Die eigentliche Frage für mich ist, warum meine abgeänderte Formel nicht funktioniert ...

Anstelle von ("re_Testmappe", Tab.blatt "Übersicht", C4)
={SUMME((MONAT(N(INDIREKT("'"&MTRANS(Mitarbeiter)&"'!B"&ZEILE($4:$368))))=MONAT($B4))*(N(INDIREKT("'"&MTRANS(Mitarbeiter)&"'!"&ZEICHEN(64+SPALTE())&ZEILE($4:$368)))))}

habe ich jetzt folgendes erstellt:
={SUMME((MONAT(N(INDIREKT("'"&MTRANS(Mitarbeiter)&"'!B"&ZEILE($4:$368))))=MONAT($B4))*(INDIREKT("'"&MTRANS(Mitarbeiter)&"'!C3:V3")=C$3)*(N(INDIREKT("'"&MTRANS(Mitarbeiter)&"'!C4:V368"))))}

Als Ergebnis erscheint jedoch "#Wert" ... Kann man denn in einer Matrixformel nicht 2 Abfragen (eine spaltenbezogene [hier: Projekt] und eine zeilenbezogene [hier: Monat]) einbauen?

Ich könnte es natürlich zerstückeln und pro Monat eine Auswertung nach Projekten erstellen, die dann wieder zusammengeführt wird - aber das wäre nur eine Notlösung für mich.

Vielen Dank für deine Hilfe, Gruß
Jojo
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Jojo,

Deine Formel hatte ich in mehreren ähnlichen Varianten auch schon probiert, geht aber nicht über mehrere Sheets.

Habe heute noch mal anderweitige misslungene Versuche gestartet und komme zum Schluss, dass es wahrscheillich nicht ohne Zwischenauswertungen in den einzelnen Sheets geht.

Das Problem ist eben, dass Du in jedem Sheet die Projekte in verschiedenen Spalten haben willst.

Sollte doch jemand eine komplexe Formel liefern, die Deinen Wünschen entspricht, so bin ich fast überzeugt, dass dabei der Rechner in die Knie geht, zumal Du von ca. 100 Projekten sprichst und höchstwahrscheinlich auch mehr als 3 Mitarbeter auswerten willst.

Deshalb mein Vorschlag:
Such Dir jemanden, der Dir behilflich ist, das ganze über VBA auszuwerten, das ist vielleicht die beste Lösung, wenn auch nicht ganz einfach.

Ich werde nach meinen gewonnenen Erkenntnissen in dieser Sache, keine weiteren Versuche unternehmen.


Feedback wäre nett
Gruss Rainer
_____________________
Windows 7 Ultimate (x64)
Office 2007 Ultimate
Office 2003 Professional
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi rainberg :-)

ich mach das die tage,ist doch einfach

3 arrays,der index parallel zu spalten wie zeilen,laufzeit max 2 sek denk ich

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi rainberg :-)

aber schade um deine arbeit

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi rainberg :-)

das waere auch eine gute aufgabe fuer vb anfaenger,falls sich noch einer probieren moechte :-))

die sortierung der
monate
spalten
projekte
namen
parallel ueber den index von 3 arrays gestalten

gruss nighty

p.s.
hier waere malschauen ein interessanter konkurent und es waere bestimmt interessant wessen variante schneller ist und was fuer verschiedene ansaetze entstehen :-)))
ich setz mich dann wochenende daran :-)
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all :-)

ist noch in arbeit,die weihnachtsfeiern verzögern einiges ^

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all :-)

irgendwie sind manche ideen doch sehr umfangreich ^^

durch die dropdownmenues ist die laufzeit nicht sooo berauschend

gruss nighty

Option Explicit

Sub ZusammenfassungWksAll()
Call EventsOff
Worksheets("Übersicht").Activate
Dim UesSpIndex As Long
Dim PrIndex As Long
Dim NlisteEnde As Long
Dim NlisteAnz As Long
Dim DatSpIndex As Long
Dim DatZeIndex As Long
Dim DatQ As Long
Dim DatZ As Long
Dim Wks As Long
Dim LesenDat As Long
UesSpIndex = Worksheets("Übersicht").UsedRange.SpecialCells(xlCellTypeLastCell).Column
NlisteEnde = Worksheets("Übersicht").Cells(Rows.Count, 2).End(xlUp).Row
NlisteAnz = Worksheets("Übersicht").Cells(Rows.Count, 2).End(xlUp).Row - 19
For PrIndex = UesSpIndex To 3 Step -1
If UCase(Mid(Cells(3, PrIndex), 1, 7)) = "PROJEKT" And IsoZahl(Cells(3, PrIndex)) > 0 Then
UesSpIndex = PrIndex
Exit For
End If
Next PrIndex
ReDim Ues(1 To 12, 1 To UesSpIndex - 2) As Variant
ReDim NamenListe(1 To NlisteAnz, 1 To UesSpIndex - 2) As Variant
Range(Cells(4, 3), Cells(15, UesSpIndex)) = ""
Range(Cells(NlisteEnde - NlisteAnz, 3), Cells(NlisteEnde, UesSpIndex)) = ""
Ues() = Range(Cells(3, 3), Cells(15, UesSpIndex))
NamenListe() = Range(Cells(NlisteEnde - NlisteAnz, 2), Cells(NlisteEnde, UesSpIndex))
For Wks = 1 To UBound(NamenListe())
Worksheets(NamenListe(Wks, 1)).Activate
DatSpIndex = Worksheets(NamenListe(Wks, 1)).UsedRange.SpecialCells(xlCellTypeLastCell).Column
DatZeIndex = Worksheets(NamenListe(Wks, 1)).Cells(Rows.Count, 1).End(xlUp).Row
For PrIndex = DatSpIndex - 2 To 3 Step -1
If UCase(Mid(Ues(1, PrIndex), 1, 7)) = "PROJEKT" And IsoZahl(Ues(1, PrIndex)) > 0 Then
DatSpIndex = PrIndex
Exit For
End If
Next PrIndex
ReDim Datens(0 To DatZeIndex, 1 To DatSpIndex) As Variant
Datens() = Range(Cells(3, 1), Cells(DatZeIndex, DatSpIndex))
For DatQ = 1 To DatSpIndex
For DatZ = 3 To UesSpIndex - 2
If IsoZahl(Datens(1, DatZ)) = IsoZahl(Ues(1, DatQ)) Then
For LesenDat = 2 To DatZeIndex - 3
Ues(Month(Datens(LesenDat, 1)) + 1, DatQ) = Ues(Month(Datens(LesenDat, 1)) + 1, DatQ) + Datens(LesenDat, DatZ)
NamenListe(Wks, DatQ + 1) = NamenListe(Wks, DatQ + 1) + Datens(LesenDat, DatZ)
Next LesenDat
End If
Next DatZ
Next DatQ
Next Wks
Worksheets("Übersicht").Activate
Range(Cells(3, 3), Cells(15, UesSpIndex)) = Ues()
Range(Cells(NlisteEnde - NlisteAnz, 2), Cells(NlisteEnde, UesSpIndex)) = NamenListe()
Call EventsOn
End Sub
Public Function IsoZahl(Zellen As Variant) As Integer
Dim Zelle As Range
Dim AnzZeichen As Integer
Dim schalter As Boolean
Dim AnzZindex As Integer
Dim StringFund As Integer
AnzZindex = 1
For AnzZeichen = 1 To Len([Zellen])
If Mid([Zellen], AnzZeichen, 1) Like "[0-9]" = True Then
StringFund = StringFund & Mid([Zellen], AnzZeichen, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], AnzZeichen, 1) Like "[0-9]" = False Then
AnzZindex = AnzZindex + 1
schalter = False
End If
Next AnzZeichen
IsoZahl = StringFund
End Function
Public Sub EventsOff()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
End Sub
Public Sub EventsOn()
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
0 Punkte
Beantwortet von
Hallo nighty,

VIELEN DANK! Das ist echt der Hammer! Ich werde Stunden brauchen, um den Code zu verstehen ...

Die Laufzeit finde ich übrigens sehr akzeptabel!

Schöne Weihnachten und einen guten Rutsch, viele Grüße
Jojo
...