Verknüpfung mehrerer Funktionen

383 Aufrufe
Gefragt 5, Jan 2017 in Tabellenkalkulation von twst
Hallo,
ich möchte folgende Funktion haben:
Wenn in Spalte G ("Offener Betrag") kein Wert und in Spalte E
("Rechnungsdatum") ein Datum steht, soll die Zeile ausgeblendet
werden.
Dazu wollte ich einfach eine Spalte einfügen, die aus der
Kombination der beiden Werte für Spalte H ein x/leer berechnet und
dann als Makro folgendes anwenden:
Sub HideRows()
BeginRow = 2
EndRow = 1250
ChkCol = 8

For RowCnt = BeginRow To EndRow
If Cells(RowCnt, ChkCol).Value = "x" Then
Cells(RowCnt, ChkCol).EntireRow.Hidden = True
End If
Next RowCnt
End Sub

Meine Fragen sind jetzt
a) wie sähe eine "=UND"-Funktion aus, die mir diesen Wert für H
ausspuckt aus (also entweder x/leer)?
b) gäbe es eine elegantere Lösung?

Vielen Dank im Voraus,
Wolfgang

6 Antworten

0 Punkte
Beantwortet 5, Jan 2017 von m-o Profi (11,067 Punkte)
Hallo Wolfgang,

auch die Hilfsspalte kannst du verzichten.
Probier es mal so:

Sub HideRows()

Dim Beginrow As Long
Dim Endrow As Long
Dim Rowcnt As Long

Beginrow = 2
Endrow = 1250
ChkCol = 8

For Rowcnt = Beginrow To Endrow
If Cells(Rowcnt, 5).Value > 0 And Cells(Rowcnt, 7) = 0 Then Rows(Rowcnt).EntireRow.Hidden = True
Next Rowcnt

End Sub


Gruß

M.O.
0 Punkte
Beantwortet 5, Jan 2017 von m-o Profi (11,067 Punkte)
Hallo,

auch die Hilfsspalte kannst du verzichten.


Es soll natürlich heißen:

auf die Hilfsspalte kannst du verzichten.

Gruß

M.O.
0 Punkte
Beantwortet 5, Jan 2017 von quinoman
Hallo, die Lösung die schon da ist, ist ok, scheint aber nicht die Forderung zu erfüllen, dass nur dann ausgeblendet wird, wenn der Wert in Spalte G =0 und in Spalte H ein DATUMN steht (Abfrage auf Datum erfolgt mit IsDate)
Ansonsten ist es natürlich egal, ob man eine Zählschleife benutzt oder For each/next

Sub hideZero()
Dim Zeile As Range 'Definiert Variable als Range-Objekt
For Each Zeile In Sheets("Tabelle1").Range("G2:H1250").Rows ' Schleife über den Bereich von Interesse
If Zeile.Cells(1) = 0 And IsDate(Zeile.Cells(2).Value) Then 'Bedingungen (G=0 und H=Datum)
Zeile.Hidden = True 'Zeile ausblenden
End If 'IF-Abfrage beendet
Next 'nächste Zeile in der Schleife
End Sub
0 Punkte
Beantwortet 5, Jan 2017 von quinoman
Ergänzung/Modifikation


Da die Forderung lautet, dass in Spalte H ein Datum stehen muss,
kann man von unten nach oben die erste (somit in der fraglichen Tabelle von oben nach
unten die letzte) Zelle mit einem Datums-Eintrag bestimmen und dann genau den so ermittelten
Bereich "durchackern". Das setzt natürlich voraus, dass im Tabellenblatt keine andere
Daten bzw. Tabelle UNTER der betreffenden Tabelle angelegt wird, was man bei Excel eigentlich
nur macht, wenn es unvermeidbar ist.
Aber auch dann kann man den Bereich dynamisch bestimmen:
Sollte z.B. ab Zeile 1500 eine ganz andere Tabelle anfangen, kann man im vorliegenden Code
intLastRow =Range("G1").Offset(Active.... usw. durch intLastRow=1500 ersetzen. Vorteil: es wird
nur so oft geprüft und ausgeblendet, wie tatsächlich nötig.
Im konkreten Fall bringt das natürlich nur Millisekunden, sollte man aber auf Dauer angewöhenen, als
"guten Stil" 'sozusagen. Der geänderte Code lautet dann:

Sub hideZero()
Dim Zeile As Range 'Definiert Variable als Range-Objekt
Dim lngLastRow As Long 'Definiert Variable als Long

' von ganz unten nach oben Zeilennummer mit letzten Eintrags suchen
intLastRow = Range("G1").Offset(ActiveSheet.Rows.Count - 1).End(xlUp).Row
For Each Zeile In Sheets("Tabelle1").Range("G2:H2").Resize(intLastRow).Rows 'Schleife über Bereich
If Zeile.Cells(1) = 0 And IsDate(Zeile.Cells(2).Value) Then
Zeile.Hidden = True
End If
Next
End Sub

'Die Abfrage IF wurde bewusst auf 3 Zeilen gelegt. Zwar kann man bei nur 1 Aktion auch alles in eine Zeile
'packen, also
If Zeile.Cells(1) = 0 And IsDate(Zeile.Cells(2).Value) Then Zeile.Hidden = True
'(--> den End If muss man dann entfernen !!)
'Es ist in der Praxis aber hilfreich, einen "ordentlichen" Block zu schreiben, denn - falls z.B. später weitewre Aktionen oder gar ein ELSE - Zweig hinzukommen, verliert man sonst leicht die Übersicht, wo der END IF hingehört.
'Zudem ist dies ein Makro , was man in leicht geänderter Form ständig benötigt.Solchen Code kann man sich als Textdatei abspeichern und immer wieder einbauen + anpassen.
Gruss aus Hessen, Quinoman
0 Punkte
Beantwortet 5, Jan 2017 von Nighty__
Hallo Community ^^

Ein Beispiel ohne Schleife .-)

Gruss Nighty

Nutzung des Autofilter mit 2 Suchbegriffen und deren Ausblendung!
Field 1+3 sind die Spalten des Autofilterbereiches,nicht der Tabelle!
Datum waere mit Cdbl() abfragbar

Sub AusblendenZweiKreterien()
Dim FilteredRange As Range
ActiveSheet.Range("A1:D1").AutoFilter
ActiveSheet.Range("A1").AutoFilter Field:=1, Criteria1:=1
ActiveSheet.Range("D1").AutoFilter Field:=3, Criteria1:="e"
Set FilteredRange = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
ActiveSheet.Range("A1").AutoFilter
FilteredRange.EntireRow.Hidden = True
ActiveSheet.Rows("1").EntireRow.Hidden = False
End Sub
0 Punkte
Beantwortet 6, Jan 2017 von Nighty__
Hi Community ^^

Bisl angepasst!

Gruss Nighty

Überschrift vorrausgesetzt

Suchkreterien!
Spalte G ein x
Spalte H ein Datum das kleiner ist als der Laufende Monat(Beispel)

Sub AusblendenZweiKreterien()
Dim FilteredRange As Range
Dim Qdate As Date
Qdate = "01." & Mid(Date, 4, 2) & Mid(Date, 6, 5)
ActiveSheet.Range("G1:H1").AutoFilter
ActiveSheet.Range("G1").AutoFilter Field:=1, Criteria1:="x"
ActiveSheet.Range("H1").AutoFilter Field:=2, Criteria1:="<" & CDbl(Qdate)
Set FilteredRange = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
ActiveSheet.Range("G1").AutoFilter
FilteredRange.EntireRow.Hidden = True
ActiveSheet.Rows("1").EntireRow.Hidden = False
End Sub
...