Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Definition eigener Funktionen (ohne Makros!)

Forumthread: Definition eigener Funktionen (ohne Makros!)

Definition eigener Funktionen (ohne Makros!)
Hauke
Moin moin!
Ich muss eine größere Tabelle pflegen, die etwa so aufgebaut ist:

Datum     Abteilung   A             B            C            D                   E           F
Jan 09    Abt. 1      100 €                      500 €                            1
Jan 09    Abt. 2      200 €                      400 €                            2
Jan 09    Abt. 3      300 €                      300 €                            3
Jan 09    Abt. 4      400 €                      200 €                            4
Feb 09    Abt. 1      100 €                      500 €                            1
Feb 09    Abt. 2      200 €                      400 €                            2
Feb 09    Abt. 3      300 €                      300 €                            3
Feb 09    Abt. 4      400 €                      200 €                            4

A und C enthalten bestimmte von Hand eingegebene Werte. B soll nun ab Dezember 09 die Summe der Werte aus A der letzten 12 Monate für eine Abteilung ausweisen. Vorher soll da halt noch nichts drin stehen. Das gleiche gilt auch für D (mit den Werten aus C). ==> Dafür verwende ich das selbstgeschriebene Makro "SUMME12MONATE".
E könnte man "Jahresendziel" nennen. In F wird dann zwischen dem Wert für eine Abteilung aus dem letzten Dezember und dem Jahresendziel für einen Monat linear berechnet. ==> Dafür verwende ich das selbstgeschriebene Makro "ZIELKALKULATION".
Die Makros sehen so aus:

Option Explicit
'Die Anzahl an Zeilen, die die Spaltenüberschriften benötigen
Public Const HeaderRowCount As Long = 1
' Die Anzahl an Zeilen, die ein Monatsblock hat ==> Anzahl der Abteilungen
Public Const BlockRowCount As Long = 4
Public Function SUMME12MONATE(Zelle As Range) As Variant
SUMME12MONATE = ""
' Teste, ob die Zelle bereits ein Jahr vorherige Daten hat...
If Zelle.Row > BlockRowCount * 12 + HeaderRowCount Then
' Wenn das der Fall ist, summiere die Daten der letzten 12 Monate auf.
SUMME12MONATE = CCur(0)
Dim I As Long
For I = 0 To 11
SUMME12MONATE = SUMME12MONATE + CCur(Cells(Zelle.Row - I * BlockRowCount, Zelle. _
Column))
Next
End If
End Function
Public Function ZIELKALKULATION(Datumszelle As Range, Jahresendzielzelle As Range) As Variant
'Entspricht ungefähr =INDIREKT("Z"&zeileletzterdezember&"S"&SPALTE(AI49);FALSCH)+(INDIREKT("Z"&( _
_
'#BEZUG!+20*12)&"S"&SPALTE(AI49);FALSCH)-INDIREKT("Z"BEZUG!&"S"&SPALTE(AI49);FALSCH))*
'(MONAT($A49)/12)
'...wobei zeileletzterdezember für die Zeilennummer steht, in der die Daten aus dem letzten  _
Dezember für eine Abteilung stehen.
ZIELKALKULATION = ""
' Teste, ob die Zelle bereits ein Jahr vorherige Daten hat...
If Jahresendzielzelle.Row > BlockRowCount * 12 + HeaderRowCount Then
' Ermittle Position der Zelle vom letzten Dezember
Dim lastYearRow As Long
lastYearRow = Jahresendzielzelle.Row - BlockRowCount * Month(Datumszelle)
Dim lastYearTarget As Double
lastYearTarget = Cells(lastYearRow, Jahresendzielzelle.Column)
Dim nextYearTarget As Double
nextYearTarget = Jahresendzielzelle
ZIELKALKULATION = lastYearTarget + (nextYearTarget - lastYearTarget) * Month( _
Datumszelle) / 12
End If
End Function

Das funktioniert beides auch wunderbar, da jedoch meine Tabelle halt sehr viele Einträge enthält, dauert die Neuberechnung aller Zellen (die z.B. beim Einsatz von Autofiltern über Abteilungen von Excel schon recht häufig angestoßen wird) sehr lange.
Um die Lesbarkeit der Tabelle zu erhöhen und - was auch sehr wichtig ist - die Möglichkeit, problemlos Monatsblöcke per Kopieren/Einfügen am unteren Rand anzufügen, hatte ich die Idee, meine Makros mit Excel-Funktionen (ohne VBA) nachzubilden, diese jedoch irgendwie woanders zu definieren. Also so, dass in den Zellen tatsächlich weiter =ZIELKALKULATION(A49;AK49) statt sowas wie =INDIREKT("Z"&zeileletzterdezember&"S"&SPALTE(AI49);FALSCH)+(INDIREKT("Z"&(#BEZUG!+20*12)&"S"&SPALTE(AI49);FALSCH)-INDIREKT("Z"BEZUG!&"S"&SPALTE(AI49);FALSCH))*(MONAT($A49)/12) drin steht.
Hat jemand Tipps, wie ich so etwas umsetzen kann oder alternativ die Performance meiner VBA-Makros verbessern kann?
Vielen Dank für Antworten bereits im Voraus und viele Grüße aus dem hohen Norden! :-)
Hauke
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Definition eigener Funktionen (ohne Makros!)
16.07.2009 16:27:20
Wolli
Hallo Hauke,
wenn Du theoretisch die Funktionen auch ohne Programmierung darstellen kannst, müsstest Du eigentlich eine Function schreiben können, die nur Application.WorksheetFunction.... usw. enthält. Vielleicht ist das dann performanter. Weiß ich aber nicht.
Deine Functions sehen soweit doch nicht schlecht aus!? Du könntest die Rückgabe nicht "As Variant" sondern "As Double" oder "As Currency" machen. Vielleicht bringt das eine Millisekunde.
Wenn ich eine ähnliche Aufgabe zu lösen hätte, würde ich mir eine Prozedur schreiben, die auf Knopfdruck die Daten aktualisiert und fest in die Zellen schreibt. Dann ist die Tabelle an sich schnell und es sind keine Horrorformeln zu sehen. Man kann ja die "berechneten" Werte farbig hinterlegen oder sonst wie kennzeichnen, damit der geneigte Betrachter weiß, womit er es zu tun hat.
Ich lasse die Frage mal offen für andere Tipps. Gruß, Wolli
Anzeige
AW: Definition eigener Funktionen (ohne Makros!)
19.07.2009 10:08:30
BoskoBiati
Hallo Hauke,
ich würde hier auf Funktionen verzichten und ein Makro einbauen, was bei Bedarf angestoßen wird. Hier ein Beispiel (2Zeilen Kopf, Spalte A: Monat und Jahr, Spalte B Abteilung als Abt. 1 etc, Spalten C und E Monatswerte, Spalten D und F Summen für 12 Monate). Die Auswertung mit dem Zielwert ist mir noch nicht klar, deswegen fehlt sie.
Option Explicit
Sub SummeMonat()
Dim Sum1Abt(19) As Variant 'Summe für Anzahl Abteilungen: hier 20
Dim Sum2Abt(19) As Variant 'Summe für Anzahl Abteilungen: hier 20
Dim lngCounter As Long  'Zählvariable
Dim lngcounter2 As Long
Dim Startzeile As Long
Dim loLetzte1 As Long
Dim loLetzte2 As Long
Dim AnzAbt As Long
AnzAbt = 5
loLetzte1 = Cells(Rows.Count, 1).End(xlUp).Row  'bestimme letzte gefüllte Zeile in Spalte A
loLetzte2 = Cells(Rows.Count, 4).End(xlUp).Row  'bestimme letzte gefüllte Zeile in Spalte Summe
If loLetzte2 = loLetzte1 Then
MsgBox "Die Auswertung für diesen Monat ist bereits abgeschlossen", 16, "Achtung"
Exit Sub
End If
If (loLetzte2 - loLetzte1) Mod AnzAbt  0 Then
MsgBox "Es sind nicht alle Abteilungen übergetragen worden", 16, "Achtung"
Exit Sub
End If
For lngCounter = 3 To loLetzte1
If Month(Cells(lngCounter, 1)) = Month(Cells(loLetzte1, 1)) + 1 And Year(Cells(lngCounter,   _
_
1)) = Year(Cells(loLetzte1, 1)) - 1 Then
If (Cells(lngCounter, 2)) = "Abt. 1" Then
Startzeile = lngCounter
Exit For
End If
End If
Next
For lngCounter = Startzeile To loLetzte1 - AnzAbt 'je nach Zahl der Abteilungen
For lngcounter2 = 0 To AnzAbt - 1
Sum1Abt(lngcounter2) = Sum1Abt(lngcounter2) + Cells(lngCounter + lngcounter2, 3)
Sum2Abt(lngcounter2) = Sum1Abt(lngcounter2) + Cells(lngCounter + lngcounter2, 5)
Next
Next
For lngCounter = 0 To AnzAbt - 1
Cells(loLetzte1 - AnzAbt + lngCounter + 1, 4) = Sum1Abt(lngCounter)
Cells(loLetzte1 - AnzAbt + lngCounter + 1, 6) = Sum2Abt(lngCounter)
Next
End Sub
Zum Starten könnte man in "DieseArbeitsmappe" noch eine Tastenkombination zum Starten definieren:
Private Sub Workbook_open()
Application.OnKey "^%(97)", "DeineAuswertung"
end Sub
startet das Makro bei der Kombination Strg+Alt+1 (auf dem Zehnerblock)
Beim Beenden ausschalten:
Private Sub workbook_beforeclose()
Application.OnKey "^%(97)"
end sub
Gruß
Bosko
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Eigene Funktionen in Excel definieren (ohne Makros)


Schritt-für-Schritt-Anleitung

Um eigene Funktionen in Excel zu erstellen, ohne VBA zu verwenden, kannst Du die integrierten Excel-Funktionen nutzen und sie in einer benutzerdefinierten Weise kombinieren. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Datenstruktur vorbereiten: Erstelle eine Tabelle mit den benötigten Daten, z.B. Abteilungen, Monatswerte und Zielwerte.
  2. Funktionsnamen festlegen: Überlege Dir, welche Funktionen Du benötigst, z.B. SUMME12MONATE und ZIELKALKULATION.
  3. Funktionen definieren: Nutze Excel-Funktionen wie SUMME, WENN, etc., um die gewünschten Berechnungen zu erstellen. Zum Beispiel:
    =WENN(A2<>"",SUMME(B2:B13),"")
  4. Formeln in Zellen einfügen: Anstelle von VBA-Makros kannst Du Formeln direkt in die Zellen eingeben, die die gewünschte Logik abbilden.
  5. Ergebnis überprüfen: Teste die Formeln und stelle sicher, dass sie die richtigen Ergebnisse liefern.

Häufige Fehler und Lösungen

Fehler 1: Formeln liefern falsche Ergebnisse.
Lösung: Überprüfe die Zellreferenzen und die verwendeten Funktionen. Achte darauf, dass die Bereiche korrekt angegeben sind.

Fehler 2: Excel benötigt lange zur Berechnung.
Lösung: Reduziere die Komplexität Deiner Formeln oder teile sie in mehrere Schritte auf. Nutze auch die Möglichkeit, nur die benötigten Zellen neu zu berechnen.


Alternative Methoden

Falls Du die Performance Deiner Excel-Tabellen verbessern möchtest, kannst Du folgende Methoden in Betracht ziehen:

  • Daten konsolidieren: Reduziere die Anzahl der Zeilen, indem Du zusammenfassende Daten nutzt.
  • Pivot-Tabellen: Verwende Pivot-Tabellen, um Deine Daten schnell und effizient zu analysieren, ohne komplexe Formeln.
  • Makros nutzen: Wenn Du bereit bist, doch mit Makros zu arbeiten, kannst Du VBA-Makros verwenden, um die Berechnung zu automatisieren.

Praktische Beispiele

Hier sind zwei Beispiele, wie Du eigene Funktionen erstellen kannst, ohne VBA zu verwenden:

  1. Monatssumme für eine Abteilung:

    =SUMMEWENN(A:A; "Abt. 1"; B:B)

    Diese Formel summiert alle Werte in Spalte B, die zu "Abt. 1" in Spalte A gehören.

  2. Zielwertberechnung:

    =WENN(B2<>""; B2*(1+C2); "")

    Hierbei wird der Zielwert basierend auf dem aktuellen Wert und einer Zielprozentzahl in C2 berechnet.


Tipps für Profis

  • Verwende benannte Bereiche: Dies erhöht die Lesbarkeit und Wartbarkeit Deiner Formeln.
  • Dokumentiere Deine Funktionen: Füge Kommentare in Excel hinzu, um die Logik Deiner Funktionen zu erklären.
  • Optimiere die Berechnungseinstellungen: Stelle sicher, dass die Berechnungen auf "Manuell" gesetzt sind, wenn Du große Datenmengen bearbeitest, um die Performance zu steigern.

FAQ: Häufige Fragen

1. Wie erstelle ich eine eigene Funktion in Excel ohne VBA?
Du kannst Excel-Funktionen einfach in Zellen kombinieren, um die gewünschte Logik abzubilden, z.B. mit SUMME, WENN und anderen Funktionen.

2. Sind eigene Funktionen in Excel schneller als VBA-Makros?
In der Regel sind einfache Excel-Funktionen schneller, da sie direkt von Excel verarbeitet werden. Komplexe Berechnungen können jedoch auch mit Excel-Funktionen langsam sein.

3. Wie kann ich meine Tabellenstruktur verbessern?
Überlege, ob Du Pivot-Tabellen verwenden kannst, um die Übersichtlichkeit zu erhöhen und die Performance zu verbessern.

4. Was ist Zielpreiskalkulation?
Zielpreiskalkulation ist eine Methode, die verwendet wird, um den Preis eines Produkts basierend auf den gewünschten Gewinnmargen und den Kosten zu bestimmen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige