#Visual Basic
Áîíäàðåíêî Âèòàëèé ãðóïïà 47
Microsoft Visual Basic — ÿçûê ïðîãðàììèðîâàíèÿ, à òàêæå èíòåãðèðîâàííàÿ ñðåäà ðàçðàáîòêè ïðîãðàììíîãî îáåñïå÷åíèÿ, ðàçðàáàòûâàåìûå êîðïîðàöèåé Microsoft. ßçûê Visual Basic óíàñëåäîâàë äóõ, ñòèëü è îò÷àñòè ñèíòàêñèñ ñâîåãî ïðåäêà — ÿçûêà BASIC, ó êîòîðîãî åñòü íåìàëî äèàëåêòîâ.  òî æå âðåìÿ Visual Basic ñî÷åòàåò â ñåáå ïðîöåäóðû è ýëåìåíòû îáúåêòíî-îðèåíòèðîâàííûõ è êîìïîíåíòíî-îðèåíòèðîâàííûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ. Èíòåãðèðîâàííàÿ ñðåäà ðàçðàáîòêè VB âêëþ÷àåò èíñòðóìåíòû äëÿ âèçóàëüíîãî ïðîåêòèðîâàíèÿ ïîëüçîâàòåëüñêîãî èíòåðôåéñà, ðåäàêòîð êîäà ñ âîçìîæíîñòüþ IntelliSense è ïîäñâåòêîé ñèíòàêñèñà, à òàêæå èíñòðóìåíòû äëÿ îòëàäêè ïðèëîæåíèé.
Visual Basic òàêæå ÿâëÿåòñÿ õîðîøèì ñðåäñòâîì áûñòðîé ðàçðàáîòêè (RAD) ïðèëîæåíèé áàç äàííûõ äëÿ îïåðàöèîííûõ ñèñòåì ñåìåéñòâà Microsoft Windows. Ìíîæåñòâî ãîòîâûõ êîìïîíåíòîâ, ïîñòàâëÿåìûõ âìåñòå ñî ñðåäîé, ïðèçâàíî ïîìî÷ü ïðîãðàììèñòó ñðàçó æå íà÷àòü ðàçðàáàòûâàòü áèçíåñ-ëîãèêó áèçíåñ-ïðèëîæåíèÿ, íå îòâëåêàÿ åãî âíèìàíèå íà íàïèñàíèå êîäà çàïóñêà ïðîãðàììû, ïîäïèñêè íà ñîáûòèÿ è äðóãèå ìåõàíèçìû, êîòîðûå VB ðåàëèçóåò àâòîìàòè÷åñêè.
Ïåðâîå ïðèçíàíèå ñåðü¸çíûìè ðàçðàáîò÷èêàìè Visual Basic ïîëó÷èë ïîñëå âûõîäà âåðñèè 3. Îêîí÷àòåëüíîå ïðèçíàíèå êàê ïîëíîöåííîãî ñðåäñòâà ïðîãðàììèðîâàíèÿ äëÿ Windows — ïðè âûõîäå âåðñèè 5. Âåðñèÿ VB6, âõîäÿùàÿ â ñîñòàâ Microsoft Visual Studio 6.0, ñòàëà ïî-íàñòîÿùåìó çðåëûì è ôóíêöèîíàëüíî áîãàòûì ïðîäóêòîì.
Ýëåìåíòû ÿçûêà Òèïû äàííûõ Ïåðåìåííûå â Visual Basic îáúÿâëÿþòñÿ îïåðàòîðîì Dim, ïîñëå êîòîðîãî óêàçûâàåòñÿ èìÿ, çàòåì - êëþ÷åâîå ñëîâî As è òèï ïåðåìåííîé. Åñëè òèï îïóùåí, òî êëþ÷åâîå ñëîâî As íå óêàçûâàåòñÿ è ïåðåìåííàÿ îáúÿâëÿåòñÿ êàê Variant. Åñëè íå óêàçàòü êîíñòðóêöèþ Option Explicit â ðàçäåëå äåêëàðàöèé, òî ÿâíîãî îáúÿâëåíèÿ ïåðåìåííûõ íå òðåáóåòñÿ è îíè àâòîìàòè÷åñêè áóäóò ñîçäàíû ïðè ïåðâîì èñïîëüçîâàíèè. Äàííîå ïîâåäåíèå ìîæåò ïðèâåñòè ê ñíèæåíèþ ñêîðîñòè âûïîëíåíèÿ ïðîãðàììû, òàê êàê íåîáúÿâëåííûå ïåðåìåííûå áóäóò èìåòü òèï Variant, à òàêæå âîçìîæíû ëîãè÷åñêèå îøèáêè, ñâÿçàííûå ñ íåâåðíûì ââîäîì èìåíè èìåþùåéñÿ ïåðåìåííîé èëè ðèñêà êîíôëèêòîâ â ïðèëîæåíèè, êîãäà îáëàñòü îïðåäåëåíèÿ ïåðåìåííîé íå ñîâñåì ÿñíà.
Dim strMessage As String 'îáúÿâëåíèå ïåðåìåííîé ñèìâîëüíîãî òèïà Dim iProductCount As Integer 'îáúÿâëåíèå ïåðåìåííîé öåëî÷èñëåííîãî òèïà Dim dt70YearsOfVictory As Date 'îáúÿâëåíèå ïåðåìåííîé äëÿ õðàíåíèÿ äàòû è âðåìåíè Dim otherValue ' òèï íå óêàçàí, ïåðåìåííàÿ òèïà Variant
Public Sub Main()
strMessage = "Ïðèâåò, Ìèð!"
iProductCount = 125
dt70YearsOfVictory = #5/9/2015 2:00:00 PM# ' äàòà 9 ìàÿ 2015 14:00:00
otherValue = 12.5 ' òèï ïåðåìåííîé Variant, ïîäòèï Double.
otherValue = "Âèêèïåäèÿ" ' òèï ïåðåìåííîé Variant, ïîäòèï String.
End Sub
Îïåðàòîðû ßçûê Visual Basic ñîäåðæèò ìíîæåñòâî îïåðàòîðîâ, êîòîðûå îòâå÷àþò çà àðèôìåòè÷åñêèå îïåðàöèè, îïåðàöèè ñðàâíåíèÿ è ïðèñâîåíèÿ, à òàêæå êîíêàòåíàöèè.
Îïåðàòîð ïðèñâîåíèÿ
Çíàê ðàâåíñòâà (=) èñïîëüçóåòñÿ äëÿ ïðèñâîåíèÿ çíà÷åíèÿ ïåðåìåííîé. Òàêæå âîçìîæíî èñïîëüçîâàíèå êëþ÷åâîãî ñëîâà Let ïåðåä èìåíåì ïåðåìåííîé.  ðàííèõ âåðñèÿõ ÿçûêà BASIC åãî íàëè÷èå áûëî îáÿçàòåëüíûì, íî â Visual Basic îí îñòàâëåí äëÿ ñîâìåñòèìîñòè. Äëÿ ïðèñâîåíèÿ ïåðåìåííîé îáúåêòíîãî òèïà, íåîáõîäèìî íàëè÷èå êëþ÷åâîãî ñëîâà Set. Ïðèìåðû: nVar = 10, Let iCount = 20, Set refDouble = objClass. Ìíîãîêðàòíîå ïðèñâàèâàíèå, òàê êàê ýòî ðåàëèçîâàíî â ÿçûêå C, íåâîçìîæíî. A = B = C íå îçíà÷àåò, ÷òî A, B è C áóäóò èìåòü ðàâíûå çíà÷åíèÿ. VB îöåíèò âûðàæåíèå B = C è â ïåðåìåííóþ A ïðèñâîèò ðåçóëüòàò True èëè False, 0 èëè ?1, â çàâèñèìîñòè îò òèïà.
Àðèôìåòè÷åñêèå îïåðàòîðû
ñëîæåíèå (+), âû÷èòàíèå (-), óìíîæåíèå (*), äåëåíèå (/) âîçâåäåíèå â ñòåïåíü (^). Ïðèìåð: 2 ^ 3 = 8 öåëî÷èñëåííîå äåëåíèå (). Äåëèò ïåðâîå ÷èñëî íà âòîðîå, îòáðàñûâàÿ (íå îêðóãëÿÿ) äðîáíóþ ÷àñòü. Ïðèìåð: 5 \ 2 = 2 äåëåíèå ïî ìîäóëþ (Mod). Äåëèò ïåðâîå ÷èñëî íà âòîðîå, âîçâðàùàÿ òîëüêî îñòàòîê îò äåëåíèÿ. Ïðèìåð: 5 Mod 2 = 1 Îïåðàòîðû ñðàâíåíèÿ
ðàâåíñòâî (=). Ïðèìåð: If nVar = 10 Then áîëüøå, ÷åì è ìåíüøå, ÷åì (> è <). Ïðèìåð: If nVar > 10 Then áîëüøå èëè ðàâíî è ìåíüøå èëè ðàâíî (>= è <=). Ïðèìåð: If nVar >= 10 Then íå ðàâíî (<>). Ïðèìåð: If nVar <> 10 Then ñðàâíåíèå îáúåêòîâ (Is). Îïðåäåëÿåò, ññûëàþòñÿ îáúåêòíûå ïåðåìåííûå íà òîò æå îáúåêò èëè íà ðàçíûå. Ïðèìåð: If obj1 Is obj2 Then îïåðàòîð ïîäîáèÿ (Like). Ñðàâíèâàåò ñòðîêîâûé îáúåêò ñ øàáëîíîì è îïðåäåëÿåò, ïîäõîäèò ëè øàáëîí. Ïðèìåð: If strEmail Like "@.*" Then Ëîãè÷åñêèå îïåðàòîðû
ëîãè÷åñêîå È (And) — Îáå ÷àñòè âûðàæåíèÿ äîëæíû áûòü èñòèííûìè, ÷òîáû âñ¸ âûðàæåíèå ñòàëî èñòèííûì. Ïðèìåð: If (2 * 2 = 4) And (2 * 3 = 6) Then ëîãè÷åñêîå ÈËÈ (Or) — äîëæíî áûòü èñòèííûì õîòÿ áû îäíî èç âûðàæåíèé. Ïðèìåð: If (2 * 2 = 5) Or (2 * 2 = 4) Then ëîãè÷åñêîå îòðèöàíèå (Not) — âîçâðàùàåò True, åñëè óñëîâèå ëîæíî è íàîáîðîò. Ïðèìåð: If Not(2 * 2 = 5) Then ëîãè÷åñêîå èñêëþ÷åíèå (Xor) — â âûðàæåíèè E1 Xor E2 âîçâðàùàåò True, åñëè òîëüêî E1 = True èëè òîëüêî E2 = True, èíà÷å — False. ýêâèâàëåíòíîñòü (Eqv) — îöåíèâàåò ýêâèâàëåíòíîñòü äâóõ âûðàæåíèé, âîçâðàùàåò True, åñëè îíè èìåþò îäèíàêîâîå çíà÷åíèå. èìïëèêàöèÿ (Imp) — âîçâðàùàåò False, åñëè E1 = True è E2 = False, èíà÷å — True. Îïåðàòîðû êîíêàòåíàöèè
Îïåðàòîð (+) èñïîëüçóåòñÿ äëÿ êîíêàòåíàöèè ñòðîê. Åñëè îáå ÷àñòè âûðàæåíèÿ èìåþò ñèìâîëüíûé òèï, òî îïåðàöèÿ ñêëåèâàíèÿ ñòðîê áóäåò óñïåøíîé. Åñëè îäíà èç ÷àñòåé âûðàæåíèÿ, èìååò ÷èñëîâîé òèï, íî äðóãàÿ ÷àñòü íå ìîæåò áûòü êîððåêòíî ïðåîáðàçîâàíà ê ÷èñëó, òî âîçíèêàåò îøèáêà ïðèâåäåíèÿ òèïîâ. ×òîáû íå äîïóñòèòü òàêèõ ñèòóàöèé, ðåêîìåíäóåòñÿ èñïîëüçîâàòü ñîîòâåòñòâóþùèå îïåðàòîðû äëÿ êîíâåðòàöèè òèïîâ èëè ïðèìåíÿòü îïåðàòîð (&) äëÿ ñîåäèíåíèÿ ñòðîê. Îïåðàòîð (&) ïðîèçâîäèò àâòîìàòè÷åñêîå ïðåîáðàçîâàíèå âûðàæåíèé è çíà÷åíèé â ñòðîêîâîé òèï. Íàïðèìåð, âûðàæåíèå str = "10" & 20 äà¸ò ðåçóëüòàò «1020», à íå «30». Åñëè áû èñïîëüçîâàëè îïåðàòîð (+) â äàííîì âûðàæåíèè, òî VB ïðèâåë áû âûðàæåíèå «10» ê ÷èñëîâîìó òèïó 10, è â ñëó÷àå óñïåõà, ïðîèçâ¸ë áû àðèôìåòè÷åñêîå ñëîæåíèå. Óïðàâëÿþùèå êîíñòðóêöèè  Visual Basic, êàê è âî ìíîãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ, ñóùåñòâóþò êîíñòðóêöèè, ïðåäíàçíà÷åííûå äëÿ óïðàâëåíèÿ ïîðÿäêîì âûïîëíåíèÿ äåéñòâèé. Íåêîòîðûå èç êîíñòðóêöèé, òàêèå êàê GoSub è Return, îñòàâëåíû äëÿ ñîâìåñòèìîñòè ñ ðàííèìè âåðñèÿìè ÿçûêà BASIC, íî ðåàëèçàöèÿ â âèäå îòäåëüíûõ ïðîöåäóð ìîæåò îáåñïå÷èòü áîëåå ñòðóêòóðèðîâàííûé êîä.
Îïåðàòîð âåòâëåíèÿ Îáùèé ñèíòàêñèñ:
'Çàïèñü îïåðàòîðà âåòâëåíèÿ â îäíó ñòðîêó If <óñëîâèå> Then [äåéñòâèå_êîãäà_óñëîâèå_èñòèííî]
'Òàêàÿ çàïèñü ïîçâîëèò âûïîëíèòü äåéñòâèÿ â çàâèñèìîñòè îò èñòèííîñòè óñëîâèÿ If <óñëîâèå> Then [äåéñòâèå_êîãäà_óñëîâèå_èñòèííî] Else [äåéñòâèå_êîãäà_óñëîâèå_ëîæíî]
'Çàïèñü îïåðàòîðà âåòâëåíèÿ â íåñêîëüêî ñòðîê If <óñëîâèå> Then
[äåéñòâèå_êîãäà_óñëîâèå_èñòèííî]
ElseIf <óñëîâèå2> Then
[äåéñòâèå_êîãäà_óñëîâèå2_èñòèííî]
ElseIf <óñëîâèåN> Then
[äåéñòâèå_êîãäà_óñëîâèåN_èñòèííî]
Else
[äåéñòâèå_êîãäà_óñëîâèå_ëîæíî]
End If Îïåðàòîð âûáîðà Îáùèé ñèíòàêñèñ:
Select Case <ïðîâåðÿåìîå_çíà÷åíèå> 'Ïåðåìåííàÿ èëè âûðàæåíèå, êîòîðîå òðåáóåòñÿ ïðîâåðèòü ïî îäíîìó èëè íåñêîëüêèì óñëîâèÿì
Case <çíà÷åíèå_1> 'Âûïîëíÿåòñÿ äåéñòâèå, åñëè ïðîâåðÿåìîå çíà÷åíèå áóäåò ñîîòâåòñòâîâàòü çíà÷åíèþ 1
[äåéñòâèå_1]
Case <çíà÷åíèå_2>, <çíà÷åíèå_3>, <çíà÷åíèå_3> 'Ïðîâåðÿåò ñïèñîê çíà÷åíèé. Åñëè íàéäåíî ñîîòâåòñòâèå, òî âûïîëíÿåòñÿ äåéñòâèå
[äåéñòâèå_2]
Case <çíà÷åíèå_5> To <çíà÷åíèå_6> 'Ïðîâåðÿåò äèàïàçîí çíà÷åíèé
[äåéñòâèå_3]
Case Is >= <çíà÷åíèå_7> 'Ïðîâåðÿåò çíà÷åíèå íà èñòèííîñòü ñ óñëîâèåì
[äåéñòâèå_4]
Case Else 'Âûïîëíÿåòñÿ äåéñòâèå, åñëè íè îäíî èç óñëîâèé íå âûïîëíèòñÿ
[äåéñòâèå_5]
End Select Ïðèìåð: âûâîä ðàçëè÷íûõ ñîîáùåíèé â çàâèñèìîñòè îò çíà÷åíèÿ ïåðåìåííîé
'Ââåä¸ì ïåðåìåííóþ è äàäèì åé çíà÷åíèå âðó÷íóþ
Dim X As Double
X = InputBox("Ââåäèòå ÷èñëîâîå çíà÷åíèå ïåðåìåííîé Õ")
Select Case X 'Ïðîâåðèì, ïîäõîäèò ëè íåêîòîðîé âîîáðàæàåìîé ôóíêöèè íàøå çíà÷åíèå
Case Is < 5, Is >= 20, 12 To 15 'Äèàïàçîí ïîäõîäÿùèõ çíà÷åíèé
MsgBox "Äåéñòâèòåëüíîå çíà÷åíèå äëÿ íåêîòîðîé ôóíêöèè"
Case Else 'Íå ïîäõîäÿùèå çíà÷åíèÿ
MsgBox "Çíà÷åíèå íå ìîæåò áûòü èñïîëüçîâàíî â íåêîòîðîé ôóíêöèè"
End Select Öèêë ñî ñ÷¸ò÷èêîì Îáùèé ñèíòàêñèñ:
For <ïåðåìåííàÿ> = <çíà÷åíèå> To <êîíå÷íîå_çíà÷åíèå> [Step <øàãîâîå_çíà÷åíèå>]
[áëîê_îïåðàòîðîâ]
[Exit For] 'Âûõîä èç öèêëà
Next [ïåðåìåííàÿ] Ïðèìåð: ïîäñ÷¸ò ñóììû ÷¸òíûõ ÷èñåë îò 1 äî 100
For I = 0 To 100 Step 2
Sum = Sum + I
Next Ñîâìåñòíûé öèêë Îáùèé ñèíòàêñèñ:
For Each <ïåðåìåííàÿ> In <êîëëåêöèÿ>
[áëîê_îïåðàòîðîâ]
[Exit For] 'Ïðèíóäèòåëüíûé âûõîä èç öèêëà
Next [ïåðåìåííàÿ] Ïðèìåð: âûâîäèò íà ýêðàí êàæäûé ýëåìåíò èç ìàññèâà
Dim strItem As Variant
For Each strItem In Array("ßáëîêî", "Ãðóøà", "Ñëèâà")
Print strItem
Next Öèêë ñ óñëîâèåì Îáùèé ñèíòàêñèñ:
Do While <óñëîâèå> 'Öèêë âûïîëíÿåòñÿ, êîãäà óñëîâèå èñòèííî
[áëîê_îïåðàòîðîâ]
[Exit Do] 'Ïðèíóäèòåëüíûé âûõîä èç öèêëà
Loop
Do Until <óñëîâèå> 'Öèêë âûïîëíÿåòñÿ, êîãäà óñëîâèå ëîæíî
[áëîê_îïåðàòîðîâ]
[Exit Do]
Loop
While <óñëîâèå> 'Öèêë âûïîëíÿåòñÿ, êîãäà óñëîâèå èñòèííî
[áëîê_îïåðàòîðîâ]
Wend Ïðèìåð: Ïîñòðî÷íîå ÷òåíèå òåêñòîâîãî ôàéëà
Open "file.txt" For Input As #1
Do While Not EOF(1) 'Âîçâðàòèò True, åñëè îæèäàåòñÿ êîíåö ôàéëà
Line Input #1, strBuffer '×òåíèå ñòðîêè â ïåðåìåííóþ
Debug.Print strBuffer 'Âûâîä â îêíî îòëàäêè
Loop
Close #1 Öèêë ñ ïîñòóñëîâèåì Îáùèé ñèíòàêñèñ:
Do
[áëîê_îïåðàòîðîâ]
[Exit Do]
Loop While <óñëîâèå>
Do
[áëîê îïåðàòîðîâ]
[Exit Do]
Loop Until <óñëîâèå> Ïðîöåäóðû è ôóíêöèè Ïîäïðîãðàììû ÿâëÿþòñÿ îäíèìè èç îñíîâíûõ ýëåìåíòîâ ÿçûêà. Îíè ïðåäñòàâëÿþò ñîáîé ïðîöåäóðû è ôóíêöèè.
Ïðîöåäóðà íà÷èíàåòñÿ ñ îïåðàòîðà Sub è çàêàí÷èâàåòñÿ End Sub, ìåæäó êîòîðûìè è ïîìåùàåòñÿ êîä. Ïðîöåäóðû ìîãóò âûçûâàòüñÿ èëè ñàìèì Visual Basic, íàïðèìåð, ðåàëèçîâàííûå â âèäå îáðàáîò÷èêîâ ñîáûòèé, èëè äðóãèìè ïðîöåäóðàìè è ôóíêöèÿìè. Èìÿ ïðîöåäóðû îáðàáîòêè ñîáûòèÿ ñîñòîèò èç èìåíè îáúåêòà, çíàêà ïîä÷¸ðêèâàíèÿ è èìåíè ñîáûòèÿ: Private Sub Command1_Click() 'Ñîáûòèå áóäåò âûçâàíî ïðè íàæàòèè íà ýëåìåíò óïðàâëåíèÿ "Êíîïêà"
...
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Âûçûâàåòñÿ ïðè ïåðåìåùåíèè óêàçàòåëÿ ìûøè â îêíå ôîðìû
...
End Sub Íà ñàìîì äåëå Visual Basic ðåàëèçóåò öèêë îáðàáîòêè îêîííûõ ñîîáùåíèé Windows.  ïðèìåðå ñ ôîðìîé, öèêë îòôèëüòðóåò ñîîáùåíèå WM_MOUSEMOVE è àâòîìàòè÷åñêè âûçîâåò ïðîöåäóðó Form_MouseMove ñ ïàðàìåòðàìè: êàêèå êíîïêè ìûøè áûëè íàæàòû, êîîðäèíàòû óêàçàòåëÿ. Äàííûé ìåõàíèçì ñêðûâàåò îò ðàçðàáîò÷èêà íåêîòîðûå àñïåêòû ïðîãðàììèðîâàíèÿ â ñðåäå Windows, ïîçâîëÿÿ åìó ñðàçó ïðèñòóïèòü ê íàïèñàíèþ êîììåð÷åñêîãî êîäà.  áîëüøèíñòâå ñëó÷àåâ, êëàññ ðåøàåìûõ çàäà÷ íå ïîòðåáóåò îò ïðîãðàììèñòà çíàíèé î ñîîáùåíèÿõ è îêîííûõ ôóíêöèÿõ. Íî Visual Basic íå îãðàíè÷èâàåò ïðîãðàììèñòà ñàìîìó ðåàëèçîâàòü îáðàáîòêó îêîííûõ ñîîáùåíèé. Ýòî ïîçâîëÿåò î÷åíü ãèáêî ïîäõîäèòü ê ïîñòðîåíèþ ïðèëîæåíèé, íî è ïîòðåáóåò äîñòàòî÷íîãî îïûòà äëÿ íàïèñàíèÿ ïîäîáíîãî êîäà, êîòîðûé ìîæåò âûçâàòü íåñòàáèëüíóþ ðàáîòó ïðîãðàììû âïëîòü äî àâàðèéíîãî çàâåðøåíèÿ.
Ôóíêöèè â VB íà÷èíàþòñÿ ñ êëþ÷åâîãî ñëîâà Function è çàêàí÷èâàþòñÿ End Function. Âîçâðàùàåìîå çíà÷åíèå ôóíêöèè ïðèñâàèâàåòñÿ ïåðåìåííîé, ñîâïàäàþùåå ñ íàçâàíèåì ôóíêöèè. Äëÿ òîãî, ÷òîáû äîñðî÷íî ïðåðâàòü âûïîëíåíèå ïðîöåäóðû èëè ôóíêöèè, ñóùåñòâóþò ñïåöèàëüíûå îïåðàòîðû Exit Sub è Exit Function. Visual Basic 6.0 ñîäåðæèò âñòðîåííûå ôóíêöèè äëÿ ðàáîòû ñ ôàéëîâîé ñèñòåìîé, äàòîé è âðåìåíåì, ìàòåìàòè÷åñêèå ôóíêöèè, ôóíêöèè âçàèìîäåéñòâèÿ ñ ñèñòåìîé, ôóíêöèè äëÿ ðàáîòû ñî ñòðîêàìè, ôóíêöèè ïðèâåäåíèÿ òèïîâ è ôóíêöèè îñóùåñòâëÿþùèå ôèíàíñîâûå ðàñ÷¸òû. Òàêæå ñóùåñòâóþò íåäîêóìåíòèðîâàííûå ôóíêöèè, êîòîðûå ïîçâîëÿþò ðàáîòàòü, íàïðèìåð, ñ óêàçàòåëÿìè. Ïðèìåð ôóíêöèè äëÿ ðåøåíèÿ êâàäðàòíîãî óðàâíåíèÿ:
Private Sub Main()
Dim RetX1 As Double, RetX2 As Double
Dim strStatus As String
strStatus = SolveQuadraticEquation(4, 6, 2, RetX1, RetX2) 'Ðåøåíèå óðàâíåíèÿ 4*X^2 + 6*X - 2 = 0
'Âûâîäèì îòâåò
MsgBox "Ðåøåíèå: " & strStatus & vbCrLf & _
"X1 = " & RetX1 & vbCrLf & _
"X2 = " & RetX2, vbInformation
End Sub
'Ôóíêöèÿ ðåøåíèÿ êâàäðàòíîãî óðàâíåíèÿ Public Function SolveQuadraticEquation(ByVal A As Double, _
ByVal B As Double, _
ByVal C As Double, _
ByRef X1 As Double, _
ByRef X2 As Double) As String
Dim D As Double
D = (B * B) - (4 * A * C) 'Ïîëó÷àåì çíà÷åíèå äèñêðèìèíàíòà
If D >= 0 Then
X1 = (-B - Sqr(D)) / (2 * A) 'Âû÷èñëÿåì êîðíè óðàâíåíèÿ
X2 = (-B + Sqr(D)) / (2 * A)
SolveQuadraticEquation = "Ðåøåíèå ïîëó÷åíî" 'Ôóíêöèÿ âîçâðàùàåò ñîîáùåíèå î ðåøåíèè
Else
SolveQuadraticEquation = "Äèñêðèìèíàíò < 0. Êîðíåé íåò"
End If
End Function  ýòîì ïðèìåðå ìîæíî çàìåòèòü ìîäèôèêàòîð ByVal ïåðåä àðãóìåíòàìè A, B è C. Ýòî ñïîñîáñòâóåò òîìó, ÷òî ïàðàìåòðû â ôóíêöèþ áóäóò ïåðåäàíû ïî çíà÷åíèþ. Ìîäèôèêàòîð ByRef, íàïðîòèâ, ïåðåäà¸ò çíà÷åíèå ïî ññûëêå. Äëÿ òàêîãî òèïà ìîäèôèêàòîðà, ôóíêöèÿ ìîæåò ìîäèôèöèðîâàòü çíà÷åíèÿ ïåðåìåííûõ, ïåðåäàííûõ â êà÷åñòâå ïàðàìåòðîâ. Visual Basic ïî-óìîë÷àíèþ âñåãäà ïåðåäà¸ò çíà÷åíèÿ ïî ññûëêå, åñëè íè îäèí èç ìîäèôèêàòîðîâ íå áûë óêàçàí.
Ìîäóëè è êëàññû Ïðîãðàììíûé êîä â Visual Basic õðàíèòñÿ â ìîäóëÿõ. Ñóùåñòâóþò âñåãî òðè âèäà ìîäóëåé: ìîäóëü ôîðìû (Form), ñòàíäàðòíûé ìîäóëü (Module) è ìîäóëü êëàññà (Class Module).
Ìîäóëü ôîðìû (ðàñøèðåíèå ôàéëà *.frm) ÿâëÿåòñÿ îñíîâîé áîëüøèíñòâà ïðèëîæåíèé Visual Basic. Ìîäóëü ôîðìû ñîäåðæèò ïðîöåäóðû îáðàáîòêè ñîáûòèÿ, îáùèå ïðîöåäóðû è îáúÿâëåííûå íà óðîâíå ôîðìû: ïåðåìåííûå, êîíñòàíòû, òèïû è âíåøíèå ïðîöåäóðû. Åñëè îòêðûòü ìîäóëü ôîðìû â òåêñòîâîì ðåäàêòîðå, ìîæíî óâèäåòü îïèñàíèÿ ôîðìû è å¸ ýëåìåíòîâ óïðàâëåíèÿ, âêëþ÷àÿ èõ ñâîéñòâà. Êîä, ðàçìåù¸ííûé â ìîäóëå ôîðìû, ìîæåò ññûëàòüñÿ íà äðóãèå ôîðìû èëè îáúåêòû ïðèëîæåíèÿ. Ñòàíäàðòíûé ìîäóëü (ðàñøèðåíèå ôàéëà *.bas) ÿâëÿåòñÿ êîíòåéíåðîì äëÿ ïðîöåäóð, ôóíêöèé è îáúÿâëåíèé, ê êîòîðûì îáû÷íî ïîëó÷àþò äîñòóï äðóãèå ìîäóëè ïðèëîæåíèÿ. Îíè ìîãóò ñîäåðæàòü ãëîáàëüíóþ ïåðåìåííóþ (äîñòóïíóþ âñåìó ïðèëîæåíèþ) èëè îïèñàííûå íà óðîâíå ìîäóëÿ: ïåðåìåííûå, êîíñòàíòû, òèïû, âíåøíèå è ãëîáàëüíûå ïðîöåäóðû. Êîä, ðàçìåù¸ííûé â ñòàíäàðòíîì ìîäóëå, ìîæåò áûòü íå ñâÿçàí ñ îïðåäåëåííûì ïðèëîæåíèåì; åñëè íå èñïîëüçîâàòü ññûëêè íà ìîäóëü ôîðìû èëè èìåíà ýëåìåíòîâ óïðàâëåíèÿ, ñòàíäàðòíûé ìîäóëü ìîæåò áûòü èñïîëüçîâàí â äðóãèõ ïðèëîæåíèÿõ. Ìîäóëü êëàññà (ðàñøèðåíèå ôàéëà *.cls) ÿâëÿåòñÿ îñíîâîé îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ â Visual Basic. Ìîäóëü êëàññà èñïîëüçóåòñÿ äëÿ ñîçäàíèÿ íîâûõ îáúåêòîâ. Ýòè îáúåêòû ìîãóò èìåòü ñîáñòâåííûå ñâîéñòâà, ìåòîäû è ñîáûòèÿ. Ôàêòè÷åñêè, ôîðìà — ïðîñòî ìîäóëü êëàññà, êîòîðûé ìîæåò ñîäåðæàòü ýëåìåíòû óïðàâëåíèÿ, ïîìåùåííûå â íåãî, è âûâîäèòü èõ íà ýêðàí. Êëàññû ìîãóò ñîäåðæàòü ñïåöèàëüíûå ïðîöåäóðû Class_Initialize è Class_Terminate, êîòîðûå ôàêòè÷åñêè ÿâëÿþòñÿ êîíñòðóêòîðîì è äåñòðóêòîðîì. Îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå Ïðîñòîå âçàèìîäåéñòâèå ìåæäó îáúåêòàìè ÿâëÿåòñÿ îäíèì èç áàçîâûõ ñîñòàâëÿþùèõ ïàðàäèãìû Visual Basic. Ñàì îáúåêò íàçûâàþò ýêçåìïëÿðîì êëàññà. Îáúåêòíàÿ ìîäåëü VB ïðåäîñòàâëÿåò ðàçëè÷íûå êëàññû äëÿ ðàáîòû ñ ôîðìàìè, ýëåìåíòàìè óïðàâëåíèÿ, áóôåðîì îáìåíà, êîëëåêöèÿìè, ýêðàíîì è ò. ä. Äëÿ âçàèìîäåéñòâèÿ ñ äðóãèìè îáúåêòàìè êëàññ ïðåäîñòàâëÿåò ðàçðàáîò÷èêó èíòåðôåéñ, ñîñòîÿùèé èç ñâîéñòâ, ìåòîäîâ è ñîáûòèé.
Ñîçäàíèå íîâîãî îáúåêòà èç êëàññà âîçìîæíî ðàííèì èëè ïîçäíèì ñâÿçûâàíèåì. Äëÿ ðàííåãî ñâÿçûâàíèÿ èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî New ïåðåä èìåíåì êëàññà. Äëÿ ïîçäíåãî ñâÿçûâàíèÿ èñïîëüçóåòñÿ ôóíêöèÿ CreateObject, âîçâðàùàþùàÿ ññûëêó íà ñîçäàííûé îáúåêò. Ïðèñâàèâàíèå ññûëîê îñóùåñòâëÿåòñÿ â ïåðåìåííûå ñ òèïîì Object, èñïîëüçóÿ îïåðàòîð Set. Äîñòóï ê ìåòîäàì è ñâîéñòâàì êëàññà ïðîèñõîäèò ÷åðåç îïåðàòîð òî÷êó ., êîòîðûé ñòàâèòñÿ ñðàçó ïîñëå èìåíè ïåðåìåííîé îáúåêòíîãî òèïà. Åñëè êëàññ ñîäåðæèò ñîáûòèÿ, òî ïåðåìåííûå îáúÿâëÿþòñÿ ñ êëþ÷åâûì ñëîâîì WithEvents, òåì ñàìûì áóäóò äîñòóïíû ïðîöåäóðû îáðàáîòêè ñîáûòèé.
Ïðèìåð ïîêàçûâàåò âçàèìîäåéñòâèå ïðîãðàììû ñ áèáëèîòåêîé Microsoft Scripting Runtime, ïðåäîñòàâëÿþùåé îáúåêòû äëÿ ðàáîòû ñ ôàéëîâîé ñèñòåìîé:
Public Sub Main()
Dim objFSO As New FileSystemObject 'Ñîçäà¸ì ýêçåìïëÿð êëàññà, èñïîëüçóÿ îïåðàòîð New
Dim objWindows As Folder
Set objWindows = objFSO.GetFolder(Environ("SYSTEMROOT")) 'Âûçûâàåì ìåòîä êëàññà GetFolder è ïðèñâàèâàåì ññûëêó íà ïîëó÷åííûé îáúåêò
MsgBox "Ïàïêà Windows: " & objWindows.Path '×èòàåì ñâîéñòâà êëàññà
MsgBox "Äàòà ñîçäàíèÿ: " & Format(objWindows.DateCreated, "YYYY-MM-DD H:mm:ss")
Dim sTextFilePath As String
Dim objTS As TextStream
sTextFilePath = objFSO.BuildPath(Environ("TEMP"), "Òåñòîâûé ôàéë.txt") 'Ìåòîä ñ äâóìÿ ïàðàìåòðàì âîçâðàùàåò çíà÷åíèå òèïà String
Set objTS = objFSO.CreateTextFile(sTextFilePath, True)
objTS.Write "Ïðèâåò, Âèêèïåäèÿ!"
objTS.Close
objFSO.DeleteFile sTextFilePath, True
Set objFSO = Nothing 'Ïðèñâàèâàÿ Nothing, ïðîèñõîäèò îñâîáîæäåíèå ññûëêè, è îáúåêò ìîæåò âûçâàòü ïðîöåäóðó äåñòðóêòîðà
Set objWindows = Nothing 'VB àâòîìàòè÷åñêè âûçûâàåò äåñòðóêòîð, åñëè íà îáúåêò áîëüøå íå ññûëàþòñÿ
Set objTS = Nothing
End Sub Visual Basic ïîçâîëÿåò ðàçðàáîò÷èêó ñàìîìó ñîçäàâàòü íîâûå êëàññû.  îòëè÷èå îò äðóãèõ ÿçûêîâ ïðîãðàììèðîâàíèÿ, òàêèõ êàê Java è C++, Visual Basic èìååò íåïîëíóþ ïîääåðæêó ÎÎÏ.
Êàê èçâåñòíî, àáñòðàêòíûé êëàññ íåîáõîäèì, ÷òîáû ïðåäîñòàâèòü øàáëîí äëÿ èíòåðôåéñà äðóãèì êëàññàì.  Visual Basic êëàññû èìåþùèå ÷ëåíû êëàññà, íî íå ñîäåðæàùèå ðåàëèçàöèþ, ìîæíî èñïîëüçîâàòü â êà÷åñòâå àáñòðàêòíûõ êëàññîâ, íî ôàêòè÷åñêè îíè èìè íå ÿâëÿþòñÿ. Èç êëàññîâ Visual Basic âñåãäà ìîæíî ñîçäàòü îáúåêòû, äàæå åñëè îíè íå ñîäåðæàò êîäà[4]
Ïðèíöèï èíêàïñóëÿöèè äåéñòâóåò â Visual Basic. ×òîáû ðàçãðàíè÷èòü äîñòóï ê ÷ëåíàì êëàññà, ñëóæàò ìîäèôèêàòîðû Public, Private è Friend, èñïîëüçóåìûå ïðè îïèñàíèè ïðîöåäóð, ôóíêöèé, êîíñòàíò, ïåðåìåííûõ è ïîëüçîâàòåëüñêèõ òèïîâ.
Íàñëåäîâàíèå ðåàëèçàöèè íå ïîääåðæèâàåòñÿ. Visual Basic îáåñïå÷èâàåò òîëüêî ïîääåðæêó íàñëåäîâàíèÿ èíòåðôåéñà ÷åðåç îïåðàòîð Implements. Ïðè íàñëåäîâàíèè èíòåðôåéñà ëþáîé êëàññ ìîæåò äåéñòâîâàòü êàê áàçîâûé êëàññ èíòåðôåéñà. Âîîáùå ëþáîé êëàññ, ìîæåò âûñòóïàòü êàê áàçîâûé êëàññ èíòåðôåéñà.
Ïîëèìîðôèçì îáåñïå÷èâàåòñÿ òîëüêî ÷åðåç èíòåðôåéñû, òàê êàê íàñëåäîâàíèå VB íå ïîääåðæèâàåò. Ðåàëèçàöèÿ ïîëèìîðôèçìà ïîêàçàíà íà ïðèìåðå êëàññîâ Àâòîìîáèëü è Ñàìîë¸ò ðåàëèçóþùèå èíòåðôåéñ êëàññà Òðàíñïîðò.
'Êëàññ ITransport.cls Public Function GetMaxSpeed() As Long End Function 'Êëàññ CAuto.cls Implements ITransport 'Íàñëåäóåì èíòåðôåéñ
Private Function ITransport_GetMaxSpeed() As Long 'Ðåàëèçàöèÿ ìåòîäà
ITransport_GetMaxSpeed = 240
End Function 'Êëàññ CFly.cls Implements ITransport
Private Function ITransport_GetMaxSpeed() As Long
ITransport_GetMaxSpeed = 700
End Function 'Ñòàíäàðòíûé ìîäóëü Program.bas Option Explicit
Public Sub Main()
Dim T As ITransport 'Îáúÿâëÿåì ïåðåìåííóþ ñ òèïîì ITransport
Set T = New cAuto
WhatTransportSpeed T 'Ïåðåäàåì ññûëêó â ïðîöåäóðó, êîòîðàÿ âûçîâåò íóæíûé ìåòîä êëàññà, â çàâèñèìîñòè îò ðåàëèçàöèè
Set T = New cFly
WhatTransportSpeed T
End Sub
'Ôóíêöèÿ èìååò àðãóìåíò, êîòîðûé ïðèíèìàåò ññûëêó íà îáúåêò, ðåàëèçóþùèé èíòåðôåéñ ITransport Public Sub WhatTransportSpeed(Transport As ITransport)
MsgBox "Ìàêñèìàëüíàÿ ñêîðîñòü: " & Transport.GetMaxSpeed()
End Sub