Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Gleiche Tabellen untereinander-VBA Code anpasse

Gleiche Tabellen untereinander-VBA Code anpasse
19.11.2013 14:47:29
Björn
Hallo,
ich bin totaler VBA Laie. Ich habe eine Tabelle, die ich insgesamt 70x untereinander benötige. _ Jetzt habe ich einen Code der im Grunde nichts anderes tut, als Zeilen auszublenden wenn in Zelle XY der Wert Private Sub Worksheet_Change(ByVal Target As Range) If Range("D5") = "1" Then Rows("3:6").Hidden = False If Range("D5") = "1" Then Rows("7:36").Hidden = True If Range("D5") = "2" Then Rows("3:11").Hidden = False If Range("D5") = "2" Then Rows("12:36").Hidden = True If Range("D5") = "3" Then Rows("3:16").Hidden = False If Range("D5") = "3" Then Rows("17:36").Hidden = True If Range("D5") = "4" Then Rows("3:21").Hidden = False If Range("D5") = "4" Then Rows("22:36").Hidden = True If Range("D5") = "5" Then Rows("3:26").Hidden = False If Range("D5") = "5" Then Rows("27:36").Hidden = True If Range("D5") = "6" Then Rows("3:31").Hidden = False If Range("D5") = "6" Then Rows("32:36").Hidden = True If Range("D5") = "7" Then Rows("3:36").Hidden = False End Sub
Das ist jetzt für die erste Tabelle. Darunter habe ich aber nochmal 69 Tabellen. D5 entspricht bei der zweiten Tabelle dann entsprechend D43. Also ein Sprung von 38 Zeilen. Kann ich jetzt irgendwie ein Schleife einbinden, damit ich das ganze nicht noch 69 mal machen muss?
Zum besseren Verständins. Das ganze wird eine Kapazitätsmatrix in der zu fertigende Teile dargestellt werden. Es soll also ein ganzes Projekt dort berechnet werden. Da manche Teile aus mehreren Schritten entstehen und andere wieder aus nur einem entsteht,möchte ich diese Auswahl treffen. So soll es übersichtlicher werden, vor allem wenn man viele Teile hat aber nur wenige Schritte. Dann ist die Tabelle nämlich nicht so lang, ansonsten würde man bei Zeile 2660 ankommen.
Gruß,
Björn

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Gleiche Tabellen untereinander-VBA Code anpasse
19.11.2013 15:10:56
Klaus
Hi Björn,
ich halte es zwar prinzipiell falsch, einen solchen Code über "Worksheet_Change" auszuführen, aber bitte:
Private Sub Worksheet_Change(ByVal Target As Range)
'Das "Zeilen-Verstecken" ausgelagert und mit Variable X versehen.
'Im Prinzip jetzt so:
'    Call WeHideSomeRows(0)
'    Call WeHideSomeRows(38)
'    Call WeHideSomeRows(76)
'Aber noch einfacher als Schleife (mit ein paar Variablen):
Const TabellenAnzahl As Long = 69
Const ZeilenSprung As Long = 38
Dim lCount As Long
'führe den Code 69 mal aus
For lCount = 0 To TabellenAnzahl - 1
'Zeilen-Offset ist 0, 38, 76 ....
Call WeHideSomeRows(lCount * ZeilenSprung)
Next lCount
End Sub
Sub WeHideSomeRows(x As Integer)
If Range("D5") = "1" Then Rows(x + 3 & ":" & x + 6).Hidden = False
If Range("D5") = "1" Then Rows(x + 7 & ":" & x + 36).Hidden = True
If Range("D5") = "2" Then Rows(x + 3 & ":" & x + 11).Hidden = False
If Range("D5") = "2" Then Rows(x + 12 & ":" & x + 36).Hidden = True
If Range("D5") = "3" Then Rows(x + 3 & ":" & x + 16).Hidden = False
If Range("D5") = "3" Then Rows(x + 17 & ":" & x + 36).Hidden = True
If Range("D5") = "4" Then Rows(x + 3 & ":" & x + 21).Hidden = False
If Range("D5") = "4" Then Rows(x + 22 & ":" & x + 36).Hidden = True
If Range("D5") = "5" Then Rows(x + 3 & ":" & x + 26).Hidden = False
If Range("D5") = "5" Then Rows(x + 27 & ":" & x + 36).Hidden = True
If Range("D5") = "6" Then Rows(x + 3 & ":" & x + 31).Hidden = False
If Range("D5") = "6" Then Rows(x + 32 & ":" & x + 36).Hidden = True
If Range("D5") = "7" Then Rows(x + 3 & ":" & x + 36).Hidden = False
End Sub
Grüße,
Klaus M.vdT.

Anzeige
AW: Gleiche Tabellen untereinander-VBA Code anpasse
20.11.2013 06:39:34
Björn
Hallo Klaus,
erst einmal vielen Dank für die Hilfe. Ich habe leider keine Ahnung was Worksheet_Change mir für einen Vor-Nachteil bringt. Ich habe mir das alles aus dem I-Net zusammengebastelt. Der Code funktioniert dahingehend schonmal, dass man alle Tabellen abgearbeitet hat. Allerdings werden jetzt alle Zeilen der Tabellen ausgeblendet in Abhängigkeit von der ersten Tabelle.
Also wenn ich bei "D5" eine "1" auswähle, werden die restlichen Zeilen der Tabelle ausgeblendet und auch die der anderen. Die Tabellen sollen untereinander also unabhängig sein.
Dann muss man doch für D5 auch einfach eine Variable definieren, die bei D5 beginnt und im 38er Step hochzählt, oder?
Gruß,
Björn

Anzeige
AW: Gleiche Tabellen untereinander-VBA Code anpasse
20.11.2013 07:44:54
Klaus
Dann muss man doch für D5 auch einfach eine Variable definieren, die bei D5 beginnt und im 38er Step hochzählt, oder?
Genau! Sorry, du hattest nicht explizit genug gesagt dass die Bedingungs-Zelle auch hochzählt. Nehmen wir einfach das "x" das wir bereits haben!
Sub WeHideSomeRows(x As Integer)
If Range("D" & 5 + x) = "1" Then Rows(x + 3 & ":" & x + 6).Hidden = False
If Range("D" & 5 + x) = "1" Then Rows(x + 7 & ":" & x + 36).Hidden = True
If Range("D" & 5 + x) = "2" Then Rows(x + 3 & ":" & x + 11).Hidden = False
If Range("D" & 5 + x) = "2" Then Rows(x + 12 & ":" & x + 36).Hidden = True
If Range("D" & 5 + x) = "3" Then Rows(x + 3 & ":" & x + 16).Hidden = False
If Range("D" & 5 + x) = "3" Then Rows(x + 17 & ":" & x + 36).Hidden = True
If Range("D" & 5 + x) = "4" Then Rows(x + 3 & ":" & x + 21).Hidden = False
If Range("D" & 5 + x) = "4" Then Rows(x + 22 & ":" & x + 36).Hidden = True
If Range("D" & 5 + x) = "5" Then Rows(x + 3 & ":" & x + 26).Hidden = False
If Range("D" & 5 + x) = "5" Then Rows(x + 27 & ":" & x + 36).Hidden = True
If Range("D" & 5 + x) = "6" Then Rows(x + 3 & ":" & x + 31).Hidden = False
If Range("D" & 5 + x) = "6" Then Rows(x + 32 & ":" & x + 36).Hidden = True
If Range("D" & 5 + x) = "7" Then Rows(x + 3 & ":" & x + 36).Hidden = False
End Sub
Oder, etwas eleganter und übersichtlicher, so:
(ist im Prinzip das gleiche, nur übersichtlicher geschrieben. Durch das Abschalten von ScreenUpdating sollte es performanter und ohne Bildschirmflackern laufen)
Sub WeHideSomeRows(x As Integer)
Application.Screenupdating = False
Select Case Range("D" & 5 + x)
Case 1
Rows(x + 3 & ":" & x + 6).Hidden = False
Rows(x + 7 & ":" & x + 36).Hidden = True
Case 2
Rows(x + 3 & ":" & x + 11).Hidden = False
Rows(x + 12 & ":" & x + 36).Hidden = True
Case 3
Rows(x + 3 & ":" & x + 16).Hidden = False
Rows(x + 17 & ":" & x + 36).Hidden = True
Case 4
Rows(x + 3 & ":" & x + 21).Hidden = False
Rows(x + 22 & ":" & x + 36).Hidden = True
Case 5
Rows(x + 3 & ":" & x + 26).Hidden = False
Rows(x + 27 & ":" & x + 36).Hidden = True
Case 6
Rows(x + 3 & ":" & x + 31).Hidden = False
Rows(x + 32 & ":" & x + 36).Hidden = True
Case 7
Rows(x + 3 & ":" & x + 36).Hidden = False
Case Else
'nix
End Select
Application.Screenupdating = True
End Sub
Worksheet_Change bewirkt, dass der Code bei jeder Änderung aufgerufen wird. Sobald der Code mal so komplex wird dass er zB 1 sekunde durchläuft, wird das extrem nervig.
Grüße,
Klaus M.vdT.

Anzeige
AW: Gleiche Tabellen untereinander-VBA Code anpasse
20.11.2013 08:27:44
Björn
Worksheet_Change bewirkt, dass der Code bei jeder Änderung aufgerufen wird. Sobald der Code mal so komplex wird dass er zB 1 sekunde durchläuft, wird das extrem nervig.
Das merke ich gerade. Der Bildschirm flackert extrem erstmal für 3 sek nach jeder Änderung. Was kann ich denn an Stelle von Worksheet_Change nehmen?
Der neue Code funktioniert super, halt bis auf das flackern. Vielen Dank dafür. Bin erstaunt, wie schnell einem hier geholfen wird. Ich werde hier jetzt wohl des öfteren vorbeischauen ;)
Und noch eine Frage. Da ich Excel immer interessanter finde und in den nächsten Jahren wohl mehr damit zu tun haben werde, möchte ich mich da gerne weiterbilden. Kannst du mir vielleicht Literatur dazu empfehlen? Auf lange sicht werde ich wohl mal einen Kurs besuchen müssen aber vorab möchte ich mich schonmal gerne einlesen. Bin in Excel+VBA Anfänger. Meine bisherigen Erfahrungen beschränken sich auf einfache Berechnungen und wenn-und-oder Formeln.
Grüße,
Björn

Anzeige
Worksheet_Change nur in Spalte D ...
20.11.2013 08:57:28
Klaus
Kannst du mir vielleicht Literatur dazu empfehlen?
www.herber.de :-)
Was kann ich denn an Stelle von Worksheet_Change nehmen?
Du kannst die Code-Ausführung im Worksheet_Change zB davon abhängig machen, dass der Cursor sich in Spalte D befindet. Dann wird der flacker-Code nicht mehr ausgeführt, wenn du in A oder Z eine Eingabe machst.
Ich muss jetzt ins Meeting :-) Wenn bis heute nachmittag keiner eine Lösung postet, mache ich einen Beispielcode für dich!
Grüße,
Klaus M.vdT.

AW: Worksheet_Change nur in Spalte D ...
20.11.2013 10:57:55
Björn
Hi,
so ich habe jetzt erstmal noch dieses hier eingefügt:
If Target.Column = 4 then
End If

jetzt beschränkt sich das ganze schon mal nur auf Spalte D. Muss ich jetzt aber damit leben, dass wenn ich in Spalte D etwas änder, das ganze Blatt dann sekundenlang flackert? Es wäre jetzt nicht so schlimm, ich denke die späteren Anwender hätten damit nicht so ein Problem...
Ansonsten bin ich offen für Verbesserungen.
Gruß,
Björn

Anzeige
AW: Worksheet_Change nur in Spalte D ...
20.11.2013 13:43:35
Klaus
Hi,
das Zeilenflackern kommt, weil bei 69 einzel-Aufrufen eben der Code 69 mal durchläuft - auch wenn du ihn nur ein mal brauchst.
Folgende wilde Idee hätte ich, damit der Code nur aus Spalte D und nur für die Zeilen 5, 43, 81 .... und so weiter ausgeführt wird (also für jede 38te Zeile ab der 5ten:)
Private Sub Worksheet_Change(ByVal Target As Range)
'Das "Zeilen-Verstecken" ausgelagert und mit Variable X versehen.
Const ErsteZeile As Long = 5
Const MeineSpalte As Long = 4
Const ZeilenSprung As Long = 38
Dim lCount As Long
'prüfe auf Spalte D
If Target.Column = MeineSpalte Then
'prüfe auf Zeile = 5 + x*38
If VBA.Round((Target.Row - ErsteZeile) / ZeilenSprung) = ((Target.Row - ErsteZeile) /  _
ZeilenSprung) Then
'Führe den Code 1-Mal aus, nur für die geänderte Tabelle
Application.ScreenUpdating = False
Call WeHideSomeRows((Target.Row - ErsteZeile) / ZeilenSprung)
Application.ScreenUpdating = True
End If
End If
End Sub
Statt 68 "blinden" Aufrufen für Bereiche in denen sich nichts geändert hat, nur ein "gezielter" Aufruf für den geänderten Bereich. Zustätzlich natürlich das Screenupdating abgeschaltet.
Hilfts?
Grüße,
Klaus M.vdT.

Anzeige
AW: Worksheet_Change nur in Spalte D ...
20.11.2013 14:22:47
Björn
Hi,
also ich habe Private Sub jetztmit dem neuen Code ersetzt. Es flackert nicht mehr, allerdings geht jetzt nur noch die erste Tabelle, die anderen nicht mehr. Fehlt da vielleicht noch der Code lCount irgendwo? der wird zwar deklariert oder initialisiert? (also der wird da oben angegeben ;) ) aber nicht weiter verwendet.
Gruß

AW: Worksheet_Change nur in Spalte D ...
20.11.2013 14:39:53
Klaus
Hi Björn,
lCount ist ein Artefakt aus der letzten Version, das kannst du löschen. Gut gesehen!
Probier den Code bitte nochmal aus. Wenn du D5 änderst, soll sich die erste Tabelle ändern. Änderst du D43 (38 Zeilen später), soll sich nur die zweite Tabelle ändern.
Wenn das bei dir nicht klappt, anonymisier bitte deine Datei und lade ein Muster mit den ersten 4-5 Tabellenbereichen hoch!
Grüße,
Klaus M.vdT.

Anzeige
AW: Worksheet_Change nur in Spalte D ...
21.11.2013 13:59:07
Klaus
Hi Björn,
war nur ein Denkfehler bei der Übergabe von x! Try this:
Private Sub Worksheet_Change(ByVal Target As Range)
'Das "Zeilen-Verstecken" ausgelagert und mit Variable X versehen.
Const ErsteZeile As Long = 5
Const MeineSpalte As Long = 4
Const ZeilenSprung As Long = 38
'prüfe auf Spalte D
If Target.Column = MeineSpalte Then
'prüfe auf Zeile = 5 + x*38
If VBA.Round((Target.Row - ErsteZeile) / ZeilenSprung) = ((Target.Row - ErsteZeile) / _
ZeilenSprung) Then
'Führe den Code 1-Mal aus, nur für die geänderte Tabelle
Application.ScreenUpdating = False
Call WeHideSomeRows(Target.Row - ErsteZeile)
Application.ScreenUpdating = True
End If
End If
End Sub
Sub WeHideSomeRows(x As Integer)
Select Case Range("D" & 5 + x).Value
Case 1
Rows(x + 3 & ":" & x + 6).Hidden = False
Rows(x + 7 & ":" & x + 36).Hidden = True
Case 2
Rows(x + 3 & ":" & x + 11).Hidden = False
Rows(x + 12 & ":" & x + 36).Hidden = True
Case 3
Rows(x + 3 & ":" & x + 16).Hidden = False
Rows(x + 17 & ":" & x + 36).Hidden = True
Case 4
Rows(x + 3 & ":" & x + 21).Hidden = False
Rows(x + 22 & ":" & x + 36).Hidden = True
Case 5
Rows(x + 3 & ":" & x + 26).Hidden = False
Rows(x + 27 & ":" & x + 36).Hidden = True
Case 6
Rows(x + 3 & ":" & x + 31).Hidden = False
Rows(x + 32 & ":" & x + 36).Hidden = True
Case 7
Rows(x + 3 & ":" & x + 36).Hidden = False
Case Else
'nix
End Select
End Sub

Anzeige
AW: Worksheet_Change nur in Spalte D ...
21.11.2013 14:10:50
Björn
:) Es funktioniert.
Mannomann, ich bin dir überaus dankbar. Ich hoffe es hat dich nicht zu sehr beansprucht...
Jetzt kann ich das bei der nächsten Präsentation vorführen, ohne dieses Discofeeling und ich muss nicht bei der vierten Tabelle aufhören ;)
Nochmals vielen Dank.
Grüße,
Björn

Danke für die Rückmeldung! owT
21.11.2013 14:21:13
Klaus
.

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige