Funktion '=Jahr(heute())' als Jahreszahl erkennen

Hallo mal wieder,
ich habe eine Kalenderübersicht, die das aktuelle Jahr über die Funktion „=Jahr(heute())“ anzeigt. Jetzt suche ich per Makro die Spalte, in der 2008 steht, damit ich dort Einträge machen kann. Sobald aber die Formel drin steht und nicht mehr die absolute Zahl 2008, erkennt VBA das nicht mehr und findet keine Jahreszahl. Was kann ich tun?

Vielen Dank
Tina

Hallo Tina.

Schicke doch 'mal den „verantwortlichen“ VBA-Code. Vielleicht muß nur eine einzige Zeile geändert werden.

Viele Grüße
Carsten

ich habe eine Kalenderübersicht, die das aktuelle Jahr über
die Funktion „=Jahr(heute())“ anzeigt. Jetzt suche ich per
Makro die Spalte, in der 2008 steht, damit ich dort Einträge
machen kann. Sobald aber die Formel drin steht und nicht mehr
die absolute Zahl 2008, erkennt VBA das nicht mehr und findet
keine Jahreszahl. Was kann ich tun?

Moin Tina,

wieso wird „2008“ nicht gefunden, suchst du in der falschen Zeile?

Sub tt()
Dim Spa As Long
Range("C5").FormulaLocal = "=Jahr(Heute())"
For Spa = 1 To 256
 If Cells(5, Spa).Value = "2008" Then MsgBox Spa
Next Spa
End Sub

Gruß
Reinhard

Hallo Carsten

Schicke doch 'mal den „verantwortlichen“ VBA-Code. Vielleicht
muß nur eine einzige Zeile geändert werden.

'\*\*\*In meine Zieldatei eintragen
With Workbooks("Zieldatei").Worksheets("Quartalsübersicht")
 ZeiP = Awf.Match("Q1", .Columns(4)) + 1
QZeile = 3
If xString(4, x) \> 2007 Then

SpaQ1 = Awf.Match((xString(4, x)), Rows(1), 0) '\*\*\*xString(4,x) ist meine Jahreszahl
 SpaQ1 = SpaQ1 + (Month(wksM.Cells(4, 10)) - 1)
SpaQ2 = Awf.Match((xString(4, x)), .Rows(ZeiP - 2), 0)
 SpaQ2 = SpaQ2 + (Month(wksM.Cells(ZeiM, SpaM)) - 1)

xString(4,x) habe ich vorher aus meiner Quelldatei als Jahreszahl ausgelesen, in diesem Beispiel ist der Wert 2008. Awf habe ich vorher als Application.WorksheetFunction definiert. Reicht Dir das?

Viele Grüße
Carsten

Viele Grüße zurück
Tina

Hallo Tina.

'***In meine Zieldatei eintragen
With Workbooks(„Zieldatei“).Worksheets(„Quartalsübersicht“)
ZeiP = Awf.Match(„Q1“, .Columns(4)) + 1
QZeile = 3
If xString(4, x) > 2007 Then

SpaQ1 = Awf.Match((xString(4, x)), Rows(1), 0)
'***xString(4,x) ist meine Jahreszahl
SpaQ1 = SpaQ1 + (Month(wksM.Cells(4, 10)) - 1)
SpaQ2 = Awf.Match((xString(4, x)), .Rows(ZeiP - 2), 0)
SpaQ2 = SpaQ2 + (Month(wksM.Cells(ZeiM, SpaM))

xString(4,x) habe ich vorher aus meiner Quelldatei als
Jahreszahl ausgelesen, in diesem Beispiel ist der Wert 2008.
Awf habe ich vorher als Application.WorksheetFunction
definiert. Reicht Dir das?

Ich weiß noch nicht genau. „xString“ legt jedenfalls schon 'mal die Vermutung nahe, daß Du die Jahreszahl als Datentyp „Zeichenfolge“ vorliegen hast. Besser wäre hier der Datentyp „Long“ (lange Ganzzahl).
Damit wäre die Codezeile

If xString(4, x) \> 2007 Then

von der Logik her richtig, da ja hier eine Berechnung bzw. ein Vergleich stattfindet.

Du könntest diese Zeile abändern in

If CLng(xString(4, x))\> 2007 then

und es dann noch einmal versuchen.

Die Anweisung (bzw. Funktion) „CLng“ wandelt den Wert von „xString“ in eine Zahl um. Dies führt natürlich zu einem Fehler, wenn „xString“ eine Zeichenfolge wie z.B „Hallo“ enthält. Besser wäre auf jeden Fall die Deklaration der Variablen im richtigen Datentypen.

Erstmal soweit.
Viele Grüße
Carsten

Hallo Tina.

Ich weiß noch nicht genau. „xString“ legt jedenfalls schon
'mal die Vermutung nahe, daß Du die Jahreszahl als Datentyp
„Zeichenfolge“ vorliegen hast. Besser wäre hier der Datentyp
„Long“ (lange Ganzzahl).
Damit wäre die Codezeile

If xString(4, x) > 2007 Then

von der Logik her richtig, da ja hier eine Berechnung bzw. ein
Vergleich stattfindet.

Du könntest diese Zeile abändern in

If CLng(xString(4, x))> 2007 then

und es dann noch einmal versuchen.

Die Anweisung (bzw. Funktion) „CLng“ wandelt den Wert von
„xString“ in eine Zahl um. Dies führt natürlich zu einem
Fehler, wenn „xString“ eine Zeichenfolge wie z.B „Hallo“
enthält. Besser wäre auf jeden Fall die Deklaration der
Variablen im richtigen Datentypen.

Hallo Carsten,
genau das war das Problem: Ich hatte xString als Variant definiert, weil sowohl Zeichenfolgen als auch Zahlen vorkommen und somit hat er „2008“ ausgelesen und den Wert dann nicht gefunden! Vielen Dank!
Jetzt habe ich noch eine Frage: Wie kann ich vermeiden, dass ich eine Fehlermeldung der Funktion erhalte, wenn das Jahr nicht in der Kalenderübersicht ist?

Viele Grüße
Tina

Erstmal soweit.
Viele Grüße
Carsten

Moin Tina,

wieso wird „2008“ nicht gefunden, suchst du in der falschen
Zeile?

Sub tt()
Dim Spa As Long
Range(„C5“).FormulaLocal = „=Jahr(Heute())“
For Spa = 1 To 256
If Cells(5, Spa).Value = „2008“ Then MsgBox Spa
Next Spa
End Sub

Danke, hatte hier xString als Zeichenfolge ausgelesen und somit den Wert „2008“ erhalten und nicht die Zahl. Das hat er dann nicht gefunden. Aber jetzt habe ich gleich das nächste Problem: Wenn meine Jahreszahl größer als 2012 ist, ist sie nicht der Übersicht, was aber vorkommen kann, dann erhalte ich eine Fehlermeldung. Möchte aber einfach nur einen Null-Wert erhalten. Geht das?

Viele Grüße und Danke
Tina

Gruß
Reinhard

dann nicht gefunden. Aber jetzt habe ich gleich das nächste
Problem: Wenn meine Jahreszahl größer als 2012 ist, ist sie
nicht der Übersicht, was aber vorkommen kann, dann erhalte ich
eine Fehlermeldung. Möchte aber einfach nur einen Null-Wert
erhalten. Geht das?

Moin Tina,

Dim c As Range
Set c = Rows(1).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ1 = c.Column + Month(wksM.Cells(4, 10)) - 1
Set c = .Rows(ZeiP - 2).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ2 = c.Column + Month(wksM.Cells(ZeiM, SpaM)) - 1

Gruß
Reinhard

Moin Tina,

Dim c As Range
Set c = Rows(1).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ1 = c.Column +
Month(wksM.Cells(4, 10)) - 1
Set c = .Rows(ZeiP - 2).Find(CInt(xString(4, x)),
LookIn:=xlValues)
If Not c Is Nothing Then SpaQ2 = c.Column +
Month(wksM.Cells(ZeiM, SpaM)) - 1

Bin ich zu doof? Grrr-Brett vorm Kopf!
Jetzt erhalte ich immer c = Nothing

Grüße
Tina

Dim c As Range
Set c = Rows(1).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ1 = c.Column +
Month(wksM.Cells(4, 10)) - 1
Set c = .Rows(ZeiP - 2).Find(CInt(xString(4, x)),
LookIn:=xlValues)
If Not c Is Nothing Then SpaQ2 = c.Column +
Month(wksM.Cells(ZeiM, SpaM)) - 1

Bin ich zu doof? Grrr-Brett vorm Kopf!
Jetzt erhalte ich immer c = Nothing

Hi Tina,

bei was denn? Du wolltest in Spa 0 haben oder die Spaltenzahl, das macht doch mein Code. Wozu brauchst du nochmals c wenn du schon Spa hast ?

C ist Nothing oder die Fundzelle als Range.

Gruß
Reinhard

Dim c As Range
Set c = Rows(1).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ1 = c.Column +
Month(wksM.Cells(4, 10)) - 1
Set c = .Rows(ZeiP - 2).Find(CInt(xString(4, x)),
LookIn:=xlValues)
If Not c Is Nothing Then SpaQ2 = c.Column +
Month(wksM.Cells(ZeiM, SpaM)) - 1

Bin ich zu doof? Grrr-Brett vorm Kopf!
Jetzt erhalte ich immer c = Nothing

Hi Tina,

bei was denn? Du wolltest in Spa 0 haben oder die Spaltenzahl,
das macht doch mein Code. Wozu brauchst du nochmals c wenn du
schon Spa hast ?

C ist Nothing oder die Fundzelle als Range.

Hallo Reinhard,
stehe ich jetzt total auf dem Schlauch? Ich brauche c nicht, das hatte ich verstanden, aber weil er bei

Set c = Rows(1).Find(CInt(xString(4, x)), LookIn:=xlValues)

immer c = Nothing hat, führt er den Code gar nicht weiter aus. Den Fall

 If Not c Is Nothing 

tritt bei mir ja gar nicht ein???
Vielleicht muss ich mal von der Leitung steigen? Oder kannst Du mir nochmal helfen?

Grüße
Tins

Gruß
Reinhard

stehe ich jetzt total auf dem Schlauch? Ich brauche c nicht,
das hatte ich verstanden, aber weil er bei

Set c =
Rows(1).Find(CInt(xString(4, x)),
LookIn:=xlValues)

immer c = Nothing hat, führt er
den Code gar nicht weiter aus. Den Fall

If Not c
Is Nothing

tritt bei mir ja gar nicht ein???

hallo Tina,

ist aus der Ferne sehr schwer einzuschätzen wodran das hakt.

Grundsätzlich ist es so, als benutzer sieht man in der Zelle z.B.
4711 km
Für Excel ist das vielleicht der String „4711 km“, vielleicht auch nur die Zahl 4711 der durch Formatierung " km" angehängt wurde oder so.

mal „km“ weglassend, für Find, Match usw. ist das ein Unterschied ob da eine Zahl oder ein String steht.

dafür gibt es in Vba mit CInt, CLong, Cstr usw. umzuwandeln.

Wenn du nach CStr(„2008“) suchst und für Excel steht da eine zahlin der Zelle so wird das nicht gefunden.

An der richtigen Umsetzung dessen was Carsten richtig sagte und ich versuchte hapert es irgendwie noch.

Probier mal mit dem nachstehenden Code rum indem du in die Zelle verschiedene Datentypen eintragen läßt und schaust, wann was gefunden wird.

Und grundsätzlich ist es für potentielle helfer viel besser, du schreibst wie ich hier komplette eigenständige Prozeduren, wo man genau sieht was denn nun xString(4,x) beinhaltet, welchen Wert x hat usw.

Wenn dir unklar ist, welcher variablenztyp in einer Zelle oder variablen steht, benutze sowas da zum Testen im Code:

Msgbox typename(range(„A235“)
Msgbox typename(xString(4,x))

Kann auch nametype heißen, verwechsel ich grundsätzlich sehr oft :smile:

Option Explicit
'
Sub tt()
Dim c As Range, xString(4, 5) As String, x, SpaQ1 As Long
x = 5
Rows(235).ClearContents
xString(4, x) = "2008"
Set c = Rows(235).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ1 = c.Column
MsgBox SpaQ1
End Sub
'
Sub tt2()
Dim c As Range, xString(4, 5) As String, x, SpaQ1 As Long
x = 5
Range("Z235") = "2008"
xString(4, x) = "2008"
Set c = Rows(235).Find(CInt(xString(4, x)), LookIn:=xlValues)
If Not c Is Nothing Then SpaQ1 = c.Column
MsgBox SpaQ1
End Sub

Gruß
Reinhard

Hallo Tina.

Jetzt habe ich noch eine Frage: Wie kann ich vermeiden, dass
ich eine Fehlermeldung der Funktion erhalte, wenn das Jahr
nicht in der Kalenderübersicht ist?

Das könntest Du entweder durch eine Fehlerbehandlungsroutine erreichen oder durch eine zusätzliche If-Then-Abfrage.

Wenn ich den Code zugrunde lege, den Du geschickt hast, könnte eine If-Then-Abfrage an der folgenden Stelle theoretisch schon Deine Bedingung erfüllen:

If CLng(xString(4, x)) \>= [hier die Jahreszahl eintragen] Then Exit Sub
If CLng(xString(4, x)) \> 2007 Then

Wenn die Zahl größer oder gleich dem Wert ist (den Du dort noch eintragen mußt), dann wird die Prozedur verlassen.

Oder Du verwendest sie so:

If CLng(xString(4, x)) \>= [hier die Jahreszahl eintragen] Then
 'Hier Code einfügen, der bestimmt, was gemacht werden soll
 Exit Sub
End If
If CLng(xString(4, x)) \> 2007 Then

Oder Du verwendest eine Fehlerbehandlungsroutine. Die sieht prinzipiell so aus:

Private Sub Irgendwas()
 On Error GoTo Fehler' Verzweige bei einem Fehler zur Sprungmarke "Fehler"
 'Dein Code
Ende:
 'Eventuell noch weiterer Code
 Exit Sub
Fehler:
 'Eventuell Code, der nach einem Fehler ausgeführt wird
 Resume Ende' Fehlerbehandlung beenden und zur Sprungmarke "Ende" verzweigen
End Sub

Vielleicht hilft Dir das ja schon weiter.
Viele Grüße
Carsten

So, habe alles probiert, komme einfach nicht auf den Fehler:
Habe jetzt mal alles in diese Datei rein:

http://www.hostarea.de/server-08/August-2cb199e4b2.xls

Dieses blöde c ist und bleibt „nothing“, ganz egal, was ich mache…

Könntet Ihr mal reinschauen?? Vielleicht ist es ja jetzt besser verständlich?

Wie immer vielen Dank
Tina

Hallo Tina.

Das könntest Du entweder durch eine Fehlerbehandlungsroutine
erreichen oder durch eine zusätzliche If-Then-Abfrage.

Wenn ich den Code zugrunde lege, den Du geschickt hast, könnte
eine If-Then-Abfrage an der folgenden Stelle theoretisch schon
Deine Bedingung erfüllen:

If CLng(xString(4, x)) >= [hier die Jahreszahl eintragen]
Then Exit Sub
If CLng(xString(4, x)) > 2007 Then

Wenn die Zahl größer oder gleich dem Wert ist (den Du dort
noch eintragen mußt), dann wird die Prozedur verlassen.

Oder Du verwendest sie so:

If CLng(xString(4, x)) >= [hier die Jahreszahl eintragen]
Then
'Hier Code einfügen, der bestimmt, was gemacht werden soll
Exit Sub
End If
If CLng(xString(4, x)) > 2007 Then

Genauso habe ich es jetzt erst mal gelöst! Danke!

Oder Du verwendest eine Fehlerbehandlungsroutine. Die sieht
prinzipiell so aus:

Private Sub Irgendwas()
On Error GoTo Fehler’ Verzweige bei einem Fehler zur
Sprungmarke „Fehler“
'Dein Code
Ende:
'Eventuell noch weiterer Code
Exit Sub
Fehler:
‚Eventuell Code, der nach einem Fehler ausgeführt wird
Resume Ende‘ Fehlerbehandlung beenden und zur Sprungmarke
„Ende“ verzweigen
End Sub

Vielen Dank, auch das konnte ich gut gebrauchen!

Vielleicht hilft Dir das ja schon weiter.
Viele Grüße
Carsten

Langfristig gesehen würde ich das Ganze natürlich gerne automatisieren… In meiner Quartalsansicht möchte ich immer gerne das aktuelle Jahr + 2 Jahre anzeigen und damit ändert sich meine „If Then“-Bedingung natürlich jedes Jahr. Aber auf alle Fälle geht es jetzt mal so!

Herzlichen Dank für Deine Unterstützung!!
Tina

http://www.hostarea.de/server-08/August-2cb199e4b2.xls

Dieses blöde c ist und bleibt „nothing“, ganz egal, was ich
mache…

Moin Tina,

welcher Code soll denn geprüft werden? Die eine Sub Quart muß man eh umbenennen weil es sie doppelt gibt, aber egal ob Phasen oder Quart, überall sind Fehler.

Welche Sub gilt denn nun, und welches Quartalsblatt? Es macht die Angelegenheit nicht einfacher zu durchschauen wenn da in jedem die Jahre in anderen Zeilen stehen.

Mußt keine Datei hochladen, es reicht ja wenn du das hier so beantwortest und dabei sagst welcher Code denn nun gilt.

Gruß
Reinhard

welcher Code soll denn geprüft werden? Die eine Sub Quart muß
man eh umbenennen weil es sie doppelt gibt, aber egal ob
Phasen oder Quart, überall sind Fehler.

Hallo Reinhard,
hast ja Recht, hätte ich vielleicht dazu schreiben sollen, dachte, Du kennst den anderen Code, Sub Quart ist doch von Dir?! Mein Code ist Sub Phasen und die dazugehörige Ansicht ist Quartalsübersicht 4

Welche Sub gilt denn nun, und welches Quartalsblatt? Es macht
die Angelegenheit nicht einfacher zu durchschauen wenn da in
jedem die Jahre in anderen Zeilen stehen.

Anfängerfehler meinerseits, sollten immer in Zeile 1 stehen. Liegt es nur daran? muss natürlich so rows(2) heißen… Aber in der ursprünglichen Tabelle steht das Jahr in Zeile 1 und er findet es nicht…

Grüße zurück
Tina

Hallo Tina,

welcher Code soll denn geprüft werden? Die eine Sub Quart muß
man eh umbenennen weil es sie doppelt gibt, aber egal ob
Phasen oder Quart, überall sind Fehler.

hast ja Recht, hätte ich vielleicht dazu schreiben sollen,
dachte, Du kennst den anderen Code, Sub Quart ist doch von
Dir?!

schon, aber nicht so wie sie da steht und nicht doppelt *glaub*
Und ja, ich hatte seinerzeit ein neues Blatt eingefügt auf das sich mein Code bezog und dann dort möglicherweise auch die Suchzeile verändert weil da ja auch Spaltenanzahlsänderungen pro Quartal usw. miteinzubauen waren und ich somit sowieso die tabellenstruktur verändert hatte.
Dann habe ich diesen Code mit diesem Blatt getestet und er hat funktioniert.
Natürlich kracht er bei einem anderen Blattaufbau.

Grundsätzlich zu Suchfunktionen wie find, match, sonstwas. Für die stellt der Suchbegriff etwas Bestimmtes dar als DatenTyp, die zu durchsunden zelle hat einen Inhalt der für sie auch einen bestimmten datentyp darstellt, das wird miteinander verglichen.
Und wenn ich du in einer Zelle den Eintrag
2008
sehen und nach
2008
suchen lassen, so heißt das noch lange nicht daß es gefunden wird, obwohls für uns gleich „aussieht“

Bei find kann man ja nach der Suche auswerten mit
If not c is nothing o.ä. ob was gefunden wurde oder nicht um einen Laufzeitfehler zu vermeiden, bei Match nicht, wenn Match nix findet gibt es einen nicht abfangbaren laufzeitfehler.

Deshalb geht man bei Benutzung von Match so vor, daß man erstaml mit Countif zählt ob der Begriff überhaupt gefunden wird, wenn ja schickt man Match los. (CountIf entspricht Zählenwenn und hat auch dessen Parameterreihenfolge)
Prinzipiell dann immer so:

If awf.countif() \>0 Then
 Spa=awf.match()
else
 Msgbox "Begriff nicht gefunden"
End If

Mein Code ist Sub Phasen und die dazugehörige Ansicht
ist Quartalsübersicht 4

Okay, ich schaue mal.

Welche Sub gilt denn nun, und welches Quartalsblatt? Es macht
die Angelegenheit nicht einfacher zu durchschauen wenn da in
jedem die Jahre in anderen Zeilen stehen.

Anfängerfehler meinerseits, sollten immer in Zeile 1 stehen.
Liegt es nur daran? muss natürlich so rows(2) heißen… Aber
in der ursprünglichen Tabelle steht das Jahr in Zeile 1 und er
findet es nicht…

Kann ich so nix zu sagen warum da nix gefunden wird, viele Gründe möglich.

Gruß
Reinhard

Grundsätzlich zu Suchfunktionen wie find, match, sonstwas. Für
die stellt der Suchbegriff etwas Bestimmtes dar als DatenTyp,
die zu durchsunden zelle hat einen Inhalt der für sie auch
einen bestimmten datentyp darstellt, das wird miteinander
verglichen.
Und wenn ich du in einer Zelle den Eintrag
2008
sehen und nach
2008
suchen lassen, so heißt das noch lange nicht daß es gefunden
wird, obwohls für uns gleich „aussieht“

Ach ja, und dann soll noch mal einer sagen, Frauen sind unlogisch…

Bei find kann man ja nach der Suche auswerten mit
If not c is nothing o.ä. ob was gefunden wurde oder nicht um
einen Laufzeitfehler zu vermeiden, bei Match nicht, wenn Match
nix findet gibt es einen nicht abfangbaren laufzeitfehler.

Deshalb geht man bei Benutzung von Match so vor, daß man
erstaml mit Countif zählt ob der Begriff überhaupt gefunden
wird, wenn ja schickt man Match los. (CountIf entspricht
Zählenwenn und hat auch dessen Parameterreihenfolge)
Prinzipiell dann immer so:

If awf.countif() >0 Then
Spa=awf.match()
else
Msgbox „Begriff nicht gefunden“
End If

o.k. ich werde es so testen, vielen Dank!! Habe aber frühestens Sonntag Zeit.

Kann ich so nix zu sagen warum da nix gefunden wird, viele
Gründe möglich.

Das ist das schöne an VBA… Auch wenn ich’s genial finde!

Vielen Dank wie immer!
Tina

Hallo Tina,

Und wenn ich du in einer Zelle den Eintrag
2008
sehen und nach
2008
suchen lassen, so heißt das noch lange nicht daß es gefunden
wird, obwohls für uns gleich „aussieht“

Ach ja, und dann soll noch mal einer sagen, Frauen sind
unlogisch…

würde ich nie sagen, bin ja Gentleman,
ich formuliere das mal so und hoffe dabei auf die Evolution, in 10.000 Jahren ( ist ja noch 5 Millionen jahre Zeit bis die Erde in die Sonne stürzt) oder halt nie, hat jeder Mann in seinen Geburtsgenen neben dem Gen was erzeugt daß er logisch denken kann auch ein Gen was erzeugt daß er, der Chaosforschung folgend entstandende Gedankegänge anderer Spezies seiner Gattung irgenwie auch nur im Ansatz als logisch empfinden kann. *wegduck* :smile:
Außerdem hast du mit dem Thema angefangen *ch binnichtschuldwieimmer*

o.k. ich werde es so testen, vielen Dank!! Habe aber
frühestens Sonntag Zeit.

das ist sehr gut, ich habe mir deine Datei aufgrund deiner neuen Infos um was es eigentlich geht noch gar nicht angesehen und wenn du erst am Sonntag dich darum kümmerst, dann erinner mich bitte am Montag daraan, daß ich mal nach der Datei schauen wollte *lächel*

Gruß
Reinhard