Test wtyczki do automatycznej publikacji WP -> FB

Jako, że blog Akademia-VBA.pl stoi na WordPressie to myślę, że czasem mogę i o tych doświadczeniach coś napisać. Właśnie testuję wtyczkę Add Link to Facebook i jeżeli to czytacie na FB to znaczy, że działa 🙂
Instalacja wtyczki nie jest specjalnie prosta bo trzeba sobie najpierw utworzyć aplikację na FB i coś tam powpisywać, ale jak ja dałem radę, to chyba inni też sobie poradzą 😉
Ale np ostatniego wpisu już nie udało mi się automatycznie zaktualizować 🙁
Dostałem komunikat błędu:
…Get me: Error validating access token: Session has expired at unix time…

Aby rozwiązać problem należy ponownie wejść do ustawień wtyczki i ponownie wcisnąć przycisk Autoryzuj i ponownie opublikować post 🙂

Jak dopisać nowy rekord na podformularzu

To dość często pojawiające się pytanie, więc odpowiedź upubliczniam :). Załóżmy, że podformularz nazywa się fmPozycjeFaktur i zawiera pola tekstowe TowarID i Ilosc. Procedura dodania rekordu na takim podformularzu wyglądałaby tak:

    Me.fmPozycjeFaktur.SetFocus
    DoCmd.GoToRecord , , acNewRec
    Me.fmPozycjeFaktur.Form.TowarID = 5
    Me.fmPozycjeFaktur.Form.Ilosc = 2

Generowanie Tabel Przestawnych – Excel 2007/2019

Generując tabelę przestawną z poziomu kodu pod Excelem 2003 można było jako argumentu Source metody tworzącej PivotCache podać dowolny poprawnie zdefiniowany obiekt Range, np CurrentRegion lub UsedRange. Podobnie rzecz ma się pod Excelem 2007/2019 (pamiętajmy tylko o użyciu metody PivotCaches.Create zamiast PivotCaches.Add). Niestety okazuje się, że w momencie gdy obiekt Range ma liczbę wierszy przekraczającą 65 536 (co teoretycznie nie powinno być problemem pod Excelem 2007/2010) metoda generuje błąd nr 13 Type mismatch 🙁 Rozwiązaniem (niezbyt eleganckim ale innego chyba nie ma) tego problemu jest użycie zamiast obiektu Range klasycznego stringa R1C1 z tymże zakresem:

    Dim OstW As Long
    Dim OstK As Long
    Dim strZakres As String
    Dim PC as PivotCache
 
    OstW = Cells(ArkDane.Rows.Count, 1).End(xlUp).Row
    OstK = Cells(1, ArkDane.Columns.Count).End(xlToLeft).Column
    strZakres = "R1C1:R" & OstW & "C" & OstK
    Set PC = ActiveWorkbook.PivotCaches.Create( _
        SourceType:=xlDatabase, _
        SourceData:=strZakres, _
        Version:=xlPivotTableVersion14)

Przy okazji możemy zapoznać się z powszechnie znanymi wyrażeniami zwracającym nr ostatniego wiersza i ostatniej kolumny w zakresie danych

Przykład bazuje na stronie z MS Answers: http://answers.microsoft.com/en-us/office/forum/office_2010-customize/pivotcache-type-mismatch-error-when-65536-rows/0827889e-b671-e011-8dfc-68b599b31bf5?msgId=4e3a2b20-7a72-e011-8dfc-68b599b31bf5

Funkcja do liczenia stażu w latach – PelneLata

Generalnie robi to samo co excelowa DATA.RÓŻNICA ale jest łatwiejsza w użyciu, bo nie trzeba podawać interwału, no i podpowiada nazwy argumentów

Function PelneLata(DataPocz As Date, DataKon As Date) As Long
   '----------------------------------------------
    ' Mam nadzieję, że robi to samo co
    ' DATA.RÓŻNICA ale za to podpowiada argumenty :)
    '----------------------------------------------
    Dim RokPocz As Long, MiesPocz As Long, DzienPocz As Long
    Dim RokKon As Long, MiesKon As Long, DzienKon As Long
 
    If DataKon <= DataPocz Then
        PelneLata = 0
        Exit Function
    End If
 
    RokPocz = Year(DataPocz)
    RokKon = Year(DataKon)
    MiesPocz = Month(DataPocz)
    MiesKon = Month(DataKon)
    DzienPocz = Day(DataPocz)
    DzienKon = Day(DataKon)
 
    PelneLata = RokKon - RokPocz
    If MiesPocz > MiesKon Then
        PelneLata = PelneLata - 1
        Exit Function
    End If
    If MiesKon = MiesPocz Then
        If DzienPocz > DzienKon Then PelneLata = PelneLata - 1
    End If
End Function

Funkcja mediana w Access

Znalezione na stronach MS. Działa 🙂

Kod funkcji mediana (DMedian)

Kolejne zastosowanie rekordsetu DAO 🙂
Funkcja działa jak standardowa accessowa funkcja agregacji domeny, a więc wymaga argumentów typu string np – DMedian(„pole”, „domena”)
opcjonalnie jako trzeci argument można też podać string z kryterium filtrowania domeny np – „[pole] > 1000”

Liczba dni w miesiącu

Mała rzecz a cieszy 🙂 Jeszcze jedno zastosowanie bezcennej funkcji DateSerial

Function LiczbaDniMiesiaca(Rok As Long, Miesiac As Long) As Long
    LiczbaDniMiesiaca = Day(DateSerial(Rok, Miesiac + 1, 0))
End Function

Jak zabezpieczyć kod w Access

Kiedyś było w menu Narzędzia bazy danych – Utwórz plik mde. W Accessie 2010 i nowszych jest w Plik – Zapisz i publikuj – Utwórz plik ACCDE. Jedno i drugie powoduje wyprodukowanie pliku z usuniętym kodem źródłowym i z blokadą projektów formularzy i raportów. Nie blokuje dostępu do projektów kwerend i tabel. Proszę zauważyć, że nikt łącznie z autorem nie ma już w tym pliku możliwości modyfikacji kodu lub projektu formularza czy raportu! Trzeba koniecznie zachować oryginał accdb!

Bezpieczne wyłączenie odświeżania ekranu

Większość programistów VBA wie o tym, że aby przyspieszyć wykonanie procedury warto wyłączyć odświeżanie ekranu. Ma to kluczowe znaczenie np. przy generowaniu złożonych wykresów.
[cc lang=”vb”] Application.ScreenUpdating = False [/cc]
Ale już nie każdy potrafi napisać kod gwarantujący przywrócenie odświeżania. Brak odświeżania może drogo kosztować…
Należy to zrobić w sekcji czyszczenia obsługi błędów, wtedy wykona się zawsze, nawet po błędzie.

Sub GenerujWykres()
   'jakieś deklaracje
   On Error GoTo Obsluga
   Application.ScreenUpdating = False
   'jakiś kod
Czyszczenie:
   On Error Resume Next
   'jakieś inne sprzątanie
   Application.ScreenUpdating = True
   Exit Sub
Obsluga:
   MsgBox Err.Description
   Resume Czyszczenie
End Sub

Oczywiście w ten sposób powinniśmy obsłużyć wszystkie inne niebezpieczne zmiany dokonane przez aplikację na maszynie użytkownika. Na szczęście obsługi błędów nie trzeba pisać w podprocedurach, wystarczy ją napisać w procedurze głównej

Nazwa pliku z pełnej ścieżki

Czasem potrzebujemy samej nazwy pliku a mamy w zmiennej pełną ścieżkę. Oczywiście sprawa jest prosta ale lepiej mieć pod ręką stosowną funkcję:

Function NazwaPlikuZeSciezki(Sciezka As String) As String
    Dim OstatniUkosnik As Long
    OstatniUkosnik = InStrRev(Sciezka, "\")
    NazwaPlikuZeSciezki = Mid(Sciezka, OstatniUkosnik + 1)
End Function

Konwersja kwot amerykańskich na polskie

Bardzo często przy imporcie czy linkowaniu plików txt w Accessie mamy problem z niepolskimi separatorami w kwotach np 1,000.00. Z niewiadomych przyczyn Excel ma narzędzie do prawidłowego rozpoznawania separatora tysięcy a Access nie. Stąd w Accessie musimy w specyfikacji importu/łącza ustawić taką kolumnę jako tekstową a następnie przerobić w niej separatory np przy pomocy poniższej funkcji (powinna być wgrana do modułu publicznego aby można jej używać w dowolnej kwerendzie):

Function KwotaUSA2PL(KwotaUSA As String) As Currency
    Dim NrZnaku As Long
    Dim Znak As String
    Dim t As String
    Dim txtKwota As String
    t = Trim(KwotaUSA)
    For NrZnaku = 1 To Len(t)
        Znak = Mid(t, NrZnaku, 1)
        If Znak = "." Then
            txtKwota = txtKwota & ","
        Else
            If Znak <> "," Then
                txtKwota = txtKwota & Znak
            End If
        End If
    Next
    KwotaUSA2PL = CCur(txtKwota)
End Function

W komentarzach pojawiła się ciekawa dyskusja, jak tą funkcję zastąpić wyrażeniem z użyciem funkcji Replace