OT: Nachtrag z.bereits abgelegten CF-Thema
06.10.2009 00:08:40
Luc:-?
Leider kann man nicht mehr wie früher dem noch was „nachschieben" (nicht mal 'nen Link!), Bernd,
weshalb ich das jetzt hier tun will, da ich noch etwas vorbereitet hatte, was ich noch „loswerden" möchte... ;-)
Na, da habe ich wohl einen Nachnutzer deines damaligen Versuchs entdeckt! Mir war auch noch so, als ob dort schon früher mal was zu diesem Thema gestanden hätte...
Jedenfalls hatte ich auch schon mal 2008 an diesem Thema laboriert und bereits Teilerfolge erzielt, aber das dann erst mal vor mir her geschoben. Inzwischen habe ich mich damit aber ernsthaft auseinandergesetzt. Deinen Lösungsansatz über Namen fand ich interessant, weshalb ich das mal weiter getestet habe. Leider gibt's da ein Riesenproblem — statt einer wdn (f.udFktt) gleich 2 AutoRelativAdressAnpassungen wirksam, was das Ganze sehr kompliziert macht, wenn man auch die BedingtFmln darstellen will. Ansonsten habe ich inzwischen mitbekommen, was das Einbringen der BedingtFml in RefersToR1C1Local bewirkt... In einer „frischen" Datei ohne die bei mir übliche Belastung durch x andere udF verhält sich xl9 ähnlich wie xl12 — die Namen tauchen nur sehr temporär im Namensspeicher auf und sind dann wieder verschwunden, müssen also nicht gelöscht wdn; Application.ReferenceStyle hat darauf wie vermutet keinerlei Einfluss und kann entfallen. So fkt auch alles relativ stabil und recht schnell, obwohl immer noch - bei eingeschalteter Automatik - mindestens 60 ineinandergeschachtelte Teildurchläufe erfolgen; vermutl wird der gesamte NameSpace in Anspruch genommen!
Instabil sind in den unten gezeigten „Problem-Nuclei" nur die Varianten, die eine Adresskorrektur benötigen, also die Darstellung von BedingtFormatFmln, da hier meine udF AList zum Einsatz kommt, die zwangsläufig mit dem Application.Caller (bzw ersatzweise ActiveCell) arbeiten muss. Das ist dann alles nur bei ausgeschalteter Automatik sehr relativ stabil...
Inwieweit die Verwendung regulärer Namen in BedingtFormatFmln deine Methode negativ beeinflussen könnte, habe ich noch nicht untersucht. Wäre möglich! Ansonsten habe ich für die Namensisolation aus Fmln (ebenso wie für anderes) auch eine udF; die enden alle auf ...List, weil sie quasi listen- bzw aufzählungsähnlichen Text liefern, der dann auch entsprechend weiterverarbeitet wdn könnte — A..., F..., H..., N..., P..., nur XList ist was anderes... ;-)
Außerdem kann ich mit 2 anderen udF gezielt Namensbezüge auslesen, davon einmal adressberichtigt (mit udF-interner, „ungekapselter" Methode).
Ansonsten habe ich für meine Varianten (wie bereits dargelegt) die Evaluierung relevanter Teile der eingegebenen GesamtFml genutzt, weshalb ich auch ...Caller benötigt habe, was das Ganze (bisher) destabilisiert..., also Set ac = Application.Caller...Evaluate("FConForm(" & PartOf(ac.Formula, "FConForm(", ")") & ")"), weshalb actCellForm als 2.Argument auch eine solche Konstruktion enthalten muss, die entsprechend leicht zu isolieren ist und mittels „Evaluierung" die englische(!) Formatfml liefert. Zuvor habe ich so etwas einfach mit ac.Calculate oder vglbaren Ops realisiert (dabei fiel mir der „Engl-Effekt" zuerst auf!), das ist aber sehr problematisch - kann unerwünschte Nebeneffekte nachsichziehen...
Fazit: Es gibt (für nichtengl xl) wohl (noch) keine wirklich 100%ig zuverlässige Methode, die alles abdeckt. Jede hat Vor- und Nachteile! Aber zum Abschluss der auch für mich recht langen Rede mein kleines Experiment auf der Basis von weiterentwickelten Nuclei deiner Methode...
| A | B | C |
---|
1 | #DIV/0! | ⇒ISTFEHLER(A1) | ⇒TestCFo(A1) |
---|
2 | x | Fett | ⇒TestCFa(A1;"sst") |
---|
3 | x | Rot | ⇒TestCFa(A1;3) |
---|
4 | x | Rot | ⇒TestCFa(A1;"rfn") |
---|
5 | x | Kreidegelb | ⇒TestCFa(A1;9) |
---|
6 | Anmerk: | instabil wg Adresskorrektur m.AList |
---|
Eine adressberichtigte engl BedingtFml auszugeben ist mir nicht gelungen, weil die Ausgangswerte für AList durch die Namensmanipulation schon um 2 Zeilen nach oben verschoben waren, so dass kein vernünftiges Ergebnis zustande kam. Bei meinen wackligen Lösungen klappt das aber, wenn auch bei BerechnungsAutomatik mit wechselnden Adressen, weil sich alles ggseitig beeinflusst... Überlege nun, ob ich deine Idee für die FormatEigenschaften verwende, wäre wohl sicherer... ;-)
Und hier noch die beiden vbAtoms, die viell die Basis deiner Weiterarbeit an diesem Problem _
bilden könnten...
Function TestCFo(ByVal QZ As Range)
Const tnon As String = "TestCFml"
Dim cfl As String, p, qv
On Error Resume Next
With QZ.FormatConditions(1)
Names.Add Name:=tnon, RefersToR1C1Local:=.Formula1
If Evaluate(tnon) Then
cfl = .Formula1
qv = AList(cfl, QZ, , , , , 0)
For Each p In Pair(Split(qv(0), " "), Split(qv(1), " "))
cfl = Replace(cfl, p(0), p(1))
Next p
TestCFo = cfl
Else: TestCFo = QZ.FormulaLocal
End If
End With
Set QZ = Nothing
End Function
Function TestCFa(ByVal QZ As Range, Optional QZFE)
Const tnon As String = "TestCFrb"
On Error Resume Next
With QZ.FormatConditions(1)
Names.Add Name:=tnon, RefersToR1C1Local:=.Formula1
Select Case QZFE
Case 0, "sst", "fst"
If Evaluate(tnon) Then TestCFa = .Font.FontStyle Else TestCFa = QZ.Font.FontStyle
Case 1, "sfx", "fcx"
If Evaluate(tnon) Then TestCFa = .Font.ColorIndex Else TestCFa = QZ.Font.ColorIndex
Case 2, "sfa", "fco"
If Evaluate(tnon) Then TestCFa = .Font.Color Else TestCFa = QZ.Font.Color
Case 3, "sfn", "fcn"
If Evaluate(tnon) Then TestCFa = .Font.Color Else TestCFa = QZ.Font.Color
TestCFa = ColNtoN(TestCFa)
Case 4, "rfx", "bcx"
If Evaluate(tnon) Then TestCFa = .Borders.ColorIndex Else TestCFa = QZ.Borders. _
ColorIndex
Case 5, "rfa", "bco"
If Evaluate(tnon) Then TestCFa = .Borders.Color Else TestCFa = QZ.Borders.Color
Case 6, "rfn", "bcn"
If Evaluate(tnon) Then TestCFa = .Borders.Color Else TestCFa = QZ.Borders.Color
TestCFa = ColNtoN(TestCFa)
Case 7, "zfx", "icx"
If Evaluate(tnon) Then TestCFa = .Interior.ColorIndex Else TestCFa = QZ.Interior. _
ColorIndex
Case 8, "zfa", "ico"
If Evaluate(tnon) Then TestCFa = .Interior.Color Else TestCFa = QZ.Interior.Color
Case 9, "zfn", "icn"
If Evaluate(tnon) Then TestCFa = .Interior.Color Else TestCFa = QZ.Interior.Color
TestCFa = ColNtoN(TestCFa)
End Select
End With
Set QZ = Nothing
End Function
Natürlich enthalten die auch ein paar „Eigenheiten" in Form von udFktt*, die aber im Falle von ColNtoN verzichtbar sind. AList dagg wird wirklich benötigt → nachbauen [gibt da ja was von JensF, aber das kennst du als Aktiver des „liebevoll moderierten" Forums ja sicher... ;-) ]! Mit Pair hast du hier ein Bsp für einen anderen merk- bzw denkwürdigen Effekt, der in vbKonstruktKöpfen auftreten kann (denk nicht, dass das hier irgendjemand interessiert hätte!)...
So, das war's meinerseits! Nun kommt (auch dadurch!) auf mich einiges an udF-Optimierungsarbeit zu...
Gruß+viel Spaß, Luc :-?
*Nebenbei, so sehen fast alle meine udF aus, nur meist viel länger... ;-)
Besser informiert mit...