Visual Basic for Applications 1
na przykładzie MS-Excel Alt+F11 i jest cała góra lodowa 2
Decyzja o włączeniu/wyłączeniu makr w menu Narzędzia/Makro/Zabezpieczenia Wbudowany język wielu aplikacji Excel, Word ale i ifix Renesans po latach zapomnienia języka BASIC (Beginner s All-purpose Symbolic Instruction Code) Niezbędne zrozumienie obiektowego modelu aplikacji. Klasy obiektów tworzą strukturę hierarchiczną. Identyczne obiekty tworzą kolekcje. Występują metody, własności i zdarzenia. 3
Obiektowy model Excel-a (F2 Object Browser) -to mały fragment (vbaxl9.chm) Application.Workbooks( Zeszyt1 ).Worksheets( Arkusz1 ).Range( A1 ) Workbooks(1).Worksheets(1).Range( A1 ) 4
5
6
7
Option Explicit WYMUSZA DEKLARACJE ZMIENNYCH Sub Test1() Dim Msg As String ZAWSZE PODAWAC TYP ZMIENNYCH Dim LObj As Object Msg = "User name: " + Application.UserName + vbcrlf + _ "Active workbook name: " + Application.ActiveWorkbook.Name + vbcrlf + _ "Active worksheet name: " + Application.ActiveWorkbook.ActiveSheet.Name MsgBox (Msg) Msg = "Worksheet names: " For Each LObj In Application.ActiveWorkbook.Sheets Msg = Msg + LObj.Name & " " Next MsgBox (Msg) End Sub 8
Rejestracja i podgląd makr wygodną metodą podglądania szczegółów 9
Odwołanie do kaŝdej komórki to odwołanie do obiektu typu Range NajwaŜniejsza (i domyślna) własność obiektu Range to Value Sub Test3() Worksheets(1).Range("A1:C3").Clear Worksheets(1).Range("A1:A3").Value = 13 Worksheets(1).Range("B1:B3").Value = Worksheets(1).Range("A1") + 2 Worksheets(1).Range("C1") = Worksheets(1).Range("B1") + 20 End Sub 10
Range( A1:C5 ) równowaŝne Range( A1, C5 ) Range( C1:C10 A6:E6 ) spacja jest operatorem przecięcia zakresów więc jest to C6 Range( A1, A3, A5, A7 ) przecinek operatorem łączenia zakresów ActiveSheet.Cells(3,4) = 7 odwołanie do komórki za pomocą numeru wiersza i kolumny Offset jest własnością stosowaną do obiektu Range np. ActiveCell.Offset(-1,0) = 1 (wstawia powyŝej aktualnej komórki wartość 1) UŜyteczne właściwości obiektu Application: ActiveCell aktywna komórka ActiveSheet aktywny arkusz ActiveWindow aktywne okno, ActiveWorkbook aktywny skoroszyt, RangeSelection zaznaczone komórki, Selection zaznaczony obiekt, ThisWorkbook skoroszyt zawierający procedurę 11
Komentarz za pomocą apostrofu (lub słowo kluczowe Rem) Kontynuacja linii: spacja, a po niej znak podkreślenia Instrukcje w jednej linii oddzielone znakiem dwukropka Wielkość liter w nazwach zmiennych nie ma znaczenia Format daty to np. #11/12/02# a czasu to #12:00:00# samodzielnie ustala typ zmiennej jednak kosztem czasu wykonania. Typ zmienny i ustalany przez to Variant Popularne typy to: Byte, Boolean, Integer (%), Long (&), Single (!), Double (#), Currency (@), Date, Object, String ($), Variant (w nawiasie typ definiowany domyślnie) Dim i As Integer, r As Double Dim ii% Funkcja TypeName zwraca nazwę typu zmiennej 12
Zakres zmiennych: procedura: Dim, Static, Private wewnątrz procedury moduł: Dim przed pierwszą procedurą modułu wszystkie moduły: Public przed pierwszą procedurą Static zachowuje wartość po wykonaniu procedury Tablice: indeksy domyślnie startują od 0 (Option Base 0) Dim Tab1(10 To 20) As Integer Dim Tab2(1 To 10, 10 To 20) As Integer Zmienne obiektowe reprezentują cały obiekt. Przypisanie do zmiennej obiektowej odbywa się za pomocą instrukcji Set Typ danych uŝytkownika: Type NewType1 Field1 As String * 25 string max. 25 znaków Field2 As Integer Field3 As Long End Type 13
Listę funkcji wbudowanych w uzyskuje się poprzez wpisanie w kodzie vba. w edytorze Funkcje Excel-a mogą być uŝyte w kodzie Application.WorksheetFunction.FunctionName np. Application.WorksheetFunction.Roman 14
Odwołania do elementów obiektów (Test7 szybsze w wykonaniu od Test8) Sub Test7() Range("A1:C3").Select With Selection.Font.Name = "Times New Roman".Size = 10.Bold = True Sub Test8() Range("A1:C3").Select Selection.Font.Name = "Times New Roman" Selection.Font.Size = 10 Selection.Font.Bold = True End Sub End With End Sub 15
Kolekcje obiektów For Each element In grupa... [Exit For]... Next [element] Sub Test9() Dim Cell As Range Range("A1:C3").Select For Each Cell In Selection Cell.Value = UCase(Cell.Value) Next Cell End Sub 16
Sterowanie wykonaniem programu GoTo GoTo etykieta... etykieta: IIf IIf( cond, ret_val_true, ret_val_false) If-Then If cond1 Then... ElseIf condn Then... Else... End If Case Select Case expr_to_test [ Case expr_n [instr_n]] [Case Else [instr_else]] End case 17
Sub Test10() ' Przeliczanie procentowych punktów na ocenę Dim Punkty As Integer Dim OcenaStr As String, OcenaNum As Single Punkty = InputBox("Punkty [%]: ", "Punkty->Ocena") Select Case Punkty Case Is < 50: OcenaStr = "ndost": OcenaNum = 2 Case 50 To 59: OcenaStr = "dost": OcenaNum = 3 Case 60 To 69: OcenaStr = "+dost": OcenaNum = 3.5 Case 70 To 79: OcenaStr = "db": OcenaNum = 4 Case 80 To 89: OcenaStr = "+db": OcenaNum = 4.5 Case 90 To 100: OcenaStr = "bdb": OcenaNum = 5 End Select MsgBox Punkty & "% punktow odpowiada ocenie " & OcenaStr & _ " (" & OcenaNum & ")" End Sub 18
For-Next For counter=beg_value To end_value [Step step_value]... [Exit For]... Next [counter] Do-While (dopóki spełniony warunek) Do [While condition]... [Exit Do]... Loop Do-Until (dotąd, aŝ będzie spełniony warunek) Do [Until condition]... [Exit Do]... Loop Do... [Exit Do]... Loop [While condition] Do... [Exit Do]... Loop [Until condition] 19
Argumenty w metodzie umieszczone po nazwie metody oddzielone przecinkami; ewentualnie w dowolnej kolejności gdy uŝyte z nazwą argumentu MsgBox "MsgBox 1",, "My Title" MsgBox "MsgBox 2", Title:="My Title" Argumenty w przypadku własności umieszcza się w nawiasach okrągłych Przykład automatycznego tworzenia wykresów (na podstawie generatora makr) Private Sub SaveAsGIF_Click() Sheets("WykresCO").Export Filename:="C:\CO.GIF", FilterName:="GIF" End Sub 20
Private Sub CreateChart_Click() Charts.Add ActiveChart.ChartType = xlxyscatterlinesnomarkers ActiveChart.SetSourceData Source:=Sheets("Wykres").Range("A1:F8895"), _ PlotBy :=xlcolumns ActiveChart.SeriesCollection(1).Name = "=Wykres!R1C2" ActiveChart.SeriesCollection(2).Name = "=Wykres!R1C3" ActiveChart.SeriesCollection(3).Name = "=Wykres!R1C4" ActiveChart.SeriesCollection(4).Name = "=Wykres!R1C5" ActiveChart.SeriesCollection(5).Name = "=Wykres!R1C6" ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="WykresCO" With ActiveChart.HasTitle = True.ChartTitle.Characters.Text = "Praca instalacji CO".Axes(xlCategory, xlprimary).hastitle = True.Axes(xlCategory, xlprimary).axistitle.characters.text = "Czas".Axes(xlValue, xlprimary).hastitle = True.Axes(xlValue, xlprimary).axistitle.characters.text = "Temperatura" End With With ActiveChart.Axes(xlCategory).HasMajorGridlines = True.HasMinorGridlines = False End With With ActiveChart.Axes(xlValue).HasMajorGridlines = True.HasMinorGridlines = False End With CONTINUE... CONTINUED... ActiveChart.HasLegend = True ActiveChart.Legend.Select Selection.Position = xlbottom ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowNone, _ LegendKey:=False ActiveChart.Axes(xlValue).Select With ActiveChart.Axes(xlValue).MinimumScaleIsAuto = True.MaximumScaleIsAuto = True.MinorUnitIsAuto = True.MajorUnitIsAuto = True.Crosses = xlcustom.crossesat = -20.ReversePlotOrder = False.ScaleType = xllinear.displayunit = xlnone End With ActiveChart.Axes(xlCategory).Select End Sub 21
Kontrolki ActiveX Kontrolki ActiveX (zwane kontrolkami OLE lub kontrolkami OCX) są komponentami (obiektami), które mogą zostać włoŝone w strony WWW lub wykorzystane przez aplikacje (w systemach operacyjnych Windows). Celem wykorzystanie funkcjonalności kontrolek (ang. reusebility) Zaprojektowanie pierwotnie dla stron WWW mogą być równieŝ wykorzystane w aplikacjach uŝytkownika (w odróŝnieniu od apletów Javy) Kontrolki wykorzystywane są przez kontenery ActiveX. Zachowują się jak serwery wewnątrz kontenera Dostępne tysiące kontrolek o róŝnej funkcjonalności. Budowa aplikacji kontenera ActiveX przypomina składania z cegieł budowa z wykorzystaniem binarnych elementów funkcjonalnych Kontrolki rejestruje się w systemie (regsvr32.exe) Tworzenie kontrolek nie jest zaleŝne od języka programowania Dla kaŝdej kontrolki istotne jej właściwości, metody i zdarzenia (notyfikacje) 22
Kontrolki ActiveX Kontrolka NumLED wyświetlanie informacji Opcja menu Wstaw/Obiekt Opcja menu Widok/Paski narzędzi/przybornik formantów/tryb projektowania włoŝenie kontrolki i edycję właściwości 23
Kontrolki ActiveX przykład uŝycia Akcje związane z klawiszami Private Sub DigitsM_Click() NumLED1.Digits = NumLED1.Digits - 1 End Sub Private Sub DigitsP_Click() NumLED1.Digits = NumLED1.Digits + 1 End Sub Private Sub ValueM_Click() NumLED1.Value = NumLED1.Value - 1 End Sub Private Sub ValueP_Click() NumLED1.Value = NumLED1.Value + 1 End Sub Private Sub PropertyPages_Click() NumLED1.ShowPropertyPage End Sub 24
Kontrolki ActiveX przykłady 25
Kontrolki ActiveX przykłady 26
Kontrolki ActiveX kontrolka LED firmy Global Magic Software PROPERTIES: AutoRedraw HelpContextID* OutlineWidth AutoSize Index* SingleBuffer BackColor LEDHeight StyleID BackPicture LEDIndex StyleOffColor BevelInner LEDSeparation StyleOffPicture BevelOuter LEDStatus StyleOnColor BevelWidth LEDStyleID StyleOnPicture BorderHorizontal LEDWidth Styles BorderVertical Left* StyleShape BorderWidth MaxDecay StyleUserShape DataField* Mode TabIndex* DataSource* MouseControl TabStop* DecayRate Name* Tag* Direction NumLEDs ToolTipText* DragIcon* Orientation Top* DragMode* Outline Value Enabled* OutlineAlign Visible* FocusOutline OutlineColor WhatsThisHelpID* Height* OutlineTitle Width* * denotes Standard Properties EVENTS: Change Click* DblClick* KeyDown* KeyPress* KeyUp* MouseDown* MouseMove* MouseUp* * denotes Standard Event METHODS: Redraw RedrawStatic ShowPropertyPage 27
Kontrolki ActiveX kontrolka LED firmy Global Magic Software (przykład opisu właściwości) Orientation Property DESCRIPTION Determines whether the control is displayed horizontally or vertically. SYNTAX Visual Basic: control.orientation [= number ] C/C++: void control.setorientation(short number); short control.getorientation(); Delphi: control.orientation [:= number ]; SETTINGS VALUE DESCRIPTION 0 Horizontal 1 Vertical REMARKS The Direction property may be used to alter the fill direction of the control. DATA TYPE Integer 28
Kontrolki ActiveX Private Sub SendSMS_Click() Dim objnewmail As Object Dim strfrom As String, strto As String, strbody As String Set objnewmail = CreateObject("CDONTS.NewMail") strfrom = Range("C4").Value strto = CStr(Range("C3").Value) + "@text.plusgsm.pl" strbody = Range("C5").Value continue continued objnewmail.from = strfrom objnewmail.to = strto objnewmail.body = strbody Debug.Print "Send: " + strto + " " + strbody objnewmail.send Set objnewmail = Nothing End Sub 29
Kontrolki ActiveX kontrolka CDONTS CDONTS Collaborative Data Objects for NT Server oferuje usługi e-mail; instalowany w ramach IIS lub PWS; wymaga serwera SMTP (Simple Mail Transfer Protocol) WŁAŚCIWOŚCI: Bcc, Body, BodyFormat (0-tekst, 1-HTML), Cc, ContenetBase (URL względem którego odwołania np. do grafiki), ContentLocation (połoŝenie zasobu względem ContentBase), From, Importance (0d 0 do 3), MailFormat (kodowanie: 1-tekst, 0-MIME (Multipurpose Internet Mail Extension) np. do wysyłania grafiki), Subject, To, Value (dodaje nagłówek wiadomości), Version (zwraca wersję CDO) METODY: AttacheFile, AttacheURL, Send, SetLocaleIDs (wysyła informacje dotyczące ustawień regionalnych) 30
Kontrolki ActiveX kontrolka MSINET Dostęp do danych na serwerach HTTP oraz FTP Metoda OpenURL zwraca stronę z serwera WWW Private Sub CommandButton1_Click() Dim INetCtrl As Object Dim ret As String ' Msinet.ocx control Set INetCtrl = CreateObject("InetCtls.Inet.1") ret = INetCtrl.OpenURL("http://127.0.0.1/phpinfo.php") Range("A1") = ret Set INetCtrl = Nothing End Sub 31
Proficy ifix a KAśDA operacja wykonywana w GUI ifix moŝe zostać zrealizowana programowo Programowy interfejs zawiera WIĘCEJ moŝliwości niŝ GUI!!! Niektóre funkcje GUI niejawnie automatycznie generują skrypty 32
Proficy ifix a System pomocy dostępny z menu Help / ifix Automaton Pomoc w 33
Skrypty 34
Skrypty Private Sub MinusMinus_Click() Dim lvalue As Variant lvalue = ReadValue("SET_RH_VEL.F_CV") lvalue = CInt(lValue) - 60 WriteValue CStr(lValue), "SET_RH_VEL.F_CV" End Sub Private Sub PlusPlus_Click() Dim lvalue As Variant lvalue = ReadValue("SET_RH_VEL.F_CV") lvalue = CInt(lValue) + 60 WriteValue CStr(lValue), "SET_RH_VEL.F_CV" End Sub W skrypcie dostępne kaŝde działanie takie jak moŝliwe do wykonania przez operatora oraz wiele, wiele więcej 35
Literatura: 1. Walkenbach J.: Programowanie Excel 2000 Visual Basic, Oficyna Wydawnicza READ ME, Łódź, 2000. 2. Microsoft Developer Network. 3. System pomocy programu Excel. 4. vbaxl9.chm plik pomocy Microsoft Office. 5. Freeze W.: Visual Basic 6. Programowanie baz danych, Wydawnictwo HELION, Gliwice, 2001. 6. Reselman B.: Active Server Pages 3.0 w przykładach, Wydawnictwo MIKOM, Warszawa, 2001. 7. Developing Applications for the Internet and World Wide Web. MSDN. 36