PDA

Vollständige Version anzeigen : Zeilen anhand eines Zellenwerts ausblenden über VBA


zytec
12.03.2009, 07:24
Hallo zusammen,

folgende Fragestellung:
In einer Tabelle sollen anhand des Zellenwerts in Spalte A jeweils die Zeilen ab Zeile 6 mit dem Wert "x" in Zelle A der Zeile ausgeblendet werden. Zur Steuerung dient ein CommandButton der die Beschriftung von Zeilen ausblenden auf Zeilen einblenden ändert je nach Aktion. Das ganz löse ich über einen TriggerWert in Zelle A1 der 1 oder 0 gesetzt wird in Abhängigkeit der gerade abgelaufenen Aktion (ein- oder ausblenden).
Genau dieser Eintrag in die Zelle A1 stört mich, gibts da ne Möglichkeit einen Merker in VBA zu definieren, der nach Ablauf der Sub bestehen bleibt?

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> Zeileeinausblenden()
&nbsp;
<span class="TOKEN">Dim</span> i <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> x <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
&nbsp;
x = [a1]
&nbsp;
<span class="TOKEN">If</span> x = 1 <span class="TOKEN">Then</span>
&nbsp;
<span class="TOKEN">For</span> i = Worksheets(&quot;Toller Name&quot;).UsedRange.Rows.Count <span class="TOKEN">To</span> 6 <span class="TOKEN">Step</span> -1
<span class="TOKEN">With</span> Range(&quot;A&quot; &amp; i)
<span class="TOKEN">If</span> .Value = &quot;x&quot; <span class="TOKEN">Then</span>
.EntireRow.Hidden = <span class="TOKEN">True</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">Next</span> i
[a1] = 0
&nbsp;
<span class="TOKEN">Else</span>
&nbsp;
<span class="TOKEN">For</span> i = Worksheets(&quot;Toller Name&quot;).UsedRange.Rows.Count <span class="TOKEN">To</span> 6 <span class="TOKEN">Step</span> -1
<span class="TOKEN">With</span> Range(&quot;A&quot; &amp; i)
<span class="TOKEN">If</span> .Value = &quot;x&quot; <span class="TOKEN">Then</span>
.EntireRow.Hidden = <span class="TOKEN">False</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">Next</span> i
[a1] = 1
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> EINAUSBlenden_Click()
ActiveSheet.Unprotect
Zeileeinausblenden
<span class="TOKEN">If</span> [a1] = 0 <span class="TOKEN">Then</span>
EINAUSBlenden.Caption = &quot;Zeilen einblenden&quot;
<span class="TOKEN">Else</span>
EINAUSBlenden.Caption = &quot;Zeilen ausblenden&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
ActiveSheet.Protect
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Schon mal Danke im Voraus für eure Bemühungen.

Gruß,
zytec

Backowe
12.03.2009, 08:46
Hi,

nimm doch einfach eine Checkbox mit folgendem Code:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> CheckBox1_Click()
<span class="TOKEN">Dim</span> i&amp;
Application.ScreenUpdating = <span class="TOKEN">False</span>
<span class="TOKEN">If</span> CheckBox1 <span class="TOKEN">Then</span>
<span class="TOKEN">For</span> i = Cells(Rows.Count, &quot;A&quot;).End(xlUp).Row <span class="TOKEN">To</span> 6 <span class="TOKEN">Step</span> -1
<span class="TOKEN">If</span> LCase(Cells(i, &quot;A&quot;)) = &quot;x&quot; <span class="TOKEN">Then</span>
Cells(i, &quot;A&quot;).EntireRow.Hidden = <span class="TOKEN">True</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Next</span>
<span class="TOKEN">Else</span>
Cells.Rows.Hidden = <span class="TOKEN">False</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Application.ScreenUpdating = <span class="TOKEN">True</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Wilhelm1
12.03.2009, 09:02
Das Problem ist sich einen Wert nach einem Funktionsaufruf zu merken. Dafür fallen mir 3 Lösungen ein: 1. die Caption Egenschaft der Button nutzen, siehe aktualisierter Kode; 2. eine globale Variable; 3. eine Static Variable.

zytec
12.03.2009, 15:43
Erstmal vielen Dank für die schnelle Hilfe. War genau das was ich gesucht habe!

Gruß,
zytec

zytec
17.03.2009, 20:25
Hallo Wilhelm 1,

hab die Version 1 benutzt funktioniert auch soweit. Die Geschwindigkeit des Aus-/Einblendens der Zeilen ist aber ziemlich niedrig - sprich es dauert bei derzeit ca. 600 Zeilen etwa 15s auf einem ziemlich potenten Rechner. Hab die Aktualisierung des Bildschirms während der Berechnung bereits deaktiviert. Hat aber nicht viel gebracht.

Gibts hier noch Potential?

Vielen Dank!
Gruß,
zytec

IngGi
17.03.2009, 21:03
Hallo zytec,

so geht's wesentlich schneller. Setzt voraus, dass in Spalte A in den auszublendenden Zeilen ein (beliebiger) Text steht und in den anderen Zellen der Spalte A entweder eine Zahl oder gar nichts. Die Eintragungen dürfen auch nicht durch eine Formel entstehen, sonst werden die auszublendenden Zeilen nicht erkannt (es geht auch mit Formeln, muss dann aber angepasst werden).

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> EINAUSBlenden_Click()
&nbsp;
ActiveSheet.Unprotect
&nbsp;
<span class="TOKEN">If</span> EINAUSBlenden.Caption = &quot;Zeilen einblenden&quot; <span class="TOKEN">Then</span>
Cells.EntireRow.Hidden = <span class="TOKEN">False</span>
EINAUSBlenden.Caption = &quot;Zeilen ausblenden&quot;
<span class="TOKEN">Else</span>
Range(Range(&quot;A6&quot;), Cells(Rows.Count, 1)).SpecialCells(xlCellTypeConstants, xlTextValues) _
.EntireRow.Hidden = <span class="TOKEN">True</span>
EINAUSBlenden.Caption = &quot;Zeilen einblenden&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
ActiveSheet.Protect
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Gruß Ingolf

zytec
19.03.2009, 07:44
Perfekt - und die Unterscheidung nach Text und "nicht Text" reicht völlig.

Tja ich bin halt ein armseeliges Skriptkiddie
:rolleyes:
Danke trotzdem

Gruß,
zytec