Jak wykorzystywać
wyrażenia regularne (Regex) w VBA:
Option Explicit
Function GetNumber(strText As Variant, sVariable As String) As Variant
Dim oRegex As Object, oMatches As Object, oM As Object
Dim vValue As Variant
Set oRegex = CreateObject("VBScript.Regexp")
'Wynajduje liczby oraz łańcuchy tekstowe przed którymi jest nazwa zmiennej i znak równości
oRegex.Pattern = "(" & sVariable & "=" & ")" & _
"(\d+(?:[\.\,]\d+)?|$|\s)"
'wyszukuje wszystkie ciagi znaków spelniajace warunek
oRegex.Global = True
Set oMatches = oRegex.Execute(strText)
Select Case True
Case oMatches.Count = 1
If oMatches(0).submatches.Count = 2 Then
vValue = oMatches(0).submatches(1)
Else
vValue = ""
End If
If IsNumeric(vValue) Then GetNumber = CDbl(vValue) Else GetNumber = vValue
Case oMatches.Count = 0
GetNumber = "[#NM]"
Case oMatches.Count > 1
GetNumber = "[#O]"
End Select
Set oRegex = Nothing
Set oMatches = Nothing
End Function
Powyższa funkcja zwraca wartość określonej zmiennej w podanym tekście.
Jeśli w tekście występuje ciąg "
Wartość X=1050" to po wywołaniu tej funkcji otrzymamy liczbę 1050.
Przykład wywołania:
Sub PodajWartosc()
MsgBox GetNumber("Wartość X=1050", "X")
End Sub
Jak przerwać działanie makra (pętli) poprzez naciśnięcie klawisza ESC
Należy do tego użyć funkcji API.
Na poziomie modułu funkcję tę trzeba zadeklarować:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
A potem:
Do Until GetAsyncKeyState(vbKeyEscape) <> 0
'..... tutaj operacje w pętli
DoEvents
Loop
Z uwagi na sprawy prywatne nie byłem w stanie zajmować się stroną vbamania.pl.
Domena przepadła - nie udało mi się jej odzyskać, więc po dwu miesiącach nieobecności najlepsza polska strona poświęcona VBA powraca w nowym wcieleniu jako Makra.VBA.
Wszelkie Wasze loginy i hasła pozostały bez zmian. Przepraszam za nieobecność i mam nadzieję, że dalej będziecie odwiedzać nasz serwis.
CommonControls - ProgressBar, ListView, TreeView - "Obiekt niedostępny na tym komputerze."
Po aktualizacji Windows z 13.04.2012 na niektórych komputerach, na których uruchamiane są napisane przeze mnie makra zaczęły się pojawiać komunikaty błędów "Obiekt niedostępny na tym komputerze."
Makra tworzę na komputerze z Windows 7 64 bit, a opisany powyżej problem pojawia się na komputerach z Windows XP.
Rozwiązaniem może być dynamiczne tworzenie tych kontrolek w czasie pracy programu.
Jeśli kontrolka ma być "widziana" z poziomu projektu to w zwykłym module należy umieścić deklaracje zmiennej, która będzie reprezentować kontrolkę w kodzie:
ListView:
Public LV As MSComctlLib.ListView
TreeView:
Public TV As MSComctlLib.TreeView
ProgressBar:
Public PG As MSComctlLib.ProgressBar
Jeśli wystarczy "widzialność" na poziomie modułu formularza, to wówczas deklaracje należy wstawić na samej górze modułu formularza, a wyglądają one następująco:
ListView:
Dim LV As MSComctlLib.ListView
TreeView:
Dim TV As MSComctlLib.TreeView
ProgressBar:
Dim PG As MSComctlLib.ProgressBar
Następnie w procedurze UserForm_Activate() tworzymy te kontrolki i ustawiamy odpowiednie właściwości.
ListView:
Private Sub UserForm_Activate()
Set LV = Me.Controls.Add("MSComctlLib.ListViewCtrl.2")
With LV
.Top = 10
.Left = 6
.Width = 100
.Height = 100
.BorderStyle = ccNone
.View = lvwReport
End With
End Sub
TreeView:
Private Sub UserForm_Activate()
Set TV = Me.Controls.Add("MSComctlLib.Treectrl.2")
With TV
.Top = 10
.Left = 126
.Width = 100
.Height = 100
.Style = tvwTreelinesPictureText
.Indentation = 16
End With
End Sub
ProgressBar:
Private Sub UserForm_Activate()
Set PG = Me.Controls.Add("MSComctlLib.ProgCtrl.2")
With PG
.Top = 130
.Left = 6
.Width = 220
.Height = 15
.Min = 0
.Max = 100
.Scrolling = ccScrollingSmooth
End With
End Sub
Przy zakończeniu programu należy oczywiście zwolnić pamięć:
Set LV = Nothing
Set PG = Nothing
Set TV = Nothing
Zapraszam do dyskusji:
http://www.makravba.pl/?go=forum&go2=zobacz&id_watek=2317&return=watek