If Then per VBA
#1
Hallo Ihr Lieben,

hoffe Ihr könnt mir wieder mal weiter helfen.

Habe in der Zelle A2 des Tabellenblatts 2 stehen: =Tabelle1!C10 (Tabelle1!C10 beinhaltet eine Auswahlbox, wo die Monate ausgewählt werden können.)
Nun soll per VBA folgendes passieren:

Wenn im der Zelle A2 das Ergebnis Januar ist, dann soll er zur Zelle ... scrollen,
wenn dort Februar raus kommt, dann zur Zelle... usw.
Mein Code sieht folgendermaßen aus, aber funzt nicht  Huh

Sheets("Antrag neu").Select
   If Cells(2, 1).Value = "Jahr gesamt" Then Cells(10, 3).Value
   If Cells(2, 1).Value = "Januar" Then Cells(10, 3).Value
   If Range("A2").Value = "Februar" Then Cells(10, 34).Value
   If Cells(2, 1).Value = "März" Then Cells(10, 63).Value
   If Cells(2, 1).Value = "April" Then Cells(10, 94).Value
   If Cells(2, 1).Value = "Mai" Then Cells(10, 124).Value
   If Cells(2, 1).Value = "Juni" Then Cells(10, 155).Value
   If Cells(2, 1).Value = "Juli" Then Cells(10, 185).Value
   If Cells(2, 1).Value = "August" Then Cells(10, 216).Value
   If Cells(2, 1).Value = "September" Then Cells(10, 247).Value
   If Cells(2, 1).Value = "Oktober" Then Cells(10, 277).Value
   If Cells(2, 1).Value = "November" Then Cells(10, 308).Value
   If Cells(2, 1).Value = "Dezember" Then Cells(10, 338).Value
End If

Irgendwas fehlt, aber ich weiß nicht was...

HIIIILFFFEEE...

LG.
Peggy
Top
#2
Hallo Peggy,

ersetze .Value am jeweiligen Zeilenende durch .Select . Wink

Gruß Uwe
Top
#3
Moin,

beispielsweise so:
Code:
Sub GMG_Sprung()
  Dim strZiel As String
  Sheets("Antrag neu").Select   'Wieso?
  Select Case Sheets("Antrag neu").Cells(2, 1)
  Case "Jahr gesamt", "Januar"
     strZiel = "C10"
  Case "Februar"
     strZiel = "AH10"
  Case "März"
     strZiel = "BK10"
  '...
  End Select
  Application.Goto Reference:=Worksheets("Antrag neu").Range(strZiel), Scroll:=True
End Sub
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top
#4
Hallo auch von mir!

1. Da "Jahr gesamt" identisch mit "Januar" ist braucht es dies ja nicht in der Datenüberprüfung.
2. Wenn mich meine Logik nicht im Stich lässt (Tagesliste in Zeile 10 ab Spalte C), dann reicht dies im Modul der Tabelle:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" Then Cells(10, CDate([A2] & "/1/2015") - 42002).Select
End Sub

Datei im Anhang.

Gruß Ralf


Angehängte Dateien
.xlsm   Monatssprung.xlsm (Größe: 15,77 KB / Downloads: 1)
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#5
Hi Ralf,

(22.09.2015, 10:00)RPP63 schrieb: 2. Wenn mich meine Logik nicht im Stich lässt (Tagesliste in Zeile 10 ab Spalte C), dann reicht dies im Modul der Tabelle

coole Lösung, schön kurz!
Top
#6
Hallöchen,

ich würde zur Ermittlung der Spalte diese Konstrukt verwenden:

DateDiff("d", [c10], CDate([a2] & "/" & Month([c10]) & "/" & Year([c10]))) + 3

Das hat den Vorteil, dass es unabhängig vom Jahr ist, da selbiges aus dem Eintrag von C10 entnommen wird. Der Code gilt damit auch noch nächstes Jahr oder wann immer er gebraucht wird Smile
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#7
Hallo André!
Obwohl unsere Peggymaus gerne Fragen stellt, aber trotz funktionierender Antworten kein Feedback gibt,  :s mal drei Anmerkungen zu Deiner Lösung (Punkt 1 editiert):

  1. Du gehst davon aus, dass in Zeile 10 Daten stehen, vielleicht sind es ja auch Zahlen von 1-31.
  2. Datediff("d",Anfang, Ende) ist ... ein wenig ... überdimensioniert, Ende - Anfang macht doch das Gleiche?  :21:
  3. Du verwendest das Format "d/m/y". Auch wenn es im deutschsprachigem Raum funktioniert, würde ich in VBA immer "m/d/y" verwenden.
Ich hab mir nochmal Gedanken gemacht.
Um auch in Schaltjahren korrekte Ergebnisse zu bekommen, kann man das Jahr entweder in eine Zelle schreiben (und dann per Dim j As Integer, j = [A1] zuweisen) oder wie folgend fest im Code verdrahten.
Den Austausch des Jahres in einer neuen Datei dürfte dann auch ein Laie hinbekommen:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Const j As Integer = 2015
If Target.Address = "$A$2" Then Cells(10, CDate([A2] & "/1/" & j) - DateSerial(j, 1, -2)).Select
End Sub

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#8
Hallo Ralf,

(1) da hab ich mich erst mal an das Beispiel gehalten. Ich könnte mir auch durchaus vorstellen, dass bei Auswahl eines Monats auch in dessen Zeile gesprungen werden soll und nicht immer nur in die Juni-Zeile. Eventuell steht das Datum im Projekt ja auch als "Überschriftenzeile" ...

(2) überdimensioniert? ich hab die Anzahl Zeichen jetzt nicht gezählt :22: (ich weiß schon ...)

(3) dann wird mein Ansatz aber länger :22:
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#9
Hi André!
Zitat:(ich weiß schon ...)  :22:

Nö, ich gehöre nicht zu denjenigen, die nach jedem eingesparten Code-Byte einen Freudenhüpfer machen.  :19:
Im Gegenteil: Für mich ist (neben der Performance) wichtig, dass der Code lesbar und auch nach Jahren noch nachvollziehbar ist.
In Produktiv-Codes spare ich auch nicht mit dem Hochkomma resp. REM.
Dennoch: Datediff mit dem Argument "d" ist flüssiger als Wasser.  :21:

In der Literatur wird z.B. davon abgeraten, [A1] zu nehmen, da dies unperformant ist.
Da pfeife ich drauf, wenn es nur um einen Evaluate geht.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#10
Hallo, Ralf & André;
die VBA-Notation [A1] statt Range("A1") hat tatsächlich nur 2 Nachteile:
1. bei großen Datenmengen nachweisbare geringere Performance,
2. Adressen können nur direkt angegeben, nicht zusammengesetzt werden.
Bei kleinen Datenmengen ist 1. idR irrelevant und nur 2. könnte ein Grund sein, darauf zu verzichten.
Ein 3. und ggf entscheidender Grund käme hinzu, wenn eine solche Konstruktion in einer UDF, die in einer Zellformel verwendet werden soll, benutzt würde. Allerdings ist hier festzustellen, dass ein [A1] bzw Evaluate("A1") anders funktioniert als bspw ein Evaluate("A1+B1"). Während hier der einzelne Zellwert oder auch ganze Zellbereiche im Direktaufruf problemlos in allen Fällen, auch bei Evaluierung der kompletten UDF, verarbeitet werden, würde die Evaluierung einer UDF, die eine evaluierte Berechnung enthält (also der 2.Fall), nicht funktionieren, weil innerhalb einer Evaluierung nicht noch einmal evaluiert werden kann.
Folglich muss festgestellt werden, dass die Evaluierung einer Adressangabe keine echte Auswertung, sondern nur einen Zellwertabruf bewirkt. Sie ist deshalb nicht mit einer echten Formeltextauswertung vergleichbar, die im Falle des Standards (Application.)Evaluate sogar 2mal durchgeführt wird. Möglicherweise ist das bei []-Notation auch so und der Zellwert wird (überflüssigerweise) 2mal abgerufen.
Allerdings sollte innerhalb von UDFs auch kein fixer Zellbereich verwendet werden, so dass sich der 3.Nachteil allein auf die UDF-interne Verwendung von Evaluate beschränken würde.
Gruß, Castor
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste