Herbers Excel-Forum - das Archiv
cells(y,x)= mit Fehler in public function
Betrifft: cells(y,x)= mit Fehler in public function
von: talljohn
Geschrieben am: 26.12.2006 14:31:36
Hallo Experts,
wenn ich
Worksheets("Daten").cells(1,1)=123
in einer public function aufrufe, endet das mit Fehler 1004.
Woran liegt's? Geht das überhaupt und wie in einer public function?
Dank und Gruß,
Johannes
Betrifft: AW: cells(y,x)= mit Fehler in public function
von: Nepumuk
Geschrieben am: 26.12.2006 14:40:07
Hallo Johannes,
wie lautet denn der Fehlertext? 1004 gibst es nämlich in vielen Varianten.
Gruß
Nepumuk
Betrifft: AW: cells(y,x)= mit Fehler in public function
von: Herby
Geschrieben am: 26.12.2006 16:19:53
Hallo Johannes,
unabhängig ob Public oder Private ist das Ziel einer Funktion aus dem ggf. mitgegebenen Argument ein Ergebnis zu ermitteln. Dieses Ergebnis wird nach Beendigung der Funktion über den Funktionsnamen zurückgegeben.
Beispiel ohne Argument
Public
Function Wer() as String
Wer = Application.UserName
End Function
Beispiel mit Argument
Public
Function Inhalt(Zelle As Range) As String
Application.Volatile
Inhalt = CStr(Zelle.Value)
End Function
Wenn Du wie in Deinem Beispiel den Wert einer Zelle ändern willst, funktioniert das im allgemeinen nicht über eine Funktion, sondern über eine Prozedur:
Sub test()
Worksheets("Daten").cells(1,1)=123
End Sub
Diese Prozedur kann Public oder Private sein. Mit Public kannst Du diese Prozedur von allen Modulen aus aufrufen. Mit Private kannst Du den Aufruf auf das Modul begrenzen, in dem sich diese
Sub befindet.
Viele Grüße
Herby
Betrifft: AW: cells(y,x)= mit Fehler in public function
von: talljohn
Geschrieben am: 26.12.2006 22:14:39
Danke, Herby,
sollte wohl noch erwähnen, dass ich diese public function zur Berechnung einer Zelle nutze, dort also als "selbstdefinierte Funktion" aufrufe, die natürlich ein Ergebnis zurückgeben soll, aber gleichzeitig ein paar Zwischenergebnisse in ein paar andere Zellen schreiben sollte. Das geht wohl partout nicht.
Johannes
Betrifft: Function und Procedure
von: Herby
Geschrieben am: 26.12.2006 22:41:50
Hallo Johannes,
die UDF kannst du von der Tabelle aus aufrufen. Damit hast Du das Endergebnis. Die Zwischenergebnisse kannst Du ggf. über eine Procedure in der Du auch die UDF verwenden kannst, auch in anderen Zellen anzeigen lassen. Anbei ein kleines Beispiel:
https://www.herber.de/bbs/user/39193.xls
Viele Grüße
Herby
Betrifft: AW: Function und Procedure
von: Nepumuk
Geschrieben am: 27.12.2006 05:57:42
Hallo Johannes,
es ist, ohne einen kleinen Trick, nicht möglich andere Zellen aus einer UDF heraus zu ändern.
Gruß
Nepumuk
Betrifft: AW: Function und Procedure
von: Herby
Geschrieben am: 27.12.2006 13:21:10
Hallo Nepumuk,
Du hast mich neugierig gemacht. Rufst Du aus einer Funktion eine Prozedur auf, die dann die Einträge in den anderen Zellen vornimmt ?
Ich habs probiert, aber es klappt nicht.
Danke vorab für das Knowhow.
Viele Grüße
Herby
Betrifft: AW: Function und Procedure
von: Nepumuk
Geschrieben am: 27.12.2006 15:14:58
Hallo Herby,
klar mach ich das. Ich lass mich doch von Excel nicht vergackeiern.
Gruß
Nepumuk
Betrifft: AW: Function und Procedure
von: Herby
Geschrieben am: 27.12.2006 17:46:14
Hallo Nepumuk,
ich habs mal so probiert:
Function Endergebnis(Zelle As Range) As Integer
Application.Volatile
Dim Wert As Integer
Endergebnis = CInt(Zelle.Value * 4)
If Zelle.Value > 9 Then
Wert = Zelle.Value
Call Zwischenergebnis(Wert)
End If
End Function
Sub Zwischenergebnis(ByRef Wieviel As Integer)
Range("D2").Value = Wieviel
End Sub
Schaut zwar super aus, aber funtkioniert nicht. Hast Du ne Idee was falsch sein könnte ?
Viele Grüße
Herby
Betrifft: AW: Function und Procedure
von: Nepumuk
Geschrieben am: 27.12.2006 17:55:58
Hallo Herby,
so geht's natürlich nicht, aber so:
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
Private Declare Function KillTimer Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long
Private Declare Function SetTimer Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"
Private Wert As Integer
Private hWnd As Long
Private Sub prcStartTimer()
hWnd = FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption)
SetTimer hWnd, 0&, 100&, AddressOf prcTimer
End Sub
Private Sub prcStopTimer()
KillTimer hWnd, 0&
End Sub
Private Sub prcTimer(ByVal hWnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
On Error Resume Next
Call prcStopTimer
Call Zwischenergebnis
End Sub
Function Endergebnis(Zelle As Range) As Integer
Endergebnis = Cint(Zelle.Value * 4)
If Zelle.Value > 9 Then
Wert = Zelle.Value
Call prcStartTimer
End If
End Function
Sub Zwischenergebnis()
Range("D2").Value = Wert
End Sub
Gruß
Nepumuk

 |
Betrifft: Was es nicht alles gibt !
von: Herby
Geschrieben am: 27.12.2006 18:32:28
Hallo Nepumuk,
Du hast mich soeben fertig gemacht. Dein Code sieht nicht nur schöner aus, er funktioniert auch noch. Muss ich die ganzen API-Aufrufe eigentlich verstehen.
Mit der UDF wird die prcStartTimer gestartet. Diese wiederum startet die prcTimer. Diese startet prcStopTimer und dann die Sub Zwischenergebnis. Kannst Du mir einen kleinen Überblick geben, was grob dahintersteckt ?
So langsam erhole ich mich wieder und sage Danke !
Herby
Betrifft: AW: Was es nicht alles gibt !
von: Nepumuk
Geschrieben am: 27.12.2006 19:11:40
Hallo Herby,
den Ablauf hast du ja schon verstanden. Der ganze Trick dabei ist, dass sich der Timer in einer externen DLL befindet und damit nicht von Excel kontrolliert werden kann. Mit OnTime würde es aus diesem Grund nicht funktionieren. Das heißt, die Ereigniskette wird unterbrochen und läuft unabhängig von der Funktion weiter. Das API - Gedöns muss du dabei nicht verstehen, Hauptsache es funktioniert. Oder?
Gruß
Nepumuk
Betrifft: AW: Was es nicht alles gibt !
von: Herby
Geschrieben am: 27.12.2006 22:00:25
Hallo Nepumuk,
ich hab mich zwar wieder etwas regeneriert (beim Abendessen)
und Deine geistige Nahrung aufgenommen aber noch nicht verdaut.
Ich sage Dir für dieses Knowhow herzlich D A N K E und
denke wieder einmal über den Satz nach "Ich weiss dass ich nichts weiss !"
Viele Grüße
Herby