Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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)
Antworten 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.

Antworten 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
Antworten 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)
Antworten 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.

Antworten 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
Antworten 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)
Antworten 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
Antworten 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)
Antworten 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
Antworten Top


Gehe zu:


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