Relativer Verweis auf Excel Sheets

Einen wunderschönen Guten!

Ich hätte da mal ne Frage.

Problem: Berechnung der Wochenarbeitszeit vor dem Hintergrund, dass Monats- und Wochenbeginn äußerst selten auf den selben Tag fallen. Bedingt durch die Tatsache, dass auch jeder Monat eine anderen Namen hat, ist ein Verweis auf ein spezifisches Sheet meiner Meinung nach auch sinnfrei.

Frage: Ist es mit VB möglich eine relativen Verweis auf ein Sheet zu erstellen, z.b. vom aktuellen Sheet eine Sheet zurück, um anschliessend die dort angefallen Stunden der aktuellen Woche mit in den aktuellen Monat übernehmen zu können? Leider habe ich bisher keine Möglichkeit gefunden dies über eine Funktion - wie Offset zur relativen Verknüpfung von Zellen - zu lösen und wäre für Vorschläge bzw. Alternativen sehr dankbar.

Besten Dank im Voraus
Falcon

Grüezi Falcon

Problem: Berechnung der Wochenarbeitszeit vor dem Hintergrund,
dass Monats- und Wochenbeginn äußerst selten auf den selben
Tag fallen. Bedingt durch die Tatsache, dass auch jeder Monat
eine anderen Namen hat, ist ein Verweis auf ein spezifisches
Sheet meiner Meinung nach auch sinnfrei.

Wenn Du die jeweilige Summe immer in derselben Zelle berechnet spielen die Wochentage IMO keine Rolle mehr.

Frage: Ist es mit VB möglich eine relativen Verweis auf ein
Sheet zu erstellen, z.b. vom aktuellen Sheet eine Sheet
zurück, um anschliessend die dort angefallen Stunden der
aktuellen Woche mit in den aktuellen Monat übernehmen zu
können? Leider habe ich bisher keine Möglichkeit gefunden
dies über eine Funktion - wie Offset zur relativen
Verknüpfung von Zellen - zu lösen und wäre für Vorschläge
bzw. Alternativen sehr dankbar.

Es gibt zu diesem Zweck sogar eine Formel-Lösung, die aber relativ komplex ist. Nimm doch daher die folgenden Zeilen und kopiere sie in ein allgemeines Modul deiner Mappe. Dann kannst Du die Funktion VorNachTab() wie alle anderen auch in deinem Tabellenblatt verwenden:

Public Function VorNachTab(rngZelle As Range, \_
 Optional i As Integer = 0) As Variant

'© [email protected] / 22.07.2005 / 1.9.2006 / 28.01.2007
'liefert den Werte einer Zelle aus dem nächsten Tabellenblatt
'der Versatz im Index kann über den zweiten Parameter gegeben werden
'Beispiele: =VorNachTab(C2) / VorNachTab(C2;2) / VorNachTab(C2;-2)
'Vorsicht ist (einmal mehr) geboten bie 1904-Datumseinstellungen
'Die Funktion liefert dann die bekannte Verschiebung um 4 Jahre und 1 Tag
'
'Zur automatischen Aktualisierung im Tabellenblatt den folgenden Term
'anhängen: +(0\*JETZT()) und F9 drücken
'Also z.B. wie folgt: VorNachTab(C2;2)+(0\*JETZT())

 With Application.Caller.Parent
 If .Index + i \> .Parent.Sheets.Count Or .Index + i 

-- 
Mit freundlichen Grüssen

Thomas Ramel
- MVP für MS-Excel -

Hi Falcon,

Einen wunderschönen Guten!

dir auch.

Problem: Berechnung der Wochenarbeitszeit vor dem Hintergrund,
dass Monats- und Wochenbeginn äußerst selten auf den selben
Tag fallen.

Na und, ist mal so mal so.

Bedingt durch die Tatsache, dass auch jeder Monat
eine anderen Namen hat, ist ein Verweis auf ein spezifisches
Sheet meiner Meinung nach auch sinnfrei.

? Mir unklar was du damit meinst.

Frage: Ist es mit VB möglich eine relativen Verweis auf ein
Sheet zu erstellen, z.b. vom aktuellen Sheet eine Sheet
zurück, um anschliessend die dort angefallen Stunden der
aktuellen Woche mit in den aktuellen Monat übernehmen zu
können?

Ja.
(Ja=es geht, einfach eine Schleife über alle Blätter laufen lassen,
beim aktiven Blatt halt den Wert aus dem Blatt davor nehmen. Aber bin zu müde, Lösung morgen wenn es nicht schon jmd. anderes gelöst hat)

Gruß
Reinhard

Servus Thomas,

danke für die schnelle Antwort!

Grüezi Falcon

Problem: Berechnung der Wochenarbeitszeit vor dem Hintergrund,
dass Monats- und Wochenbeginn äußerst selten auf den selben
Tag fallen. Bedingt durch die Tatsache, dass auch jeder Monat
eine anderen Namen hat, ist ein Verweis auf ein spezifisches
Sheet meiner Meinung nach auch sinnfrei.

Wenn Du die jeweilige Summe immer in derselben Zelle berechnet
spielen die Wochentage IMO keine Rolle mehr.

Dadurch, dass die Wochentage des Vormonats in unterschiedlichen Zeilen der gleichen Spalte stehen und ich bei unvollständigen Wochen keine Zwischensumme bilde, käme es auch nicht in Frage.

Frage: Ist es mit VB möglich eine relativen Verweis auf ein
Sheet zu erstellen, z.b. vom aktuellen Sheet eine Sheet
zurück, um anschliessend die dort angefallen Stunden der
aktuellen Woche mit in den aktuellen Monat übernehmen zu
können? Leider habe ich bisher keine Möglichkeit gefunden
dies über eine Funktion - wie Offset zur relativen
Verknüpfung von Zellen - zu lösen und wäre für Vorschläge
bzw. Alternativen sehr dankbar.

Es gibt zu diesem Zweck sogar eine Formel-Lösung, die aber
relativ komplex ist. Nimm doch daher die folgenden Zeilen und
kopiere sie in ein allgemeines Modul deiner Mappe. Dann kannst
Du die Funktion VorNachTab() wie alle anderen auch in deinem
Tabellenblatt verwenden:

Public Function VorNachTab(rngZelle As Range, _
Optional i As Integer = 0) As
Variant

[email protected] / 22.07.2005 / 1.9.2006 / 28.01.2007
'liefert den Werte einer Zelle aus dem nächsten Tabellenblatt
'der Versatz im Index kann über den zweiten Parameter gegeben
werden
'Beispiele: =VorNachTab(C2) / VorNachTab(C2;2) /
VorNachTab(C2;-2)
'Vorsicht ist (einmal mehr) geboten bie
1904-Datumseinstellungen
'Die Funktion liefert dann die bekannte Verschiebung um 4
Jahre und 1 Tag

'Zur automatischen Aktualisierung im Tabellenblatt den
folgenden Term
'anhängen: +(0*JETZT()) und F9 drücken
'Also z.B. wie folgt: VorNachTab(C2;2)+(0*JETZT())

With Application.Caller.Parent
If .Index + i > .Parent.Sheets.Count Or .Index + i

Leider funst das bei mir nicht so wirklich. Muß dazu sagen, dass ich nicht wirklich ein VB Könner bin und es vermutlich kein großer Akt sein sollte.

Hab die Funktion in ein Modul meiner Arbeitsmappe eingefügt und mit dem Aufruf
VorNachTab (C3)
in meinem Sub eingebaut. Seine Antwort: „Argument ist nicht optional!“
Wenn ich noch nen zweiten Parameter eingeben will z.b.
VorNachTab (C3;-2)
erhalte ich die Fehlermeldung: „Erwarte Listenzeichen oder )!“
Vermutlich is der Funktionsaufruf falsch… könntest Du mir nochmal nen Schubs in die richtige Richtung geben?

Merci
Falcon


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo,

Hab die Funktion in ein Modul meiner Arbeitsmappe eingefügt
und mit dem Aufruf
VorNachTab (C3)
in meinem Sub eingebaut. Seine Antwort: „Argument ist nicht
optional!“
Wenn ich noch nen zweiten Parameter eingeben will z.b.
VorNachTab (C3;-2)
erhalte ich die Fehlermeldung: „Erwarte Listenzeichen oder )!“
Vermutlich is der Funktionsaufruf falsch… könntest Du mir
nochmal nen Schubs in die richtige Richtung geben?

ich habe keine Ahnung von VBA und Excel, aber etwas von VB.

Wenn Du in VB/VBA Funktionen aufrufst und Parameter übergibst, musst Du auf die Syntax achten. Es kommt darauf an, ob Du einen wert zurück bekommst und den verarbeitest. Ich schreibe mal Beispiele, achte auf die Klammern!

a = Funktion (Parameter)
Funktion Parameter
Call Funktion (Parameter)

Wenn Du eine Klammer schreibst, wo sie nicht hin gehört oder umgekehrt bekommst Du Deinen Fehler. Eventuell hilft Dir das ja.

Gruß, Rainer

Hallo Falcon

Public Function VorNachTab(rngZelle As Range, \_
Optional i As Integer = 0) As Variant
With Application.Caller.Parent
If .Index + i \> .Parent.Sheets.Count Or .Index + i 



> Hab die Funktion in ein Modul meiner Arbeitsmappe eingefügt  
> und mit dem Aufruf  
> VorNachTab (C3)  
> in meinem Sub eingebaut. Seine Antwort: "Argument ist nicht  
> optional!"


In der Function wird als 2 Parameter ein optionaler Parameter erwartet. Unter VB und VBA eigentlich auch, bedeutet dies, das du ihn angeben kannst. Musst aber nicht! Gibst du ihn nicht an, so wird der Standard Wert genommen, welcher in dem Falle 0 ist!

Ich selbst habe eigentlich keine Kentnisse unter VBA. Aber dafür ein wenig in VB. VB und VBA unterscheiden sich nur in manchen Sachen!
Die Fehlermeldung kann ich mir auch nicht erklären :/
Kann es sein das es irgendeine Einstellung ist, die quer schlaegt?
Desweiteren faellt mir auf, das du als Trennzeichen zwischen den Parametern das ; genutzt hast. Unter VB verwendet man überlicherweise das , (Komma). 



> Wenn ich noch nen zweiten Parameter eingeben will z.b.  
> VorNachTab (C3;-2)  
> erhalte ich die Fehlermeldung: "Erwarte Listenzeichen oder )!"  
> Vermutlich is der Funktionsaufruf falsch... könntest Du mir  
> nochmal nen Schubs in die richtige Richtung geben?


Eine Sub führt einen Source aus und kann max. Werte aendern die Public sind oder halt ByRef uebergeben wurden! 
Eine Function führt einen Source aus und gibt einen Wert zurueck!
In dem Falle gibt sie "CVErr(xlErrRef)" zurueck. Was auch immer das sein mag. Ich habe keine Ahnung :s Jedoch ist dies vom Datentyp Variant! Kann evtl. sein das die Function, dir den Sheet zurueckgibt

Versuche mal folgendes. Rufe eine Sub XYZ auf und schreibe in diese mal folgenden Source 

Dim vRet as Variant
vRet =VorNachTab(C2)
'Mal schauen was vRet nun ist
vRet = VorNachTab(C2,1)
'wenn der Aufruf nicht geht, dann halt
vRet=VorNachTab(C2;1)



> Merci  
> Falcon


MfG Alex

Grüezi Falcon

Ich hatte geschrieben:

Nimm doch daher die folgenden Zeilen
und kopiere sie in ein allgemeines Modul deiner Mappe. Dann
kannst Du die Funktion VorNachTab() wie alle anderen auch in
deinem Tabellenblatt verwenden:

Leider funst das bei mir nicht so wirklich. Muß dazu sagen,
dass ich nicht wirklich ein VB Könner bin und es vermutlich
kein großer Akt sein sollte.

Und Du sagst nun:

Hab die Funktion in ein Modul meiner Arbeitsmappe eingefügt
und mit dem Aufruf
VorNachTab (C3)
in meinem Sub eingebaut. Seine Antwort: „Argument ist nicht
optional!“
Wenn ich noch nen zweiten Parameter eingeben will z.b.
VorNachTab (C3;-2)
erhalte ich die Fehlermeldung: „Erwarte Listenzeichen oder )!“
Vermutlich is der Funktionsaufruf falsch… könntest Du mir
nochmal nen Schubs in die richtige Richtung geben?

Dann schubse ich dich mal aufs Tabellenblatt :wink:

Die Funktion ist dazu ausgelegt in einem Tabellenblatt verwendet zu werden, nicht aus VBA heraus - das hatte ich aber sowohl in meiner Antwort, als auch im Kommentar der Funktion IMO klar geschrieben.

In VBA ist das nämlich so nicht notwendig, da Du jedes Tabellenblatt über dessen Index direkt ansprechen kannst und auch den Index des aktiven Blattes ermitteln.

Für den Gebrauch in VBA müsste die Funktion umgeschrieben werdne, resp. musst Du klar(er) Auskunft darüber geben was genau du denn tun willst.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Servus!

Grüezi Falcon

Ich hatte geschrieben:

Nimm doch daher die folgenden Zeilen
und kopiere sie in ein allgemeines Modul deiner Mappe. Dann
kannst Du die Funktion VorNachTab() wie alle anderen auch in
deinem Tabellenblatt verwenden:

Leider funst das bei mir nicht so wirklich. Muß dazu sagen,
dass ich nicht wirklich ein VB Könner bin und es vermutlich
kein großer Akt sein sollte.

Und Du sagst nun:

Hab die Funktion in ein Modul meiner Arbeitsmappe eingefügt
und mit dem Aufruf
VorNachTab (C3)
in meinem Sub eingebaut. Seine Antwort: „Argument ist nicht
optional!“
Wenn ich noch nen zweiten Parameter eingeben will z.b.
VorNachTab (C3;-2)
erhalte ich die Fehlermeldung: „Erwarte Listenzeichen oder )!“
Vermutlich is der Funktionsaufruf falsch… könntest Du mir
nochmal nen Schubs in die richtige Richtung geben?

hmmm… da hat mich wohl Dein Verweis auf „ein allgemeines Modul deiner Mappe“ etwas vom rechten Pfad abgebracht. :smile: Aber das hätten wir ja jetzt geklärt, danke.

Dann schubse ich dich mal aufs Tabellenblatt :wink:

Die Funktion ist dazu ausgelegt in einem
Tabellenblatt verwendet zu werden, nicht aus
VBA heraus - das hatte ich aber sowohl in meiner Antwort, als
auch im Kommentar der Funktion IMO klar geschrieben.

Ja… wie gesagt… mein mangelndes Verständnis für VBA, sorry.

In VBA ist das nämlich so nicht notwendig, da Du jedes
Tabellenblatt über dessen Index direkt ansprechen kannst und
auch den Index des aktiven Blattes ermitteln.

Für den Gebrauch in VBA müsste die Funktion umgeschrieben
werdne, resp. musst Du klar(er) Auskunft darüber geben was
genau du denn tun willst.

Okay, ich werd’s mal versuchen… Ich will eine Buchführung über meine Arbeitsstunden. Die ermittelte Arbeitszeit pro Tag in einer Wochensumme angeben, um die Einhaltung meiner Wochenarbeitszeit auf einen Blick feststellen zu können. Bei einem Monatswechsel (z.b. Januar-Februar) soll mittels Befehlschaltfläche das aktuelle Sheet (Januar) kopiert werden, alle Eingabewerte gelöscht und unter dem Namen des Folgemonats (Februar) gespeichert werden. Da wie in meinem ersten Artikel erwähnt ein Monat auch mal mit z.b. Freitag anfangen kann bräuchte ich die im Vormonat (Januar) von Montag bis Donnerstag abgeleisteten Arbeitsstunden um die Summe der im Februar endende Woche bilden zu können. … klar soweit?

Deine VorNachTab Funktion erfüllt auch genau den von mir gewünschten Zweck und nachdem ich meinen Fehler bezüglich Modul/Tabellenblatt behoben hatte hat’s auch einwandfrei funktioniert. Ich hab sowohl die Anzeigehilfe für geforderte Parameter bekommen als ich bei „=VorNachTab(“ angekommen war und meine Funktion auch als Benutzerdefinierte Funktion beim Funktionsassitenten gefunden. So… und an diesem Punkt hat die Erfolgsgeschichte dann auch ein Ende. Keine Ahnung was passiert is aber seitdem ich versuche die Funktion für meine Zwecke zu verwenden

ActiveCell.FormulaR1C1 = „=SUM(R[-6]C[-1]:RC[-1])+VorNachTab(R[25]C,1))“

funktionier es nicht mehr. Die Eingabe „=VorNachTab(C3)“ liefert nur noch ein „#Name?“ anstatt des Tabellenwertes und im Funktionsassitenten wird sie auch nicht mehr angezeigt.(Im übrigen kann ich keine selbst definierte Funktion mehr verwenden welche über eine Eingabe im Tabellenblatt aufgerufen wird.) Da ich an der Funktion nichts mehr verändert habe, muß ich davon ausgehen, dass die Verbindung zwischen dem Code und der Exceloberfläche in irgendeiner Form beeinträchtig is. Oder ich checks einfach nicht :wink:.

So oder so… es hat funktioniert und ich würd’s gerne Einbaun… hast Du ne Idee wie ich die Funktion so wieder zum laufen bekomme? Bzw. könntest Du mir die VBA Alternative näher erläutern?

Besten Dank
Falcon


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Falcon

Okay, ich werd’s mal versuchen… Ich will eine Buchführung
über meine Arbeitsstunden. Die ermittelte Arbeitszeit pro Tag
in einer Wochensumme angeben, um die Einhaltung meiner
Wochenarbeitszeit auf einen Blick feststellen zu können. Bei
einem Monatswechsel (z.b. Januar-Februar) soll mittels
Befehlschaltfläche das aktuelle Sheet (Januar) kopiert
werden, alle Eingabewerte gelöscht und unter dem Namen des
Folgemonats (Februar) gespeichert werden.

Hmm, warum so umständlich?
Füge ein vorformatiertes Tabellenblatt, das ev. unsichtbar in der Mappe mitgeführt wird, ein und lege das neue Startdatum fest.
Auf diese Weise bist Du viel flexibler wenn es Änderungen gibt, da Du sie nicht im VBA-Code berücksichtigen musst…

Deine VorNachTab Funktion erfüllt auch genau den von mir
gewünschten Zweck und nachdem ich meinen Fehler bezüglich
Modul/Tabellenblatt behoben hatte hat’s auch einwandfrei
funktioniert. Ich hab sowohl die Anzeigehilfe für geforderte
Parameter bekommen als ich bei „=VorNachTab(“ angekommen war
und meine Funktion auch als Benutzerdefinierte Funktion beim
Funktionsassitenten gefunden. So… und an diesem Punkt hat
die Erfolgsgeschichte dann auch ein Ende. Keine Ahnung was
passiert is aber seitdem ich versuche die Funktion für meine
Zwecke zu verwenden

ActiveCell.FormulaR1C1 =
„=SUM(R[-6]C[-1]:RC[-1])+VorNachTab(R[25]C,1))“

funktionier es nicht mehr. Die Eingabe „=VorNachTab(C3)“
liefert nur noch ein „#Name?“ anstatt des Tabellenwertes und
im Funktionsassitenten wird sie auch nicht mehr angezeigt.(Im
übrigen kann ich keine selbst definierte Funktion mehr
verwenden welche über eine Eingabe im Tabellenblatt
aufgerufen wird.) Da ich an der Funktion nichts mehr
verändert habe, muß
ich davon ausgehen, dass die Verbindung zwischen dem Code und
der Exceloberfläche in irgendeiner Form beeinträchtig is.

Ist der Code denn noch in einem Modul der Mappe drin?
Oder hast Du ihn vielleicht sonstwohin verschoben?

#NAME! ist eigentlich nur dann das Ergebnis, wenn die Funktion nicht gefunden wird.

In einem vorbereiteten Tabellenblatt könntest Du die Formel ja auch bereits mit drin stehen haben und bräuchtest sie nicht mit VBA in die Zellen zu schreiben…


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Halli, hallo!

Hmm, warum so umständlich?
Füge ein vorformatiertes Tabellenblatt, das ev. unsichtbar in
der Mappe mitgeführt wird, ein und lege das neue Startdatum
fest.
Auf diese Weise bist Du viel flexibler wenn es Änderungen
gibt, da Du sie nicht im VBA-Code berücksichtigen musst…

Hmm… kein Zweifel das es eine einfachere Lösung geben würde, aber ich wollte ein bißchen mit VBA rum spielen und würde das Ganze jetzt nur sehr ungern scheitern sehen :smile:

Ist der Code denn noch in einem Modul der Mappe drin?
Oder hast Du ihn vielleicht sonstwohin verschoben?

Jup,… der Code steht in meinem Muster-Sheet meines VBA-Projekts… habs auch mal mit der Arbeitsmappe direkt probiert, leider ohne Erfolg.

#NAME! ist eigentlich nur dann das Ergebnis, wenn die Funktion
nicht gefunden wird.

Ja, soweit hat mir die Excel-Hilfe auch weitergeholfen, aber ich kann mir das Ganze nicht erklären. Meiner Meinung nach muss etwas zwischen der automatischen Übernahme der Funktion in das Formelportfolio von Excel schief gelaufen sein. Gibt es da ne Möglichkeit manuel Benutzerdefinierte Funktionen in Excel einzubetten? Oder gibt es ein Feature zur Verwaltung der Funktionen in dem ich etwas geändert haben könnte?

In einem vorbereiteten Tabellenblatt könntest Du die Formel ja
auch bereits mit drin stehen haben und bräuchtest sie nicht
mit VBA in die Zellen zu schreiben…

Ich hoffe Du hast noch ne Idee… oder kennst Du ein Tutorial wo Schritt für Schritt die Erstellung einer Funktion geschildert wird. Evtl. kann könnte ich ja so rausfinden was ich falsch gemacht hab.

Grüße
Falcon


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Falcon

Hmm, warum so umständlich?
Füge ein vorformatiertes Tabellenblatt, das ev. unsichtbar in
der Mappe mitgeführt wird, ein und lege das neue Startdatum
fest.
Auf diese Weise bist Du viel flexibler wenn es Änderungen
gibt, da Du sie nicht im VBA-Code berücksichtigen musst…

Hmm… kein Zweifel das es eine einfachere Lösung geben
würde, aber ich wollte ein bißchen mit VBA rum spielen und
würde das Ganze jetzt nur sehr ungern scheitern sehen :smile:

OK, kein Problem, alles ist statthaft und die Begründung gefällt mir :smile:

Ist der Code denn noch in einem Modul der Mappe drin?
Oder hast Du ihn vielleicht sonstwohin verschoben?

Jup,… der Code steht in meinem Muster-Sheet meines
VBA-Projekts… habs auch mal mit der Arbeitsmappe direkt
probiert, leider ohne Erfolg.

Ja, das kann und wird so nicht funktionieren.

Ich hatte geschrieben, dass die Code-Zeilen in ein ‚allgemeines Modul‘ der Mappe gehören - nicht ins Modul des Tabellenblattes und nicht in ‚Diese Arbeitsmappe‘.

Erzeuge also ein neues Modul (oder benutze ein bereits bestehendes) und füge den Code dort ein, dann klappt das schon.

Gibt es da ne Möglichkeit manuel Benutzerdefinierte
Funktionen in Excel einzubetten?

Ja, eben indem der Funkction-Code in einem Modul der Mappe gespeichert wird - der Rest ist dann automatisch so und Du bindest deine neue Funktion in der Rubrik ‚benutzerdefiniert‘ wieder.

Ich hoffe Du hast noch ne Idee… oder kennst Du ein Tutorial
wo Schritt für Schritt die Erstellung einer Funktion
geschildert wird. Evtl. kann könnte ich ja so rausfinden was
ich falsch gemacht hab.

Schau dir den folgenden Link mal näher an, damit dürfte dann einiges klarer werden:

http://www.online-excel.de/excel/singsel_vba.php?f=44


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -