Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1932to1936
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
Inhaltsverzeichnis

If Target.Address

If Target.Address
23.06.2023 17:08:35
Frank

Hallo Leute,
ich benötige mal wieder euer Fachwissen. Folgendes (simples) Vorhaben:
In Tabelle2 habe ich in A2 ein Drop-Downfeld mit den Einträgen Auswahl und den Monaten Januar bis Dezember. In Tabelle3 habe ich von A10:A375 ein Datum stehen, vom 01. Januar bis 01:Januar(A375 stimmt noch nicht, weil 2023 kein Schaltjahr ist). Ich möchte jetzt lediglich erreichen, wenn in Tabelle2!A2 0 Auswahl steht, dass die Zeilen 10-375 in Tabelle3 ausgeblendet werden.
Dazu mein Gedanke:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
   If Target.Address = "$A$2" Then
      If Target.Value = "Auswahl" Then
         Rows("10:375").EntireRow.Hidden = True
      End If
   End If
End Sub
Kann nicht funktionieren, weil Target.Address nur im aktiven Blatt funzt(hab ich nachgelesen). Also nach Lösungen gegoogelt und bin auch fündig geworden.
1. Lösung von Ulf hier im Archiv gefunden, allerdings aus dem Jahre 2004
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheets("Tabelle2").Range(Target.Address) = Target
End Sub
Anstatt (Target.Address) hab ich "A2" gesetzt

2. Lösung von MVP Thomas Ramel, allerdings aus dem Jahre 2007
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo fehler
If Target.Address = "$E$1" Then
Application.Goto Worksheets("Tabelle2").Range("A1:A200").Find(Target.Value)
End If
Exit Sub
Ich habs dann so abgeändert:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo fehler
If Target.Address = "$A$2" Then
Application.Goto Worksheets("Tabelle2").Range("A2")
End If
End Sub
Bei beiden Lösungen hab ich dann den Teil
If Target.Address = "$A$2" Then
If Target.Value = "Auswahl" Then
Rows("10:375").EntireRow.Hidden = True
End If
End If
natürlich noch dran gehängt. Nur leider funktionieren beide Lösungen bei mir nicht. Und nun seid ihr gefragt. Wer kann mir sagen, wieso nicht und wer hat eventuell ne Lösung parat, die garantiert klappt? Hab die Mappel mal hochgeladen https://www.herber.de/bbs/user/159706.xlsm

Gruß Frank

49
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: If Target.Address
23.06.2023 17:22:01
onur
"Kann nicht funktionieren, weil Target.Address nur im aktiven Blatt funzt(hab ich nachgelesen)" DAS ist ja auch nicht der Grund, warum es nicht klappt.
Es ist doch nicht schwer:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
   If Target.Address = "$A$2" Then
      If Target.Value = "Auswahl" Then
         Rows("10:375").EntireRow.Hidden = True
      End If
   End If
End Sub
Diesr Code muss natürlich dort stehen, wo die Zelle ist, die überwacht wird - also im Modul von Tabelle2.
Da du aber Tabelle3 filtern/ausblenden willst, muss du das dem Code auch mitteilen. Sonst würde der Code von Tabelle2 ausgehen.
Also nicht
Rows("10:375").EntireRow.Hidden = True
sondern
Sheets("Tabelle3").Rows("10:375").EntireRow.Hidden = True


Anzeige
AW: If Target.Address
23.06.2023 17:32:46
onur
Da du aber wohl erwartest, dass die Ausblenderei wieder rückgängig gemacht wird, wenn dort nicht mehr "Auswahl" steht, musst du auch das dem Code sagen:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
   If Target.Address = "$A$2" Then Sheets("Tabelle3").Rows("10:375").EntireRow.Hidden = Target.Value = "Auswahl"
End Sub


AW: If Target.Address
23.06.2023 17:57:49
Frank
Wie sagte einst der Sachse, als er die MediaMarkt-Hotline wegen dem Videorecorder angerufen hat und der Hotliner ihm geholfen hat:
Isch glob, isch wärde blöde, die Scheisse geht :-D
Vielen Dank Onur, da habe ich das Pferd mal wieder von hinten aufgezäumt. Scheinen beide Lösungen dann wohl was für die Tonne zu sein, oder?
Gruß Frank


Anzeige
Gerne !
23.06.2023 18:00:54
onur


Sorry. für die Verwechslung Onur
26.06.2023 12:23:55
Frank
Hallo Onur,
erstmal sorry dafür, dass ich dich mit Yal verwechselt habe. Die Lösung stammt natürlich von dir. Hast du denn ne Idee, wie der Folgecode auf der Basis deiner Lösung lauten muss, wenn ich bei Auswahl eines Monats (z.B der Januar) auch nur die Tage des Januar angezeigt bekomme? Entsprechendes gilt natürlich auch für die anderen Monate. Mein ursprünglicher Code)unten im letzten Post steht er) funktioniert ja jetzt nicht mehr.
Gruß Frank


Anzeige
AW: If Target.Address
23.06.2023 17:39:03
GerdL
Hallo,

heißt es in xl2019 Target As Excel.Range ?
Wieso braucht Rows(...) noch .EntireRow?

Gruß Gerd


AW: If Target.Address
23.06.2023 18:03:19
Frank
Gerd mich darfst du doch sowas nicht fragen. Diese Zeile stammt noch aus meiner Excel2003er Version. Dann hab ich mir die 2019er zugelegt, danach aber gelesen, das gewisse Funktionen nur in der 365er und der 2021er enthalten sind. Also hab ich mir die 2021er auch noch zugelegt. Nur kann ich die hier nicht anwählen.
Wie würde denn deine Lösung ohne .EntireRow lauten? Und den Unterschied zwischen Target As Excel.Range und Target As Range hab ich noch nicht raus gefunden bzw. wann was angewendet wird.

Gruß Frank


Anzeige
AW: If Target.Address
23.06.2023 21:21:42
Ulf
Range gibt es für mehrere Namespaces
Excel.Application.Range
Excel.Range
Excel.AllowEditRange.Range
Excel.ListObject.Range ...
für Worksheets ist Excel.Range gleichbedeutend mit Range und das einzig verwendbare Range-Objekt

EntireRow~Zeilenauswahl, Range~y, da man Teilbereiche eines Blatts nicht ausblenden kann; x~EntireRow(~Alle)


AW: If Target.Address
23.06.2023 22:38:54
GerdL
Meine erste Frage könnte ein xl2019-Besitzer mit ja oder nein beantworten.
Die zweite Frage bezog sich nicht auf Range().EntireRow sondern auf Rows().EntireRow.


AW: If Target.Address
23.06.2023 22:48:29
Ulf
TypeName(Rows("10:375"))=Range ?!


Anzeige
AW: If Target.Address
23.06.2023 22:53:40
GerdL
Nochmal explizit.
Worin besteht der Unterschied zwischen Rows(1:10) und. Rows(1:10).EntireRrow ?


AW: If Target.Address
23.06.2023 23:58:26
Ulf
Rows(1:10)~einem Bereich von 10 Zeilen im übergeordneten Objekt (nicht der gesamten Zeile, selbst wenn die Maximalanzahl der Spalten ausgewählt wäre)
Rows(1:10).EntireRow entspricht einem 10 Zeilen hohen Bereich der gesamten Zeile, im GUI dem Klick auf Zeilen Index

Gibt ein Range-Objekt zurück, das eine oder mehrere ganze Zeilen darstellt, die den angegebenen Bereich enthalten..
d.h. will man Ausblenden muß man EntireRow referenzieren


will man Ausblenden muß man EntireRow referenziere
24.06.2023 08:30:09
RPP63
Moin!
Diese Aussage (muss!) ist definitiv falsch!
Rows("1:10").Hidden = True
reicht völlig.
Dass "1:10" in die Füße der Gänse gehört, sollte bekannt sein.

Gruß Ralf


Anzeige
AW: will man Ausblenden muß man EntireRow referenziere
24.06.2023 09:09:24
Ulf
Vererbt von EntireRow, kannst du ignorieren, ändert nichts am Verhalten, Hidden ist Eigenschaft von Entire..
Im übrigen darfst du Recht haben
Gruß
Ulf


Noch etwas
24.06.2023 08:43:22
RPP63
Du schreibst ja korrekt, dass Rows() sich auf das übergeordnete Objekt bezieht und somit eine Schnittmenge bildet.
Direktfenster:
?Range("P18:AC57").Rows("2:8").Address
$P$19:$AC$25
Im Ereignismakro einer Tabelle ist das übergeordnete Objekt Me (also die Tabelle), auch wenn man es weglässt.


Nicht Schnittmenge, sondern
24.06.2023 14:27:55
Yal
Hallo zusammen,

ich würde eher den Begriff "relative" Adressierung verwenden:
Debug.Print Range("B2").Range("B2").Address
ergibt $C$3

Es ist dasselbe wie
Debug.Print Range("B2").Offset(1,1).Address

Dementsprechend das Beispiel von RRP63, mit Rows auf einem gegebenen Bereich.

VG
Yal


Anzeige
AW: If Target.Address
24.06.2023 09:26:39
GerdL
D.h.

Rows("1:10").Hidden = True

funktioniert nur, weil Microsoft seine Logik nicht kennt..


AW: If Target.Address
24.06.2023 14:34:55
Yal
Funktioniert, weil im Fall eines Ereignis-Prozedures das Zielblatt eben das aktive Blatt ist.

Will man aber die Zeilen von einem anderen Blatt ausblenden, muss diese referenziert werden:
Worksheets("Tabelle2").Rows("1:10").Hidden = True
(z.B. bei eine Zellenänderung in "Tabelle1")

VG
Yal


AW: If Target.Address
24.06.2023 14:52:02
GerdL
Hallo Yal,

das war jetzt keine Antwort zu einer meiner beiden Fragen;
Excel.Range oder nur Range im Change-Event-Prozedurenkopf von xl2019;
Unterschiede zwischen Rows(...).EntireRow.Hidden und Rows(...).Hidden

Gruß Gerd


Anzeige
AW: If Target.Address
24.06.2023 15:21:17
Yal
Ach so.
Target As Range
Ist völlig ausreichend. Word möge Range auch kennen, es ist hier klar, dass wir in Excel-Welt unterwegs sind.
Rows(..).EntireRow. ...
Ist möglich, aber unnötig, weil der relative Bezug EntireRow keine Einschränkung von Rows darstellt. Kann man sich sparen und den Code mit
Rows(..).Hidden = ...
Leichter zu lesen.

VG
Yal


AW: If Target.Address
25.06.2023 10:00:54
Frank
Guten Morgen zusammen,
ich bin echt überrascht, dass die Experten über eine solche Kleinigkeit so diskutieren. Ob jetzt mit oder ohne ENTIRE, ich lass die Lösung so wie sie ist.

@Yal mit deiner Lösung stürzt du mich in ein tiefes Loch oder wie ich es sehe, ich stehe vor dem Mount Everest ohne jegliche Ausrüstung soll da hochkraxeln :D Mein Verständnis sagt mir, dass ich sämtlichen Code, der sich auf deine Lösung bezieht anpassen muss, ws bedeutet, das meine Lösungen gar nicht mehr passen bzw. funktionieren. Wenn ich genau nachdenke, ist es nur eine Sache, die ich brauche. Du hast in deine Lösung ja eingebaut, wenn nicht "Auswahl" steht alles wieder zurück geht. Da ich diese Art von Lösung noch nirgends gesehen habe, wie muss der Code lauten, wenn ich zu jedem Monat des Drop-Down-Felds nur die jeweiligen Tage angezeigt bekommen möchte?
Gruß Frank
P.s deine Lösung funktioniert in der hochgeladenen Mappe bestens, in der Originaldatei jedoch gar nicht. Mit Sheets("Tabelle3") bekomme ich Laufzeitfehler 9 - ausserhalb des gültigen Bereichs, mit Sheets("Gesamtdaten") kommt der Fehler 1004 Hidden kann nicht angezeigt werden. Ist aber nicht tragisch, da dies meine Vermutung bestätigt, dass die Originaldatei ne Macke hat. Daher werde ich die gesamte Mappe neu aufbauen.
Gruß Frank


Anzeige
AW: If Target.Address
25.06.2023 11:01:33
Ulf
Hi Frank,
unnütze P..svergleiche, wie du richtig anmerkst
Lösung
in Dateiform
https://www.herber.de/bbs/user/159723.xlsm
Im Modul Tabelle2

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim bAusblenden As Boolean
    If Target.AddressLocal = "$A$2" Then
        bAusblenden = Target.Value = "Auswahl"
        ThisWorkbook.Worksheets("Tabelle3").Rows("10:375").EntireRow.Hidden = bAusblenden
    End If
End Sub
Im Modul Tabelle3

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If ThisWorkbook.Worksheets("Tabelle2").Range("A2").Text = "Auswahl" Then
       ThisWorkbook.Worksheets("Tabelle3").Rows("10:375").EntireRow.Hidden = True
    Else
       ThisWorkbook.Worksheets("Tabelle3").Rows("10:375").Hidden = False
    End If
End Sub
hth
Ulf


AW: If Target.Address
25.06.2023 11:27:17
GerdL
Noch den Monat in die Formel in A10 nehmen.
=DATWERT("01."&A9&"."&Tabelle2!E2)


AW: If Target.Address
25.06.2023 13:29:40
Frank
Hallo Gerd,
werde ich sobald ich Feierabend habe und Zuhause bin, direkt testen, wobei ich grad nicht weiß wohin der Teil gehört. Kann daran liegen, dass ich am Handy bin und kaum was sehe :D
Gruß Frank


AW: If Target.Address
25.06.2023 19:43:34
Ulf

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim bAusblenden As Boolean
    Dim intCrit As Integer
    If Target.AddressLocal = "$A$2" Then
        bAusblenden = Target.Value = "Auswahl"
        If bAusblenden Then
            ThisWorkbook.Worksheets("Tabelle3").Rows("10:375").EntireRow.Hidden = bAusblenden
        Else
            intCrit = (ThisWorkbook.Worksheets("Tabelle2").Range("A1").Value + 20)
            ThisWorkbook.Worksheets("Tabelle3").Range("$A$9:$A$375").AutoFilter Field:=1, Criteria1:=intCrit, Operator:=xlFilterDynamic
        End If
    End If
End Sub


AW: If Target.Address
25.06.2023 13:22:50
Frank
Hallo Ulf,
so eine Aussage, das seien/wären unnütze Vergleiche, würde ich niemals tätigen. Dafür fehlt mir das nötige Hintergrundwissen bzw. Excelverständnis. Es gibt/gab bestimmt einen Grund, warum mal mit ENTIRE und mal Ohne. Es gibt bestimmt den einen oder anderen, der sich jetzt ans "Excel-Reißbrett" setzt und die getätigten Aussagen überprüft. Was ich nur sagen wollte ist, ich nutze die Lösung von Yal, weil ich sonst nur noch mehr verwirrt werde.
Jetzt zu deiner Lösung: Sie macht doch nix anderes, als wie die Lösung von Yal auch. Zumindest passiert in deiner Datei nicht mehr.
Gruß Frank


AW: If Target.Address
25.06.2023 14:31:50
Ulf
Hi Frank,
ersetze P.. durch primäres masku.. Fortpfl.., dann wird der Sinn deutlich
Wann wird was:
Bei Auswahl in Tabelle2 wird diese geändert=>Ausblenden
Bei Selektion, d.h Klick in andere als die aktive Zelle=>Ausblenden
War der Sinn des Unterfangens nicht genau das ?
Gruß
Ulf


AW: If Target.Address
25.06.2023 16:46:46
Frank
Hey Ulf,
da hast du wohl was missverstanden. Die Lösung mit dem Ausblenden habe ich ja schon von Yal. Was ich jetzt brauche ist, dass wenn ich den Januar auswähle, auch nur die Tage vom Januar angezeigt werden. Entsprechendes gilt natürlich für die restlichen Monate. In meiner alten Datei wurde das so gelöst:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
   Dim lRowIn&, a&, lMonat&
   On Error GoTo ende
   
   Application.EnableEvents = False
      '* bei Monatswechsel in A5
         If Target.Address = "$A$5" Or Target.Address = "$A$5:$A$5" Then
           lRowIn = Application.Match(Target.Value, Sheets("Hilfstabelle").Columns("D"), 0)
                        
            Rows("6:371").EntireRow.Hidden = True
            For a = 6 To 371
               lMonat = Application.Match([A5], Sheets("Hilfstabelle").Columns("D"), 0)
               If Month(Cells(a, 1)) = lMonat Then
                  Rows(a & ":" & a).EntireRow.Hidden = False
               End If
            Next a
            ActiveWindow.LargeScroll Down:=-3
      End If
Nur funktioniert das ja jetzt nicht mehr.

@Gerd Ulf hat deinen Vorschlag schon in die Formel eingebaut, nur verstehe ich nicht, was an meiner Formel falsch war bzw. was eure anders/besser macht als meine.
Meine Formel:
=WENN(Tabelle2!$A$2="Auswahl";"";DATUM(Tabelle2!$E$2;Tabelle2!$A$1;1))
Eure Formel:
=DATWERT("01.01." & Tabelle2!$E$2) 
Das Ergebnis ist doch völlig identisch. Ich werde aber wohl diese Lösung hier verwenden, weil diese Formal das Schaltjahr mit berücksichtigt.

=SEQUENZ(MONATSENDE(DATUM(Tabelle2!$E$2;MONAT(Tabelle2!$A$1);1);11)-DATUM(Tabelle2!$E$2; MONAT(Tabelle2!$A$1);1)+1;1;DATUM(Tabelle2!E2;MONAT(Tabelle2!A1);1))
Gruß Frank


AW: If Target.Address
26.06.2023 17:45:24
Yal
Hallo Frank,

alles, was ein Anfang hat, hat auch ein Ende: If -- End If, For -- Next und auch Sub -- End Sub. Bitte liefere immer von Anfang bis Ende vollständigen Code.
Wenn EnableEvent = False, dann am Ende wieder True setzen
Lege jede Variable einzel pro Zeile und verwende vollständige Bezeichner "As Long" anstatt "&". Sogar Profis nutzen es selten.

Der Monat 365 mal in der Zelle A5 zu lesen, und in der Spalte D zu suchen, hat etwas von Zwangsneurose: immer dasselbe tun und dabei ein anderes Ergebnis erwarten...
Der Code soll reagieren, wenn die Zelle A2 von Tabelle2 geändert wurde (also, war mal so). Also soll der Code im Codepane von Tabelle2 vorliegen und fürs ausblenden, auf die Tabelle3 referieren.

Sonst ist es soweit clean.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Monat As Integer 'selten grösser als 12
Dim Z As Range
   
'nur reagieren, wenn A5 geändert wurde
    If Target.Address > "$A$5" Then Exit Sub
'Ansonsten
    Application.EnableEvents = False
    Application.ScreenUpdating = False
'grundsätzlich alle ausblenden
    With Worksheets("Tabelle3")
        .Rows("6:371").Hidden = True
    'nur wenn gültige Monat
        Monat = Worksheets("Tabelle2").Range("A2").Value
        If IsDate("1. " & Monat & "2023") Then 'aus dem Eintrag prüft man, ob Datum
            Monat = Month(CDate("1. " & Monat & "2023")) 'aus dem Datum, fischt man den Monat heraus
            For Each Z In .Range("A10:A375") 'Z ist dann eine einzelne Zelle
            'wenn Eintrag zum ausgewählte Monat passt, einblenden
                If Month(Z.Value) Then Z.EntireRow.Hidden = False 'eine einzelnen Zelle erweitert man mit EntireRow zu einer Zeile
            Next
        End If
        ActiveWindow.LargeScroll Down:=-3
    End With
    Application.EnableEvents = False
    Application.ScreenUpdating = False
End Sub
Du hast noch das Problem, das Januar eventuell die Zeile 371 anzeigt...

VG
Yal


AW: If Target.Address
26.06.2023 17:47:55
Yal
ich entdecke gerade 2 Fehler. Aber ich lasse Dich diese selber finden. Nicht zur Strafe, sondern zur Übung.

VG
Yal


AW: If Target.Address
26.06.2023 19:14:20
Pappawinni
Zweimal
Application.EnableEvents = False
Application.ScreenUpdating = False
ist wahrscheinlich nicht sooo sinnvoll


Also, dann 4 Fehler! :-) owT
26.06.2023 19:25:59
Yal


AW: If Target.Address
26.06.2023 19:28:06
GerdL
Das ist ein reiner Kopierfehler, inetwa vergleichbar mit Datwertformel ohne das Monat.


AW: If Target.Address
26.06.2023 19:39:29
Pappawinni
Ja klar, weiss schon wie das passiert.
Aber du willst doch jetzt nicht sagen: "It's not a Bug, It's a Feature"


AW: If Target.Address
26.06.2023 20:15:30
GerdL
Was ich nicht sagen wollte, habe ich nicht geschrieben.


AW: If Target.Address
26.06.2023 20:31:42
Pappawinni
Uiui, sind wir ein wenig gereizt heute?
Sorry, wollte n bissl witzig sein, ging wohl in Hose.


AW: Genannte 4 Fehler
27.06.2023 14:54:09
Frank
Hey Yal,
3 von 4 Fehlern hätte ich auch ohne Hinweis gefunden ;)
1. Fehler:
If Target.Address > "$A$5" Then Exit Sub

Es muss lauten:
If Target.Address > "$A$2" Then Exit Sub
2. Fehler:
.Rows("6:371").Hidden = True
Es muss lauten:
.Rows("10:375").Hidden = True
3. Fehler:
Application.EnableEvents = False
           Application.ScreenUpdating = False
Beide Ereignisse müssen natürlich auf True gesetzt werden. Aber selbst wenn ich den 4. Fehler gefunden hätte, würde der Code zu 99% nicht funktionieren. Da ich wie Du erwähnt hast, noch das Problem mit Zeile 375(nochmal der 01. Januar) habe, wurde ich im Netz fündig. Eine Formel, die alle 365/366 Tage berücksichtigt.
=WENN(Monatsübersicht!$A$2="Auswahl";"";SEQUENZ(MONATSENDE(DATUM(Hilfstabelle!$A$1; MONAT(Monatsübersicht!$A$1);1);11)-DATUM(Hilfstabelle!$A$1;MONAT(Monatsübersicht!$A$1);1)+1;1; DATUM(Hilfstabelle!$A$1;MONAT(Monatsübersicht!$A$1);1))) 
Leider funktionieren mit der Lösung einige Codes bei mir nicht, mit der herkömmlichen aber schon. Wie gesagt, 3 Fehler hab ich gefunden, den 4. nicht

Gruß Frank


AW: Genannte 4 Fehler
27.06.2023 18:26:00
Pappawinni
Was kommt denn dabei
"1. " & Monat & "2023"
heraus?


AW: Genannte 4 Fehler
27.06.2023 19:21:29
Frank
Adhoc aus dem Bauch heraus würde ich jetzt sagen, der 01.01.2023. Wenn ich ehrlich bin, störte mich die 2023 von Anfang an. Was passiert, wenn im Tabellenblatt "Hilfstabelle" in A1 das Jahr 2024 eingegeben wird? Aber wie muss es denn nun richtig heissen?


AW: Genannte 4 Fehler
27.06.2023 22:14:30
Pappawinni
mal nicht aus dem Bauch, gib doch mal aus, was das bringt
msgbox "1. " & Monat & "2023"
oder
debug.print "1. " & Monat & "2023"


AW: Genannte 4 Fehler
27.06.2023 23:05:19
Frank
Okay, das kann so auch nix werden. Vom logischen Standpunkt her müsste anstatt Monat auch "1. " stehen. Zumindest gibt mir das Direktfenster dann den 01.01.2023 aus. Aber selbst wenn das richtig sein sollte, funktioniert der Code immer noch nicht. Ausblenden ja, aber dann auch ALLE wieder eingeblendet.


AW: Nummer nächstens
28.06.2023 00:48:14
GerdL
Private Sub Worksheet_Change(ByVal Target As Range)


    If Target.Address(0, 0) = "A2" Or Target.Address(0, 0) = "E2" Then 'Monate in A2, Jahr in E4
    
    
        If Range("E2") Like "####" Then
        
            Select Case Range("A2")
            
            Case "Auswahl": Sheets("Tabelle3").Rows("10:375").Hidden = True
            
            Case Else
                
                If Not IsDate("1. " & Range("A2") & " " & Range("E2")) Then
                    Sheets("Tabelle3").Rows("10:375").Hidden = False
                Else
                    Sheets("Tabelle3").Rows("10:375").Hidden = True
                    Sheets("Tabelle3").Rows("10:" & Day(WorksheetFunction. _
                    EoMonth(CDate("1. " & Range("A2") & " " & Range("E2")), 0)) + 9).Hidden = False
                
                End If
            
            End Select
            
        Else
            Sheets("Tabelle3").Rows("10:375").Hidden = False
        End If
    
    
    End If


End Sub
Gruß Gerd


AW: Nummer nächstens
28.06.2023 08:26:57
Frank
Guten Morgen Gerd,
erstes Testen, gescheitert. Excel zeigte mir aber direkt den Fehler, den ich gemacht habe. Im Code steht "Tabelle3". Beim Neuaufbau habe ich das Tabellenblatt wieder in Gesamtdaten umbenannt, daher konnte es nicht funktionieren. Werde ich nie lernen, wieso und weshalb. In den Eigenschaften ist es doch immer noch Tabelle3. Egal, also abgeändert, einmal "Auswahl" ausgewählt, dann den Januar und alles lief perfekt und rasend schnell. Was habe ich mich gefreut. Doch dann kam die Ernüchterung. Ein Fehler hat sich eingeschlichen. Wenn ich den Februar auswähle, zeigt Excel mir zwar die Anzahl der Tage an, doch alles vom Januar, d.h. beim 28. Januar ist Schluß. Ich hab die Datei mal hochgeladen. Ich denke, selbst nen Blick drauf zu werfen ist besser. https://www.herber.de/bbs/user/159746.xlsm

Gruß Frank


AW: Nummer nächstens
28.06.2023 09:34:24
peterk
Hallo


                Else
                    Sheets("Tabelle3").Rows("10:375").Hidden = True
                    
                    startRow = DatePart("y", "1. " & Range("A2") & " " & Range("E2")) + 9
                    
                    Sheets("Tabelle3").Rows(startRow & ":" & _
                    Day(WorksheetFunction.EoMonth(CDate("1. " & Range("A2") & " " & Range("E2")), 0)) + startRow - 1).Hidden = False
                End If
Peter


AW: Nummer nächstens
28.06.2023 11:17:13
Frank
Hey Peter,
nachdem ich oben im Code noch die Zeile
Dim StartRow As Long
hinzugefügt habe, läuft der Code einwandfrei.
Vielen Dank für deine Hilfe. Jetzt kann ich mich endlich an den Rest setzen.
Gruß Frank


AW: Nummer nächstens
28.06.2023 11:48:05
Yal
Hmm... wenn schon eine Variable "StartRow", warum dann keine Variable "EndRow"?
Und wenn StartRow mit DatePart ermittelt wird, warum die letzte Zeile durch eine andere Rechnensweg?
(ich verwende gern deutsche Variablenname, um zu zeigen: das ist keine VBA-Begriff)

Wenn Datum 4 mal verwendet wird, lohnt es sich diese "1. " & Range("A2") & " " & Range("E2") in einer Variable abzulegen. Dann kann man, nachdem man geprüft hat, dass es eine gültige Datum-String daraus eine Date-Variable machen und dann mit Year() und Month() arbeiten.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Datum As Variant
Dim StartZeile As Long
Dim EndZeile As Long

    If InStr(1, "$A$2;$E$2", Target.Address) Then 'Monate in A2, Jahr in E2
        Sheets("Tabelle3").Rows("10:375").Hidden = False 'default Behandlung, so ein Art von "zurück zum originalen Stand"
        If Range("E2") Like "####" Then
            If Range("A2").Value = "Auswahl" Then
                Sheets("Tabelle3").Rows("10:375").Hidden = True
            Else
                Datum = "1. " & Range("A2") & " " & Range("E2") 'hier zuerst als string
                If IsDate(Datum) Then
                    Datum = CDate(Datum) 'jetzt als Datum
                    Sheets("Tabelle3").Rows("10:375").Hidden = True
                    
                    StartZeile = DatePart("y", Datum) + 9
                    EndZeile = DatePart("y", DateSerial(Year(Datum), Month(Datum) + 1, 0)) + 9 'letzte Tag im Monat ist der Tag vor dem ersten des Folgemonats
                    Sheets("Tabelle3").Rows(StartZeile & ":" & EndZeile).Hidden = False
                End If
            End If
        End If
    End If
End Sub
ungetestet.

Man könnte auch sagen: das Ein/Ausblenden in Tabelle3 ist erst relevant, wenn auf Tabelle3 geschaltet wird, also im Erreignis "Worsheet_Activate" von Tabelle3. Dann gibt es weniger Ein/Ausblenden, die nie zur Ansicht kommen.

VG
Yal


AW: Nummer nächstens
28.06.2023 12:08:11
Frank
Hey Yal,
sowas darfst Du mich doch nicht fragen. Mir ist es wichtig, dass es funktioniert. Deine Lösung funktioniert natürlich auch, läuft aber unruhiger und der 01. eines Monats blinkt kurz auf. Daher bleibe ich bei der Lösung von peterk. Während ich weiter meine Mappe mit Formeln befülle, könnt ihr Experten euch ja austauschen, warum so und nicht so.
Gruß Frank


AW: Nummer nächstens
28.06.2023 12:21:44
Yal
Hallo Frank,

Du hast ja auch bemerkt, dass ein Grossenteil der Diskussion eher ein philosophische Austausch zwischen "Experte" darstellt (Manche sagen P.vergleich. Ich distanziere mich davon). Dementsprechend war meine Anmerkung eher die Allgemeinheit gerichtet, aber auch zu jenen, die mit demselben Problem in 2 Jahren auf diesen Thread zustossen werden...

Zum Thema Flackern, siehe meine Endanmerkung: es würde reichen, das Ein/Ausblenden zu realisieren, wenn man das Blatt "Tabelle3" aktiviert. Solang man auf dem anderen Blatt bleibt, ist das Ein/Ausblenden (und das damit verbundene Flackern) nutzlos.

VG
Yal


AW: Nummer nächstens
28.06.2023 13:23:42
Frank
Hallo Yal,
das Ein- bzw. Ausblenden passiert höchstens einmal im Jahr. Die Idee stammt noch aus einer älteren Version. Ich hätte genau so gut alle Monate eingeblendet lassen können, so dass der Code erst aktiv wird, wenn ein Monat ausgewählt wird. Das "Flackern"(ich nenn es jetzt mal so) passiert ja immer dann, wenn ich den Monat wechsel und immer nur in Zelle A10. Mir sagt dass, das Excel am Arbeiten ist. Aber ich werde deine Lösung auch meiner Beispielmappe hinzufügen, man weiß ja nie, wozu die noch gut sein kann.
Der philosophische Austausch zwischen euch "Experten" kann einen Anfänger, so wie ich einer bin, auch öfters mal sehr verwirren.
Gruß Frank


285 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige