Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
896to900
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
896to900
896to900
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Formel in VBA umschreiben
22.08.2007 12:24:00
Rainer
Hallo Profis
ich versuche seit einiger Zeit eine Funktionalität auf die Reihe zu kriegen, die, wenn ich sie mit einer Formel abhandle ein riesen Gewurstel gibt.
Da die Komplexität dieser Formel meine Vba Kenntnisse leider übersteigt, hoffe dass ihr mir weiterhelfen könnt.
in diesem file http://www.uploadagent.de/files/1187778199/test.xls
habe ich alles so gut wie möglich vorbereitet.
Kurz gesagt geht es darum dass ich einige Kriterien überprüfe und dann eine Summe durch eine Zahl die mit Sverweis gezogen wird, geteilt werden soll.
Im Makro sub test findet ihr die formel. (im Tabellenblatt1 steht sie auch nochmals).
zuerst wollte ich das so machen, dass ich mit dem Makro die Formel in die Zelle schreibe (das hätte ich noch so halbwegs hingekriegt).
Da ich aber die Formel aber auf x Spalten und jeweils 30000 Zeilen anwenden muss denke ich, dass das ganze explodieren wird.
Über eure Hilfe würde ich mich sehr freuen
Viele Grüsse
Rainer
ps: falls etwas unklar ist bitte nachfragen. Ich dachte mir, es ist einfach die formel zu schreiben, als alles in worte zu fassen. So sollte das, was passieren soll genau definiert sein. Bitte seid nicht irritiert, dass die Formel momentan NV ausgiebt. das liegt daran, dass der Schlüssel des S-verweis nicht in Spalte A steht. Dies sollte aber, so denke ich, mit dem Makro umgehen werden können, da man ja mehr spielraum haben sollte.

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formel in VBA umschreiben
22.08.2007 12:33:42
Beverly
Hi Rainer,
was man mit einer Formel berechnen kann, muss nicht unbedingt auf die selbe Art und Weise auch in VBA von Statten gehen und nicht jeder, der VBA kennt, kennt sich auch genau so gut in Formeln aus (und umgekehrt). Deshalb wäre es besser, du würdest mal in Worten genau beschreiben, was du eigentlich machen willst
________________________________________

AW: Formel in VBA umschreiben
22.08.2007 13:24:01
Rainer
Alles klar. Ich versuche so präzis wie möglich zu sein und beziehe mich auf die raufgeladene Datei:
Zuerst eine kurze Einleitung um was es geht:
Im Tabellenblatt Mainlist stehen Kosten pro Kostenstelle. Ich möchte diese Kosten auf Kunden aufteilen. (eine Zeile im Tabellenblatt ist ein Kunde). Dafür werden die Kosten der entsprechenden Kostenstelle genommen und durch die Summe der Umsätze aller Kunden aus dem selben Bereich geteilt. Die idee ist, dass wenn ein Bereich mehr umsatz gemacht hat, braucht er auch mehr Kosten zu tragen.
So, und jetzt noch etwas technischer:
1. Prüfung ob meine Kostenstelle (Stammdaten!B5) aus den Stammdaten auch in der Tabelle Mainlist (Spalte B) vorhanden ist.
2. Falls meine Kostenstelle da nicht vorhanden ist möchte ich einfach eine "KST nicht vorhandn" ausweisen. (das ist der einfachste Fall)
3. Falls meine Kostenstelle nun aber vorhanden ist dann soll er den Kostenbetrag (Mainlist!C:C) nehmen, (natürlich der, der zur kostenstelle passt) und diesen Durch die Summe teilen.
Bei der Summe handelt es sich um die Summe von Umstätzen aus der Spalte B in im Tabellenblatt Tabelle1. Wie oben beschrieben ist es aber nicht die totale Summen aller Bereiche, sonder nur die Summe des Bereichs, zu dem der Kunde auch angehört.
Ich hoffe das war klar genug. falls nicht, natürlich einfach nachfragen, dann werde ich präzisieren.
So wie ich bis jetzt gelesen habe, könnte man warscheinlich zuerst mit "if" arbeiten und dann cases definieren (für die einzelnen Bereiche) und abhängig von dem dann die Summe ziehen. Aber wie gesagt bin ich leider noch Anfänger.
Dann noch zwei Details. Die Berechnung sollte für alle Zellen in der Spalte C im Tabellenblatt "Tabelle1" ausgeführt werden, für die es in der Spalte A Werte hat. Eine Schwierigkeit könnte noch sein, dass die Kostenstelle noch mit Text rundherum in der Tabelle Mainlist stehen wird.
Jetzt schonmal Danke Vielmals, dass ich nicht abgewiesen wurde, mit dem doch beträchtlichen "Hilfe-Aufwand" eurerseits.
Gruss
Rainer

Anzeige
AW: Formel in VBA umschreiben
22.08.2007 17:11:00
Beverly
Hi Rainer,
hier müssen wir schrittweise vorgehen, da mir nicht 100%ig klar ist, was wohin geschreiben werden soll.
Ich habe erst mal ein Makro erstellt, welches feststellt, ob die Kostenstellen aus Stammdaten Spalte B in der Mainlist vorhanden sind und das in einer MsgBox anzeigt. Ich habe die Mappe mal wieder angehängt.
https://www.herber.de/bbs/user/45283.xls
Der nächste Schritt wäre: wenn die Kostenstelle vorhanden ist - durch welche Summe soll geteilt werden?
Bis später,
Karin

Anzeige
AW: Formel in VBA umschreiben
23.08.2007 08:30:00
Rainer
Hallo Karin
Wow, danke vielmals, dass du dir mit mir solche Mühe gibst. Ich schätze das sehr und kann natürlich bei einem Schrittweisen Aufbau noch mehr profitieren.
Zu deiner Frage. Die Endwerte (nach der Division durch die Summen) sollen jeweils in Spalte C des Tabellenblattes "Tabelle1" geschrieben werden. In all die Zellen, wie es in Spalte A im gleichen Tabellenblatt Einträge hat.
Nun, die Funktionalität die du mir bis jetzt erstellt hast, ist goldrichtig. Nun sollen die Summen, welche in der MsgBox ausgegeben werden, durch die Summe geteilt werden. Um die Summe zu bestimmen müssen wir in Spalte A des Tabellenblattes Tabelle1 schauen, welcher Bereich da steht. Als Beispiel (hier Zeile 2-25) haben den Eintrag "PrintA". Das heisst es soll die Summe des Umsatztes berechnet werden, für alle die, die "PrintA" als Bereich haben.
Eigentlich handelt es sich um eine normale Summewennfunktion: Wenn PrintA in Spalte A, dann Summe der Umsätze aller Zeilen die PrintA haben.
Der jetzt ausgegebene Wert wir dann durch die entsprechende Summe geteilt und in Spalte C (immernoch Tabellenblatt1) geschrieben. Dort wo jetzt schon die Excelfunktion mit Wert NV steht.
Bei der Überprüfung des Bereiches müssen gesamthaft dann 16 Abfragen gemacht haben, weil ich soviele Bereich habe. Wenn du mir zwei aufbaust genügt das, die andren 14 sollte ich schon noch alleine kopieren und anpassen können.
Nochmals herzlichsten Dank für deine Hilfe!
Liebe Grüsse
Rainer

Anzeige
AW: Formel in VBA umschreiben
23.08.2007 15:54:00
Beverly
Hi Rainer,
Rückfrage: sind die Werte in Tabelle1 Spalte A immer sortiert oder kann es vorkommen, dass sie unsortiert sind?
Bis später,
Karin

AW: Formel in VBA umschreiben
23.08.2007 16:40:31
Rainer
hallo karin
die sind unsortiert. das ist nur zufall hier.

AW: Formel in VBA umschreiben
23.08.2007 18:59:16
Beverly
Hi Rainer,
ich hoffe, dass ich alles richtig umgesetzt habe

Sub kostenstelle_feststellen()
Dim raZelleMain As Range
Dim raZelleTab1 As Range
Dim loLetzteMain As Long
Dim loLetzteStamm As Long
Dim loLetzteTab1 As Long
Dim loZeileStamm As Long
Dim loZeileTab1 As Long
Dim doQuotient As Double
Dim strAdrTab1 As String
Dim wsMain As Worksheet
Dim wsTab1 As Worksheet
Set wsMain = Worksheets("Mainlist")
Set wsTab1 = Worksheets("Tabelle1")
loLetzteMain = IIf(IsEmpty(wsMain.Cells(wsMain.Rows.Count, 2)), wsMain.Cells(wsMain.Rows. _
Count, 2).End(xlUp).Row, wsMain.Rows.Count)
loLetzteTab1 = IIf(IsEmpty(wsTab1.Cells(wsTab1.Rows.Count, 2)), wsTab1.Cells(wsTab1.Rows. _
Count, 2).End(xlUp).Row, wsTab1.Rows.Count)
Application.ScreenUpdating = False
With Worksheets("Stammdaten")
loLetzteStamm = IIf(IsEmpty(.Cells(.Rows.Count, 2)), .Cells(.Rows.Count, 2).End(xlUp). _
Row, .Rows.Count)
For loZeileStamm = 5 To loLetzteStamm
Set raZelleMain = wsMain.Range("B2:B" & loLetzteMain).Find(.Cells(loZeileStamm, 2),  _
lookat:=xlPart)
If Not raZelleMain Is Nothing Then
If Application.WorksheetFunction.SumIf(wsTab1.Range("A2:A" & loLetzteTab1), . _
Cells(loZeileStamm, 4), wsTab1.Range("B2:B" & loLetzteTab1))  0 Then
doQuotient = raZelleMain.Offset(0, 1) / Application.WorksheetFunction.SumIf( _
wsTab1.Range("A2:A" & loLetzteTab1), .Cells(loZeileStamm, 4), wsTab1.Range("B2:B" & loLetzteTab1))
Else
doQuotient = 0
End If
For loZeileTab1 = 2 To loLetzteTab1
Set raZelleTab1 = wsTab1.Range("A1:A" & loLetzteTab1).Find(.Cells( _
loZeileStamm, 4), lookat:=xlWhole)
If Not raZelleTab1 Is Nothing Then
strAdrTab1 = raZelleTab1.Address
Do
raZelleTab1.Offset(0, 2) = doQuotient
Set raZelleTab1 = wsTab1.Range("A1:A" & loLetzteTab1).FindNext( _
raZelleTab1)
Loop While Not raZelleTab1 Is Nothing And raZelleTab1.Address   _
strAdrTab1
End If
Next loZeileTab1
Else
MsgBox "Kostenstelle " & .Cells(loZeileStamm, 2) & " in Tabelle 'Mainlist'  _
nicht gefunden"
End If
Next loZeileStamm
End With
Application.ScreenUpdating = True
End Sub


Bis später,
Karin

Anzeige
AW: Formel in VBA umschreiben
24.08.2007 08:44:00
Rainer
Hallo Karin
Tausend dank für deine Anstrengungen. ich werde das ganze jetzt mal ausführlich testen und melde mich dann wieder! :-)
liebe Grüsse
Rainer

getestet
24.08.2007 12:26:00
Rainer
Hallo Karin
Herzlichen Dank für deine Programmierung!!!
Das makro läuft schön durch. ich habe jedoch nicht alles begriffen was da abläuft. ;-)
Ich habe das Gefühl, dass wir uns in ein paar Detailpunkten nicht ganz verstanden haben, beziehungsweise ich mich unklar ausgedrückt habe.
Beim testen habe ich festgestellt, dass gewisse Zeilen keinen Eintrag erhalten. Weshalb ist das so?
Die idee war, dass die Gesamtkosten der Kostenstelle "Cash Discount" auf alle Bereiche aufgeteilt werden. Das heisst, die Summe der Spalte B in Tabelle 1 sollte dem Total der Kosten "cash discount entsprechen".
Der Grund weshalb es mehrer Kostenstellen hat ist lediglich der, damit ich dann die anderen Kostenstellen auf in anderen Spalten analog rechnen kann.
Weisst du was ich meine?
Hier habe ich noch ein kleines Zahlenbeispiel angehängt:
Total Kosten pro Kostenstelle 5000 (wird aus Mainlist gezogen)
Anzahl Kunden (Zeilen) PrintA: 10
Anzahl Kunden (Zeilen) PrintC: 20
Anzahl Kunden (Zeilen) ViscomD: 5
Summe Umsatz PrintA: 100
Summe Umsatz PrintC: 50
Summe Umsatz ViscomD: 20
Berechnung für PrintA-Zeilen: 5000*(100/170)*Anzahl Kunde pro Bereich
folglicher Cash Discount Anteil pro Bereich:
Alle Zeilen PrintA: 2941.17 (ein Kunde erhält somit ein Zehntel davon)
Alle Zeilen PrintC: 1470.58 (ein Kunde erhält somit ein zwanzigstel davon)
Alle Zeilen ViscomD: 588.2 (ein Kunde erhält somit ein fünftel davon)
Summe ergibt wieder 5000
Ich glaube das habe ich nicht verständlich rübergebracht. Wohl nicht zuletz weil ich selbst einen knopf im Hirn hatte.
In einem Satz könnte man sagen: Die Kosten der Kostenstelle werden proportional zum Umsatz pro Bereich auf die Kunden verteilt. (indem jeder Kunde (=Zeile) eines Bereichs gleich viel erhält).
ich wollte nochmals sagen dass ich es super schätze was du hier für mich machst und ich mich ziemlich schuldig fühle, dass ich mich nicht ausgedrückt habe, dass wir vom Gleichen ausgegangen sind!
liebe grüsse rainer

Anzeige
AW: getestet
25.08.2007 07:37:00
Beverly
Hi Rainer,
sorry, kann mich erst heute wieder melden, da gestern mein Internetzugang gestreikt hat.
Ich habe mal in Spalte E deine Formel als Tabellenformel für PrintA eingetragen, bezogen auf die Werte in deiner Beispielarbeitsmappe. Das Ergebnis siehst du ja - ist falsch. Wenn du die Formel korrigieren würdest, kann ich sie dann auch in VBA umsetzen.
https://www.herber.de/bbs/user/45384.xls
Bis später,
Karin

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige