Excel-Funktion dynamisch erstellen

Basster

Mitglied
Moin moin,

ich habe folgendes Problem:

Ich habe eine Tabelle mit Abrechnungsdaten und eine Tabelle mit Abrechnungsdaten des Vorjahres (als Beispiel: blanko & blanko_VJ)
Da ich diese Blätter (also auch die Namen der Datenblätter) dynamisch erstellen lasse, muss ich auch zum Abfragen der Vorjahreswerte dynamisch vorgehen.
Dazu habe ich mir eine Funktion gebaut, die mir wenn ich z.B. eingebe
VJBlatt(C6) den Wert des Vorjahresblattes von C6 liefern soll (eigentlich logisch, oder?)
Die Funktion sieht so aus:
Code:
Public Function VJBlatt(Bereich As Range)
    Dim xWert As String
    Dim yWert As String
    Dim wksactive As String
    wksactive = ActiveSheet.Name
    For Each Zelle In Bereich
        xWert = Bereich.Cells.Column
        yWert = Bereich.Cells.Row
        VJBlatt = "=" + wksactive + "_VJ!" + Chr(xWert + 64) + yWert
    Next Zelle
End Function
Diese Funktion liefert was sie soll, jedoch leider nur als Text :( Und so steht in meiner Zelle "=blanko_VJ!C6" (natürlich ohne die Anführungszeichen ;-))
Wie bekomme ich es jetzt noch hin, dass dieser String als Formel interpretiert wird. Muss ich da noch irgendwo nen Formula einbauen? Und wenn ja, wo? *ratlossei*

THX für die Mühe im voraus

Basster
 
Wenn ich Dich richtig verstanden habe, steht jetzt in der Zielzelle der Pfad zur Quellzelle als String. Versuche doch einfach stur nach dem Zuweisungsprinzip "Ziel = Quelle" vorzugehen. Also etwa Zielzelle = Sheets(wksactive + "_VJ").Range(Chr(xWert + 64) + yWert)
 
Entweder Funktion oder Wert als Rückgabe, nicht beides!

So wie du das machst, hat es aus meiner Sicht überhaupt keinen Sinn:
Du möchtest, dass in einer Zelle eine Funktion steht, die wiederum eine Funktion ausgibt, die dann endlich einen Wert zurückgibt, dies ist in einigen Programmiersprachen Möglich, bei VB aber nicht; außerdem ist dies hier auch nicht notwendig.
Es gibt nun zwei Möglichkeiten:

1.) du erstellst eine FUNKTION, die eine bestimmte Zelle ausliest, zum Beispiel so:
Code:
Public Function VJBlatt(Bereich As Range)
    Dim xWert As Integer
    Dim yWert As Integer
    Dim wksactive As String
    wksactive = ActiveSheet.Name & "_VJ"
    For Each Zelle In Bereich
        xWert = Bereich.Cells.Column
        yWert = Bereich.Cells.Row
        VJBlatt = Worksheets(wksactive).Cells(yWert, xWert).Value
    Next Zelle
End Function
[aus meiner Sicht, dass was du meinst!]

2.) du erstellst eine PROZEDUR (SUB), die in die betreffenen Zelle eine Funktion schreibt, also mit:
Code:
.FormulaR1C1 = wksactive & "!" & Chr(xWert + 64) & yWert

Beide Lösungen führen zum Gleichen Ergebnis!
Kleiner Tipp: Es ist Glücklicher, wenn du Strings mit dem &- symbol und nicht mit dem +- Symbol verknüpftst!

gruß
thekorn
 
Danke für die Antworten, aber ich hab's gestern dann doch noch so gelöst:
Code:
Public Function VJBlatt(Bereich As Range)
    Dim zielpfad As String
    Dim wks As Worksheet
    Dim erg As String
    Dim xWert As Integer
    Dim yWert As Integer
    xWert = Bereich.Column
    yWert = Bereich.Row
    zielSheet = Sheets(ActiveSheet.Index - 1).Name
    Set wks = Worksheets(zielSheet)
    erg = wks.Cells(yWert, xWert)
    VJBlatt = erg
End Function

Da der _VJ Sheet per vorhergehender Programmierung nur VOR dem eigentlichn Berechnungsblatt stehen kann.

Trotzdem Danke!
 

Neue Beiträge

Zurück