Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1468to1472
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

Verinfachung

Verinfachung
27.01.2016 09:32:58
Larissa
Hallo,
ich habe folgenden Code, den ich gerne vereinfachen würde:
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For x = letztezeile To 2 Step -1
If Range("C" & x).Value > Range("G" & x).Value And Range("D" & x).Value  Range("G" & x).Value And Range("D" & x).Value > Range("G" & x) _
.Value And IsNumeric(Range("G" & x).Value) And (Range("C" & x).Value) / 2 = Range("G" & x).Value Then
Range("G" & x).Interior.ColorIndex = 0
End If
If Range("C" & x).Value > Range("H" & x).Value And Range("D" & x).Value  Range("G" & x).Value And Range("D" & x).Value > Range("H" & x) _
.Value And IsNumeric(Range("H" & x).Value) And (Range("C" & x).Value) / 2 = Range("H" & x).Value Then
Range("H" & x).Interior.ColorIndex = 0
End If
Next
Der Vergleich geht noch über weitere 10 bestimmte Zellen I, J, K, M, N, O etc. Es wird aber immer mit der Zelle C und D verglichen. Gibt es jetzt eine Möglichkeit, dass ich nicht Copy + Paste immer die entsprechende Zeile ändere?
Würde mich über eine Idee wie ich das eleganter lösen kann sehr freuen.
Liebe Grüße

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Verinfachung
27.01.2016 11:06:20
ChrisL
Hi Larissa
Testen konnte ich es nicht, aber im Prinzip so...
Sub t()
Dim letztezeile As Long
Dim x As Long, y As Byte
Dim rng As Range
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For x = letztezeile To 2 Step -1
For y = 7 To 25 ' Buchstabe 7 = G bis Buchstabe 25 = O
Set rng = Cells(x, 7)
If Range("C" & x).Value > rng.Value And Range("D" & x).Value  rng.Value And Range("D" & x).Value > rng.Value And  _
IsNumeric(rng.Value) And (Range("C" & x).Value) / 2 = rng.Value Then
rng.Interior.ColorIndex = 0
End If
Next y
Next x
End Sub

cu
Chris

Anzeige
Tippfehler
27.01.2016 13:06:09
Michael
Hi zusammen,
ChrisL hat die richtige Idee, sich aber vertippt.
Statt Set rng = Cells(x, 7)
muß es heißen Set rng = Cells(x, y)
Ansonsten sind es für meinen Geschmack viel zu viele Tabellenzugriffe...
Ich schicke es mal ab wegen des Tippfehlers und melde mich noch mal,
Gruß,
Michael

Ups... Danke o.T.
27.01.2016 13:29:39
ChrisL
.

AW: Verinfachung
27.01.2016 11:09:18
ChrisL
Hi Larissa
Testen konnte ich es nicht, aber im Prinzip so...
Sub t()
Dim letztezeile As Long
Dim x As Long, y As Byte
Dim rng As Range
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For x = letztezeile To 2 Step -1
For y = 7 To 25 ' Buchstabe 7 = G bis Buchstabe 25 = O
Set rng = Cells(x, 7)
If Range("C" & x).Value > rng.Value And Range("D" & x).Value  rng.Value And Range("D" & x).Value > rng.Value And  _
IsNumeric(rng.Value) And (Range("C" & x).Value) / 2 = rng.Value Then
rng.Interior.ColorIndex = 0
End If
Next y
Next x
End Sub

cu
Chris

Anzeige
Vorschlag
27.01.2016 13:55:35
Michael
Hi zusammen,
hier mal zum Testen:
Option Explicit
Sub test()
Dim letztezeile As Long, z As Long, s As Long
Dim rC As Variant, rD As Variant, rG As Variant
Dim spalten As Variant
spalten = Array("G", "H", "I", "J", "K", "M", "N", "O")
' *****     Zitat:           G, H, I,  J,  K,  M, N, O etc.
' also z.B. ohne "L"?!
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For z = letztezeile To 2 Step -1
rC = Range("C" & z).Value
rD = Range("D" & z).Value
For s = LBound(spalten) To UBound(spalten)
rG = Range(spalten(s) & z).Value
If rC > rG And rD  rG And rD > rG And _
IsNumeric(rG) And rC / 2 = rG Then
Range(spalten(s) & z).Interior.ColorIndex = 0
End If
Next s
Next z
End Sub
Ich lade den Wert jeder Zelle nur *einmal*, so daß a) Vergleiche ohne andauernde Zugriffe aufs Tabellenblatt erfolgen (das ist deutlich schneller) und b) der Code "kleiner" und (zumindest für meinen Geschmack) damit übersichtlicher ist.
Kernstück ist das Array "Spalten", in dem alle benötigten Spaltenbuchstaben mit "" eingetragen und dann vom Makro Spalte für Spalte abgearbeitet werden.
Das Makro ist nur "halb" optimiert; richtig gut wäre es, den kompletten Bereich als Array einzulesen, dann flutscht das auch bei ein paar 1000 Zeilen - falls überhaupt nötig.
Außerdem: die Logik selbst kann man sicher verbessern. Eine Umstellung der If-Verschachtelung würde ich aber nur angehen wollen, wenn ich Beispieldaten kenne.
Kritisch finde ich auf alle Fälle, *zuerst* Vergleiche mit kleiner/größer vorzunehmen und *dann erst* zu prüfen, ob der Wert in G überhaupt numerisch ist: letzteres gehört sich in die allererste If-Abfrage.
Schöne Grüße,
Michael

Anzeige
AW: Vorschlag
29.01.2016 07:21:15
Larissa
Wow, tolle Idee und wahrscheinlich schon fast alles richtig.
habe den Code nun folgendermaßen angepasst
Option Explicit
Sub test()
Dim letztezeile As Long, z As Long, s As Long
Dim rC As Variant, rD As Variant, rG As Variant
Dim spalten As Variant
spalten = Array("D", "G", "H", "J", "K", "M", "N", "O", , "P", "S", "T", "U", "V", "W", "X", "Z" _
)
' *****     Zitat:           G, H, I,  J,  K,  M, N, O etc.
' also z.B. ohne "L"?!
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For z = letztezeile To 2 Step -1
rC = Range("C" & z).Value
rD = Range("D" & z).Value
For s = LBound(spalten) To UBound(spalten)
rG = Range(spalten(s) & z).Value
If IsNumeric(rG) Then
If rC > rG And rD  rG And rD > rG And _
IsNumeric(rG) And rC / 2 = rG Then
Range(spalten(s) & z).Interior.ColorIndex = 0
End If
End If
Next s
Next z
End Sub
Jetzt bekomme ich aber eine Fehlermeldung "Typen unverträglich" nachdem er zwei Werte richtig gefärbt hat. In den Zellen steht teilweise ein "-", daher die "isNumeric"-Abfrage. Wisst ihr wo der Fehler liegt?

Anzeige
AW: Vorschlag
29.01.2016 12:06:38
Michael
Hi Larissa,
zwei Sachen fallen mir auf den ersten Blick auf:
a) bei
spalten = Array("D", "G" ....
ist "D" enthalten, d.h. Du überprüfst die Spalte D mit sich selber - ist das erwünscht?!
b) hier: "O", , "P" ist ein Komma zu viel: ich hatte es erst draußen und dann wieder reingemacht: der Fehler liegt genau da dran.
Ich interpretiere das mal so: durch das zusätzlich Komma wird ein "leeres" Element in das Array spalten eingefügt, und wenn in der Zeile
    rG = Range(spalten(s) & z).Value

(hier bleibt VBA bei mir stehen) versucht wird, dem Range ein "Nichts" als Spaltenbuchstaben zuzuweisen, spuckt es.
Zur Logik: Du hast ja das isnumeric ganz an den Anfang gesetzt; allerdings fragst Du es erneut im mittleren elseif-Zweig ab - das ist doppelt gemoppelt und kann rausgelöscht werden.
Überprüfe bitte kurz den 1. und den 3. Fall, da wird rD und rG verglichen; rD=rG fehlt.
Analog bei 1. und 2., da fehlt rC=rG.
Ich hab Dir auf dem 2. Blatt mal so was wie eine Wahrheitsmatrix skizziert; so ähnlich kannst Du mehrere verschachtelte Ifs auf Papier notieren und Dir einen Überblick verschaffen, was passiert.
Die Datei: https://www.herber.de/bbs/user/103141.xls
Schöne Grüße,
Michael

Anzeige
AW: Vorschlag
29.01.2016 12:25:18
Larissa
Vielen Dank für deine Mühe! Ich weiß das sehr zu schätzen. Es funktioniert jetzt einwandfrei!

na fein, danke für die Rückmeldung owT
29.01.2016 13:02:30
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige