logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VBA - Makro do wyszukiwania wartości w pionie, przeszukujące dynamiczne zakresy arkusza

kklg 26 Mar 2023 20:43 543 6
REKLAMA
  • #1 20509922
    kklg
    Poziom 6  
    Posty: 30
    Ocena: 1
    Potrzebuję makro wyszukujące zadaną wartość w nieokreślonym zakresie arkusza.
    Nie mogę określić konkretnego zakresu ponieważ zakresy są różne.

    Wyszukiwanie zawsze zaczyna się od A1.
    Makro zawierające: "For Each komórka In ActiveSheet.Cells" wyszukuje zadaną wartość przeszukując arkusz w poziomie tzn. komórka A1, B1, C1 ..., następnie A2, B2, C2 itd.

    Ja potrzebuję żeby makro przeszukiwało arkusz w pionie tzn. A1, A2, A3..., następnie B1, B2, B3..., C1, C2, C3...itd.

    W makrze jest kod zatrzymujący przeszukiwanie po spełnieniu określonego kryterium. Jeżeli wyłączę ten kod uzyskuję założony cel tylko niepotrzebnie przeszukiwany jest CAŁY arkusz.

    Proszę o podpowiedzi w formie zrozumiałej dla osoby początkującej.
  • REKLAMA
  • #2 20510212
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Jeśli oczekujesz konkretnej podpowiedzi zamieść przykładowy plik.
    Jeśli wystarczy Ci odpowiedź ogólna, to zainteresuj się metodą Range.Find
    Nie przeszukuj całego arkusza, tylko jego używaną część Activesheet.UsedRange.
    Sama metoda Find ma kilka parametrów, m.in. parametr SearchOrder, który określa, czy arkusz ma być przeszukiwany wierszami czy kolumnami.

    Na pewno będzie to dużo szybsze niż For Each cell in Activesheet.Cells
  • REKLAMA
  • #3 20510263
    kklg
    Poziom 6  
    Posty: 30
    Ocena: 1
    Sub zmiana_formatu()

    Dim komórka As Object
    Dim a As String 'a - format komórki


    For Each komórka In Range("A:A")
    If komórka.NumberFormat = "h:mm:ss" Then komórka.NumberFormat = "h:mm"

    If komórka = "" And komórka.Offset(1, 0) = "" Then Exit Sub
    Next komórka

    End Sub

    To makro przeszukuje kolumnę A i kończy działanie jeśli dwie kolejne komórki są puste.
    Potrzebuję żeby zamiast opuścić Sub przeszukało kolumnę B, potem C itd. aż do spełnienia warunku, który dopiszę później.

    DZIĘKUJĘ za pomoc.
  • REKLAMA
  • #4 20510271
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Prosiłem o załącznik, żeby było wiadomo jaki jest układ danych i żeby było na czym przetestować zaproponowany kod.

    Czy te poszukiwane komórki stanowią ciąg kolejnych komórek, czy są rozmieszczone w kolumnie losowo, rozdzielone innymi komórkami (z innym formatowaniem)?
    Czy w kolejnych kolumnach jest tyle samo wypełnionych komórek (przynajmniej z grubsza), czy w każdej kolumnie inaczej?
  • REKLAMA
  • #5 20510529
    kklg
    Poziom 6  
    Posty: 30
    Ocena: 1
    W załączniku przykładowy plik.
    Struktura danych zawsze jest taka sama.
    Załączniki:
    • przykładowy plik.zip (200.54 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 20510563
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Już myślałem, że się nie doczekam na ten plik.
    Proponuję taki kod:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
    Wstawiłem instrukcję Stop po każdej kolumnie, bo napisałeś, że później zdecydujesz, ile kolumn zamienić. Gdybyś chciał zamienić wszystko, to tę instrukcję można usunąć (lub zakomentować).
    Gdybyś znał z góry liczbę kolumn, to w nagłówku pętli zamiast .Columns.Count podaj konkretną liczbę np. 3.

    Załączony plik po wykonaniu makra.
    Załączniki:
    • przykładowy plik1.zip (206.7 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 20515147
    kklg
    Poziom 6  
    Posty: 30
    Ocena: 1
    To jest dobre rozwiązanie. W mojej książce o VBA nie ma o tym ani słowa.

    DZIĘKUJĘ!

Podsumowanie tematu

✨ Użytkownik poszukiwał makra VBA do przeszukiwania wartości w pionie w dynamicznych zakresach arkusza, zaczynając od komórki A1. Zamiast przeszukiwania całego arkusza, sugerowano użycie metody Range.Find oraz przeszukiwanie tylko używanego zakresu (UsedRange). Użytkownik dostarczył przykładowy plik, co umożliwiło lepsze zrozumienie struktury danych. Ostatecznie zaproponowano kod, który przeszukuje kolumny w pionie, z możliwością zatrzymania po każdej kolumnie, co pozwala na dalsze dostosowanie. Użytkownik wyraził zadowolenie z rozwiązania, które nie było opisane w jego książce o VBA.
REKLAMA