Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
148to152
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
148to152
148to152
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Direktmodus läuft, Excel nicht

Direktmodus läuft, Excel nicht
20.08.2002 16:00:49
Ralph Ewers
Schönen Guten Nachmittag!

Ich habe da ein seltsames Problem. Meine Funktion läuft wunderbar im Direktfenster, aber bei identischem Aufruf ('Umrechnung("VJ"; AE"; "EUR"; 3)' aus Excel heraus bekomme ich einen #WERT!-Fehler.

Kurzbeschreibung:

Datenreihe (bspw. AE) in Array einlesen [Auflaufwerte], Monatswerte errechnen und mittels Mischkursen (ebenfalls Array) monatsweise auf andere Währung konvertieren, anschließend summieren und Ergebnis ausgeben.

"VJ" ist die Tabelle mit der Datenreihe, "AE" das umrzurechnende Objekt aus der Tabelle, "EUR" die Zielwährung und "3" die Anzahl der lfd. Monate.

Was habe ich übersehen?

Danke für jeglichen Tip!
Nachmittäglichen Gruß
Ralph

--

Dim Fehlermeldung As String
Dim i As Single
Dim Perfcardwert(1 To 12), PerfcardwertFX(1 To 12), Monatseinzelwert(1 To 12), Mischkurs(1 To 12)
Public Function Umrechnung(Tabelle, Umrobjekt, Kurs, aktMonat)
' On Error GoTo Fehler:

Set Kursblatt = Workbooks("PerfCard.xls").Worksheets("Mischkurse") 'Referenz auf Mischkursblatt
Set Datenblatt = Workbooks("PerfCard.xls").Worksheets(Tabelle) 'Referenz auf Datenblatt

'Debug.Print Tabelle, Umrobjekt, Kurs, aktMonat

'
'Variablen & Arrays initialisieren
'

For i = 1 To 12
Fehlermeldung = "Okay" 'Änderung nur bei Fehler in Ablauf
Mischkurs(i) = 0 'Umrechnungskurs(e)
Perfcardwert(i) = 0 'PerfCard-Werte in Landeswährung (Auflauf)
Monatseinzelwert(i) = 0 'PerfCard-Werte in Landeswährung (Monatseinzel)
PerfcardwertFX(i) = 0 'umgerechnete Monatseinzelwerte
Next i

'
' Mischkurse einlesen
'

Kursblatt.Activate
For i = 1 To aktMonat
Kursblatt.Range("A:A").Find(Kurs).Activate 'Erste Zelle in Mischkurszeile aktivieren
Set Monatskurs = ActiveCell.Offset(0, i + 1) 'Erster Mischkurs-Wert in Spalte 3
Mischkurs(i) = Monatskurs.Value 'Mischkurs-Array füllen
If Mischkurs(i) = 0 Then Fehlermeldung = "Mischkurs fehlt"
'
Debug.Print "Mischkurs: "; i; Mischkurs(i)
Next i

Debug.Print 'Zeilenumbruch

'
' Daten in Landeswährung einlesen
'

Datenblatt.Activate
For i = 1 To aktMonat
Datenblatt.Range("A:A").Find(Umrobjekt).Activate 'Erste Zelle in Datenzeile aktivieren
Set Monatswert = ActiveCell.Offset(0, i + 1) 'Erster Datenwert in Spalte 3
Perfcardwert(i) = Monatswert.Value 'Datenarray füllen (-> Auflaufwerte <-)
If i > 1 Then '1. Datenwert kann leer sein - kein Fehler
If Perfcardwert(i) = 0 Then Fehlermeldung = "Quelldaten fehlen"
End If
'Debug.Print i; Perfcardwert(i)
Next i

'
'Monatseinzelwerte errechnen
'

For i = 1 To aktMonat
Select Case i
Case 1
If Perfcardwert(1) = 0 Then 'Oktoberwert leer...
Monatseinzelwert(1) = Perfcardwert(2) / 2 '...dann halber Novemberwert
Else 'Oktoberwert vorhanden...
Monatseinzelwert(1) = Perfcardwert(1) '... daher normale Zuweisung
End If
Case 2
If Perfcardwert(1) = 0 Then 'Kein Oktoberwert...
Monatseinzelwert(i) = Perfcardwert(2) / 2 '... dann halber Novemberwert
Else
Monatseinzelwert(i) = Perfcardwert(i) - Perfcardwert(i - 1) 'sonst normale Zuweisung
End If
Case 3 To 12
Monatseinzelwert(i) = Perfcardwert(i) - Perfcardwert(i - 1) 'Auflaufwert ./. Vormonat
Case Else
Fehlermeldung = "Sonstiger Fehler" ' Fehler - keine Zuweisung
End Select
Debug.Print i; "Monatseinzelwert"; Monatseinzelwert(i); "Perfcardwert"; Perfcardwert(i)
Next i

'
'Landeswährung umrechnen auf gewählte Darstellung
'

For i = 1 To aktMonat
PerfcardwertFX(i) = Monatseinzelwert(i) * Mischkurs(i)
Debug.Print "PerfcardwertFX("; i; "): "; PerfcardwertFX(i)
Next i

'
'Summe bilden
'

Perfcardsumme = 0 'Ergebnbisvariable löschen

For i = 1 To aktMonat
Perfcardsumme = Perfcardsumme + PerfcardwertFX(i) 'Einzelwerte aufsummieren
Debug.Print "Perfcardsumme ("; i; "): "; Perfcardsumme
Next i

'
'Rückmeldung der Funktion
'

Select Case Fehlermeldung
Case "Okay"
Umrechnung = CSng(Perfcardsumme) 'Funktion gibt umgerechnete Summe zurück
Exit Function 'und wird beendet
Case Else
GoTo Fehler 'Verzweigung zur Fehlerroutine
End Select


Fehler:
If Err.Number = 0 Then
Umrechnung = CStr(Fehlermeldung) 'Fehlermeldung aus Prozedur
Else
Umrechnung = Err.Number 'Excel-Fehlermeldung
End If

End Function

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: Direktmodus läuft, Excel nicht
20.08.2002 17:00:51
Hans W. Hofmann
Hallo Ralf,

zu Deiner Funktion gibt es eine Menge zusagen, z.B.
- Der Bezug ActiveCell.Offset(0, i + 1) ist totaler Murks. Eine Funktion kann und sollte sich nicht auf ActiveCell abstützen, sondern den Parameter im Kopf übergeben erhalten.
- Die Funktion soll im Tabellenblatt eingesetzt werden? Dann hat sie keinen Bezug auf Zellen und wird auch nie mehr berechnet, weil sich die Eingangswerte nie ändern. Damit wäre Set Kursblatt = Workbooks("PerfCard ... (uä. jeder externe Verweis auf Range) auch kontraproduktiv - gehört in den Funktionskopf als Übergabe.

Ohne vollständige Analyse...

Gruß HW


Anzeige
Re: Direktmodus läuft, Excel n
20.08.2002 17:15:51
Ralph Ewers
Hallo Hans,

Active.Cell paßt hier schon, da ich vorher die entsprechende Zelle über den "Find"-Befehl selektiere. Und daß die Eingangsdaten fest sind, liegt daran, daß ich noch teste. Später werden die Daten latürnich variabel übergeben (aber dazu muß erst mal die Funktion an sich funktionieren).

Ist sicherlich alles nicht so elegant, aber für's erste VBA-Programm ... ;-)

Gruß
Ralph

Re: Direktmodus läuft, Excel n
20.08.2002 17:57:16
Hans W. Hofmann
Nein, es passt nicht.
Weil es in einer Funktion kein .Find und kein .Selection gibt. Das Objektmodell von VBA lässt sich nicht austricksen: Trage Deine Funktion mal in ein Tabellenblatt ein - setzte einen Breakpoint - und trace mal den Programmcode. Du wird Dein blaues Wunder erleben...
Das Hauptproblem Deiner Funktion ist, dass sie nur einmal - bei der Eingabe berechnet wird - und dann nie wieder - schade um die Arbeit...
Find ~ WorksheetFunction.Match(Umrobjekt, Datenblatt, 0)

Take it or leave it ;-)

Gruß HW

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige