Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1152to1156
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
Inhaltsverzeichnis

@hajo: stimmt das, was ...

AW: stimmt das, was ...
16.04.2010 18:41:34
Hajo_Zi
Hallo Herbert,
warum ich, NoNet wird es schon wissen. Ich arbeite mich jetzt nicht in den Beitrag ein. Der Erste Beitrag ist für mich unklar.

AW: stimmt das, was ...
16.04.2010 19:04:07
Herbert
ach hajo, jetzt sei doch nicht so! natürlich habe ich vergessen zu erwähnen, dass die änderung aus der funtion heraus durchgeführt werden soll. aber einmal kann man doch auch etwas vergessen, oder?
schau es dir doch bitte noch einmal an! DANKE!!!
vg herbert
Das kommt ganz darauf an, wie man das...
16.04.2010 18:51:57
Luc:-?
…macht, Herbert…!
Bei dir ist Arg4=163% — da könntest du natürlich in eine Befehlszeile der udF schreiben…
If arg4 = 1.63 Then arg4 = 1
Für arg4 musst du natürlich dessen Namen setzen. Das wäre überhpt kein Problem.
Was Anderes ist es, wenn du die Argumente der Fktt einer Reihe von Fmln austauschen willst; das macht man am besten mit einer Subroutine. Wenn man dazu partout eine andere udF benutzen will, wird das nur gelingen, wenn diese ein Ereignis auslöst, das dann zum Aufruf einer entsprechenden Subroutine benutzt wdn kann. Dazu kann man diese udF einen symboli­schen Wert zurückgeben lassen, von dem das Auslösen der Subroutine zusätzlich abhängig gemacht wird. So fktn dann auch die Lösungen mit Replace.
Du kannst mir glauben, dass ich auf dieser Strecke schon so einiges versucht und erreicht habe, was normalerweise nicht möglich ist. Da ist das hier, wenn ich das Problem richtig interpretiere, ein Klacks… ;-)
Gruß Luc :-?
Anzeige
AW: Das kommt ganz darauf an, wie man das...
16.04.2010 19:01:52
Herbert
hallo luc,
"If arg4 = 1.63 Then arg4 = 1" das ist mir soweit schon klar. doch soll das geänderte argument auch in der zelle geändert werden" in der zelle steht bei der eingabe: =Honorar("Arch-2002";100000;3;163%;1). und diese eingabe soll auf diese werte geändert werden, während der berechnung: =Honorar("Arch-2002";100000;3;100%;1). geht das irgendwie?
also ich kann mir schon vorstellen, dass das nicht geht. aber die hoffnung stirbt zuletzt!
servus
Jein, offiziell geht das nicht, weil eine Fkt...
16.04.2010 19:42:43
Luc:-?
…so etwas nicht darf, Herbert…!
Allerdings kannst du in der udF eine Globalvariable mit entsprechenden Angaben füllen, die dann von einer aus einer Ereignisprozedur (…_Change) heraus aufgerufenen Subroutine bei Nichtleersein derselben für die Änderung der Target.Formula benutzt wird. Das stört den Ablauf nicht weiter (vor allem, wenn die Ereignisreaktion zeitweise ausgeschaltet wird), denn die Berechnung der Fml ist zu diesem Zeitpkt bereits abgeschlossen. Durch die Änderung der udF-Argumente in der Zelle wird dann natürlich eine Neuberechnung ausgelöst (bei AutoBerechnung), die dann das Ergebnis zum korrigierten Argument liefert.
Wenn man so etwas ganz allgemein halten will, wird's komplizierter, weil ggf erst Subroutinen entsprechend zusammengesetzt wdn müssen und der Ablauf bei mehreren zu ändernden Zellfmln Probleme bereiten könnte. Da müsstest du dann probieren. Aber im Großen und Ganzen geht das so. Allerdings solltest du eine udF, die derartige Veränderungen auslösen kann, nie innerhalb von Bedingungen der BedingtFormatierung bzw in benannten Fmln einsetzen! Du könntest dir einen xlAbsturz einhandeln!
Gruß Luc :-?
PS: Ich nenne so etwas „physische Entkopplung“ von udF und (fremd-)zellverändernden Befehlen. Unter diesem Stichwort findest du ggf ein paar neuere Beiträge von mir zu diesem Thema…
Anzeige
Wat'n los, Herbert?! Gruß owT
19.04.2010 15:19:52
Luc:-?
:-?
AW: Wat'n los, Herbert?! Gruß owT
19.04.2010 16:43:43
Herbert
sorry,
aber ich bin noch nicht zum testen gekommen. allerdings war das auch ein bisschen viel text auf einmal! hättest du mir nicht bitte auch ein kleines beispiel dazu? das wäre wirklich SEEEHR nett, BITTE!
Dachte schon, Vulkanopfer,...
19.04.2010 18:27:58
Luc:-?
…Herbert… ;-)
Na dann…
Bsp im TabBlatt:
A1: 2000   B1: =PRODUKT(A1;163%)
Im TabBlatt-Dokumentklassenmodul:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Cells.Count = 1 And .HasFormula Then
If LCase(Left(.Formula, 9)) = "=product(" Then
If CBool(InStr(.Formula, "163%")) Then _
.Formula = Replace(.Formula, "163%", "100%")
End If
End If
End With
End Sub
So fkt das bei mir einwandfrei. Ggf solltest du bei deinem Bsp statt "163%", "100%" besser ",163%,", ",100%," schreiben, falls das in Wirklichkeit auch mal zusätzl größere Zahlen wie 1163 an anderer Stelle enthalten kann (bei generell ohne %) oder 1.63 → 1 oder was immer nötig ist, um den Austausch eindeutig zu gestalten.
Vermute übrigens, dass du viell noch „Schlimmeres“ vorhast — dann solltest du dich an längere Erklärungen gewöhnen und auch ihre Sprache verstehen… ;-)
Viel Erfolg! Gruß Luc :-?
Anzeige
Auweia, zu spät! Das ist ja nur die Hälfte...
19.04.2010 18:33:29
Luc:-?
…Herbert,
nämlich eine Möglichkeit für den „physisch entkoppelten“ Teil! Du willst das ja aus der udF heraus veranlassen — war mir schon wieder entfallen (zu lange keine RM, mein Lieber… ;->)…
Muss ich also doch noch 'ne kleine udF basteln… Folgt demnächst!
Gruß Luc :-?
AW: Auweia, zu spät! Das ist ja nur die Hälfte...
19.04.2010 19:14:25
Herbert
hallo luc,
ein problem habe ich nur mit manchen abkürzungen, bei denen ich ums verrecken nicht auf den dreh komme: Fkt & RM. manchmal steht man schon so was von aufm schlauch, oder liegt es vielleicht doch schon an meinem fortgeschrittenen alter? ;o)=)
übrigens, hast du schon mal auf exceltreffen.de geschaut, da kannst du einige bilder von mir sehen. da gehöre ich schon zum "inventar". ich war auch fast 10 jahre auf "spotlight.de" unterwegs (frager und antworter). hier bei hans bin ich auch schon fast 10 jahre mitglied. und trotzdem passiert es mir auch immer wieder mal, dass ich bei fragen einiges vergesse zu erwähnen. jetzt kann man sich aber leicht vorstellen, wie es da neulingen geht! deshalb plädiere ich hier immer wieder um nachsicht, für mich, aber auch für alle anderen.
doch zu meiner frage: NoNet sagt, dass das gar nicht geht, aus der udf heraus einen der eingabeparameter zu ändern. bist du da nicht seiner meinung?
see you
Anzeige
Ja, bin ich nicht, denn ich weiß wie's geht! ;-)
19.04.2010 20:20:22
Luc:-?
Und hier nun der Beweis, Herbert…
Habe dafür das 1.Bsp nur etwas erweitert — ggf zVgl…
im TabBlatt:
A1: 2000   B1: =PRODUKT(A1;163%)
A2: 2000   B2: =ProdArgTausch(A2;163%)

im TabBlatt-Dokumentklassenmodul:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Cells.Count = 1 And .HasFormula Then
If LCase(Left(.Formula, 9)) = "=product(" Then
If CBool(InStr(.Formula, "163%")) Then _
.Formula = Replace(.Formula, "163%", "100%")
ElseIf IsArray(gromPTBFF) And _
LCase(Left(.Formula, 15)) = "=prodargtausch(" Then
If CBool(InStr(.Formula, gromPTBFF(0))) Then _
.Formula = Replace(.Formula, gromPTBFF(0), gromPTBFF(1))
End If
End If
End With
End Sub
in allgemeinem Modul des Projekts:
Option Explicit
Public gromPTBFF As Variant
Function ProdArgTausch(Bezug, Optional ByVal Faktor As Double = 1)
Const fakT As String = "163% 100%"
If Faktor = 1.63 Then gromPTBFF = Split(fakT, " ")
ProdArgTausch = Bezug * Faktor
End Function
Beide Funktionen (Abk: Fktt) machen dasselbe, nur kann die udF außerdem die (nachträgl) Änderung ihres 2.Arguments veranlassen → darauf kommt es an — nicht ändern, das ginge nur mit dem ArgWert, sondern diese nur veranlassen. Den Rest besorgt die physisch entkoppelte Ereignisprozedur bzw eine von ihr aufgerufene Subroutine. Dazu benötigt sie Angaben, die ihr von der udF mit der Public-Variablen gromPTBFF geliefert wdn.
Alles Weitere ergibt sich aus meiner ursprgl Erklärung…
Problematisch könnte es wdn, wenn du das im AutoBerechnungsmodus massenhaft für unterschiedl Zwecke auch in verschiedenen udF einsetzen willst. Da könnte es sinnvoll sein, jedem Zweck und/oder jeder udF, ggf jedem udF-StdOrt im TabBlatt eine eigene Globalvariable zuzuordnen…
Ich habe da so meine Erfahrungen mit unerwünschten Effekten gemacht, aber das kann auch an meinen udFktt liegen… ;-)
Viel Erfolg, Luc :-?
PS: RM=Rückmeldung — Bin jetzt im 6.Jahr hier; war auch auf Spotlight; weiß, wie du aussiehst → mal schauen, ob über die diversen xlTreffen ein Alterungsprozess sichtbar wird; könnte schon sein, dass du ein kleines Bisschen älter bist als ich… ;-)
Anzeige
Das kann man übrigens auch noch so...
20.04.2010 02:07:51
Luc:-?
…erweitern, Herbert,
dass Arg2 auch bei Vorliegen als Zellbezug oder Formelausdruck ersetzt wird, wenn es den fraglichen Wert liefert → bei Ausdrücken sicherheitshalber (intern) runden…!
Morrn, Luc :-?
AW: Das kann man übrigens auch noch so...
20.04.2010 09:19:20
Herbert
hallo luc,
ich blicke es einfach nicht. deshalb sende ich dir jetzt hier den originalcode, damit du dir ein bild davon machen kannst. dort wo "xxx" steht musste ich etwas verbergen. bitte habe verständnis dafür:
Option Private Module
Public gromPTBFF As Variant
Public Function Honorar(LB$, AK, HonZone, HonSatz, AusgWert%)
Dim wsAddIn As Worksheet, HzMin1$, HzMin2$, HzMax1$, HzMax2$
Dim ak_min, ak_max, HonMin0, HonMin1, HonMax0, HonMax1
Dim Höchstsatz, Mindestsatz, s§Spalte$, sLbPM2004$
Dim iMaxHz%, sAkSpalte$, iHzSpalte%, iLastRow%, sAkRegion$, objSheet As Object
On Error GoTo ende
Call ProdArgTausch("A1", HonSatz)
Set wsAddIn = ThisWorkbook.Sheets(LB)
With wsAddIn
Application.EnableEvents = False
iLastRow = .Cells(Rows.Count, HonZone).End(xlUp).Row
iMaxHz = .Range("1:1").Find(What:="ak").Column
sAkSpalte = Chr(iMaxHz + 64)
sAkRegion = sAkSpalte & "2:" & sAkSpalte & iLastRow
iHzSpalte = iMaxHz - 2
s§Spalte = Chr(iMaxHz + 65)
If LB = "PM-2004" And AK > 50000000 Then
iHzSpalte = 3
sLbPM2004 = " + AK > 50.000.000 €"
End If
If HonZone = "5 +" Or HonZone = "5+" Or HonZone > "5" Or HonZone > iHzSpalte Then
HonZone = iHzSpalte
MsgBox "Die größte HonZone für """ & LB & sLbPM2004 & """ ist  """ & iHzSpalte & """."  _
& vbLf & vbLf & _
"Sie wird für die Berechnung automatisch angepasst!"
End If
HzMin1 = Chr(HonZone + 64)
HzMax1 = Chr(HonZone + 65)
If HonZone = 6 Then
HzMin2 = HzMax1
HzMax2 = HzMax1
Else
HzMin2 = Chr(HonZone + 65)
HzMax2 = Chr(HonZone + 66)
End If
ak_min = .Range(sAkSpalte & Application.Match(AK, .Range(sAkRegion), 1) + 1).Value
ak_max = .Range(sAkSpalte & Application.Match(AK, .Range(sAkRegion), 1) + 2).Value
HonMin0 = .Range(HzMin1 & Application.Match(AK, .Range(sAkRegion), 1) + 1).Value
HonMin1 = .Range(HzMin2 & Application.Match(AK, .Range(sAkRegion), 1) + 1).Value
HonMax0 = .Range(HzMin1 & Application.Match(AK, .Range(sAkRegion), 1) + 2).Value
HonMax1 = .Range(HzMin2 & Application.Match(AK, .Range(sAkRegion), 1) + 2).Value
Mindestsatz = xxx
HonMin0 = .Range(HzMax1 & Application.Match(AK, .Range(sAkRegion), 1) + 1).Value
HonMin1 = .Range(HzMax2 & Application.Match(AK, .Range(sAkRegion), 1) + 1).Value
HonMax0 = .Range(HzMax1 & Application.Match(AK, .Range(sAkRegion), 1) + 2).Value
HonMax1 = .Range(HzMax2 & Application.Match(AK, .Range(sAkRegion), 1) + 2).Value
Höchstsatz = xxx
End With
If HonSatz > 1 Then
HonSatz = 1
MsgBox "Der Honorarsatz darf 100% nicht übersteigen!" & vbLf & vbLf & _
"Die Berechnung wird automatisch angepasst!" & vbLf & vbLf & _
"Bitte ändern Sie Ihre Eingaben in der Zelle!"
End If
If HonSatz = 0 Then Honorar = Mindestsatz
If HonSatz = 1 Then Honorar = Höchstsatz
If HonSatz > 0 And HonSatz 

Public Function ProdArgTausch(Bezug, Optional ByVal Faktor As Double = 100)
Const fakT As String = "163% 100%"
If Faktor = 1.63 Then gromPTBFF = Split(fakT, " ")
ProdArgTausch = Bezug * Faktor
End Function

Anzeige
Dein Pgm sehe ich mir noch an,...
20.04.2010 23:31:26
Luc:-?
…Herbert,
hier erst mal noch mein erweitertes Beispiel, das du natürlich nicht direkt auf dein Projekt übertragen kannst, wie du es wahrscheinl versucht hattest (sieht auf den 1.Blick irgendwie so aus)…
 ABCDEF
1Arg1ErgebnisFormel vorherFormel nachher
220003260⇒PRODUKT(A$2;A$5)⇒PRODUKT(A$2;A$5)
3 3260⇒PRODUKT(A$2;162%+1%)⇒PRODUKT(A$2;162%+1%)
4Arg22000⇒PRODUKT(A$2;163%)⇒PRODUKT(A$2;100%)
5163%2000⇒ProdArgTausch(A$2;A$5)⇒ProdArgTausch(A$2;100%)
6 2000⇒ProdArgTausch(A$2;162%+1%)⇒ProdArgTausch(A$2;100%)
7 2000⇒ProdArgTausch(A$2;163%)⇒ProdArgTausch(A$2;100%)

Die udFkt sieht jetzt so aus…
Function ProdArgTausch(Bezug, Optional ByVal Faktor As Double = 1)
Const fakT As String = "163% 100%"
Dim ft As Variant, ac As Range
If Round(Faktor, 2) = 1.63 Then
ft = Split(fakT, " ")
Set ac = Application.Caller
If InStr(ac.Formula, ft(0)) = 0 Then
ft(0) = Mid(ac.Formula, InStrRev(ac.Formula, ",") + 1)
ft(0) = Left(ft(0), Len(ft(0)) - 1)
End If
gromPTBFF = ft
End If
ProdArgTausch = Bezug * Faktor
Set ac = Nothing
End Function
Alles weitere dann später!
Gruß Luc :-?
Anzeige
Es war so wie ich vermutet habe,...
22.04.2010 01:44:50
Luc:-?
…Herbert…
Außerdem hast du in deiner udF selbst dafür gesorgt, dass das nicht fktionieren kann (.EnableEvents !) Aber nun bin ich fertig und schicke dir 'ne fktde Mappe zu. Wenn ich deine Adresse (wieder-)finde, per eMail, da ich dieses spezielle Bsp nicht für das Verständnis des Ganzen förderl erachte. Das können meine Bspp sicher besser, da übersichtlicher. Du findest da dann auch etliche Kommentare…
Gruß Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige