Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
504to508
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
504to508
504to508
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

verschiedene Zeilen mit einer Prozedur ansprechen

verschiedene Zeilen mit einer Prozedur ansprechen
21.10.2004 10:24:00
Eva
Hallo,
ich beschäftige mich mit dem Auslesen von Werten per VBA. Darunter sind auch bedingte Formatierungen, die ich über if...then anspreche.
Problematisch ist jedoch, dass sich zwei entscheidende Bedingungen zeilenweise abwechseln (zum Beispiel Bed01 Zeile 1,2,8,11; Bed02 Zeile 3-7,9-10). Wie ist es möglich eine Prozedur auf bestimmte Zeilen festzulegen, um die Anweisungen über for ... next zu automatisieren?
Vielen Dank für eure Hilfe,
Eva
AW: verschiedene Zeilen mit einer Prozedur ansprechen
Harald
Hallo Eva,
hier eine Demo. Sie färbt die Zellen im selektierten bereich gemäß ihrer Zeilennummer. Statt der Färbung kannst Du Deine bedingten Abfragen einsetzen.

Sub test()
Dim x As Range
For Each x In Selection
Select Case x.Row
Case 1, 2, 8, 11
'Hier Die Bedingung für die Zeilen im Case-Statement
x.Interior.ColorIndex = 4 'nur zur Demo
Case 3 To 7, 9 To 10
'Hier Die Bedingung für die Zeilen im Case-Statement
x.Interior.ColorIndex = 6 'nur zur Demo
End Select
Next x
End Sub

Gruß Harald
AW: verschiedene Zeilen mit einer Prozedur ansprechen
21.10.2004 13:43:56
Eva
Hallo Harald,
habe den Code folgendermaßen angepasst. Jedoch geschieht nichts. Was habe ich falsch gemacht?
For Each ZeilenNr In Selection
Select Case ZeilenNr.Row

Case 9, 14, 44, 59, 64

If wsOverview.Cells(ZeilenNr, 13)
Cells(Zeile1, 4).Select
Selection.FormatConditions.Delete
Selection.Interior.ColorIndex = 3
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1


Case 3, 4, 5, 9
If wsOverview.Cells(ZeilenNr, 13) > wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1


End Select
Next ZeilenNr
Anzeige
AW: verschiedene Zeilen mit einer Prozedur ansprechen
Harald
Hallo Eva,
mein Code war:
Dim x As Range
For Each x In Selection ...
D.h., x ist eine Variable vom Typ Range.
So wie Du es machst würfelst Du zwei Dinge durcheinander:
For Each ZeilenNr In Selection
Select Case ZeilenNr.Row ' &lt- hier behandelst Du Zeilennummer noch als Range
Case 9, 14, 44, 59, 64
If wsOverview.Cells(ZeilenNr, 13) &lt wsOverview.Cells(ZeileLower, 13) Then ' &lt- hier behandelst Du Zeilennummer als Long oder Integer, nämlich als Zeilennummer
Also:
Die for-Schleife läuft über alle Zellen des selktierten Bereiches, daher muss die Laufvariable (bei mir x) den Typ Range haben.
In der Select Case Abfrage fragst Du aber die Zeilennummer ab, also musst Du auf x.row referenzieren.
Dein Code müsste also etwa so aussehen (wobei ich die Abfragen innerhalb jetzt nicht weiter geprüft habe):
Dim Zelle as Range
Dim Zeilennummer as Long
For Each Zelle In Selection
Zeilennummer = Zelle.row
Select Case ZeilenNr
Case 9, 14, 44, 59, 64
If wsOverview.Cells(ZeilenNr, 13) &lt wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)
Cells(Zeile1, 4).Select
Selection.FormatConditions.Delete
Selection.Interior.ColorIndex = 3
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1
Case 3, 4, 5, 9
If wsOverview.Cells(ZeilenNr, 13) &gt wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1
End Select
Next Zelle
Alles klar?
Gruß Harald
Anzeige
AW: verschiedene Zeilen mit einer Prozedur ansprechen
21.10.2004 14:59:23
Eva
Hallo Harald,
mir ist es noch nicht klar. Erlaube bitte, dass ich dir mein Ziel erkläre.
Die If - Funktion wird nicht angesprochen. Ich möchte erreichen, dass Excel erst auf die Case01 greift und dort in Zeile 9 die Bedingung prüft und ausführt und weiter zu Zeile 14 springt und die Bedingung ausführt.
Dann wird Case02 angesprochen, wo ähnlich Zeile 3,4,5,9 nacheinander angesprochen werden und die Bedingung ausgeführt wird.
Bedarf es dazu noch einer Schleife innerhalb von Case01 und Case02?
Wo müsste ich den Ort hinschreiben, wo die For each Schleife läuft? (Vorher ws.activate?)
For Each Zelle In Selection
ZeilenNr = Zelle.Row

Select Case ZeilenNr
Case 9, 14, 44, 59, 64

If wsOverview.Cells(ZeilenNr, 13) 'kleiner als' wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)

Cells(Zeile1, 4).Select
Selection.FormatConditions.Delete
Selection.Interior.ColorIndex = 3
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1

Case 3, 4, 5, 9
If wsOverview.Cells(ZeilenNr, 13) 'größer als' wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1
End Select
Next Zelle
Gruß,
Eva
Anzeige
AW: verschiedene Zeilen mit einer Prozedur ansprechen
Harald
Hallo Eva,
Deine Erklärungen verwirren mich ein wenig.
Möglicherweise hast Du die Select-Case Struktur nicht vollständig erfasst?
Normalerweise verwendet man sie so:
Select Bedingung
Case Bedingung 1 erfüllt dann... (Bedingung1 hier die Abfrage auf Zeilennummer 9, 14, 44, 59, 64)
Case Bedingung 2 erfüllt dann... (Bedingung hier die Abfrage auf Zeilennummer 3, 4, 5, 9)
end Select.
D.h., es wird nur eines der beiden Dann Konstrukte ausgeführt. VBA prüft NICHT, ob erst Bedingung1 erfüllt ist und anschließend auch noch Bedingung 2!
Meinst Du vielleicht so:
For Each Zelle In Selection
ZeilenNr = Zelle.Row
Select Case ZeilenNr
Case 9, 14, 44, 59, 64
If wsOverview.Cells(ZeilenNr, 13) 'kleiner als' wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)
Cells(Zeile1, 4).Select
Selection.FormatConditions.Delete
Selection.Interior.ColorIndex = 3
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1
Select case Zeilennummer
Case 3, 4, 5, 9
If wsOverview.Cells(ZeilenNr, 13) 'größer als' wsOverview.Cells(ZeileLower, 13) Then wsAuslesenBSC_Abt.Cells(Zeile1, 4) = wsOverview.Cells(ZeilenNr, 13)
ZeileLower = ZeilenNr + 4
Zeile1 = Zeile1 + 1
End Select
End Select
Next Zelle
Gruß Harald
Anzeige
AW: verschiedene Zeilen mit einer Prozedur ansprechen
21.10.2004 15:42:59
Eva
Hallo Harald,
wir haben uns nicht falsch verstanden.
Die Zeilen der Case01 sollen nach Bedingung01 geprüft werden. Unabhängig davon die Zeilen von Case02 nach Bedingung02.
Mein Problem ist, dass letztlich das Auslesen nicht funktioniert, was der Sinn von diesem Code sein soll.
Ich habe eine Datei angehängt: https://www.herber.de/bbs/user/12449.xls
Problematisch für mich war, die bedingte Formatierung zu umgehen, die sich zu allem Übel von Parameter zu Parameter ändert. Dein Vorschlag scheint mir perfekt, da für Parameter (habe insgesamt 50) mit den gleichen bedingten Formatierungen eine Case - Gruppierung stattfindet.
Bei einer Überwachung habe ich festgestellt, dass Excel sich gar nicht in den durch die Case Selektierung angegebenen Zeilen befindet. Kannst du mir bitte nochmal helfen?
Gruß, Eva
Anzeige
AW: verschiedene Zeilen mit einer Prozedur ansprechen
Harald
Hallo Eva,
leider kann ich mit der Beispieldatei wenig anfangen, da Dein Makro nicht drin ist. Du verwendest Objekte wie wsOverview, wsAuslesenBSC_Abt, die offenbar nicht standardmäßig zu Excel gehören (selbst definiert?). Damit kann ich nichts anfangen.
Ich habe den Code mal radikal vereinfacht:

Sub test()
Dim zelle As Range
Dim zeilenNr As Long
For Each zelle In Selection
zeilenNr = zelle.Row
Select Case zeilenNr
Case 9, 14, 44, 59, 64
Debug.Print "Case01, In Zeile " & zeilenNr
End Select
Select Case zeilenNr
Case 3, 4, 5, 9
Debug.Print "Case02, In Zeile " & zeilenNr
End Select
Next zelle
End Sub

Im Arbeitsblatt den Bereich K8...X18 markiert, dann das Makro laufen lassen. Das ergibt folgendes Ergebnis:
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 9
Case02, In Zeile 9
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Case01, In Zeile 14
Wie Du siehst, werden für Zeile 9 beide Fälle durchlaufen, für Zeile 14 nur case02.
Nur so eine Idee am Rande: Die for-each Schleife setzt in dieser Form voraus, dass der zu bearbeitende Bereich im Arbeitsblatt auch markiert ist. Ist das bei Dir der Fall?
Falls nicht, kannst Du den zu bearbeitenden Bereich auch so angeben:
For Each zelle In Range("K8:X18") 'Hier natürlich Deinen Bereich einsetzen.
Gruß Harald
Anzeige
AW: verschiedene Zeilen mit einer Prozedur ansprechen
22.10.2004 10:17:54
Eva
Hallo Harald,
bitte schließe den Thread. Ich bin Anfänger und verwende jetzt wieder if ... then.
So sprechen wir wenigstens nicht aneinander vorbei.
Gruß, Eva

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige