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

Public Function - Ausgabe in anderer Zelle

Public Function - Ausgabe in anderer Zelle
05.04.2008 15:41:00
Dirk
Hallo zusammen!
Ich beabsichtige, einen Wert, der mittels eine selbsterstellten Funktion ermittelt wurde, nicht in der Zelle auszugeben, wo die Formel steht, sondern z.B. in der danebenstehenden. Gibt es eine solche Möglichkeit?
Sollte ich dies lösen können, steht mir noch ein zweites Problem bevor. Bei den Werten, welche die Formel ausgibt, handelt es sich nicht um einen Wert sondern um den Inhalt einer CSV-Datei, der mehrere Zeilen enthält. Diese sollen - wenn möglich - unterhalb der Zelle zeilenweise ausgegeben werden, so die Funktion steht.
Hat jemand eine Idee? Danke im Voraus!!
Dirk

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

Betreff
Datum
Anwender
Anzeige
AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 16:02:00
Tino
Hallo,
zu erstens, so wie ich es kenne können Funktionen (Formeln) nur die eigene Zelle
beeinflussen.
Du kannst aber die Funktion in zum Bsp. In A1 schreiben und in B1 =A1 schreiben
Gruß
Tino

AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 17:21:51
Dirk
mmmh, schade. ein macro auszuführen, das einen wert in eine andere zelle als die der funktion schreibt, scheint auch nicht zu funktionieren - oder hat dazu vielleicht noch jemand eine idee?
danke!
dirk

AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 17:35:00
ransi
HAllo
oder hat dazu vielleicht noch jemand eine idee?
Sogar 2 ;-)
1.) Schreib eine Sub(). In der kannst du die Zeilen beschreiben.
2.) Lese die Daten der CSV in der Function in ein Array. Die Elemente des Arrays kannst du dann mit =Index(Meine_Function;Zeile(a1)) in A1 schreiben und durch runterkopieren in A2,A3 usw. auslesen.
ransi

Anzeige
AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 18:08:46
Dirk
danke für den tipp! kann die sub() trotzdem aus der formel aufgerufen werden? das hat bei mir leider nicht funktioniert :-(
danke!
dirk

AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 18:25:00
Sven
Hi,
"...kann die sub() trotzdem aus der formel aufgerufen werden?..."
Nein, das wäre wie von hinten durch die Brust.
mfg Sven

AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 19:23:56
ransi
HAllo Dirk
Eine Function kann nur die Zelle beschreiben in der sie steht.
Aber um bei deinem Beispiel zu bleiben.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Function myMatrixformula(base As Integer) As Variant
Dim J As Integer
Dim I As Long
Dim retval(4, 4) As Variant
For I = 0 To 4
    For J = 0 To 4
        retval(I, J) = base ^ I
    Next J
Next I
myMatrixformula = retval
End Function

Du musst diese Matrix nicht auf einmal in die Tabelle schreiben.
Du kanst gezielt auf die Zeilen und Spalten dieser Matrix losgehen.
Tabelle1

 ABCDEF
111111#BEZUG!
222222#BEZUG!
344444#BEZUG!
488888#BEZUG!
51616161616#BEZUG!
6#BEZUG!#BEZUG!#BEZUG!#BEZUG!#BEZUG!#BEZUG!

Formeln der Tabelle
ZelleFormel
A1=INDEX(MyMatrixformula(2); ZEILE(A1); SPALTE(A1))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Die Formel ist nach rechts und nach unten kopierbar.
Bei dieser Voregehnsweise kannst du auch auf den #BEZUG Fehler reagieren.
Der Holzhammer wäre da z.B. so:
Tabelle1

 ABCDEF
111111 
222222 
344444 
488888 
51616161616 
6      

Formeln der Tabelle
ZelleFormel
A1=WENN(ISTFEHLER(INDEX(MyMatrixformula(2); ZEILE(A1); SPALTE(A1)));
"";
INDEX(MyMatrixformula(2); ZEILE(A1); SPALTE(A1)))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
ransi

Anzeige
AW: Public Function - Ausgabe in anderer Zelle
05.04.2008 18:10:54
Dirk
ich bin auch noch darauf gestoßen, was genau mein problem beschreibt:
http://entwickler.com/itr/online_artikel/psecom,id,744,nodeid,56.html
ich wollte dies jedoch komplett in vba lösen und auf c++ verzichten (womit ich mich leider sowieso nicht auskenne). ;-)
any idea?
gruß,
dirk

Ja, das kann man auch mit VBA gestalten,...
06.04.2008 03:18:00
Luc:-?
...Dirk!
Die entscheidenden Hinweise sind in dem von dir verlinkten Artikel enthalten. Im Erscheinungsjahr des Artikels und danach habe ich so etwas selbst ausprobiert (ohne den Artikel zu kennen!); nur hatte ich das Worksheet_Change-Ereignis benutzt. Da du ja in VBA gut bist, müsstest du das auch hinbekommen.
Du benötigst dazu eine Routine, die die Daten bereitstellt und den Auswahlbereich des Blattes entsprechend vergrößert und dann .FormulaArray mit der ursprünglichen Formel füllt.
Deine UDF wird eigentlich nur als Auslöser eines entsprechenden Ereignisses und Übermittler von Parametern an globale Variablen gebraucht, die von der Subroutine benötigt wdn. Ein Direktaufruf der Subroutine aus der UDF heraus ist sinnlos - das muss die Ereignisprozedur machen, die Anhaltspkte braucht, damit diese Aktion nur bei dem gewünschten Ereignis ausgelöst wird. Ich lasse die UDF deshalb #1mp! (one moment please) zurückgeben. Diesen Wert liest die Ereignisprozedur und ruft daraufhin die Subroutine auf, die alles andere erledigt, auch einen erneuten Aufruf der UDF nachdem die Formel der Zelle, in der sie steht, auf den gesamten, nun erweiterten Bereich wie oben erwähnt übertragen wurde. Im Ergebnis erscheint dann deine Tabelle in allen diesen Zellen. So ungefähr wird das auch im o.g. Artikel gehandhabt.
Wenn das Ergebnis der UDF aber ganz woanders stehen soll und der Quellbezug später nicht mehr benötigt wird, entfällt die Formelübertragung und die von der Ereignisprozedur (das zeitweilige Ausschalten der Ereignisreaktion nicht vergessen!) aufgerufene Subroutine muss den Dateneintrag übernehmen. Dabei sollte die UDF nochmals angesprochen wdn, um einen anderen als den Startwert zurückzugeben (bspw leer). Bei der normalen xlEinstellung auf automatische Berechnung könnte es aber evtl trotzdem Probleme geben.
Auch sollte man solche unorthodoxen Methoden nicht über Gebühr strapazieren, damit ein berechnungsautomatisches xl durch allzu viele derartige Operationen nicht überfordert wird. Das hängt von der xlVersion und vor allem der Hardwarekonfiguration ab.
Gruß+schWE
Luc :-?

Anzeige
AW: Ja, das kann man auch mit VBA gestalten,...
06.04.2008 16:13:56
Dirk
hallo luc!
vielen dank für deine ausführliche antwort! das ganze leuchtet mir grundsätzlich ein, jedoch fehlt mir noch ein ansatzunkt, wie ich das umsetzen soll. es wäre mir eine große hilfe, wenn du mir ein rudimentäres beispiel posten könntest. die umsetzung im detail sollte mir nicht schwer fallen.
vielleicht hast du ja die zeit dafür!
danke!
dirk

Leider habe ich keine ganz einfachen...
08.04.2008 05:08:00
Luc:-?
...Bspp, Dirk,
nur 2 recht komplexe Lösungen, die jetzt wohl etwas zu umfangreich wären. Ich werde im Folgenden aber versuchen, dir einige wesentl Ausschnitte aus den Pgmm anzugeben.
Zuerst mal eine Bsp-UDF wie man sie auf der Basis (m)einer vorhandenen speziellen Subroutine für den Aufruf durch eine entsprechende Ereignisprozedur schreiben kann...
Die Beispielfunktion nutzt die von EvalXBox bereitgestellte Globalvariable cxBOX.
1. ValVbVar: Als Argument wird der Name einer globalen Konstanten (bzw Variablen) ü _ bergeben, deren Wert ermittelt werden soll.
Rem © LSr•CyWorX•xl•FXss 2007 Function ValVbVar(ByVal vbVar As String) As Variant ' Application.Volatile -nur bei Bedarf für permanente Neuberechnung ' XudF = "ValVbVar" -Fktname, entfällt b.Benutzung cxStandard ValVbVar If IsArray(vbVar) Then ValVbVar = CVErr(2023): cxBOX = "" ElseIf IsError(cxBOX) Then ValVbVar = cxBOX: cxBOX = "" ElseIf cxBOX = "" Then cxBOX = "exec;;" & vbVar 'nur bei Benutzung cxStdd-Exec-Proz ValVbVarExec, sonst… ' cxBOX = "exec;execprozname;" & vbVar -proznameExec o.`Exec´ angeben ValVbVar = "#1mp!" ElseIf Left(cxBOX, 4) "exec" Then ValVbVar = cxBOX: cxBOX = "" Else: ValVbVar = CVErr(2000): cxBOX = "" End If End Function


EvalXBox ist hier der Name der Subroutine, die die Hptarbeit leistet und auch bei mit ec=True parametriertem Aufruf die benötigte Ereignisprozedur (sowie eine für die o.gez. spez UDF benutzte Hilfsprozedur) generiert...
Ausschnitt für Prozedurgenerierung:


If ec Then
Set ws = ActiveWorkbook.ActiveSheet: j = -1
With ActiveWorkbook.VBProject
For Each cp In .VBComponents
If cp.Type = vbext_ct_Document Then j = j + 1
If j = ws.Index Then
With cp.CodeModule
If IsError(.ProcCountLines("Worksheet_Change", vbext_pk_Proc)) Then _
.CreateEventProc "Change", "Worksheet": ec = False
While .Lines(.ProcStartLine("Worksheet_Change", _
vbext_pk_Proc) + pz, 1)  "End Sub": pz = pz + 1: Wend
If ec Then
If InStr(.Lines(.ProcStartLine("Worksheet_Change", vbext_pk_Proc),  _
pz), "EvalXBox") = 0 Then _
.InsertLines .ProcStartLine("Worksheet_Change", vbext_pk_Proc) + _
pz, _
"    Rem --- Line inserted by FXss.EvalXBox on " & Date & "  _
---" & vbLf & _
"    Rem --- Locate right following line & activate by  _
removing ""'""! ---" & _
vbLf & "'    If Target.HasArray Or Target.Cells.Count = 1  _
Then " & _
"Call EvalXBox(Target)"
Else: .ReplaceLine .ProcStartLine("Worksheet_Change", vbext_pk_Proc) +  _
pz - 1, _
"    Rem --- Procedure generated by FXss.EvalXBox on " & Date &  _
" ---" & _
vbLf & "    If Target.HasArray Or Target.Cells.Count = 1 Then "  _
& _
"Call EvalXBox(Target)" & vbLf & "    Set Target = Nothing"
End If
End With
End If
If cp.Type = vbext_ct_StdModule And cp.Name = "cxModul" Then                     _
With cp.CodeModule
If IsError(.ProcCountLines("ValVbVarExec", vbext_pk_Proc)) Then
.InsertLines .CountOfLines + 1, vbLf & "Sub ValVbVarExec()" & _
vbLf & vbTab & "Rem --- Procedure generated by FXss.EvalXBox on  _
" & Date & " ---" & _
vbLf & vbTab & "On Error Resume Next" & vbLf & "    cxBOX = Chr( _
133)" & _
vbLf & vbTab & "Rem Platzhalter VbVar-Zuweisung" & vbLf & "End  _
Sub"
End If
px = True
End With
Exit For
End If
Next cp


Der folg Ausschnitt soll ungefähr andeuten wie die Subroutine auf das durch die UDF ausgelöste Ereignis reagiert. Im Original ist dieser Teil natürlich wesentlich länger, weil je nach dem Inhalt der Globalvariablen cxBOX verschiedene Verfahrensweisen (hier mit Keyword exec) selektiert und als Befehlstextstring in die zur obigen UDF gehörige generierte Rumpfprozedur übertragen wdn. diese wird an entsprechender Stelle mit Run aufgerufen.
Da du das Ganze aber für einen speziellen Zweck benötigst, kannst du hier deine speziellen _ Operationen einfügen. Dazu kann auch ein Ausdehnen einer Markierung und das Übertragen einer Formel nach .FormulaArray dieses Bereichs gehören. Es kommt hier auf eine genaue Überlegung an, was zuerst (beim 1.Auslösen der Subroutine durch die Ereignisprozedur) und was später (beim 2.Auslösen durch .Calculate der ActiveCell passieren soll. Alle anderen möglichen Auslösungen sind zu verhindern!


If cxBOX  "" Then                                                                      _
If .Cells(1) = "#1mp!" Then
GoSub bx
If IsArray(cxBOX) Then                                                           _
qi = UBound(cxBOX, 1) * UBound(cxBOX, 2) - 1
ReDim xy(qi): i = 0
For Each xb In cxBOX
xy(i) = xb: i = i + 1
Next xb
cxBOX = xy: .Calculate: GoTo ex
End If
If xba = 0 And .Cells(1) = "#1mp!" Then .Calculate
ElseIf .Cells(1)  "" Then
GoSub bx
End If
End If


Übrigens ist die eigentliche Aufgabe der Bsp-UDF, Variablenwerte aus VBA auszulesen; bspw auch die von xl- und vbKonstanten.
Vielleicht hilft dir das ja etwas weiter. Das Ausdehnen einer Zellmarkierung auf den exakt ermittelten Bereich einer einzufügenden Matrix ist hier nicht enthalten, aber auch nicht weiter schwierig. Du musst nur die Anzahl der Zeilen und Spalten sowie die Richtung bestimmen, in der das Einfügen erfolgen soll. Beim Abarbeiten von Feldern geht VBA nach vbStandard vor, bei dem von Bereichen nach den xlEinstellungen. Das kann ein einzufügendes Feld schonmal recht merkwürdig auf Zellen aufteilen. Aber das Problem ist lösbar!
So, na dann viel Spaß beim Probieren... ;-)
Falls es Probleme geben sollte (wie gesagt, das sind nur Ausschnitte, die erst vervollständigt wdn müssen, damit das Ganze fkt) kannst du dich ja noch mal melden. Ich könnte evtl noch den Text meiner Hilfedatei drauflegen, aber der wird dir vermutlich nicht viel weiter helfen. Auch habe ich 2007 auf Clever mal was dazu geschrieben (mit Codeausschnitten). Findest du da sicher noch im Archiv (unter Lucius).
Die ganze Konstruktion hat natürlich etwas andere Aufgaben als du sie hast, aber das Prinzip ist das Gleiche.
Gruß Luc :-?

Anzeige

212 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige