czwartek, 4 grudnia 2014

Sumowanie liczb (rzeczywistych) w dokumencie Word (2 z 2)

O ile sumowanie liczb całkowitych było proste (co zaprezentowałem w poprzednim poście), o tyle suma liczb rzeczywistych wymaga dodatkowych zabiegów.

Osoby znające zagadnienie związane z wykorzystaniem znaków specjalnych w wyszukiwaniu (wildcards) lub techniki Regular Expresion z pewnością spodziewały się, że wystarczy minimalnie przerobić wzorzec wyszukiwania aby uzyskać oczekiwany efekt. Otóż nic bardziej mylnego, następujący zapis:

1.Text = "[0-9]{1;}[0-9,]{0;}"

niestety nie sprawdza się w aplikacji Word. Po prostu nie jest dopuszczalne aby ilość znaków określić na 'zero lub więcej' co kryje się w zapisie {0;}.

Owszem, jesteśmy blisko rozwiązania tworząc następujący wzorzec:

1.Text = "[0-9,]{1;}"

tyle tylko, że powyższy schemat wyszuka również wszystkie przecinki w dokumencie i spróbuje je zsumować co w efekcie wygeneruje błąd. Pozostaniemy jednak przy tym rozwiązaniu i aby było skuteczne dodamy odpowiedni mechanizm obsługi błędów. Całość rozwiązania prezentuje poniższy kod.

01Sub SearchNumbers_Doubles()
02 
03Dim Counter As Long
04Dim Total As Double
05 
06    With Selection.Find
07        .Text = "[0-9,]{1;}"
08        .Replacement.Text = ""
09        .Forward = True
10        .Wrap = wdFindStop
11        .Format = False
12        .MatchCase = False
13        .MatchWholeWord = False
14        .MatchAllWordForms = False
15        .MatchSoundsLike = False
16        .MatchWildcards = True
17    End With
18    
19    Dim dblTmp As Double
20    On Error Resume Next
21    Do While Selection.Find.Execute
22        
23        dblTmp = CDbl(Selection)
24        If Err.Number = 0 Then
25            Counter = Counter + 1
26            Total = Total + dblTmb
27        Else
28            Err.Clear
29        End If
30 
31    Loop    MsgBox "W dokumencie znajduje się  " & Counter & _
32           " liczb o łącznej wartości równej " & Total
33 
34 
35End Sub

środa, 3 grudnia 2014

Sumowanie liczb (całkowitych) w dokumencie Word (1 z 2)

Tym razem temat wywołany na jednym z forów poświęconych programowaniu w VBA- w jaki sposób zsumować wszystkie wartości liczbowe w dokumencie Word, w określonym zaznaczeniu.
W sytuacji gdyby rzecz dotyczyła sumy w tabeli w dokumencie moglibyśmy sięgnąć po odpowiednie pola sumujące. Tym razem chodzi jednak o dowolny zaznaczony obszar.

Rozwiązanie podzielę na dwie części- sumowanie liczb całkowitych- i ten wariant zostanie zaprezentowany w niniejszym poście- oraz sumowanie liczb rzeczywistych, co jak się okaże jest relatywnie prostym zadaniem.

Aby zsumować liczby rzeczywiste najlepszym rozwiązaniem jest zastosować obiekt Find dla odpowiednio skonstruowanego klucza wyszukiwania z wykorzystaniem znaków specjalnych (wildcards). Poniższy kod realizuje to zadanie wyświetlając na końcu komunikat z podsumowaniem.
01Sub SearchSumIntegers()
02 
03Dim Counter As Long
04Dim Total As Long
05 
06    With Selection.Find
07        .Text = "[0-9]{1;}"
08        .Replacement.Text = ""
09        .Forward = True
10        .Wrap = wdFindStop
11        .Format = False
12        .MatchCase = False
13        .MatchWholeWord = False
14        .MatchAllWordForms = False
15        .MatchSoundsLike = False
16        .MatchWildcards = True
17    End With
18    
19    Do While Selection.Find.Execute
20        
21        Counter = Counter + 1
22        Total = Total + Selection
23 
24    Loop
25    MsgBox "W dokumencie znajduje się  " & Counter & _
26           " liczb o łącznej wartości równej " & Total
27 
28End Sub

Powyższe rozwiązanie w wariancie sumującym liczby rzeczywiste opublikowany zostanie już jutro.