'********************************************************************************************************** ' Nazwa: ostatniaNiepustaKolumna ' Autor: mielk | 2012-04-05 ' ' Opis: Funkcja zwraca numer ostatniej niepustej kolumny w podanym arkuszu Excela. Za ' niepustą kolumnę uznawana jest każda kolumna, w której 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 ostatniej niepustej kolumny. ' 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 ostatniej niepustej kolumny w podanym arkuszu Excela. ' Jeżeli żadna niepusta kolumna nie zostanie znaleziona, 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 ---------------------------------------------------------------------------------------------- ' 2012-04-05 mielk Utworzenie funkcji. ' 2013-04-19 mielk Dodane argumenty opcjonalne umożliwiające ograniczenie przeszukiwanego ' zakresu kolumn. ' 2013-04-23 mielk Dodane argumenty opcjonalne umożliwiające ograniczenie przeszukiwanego ' zakresu wierszy. '********************************************************************************************************** Public Function ostatniaNiepustaKolumna(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 = "ostatniaNiepustaKolumna" '------------------------------------------------------------------------------------------------------ Dim lngKolumna As Long Dim lngKolumnaStart As Long Dim lngKolumnaKoniec As Long Dim lngNiepuste As Long Dim lngWierszStart As Long Dim lngWierszKoniec 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: lngKolumna = 1 '----------------------------------------------------------------------------------------------------| Do '| Set zakres = arkusz.Range(arkusz.Cells(lngWierszStart, lngKolumna), _ arkusz.Cells(lngWierszKoniec, lngKolumnaKoniec)) '| lngNiepuste = Excel.Application.WorksheetFunction.CountA(zakres) '| '| '--------------------------------------------------------------------------------------------| '| If lngNiepuste Then '| '| '| '| If lngKolumna = lngKolumnaKoniec Then Exit Do '| '| lngKolumnaStart = lngKolumna '| '| lngKolumna = lngKolumna + ((lngKolumnaKoniec - lngKolumna + 1) / 2) '| '| '| '| Else '| '| lngKolumnaKoniec = lngKolumna - 1 '| '| lngKolumna = lngKolumnaStart '| '| '| '| '------------------------------------------------------------------------------------| '| '| If lngKolumnaStart < lngKolumnaKoniec Then '| '| '| lngKolumna = 0 '| '| '| Exit Do '| '| '| End If '| '| '| '------ [If lngKolumnaStart < lngKolumnaKoniec Then] --------------------------------| '| '| '| '| '| '| End If '| '| '---------- [If lngNiepuste Then] -----------------------------------------------------------| '| '| Loop '| '----------------------------------------------------------------------------------------------------| '----------------------------------------------------------------------------------------------------| If lngKolumna Then '| '| '--------------------------------------------------------------------------------------------| '| If ignorujUkryteKomorki And arkusz.columns(lngKolumna).Hidden Then '| '| lngKolumnaKoniec = nastepnaWidocznaKolumna(arkusz, lngKolumna, Excel.xlToLeft) '| '| If lngKolumnaKoniec Then GoTo Ponow '| '| Else '| '| ostatniaNiepustaKolumna = lngKolumna '| '| End If '| '| '--------------------------------------------------------------------------------------------| '| '| End If '| '-------------- [If lngKolumna 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 '********************************************************************************************************** ' Nazwa: czyPrawidlowyArkusz ' Autor: mielk | 2012-11-16 ' ' Opis: Funkcja sprawdzająca czy podany arkusz Excela jest prawidłowy i można odwoływać się ' do jego właściwości i metod bez obawy, że zostanie wygenerowany błąd. ' ' Funkcja jest bardzo pomocna, ponieważ pozwala uniknąć błędu ' Run-time error '-2147221080 (800401a8)': Automation error. ' Błąd ten jest generowany w sytuacji, kiedy kod próbuje się odnieść do właściwości ' lub metody zmiennej arkuszowej, ale arkusz, do którego odnosi się ta zmienna, ' został wcześniej usunięty lub plik, w którym ten arkusz się znajduje został ' zamknięty. ' ' Argumenty: ' arkusz Sprawdzany arkusz. ' ' Zwraca: ' Boolean True - jeżeli sprawdzany arkusz jest prawidłowy i bez obaw można się odnosić do ' jego właściwości i metod. ' False - jeżeli podany arkusz jest nieprawidłowy (zazwyczaj przyczyną jest fakt, ' że plik Excela, w którym znajduje się ten arkusz został wcześniej zamknięty ' lub arkusz został usunięty). ' ' ' --- Zmiany ---------------------------------------------------------------------------------------------- ' 2012-11-16 mielk Utworzenie funkcji. '********************************************************************************************************** Public Function czyPrawidlowyArkusz(arkusz As Excel.Worksheet) As Boolean Const NAZWA_METODY As String = "czyPrawidlowyArkusz" '------------------------------------------------------------------------------------------------------ Dim strNazwaArkusza As String '------------------------------------------------------------------------------------------------------ On Error Resume Next strNazwaArkusza = arkusz.name 'Jeżeli nazwa podanego arkusza została przypisana do zmiennej [strNazwaArkusza], oznacza to, że arkusz 'jest prawidłowy i można odwoływać się do jego właściwości bez obawy o pojawienie się błędów. czyPrawidlowyArkusz = VBA.Len(strNazwaArkusza) End Function '********************************************************************************************************** ' Nazwa: nastepnaWidocznaKolumna ' Autor: mielk | 2013-03-24 ' ' Opis: Funkcja zwracająca numer następnej widocznej kolumny w lewo lub w prawo od podanej ' kolumny w określonym arkuszu Excela ' ' Argumenty: ' arkusz Arkusz, na którym przeprowadzone będzie szukanie następnej widocznej kolumny. ' poczatkowaKolumna Początkowa kolumna, z której rozpoczyna się szukanie następnej widocznej kolumny. ' kierunek Kierunek poszukiwania następnej widocznej kolumny. ' * Jedyne dostępny wartości dla tego parametru to xlToLeft i xlToRight. ' * Teoretycznie do funkcji można też podać inne kierunki zdefiniowane w enumeracji ' xlDirection (xlUp i xlDown), ale funkcja zwróci w takim przypadku 0, ' ponieważ kolumny nie mogą być przeszukiwane pionowo. ' ' Zwraca: ' Long Numer indeksu następnej widocznej kolumny w stronę określoną przez parametr ' [kierunek], począwszy od podanej kolumny w określonym arkuszu. ' ' Funkcja zwraca 0, jeżeli w lewą (lub prawą stronę, w zależności od wartości ' parametru [kierunek]) od podanej kolumny nie ma żadnej widocznej kolumny. ' ' Żeby uzyskać numer indeksu pierwszej widocznej kolumny w całym arkuszu Excela, ' wystarczy wywołać tę funkcję z następującymi argumentami wejściowymi: ' poczatkowaKolumna = 0 oraz kierunek = xlRight. ' ' ' 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 ---------------------------------------------------------------------------------------------- ' 2012-04-05 mielk Utworzenie funkcji. '********************************************************************************************************** Public Function nastepnaWidocznaKolumna(arkusz As Excel.Worksheet, kolumnaStartowa As Long, _ kierunek As XlDirection) As Long Const NAZWA_METODY As String = "nastepnaWidocznaKolumna" '------------------------------------------------------------------------------------------------------ Dim intPrzesuniecie As Integer '------------------------------------------------------------------------------------------------------ '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 '| '----------------------------------------------------------------------------------------------------| '----------------------------------------------------------------------------------------------------| Select Case kierunek '| Case Excel.xlToLeft: intPrzesuniecie = -1 '| Case Excel.xlToRight: intPrzesuniecie = 1 '| Case Else '| nastepnaWidocznaKolumna = kolumnaStartowa '| GoTo PunktWyjscia '| End Select '| '----------------------------------------------------------------------------------------------------| 'Przechodź przez kolejne kolumny w lewo lub w prawo od wskazanej kolumny (w zależności od -----------| 'wartości parametru [kierunek], tak dugo aż natrafisz na widoczną kolumnę. '| nastepnaWidocznaKolumna = kolumnaStartowa '| Do '| nastepnaWidocznaKolumna = nastepnaWidocznaKolumna + intPrzesuniecie '| If Not arkusz.columns(nastepnaWidocznaKolumna).Hidden Then Exit Do '| Loop '| '----------------------------------------------------------------------------------------------------| '========================================================================================================== 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