VBA ganauen Wert suchen
Hallo Excelfreunde,
ich möchte den genauen Wert (Summe) in einer Spalte finden.
A5 = Kalenderwoche nach der In Spalte C gesucht werden soll.
Danke im Voraus für Eure Hilfe
Gruß
fedjo
Spalte C:
50
52
4
5
Wenn ich nach KW (5) suche zeigt das Makro immer KW (50) an. Was muß ich am Makro verändern?
Sub Suchen ()
'aktuelle KW suchen
Dim lngI As Long, strSuch As String, lngAnz As Long
On Error Resume Next
strSuch = Sheets("Lieferzeiten").Range("A5").Value
lngAnz = WorksheetFunction.CountIf(Columns(3), strSuch)
Columns(3).Find(What:=strSuch, LookIn:=xlValues, MatchCase:=False).Activate
For lngI = 1 To lngAnz - 1
End Sub
Antwort schreiben
Antwort 1 von nighty vom 30.01.2021, 16:38 Options
hi fedjo ^^
ein beispiel
gruss nighty
Option Explicit
Sub Suchen()
Dim suche As Range
Set suche = ActiveSheet.Range("C2" & ":C" & ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Row).Find(Range("A5"), lookat:=xlWhole)
If Not suche Is Nothing Then
ActiveSheet.Cells(suche.Row, suche.Column).Select
End If
End Sub
Antwort 2 von nighty vom 30.01.2021, 16:43 Options
hi fedjo :-)
oder besser so ^^
gruss nighty
Option Explicit
Sub Suchen()
Dim suche As Range
With Worksheets("Lieferzeiten")
Set suche = .Range("C2" & ":C" & .Cells(Rows.Count, 3).End(xlUp).Row).Find(.Range("A5"), lookat:=xlWhole)
If Not suche Is Nothing Then
.Cells(suche.Row, suche.Column).Select
End If
End With
End Sub
Antwort 3 von nighty vom 30.01.2021, 17:02 Options
hi fedjo :-)
dann noch einige erklaerungen zu deinem makro ^^
gruss nighty
Sub Suchen()
'lngI ist ueberfluessig da nicht benutzt wird
'strSuch ist als string deklariert,richtig waere integer
'lngAnz ist ueberfluessig da nicht benutzt wird
Dim lngI As Long, strSuch As String, lngAnz As Long
'on error resume next ist in dieser weise nicht erlaubt
On Error Resume Next
strSuch = Sheets("Lieferzeiten").Range("A5").Value
'lngI ist ueberfluessig dadurch ist die ganze zeile ueberfluessig
lngAnz = WorksheetFunction.CountIf(Columns(3), strSuch)
'find function hat fehlerhafte funde durch falsche parameter wie z.b. LookIn:=xlValues
'findfunction geht in den debug modus durch fehlende abfrage auf fund
Columns(3).Find(What:=strSuch, LookIn:=xlValues, MatchCase:=False).Activate
'ueberfluessige zeile einer bruchstueckhaften wiederholungsschleife
For lngI = 1 To lngAnz - 1
End Sub
Antwort 4 von fedjo vom 30.01.2021, 17:52 Options
Hallo nighty,
danke für die schnelle Antwort.
habe den Code etwas verändert, funktioniert super.
Daduch ergibt sich gleich noch eine Frage.
Wie kann ich von der ActiveCell (z.B. F10) bis (F1) alles löschen?
Gruß
fedjo
Antwort 5 von nighty vom 30.01.2021, 18:00 Options
hi fedjo :-)
eine variante
gruss nighty
Range("F1:F" & ActiveCell.Row) = ""
Antwort 6 von fedjo vom 31.01.2021, 10:25 Options
Hallo nighty,
mein Code sieht jetzt so aus und funktioniert auch im Prinzip, aber für einen Spezialisten gibt es sicherlich einige Verbesserungen. Vielleicht könntest du dich noch mal mit dem Makro befassen.
Danke dir im Voraus für deine Hilfe.
Gruß
fedjo
Sub Suchen()
'aktuelle KW suchen
Dim strSuch As Integer
On Error Resume Next
strSuch = Sheets("Lieferzeiten").Range("A5").Value
lngAnz = WorksheetFunction.CountIf(Columns(3), strSuch)
Columns(3).Find(What:=strSuch, LookIn:=xlValues, lookat:= _
xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False).Activate
ActiveCell.Offset(0, 3).Select
Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(3, 0)).Copy
ActiveCell.Offset(0, 1).Select
ActiveSheet.Paste
strSuch = Sheets("Lieferzeiten").Range("A5").Value
lngAnz = WorksheetFunction.CountIf(Columns(3), strSuch)
Columns(3).Find(What:=strSuch, LookIn:=xlValues, lookat:= _
xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False).Activate
ActiveCell.Offset(0, 3).Select
Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(3, 0)).ClearContents
Range("F2:F" & ActiveCell.Row).ClearContents
End Sub
Antwort 7 von nighty vom 31.01.2021, 10:49 Options
Hallo Fedjo ^^
immer gern :-)
setz mich sonntag gleich ran
gruss nighty
nur mal so nebenbei
ich seh da schon wieder on error resume next :-))
dazu einige erlaeuterungen
on error resume next schaltet die fehlerroutine von excel kommplett ab
sinvolle einsatzgebiete waeren hier kleinere functionen z.b.
Public Function SheetExists(strName As String) As Boolean
On Error Resume Next
SheetExists = Not Worksheets(strName) Is Nothing
End Function
auch hier liesse sich das on error resume next zwar vermeiden aber dann haette man hier ein vielfaches an zeilen,da es sich hier aber nur um eine zeile handelt ist es eben sinnvoller es einzusetzen da es keinen weiteren code beeinflussen kann
aber toedlich bei laengeren codes ,da nun nicht mehr eine fehlersuche stattfinden kann und fehlerhafte codes als lauffaehig bezeichnet werden obwohl intern es nur so von fehlern wimmelt
eine andere alternative waere on error goto errorhaendler
anhand von der systemvariablen err liesse sich jetzt gezielt auf fehler reagieren und es sollte eine korrigierung mit anschliessenden ruecksprung erfolgen
hier mal ein beispiel einer fehlerbehandlung
Option Explicit
Sub Beispiel()
On Error GoTo Errorhaendler
Rem beliebiger code
End
Errorhaendler:
If Err = 1004 Then
Rem beliebiger code zum korrigieren
Else
Err.Raise 1004
End If
End Sub
Antwort 8 von nighty vom 31.01.2021, 10:53 Options
hi fedjo
ups das vergass ich ja noch ^^
um eine fehlercodenummer zu erhalten schreibt man zur entwicklungszeit sein makro so das err auf dem bildschirm ausgegeben wird z.b. in eine nicht genutzte zelle
gruss nighty
Antwort 9 von nighty vom 31.01.2021, 10:54 Options
hi fedjo :-)
du weisst ja mittlerweile das ich ein wirrkopf bin ^^
gruss nighty
Antwort 10 von fedjo vom 31.01.2021, 17:36 Options
Hallo nighty,
habe den Code noch mal überarbeitet (ohne Select ), aber ein Fachmann kann in bestimmt noch verbessern.
Gruß
fedjo
Sub Suchen()
'aktuelle KW suchen
Dim strSuch As Integer
strSuch = Sheets("Lieferzeiten").Range("A5").Value
lngAnz = WorksheetFunction.CountIf(Columns(3), strSuch)
Columns(3).Find(What:=strSuch, LookIn:=xlValues, lookat:= _
xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False).Activate
Range("F2:F" & ActiveCell.Row + 3).Copy
Range("G2").PasteSpecial
Columns(3).Find(What:=strSuch, LookIn:=xlValues, lookat:= _
xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False).Activate
Range("F2:F" & ActiveCell.Row + 3).ClearContents
End Sub
Antwort 11 von nighty vom 31.01.2021, 18:05 Options
hi fedjo :-)
falls du noch tueffteln moechtest ^^
die findfunction nach´antwort 2 aufbauen ohne activate
dann koenntest du bei dieser zeile
Range("F2:F" & ActiveCell.Row + 3).ClearContents
auch das entfernen ActiveCell.Row
da du ja ueber
suche.Row
suche.Column
positionen bekommst
gruss nighty
Antwort 12 von fedjo vom 01.02.2021, 11:04 Options
Hi nighty,
ich danke dir noch mal für deine Unterstützung, du hast mir sehr geholfen mein Problem zu lösen.
Ich wünsche dir noch einen schönen Sonntag.
Gruß
fedjo