Formel per VBA in Sheet schreiben
#1
Liebe Community!

Ich habe zwei Probleme und hoffe ihr könnt mir helfen!
In Excel 2010 (32 Bit) habe ich beiliegende Tabelle erstellt, welche mir den beruflichen Alltag künftig hoffentlich sehr erleichtert (Ausmassaufnahme für Gipserarbeiten).

Das erste Problem:
Die Tabelle enthält 3 Reiter; Im Sheet "Home" kann der Anwender relevante Positionen erfassen, mit einem Doppelklick ein "x" setzen und noch die Einheit (m2, Stk. etc.) sowie einen Höhen- und seitlichen Zu-/Abschlag eingeben. Der zweite Reiter "Erfassung" dient zum Erfassen der Ausmasse (Längen, Breiten, etc.) und zuordnen, was mit diesem Ausmass passieren soll (Haftbrücke, Grundputz, Deckputz, etc.). Das letzte Sheet "Auswertung" soll die m2, Stk. etc. berechnen.. Aus einem mir nicht ersichtlichen Grund scheint die Berechnung bei "Erfassung" und "Auswertung" zum Ein- und Ausblenden der Spalten- und Zeilen unheimlich lange zu dauern! Ich wäre froh, wenn ihr den Aufbau mal kurz anschauen könntet... (Zerreißt mich nicht gleich in Stücke bei offensichtlichen "No Go´s" wie meinen ausgeblendeten Hilfszeilen und -spalten! Smile

Das zweite Problem:
Im Reiter "Auswertung" möchte ich eine recht komplexe Formel per VBA in einen bestimmten Bereich schreiben (K8 bis DF1000). Theoretisch könnte ich die gewünschten 100 Spalten und 1000 Zeilen auch mit dieser Formel füllen, aber ich glaube dann bricht mir Excel endgültig zusammen... Sad

Die gewünschte Formel sieht so aus:
=WENN(K$6="m2";(F8+K$1)*$G8*$H8;WENN(K$6="ml";(($F8+K$1+$G8+K$2)*$H8;WENN(K$6="Stk.";$H8))))

Leider sind meine VBA-Kenntnisse noch sehr bescheiden...

Ich wäre sehr froh und dankbar, wenn ihr mir helfen könntet!

Liebe Grüsse

Christian



.xlsm   Ausmass_Versuch1.xlsm (Größe: 538,61 KB / Downloads: 8)
Top
#2
Hallo Christian

Ich würde das Ganze etwas komprimieren.
 ABCDEFGHIJKLM
1ProduktNPK-NummerSeitliche Differenz (m)Höhendifferenz (m)LEGeschossRaumDetailLängeHöheAnzahlGesamtmengeSpalte1
2Haftbrücke111101-0,3-0,5m2EGKücheNordwand121,8364,863,18
3Haftbrücke111101-0,3-0,5m21. OGKücheEcke1,52,413,62,88
4Haftbrücke111101-0,3-0,5m2KGKücheWestwand1,82,414,323,6
5Haftbrücke111101-0,3-0,5m2AttikaKücheOstwand2,41,814,323,78
6Haftbrücke111101-0,3-0,5m2 KücheFenster-1,21,81-2,16-2,7
7Haftbrücke111101-0,3-0,5m2 KücheLeibung 1,820-1,08
8Haftbrücke111101-0,3-0,5m2  Leibung1,2 100
9Haftbrücke gekämmt11120100,3m2      00
10Grundputz Wände11130100m2      00
11Grundputz Wände Spezial11140100,2m2      00
12Grundputz Decke11130200m2      00
13Grundputz Decke Spezial11150100m2      00
14Weissputz Decke11155000m2      00
15Ergebnis          74,8869,66

ZelleFormel
B2=SVERWEIS(A2;tbl_Produkte;2;FALSCH)
L2=[@Länge]*[@Höhe]*[@Anzahl]
M2=WAHL(VERGLEICH(E2;{"m2";"ml";"Stk."};0);([@Länge]+[@[Seitliche Differenz (m)]])*[@Höhe]*[@Anzahl];([@Länge]+[@[Seitliche Differenz (m)]]+[@Höhe]+[@[Höhendifferenz (m)]])*[@Anzahl];[@Anzahl])
L15=TEILERGEBNIS(109;[Gesamtmenge])
M15=TEILERGEBNIS(109;[Spalte1])

ZelleGültigkeitstypOperatorWert1Wert2
A2Liste =Liste_Produkte 
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg

In der Tabelle tbl_Produkte stehen dann nur noch die Produkte und die NBK-Nummer.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#3
Hallo shift-del!

Danke für deine Rückmeldung!

Leider löst dein Vorschlag mein Problem nicht, außer ich verstehe deine Tabelle nicht... Wesentlicher Teil meiner (vielleicht komplizierten) Tabelle ist, daß ich ein Ausmass (z.B. 12 x 3 m) per "x"-Aktivierung für mehrere Arbeitsgänge (Haftbrücke, Grundputz, Deckputz, etc.) verwenden kann und Excel mir diese auch jeweils berücksichtigt. Betreffend Optimierung muss ich noch sagen, daß ich diese 3 Sheets der Übersicht halber bewusst gewählt habe, da ich die Tabelle auf einem Tablet (Surface o.ä.) laufen lassen möchte... Hast du eine andere Idee oder erfüllt deine Tabelle das?

Ich wäre sehr froh um weitere Inputs betreffend Formel via VBA in Zellenbereich schreiben...!

Christian
Top
#4
Hi Christian!
Man sollte niemals Formeln "auf Vorrat" vorhalten.
Bläht die Datei nur unnötig auf.
Ab Excel 2007 macht man so etwas mit ListObjects (Einfügen, Tabelle).
Dann schreiben sich die Formeln automatisch fort, wenn ein neuer Datensatz angehängt wird.

Zu Deiner Frage:
Mittels VBA schreibt man eine Formel gleich in den gesamten Bereich; dies ist erheblich schneller.
Sind " vorhanden, müssen sie gedoppelt werden.
Ungetestet:
Code:
Range("K8:DF1000").Formula = _
  "=IF(K$6=""m2"";(F8+K$1)*$G8*$H8;IF(K$6=""ml"";(($F8+K$1+$G8+K$2)*$H8;IF(K$6=""Stk."";$H8))))"

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#5
Hallo Christian

Bei deiner Kreuztabellen-Lösung hast du natürlich einen Haufen Zellen/Formeln, die nie verwendet werden.
Mit einer Datensatzliste hat man wirklich nur das Nötigste. Ein "Kompression" von 87%.
Und keinen Ärger mit Einblenden/Ausblenden von Spalten/Zeilen.

Ich habe hier eine Excel Tabelle verwendet. In Spalte A ist eine Gültigkeitsprüfung mit der man die Arbeitsgänge auswählen kann.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#6
Hallo Ralf!

Danke für dein Posting! Leider kommt die Fehlermeldung "Anwendungs- oder Objektdefinierter Fehler"...

Hoffe ich habs richtig gemacht?! (wie erwähnt... VBA-Rookie)
Code in ein Modul kopiert und vom Arbeitsblatt ausführen lassen?

Code:
Private Sub berechnen()
Range("K8:DF1000").Formula = _
 "=IF(K$6=""m2"";(F8+K$1)*$G8*$H8;IF(K$6=""ml"";(($F8+K$1+$G8+K$2)*$H8;IF(K$6=""Stk."";$H8))))"
End Sub


Wenn dein Code klappt wäre das der Hammer!!!

Christian
Top
#7
Ja!
Du hast es richtig gemacht, ich aber nicht!
Wenn ich .Formula benutze, dann muss man auch das englische Trennzeichen (also , statt ;) benutzen!
Code:
Range("K8:DF1000").Formula = _
 "=IF(K$6=""m2"",(F8+K$1)*$G8*$H8,IF(K$6=""ml"",(($F8+K$1+$G8+K$2)*$H8,IF(K$6=""Stk."",$H8))))"

ABER (Ausrufezeichen!):
Mein erster Absatz war viel wichtiger.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#8
Hi Ralf!

Vielleicht stell ich mich wirklich zu doof an... geht nicht! Zumindest nicht bei mir...

Und was meinst du mit deinem ersten Absatz was wichtiger war? (ListObjects?)

Hast du eine Idee was ich falsch mache? Danke für deine Geduld!

@shift-del: Werde mir deine Tabelle nochmals anschauen! Ich weiß, daß ich viele ungenutzte Zellen verwende... (Aber erst muss ich noch schnell meine 1jährige Tochter baden... :19: )

Christian
Top
#9
Ergänzend:
Zitat:Hoffe ich habs richtig gemacht?! (wie erwähnt... VBA-Rookie)
Code in ein Modul kopiert und vom Arbeitsblatt ausführen lassen?
Kopiere es in ein allgemeines Modul (ohne Private vorweg) und starte das Makro mittels Alt+F8 Makro wählen, ausführen.
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#10
Ralf, shift-del, RPP63!

DANKE, es geht! Irgendwo ist noch der Wurm drin in der Formel, aber das krieg ich hin...
Dieses "Private vor dem Sub..." war der Fehler...

Ralf: Wie würde der Code mit ListObjects aussehen? Denn so - und da hast du völlig recht, schreibt mir dieser Code 100.000 Formeln in Zellen die ich zu 97% nie brauche...
Oder Könnte man in diesen Code die letzte "Spalte und Zeile mit Inhalt" ermitteln und diese "Range" in die Formel übernehmen?

Wenn nichts mehr kommt, nochmals danke an dieser Stelle! - Ich weiß euren Einsatz unheimlich zu schätzen!

Gruß Christian
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste