PDA

Vollständige Version anzeigen : Zelle unter bestimmten Bedingungen leeren


Vigo2
20.07.2014, 16:45
Hallo zusammen!

Ich versuche Folgendes umzusetzen. Ich habe eine Tabelle, die wie folgt aufgebaut ist:
Ich hab in Spalte B, D und H Bezeichnungen stehen. In H müssen keine Bezeichnungen stehen (das ist nun rein zufällig so, dass hier überall etwas steht)
Nun möchte ich gerne mit einen Code umsetzen:
wenn in Spalte H ein "x" vorkommt und die Bezeichnung in Spalte D mit "S8*" beginnt, dann soll sich eine Variable die Bezeichnung in Spalte B merken (sagen wir mal, dass diese Bezeichnung der Variable cc zugewiesen wird), dann soll geschaut werden, ob in Spalte D eine Bezeichnung "S8" existiert, welche in H entweder "GT" oder "VT" besitzt und in Spalte B dieselbe Bezeichnung wie wie dieses cc. Wenn das der Fall ist, dann soll das "GT" oder das "VT" in Spalte H gelöscht werden.
Es ist etwas schwierig zu erklären. Ich hab eine Beispieldatei hochgeladen. Um die grün eingefärbten Zeilen geht es, in Spalte J steht das Ergebnis.

Hier ist ein kleiner Ausschnitt:


A B C D E F G H Ergebnis
AUF S8 VT
AUF S8, S2 x x



Ich hab versucht das so umzusetzen:

Option Explicit

Sub yy()

Dim rr As Long
Dim tt As Long
Dim lol As Long
Dim cc, dd As Variant

With Worksheets("Tabelle1")
lol = .Cells(Rows.Count, 1).End(xlUp).Row
For rr = 2 To lol
If .Cells(rr, 4).Value Like "*S8*" And .Cells(rr, 4).Offset(0, 4).Value = "x" Then
Set cc = .Cells(rr, 4).Offset(0, -2)
For tt = 2 To lol
If .Cells(tt, 4).Value = "S8" And (.Cells(tt, 4).Offset(0, 4).Value = "GT" Or .Cells(tt, 4).Offset(tt, 4).Value = "VT") Then
Set dd = .Cells(tt, 4).Offset(0, -2)
If dd = cc Then
.Cells(tt, 8) = ""
End If
End If
Next tt
End If
Next rr
End With

End Sub


Das Problem ist, es passiert rein gar nichts!!! Und ich versteh nicht wieso!?
Hat jemand von euch eine Idee?

Viele Grüße, Vigo2

Hasso
20.07.2014, 18:00
Hallo Vigo2,

warum lädtst du eine Mappe ohne Makros hoch?lol = .Cells(Rows.Count, 1).End(xlUp).RowHier ermittelst du die letzte Zeile in Spalte A mit Daten - dort stehen aber gar keine. Deshalb wird deine Schleife auch gar nicht ausgeführt.For rr = 2 To lol '(lol hat den Wert 1)

Vigo2
20.07.2014, 18:06
Hier ist die Mappe mit Makros...

Achso, du bist den Code mit F8 durchgegangen. Das hätt ich ja auch mal versuchen können^^ Aber ich seh den Wald vor lauter Bäumen nicht... Ich versuch mich noch mal...

Vigo2
20.07.2014, 19:21
Ich hab nun
lol = .Cells(Rows.Count, 1).End(xlUp).Row
durch
lol = Sheets("Tabelle1").UsedRange.SpecialCells(xlCellTypeLastCell).Row
ersetzt.
Leider funktioniert das Ganze doch noch nicht so richtig. Er leer nur 2 von 7 Zellen...
Dieses "dd" wird nicht überschrieben...

Hat jemand eine Idee woran das liegen kann?

Mc Santa
20.07.2014, 19:50
Hallo,

ich habe mir deinen Code nicht näher angesehen, und kann daher nicht genau sagen, woran es liegen kann.

Allerdings kann ich dir meine Lösung präsentieren. Mein Code setzt voraus, dass Spalte B sortiert ist, so wie in der Beispieltabelle:
Sub su()
Dim rng As Range, delR As Range
Dim delB As Boolean
With Worksheets("Tabelle1")
For Each rng In .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp))
If Left(rng.Offset(, 2), 2) = "S8" Then
Select Case rng.Offset(, 6)
Case "x": delB = True
Case "VT", "GT":
If delR Is Nothing Then
Set delR = rng.Offset(, 6)
Else
Set delR = Union(delR, rng.Offset(, 6))
End If
End Select
End If
If Not rng.Offset(1) = rng Then
If delB Then delR.Clear
delB = False
Set delR = Nothing
End If
Next rng
End With
End Sub

Fragen und Feedback sind willkommen :)
Viele Grüße
Mc Santa

Vigo2
20.07.2014, 20:30
Hallo Mc Santa!

Dein Code funktioniert super! Hmmm, du hast das Ganze ganz anders aufgezogen als ich es versucht hab...

Kannst du mir erklären was genau dieses "union" macht?

Set delR = Union(delR, rng.Offset(, 6))

Und dann bin ich noch über die "(1)" verwundert? Das ist ja eine feste "1".
If Not rng.Offset(1) = rng Then

Vielen Dank für deine Hilfe!

Viele Grüße, Vigo2

Mc Santa
20.07.2014, 21:00
Hallo,

Mein Code arbeitet so, dass ich alle Zellen durchlaufe und mir dabei alle Zellen in der Variable delR merke, die möglicherweise gelöscht werden müssen.
Außerdem prüfe ich deine Bedingung und speichere mir in der Variable delB, ob ich auch löschen muss.
Sobald der Wert in Spalte B wechselt, lösche ich, falls es was zu löschen gibt. Und setze dann die beiden Variablen zurück.

Union verbindet zwei Zellenbereiche zu einem.
hier verbinde ich den Bereich aus der Variable delR und der durchlaufenden Zelle*, zusammen in der Variable delR.
(*genauer gesagt die Zelle 6 Spalten rechts davon. Da ich Spalte B durchlaufe, merke ich mir den Zellenbereich in Zelle H).

Bei der zweiten If Abfrage prüfe ich, ob in der nächsten Zeile (von Spalte B) das gleiche steht, wie aktuell. Falls das der Fall ist, kann ich löschen.

Weitere Fragen?

VG

Vigo2
21.07.2014, 09:59
Ok, danke für deine Erläuterungen. Ich werd mir den Code noch einmal genauer anschauen.

Hast du denn Code noch einmal geändert?

Vielen, vielen Dank für deine Hilfe!

Mc Santa
21.07.2014, 10:15
Halllo,

Habe kurz nach dem Erstellen eine etwas bessere Version mit Select-Case eingestellt, dadurch spart man sich einige Abfragen und der Code ist schneller.

Ich denke, er ist jetzt auch verständlicher :)

VG