Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
200to204
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
200to204
200to204
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

standard Funktionen aus Makro aufrufen

standard Funktionen aus Makro aufrufen
08.01.2003 22:23:36
chris
guten abend allerseits

jetzt wird es wieder einmal spät und ich kämpfe mit einem problem:
da ich einige berechnungsformeln verwende die sehr lange sind, versuche ich dafür eigene funktionen zu programmieren, diese dann einer zelle zuzuweisen. ich muss also lange ketten von excel-standardfunktionen für vba ausführbar machen.
um dahinterzukommen wie das im detail aussieht, versuchte ich über makro aufzeichnen schlau zu werden (man muss ja nicht immer gleich eine/n Expert/in/en belästigen) jedoch erfolglos

kann mir da jemand helfen:
Die eingegebene Formel lautet:
=WENN(INDIREKT(ADRESSE(5;(T72)-1))="A";$x$50;AF73)

Vba interpretiert dies als:
ActiveCell.FormulaR1C1 =
"=IF(INDIRECT(ADDRESS(5,(RC[-12])-1))=""A"",R50C24,R[1]C)"

Wenn ich nun aber meine eigene funktion erstelle:
Public Function IINT()
IINT = "=IF(INDIRECT(ADDRESS(5,(RC[-12])-1 =""A"",R50C24,R[1]C)"
End Function

und diese einer zelle zuweise (mit =IINT())
so ist das ergebnis nicht eine zahl (z.B. inhalt von X50) sondern der textstring der funktion.

meine verzweifelten Fragen daher
1. wo liegt mein denkfehler, wie bekomme ich ein ergebnis zurück
2. was bedeutet die konvertierung von
ADRESSE(5;(T72)-1) nach ADDRESS(5,(RC[-12])-1)
bzw $X$50 nach R50C24
bzw AF73 nach R[1]C

3. (um mir unzählige fehlversuche zu sparen) wie funktionieren denn die verschiedenen bezugsarten in vba? gibt es so etwas wie relative bezüge die sich entsprechend anpassen, wenn ich die die funktion enthaltende zelle verschiebe oder kopiere?

mit bestem dank ür die mühe

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: standard Funktionen aus Makro aufrufen
08.01.2003 22:40:11
Klaus-Dieter
Hallo chris,

sooo einfach ist das leider nicht. Die Formel die Du da beim Aufzeichnen bekommen hast, erzeugt beim Ablauf des Makros eben die Zellformel, die Du da aufgezeichnet hast. Das sollte es sicher nicht sein. Deine anderen Fragen kann man so auf die schnelle nicht beantworten. Als kleine Hinweis für eine (hoffentlich) erfolgreiche Suche: die Formelbegriffe in VBA sind, wenn es eine Entsprechung zur Zellformel gibt, in englischer Sprache.
Die Tabellenzellen kann man zum Beispiel mit dem Cells-Befehl ansprechen: Cells(1,1) steht z.B. Für Zelle A1, cells(3,4) für Zelle D3.

Gruß Klaus-Dieter
Klaus-Dieter's Excel und VBA Seite

Anzeige
und jetzt?
08.01.2003 23:00:48
chris
also danke für die antwort
nun gut das mit englisch weiss ich, aber
heisst das das adressieren einer zelle funktioniere nur über fixe
"positionsangaben" (indexangaben)?
was aber wenn sich der bezug ändern soll, und zwar automatisch durch kopieren der zelle die die funktion enthält? und weiters was wenn der bezug aus dem wert der in einer anderen zelle steht interpretiert werden soll?

kompliziert.
aber es sieht so aus als könnte ich all die formeln verwerfen und alles neu programmieren, die sehen nämlich ca so aus:

IF(INDIRECT(ADRESS(5;(T70)-1))="A";INDIRECT(ADRESS($A$3;T70))*$O$6
+INDIRECT(ADRESS($A$7;T70))*$O$7+INDIRECT(ADRESS($A$8;T70))*$O$8
+INDIRECT(ADRESS($A$9;T70))*$O$9+INDIRECT(ADRESS($A$17;T70))*$O$10
+INDIRECT(ADRESS($A$18;T70))*$O$11+INDIRECT(ADRESS($A$20;T70))*$O$12
+INDIRECT(ADRESS($A$21;T70))*$O$13+INDIRECT(ADRESS($A$23;T70))*$O$14
+INDIRECT(ADRESS($A$24;T70))*$O$15+INDIRECT(ADRESS($A$29;T70))*$O$16
+INDIRECT(ADRESS($A$35;T70))*$O$17+INDIRECT(ADRESS($A$38;T70))*$O$18;
IF(INDIRECT(ADRESS(5;(T70)-1))="B";INDIRECT(ADRESS($A$3;T70))*$O$26
+INDIRECT(ADRESS($A$5;T70))*$O$27+INDIRECT(ADRESS($A$6;T70))*$O$28
+INDIRECT(ADRESS($A$6;T70))*$O$29+INDIRECT(ADRESS($A$12;T70))*$O$30
+INDIRECT(ADRESS($A$15;T70))*$O$31+INDIRECT(ADRESS($A$16;T70))*$O$32
+INDIRECT(ADRESS($A$21;T70))*$O$33+INDIRECT(ADRESS($A$23;T70))*$O$34
+INDIRECT(ADRESS($A$25;T70))*$O$35+INDIRECT(ADRESS($A$26;T70))*$O$36
+INDIRECT(ADRESS($A$43;T70))*$O$37))

und sollen alle nicht fixen bezüge durch kopieren ändern.

ob ich das mache (oder die die zu lang sind aufteilen) entscheide ich wenn mir irgendwer die frage beantworten kann:
ist es möglich eine funktion nach schema:
Public Function foo()
foo = "=sum($a$1:a10)"
End Function
die einer zelle zugewiesen ist
auf dem sheet zu kopieren, sodass sich automatisch die bezüge nach zum Beispiel : ($a$1:b10) ändern??

danke für die bemühungen



Anzeige
Re: standard Funktionen aus Makro aufrufen
08.01.2003 23:01:53
Hans W. Hofmann
Nun, das darf Dich nicht wundern, weil Du eben Text an die Funktion übergibst. Du findest entsprechende Funktionen unter
VBA. und mit intellesence solltest Du alle unter VBA erreichbaren Funktionen erhalten. Auf die Tabellenfunktionen greift man über das Worksheetfunction. Objekt zu
Insgesamt ist Dein Vorgehen keine gute Idee, weil VBA eine Menge Performance schluckt.

Gruß HW

Re: standard Funktionen aus Makro aufrufen
08.01.2003 23:10:05
chris
danke Dir für die antwort

was ist intellesence ??

aber verstehe ich richtig: das heisst im wesentlichen diese "excel spezifische" form der adressierung aufgeben und alle benötigten werte über Cells().Select bzw. Cells().Value (oder so) oder Selection.Value usw. .. in die Berechnung einbinden?

wie funktionieren hierbei relative bezüge?
verhalten sich eigene funktionen genau wie standard funktionen?

Bis dann

Anzeige
Re: und jetzt?
08.01.2003 23:12:15
PeterW
Hallo Chris,

bin mir nicht sicher ob das weiter hilft aber Functions werden normalerweise Werte übergeben und sie liefern einen Wert zurück, mal als Beispiel:

Aufruf aus einer beliebigen Zelle mit =foo(A1:A10) als Beispiel für die Summenbildung A1:A10

Gruß
Peter


immer näher am verständnis
08.01.2003 23:32:28
Chris
danke PeterW,
schön langsam dämmert es
jedoch kann ich mir immer noch nicht vorstellen was ich da als funktionsparameter übergeben könnte
ich versuche von meinem Problem zu abstrahieren:

zur ermittlung des wertes in zelle a1 benötige ich den wert von
$B$8 * wert aus der Cell(wertvon $C$3 , wertvon D70)
+$B$10 * wert aus der Cell(wertvon $C$12 , wertvon D70)
+...(hier folgen bis zu 15 weitere berechnungszeilen)

zur ermittlung des wertes in zelle a2 jedoch benötige ich den wert von
$B$8 * wert aus der Cell(wertvon$C$3 , wertvon D71)
+$B$10 * wert aus der Cell(wertvon$C$12 , wertvon D71)
+...

kennst du dich aus?
und das ganze am besten noch auf einem anderen sheet (!)

Anzeige
Re: immer näher am verständnis
09.01.2003 01:09:26
PeterW
Hallo Chris,

mal ein Ansatz ohne Function für beliebige Zellen in Spalte A (und auch noch ohne andere Arbeitsblätter) und auch nur für den ersten Teil der Addition:

Sofern es die Daten zulassen kannst Du mir auch die Datei mailen (bitte gespeichert als Version 97, ohne irgendwelchen Schutz und mit einer genauen Aufgabenbeschreibung).

Gruß
Peter

Re: immer näher am verständnis
09.01.2003 05:43:43
andre
Re: standard Funktionen aus Makro aufrufen
09.01.2003 09:56:06
Hans W. Hofmann
Intellisence, wenn Du nach Schreiben eines Objektpfades einen Punkt machst, blendet VBA alle Methoden und Eigenschaften dieses Objektes ein, also:
VBA. Liste aller M/E

Select ist erstmal grundsätzlich abzulehnen, weil unübersichtlich, langsam und schwer zu warten. Bei einer Funktion ist select gar net möglich, bzw. nicht sinnvoll. So wie Deine Funktion konstruiert ist, wird sie nur einmal, bei der Eingabe berechnet und dann nie wieder. Du musst die Funktion über den Kopft mit Eingangsdaten füttern, damit sie Änderungen mitbekommt und neu berechnet wird.
Ich hab jetzt nicht die Zeit zu analysieren, was Deine Konstruktion konkret macht. Beschreib das mal einem Außenstehenden.

Gruß HW

Anzeige
Re: standard Funktionen aus Makro aufrufen
09.01.2003 13:23:38
chris
Danke für die Erklärungen,
ich komme zurecht denke ich...
schönen tag, Chris
Ansatz ohne Funktion
09.01.2003 13:34:48
Chris
ja das sieht ja einfach aus (nämlich einfacher als meine idirect(adress()) konstruktionen)

vor allem:
Dim i As Integer
i = ActiveCell.Row
wird die sache möglich machen.

Bezgl Daten zusenden muss ich leider ablehnen (es ist eine Testauswertung, deren interne arithmetik nur über den offiziellen kanal (kontrolle, lektur) rausgebracht werden soll),
aber es ist auch zu deinem besten, wage ich zu behaupten, denn du willst sicher nicht 60 (!) funktionen für mich programmieren, wo es doch reicht wenn ich eine mal kapiere.

Aber danke vielmals für die Sub.
so long
chris

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige