Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1236to1240
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
Werte in Zellen Suchen
Valeri
Hallo liebes Forum,
ich mache aus unserer Urlaubsliste eine zweite Anwesenheitsliste, wo ich Zellen nach bestimmten Kürzeln durchsuche und lösche.
Mein Code dafür sieht so aus:
'Auswertung zu Urlaubsdaten löschen
For Spalte = 3 To 50
For Zeile = 6 To 500
Zeileninhalt = Cells(Zeile, Spalte)
Cells(Zeile, Spalte).Select
If Zeileninhalt = "U" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt = "G" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt = "K" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt = "SU" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt = "EZ" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt = "WB" Then Cells(Zeile, Spalte) = ""
Next Zeile
Next Spalte
Frage:
Ich möchte die suche umgekehrt machen, ich möchte nämlich nach "F", "S", "N", suchen und diese Werte in den Zellen drin lassen, alle anderen Werte sollen gelöscht werden.
Hat den Vorteil, das wenn ein neues Kürzel dazu kommt muss nicht jedes Mal der Code angepasst werden.
Für schön wenn mir jemand helfen könnte.
Gruß
Valeri
AW: Werte in Zellen Suchen
01.11.2011 10:09:54
robert
Hi,
probier mal so:
If Zeileninhalt "F" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt "S" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt "N" Then Cells(Zeile, Spalte) = ""
geht sicher eleganter.....
Gruß
robert
AW: Werte in Zellen Suchen
01.11.2011 10:23:15
Valeri
Hi, Robert
funzt leider nicht, bei dem ersten Durchlauf bleiben die F's stehen, werden aber bei dem zweitem Durchlauf gelöscht weil sie ja nicht dem S entsprechen! Somit habe ich am Ende nur leere Zellen.
Gruß
Valeri
..probier mal den Code - Gruß
01.11.2011 10:49:44
robert

Sub t()
Dim spalte, zeile, zeileninhalt
Application.ScreenUpdating = False
For spalte = 3 To 50
For zeile = 6 To 500
zeileninhalt = Cells(zeile, spalte)
Cells(zeile, spalte).Select
If zeileninhalt  "f" Then
If zeileninhalt  "n" Then
If zeileninhalt  "s" Then
Cells(zeile, spalte) = ""
End If
End If
End If
Next zeile
Next spalte
Application.ScreenUpdating = True
End Sub

Anzeige
Funktioniert Super Danke!!! an Alle
01.11.2011 11:23:03
Valeri
Funktioniert Super Danke!!! an Alle
Gruß Valeri
AW: Werte in Zellen Suchen
01.11.2011 10:50:52
Sheldon
Hallo Valeri,
du musst die If-Schleifen verschachteln, etwa so:
If Zeileninhalt <> "F" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt <> "S" Then Cells(Zeile, Spalte) = ""
If Zeileninhalt <> "N" Then Cells(Zeile, Spalte) = ""
Cells(Zeile, Spalte) = ""
end if
end if
end if
Gruß
Sheldon
noch ein Vorschlag
01.11.2011 11:20:57
Erich
Hi Valeri,
probier mal

Option Explicit
Sub aLangsam()
Dim lngZ As Long, lngS As Long         ' Zeile, Spalte
Dim strInh As String                   ' Zeileninhalt
'Auswertung zu Urlaubsdaten löschen
For lngS = 3 To 50
For lngZ = 6 To 500
Select Case Cells(lngZ, lngS)
Case "F", "S", "N"
Case Else
Cells(lngZ, lngS).ClearContents
End Select
Next lngZ
Next lngS
End Sub
Sub aSchnell()
Dim arW                                ' Array für Werte
Dim lngZ As Long, lngS As Long         ' Zeile, Spalte
'Auswertung zu Urlaubsdaten löschen
arW = Cells(6, 3).Resize(495, 48)
For lngS = 1 To 48
For lngZ = 1 To 495
Select Case arW(lngZ, lngS)
Case "F", "S", "N"
Case Else
arW(lngZ, lngS) = ""
End Select
Next lngZ
Next lngS
Cells(6, 3).Resize(495, 48) = arW
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
P.S. @Sheldon: Hast du mal versucht, deinen Code zu kompilieren?
Anzeige
Die Auswertung ist jetzt Richtig Schnell!!!
01.11.2011 11:38:48
Valeri
Hi Erich,
dein Code funzt ja supper!
Eine deutliche Zeitersparniss mit dem "Schnell"
Vielen Dank!
Gruß
Valeri
und noch ein Tipp
01.11.2011 11:25:35
Erich
Hi Valeri,
du solltest die Namen von Excelfunktionen nicht als Variablennamen verwenden, als nicht Zeile und Spalte
wegen ZEILE() und SPALTE().
Ganz nützlich ist es, Variablennamen mit einem Kürzel für den Typ der Variablen beginnen,
also lngXX für Long, strYY für String.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
@Erich- wir da nicht F,S,N gelöscht? Gruß
01.11.2011 12:00:16
robert
@robert: gelöscht wird bei Else (die arme...) owT
01.11.2011 12:20:36
Erich
AW: @Erich-Sorry..l
01.11.2011 13:41:13
robert
Hi Erich,
mein Fehler - ich hatte mit f,n,s Statt F,N,S
getestet.
Läuft einwandfrei ;-)
Gruß
robert
Anzeige
und noch ein Frage
01.11.2011 12:22:23
Valeri
Hi Erich,
Du bist ja Fuchs ne?
Könntest Du mir das Importieren der Daten auch schneller machen?
Hier mein Code:
'Daten aus dem Urlaubsplan reinkopieren
Dim wksQ As Worksheet, wksZ As Worksheet
Dim SpalteQ As Long, SpalteZ As Long, vAuswahl
Set wksQ = Workbooks("Urlaub aktuell.xls").Worksheets("2011")
Set wksZ = Workbooks("Schichtplan_ELR.xls").Worksheets("Anwesenheit")
vAuswahl = 2 'Zeile deren Inhalt auf Werte >0 geprüft werden soll
Select Case vAuswahl
Case 1, 2
With wksQ
SpalteZ = 0
For SpalteQ = 2 To .Cells(vAuswahl, .Columns.Count).End(xlToLeft).Column
If .Cells(vAuswahl, SpalteQ) > 0 Then
.Columns(SpalteQ).Copy
SpalteZ = SpalteZ + 1
wksZ.Cells(1, SpalteZ).PasteSpecial Paste:=xlPasteFormats
wksZ.Cells(1, SpalteZ).PasteSpecial Paste:=xlPasteValues
End If
Next
End With
End Select
Application.CutCopyMode = False
Hierbei Importiere ich Spalten bei denen in der Zelle in Zeile 2 ein Wert Grösser 1 ist.
Gruß
Valeri
Anzeige
nicht so einfach
01.11.2011 13:04:43
Erich
Hi Valeri,
da du Werte und Formate kopierst, lässt sich das nicht einfach mittels Array erledigen.
Hier sind nur ein paar formale Änderungen (v. Reihenfolge), die aber keinen Zeitgewinn
bringen:

Option Explicit
Sub aTest()                      ' Daten aus dem Urlaubsplan reinkopieren
Dim wksQ As Worksheet, wksZ As Worksheet
Dim lngQ As Long, lngZ As Long, lngAusw As Long
Set wksQ = Workbooks("Urlaub aktuell.xls").Worksheets("2011")
Set wksZ = Workbooks("Schichtplan_ELR.xls").Worksheets("Anwesenheit")
lngAusw = 2             ' Zeile, deren Inhalt auf >0 geprüft werden soll
With wksQ
Select Case lngAusw
Case 1, 2
lngZ = 0
For lngQ = 2 To .Cells(lngAusw, .Columns.Count).End(xlToLeft).Column
If .Cells(lngAusw, lngQ) > 0 Then
.Columns(lngQ).Copy
lngZ = lngZ + 1
wksZ.Cells(1, lngZ).PasteSpecial Paste:=xlPasteFormats
wksZ.Cells(1, lngZ).PasteSpecial Paste:=xlPasteValues
End If
Next lngQ
Application.CutCopyMode = False
End Select
End With
End Sub
Um das zu optimieren, wären die Mappen nützlich (wie viele Spalten, welche Formate, ...).
Warum nutzt du PasteSpecial statt des einfachen Copy? Was soll nicht kopiert werden?
Stehen im Quellblatt Formeln, die durch Werte zu ersetzen wären?
Eine Idee: Wäre es nicht einfacher und schneller, das ganze Quellblatt zu kopieren
und dann die überflüssigen Spalten zu löschen?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: nicht so einfach
01.11.2011 13:27:04
Valeri
Hi Erich,
man könnte auch das ganze Blatt kopieren aber ich möchte trotzdem dann nur die Spalten behalten wo oben der Wert => 1 ist. Weil im Urlaubsplan stehen noch zusätzlich Personen mit drinn die nicht auf den Schichtplan sollen!
Wie würde so ein Spaltenlöschcode den aussehen?
Gruß Valeri
Spaltenlöscher
01.11.2011 16:48:32
Erich
Hi Valeri,
das Löschen könnte so erfolgen:

Option Explicit
Sub myDel()                            ' im kopierten Blatt Spalten löschen
Dim wksZ As Worksheet
Dim lngZ As Long, lngAusw As Long
Dim rngDel As Range
Set wksZ = Workbooks("Schichtplan_ELR.xls").Worksheets("Anwesenheit")
lngAusw = 2                ' Zeile, deren Inhalt auf >0 geprüft werden soll
If lngAusw = 1 Or lngAusw = 2 Then
With wksZ
Set rngDel = .Cells(1, 1)              ' Spalte A immer löschen
For lngZ = 2 To .Cells(lngAusw, .Columns.Count).End(xlToLeft).Column
If IsEmpty(.Cells(lngAusw, lngZ)) Or .Cells(lngAusw, lngZ) 
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
@Erich: Das halten dann manche für UN=>...
01.11.2011 14:37:58
Luc:-?
…„Ungarische Notation”, Erich:
Ganz nützlich ist es, Variablennamen mit einem Kürzel für den Typ der Variablen [zu] beginnen, also lngXX für Long, strYY für String …
Und genau das ist das strenggenommen nicht, sondern einfach nur Unsinn, der euch eingeredet wird! Die ursprgl Intention von Simonyi war 1972 ganz anders — es sollte klassifiziert wdn, nicht typisiert. Es ist doch hier völlig wurscht, ob eine Laufvariable Integer oder Long ist, wichtig ist nur, dass es eine Laufvariable ist! Die MS-Office-Pgmierer haben das seinerzeit auch verstanden und das entsprechende UN-Skriptorensystem übernommen bzw adaptiert, nicht aber später die Windows-Pgmierer, die diesen Unsinn mit den Datentypen in Verkehr gebracht haben, was letztlich den Ruf der UN arg beschädigt und der Clean-Code-Bewegung Aufwind beschert hat. Das kann man alles auch bei Wikipedia unter dem genannten Stichwort nachlesen.
Gruß Luc :-?
Anzeige
AW: Hi Luc,
01.11.2011 18:36:28
klappen
Long, ist etwas "länger" als Integer, der Rest ist eine Stilfrage, stimmt.
Aber besser mit einem Stil als ohne.
Gruß Gerd
Aha, erwischt! ;-)) Gruß owT
01.11.2011 21:38:41
Luc:-?
:-?

338 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige