VBA makro Wyszukiwanie wszystkich

0

Cześć,
próbuję zrobić makro, które będzie wypisywać nazwy wszystkich wózków mających określona nośność.
w pole wpisuje nośność
przycisk uruchamia makro i poniżej wyskakuje lista wszystkich wózków które są w stanie unieść dany ciężary

Sub WyszukajWszystkie2(Szukana As String, Zakres As Range, Nrkolumny As Integer, Wstaw As Range)

    Dim i As Integer, j As Integer
    For i = 1 To Zakres.Rows.Count
        If Zakres.Cells(i, 2) > Szukana Then
            Wstaw.Offset(0, j) = Zakres.Cells(i, Nrkolumny)
            j = j + 1
        End If
    Next i
End Sub

Sub Wywołaj()
    Call WyszukajWszystkie2(Range("C4"), Range("N8:P11"), 2, Range("C9"))
End Sub

screenshot-20190403224243.png

Gdzie mam błąd, że ciągle zwraca mi wszystkie wartości?

0

if zakres.cells(i, 3)>szukana then

1

No cóż, porównujesz stringi, czyli napisy, a nie liczby. Tu masz wyjaśnione, skąd takie wyniki: https://docs.microsoft.com/pl[...]n-operators#comparing-strings

Powinieneś zrobić coś w tym stylu:

If CInt(Zakres.Cells(i, 2)) > CInt(Szukana) Then
0

Okej, rozumiem :)
znalazłem rozwiązanie, a powiecie mi, co zrobić gdy będę chciał wyszukać na podstawie kilku parametrów lub gdy parametr będzie wyrazem a nie wartością liczbową? jaki rodzaj zmiennej wtedy zadeklarować ? :)

z ciekawości, jak uodpornić makro na przesunięcie tabeli, dodanie do niej nowej kolumny, wstawienie gdzieś kolumny/wiersza ? jesli makro odnosi sie do komórki c5 a ja wstawię kolumnę po kolumnie A to makro dalej odnosi sie do komórki c5 a nie d5 w której wtedy znajduje się już moja wartość.

0

Zasada jest taka że porównujesz ten samy typ danych np. string ze string, integer z integer itd. Co do porównywaniu kilku parametrów to używasz słowa And lub Or w zależności od wybranej logiki np:

if Arkusz1.Range("A1") = "W1" And Arkusz1.Range("B1") > 100 then (...)

Makro możesz uodpornić na dwa sposoby:

  1. Tworzysz tabelkę z koordynatami i w razie zmiany położenia ręcznie zmieniasz symbol kolumny
  2. Dynamicznie wyszukujesz nazwy kolumny w arkuszu poprzez funkcję Range.Find

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0