Kategorie szkoleń | Egzaminy | Kontakt
  • 5
  • 0
  • 1

W arkuszu A mamy tabelę z wartościami; kolumna A np. nazwiska pracowników, w kolumnie B staż pracy pracownika. W arkuszu B w kolumnie A mamy nazwiska pracowników i chcemy w kolumnie B dopisać wartości stażu pracy dla pracowników z kolumny A. Jak w VBA napisać funkcję wyszukaj pionowo, która wykona dopasowanie, w miarę możliwości jak najbardziej automatycznie i w oderwaniu od konkretnych adresów komórek. 

Pozdrawiam i z góry dziękuję za pomoc.
Piotr Czerwiński.

Piotr_Czerwiński
  • Zapytał
  • @ Piotr_Czerwiński | 11.02.2020
    • 0
    • 0
    • 0

Odpowiedzi (5)

  • 0
Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 11.02.2020
    • 2
    • 4
    • 8
Komentarze
Skoro już w VBA grzebiemy, to ja bym jednak proponował użyć metody Range.Find, ponieważ oferuje dużo szersze pole manewru z rezultatem wyszukania - choćby możliwość zwrotu całego wiersza wartości przy jednorazowym wyszukaniu lub możliwość prostego przejścia do kolejnych/poprzednich rezultatów (FindNext i FindPrevious).
Skomentował : @ Mirosław_Janiak ,12.02.2020
  • 1
  • 7
  • 1
  • 0

Źle się wyraziłem. Chodziło mi właśnie o to, jak zdefiniować zmienne szukana i zakres oraz jak pisać to do kolumny B w arkuszu B.

Piotr_Czerwiński
  • Odpowiedział
  • @ Piotr_Czerwiński | 11.02.2020
    • 0
    • 0
    • 0
Komentarze
Nie wyrażaj się, wrzuć plik - jeden załącznik jest więcej wart niż tysiąc słów :)
Skomentował : @ Mirosław_Janiak ,12.02.2020
  • 1
  • 7
  • 1
  • 0

Ja zrobiłbym to pętlą for each.

ZAKRES to Arkusz A Kolumna A i B.

 

For Each c in ZAKRES

SZUKANA = c.value

Arkusz B kolumna b = WorksheetFunction.VLookup(SZUKANA, ZAKRES, 2, False) /tu oczywiście odpowiednie przesunięcie

next c

Ale po co w VBA? Przecież można to zrobić wbudowanymi funkcjami.

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 11.02.2020
    • 2
    • 4
    • 8
Komentarze
A mogę prosić o lekkie rozwinięcie temat. Załączyłem plik, są w nim miasta i ilość mieszkańców i gdybym chciał wykorzystać vlookup podany wyżej to jak mam zdefiniować zakres i szukaną no i adres gdzie ma być wklejona wartość?
Skomentował : @ Piotr_Czerwiński ,20.02.2020
  • 0
  • 0
  • 0
  • 0

OK. Dorzucam załącznik. Bardzo bym prosił o informację, jak wyciągnąć ilość samochodów na mieszkańca w arkuszu B.
Chciałbym to ogólnie dopisać do większej procedury, więc jakby można to było wytłumaczyć tak łopatologicznie, to byłbym wdzięczny. Łącznie z tym, jak zdefiniować zakres i szukaną, bo jakoś mi to nie idzie.

Z góry dziękuję za pomoc.

Załączniki

  • xlsx

    vlookup.xlsx ( 10K )
Piotr_Czerwiński
  • Odpowiedział
  • @ Piotr_Czerwiński | 19.02.2020
    • 0
    • 0
    • 0
  • 2
Sub wyszukaj()
'deklaracje zmiennych
Dim r_src As Range, r_dest As Range, rng As Range, src As Range

'przypisuję przeszukiwany zakres z arkusza A do zmiennej r_src
'dzięki instrukcji With unikam wielokrotnego powtarzania nazwy arkusza,
'do którego sie odnoszę, zastępuje go kropka przed poleceniem
With Worksheets("A")
   'wybieram zakres od drugiego wiersza w kolumnie A do ostatniego niepustego
   'polecenie .Cells(.Rows.Count, 1).End(xlUp) to odpowiednik ustawienia się
   'w ostatnim wierszu pierwszej kolumny arkusza i naciśnięcia ctrl+up
   Set r_src = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

'na identycznej zasadzie przypisuję do zmiennej zakres, z którego
'chcę pobrać wyszukiwane nazwy i gdzie mam dopisać dane
With Worksheets("B")
   Set r_dest = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

'uruchamiam pętlę, w której przechodzę kolejno przez wszystkie komórki
'docelowego zakresu
For Each rng In r_dest
   'wyszukuję daną nazwę miasta w zakresie na arkuszu A
   'przeszukuję wartości (xlValues) i ograniczam wyniki do całej komórki (xlWhole),
   'żeby np. do Bielska nie dopisała się wartość z Bielska Białej
   Set src = r_src.Find(What:=rng.Value, LookIn:=xlValues, LookAt:=xlWhole)
   
   'ustawiam odwołanie na komórkę, do której ma zostać przepisany wynik
   With rng.Offset(0, 1)
      'sprawdzam, czy metoda Find zwróciła wynik (znalazła dopasowanie)
      If Not src Is Nothing Then
         'jeżeli znalazła, dopisuję dwie kolumny w prawo od szukanej
         'wartość z komórki o cztery kolumny w prawo od znalezionej
         .Value = src.Offset(0, 4).Value
      Else
         'czyszczę komórkę docelową (można tu też np. wpisać "brak")
         .Value = ""
      End If
   End With
Next

End Sub

 

 
Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 20.02.2020
    • 1
    • 7
    • 1
Komentarze
Super. Działa. Udało mi się dostosować do mojej procedury nie jest to vlookup :) ale działa i będzie odporne na zmiany kolumn w danych źródłowych. Nie trzeba nagrywać i kombinować.
Dzięki wielkie za podpowiedź.
Skomentował : @ Piotr_Czerwiński ,20.02.2020
  • 0
  • 0
  • 0