Clever-Excel-Forum

Normale Version: Verschachtelte Wenn-Formel als Array
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe Freunde

Ich wäre euch sehr dankbar, wenn ihr mir weiterhelfen könntet.

In meiner Mappe erfasse ich für die Arbeit (Gipser-/Malergeschäft) verschiedene Masse, welche ich dann diversen Positionen (welche sich in den Spalten befinden) zuteilen muss.
Hierfür habe ich 2 sheets, einmal die Erfassung, einfmal die Auswertung.

Je nachdem ob ich in der jeweiligen Zeile/Spalte ein "x" gemacht habe, soll er mir den Wert auf Basis der Einheit in die gleiche x-Zelladresse des Sheets "Erfassung" schreiben.
Diese "Einheit" kann m2, St, gl, H_A oder andere sein, weshalb die Formel recht lange ist. --> Es ist schwer zu erklären, deshalb die Mappe im Anhang.

Mein Wunsch ist nun folgender:
Die Formeln, welche ich im 2. Sheet in den gesamten Zeilen/Spalten-Bereich einfüge, tun ihren Dienst... Aber bei angenommen 100 Zeilen und 50 Spalten habe ich 5000 x eine komplizierte, elendlange Formel drinnen was sich auf die Performance niederschlägt und auch in der Dateigrösse...

Kann mir jemand helfen, die Berechnung als VBA-Array zu lösen und lediglich das Ergebnis/Wert in die jeweilige Zelle zu schreiben?

Leider sind Arrays nach wie vor eine nebelbedeckte Landkarte für mich...

Vielen lieben Dank im voraus!

Christian
Hi,

warum so kompliziert?

Mein Vorschlag:

[attachment=33695]
Hallo Edgar

Danke für dein Bemühen und das du dich meiner annimmst... Smile

Ja, dein Vorschlag ist etwas besser als mein ursprünglicher, da du die Formel auf die Leistungseinheit anpasst. Meine ist ja ne lange "Universalformel".
Mittels VBA und der Leistungseinheit als Select-Case-Bedingung könnte ich das schon so machen...

Trotzdem - und stört mich an unseren beiden Varianten - sind es immer noch (mitunter) tausende, unnötige Formeln, welche die Mappe mit sich rumschleppen muss... Sad

Ganz ehrlich - Formeln sind cool! Aber so ein VBA-Array bei vielen Daten.... das ist der Olymp der Programmierung und einfach nur GEIL !!! Smile) Muss jetzt endlich Arrays verstehen lernen...

Trotzdem Danke, Edgar!

Gruss Christian
Hi,

VBA ist gegenüber der Variante mit einfachen Formeln nicht unbedingt schneller. Zudem brauchst Du die Formeln nicht extra anstoßen, wie Du das bei VBA machen musst. ARRAY-Formeln sind auch in VBA nicht unbedingt der Performance zuträglich.
Hi Christian,

mal so zur Anregung:
schreib doch mal als Vorbereitung in das Blatt "Auswertung" ein paar Formeln rein. Das sind die Formeln für die einzelnen Positionen. Aber ohne Anführungszeichen, bitte.

K4: "=H4"
L4: "=F4*H4"
M4: "=F4*G4*H4"
N4: "=H4"
O4: "=H4"
P4: "=F4*H4"
Q4: "=F4*H4"
R4: "=G4*H4"

Hoffe, die Formeln stimmen. Sie stehen nur einmal da und nicht 5000 mal. Ev. noch mit dem Standardfaktor M1 (oder so ähnlich) und Einheitspreisen, falls gewünscht, multipliuzieren.

Dann folgendes Makro laufen lassen:
Code:
Sub Pinsel()
   Dim Zeile As Long, Spalte As Long
   Dim Daten As Variant
   Dim e As Worksheet, a As Worksheet
   Set e = Worksheets("Erfassung")
   Set a = Worksheets("Auswertung")
   Daten = e.Range("K10").Resize(e.Range("C10").End(xlDown).Row - 9, 8)
   For Zeile = LBound(Daten, 1) To UBound(Daten, 1)
      a.Range("F4:H4") = e.Range("F" & Zeile & ":H" & Zeile).Offset(9).Value
      For Spalte = LBound(Daten, 2) To UBound(Daten, 2)
         If Daten(Zeile, Spalte) = "x" Then Daten(Zeile, Spalte) = a.Range("J4").Offset(, Spalte)
      Next Spalte
   Next Zeile
   a.Range("K9").Resize(UBound(Daten, 1), UBound(Daten, 2)) = Daten
End Sub

Das Makro setzt nun die Ergebisse als Zahlen überall hin, wo Du ein x gemacht hast.
Hab mir mal was aus einer Art LV-Abrechnung gebastelt und hier angepasst. Das Makro funktioniert für beliebig lange Listen für diese 8 LV-Positionen. Hoffe, das entspricht Deinen Vorstellungen.

Gruß, Raoul
Hallo Christian,

Du wolltest eine VBA-Lösung. Ich habe sie geliefert und denke, genau nach Deinen Wünschen.

Funktioniert sie nicht oder nicht so, wie du es wolltest? Habe ich was übersehen? Du kannst gerne was dazu sagen. Deine Bemühungen auf der Suche nach einer Lösung sollen ja nicht umsonst gewesen sein.

Raoul