Jak wyświetlić wszystkie przypisy dolne i końcowe?

przez | 2024-02-03

Przypis dolny to element stosowany głównie w naukowych tekstach, artykułach, książkach oraz innych publikacjach, który umożliwia dodanie dodatkowej informacji lub odniesienia do konkretnego fragmentu tekstu. Przypisy dolne zazwyczaj umieszczane są na dole strony i zawierają szczegółowe informacje, cytaty, odwołania do literatury lub wyjaśnienia, które są istotne dla zrozumienia treści głównej.

Przypis końcowy, znany również jako przypis bibliograficzny, jest sposobem cytowania źródeł w tekście, który umożliwia czytelnikowi odnalezienie pełnych informacji o cytowanym materiale na końcu tekstu, najczęściej na osobnej stronie lub na końcu rozdziału, lub na końcu książki. Przypisy końcowe są szczególnie popularne w niektórych dziedzinach, takich jak humanistyka i nauki społeczne, a także w niektórych wydawnictwach naukowych, gdzie są preferowane ze względu na estetykę i czytelność tekstu. Są również stosowane w niektórych stylach redakcyjnych, na przykład w stylu Chicago czy APA (American Psychological Association).

Jeśli jesteś redaktorem, to być może masz potrzebę np. wyeksportować wszystkie przypisy dolne lub przypisy końcowe do osobnego pliku.

Czytaj dalej

Jak zamienić numer kolumny na nazwę?

przez | 2024-01-28

Czasami w VBA potrzebowałem zamienić numer kolumny na jej nazwę. Przykładowo pierwsza kolumna ma etykietę A, druga kolumna to B a dziesiąta to J.

Tak wiem, czasami można się odwoływać podając numer kolumny np. jeśli chcę coś wpisać do kolumny J10 to mogę napisać:

Cells(10, 10) = "Hej, tu J10!"

albo

Range("J10") = "Hej! Tu J10!!"

Ale czasem jest tak, że np. w zmiennej typu Long mam numer kolumny a muszę znać jej etykietę (bo np. mój kod w VBA tworzy jakieś formuły odwołujące się do sąsiednich komórek).

Czytaj dalej

Jak wykryć, czy mamy wciśnięty klawisz Caps Lock?

przez | 2024-01-26

Niedawno pisałem prosty panel logowania. Podczas testów w pewnym momencie miałem problem z zalogowaniem się do aplikacji.

Po kilku próbach wpisania „poprawnego hasła” zorientowałem się, że mam wciśnięty klawisz Caps Lock. I tutaj naszła mnie myśl – aplikacja powinna informować użytkownika, że jest wciśnięty Caps Lock. Na szczęście, da się to dość prosto zrobić w VBA.

Czytaj dalej

Access/VBA – jak usunąć komunikat z pytaniem o usunięcie rekordów

przez | 2024-01-24

Pisząc aplikację w języku VBA w programie Access czasami chcę np. usunąć tymczasowe rekordy z tabeli. Oto przykładowy kod:

Sub UsunTymczasoweDane()
    DoCmd.RunSQL ("DELETE * FROM tmp")
End Sub

Podczas wykonywania tego kodu pojawi się taki oto komunikat

Jeśli jest to aplikacja, która wykonuje pewne czynności to nie chciałbym, aby użytkownik zobaczył ten komunikat (użytkownik może kliknąć w przycisk Nie, co spowoduje wystąpienie błędu).

Czytaj dalej

Jak dodać zera wiodące

przez | 2024-01-21

Załóżmy, że przechowujemy pewną wartość w zmiennej a. Chcemy utworzyć plik o odpowiedniej nazwie, ale aby łatwiej się sortowało pliki w folderze chcemy, aby nazwa była poprzedzona odpowiednią liczbą zer wiodących. Tj. zamiast 1 ma być 00001 zamiast 123 ma być 00123 itp.

Dodać zera wiodące do pliku można na wiele różnych sposobów (pokażę 3 sposoby średnie i 2 błyskotliwe). Oto prosta funkcja, która będzie wywoływała nasze testowe funkcje:

Sub Testy()
    Dim Liczba As Long
    Dim Liczba2 As String

    Liczba = 1
    'Liczba = 12
    'Liczba = 123
    'Liczba = 1234
    'Liczba = 12345
    
    Liczba2 = ZeraWiodaceIF(Liczba)
    'Liczba2 = ZeraWiodaceSelectCase(Liczba)
    'Liczba2 = ZeraWiodacePetlaFor(Liczba)
    'Liczba2 = ZeraWiodaceRight(Liczba)
    'Liczba2 = ZeraWiodaceFormat(Liczba)
    
    MsgBox "Liczba z zerami wiodącymi: " & Liczba2, vbInformation
End Sub

Najprostsza rzecz jaka mi przychodzi do głowy, to sprawdzenie za pomocą instrukcji IF w jaki przedział wpada dana liczba i zwrócenie jej poprzedzonej odpowiednią liczbą zer z przodu:

Function ZeraWiodaceIF(Liczba As Long) As String
    Dim Liczba2 As String
    If Liczba < 10 Then Liczba2 = "0000" + CStr(Liczba)
    If Liczba >= 10 And Liczba < 100 Then Liczba2 = "000" + CStr(Liczba)
    If Liczba >= 100 And Liczba < 1000 Then Liczba2 = "00" + CStr(Liczba)
    If Liczba >= 1000 And Liczba < 10000 Then Liczba2 = "0" + CStr(Liczba)
    If Liczba >= 10000 Then Liczba2 = CStr(Liczba)
    
    ZeraWiodaceIF = Liczba2
End Function

Kod jest bardzo prosty, można coś takiego na szybko napisać, ale ma pewną wadę: im więcej cyfr może mieć nasza liczba, tym więcej trzeba dawać kolejnych IFów.

Zamiast „litanii” instrukcji IF możemy zastosować instrukcję Select Case.

Function ZeraWiodaceSelectCase(Liczba As Long) As String
    Dim Liczba2 As String
    
    Select Case Liczba
        Case 0 To 9
            Liczba2 = "0000" + CStr(Liczba)
            
        Case 10 To 99
            Liczba2 = "000" + CStr(Liczba)
            
        Case 100 To 999
            Liczba2 = "00" + CStr(Liczba)
            
        Case 1000 To 9999
            Liczba2 = "0" + CStr(Liczba)
            
        Case Else
            Liczba2 = CStr(Liczba)
    End Select
    
    ZeraWiodaceSelectCase = Liczba2
End Function

Kod jest czytelniejszy niż w przypadku litanii IFów, ale dalej rozwlekły.

Kolejny przykład to użycie pętli for. Tutaj sprawdzamy ile znaków zajmuje nasza liczba po przekonwertowaniu na tekst i za pomocą pętli For dodajemy na początku naszej zmiennej tekstowej kolejne zera w każdym przebiegu pętli.

Function ZeraWiodacePetlaFor(Liczba As Long) As String
    Dim Liczba2 As String
    Dim IleCyfr As Long
    Dim IleDodacZer As Long
    Dim a As Long

    Liczba2 = CStr(Liczba) 'Zamień liczbę na tekst
    
    'Sprawdź ile liczb ma nasza cyfra
    IleCyfr = Len(Liczba2)
    IleDodacZer = 5 - IleCyfr
    
    'Dodaj z przodu odpowiednią liczbę zer
    For a = 1 To IleDodacZer
        Liczba2 = "0" + Liczba2
    Next a
    
    ZeraWiodacePetlaFor = Liczba2
End Function

Zaleta kodu jest łatwość w konserwacji – jeśli chcemy aby nasza liczba miała dokładnie 8 znaków a nie 5 wystarczy w linijce IleDodacZer = 5 – IleCyfr zmienić 5 na 8.

Powyższe przykłady były dość toporne. Kiedyś natrafiłem na ciekawszą koncepcję. Po przekonwertowaniu liczby na tekst wystarczy z przodu dodać 4 zera (najmniejsza możliwa liczba ma zawsze długość 1 znaku) a następnie za pomocą funkcji tekstowej Right wyciągnąć 5 ostatnich znaków z naszego ciągu (przykładowo jak do liczby 123 dokleimy cztery zera to mamy tekst 0000123 a za pomocą funkcji tekstowej Right wyciągamy wartość 0000123).

Function ZeraWiodaceRight(Liczba As Long) As String
    Dim Liczba2 As String
    
    'Do liczby dodaj z przodu 4 zera (najmniejsza możliwa liczba ma 1 cyfrę)
    Liczba2 = "0000" + CStr(Liczba)
    
    'Wyciągnij 5 ostatnich cyfr z naszej liczby
    Liczba2 = Right$(Liczba2, 5)
    
    ZeraWiodaceRight = Liczba2
End Function

Jednak ostatnio wymyśliłem dużo prostszą koncepcję. Otóż mamy funkcję format, która formatuje liczbę w zadanym przez nas formacie (w formułach Excela mamy podobną funkcję o nazwie TEKST).

Function ZeraWiodaceFormat(Liczba As Long) As String
    ZeraWiodaceFormat = Format(Liczba, "00000")
End Function

Uwaga: powyższe funkcje nie mają „zabezpieczenia” na wypadek, gdyby liczba podana przez użytkownika była np. 6-cyfrowa. Prawie wszystkie wyżej wymienione funkcje zwrócą liczbę 6-cyfrową (bez dodawania zer wiodących) ale funkcja ZeraWiodaceRight zwróci 5 ostatnich cyfr z naszej 6-cyfrowej liczby.

Jak sprytnie odczytać zakres komórek do tablicy?

przez | 2024-01-20

Dawniej, gdy chciałem odczytać zawartość kilku kolejnych komórek do tablicy to deklarowałem tablicę dynamiczną. Za pomocą instrukcji ReDim zmieniałem rozmiar tablicy a następnie za pomocą pętli for odczytywałem po kolei po jednej komórce do tej tablicy. Oto przykładowy kod:

Sub OdczytajKomorkiDoTablicy_old()
    Dim T()
    Dim a As Long, Ostatni As Long
    
    'Odczytaj numer ostatniego wiersza w kolumnie A
    Ostatni = OstatniWiersz("A")
    
    'Zmień rozmiar tablicy T
    ReDim T(1 To Ostatni)
    
    'Ręcznie odczytuj zawartość kolejnych komórek do tablicy
    For a = 1 To Ostatni
        T(a) = ThisWorkbook.ActiveSheet.Cells(a, 1).Value
    Next a
End Sub

Ponieważ nie wiem ile wierszy może być zapisanych w kolumnie A to skorzystałem z dodatkowej funkcji, która sprawdza numer ostatniego wiersza w kolumnie A. Tak wygląda ta funkcja:

Function OstatniWiersz(kolumna As String) As Long
    OstatniWiersz = Cells(Rows.Count, kolumna).End(xlUp).Row
End Function

Natomiast można sprytniej (bez zabawy w pisanie pętli for lub for each) odczytać zakres komórek do tablicy.

Czytaj dalej