Temat: makro lastRow

Mam pewien problem z lastRow. Napisałem poniższe makro do przeszukiwania wszystkich arkuszy w celu znalezienia "szukanej". W każdym arkuszu makro szuka od wiersza 7 do lastRow. I tu mam problem taki, że jak w Sht 1 lastRow = 7 ,a w Sht 2 lastRow =2 i załączę makro w Sht 2 to makro przeszukuje mi także w Sht 1 tylko 2 wiersze. Rozumiem to, ale szukam sposobu żeby przeszukał mi także 5 pozostałych wierszy. Prosiłbym o pomoc.

Sub znajdz()
Dim numerWiersza As Integer
Dim sht As Worksheet
Dim wiersz As Integer
Dim kolumna As Byte
Dim szukana As String
Dim lastRow As Integer
Dim lastColumn as Byte
With ActiveSheet
lastRow = .Cells(.Rows.Count, "A").End(xlUp).row
lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With
numerWiersza = 3
szukana = InputBox("Znaleziona fraza zostanie przekopiowana do arkusza ''skopiowane'' " & vbCrLf & vbCrLf & vbCrLf & "CZEGO SZUKASZ?", "Szukanie")
If szukana = "" Then Exit Sub
For Each sht In ThisWorkbook.Worksheets
If sht.Name <> "wykaz teczek" Then
For wiersz = 7 To lastRow
For kolumna = 1 To lastColumn
If sht.Cells(wiersz, kolumna).Value Like "*" & szukana & "*" Then
sht.Cells(wiersz, kolumna).Rows.EntireRow.Copy
sheets("skopiowane").Select
sheets("skopiowane").Rows(numerWiersza).Select
numerWiersza = numerWiersza + 1
ActiveSheet.Paste
Exit For
End If
Next kolumna
Next wiersz
End If
Next sht
If numerWiersza = 3 Then
Call MsgBox("Brak danych", vbInformation, "Informacja")
Exit Sub
End If
End Sub
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: makro lastRow

Jednym z powodów twojego błędu jest złe zrozumienie deklaracji zmiennych
Dim numerWiersza As Integer
Dim wiersz As Integer
Dim kolumna As Byte
Dim lastRow As Integer
Dim lastColumn as Byte

Zobacz w hepie jakie limity mają te oznaczenia.
Info w Helpie aplikacji.

Temat: makro lastRow

nie do końca rozumiem co się kryje pod słowem limity. Chodzi Ci o zakres działania zmiennej czy jej rozmiar?
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: makro lastRow

Widzę że nie rozumiesz.
Odpal helpa i skonfrontuj zmienną z potrzebami.
Dojdź do tego samamemu, bo sytuacja się powtórzy przy najbliższej okazji i albo co s wcale nie będzie działać albo zrobi ci psikusa po jakimś czasie.

Temat: makro lastRow

Rozwiązałem problem i wszystko działa.

Interesuje mnie jednak Twoja zagadka. Uczę się dopiero także cenię sobie każdą uwagę.
Chodzi Ci o zdeklarowanie zmiennej jako lokalnej? Powinna być modułowa ?
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: makro lastRow

Nie napisałem nic o lokalnej czy globalnej deklaracji.
Zwróciłem ci tylko uwagę na to że dobór deklaracji definiuje typ zmiennej.
Skoro pracujesz w Excelu i chcesz wykonywać działania w pętli to musisz tak dobrać zmienną aby nie było powodu do przerwania jej pracy.

Wszystkie zadeklarowane przez ciebie są błędne (poza deklaracją arkusza).
A powinny być jednakowe i wystarczające do tego zadania.

Temat: makro lastRow

czyli powinienem wybrać albo Byte albo Integer dla wszystkich zmiennych liczbowych, w zależności od potrzeby ?
Marzanna Szulta

Marzanna Szulta właściciel, Usługi
Informatyczne
SZULTASET

Temat: makro lastRow

Integer i Byte nie są jedynymi typami zmiennych. Może coś zaczynającego się np. na literę L?
Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: makro lastRow

Kam-an...

'– Pytanie kolejne. Zatem. Jak się nazywa miasto nad Wisłą. Dla ułatwienia dodajemy, że jest to imię króla, który zostawił Polskę murowaną.
(...) – Panie Kazimierzu! Ma pan klucz od kabiny?
– Bardzo państwa proszę, nie podpowiadać. Bardzo proszę.
– Kluczbork.
– Odpowiedź prawidłowa – Kazimierz.
– Roman.'

http://excelvbatutor.com/index.php/excel-vba-2010-less...
Marzanna Szulta

Marzanna Szulta właściciel, Usługi
Informatyczne
SZULTASET

Temat: makro lastRow

No dobra, nie chciałam wchodzić Oskarowi w paradę, tym bardziej, że też jestem zwolenniczka wędki, a nie ryby.
Te wszystkie zmienne powinny mieć zadeklarowany typ Long. Zmienna Integer to maksymalnie 32 tysiące z groszami, co w stosunku do liczby wierszy w arkuszu jest niewiele.
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: makro lastRow

Sławomir K.:
Rozwiązałem problem i wszystko działa.

Dlatego chciałem sprawdzić jak problem został rozwiązany.
Przecież nie sztuka skorzystać gotowca i dalej żyć w przekonaniu swojej racji.
Sławek po prostu nie sprawdził !
Tylko zgrywa głupa, zadając kolejne pytanie.
Wystarczyło kliknąć F1 i przeczytać 3 zdania na ten temat.

Temat: makro lastRow

Nie palę głupa tylko żeś się nieprecyzyjnie wyrażał. Wiem, że jest coś takiego jak Long, nawet double . Tylko , że do tego co robię w zupełności wystarczy mi Integer, a w przypadku kolumn nawet Byte. Po co rezerwować pamięć na Long jak to nigdy nie zostanie wykorzystane?
Problem sam sobie rozwiązałem nie korzystając z żadnego gotowca. Tylko wkurzony jestem, że straciłem czas na zastanawianie się co miałeś na myśli.
Sławomir Broda

Sławomir Broda VBA, Excel, Access,
SAP i wszystko
związane z
automatyzac...

Temat: makro lastRow

Pewnie, że zmienne są za małe, żeby pomieścić indeksy wszystkich wierszy/kolumn, ale to nie o to pytał autor.
Przenieś wyszukiwanie końców zakresów do pętli For each
Poniżej przykład jako kopiować range bez niepotrzebnego selectowania:
http://msdn.microsoft.com/en-us/library/office/ff83776...
I alternatywa na wyszkowianie:
http://msdn.microsoft.com/en-us/library/office/ff83974...

Sub znajdz()
Dim numerWiersza As Integer
Dim sht As Worksheet
Dim wiersz As Integer
Dim kolumna As Byte
Dim szukana As String
Dim lastRow As Integer
Dim lastColumn as Byte

numerWiersza = 3
szukana = InputBox("Znaleziona fraza zostanie przekopiowana do arkusza ''skopiowane'' " & vbCrLf & vbCrLf & vbCrLf & "CZEGO SZUKASZ?", "Szukanie")
If szukana = "" Then Exit Sub
For Each sht In ThisWorkbook.Worksheets
If sht.Name <> "wykaz teczek" Then

With sht
lastRow = .Cells(.Rows.Count, "A").End(xlUp).row
lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With

For wiersz = 7 To lastRow
For kolumna = 1 To lastColumn
If sht.Cells(wiersz, kolumna).Value Like "*" & szukana & "*" Then
sht.Cells(wiersz, kolumna).Rows.EntireRow.Copy
sheets("skopiowane").Select
sheets("skopiowane").Rows(numerWiersza).Select
numerWiersza = numerWiersza + 1
ActiveSheet.Paste
Exit For
End If
Next kolumna
Next wiersz
End If
Next sht
If numerWiersza = 3 Then
Call MsgBox("Brak danych", vbInformation, "Informacja")
Exit Sub
End If
End Sub

Temat: makro lastRow

Tak też zrobiłem. Dzięki za nieenigmatyczną odpowiedź :)



Wyślij zaproszenie do