Pierwszy niepusty wiersz


Funkcja pierwszyNiepustyWiersz korzysta podczas działania z innych nie-wbudowanych funkcji prezentowanych na tej stronie, które w związku z tym również muszą być umieszczone w kodzie projektu dla prawidłowego działania tej funkcji.

Nie uwzględnienie ich w kodzie spowoduje wygenerowanie błędu: Compile error: Sub or Function not defined.

Dodatkowe funkcje wykorzystywane w funkcji pierwszyNiepustyWiersz zostały wymienione poniżej. Klikając w nazwę każdej z nich przeniesiesz się do podstrony zawierającej jej kod:

Dodając powyższe funkcje, zwróć uwagę czy nie były one już wcześniej wykorzystywane w Twoim kodzie. Obecność w jednym projekcie VBA dwóch funkcji publicznych o identycznych nazwach spowoduje wygenerowanie błędu kompilacji o treści: Compile error: Ambiguous name detected: nazwa_funkcji.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
'**********************************************************************************************************
' Nazwa:                pierwszyNiepustyWiersz
' Autor:                mielk | 2012-04-05
'
'
' Opis:                 Funkcja zwraca numer pierwszego niepustego wiersza w podanym arkuszu Excela. Za
'                       niepusty wiersz uznawany jest każdy wiersz, w którym w co najmniej jednej komórce
'                       znajduje się wartość lub funkcja (nawet jeżeli funkcja ta zwraca w wyniku pusty
'                       ciąg znaków).
'
' Argumenty:
'   arkusz              Arkusz Excela, dla którego ma zostać wyznaczony numer pierwszego niepustego
'                       wiersza.
'   wierszStartowy      Opcjonalny parametr typu Long.
'                       * Pozwala ograniczyć od góry przeszukiwany zakres. Jeżeli ten argument został
'                         podany, makro rozpoczyna przeszukiwanie arkusza od podanego wiersza zamiast od
'                         początku arkusza i zignoruje wszystkie wiersze powyżej tego wiersza.
'                       * Jeżeli ten argument jest równy lub mniejszy od 0, makro działa tak jakby w ogóle
'                         nie był podany i rozpoczyna szukanie od pierwszego wiersza w arkuszu.
'   kolumnaStartowa     Opcjonalny parametr typu Long.
'                       * Pozwala ograniczyć z lewej strony przeszukiwany zakres. Jeżeli ten argument
'                         został podany przeszukiwanie arkusza rozpoczyna się od kolumny z takim
'                         indeksem.
'                       * Jeżeli ten argument jest równy lub mniejszy od 0, makro działa tak jakby w ogóle
'                         nie był podany i rozpoczyna szukanie od pierwszej kolumny w arkuszu.
'   wierszKoncowy       Opcjonalny parametr typu Long.
'                       * Pozwala ograniczyć od dołu przeszukiwany zakres. Jeżeli ten argument został
'                         podany, makro kończy przeszukiwanie arkusza na podanym wierszu
'                       * Jeżeli ten argument jest równy lub mniejszy od 0, makro działa tak jakby w ogóle
'                         nie był podany i kończy szukanie na ostatnim wierszu w arkuszu.
'   kolumnaKoncowa      Opcjonalny parametr typu Long.
'                       * Pozwala ograniczyć od prawej przeszukiwany zakres. Jeżeli ten argument został
'                         podany, makro kończy przeszukiwanie na kolumnie z takim indeksie a nie na końcu
'                         pliku.
'                       * Jeżeli ten argument jest równy lub mniejszt od 0, makro działa tak, jakby w ogóle
'                         nie był podany i kończy szukanie na ostatniej kolumnie arkusza.
'   ignorujUkryteKomorki
'                       Opcjonalny parametr typu Boolean.
'                       * Informuje czy funkcja powinna ignorować ukryte komórki podczas przeszukiwania
'                         arkusza.
'                       * Domyślna wartość tego parametru to False. Jeżeli jest on pominięty podczas
'                         wywoływania funkcji, ukryte komórki będą przeszukiwane tak samo jak widoczne.
'
'
' Zwraca:
'   Long                Indeks pierwszego niepustego wiersza w podanym arkuszu Excela.
'                       Jeżeli żaden niepusty wiersz nie zostanie znaleziony, zwracane jest 0.
'
'
' Wyjątki:
'   NieprawidłowyArkusz             Wywoływany, kiedy arkusz Excela przekazany do tej funkcji w parametrze
'                                   [arkusz] znajduje się w pliku, który został już zamknięty.
'
'
' --- Zmiany ----------------------------------------------------------------------------------------------
' 2013-04-23        mielk           Utworzenie funkcji.
'**********************************************************************************************************
Public Function pierwszyNiepustyWiersz(arkusz As Excel.Worksheet, _
                      Optional wierszStartowy As Long, Optional kolumnaStartowa As Long, _
                      Optional wierszKoncowy As Long, Optional kolumnaKoncowa As Long, _
                      Optional ignorujUkryteKomorki As Boolean = False) As Long
    Const NAZWA_METODY As String = "pierwszyNiepustyWiersz"
    '------------------------------------------------------------------------------------------------------
    Dim lngRow As Long
    Dim lngWierszStart As Long
    Dim lngWierszKoniec As Long
    Dim lngNiepuste As Long
    Dim lngKolumnaStart As Long
    Dim lngKolumnaKoniec As Long
    Dim zakres As Excel.Range
    '------------------------------------------------------------------------------------------------------


    'Sprawdź, czy arkusz, w którym będziemy szukać pierwszej niepustej kolumny, jest poprawny -----------|
    'i można odwoływać się do jego właściwości. Jeżeli arkusz nie jest poprawny, kod przeskakuje        '|
    'do labelu NieprawidlowyArkusz i kończy działanie fukcji.                                           '|
    If Not czyPrawidlowyArkusz(arkusz) Then GoTo NieprawidlowyArkusz                                    '|
    '----------------------------------------------------------------------------------------------------|


    'Wyznacz właściwy zakres do przeszukania uwzględniając opcjonalne parametry podane podczas ----------|
    'wywoływania funkcji.                                                                               '|
    If kolumnaStartowa > 0 And kolumnaStartowa <= arkusz.columns.Count Then _
                                           lngKolumnaStart = kolumnaStartowa Else lngKolumnaStart = 1   '|
    If kolumnaKoncowa > 0 And kolumnaKoncowa <= arkusz.columns.Count Then _
                       lngKolumnaKoniec = kolumnaKoncowa Else lngKolumnaKoniec = arkusz.columns.Count   '|
    If wierszStartowy > 0 And wierszStartowy <= arkusz.rows.Count Then _
                                              lngWierszStart = wierszStartowy Else lngWierszStart = 1   '|
    If wierszKoncowy > 0 And wierszKoncowy <= arkusz.rows.Count Then _
                             lngWierszKoniec = wierszKoncowy Else lngWierszKoniec = arkusz.rows.Count   '|
    '----------------------------------------------------------------------------------------------------|



Ponow:

    '----------------------------------------------------------------------------------------------------|
    If wierszKoncowy > 0 And wierszKoncowy <= arkusz.rows.Count Then                                    '|
        lngRow = wierszKoncowy                                                                          '|
    Else                                                                                                '|
        lngRow = arkusz.rows.Count                                                                      '|
    End If                                                                                              '|
    '----------------------------------------------------------------------------------------------------|


    '----------------------------------------------------------------------------------------------------|
    Do                                                                                                  '|
        Set zakres = arkusz.Range(arkusz.Cells(lngWierszStart, lngKolumnaStart), _
                                  arkusz.Cells(lngRow, lngKolumnaKoniec))                               '|
        lngNiepuste = Excel.Application.WorksheetFunction.CountA(zakres)                                '|
                                                                                                        '|
                                                                                                        '|
        '--------------------------------------------------------------------------------------------|  '|
        If lngNiepuste Then                                                                         '|  '|
                                                                                                    '|  '|
            If lngRow = lngWierszStart Then Exit Do                                                 '|  '|
            lngWierszKoniec = lngRow                                                                '|  '|
            lngRow = lngWierszStart + ((lngRow - lngWierszStart - 1) / 2)                           '|  '|
                                                                                                    '|  '|
        Else                                                                                        '|  '|
            lngWierszStart = lngRow + 1                                                             '|  '|
            lngRow = lngWierszKoniec                                                                '|  '|
                                                                                                    '|  '|
            '------------------------------------------------------------------------------------|  '|  '|
            If lngWierszStart > lngWierszKoniec Then                                            '|  '|  '|
                lngRow = 0                                                                      '|  '|  '|
                Exit Do                                                                         '|  '|  '|
            End If                                                                              '|  '|  '|
            '------------ [If lngWierszStart > lngWierszKoniec Then] ----------------------------|  '|  '|
                                                                                                    '|  '|
        End If                                                                                      '|  '|
        '---------------- [If lngNiepuste Then] -----------------------------------------------------|  '|
                                                                                                        '|
    Loop                                                                                                '|
    '----------------------------------------------------------------------------------------------------|


    '----------------------------------------------------------------------------------------------------|
    If lngRow Then                                                                                      '|
                                                                                                        '|
        '--------------------------------------------------------------------------------------------|  '|
        If ignorujUkryteKomorki And arkusz.rows(lngRow).Hidden Then                                 '|  '|
            lngWierszStart = nastepnyWidocznyWiersz(arkusz, lngRow, Excel.xlDown)                   '|  '|
            If lngWierszStart <= arkusz.rows.Count Then GoTo Ponow                                  '|  '|
        Else                                                                                        '|  '|
            pierwszyNiepustyWiersz = lngRow                                                         '|  '|
        End If                                                                                      '|  '|
        '---------------- [If ignorujUkryteKomorki And arkusz.rows(lngRow).Hidden Then] -------------|  '|
                                                                                                        '|
    End If                                                                                              '|
    '-------------------- [If lngRow Then] --------------------------------------------------------------|




'==========================================================================================================
PunktWyjscia:
    Exit Function

'----------------------------------------------------------------------------------------------------------
NieprawidlowyArkusz:
    'Obsługa błędów dla sytuacji, kiedy podany arkusz jest nieprawidłowy i nie można odnieść się do jego
    'właściwości (np. plik, w którym znajduje się ten arkusz, został zamknięty).

    GoTo PunktWyjscia

End Function