Akademia VBA – Oferta

Wyróżnione

Tworzę i naprawiam aplikacje VBA/SQL/Makra. Moje aplikacje wyróżnia:

  • Dopasowanie do potrzeb klienta
  • Otwarty i dobrze skomentowany kod źródłowy
  • Instrukcja obsługi aplikacji
  • Szkolenia umożliwiające rozwijanie aplikacji własnymi siłami.

Mam 25 lat doświadczenia w szkoleniach i tworzeniu aplikacji dla biznesu. Tworzę aplikacje głównie w oparciu o środowisko Excel i VBA ale także SQL Server, Access i Power BI.

Pozdrawiam i zapraszam do współpracy

Dariusz Kolasa

Przyszłość VBA

To ważny temat dla autora tej strony 🙂
Oto kilka cytatów:

1. Dick Kusleika

12 krotny zdobywca tytułu MVP, znawca Office System, SharePoint Server i .NET:

I don’t care if VBA is dead. It still works for me now, I’m very effective with it, and I’m still solving real problems using it every day. If it’s dead, it’s the best damn corpse in the office.

Fajne 🙂

2. Jacques Bourgeois (James Burger)

Ma oficjalny tytuł Geniusza na experts-exchange.com (ok 2,5 miliona punktów od użytkowników)

Enterprises love Word and Excel because they can push them over what they can do through VBA or VB.NET applications. And how does Microsoft react to that love. By toning down Office with these stupid ribbons in 2007, and then removing VBA in their cloud incarnations.

With my 40 years in programming (first as a hobbyist, then as an engineer, and the last 23 as a full time programmer) I have a little bit of experience. And as many programmers of my age, I have the impression that
we are going back to the 80’s, where most of the programmer’s time is spent trying to make the interface work correctly

Przygnębiające ale prawdziwe 🙁

Podsumowując:

Największym wrogiem VBA jest … Microsoft.
VBA nie jest rozwijane praktycznie od ponad 20 lat (może to i lepiej, patrząc na jakość dzisiejszych produktów). Microsoft Office jest coraz wolniejszy, niestabilny, nieergonomiczny. Buja w chmurach i nie obsługuje w nich VBA
Miejmy nadzieję, że ktoś w Microsoft się ocknie i zrozumie, że nie wszystko musi służyć do zabawy na tablecie…

Nawiasem mówiąc najpoważniejszym wrogiem VBA było VSTO (Visual Studio Tools for Office). Microsoft od wersji 2012 już go nie wspiera…
Współczuję tym, którzy zainwestowali 10 lat pracy w ten produkt…

Obecnie w dobie Office 365 największym zagrożeniem dla VBA jest …. HTML, JavaScript i CSS!. To nie żart. Takie są najnowsze plany Microsoftu!

Ja póki co, nadal trzymam się VBA 😉

Źródła:
http://dailydoseofexcel.com/archives/2014/11/08/the-future-of-vba-
development/)
http://www.experts-
exchange.com/Programming/Microsoft_Development/Q_28328440.html

Kopiowanie i linkowanie plików Worda

Ostatnio dotknąłem się do programowania Worda. Nie było to przyjemne uczucie 😉
No ale w końcu jest to Akademia VBA a nie Akademia VBA Excel i Access 🙂
Po zaznaczeniu jakiegoś tekstu kod kopiuje aktywny plik pod nazwą jak zaznaczenie i od razu robi link do niego. Używa też fajnej funkcji do odczyszczania tekstu ze zbędnych znaków specjalnych i innych zabronionych w nazwach obiektów i plików

Sub UtworzKopiePliku_i_Link()
    Dim MojDokument As Word.Document
    Dim Kopia As Word.Document
    Dim ZaznTekst As String
    Dim SciezkaMojDokument As String
    Dim SciezkaFolder As String
 
    ZaznTekst = fnCzystyTekst(Selection.Range.Text)
    If Len(ZaznTekst) = 0 Then
        MsgBox "Brak zaznaczenia!"
        Exit Sub
    End If
    Set MojDokument = ThisDocument
    SciezkaMojDokument = MojDokument.FullName
    SciezkaFolder = MojDokument.Path & "\"
    MojDokument.Bookmarks.Add ZaznTekst, Selection
    MojDokument.Save
    MojDokument.SaveAs SciezkaFolder & ZaznTekst & ".docm"
    Set Kopia = MojDokument
    Set MojDokument = Documents.Open(SciezkaMojDokument)
    Selection.GoTo What:=wdGoToBookmark, Name:=ZaznTekst
    MojDokument.Hyperlinks.Add Anchor:=Selection.Range, _
        Address:=Kopia.Name, TextToDisplay:=ZaznTekst
 
    Set MojDokument = Nothing
    Kopia.Close
    Set Kopia = Nothing
End Sub
 
Function fnCzystyTekst(Tekst As String)
    Dim Znak As String * 1, NrZnaku As Long
    For NrZnaku = 1 To Len(Tekst)
        Znak = Mid(Tekst, NrZnaku, 1)
        If Znak Like "[A-Z,a-z,0-9,Ć,Ę,Ł,Ó,Ś,Ż,Ź,ć,ę,ł,ó,ś,ż,ź]" Then
            fnCzystyTekst = fnCzystyTekst & Znak
        End If
    Next
End Function

Jak zablokować wklejanie do komórek z ustawionym sprawdzaniem poprawności

Nie jest to specjalnie prosta ani ładna procedura, ale działa 🙂
Jak widać powinna być umieszczona w module prywatnym arkusza
Powoduje ona wykrycie i cofnięcie wklejania do komórek z ustawionym sprawdzaniem poprawności

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim BylaZmiana As Boolean
    Dim ZakresWspolny As Range
    On Error GoTo Obsluga
 
    'jeśli to spowoduje błąd to nie ma zmian w chronionym zakresie A1:A2
    Application.Intersect(Me.Range("A1:A2"), Target).Select
    BylaZmiana = True
 
    'ta linia prawdopodobnie spowoduje błąd gdy było wklejanie
    If Target.Validation.Type <> xlValidateDate Then Resume Next
 
Czyszczenie:
    On Error Resume Next
    Application.EnableEvents = True
    Exit Sub
Obsluga:
    Select Case Err
        Case 91
            'prawdopodobnie do zignorowania
        Case 1004
            If BylaZmiana Then
                'prawdopodobnie błąd spowodowany wklejeniem w chronionym zakresie
                MsgBox "Nie wolno niszczyć sprawdzania poprawności!", vbExclamation
                Application.EnableEvents = False
                Application.Undo
                Application.EnableEvents = True
            End If
        Case Else
            MsgBox Err & " - " & Err.Description, vbCritical
    End Select
    Resume Czyszczenie
End Sub

Wartość minimalna z tablicy

Ponieważ pytanie o minimalną wartość z tablicy pojawia się na forach VBA z częstotliwością semestralną, postanowiłem umieścić kawałek kodu, pomagający w rozwiązaniu problemu:

Function MinTablicy(Tablica As Variant) As Variant
    Dim WartMin As Variant
    Dim IndeksDolny As Long, IndeksGorny As Long, i As Long
    IndeksDolny = LBound(Tablica)
    IndeksGorny = UBound(Tablica)
    WartMin = Tablica(IndeksDolny)
    For i = IndeksDolny To IndeksGorny
      If Tablica(i) < WartMin Then WartMin = Tablica(i)
    Next
    MinTablicy = WartMin
End Function
 
Sub TestFunkcji()
    Dim Tablica() As Variant
    Tablica = Array(7, 3, 5, 2, 6)
    MsgBox "Minimalana wartość z tablicy to: " & MinTablicy(Tablica)
End Sub

Sprawdzenie dostępności pliku

Czasem chcielibyśmy wiedzieć, czy plik na którym chcemy wykonać jakąś operację, jest dla nas dostępny. Np gdy jest otwarty przez innego użytkownika próba jego użycia może powodować błąd. Ponadto wcześniej należy sprawdzić czy dany plik w ogóle istnieje. Można to sprawdzić przy pomocy poniższych funkcji:

Public Const WERSJA as String = "Dostępność pliku v.0.1"
Sub TestFunkcji()
    Const NAZWA_PLIKU As String = "C:\EX04\Baza.xls"
    If BrakPliku(NAZWA_PLIKU) Then Exit Sub
    If PlikNiedostepny(NAZWA_PLIKU) Then Exit Sub
    MsgBox "Plik jest dostępny, można coś z nim robić ;)", vbInformation
End Sub
 
Function PlikNiedostepny(NazwaPliku As String) As Boolean
    Dim NrPliku As Long
 
    On Error GoTo Obsluga
 
    NrPliku = FreeFile()
    Open NazwaPliku For Binary Access Read Write Lock Read Write As #NrPliku
    Close #NrPliku
    Exit Function
Obsluga:
    Select Case Err
    Case 70
        MsgBox "Plik jest obecnie otwarty przez inny proces", vbExclamation
    Case Else
        MsgBox "Przy próbie otwarcia pliku zgłaszany jest błąd: " _
            & Err & " - " & Err.Description, vbCritical
    End Select
    PlikNiedostepny = True
End Function
 
Function BrakPliku(PelnaNazwaPliku As String) As Boolean
    If Dir(PelnaNazwaPliku) = "" Then
        MsgBox "Brak pliku", vbCritical, WERSJA
        BrakPliku = True
    End If
End Function

Deklaracja zmiennych

Dla początkujących użytkowników VBA nieodmiennie zagadką jest deklarowanie zmiennych. Po pierwsze w ogóle nie wiadomo po co to pisać, skoro bez tego i tak działa, a po drugie nazwy typów zmiennych nie brzmią zbyt przyjaźnie.
Niestety brak stosowania i rozumienia deklaracji jest głównym powodem błędów, literówek, spowolnienia działania kodu i niewygody jego pisania. Temat nie jest bardzo prosty, ale bardzo ważny. Tu krótko wymienię zalety rozumienia i stosowania właściwych deklaracji:

  • Kod działa nawet do 4 razy szybciej
  • Łatwiej pisać kod bo zmienne zadeklarowane są wspomagane przez technologię podpowiadania słów kluczowych – Intellisense
  • Unikamy literówek
  • Piszemy kod wysokiej jakości pozwalający na szybsze wychwytywanie błędów – np niezgodność typu co przy przeoczeniu może prowadzić do negatywnych konsekwencji
  • Poprawiamy czytelność kodu

Problem polega na tym, że ta wiedza przychodzi z czasem, a tego jak zwykle wszystkim brakuje …