Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Witam,

Potrzebuję wypracować metodę przygotowywania pliczku xls, który będzie wsadem do systemu fakturowania.

W linku znajdziecie pliczek, który przygotowałam jako uproszczony przykład mojego pliku.
http://wyslijto.pl/plik/ihqfhu7x29511774

Docelowy plik zawiera ok.tysiąca linii, zmienne są kolumny A, B, C, E, F, G.

Bardzo proszę o pomoc w napisaniu Makra lub jakichś formuł,
dzięki którym otrzymam to co w kolumnach zaznaczonych na czerwono, czyli D, H, I, J, K, L

D - opis, który znajdzie się na fakturze
H - licznik ile produktów fakturuję
I - ile PakietówA dla danego nr klienta z kolumny B
J - ile PakietówB dla danego nr klienta z kolumny B
K - ile PakietówC dla danego nr klienta z kolumny B
L - łączna kwota faktury netto

Bardzo ułatwiłoby mi to pracę, bo obecnie kombinuję to różnymi formułami i pliczkami "na piechotę".
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Pani Ilono,

Czy plik wynikowy ma składać się tylko z kolumn oznaczonych na czerwono, czy też wszystkie zmiany mają być wprowadzane w pliku wejściowym?

Jeżeli to drugie, to czy znak "-" ma również być wstawiany zgodnie z Pani przykładem?

Pozdrawiam
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Dziękuję za zainteresowanie :)

Potrzebuję mieć wszystkie te kolumny (i wiele innych) w pliku wejściowym, gdyż jest to tylko część mojej bazy, z którą nie potrafię sobie poradzić. Znak "-" wstawiłam, aby pokazać w skrócie o co mi chodzi - o wyróżnienie wierszy "zbiorowych", gdzie po prostym przefiltrowaniu mogę je wyłapać.
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Rozumiem.
Proszę mi jeszcze napisać czy w pliku wynikowym (tym, który jest wsadem w programu do fakturowania) wiersze ze znakiem "-" są w ogóle potrzebne? Ewentualnie, czy Pani z nich w jakikolwiek sposób korzysta?

Pytam o to, ponieważ nie chciałbym pisać czegoś co finalnie okaże się zbędne.Ten post został edytowany przez Autora dnia 03.01.14 o godzinie 20:08
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

W pliku wynikowym nie potrzebuję wierszy ze znakiem "-" (gdyż będą w bazie),
zależy mi jedynie na tych zawierających końcowe dane.
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Witam,
Czy jest cień szansy na rozwiązanie mojego problemu?
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Pani Ilono,

udało mi się znaleźć trochę wolnego czasu i powstał taki oto "potworek", który tworzy w osobnym arkuszu wszystkie pola jakie oznaczyła Pani na czerwono.

Sub prepareToInvoicing()
Dim sTempFilePath As String
Dim sConnection As String
Dim oRS As Object, oRS2 As Object
Dim oRS_writable As Object
Dim oConn As Object
Dim sqlQuery As String
Dim sTemp As String, iProdukty As Integer, sProdukty As String

On Error GoTo ErrorHandler

sTempFilePath = ThisWorkbook.Path
sTempFilePath = sTempFilePath & "\" & "TempFile_" & Format(Time(), "hhmmss") & ".xls"

'create workbook copy
ThisWorkbook.SaveCopyAs sTempFilePath

If Application.Version >= 12 Then
'use ACE provider
sConnection = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & _
sTempFilePath & ";Extended Properties=""Excel 12.0;HDR=YES;"""
Else
'use JET provider
sConnection = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
sTempFilePath & ";Extended Properties=""Excel 8.0;HDR=YES;"""
End If

Set oRS = CreateObject("ADODB.Recordset")
Set oRS2 = CreateObject("ADODB.Recordset")
Set oRS_writable = CreateObject("ADODB.Recordset")
Set oConn = CreateObject("ADODB.Connection")


'open ADO connection
oConn.Open sConnection

'base SQL QUERY
sqlQuery = "SELECT [Nr klienta (AM)] AS [Nr klienta (AM)], " & _
"' ' AS [OpisNaFV], " & _
"COUNT([NumerProduktu]) AS [ile produktów], " & _
"SUM(IIF([NazwaPakietu]='PakietA', 1, 0)) AS [ile pakietówA], " & _
"SUM(IIF([NazwaPakietu]='PakietB', 1, 0)) AS [ile pakietówB], " & _
"SUM(IIF([NazwaPakietu]='PakietC', 1, 0)) AS [ile pakietówC], " & _
"SUM([Kwota netto]) AS [KwotaFaktury] " & _
"FROM [Step1$] GROUP BY [Nr klienta (AM)] ORDER BY [Nr klienta (AM)]"

'open recordset
oRS.Open sqlQuery, oConn, 3, 1

'clone base recordset structure
cloneRecordsetStructure oRS, oRS_writable

'copy base recordset values
oRS_writable.CursorLocation = adUseClient
oRS_writable.Open

'loop trough base recordset to copy its values
Do Until oRS.EOF
'add new record to writable recordset
oRS_writable.AddNew

'copy each field-value pair from base recordset to writable one
For Each f In oRS.Fields 'f - ADODB.Field
oRS_writable(f.Name).Value = f.Value
Next f



'SELECT usluga,produkt,pakiet,kwota FROM dane WHERE klient = 7000 Order BY usluga , pakiet
oRS2.Open _
"SELECT [Usluga], [NumerProduktu], [NazwaPakietu], [Kwota netto] FROM [Step1$] WHERE [Nr klienta (AM)]=" _
& oRS.Fields("Nr klienta (AM)").Value & _
" ORDER BY [Usluga], [NazwaPakietu]", oConn


'set initial values
sTemp = ""
sProdukty = "("
iProdukty = 0

'loop trought records related with single service
Do Until oRS2.EOF

'add product ID to list
sProdukty = sProdukty & oRS2.Fields("NumerProduktu") & ","

If oRS2.Fields("NazwaPakietu") = "PakietA" Then
If oRS.Fields("ile pakietówA") - 1 = iProdukty Then
'close list with products ID's
sProdukty = Left(sProdukty, Len(sProdukty) - 1) & ")"

'create OpisNaFV field value
sTemp = sTemp & oRS2.Fields("Usluga") & " " & oRS2.Fields("NazwaPakietu") & ":" & Format(oRS2.Fields("Kwota netto"), "##zł") & " x " & iProdukty + 1 & sProdukty & Chr(10)

'revert to initial values
iProdukty = 0
sProdukty = "("
Else
iProdukty = iProdukty + 1
End If
End If

If oRS2.Fields("NazwaPakietu") = "PakietB" Then
If oRS.Fields("ile pakietówB") - 1 = iProdukty Then
'close list with products ID's
sProdukty = Left(sProdukty, Len(sProdukty) - 1) & ")"

'create OpisNaFV field value
sTemp = sTemp & oRS2.Fields("Usluga") & " " & oRS2.Fields("NazwaPakietu") & ":" & Format(oRS2.Fields("Kwota netto"), "##zł") & " x " & iProdukty + 1 & sProdukty & Chr(10)

'revert to initial values
iProdukty = 0
sProdukty = "("
Else
iProdukty = iProdukty + 1
End If
End If

If oRS2.Fields("NazwaPakietu") = "PakietC" Then
If oRS.Fields("ile pakietówC") - 1 = iProdukty Then
'close list with products ID's
sProdukty = Left(sProdukty, Len(sProdukty) - 1) & ")"

'create OpisNaFV field value
sTemp = sTemp & oRS2.Fields("Usluga") & " " & oRS2.Fields("NazwaPakietu") & ":" & Format(oRS2.Fields("Kwota netto"), "##zł") & " x " & iProdukty + 1 & sProdukty & Chr(10)

'revert to initial values
iProdukty = 0
sProdukty = "("
Else
iProdukty = iProdukty + 1
End If
End If



'move to next row
oRS2.MoveNext
Loop

'add proper value to OpisNaFV field
oRS_writable("OpisNaFV").Value = Left(sTemp, Len(sTemp) - 1)
oRS_writable.Update

oRS2.Close
oRS.MoveNext
Loop


oRS_writable.MoveFirst

'create worksheet for results
ThisWorkbook.Worksheets.Add().Name = "result"

'create headers
For i = 0 To oRS_writable.Fields.COUNT - 1
ThisWorkbook.Sheets("result").Cells(1, i + 1).Value = oRS_writable.Fields(i).Name
Next i

'pasete values
ThisWorkbook.Sheets("result").Range("A2").CopyFromRecordset oRS_writable


ErrorExit:
If oRS.State <> 0 Then oRS.Close
If oRS2.State <> 0 Then oRS2.Close
If oRS_writable.State <> 0 Then oRS_writable.Close
oConn.Close
Set oRS = Nothing
Set oConn = Nothing
Kill sTempFilePath

ErrorHandler:
If Err.Number <> 0 Then
MsgBox "Wystąpił błąd nr " & Err.Number & " (" & Err.Description & ")." & _
vbCr & vbCr & "Linia kodu nr " & Erl(), vbCritical, "BŁĄD!"

Resume ErrorExit
End If

End Sub

Private Function cloneRecordsetStructure(sourceRs As ADODB.Recordset, ByRef destRs As ADODB.Recordset)
For Each f In sourceRs.Fields 'f - ADODB.Field
destRs.Fields.Append f.Name, f.Type, f.DefinedSize, f.Attributes And &H20
With destRs(f.Name)
.Precision = f.Precision
.NumericScale = f.NumericScale
End With
Next f
End Function


Jak uda mi się wykrzesać jeszcze trochę czasu to zrobię porządek w tym kodzie.
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Witam,
Panie Łukaszu, dziękuję! Jestem Pana Fanką :))

Niestety mało zdolną, bo pewnie robię coś źle. Po przeklepaniu makra i próbie jego uruchomienia, podswietla mi się linia:

"Private Function cloneRecordsetStructure(sourceRs As ADODB.Recordset, ByRef destRs As ADODB.Recordset"

i wyskakuje komunikat jak poniżej:

Compile error
User-defined type not defined

Nie za bardzo wiem, co z tym zrobic..
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Pani Ilono,

Musi Pani dodać referencje do odpowiednich bibliotek.
W edytorze, w którym wkleiła Pani mój kod, bardzo proszę wybrać menu "Tools">>>"References" i na długiej liście dostępnych bibliotek proszę poszukać i zaznaczyć:
1) Microsoft ActiveX Data Objects X.X Library
2) Microsoft ActiveX Data Objects Recordset X.X Library
gdzie X.X to numer najwyższej dostępnej u Pani wersji.

To powinno załatwić problem.

Dodatkowo, tak jak obiecałem przedstawiam poprawiony kod.
Sub prepareToInvoicingV2()
Dim sTempFilePath As String
Dim sConnection As String
Dim oRS As Object
Dim oRS_writable As Object
Dim oConn As Object
Dim sqlQuery As String
Dim sOpisFV As String, iProdukty As Integer, sProdukty As String

1 On Error GoTo ErrorHandler

2 sTempFilePath = ThisWorkbook.Path
3 sTempFilePath = sTempFilePath & "\" & "TempFile_" & Format(Time(), "hhmmss") & ".xls"

'create workbook copy
4 ThisWorkbook.SaveCopyAs sTempFilePath

5 If Application.Version >= 12 Then
'use ACE provider
6 sConnection = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & _
sTempFilePath & ";Extended Properties=""Excel 12.0;HDR=YES;"""
7 Else
'use JET provider
8 sConnection = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
sTempFilePath & ";Extended Properties=""Excel 8.0;HDR=YES;"""
9 End If

10 Set oRS = CreateObject("ADODB.Recordset")
11 Set oRS_writable = CreateObject("ADODB.Recordset")
12 Set oConn = CreateObject("ADODB.Connection")


'open ADO connection
13 oConn.Open sConnection

'base SQL QUERY
14 sqlQuery = "SELECT [Nr klienta (AM)] AS [Nr klienta (AM)], " & _
"' ' AS [OpisNaFV], " & _
"COUNT([NumerProduktu]) AS [ile produktów], " & _
"SUM(IIF([NazwaPakietu]='PakietA', 1, 0)) AS [ile pakietówA], " & _
"SUM(IIF([NazwaPakietu]='PakietB', 1, 0)) AS [ile pakietówB], " & _
"SUM(IIF([NazwaPakietu]='PakietC', 1, 0)) AS [ile pakietówC], " & _
"SUM([Kwota netto]) AS [KwotaFaktury] " & _
"FROM [Step1$] GROUP BY [Nr klienta (AM)] ORDER BY [Nr klienta (AM)]"

'open recordset
15 oRS.Open sqlQuery, oConn, 3, 1

'clone base recordset structure
16 Call cloneRecordsetStructure(oRS, oRS_writable)

'copy base recordset values
17 oRS_writable.CursorLocation = adUseClient
18 oRS_writable.Open

'loop trough base recordset to copy its values
19 Do Until oRS.EOF

'add new record to writable recordset
20 oRS_writable.AddNew

'copy each field-value pair from base recordset to writable one
21 For Each f In oRS.Fields 'f - ADODB.Field
22 oRS_writable(f.Name).Value = f.Value
23 Next f

24 sOpisFV = printf("%s%s%s", _
getFVdetails(oRS.Fields("Nr klienta (AM)"), "PakietA", oConn), _
getFVdetails(oRS.Fields("Nr klienta (AM)"), "PakietB", oConn), _
getFVdetails(oRS.Fields("Nr klienta (AM)"), "PakietC", oConn))

'add proper value to OpisNaFV field
25 oRS_writable("OpisNaFV").Value = Left(sOpisFV, Len(sOpisFV) - 1)
26 oRS_writable.Update
27 oRS.MoveNext
28 Loop

29 oRS_writable.MoveFirst

'create worksheet for results
30 ThisWorkbook.Worksheets.Add().Name = "result"

'create headers
31 For i = 0 To oRS_writable.Fields.COUNT - 1
32 ThisWorkbook.Sheets("result").Cells(1, i + 1).Value = oRS_writable.Fields(i).Name
33 Next i

'pasete values
34 ThisWorkbook.Sheets("result").Range("A2").CopyFromRecordset oRS_writable

ErrorExit:
35 If oRS.State <> 0 Then oRS.Close
36 If oRS_writable.State <> 0 Then oRS_writable.Close
37 oConn.Close
38 Set oRS = Nothing
39 Set oConn = Nothing
40 Kill sTempFilePath

ErrorHandler:
41 If Err.Number <> 0 Then
42 MsgBox "Wystąpił błąd nr " & Err.Number & " (" & Err.Description & ")." & _
vbCr & vbCr & "Linia kodu nr " & Erl(), vbCritical, "BŁĄD!"
43 Resume ErrorExit
44 End If

End Sub

Private Function cloneRecordsetStructure(sourceRs As ADODB.Recordset, ByRef destRs As ADODB.Recordset)
1 For Each f In sourceRs.Fields 'f - ADODB.Field
2 destRs.Fields.Append f.Name, f.Type, f.DefinedSize, f.Attributes And &H20
3 With destRs(f.Name)
4 .Precision = f.Precision
5 .NumericScale = f.NumericScale
6 End With
7 Next f
End Function

Private Function getFVdetails(klientId As Integer, pakietName As String, ByRef oConn As ADODB.Connection) As String
Dim oCommand As Object
Dim oRS As Object
Dim sProductsList As String
Dim usluga As String, kwota As String
Dim retVal As String

1 Set oCommand = New ADODB.Command
2 Set oRS = New ADODB.Recordset

3 With oRS
4 .CursorLocation = adUseClient 'adUseClient
5 End With

6 On Error GoTo ErrorHandler

7 With oCommand
8 .ActiveConnection = oConn
9 .CommandText = "SELECT [Usluga], [NumerProduktu], [NazwaPakietu], [Kwota netto] FROM [Step1$] WHERE [Nr klienta (AM)]=@klientId AND [NazwaPakietu]=@pakietName ORDER BY [Usluga]"
10 .CommandType = adCmdText
11 .Prepared = True
12 .Parameters.Append .CreateParameter("Nr klienta (AM)", adInteger, adParamInput, , klientId)
13 .Parameters.Append .CreateParameter("NazwaPakietu", adVarChar, adParamInput, 25, pakietName)
14 End With

15 oRS.Open oCommand, , 3, 1

16 If oRS.RecordCount > 0 Then
17 Do Until oRS.EOF
18 usluga = oRS.Fields("Usluga")
19 kwota = Format(oRS.Fields("Kwota netto"), "##zł")
20 sProductsList = printf("%s%s,", sProductsList, oRS.Fields("NumerProduktu"))
21 oRS.MoveNext
22 Loop
23 retVal = printf("%s %s:%s x %s (%s)%s", usluga, pakietName, kwota, oRS.RecordCount, Left(sProductsList, Len(sProductsList) - 1), Chr(10))
24 End If
25 getFVdetails = retVal

ErrorExit:
26 oRS.Close
27 Set oCommand = Nothing
28 Set oRS = Nothing

ErrorHandler:
29 If Err.Number <> 0 Then
30 MsgBox "Wystąpił błąd nr " & Err.Number & " (" & Err.Description & ")." & _
vbCr & vbCr & "Linia kodu nr " & Erl(), vbCritical, "BŁĄD!"
31 Resume ErrorExit
32 End If
End Function

Private Function printf(s As String, ParamArray args())
Dim a As Variant
1 For Each a In args
2 s = Replace(s, "%s", a, 1, 1)
3 Next
4 printf = s
End Function
Ten post został edytowany przez Autora dnia 07.01.14 o godzinie 22:32
Sławomir Broda

Sławomir Broda VBA, Excel, Access,
SAP i wszystko
związane z
automatyzac...

Temat: Pomoc w napisaniu Makra lub formuł

Ilona K.:
Witam,
Panie Łukaszu, dziękuję! Jestem Pana Fanką :))

Niestety mało zdolną, bo pewnie robię coś źle. Po przeklepaniu makra i próbie jego uruchomienia, podswietla mi się linia:

"Private Function cloneRecordsetStructure(sourceRs As ADODB.Recordset, ByRef destRs As ADODB.Recordset"

i wyskakuje komunikat jak poniżej:

Compile error
User-defined type not defined

Nie za bardzo wiem, co z tym zrobic..
Brak referencji do ADO. Tools > reference > ActiveX Data Objects
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Dziękuję, jednak nadal coś robię źle.

Obecnie wyskakują błędy "w linii 0"
13 Type mismatch
91 Object variable or With block variable not set
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Pani Ilono,

W mojej wiadomości powyżej zmieniłem kod na taki, który powinien Pani podać dokładnie numer linii, w której występuje błąd,
Poprzednia wersja nie miała numerowanych wierszy, przez co komunikat o błędzie zawsze wskazywał na wiersz 0.

Proszę użyć poprawionego kodu i w razie problemów dać znać. Postaramy się pomóc.
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Łukasz N.:
Pani Ilono,

W mojej wiadomości powyżej zmieniłem kod na taki, który powinien Pani podać dokładnie numer linii, w której występuje błąd,
Poprzednia wersja nie miała numerowanych wierszy, przez co komunikat o błędzie zawsze wskazywał na wiersz 0.

Proszę użyć poprawionego kodu i w razie problemów dać znać. Postaramy się pomóc.


Dla mnie to czarna magia :(
Czy problemem jest to, ze ja cos zle wpisuję? czy jakieś inne ustawienia? U Pana w pliku działa to poprawnie?

13 Type mismatch - linia 5
91 Object variable or With block variable not set - linia 35
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Kod pisałem i testowałem na pliku od Pani.
Poniżej zamieszczam link do pliku z już dołączonym kodem.
KLIK
U Pani kod "wysypuje" się na wierszu:
 If Application.Version >= 12 Then

i przyznam szczerze, że jeszcze nigdy nie spotkałem się z tym, żeby kod posypał się na takim wierszu...
___________________________________
edit:
Tak z czystej ciekawości:
Jaką ma pani wersję offica?
Czy mogłaby Pani wymienianą przeze mnie linię zamienić na:
If CInt(Application.Version) >= 12 Then
Ten post został edytowany przez Autora dnia 07.01.14 o godzinie 23:12
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

nadal bez zmian, te same błędy, te same linie :(

MsOffice Standard 2010
Wersja:14.0.7106.5003 (32-bitowa)
Tomasz Gryzio

Tomasz Gryzio Dyrektor
zarządzający/Trener/
Konsultant - It
School

Temat: Pomoc w napisaniu Makra lub formuł

Witam,

Pani Ilono proszę zmienić

If CInt(Application.Version) >= 12 Then

na

If Val(Application.Version) >= 12 Then

Pozdrawiam!
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Panie Tomaszu,

Sugeruje Pan, że string zwracany przez "Application.Version" zawiera jakieś nie numeryczne znaki?
Jeżeli tak jest, to jest to rzecz warta zapamiętania.

Pozdrawiam
Ilona K.

Ilona K. Product Manager (DBK
RENTAL)

Temat: Pomoc w napisaniu Makra lub formuł

Tomasz G.:
Witam,

Pani Ilono proszę zmienić

If CInt(Application.Version) >= 12 Then

na

If Val(Application.Version) >= 12 Then

Pozdrawiam!


BINGO! :)

Panowie, bardzo Wam wszystkim dziękuję za zainteresowanie i poświęcony czas.
I gratuluję doświadczenia :)
Tomasz Gryzio

Tomasz Gryzio Dyrektor
zarządzający/Trener/
Konsultant - It
School

Temat: Pomoc w napisaniu Makra lub formuł

Panie Łukaszu,

Bardzo zacne makro Pan napisał dla Pani Ilony - godne gratulacji! :)


Sugeruje Pan, że string zwracany przez "Application.Version" zawiera jakieś nienumeryczne znaki?


Nie sugeruję nic takiego - Application.Version zwraca cztery znaki "12.0".

Pies jest pogrzebany gdzie indziej - tak, gdyby Application.Version zwracał np. "12.0abc", to Cint sobie nie poradzi, a Val tak.

W dokumencie:
http://support.microsoft.com/kb/111868
widzimy:
Expression Value Returned
--------------------------------------------
Val("1726 56th Ave NE") 172656
CInt("1726 56th Ave NE") Error message
Val("asdf") 0
Cint("asdf") Error message
Val("1,000") 1
CInt("1,000") 1000
Val("1.34") 1.34
CInt("1.34") 1
Proszę rzucić okiem na ?cint(Application.Version) w okienku Immediate => error , ?val(Application.Version) => 12 , ale nie na swoim komputerze - na jakimś... innym.

Cint jest bardzo mocno uzależniony od ustawień regionalnych w Win.
Powyższa tabelka dla warunków polskich, gdzie przecinek oddziela cechę od mantysy wygląda tak:

Expression Value Returned
--------------------------------------------
Val("1726 56th Ave NE") 172656
CInt("1726 56th Ave NE") Error message
Val("asdf") 0
Cint("asdf") Error message
Val("1,000") 1
CInt("1,000") 1
Val("1.34") 1,34
CInt("1.34") Error message

Wniosek1: Cint jest w stanie przekonwertować string "liczbowy" tylko wtedy jeżeli jest to prawidłowy string liczbowy dla danych ustawień regionalnych delimitera cechy od mantysy.
Wniosek2: Dla sprawdzenia wersji aplikacji Cint jest niebezpieczny międzynarodowo, Val jest bezpieczny międzynarodowo.

Kolejnych niesamowitości możemy się spodziewać w walce Val vs CDbl dla wartości:
1,234,567.89
1.234.567,89
1 234 567,89
1 234 567.89

Pozdrawiam!
-----
Edytując:
Pani Ilono, wszyscy dziękujemy, aczkolwiek wszelkie podziękowania należą się Panu Łukaszowi! :)Ten post został edytowany przez Autora dnia 08.01.14 o godzinie 00:59
Łukasz N.

Łukasz N. ETL Developer

Temat: Pomoc w napisaniu Makra lub formuł

Pani Ilono,

cieszę się że mogłem Pani pomóc. Mam nadzieję, że makro spełnia Pani oczekiwania.

Panie Tomaszu,

Ma Pan rację co do ustawień regionalnych. Wszystko co do tej pory napisałem było uruchamiana na oprogramowaniu w wersji angielskiej, gdzie delimiterem cechy/mantysy jest kropka.
Stąd też moje błogie przeświadczenie o tym, że porównanie do wartości liczbowej string-a, zwracanego przez Application.Version spełni w 100% swoje zadanie.

Fakt, że rezultat działania funkcji Val() jest niezależny od ustawień regionalnych jest wart zapamiętania. Dziękuję za tą lekcje.

Tomasz G.:
Bardzo zacne makro Pan napisał dla Pani Ilony - godne gratulacji! :)

Dziękuję za tak ciepłe słowa. Nie ukrywam, że kod byłby dużo prostszy/czytelniejszy gdyby nie brak w ADO funkcji agregującej tekst rodem LISTAGG() z Oracle 11g czy GROUP_CONCAT() z MySQL.
Ale niestety, jak się nie ma co się lubi... to o konkatenacje wierszy należy samemu zadbać.

Pozdrawiam.Ten post został edytowany przez Autora dnia 08.01.14 o godzinie 01:45



Wyślij zaproszenie do