Herbers Excel-Forum - das Archiv

cells(y,x)= mit Fehler in public function

Bild

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
Bild

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
Bild

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

Bild

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
Bild

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
Bild

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
Bild

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
Bild

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
Bild

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
Bild

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
Bild

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
Bild

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
Bild

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
 Bild
Excel-Beispiele zum Thema "cells(y,x)= mit Fehler in public function"
Fehlermeldung #NV ausblenden Fehlermeldung abfangen
Fehler in Workbook_Open-Prozedur abfangen Fehlermeldung #DIV/0! verhindern
Fehler entfernen Fehlermeldung abfangen und in sequentielle Datei schreiben
Fortlaufende Suche unter Vermeidung eines Laufzeitfehlers VBA-Fehlermeldungen auflisten
Alle Zellen mit der #BEZUG!-Fehlermeldung auswählen Zahlenstring mit Formel auslesen und Fehlermeldung verhindern