Elektroda.pl
Elektroda.pl
X
SterControl
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Excel, VBA] Przeszukiwanie "niedokładne" bazy danych.

qrczaq 28 Paź 2011 08:07 3222 6
  • #1 28 Paź 2011 08:07
    qrczaq
    Poziom 9  

    Witam.

    Piszę, gdyż borykam się z pewnym problemem. Przejżałem tematy związane z wyszukiwaniem, ale niestety nie znalazłem tam odpowiedzi. Możliwe że jest to spowodowane stanem mojej wiedzy z zakresu VBA.
    Przechodząc do rzeczy. Miałem do napisania wyszukiwarkę, która wygląda następująco: w arkuszu "szukanie" znajduje się TextBox oraz przycisk "szukaj", w arkuszu "dane" znajduje się baza danych, która ma być przeszukana. W bazie mamy kolumny: typ łożyska, numer urządzenia, podzespół. Wyszukiwarka zrobiona jest łopatologicznie, ponieważ dopiero zaczynam przygodę z VBA, ale działa. W obecnym kształcie po wpisaniu w arkuszu "szukanie" w textboxie typu łożyska i kliknięciu Szukaj poniżej wypisywane są wszystkie wiersze gdzie znajduje się szukany typ łożyska. Chciałbym jednak wprowadzić następującą modyfikację: obecnie wyszukiwarka przeszukuje tylko kolumnę z typem łożyska w bazie, a chciałbym aby przeszukiwała wszystkie trzy kolumny z danych (czyli żeby można było wyszukiwać tak po typie łożyska, jak i numerze urządzenia bądź podzespole). Co więcej chciałbym aby wyszukiwanie było "niedokładne", tzn. po wpisaniu typu łożyska "22" wypisane były wersy z łożyskami: 22, 221, 223, ogólnie wszystkie wystąpienia ciągu "22". Kombinuję coś z cell.find, ale idzie mi jak po grudzie, dlatego proszę o pomoc.

    P.S. Moja wyszukiwarka oparta jest o proste porównanie stringów "Like" wrzucone w pętle, ale jest to wyszukiwanie "dokładnie". Chyba że można to jakoś zmodyfikować.

    Z góry dzięki za wszelkie podpowiedzi.

    0 6
  • SterControl
  • #2 28 Paź 2011 08:57
    adamas_nt
    Moderator Programowanie

    Dla szukania po fragmencie, w argumencie instrukcji Like wystarczy wstawić string pomiędzy gwiazdki (Shift_8).
    Range.Find znajdzie Ci tylko pierwsze wystąpienie. Maże zastosować jakieś filtrowanie. Link

    Najlepiej, gdybyś wrzucił jakiś przykład w załączniku (z tym makro do poprawki).

    0
  • SterControl
  • #3 04 Lis 2011 08:43
    qrczaq
    Poziom 9  

    Witam ponownie.

    Można powiedzieć, że coś już kombinowałem z ujęciem stringa w gwiazdki "*string*". Jest tylko jeden problem. Wspomniany string wprowadzany jest przez textboxa. Innymi słowy jak kazać VBA żeby do wartości wpisanej do textboxa dodał "*" na końcach? Pierwsza moja myślo to: control= *textbox.value* Like wzorzec
    Oczywiście okazała się ona błędna, ale może to dlatego że to moja pierwsza przygoda z VBA :D . Dlatego też ponawiam moją prośbę o jakeś podpowiedzi. W załączniku przesyłam fragment kodu odpowiedzialny za wyszukiwanie.

    Pozdrawiam i z góry dzięki.

    0
  • Pomocny post
    #4 04 Lis 2011 09:45
    adamas_nt
    Moderator Programowanie

    Spróbuj

    Code:
    Control = TextBox1 Like "*" & ActiveWorkbook.Sheets("Dane").Cells(i, 3) & "*" 'Porównanie

    0
  • #5 04 Lis 2011 11:07
    qrczaq
    Poziom 9  

    Spróbowałem.
    Niestety nie działa, albo jak kto woli działa tylko nie tak jak potrzeba :cry: . Mianowicie w obecnym kształcie makro przeszukuje kolumnę z typem łożyska (później będzie przeszukiwać wszystkie kolumny bazy, aby móc wpisywać różne kryteria szukania, nie tylko typ łożyska) i z jakiegoś powodu wypisuje wszystkie wersy gdzie komórka kolumny "typ łożyska" jest pusta. No chyba że wpiszemy do wyszukania dokładny symbol łożyska ( czyli w całości, a nie np. dwie pierwsze cyfry). Wtedy wypisuje wszystkie wersy gdzie komórka kolumny "typ łożyska" jest pusta oraz wersy z wpisanym typem. Nie mam pojęcia czemu przyjmuje pustą komórkę jako spełniającą kryterium porównania. Może ma to związek z resztę kodu dotyczącą wypisania i tabeli?
    Załączam kod niemalże w całości, bo może coś tam jest nie tak. Ostrzegam że niektóre elementy mogą wydać się śmieszne, ale obiecuję że w następnym moim makrze będzie już wszystko ładnie i ekonomicznie :D .

    0
  • #6 04 Lis 2011 11:15
    adamas_nt
    Moderator Programowanie

    Jeśli komórka w Sheets("Dane").Cells(i, 3) jest pusta, zastają tylko gwiazdki i wtedy Control=True

    Może pomoże coś instrukcja warunkowa. Np

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #7 07 Lis 2011 08:55
    qrczaq
    Poziom 9  

    Witam.

    Wreszcze pokonałem dziada. Jeśli chodzi o kwestię samego wyszukiwania, to rozwiązałem to podobnie jak w Twojej odpowiedzi. Można powiedzieć że takie lustrzane odbicie twojej wersji :D

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Trzeci wers kodu załatwia sytuację, gdy ktoś wdusi "szukaj" bez wpisania czego szuka. Bez tego wybiegu działo się to o czym pisałeś, czyli makro wypisywało całą bazę danych, bo że się tak wyrażę "wszystko mu pasowało".

    Wielkie dzięki za wszelkie podpowiedzi i pomoc.
    A jeśli ktoś ma podobne problemy jak ja, to w załączniku umieszczam (prawie cały) kod mojej wyszukiwarki.
    Pozdrawiam

    0