Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 64727 Skopiuj do schowka Iteracja tylko po widocznych komórkach zakresu
Autor Wiadomość
mancia14 
Exceloholic


Pomógł: 2 razy
Posty: 176
Wysłany: 12-04-2019, 08:49   Iteracja tylko po widocznych komórkach zakresu

Cześć!
Pracuję nad makrem, które pozwoliłoby na iterację tylko po komórkach widocznych w wyfiltrowanym zakresie.

W załączniku plik do testów.

Opis:

Kolumnę A filtruje, aby pozostały mi tylko wartości "Paweł". Uruchamiam makro, które prosi o zakres interesujących mnie komórek. W tym momencie wskazuje wszystkie komórki z wartością "Paweł", czyli zakres A2:A13.

Chciałbym, aby makro brało pod uwagę tylko widoczne komórki wybranego zakresu, a bierze ono wszystkie po kolei, co obrazuje wyskakujące okienko msgbox. Ma ono wyświetlić kolejno wiersze: 2,3,5,8,10,13.

Czy jest sposób na zrobienie iteracji tylko po widocznych komórkach zakresu?

Wiem, że można to zrobić przy użyciu konstrukcji For each … Next, ale w moim makro może się zdarzyć, że makro w trakcie działania będzie musiało powrócić do wcześniejszej wartości zmiennej "i". Wstawię warunek, po którym i = i-1. Może da się wrócić do wcześniejszej komórki w konstrukcji For each … Next? To załatwiłoby sprawę.


Prosze o pomoc.

iteracja ukrytych komórek zakresu.xlsm
Pobierz Plik ściągnięto 4 raz(y) 17.95 KB

ID posta: 365915 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Wersja: Win Office 2019
Pomógł: 2103 razy
Posty: 6940
Wysłany: 12-04-2019, 09:30   

Kod:
Sub problem()
    Dim kom            As Variant
    Dim rng            As Excel.Range

    Set rng = ActiveSheet.Range("Tabela1[Imię]").SpecialCells(xlCellTypeVisible)

    For Each kom In rng
        MsgBox kom.Row
    Next

End Sub
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki.
ID posta: 365922 Skopiuj do schowka
 
 
mancia14 
Exceloholic


Pomógł: 2 razy
Posty: 176
Wysłany: 12-04-2019, 12:35   

Nie do końca o to chodzi, bo chciałbym jeżeli makro przejdzie powiedzmy do wiersza nr 10 mieć możliwość powrotu do wiersza nr 8, czyli mówiąc po chłopsku cofnąć iterację.
Jest taka możliwość w konstrukcji For each ... Loop ?
ID posta: 365938 Skopiuj do schowka
 
 
mancia14 
Exceloholic


Pomógł: 2 razy
Posty: 176
Wysłany: 12-04-2019, 13:21   

Kombinuję w taki sposób:

Kod:
Sub problem_2()
    Dim rng            As Excel.Range
    Dim rng_count      As Integer
    Dim i              As Integer
   
    Set rng = ActiveSheet.Range("Tabela1[Imi?]").SpecialCells(xlCellTypeVisible)
    rng_count = rng.Count

    For i = 1 To rng_count
        MsgBox rng(i)
    Next i

End Sub


Ale pętla i tak nie bierze pod uwagę tylko widocznych komórek...

Jakieś pomysły?
ID posta: 365940 Skopiuj do schowka
 
 
keri85 
Fan Excela


Pomógł: 35 razy
Posty: 86
Wysłany: 12-04-2019, 13:57   

A takie cudo aby numery widocznych wierszy pobrać sobie do tablicy i jak będzie konieczność "cofnięcia" się w iteracji to będzie można odnieść się do wcześniejszej wartości z tablicy ?
Kod:
Sub problem()
    Dim kom            As Variant
    Dim rng            As Excel.Range
    Dim tbl() As Long
    Dim i As Long
    Set rng = ActiveSheet.Range("Tabela1[Imię]").SpecialCells(xlCellTypeVisible)
    ReDim tbl(1 To rng.Count)
    For Each kom In rng
        i = i + 1
        tbl(i) = kom.Row
    Next
    For i = LBound(tbl) To UBound(tbl)
        MsgBox tbl(i)
    Next
End Sub
ID posta: 365944 Skopiuj do schowka
 
 
Tajan


Pomógł: 4311 razy
Posty: 9587
Wysłany: 12-04-2019, 14:01   

Tutaj raczej należy zastosować dodatkową pętlę aby widoczne komórki umieścić w strukturze która umożliwi iterację jakiej oczekujesz. Może to być tablica lub kolekcja. Przykładowo:
Kod:
Sub problem_()
    Dim rng            As Excel.Range
    Dim kom            As Excel.Range
    Dim rng_coll       As New Collection
    Dim rng_count      As Integer
    Dim i              As Integer
   
    Set rng = ActiveSheet.Range("Tabela1[Imię]").SpecialCells(xlCellTypeVisible)
   
    For Each kom In rng
        rng_coll.Add kom
    Next
   
    rng_count = rng_coll.Count

    For i = 1 To rng_count
        MsgBox rng_coll(i)
    Next i

End Sub
ID posta: 365945 Skopiuj do schowka
 
 
mancia14 
Exceloholic


Pomógł: 2 razy
Posty: 176
Wysłany: 12-04-2019, 14:53   

Dziękuje keri85 oraz Tajan.

Oba sposoby rozwiązują mój problem :)

Temat do zamknięcia.
ID posta: 365952 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe