Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1304to1308
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

Allgemeine Funktion einlesen

Allgemeine Funktion einlesen
07.04.2013 18:20:07
Sodonikus
Hi ich habe darüber nachgedacht ob es mit vergleichsweise wenig Aufwand möglich
wäre, eine Funktion aus einer Exceltabelle einzulesen und dieser dann
einen Funktionswert x zu übergeben. In etwa so:
Public Function f(x As Double)
Dim Formel As String
Formel = Range(3, 7)
f = CDbl(Formel)
End Function

Allerdings muss man es noch irgendwie bewerkstelligen, da praktisch der String formel, an die Stelle von CDbl(Formel) geschrieben wird, da ansonsten ja nicht das x aus dem
Methodenkopf übergeben werden kann. Hat jemand eine Idee wie man das realisieren kann?

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Allgemeine Funktion einlesen
07.04.2013 18:21:55
Hajo_Zi
Du musst Cells benutzen nicht Range.
Die Frage ist mir nicht klar.

AW: Allgemeine Funktion einlesen
07.04.2013 18:28:16
Sodonikus
Ja gut Cells, das war weniger das Problem.
Sagen wir in der Zelle steht eine Formel: (x^2+x-5)/x
Diese ist dynamisch veränderbar und soll nun vba übergeben werden.
Vba setzt dann für x die Funktionswerte irgendeiner vorangegangen Berechnung ein
und spuckt das Ergebnis aus und gibt es auch in Vba zurück (wird dann irgendwo ausgegeben, ist ja egal).

Von1 auf 100 in 2 Tagen...
07.04.2013 19:49:40
EtoPHG
Hallo Sodonikus,
1.In diesem Forum ist es üblich und gewünscht, Posts mit einer Begrüssung einzuleiten und auch abzuschliessen.
2. Vor 2 Tagen noch VBA Basis Kenntnisse...heute schon...Excel gut - VBA gut?
Keine Deiner Anfragen scheint darauf hinzudeuten. Vielmehr drängt sich der Verdacht auf, dass du weder vom Excel-Objektmodell noch von gewissen Grundlagen der (VBA)Programmierung eine grosse Ahnung hast. Du redest sehr schnell von Bugs. XL gibt es schon seit über 25 Jahren und einen echten Bug zu finden dürfte einem Anfänger fast unmöglich sein. Also wäre eine gewisse Zurückhaltung duesbezüglicher Aussagen angebracht und ein genaueres Studium der Hilfe, von Forenbeiträgen oder anderer Wissensquellen empfehlenswert.
3. Dein Problem liesse sich (mehr oder minder aufwändig) mit der EVALUATE Funktion lösen, allerdings stellt sich die Frage: Was wäre der Sinn einer Funktion als String in einer Zelle, wenn sich die gleiche Funktion mit einfachen Formeln ohne VBA mit den Grundfunktionalitäten von XL lösen lässt?
Möchtest du XL neu erfinden?
Gruess Hansueli

Anzeige
Im Prinzip annähernd richtig, ...
07.04.2013 20:08:09
Luc:-?
…Hans-Ueli,
besonders der allgemeinere Teil, aber inzwischen habe ich bemerkt, dass zumindest Vss12+14 streckenweise doch etwas unsauber-schnell programmiert zu sein scheinen (besonders, was formale Zuordnung von Eigenschaften betrifft, speziell BedingtFormatierung), von anderen bekannten Bugs mal abgesehen. Außerdem reichen auch ältere Neuerungen im Fktsbereich nicht an die Beinahe-Genialität des Urentwurfs heran.
Letztendlich kommt es hier doch in 1.Linie auf Kalkulation an und nicht auf die vielen mehr oder weniger nützlichen „Kinkerlitzchen“, mit denen man wohl hptsächlich konkurrierender Software, die bei teilweise etwas anderer HptZielstellung zu „neuen Ufern“ vorgestoßen ist, paroli bieten will.
Gruß Luc :-?

Anzeige
AW: Von1 auf 100 in 2 Tagen...
07.04.2013 22:38:33
Sodonikus
Hi EtoPHG,
tut mir Leid wenn dir meine Art zu formulieren aufstößt, das war nicht beabsichtigt.
Grundsätzlich finde ich es schwer meine Excelfähigkeiten einzuschätzen, deswegen wohl die widersprüchlichen Angaben.
Was meine Definition von Bugs angeht. Ja ich finde das sind Bugs.
Wenn mir ein Refedit das Event Keypress laut Excel Object Manager zur Verfügung stellt,
dieses aber nicht funktioniert, ist das für mich ein Bug.
Wenn ich die Count Eigenschaft von Columns und Rows in einem Range nutze, das ich vorher
dynamisch definiert habe, der Zähler bei den Columns vom Beginn meiner Selektierung beginnt zu zählen,
die Rows aber von Beginn der Tabelle anfangen zu zählen, tja dann muss ich dir leider sagen ist das für mich auch ein Bug, oder zumindest sehr schlecht umgesetzt, weil man so über diese Methode gar nicht ein dynamisches RefEdit erzeugen kann.
Für mich sieht dieses Refeditobjekt zumindest sehr buggy aus und dazu ist es auch noch schlampig dokumentiert, nämlich gar nicht.
Und in eigener Sache. Windows gibt es mindestens schon genauso lange wie Excel. Und gerade bei solchen Programmen, mit einer so hohen Komplexität gibt es auch noch nach 25 Jahren Bugs.
Nur meine 2 Cents...
Aber danke für die Lösung, mit Evaluate klappt es.

Anzeige
dein zweiter Bug ist vom Programmierer
08.04.2013 05:25:39
Tino
Hallo,
der 2. ist bestimmt ein Bezugsfehler im Code ;-)
Gruß Tino

AW: dein zweiter Bug ist vom Programmierer
08.04.2013 19:57:44
Sodonikus
Dachte ich auch. Allerdings macht es keinen Sinn, weil der Wert der ausgegeben wird wenn ich Rows.Count benutze nichtmal innerhalb des Range lag, sondern außerhalb von diesem in der Tabelle. Das kann ja gar nicht möglich sein, wenn ich dem Range vorher einen anderen Bereich durch mein RefEdit Control zugeordnet habe.

AW: dein zweiter Bug ist vom Programmierer
09.04.2013 04:52:18
Tino
Hallo,
zeig mal den Code.
Gruß Tino

hier die Auflösung des Bugs
09.04.2013 16:49:47
Tino
Hallo,
fällt es Dir auf?
Im 1. Beispiel-Code hat Cells den Bezug auf die gesamte Tabelle und die
gesamte Tabelle fängt bei A1 an.
Ich Referenziere meist sogar das Range mit der entsprechenden Tabelle,
wenn der Code z. Bsp. in einer Tabelle1 steht und bezieht sich auf eine andere z. Bsp. Tabelle2
dann kommt es zum Fehler.
Weil Range sich auf die Tabelle bezieht wo der Code steht und der innere Teil auf eine andere.
Dim rangeU As Range, rangeGes As Range

Set rangeGes = Range("Tabelle1!C5:D10")
With rangeGes
    Set rangeU = Range(Cells(.Rows.Count, 1), Cells(.Rows.Count, .Columns.Count))
    MsgBox rangeU.Address

    Set rangeU = Range(.Cells(.Rows.Count, 1), .Cells(.Rows.Count, .Columns.Count))
    MsgBox rangeU.Address
End With
Gruß Tino

Anzeige
AW: hier die Auflösung des Bugs
09.04.2013 20:32:41
Sodonikus
Set RangeGes = Range(UserForm1.RefEdit1.Text)
Set RangeU = Range(Cells(RangeGes.Row, RangeGes.Column), Cells(RangeGes.Rows.Count + 1, RangeGes.Column))
So sah meins aus. Ist der Bezug durch RangeGes.Row nicht gegeben?

AW: hier die Auflösung des Bugs
09.04.2013 21:08:42
Tino
Hallo,
RangeGes.Row gibt die Zeile (Zahl) zurück,
dies ist die erste Zeile in RangeGes auf der Tabelle, dass passt dann noch.
Aber mit dem Count passt dies so nicht, wenn ich den Bereich A65001:A65005 habe bekomme ich
mit Rows.count nur 5 Zeilen, damit ergibt sich bei Cells(5,1) die Zelle A5.
Aber RangeGes.Cells(RangeGes.rows.count,1) ergibt die Zelle A65005
Der eigendliche Bezug ist Cells und dieser bezieht sich auf die gesamte Tabelle.
Wenn müsste der Code so für die erste Spalte aus RangeGes aussehen.
Wobei .Cells(1, 1) die linke oberste Zelle in RangeGes und .Cells(.Rows.Count, 1) die linke unterste.
Set RangeGes = Range(UserForm1.RefEdit1.Text)
With RangeGes
Set RangeU = .Parent.Range(.Cells(1, 1), .Cells(.Rows.Count, 1))
End With
MsgBox RangeU.Address
Gruß Tino

Anzeige
AW: hier die Auflösung des Bugs
10.04.2013 19:00:28
Sodonikus
Super danke für die Aufklärung. Aber verweist die Funktion Parent nicht immer auf das nächsthöhere Objekt? Wenn ich dann RangeGes.Parent.Range(Cells...) schreibe, würde das nicht auf den Parent des RangeGes zeigen, also auf meine Tabelle1?

AW: hier die Auflösung des Bugs
10.04.2013 19:43:40
Tino
Hallo,
das stimmt mit Parent.
Aber wenn Du RangeGes.Parent.Range(cells(…)) schreibst und dieses RangeGes
von einer anderen Tabelle stammt die nicht aktiv ist knallt es wieder.
cells(…) definiert eine Zelle mit dem entsprechenden Zeilen und Spalten Index.
Wenn Du in einem Standard-Modul arbeitest,
reicht es im inneren vom Range die Zellen auf die richtige Tabelle zu verweisen.
liegt der Code aber in einer Tabelle,
hat Range und auch Cells den Bezug zu dieser Tabelle wo auch der Code steht.
Daher referenziere ich Grundsätzlich Range und Cells auf die richtige Tabelle.
Hier mal ein Beispiel-Code.
Stelle diesen mal in ein Modul und gehe mit F8 schrittweise den Code durch.
Dann stell diesen mal in die Tabelle1 oder 2 als Code und wiederhole dieses Spiel.
Dort wo es zum Bezugsfehler kommt geht die Msgbox auf.
Sub Beispiel()
Dim rng As Range
On Error Resume Next

Sheets("Tabelle1").Activate
With Sheets("Tabelle1")
    Set rng = .Range(Cells(1, 1), Cells(1, 2))
End With
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical: Err.Clear

Sheets("Tabelle2").Activate
With Sheets("Tabelle1")
    Set rng = .Range(Cells(1, 1), Cells(1, 2))
End With
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical: Err.Clear

Sheets("Tabelle2").Activate
With Sheets("Tabelle1")
    Set rng = Range(.Cells(1, 1), .Cells(1, 2))
End With
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical: Err.Clear

Sheets("Tabelle2").Activate
With Sheets("Tabelle1")
    Set rng = .Range(.Cells(1, 1), .Cells(1, 2))
End With
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical: Err.Clear

Sheets("Tabelle1").Activate
With Sheets("Tabelle1")
    Set rng = .Range(.Cells(1, 1), .Cells(1, 2))
End With
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical: Err.Clear
End Sub
Gruß Tino

Anzeige
AW: hier die Auflösung des Bugs
10.04.2013 21:44:23
Sodonikus
Habe mir das ganze mal angesehen - so richtig verstehen tue ich diese Art der Implementierung aber nicht,
weil nach meinem intuiven Verständnis x.Range(Cells) ja eigentlich schon exakt defininiert das ich die Zellen aus dem Rangeobjekt x haben will. Aber gut dann gewöhne ich mir an vor jedes cells und range einen Punkt zu setzen, damit sollte es dann ja nicht mehr zu Problemen kommen.
Allerdingss bezog sich meine Frage auch mehr auf diesen Code von dir:
Set RangeGes = Range(UserForm1.RefEdit1.Text)
With RangeGes
Set RangeU = .Parent.Range(.Cells(1, 1), .Cells(.Rows.Count, 1))
End With
MsgBox RangeU.Address
Das .Parent kann man sich doch eigentlich sparen oder nicht?

Anzeige
AW: hier die Auflösung des Bugs
10.04.2013 22:18:31
Tino
Hallo,
ist doch ganz einfach!
wie schon geschrieben cells() mit Zeilen und Spalten Index
ist genau eine Zelle aber wo ist diese Zelle das musst du mitgeben.
Range ist ein Bereich von/bis und der muss auch irgendwo liegen.
Wenn nun Cells eine Zelle aus dem Bereich xy auf der Tabelle2 ist
muss Range auch auf diese Tabelle verweisen.
Parent kannst du sparen wenn diese Tabelle immer aktiv ist!
Wenn du ohne select usw. arbeiten willst kannst du dies nicht sicherstellen.
Gruß Tino

Etwas mehr Aufwand wirst du wohl treiben ...
07.04.2013 19:55:41
Luc:-?
…müssen, Sadonikus,
wenn du eine Fkt in math Schreibweise auswerten willst, wobei deine BspFkt ja noch recht einfach ist, da sie schon nahezu xl-gerecht notiert ist. VBA bringt da schon 'ne vbFkt mit:
Function EvalFTx(ByVal Formel, ByVal xVar, Optional ByVal VarSymbol$ = "x")
xVar = Replace(CStr(xVar), Application.International(xlDecimalSeparator), ".")
EvalFTx = Evaluate(Replace(Formel, VarSymbol, xVar))
End Function
In irgendeiner Zelle könntest du dann EvalTx(G3;H3) schreiben, falls in G3 die Fml und in H3 der x-Wert steht.
Falls die Fml aber in math Schreibweise vorliegen sollte, →hier (x²+x-5)/x, kann der Aufwand uU wesentlich höher wdn, wenn auch nicht unbedingt so hoch wie bei meiner ca 11 Jahre alten Lösung für mehrere Variablen und Operationen ohne Evaluate (mehrere Tsd PgmZeilen), die auch eine Schreibweise wie E=mc² versteht → für dein Bsp mit (x²+x-5)/x in G3 und Wert für x in H3: T2Form(G3;;H3). ;-)
Gruß Luc :-?

Anzeige
AW: Etwas mehr Aufwand wirst du wohl treiben ...
07.04.2013 22:47:04
Sodonikus
Danke auch an dich Luc. Das wäre natürlich auch eine Lösung gewesen.
Ich hatte eine Aufgabenstellung bei der man eine numerische Integration realisieren sollte,
eben komplett in VBA, da ich Excel erst 1-2 wochen kenne, sind mir solche Funktionen nicht
bekannt gewesen und nach 2-3 Stunden Googlesuche hatte ich da auch noch nichts Vergleichbares
gefunden. Trotzdem danke die werde ich auf jeden Fall im Hinterkopf behalten, spart ja doch ne Menge Zeit.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige