(KR) MIDAS Civil with VBA
VBAλ Excelλ₯Ό λ€λ£¨λ μ¬μ©μμκ² κ°μ₯ μ μ©νκ³ μ κ·Όμ΄ μ¬μ΄ κ°λ°ν΄λ‘, μ΄λ₯Ό μ΄μ©νμ¬ MIDAS Civil APIλ₯Ό μ¬μ©νλ μμ λ₯Ό μμ±ν΄λ΄ λλ€. μ΄λ―Έ λ€μμ λ¬Έμμμ API λͺ λ Ήμ΄μ λν λ΄μ©μ μλ‘νμμΌλ―λ‘, μ¬κΈ°μλ VBAλ₯Ό λ€λ£¨λ κ²μ μ§μ€νλλ‘ νκ² μ΅λλ€.
Β
Json λ°μ΄ν° λ€λ£¨κΈ°
VBAμμ Json λ°μ΄ν°λ₯Ό μμ½κ² λ€λ£¨κΈ° μν΄μλ Dictionary Class λ₯Ό μ΄μ©νλκ² κ²½νμ μ’μ΅λλ€.
μ΄μ°½κΈ° μμ μμ±μ String λ°μ΄ν°λ‘ μμ±νμμΌλ, μ΄λ Json Dataκ° μ»€μ§μλ‘ μ¬μ©νκΈ° μ΄λ ΅κ³ (Hell of Chr(34)), νΉν Get Methodλ₯Ό μ΄μ©νμ¬ λΆλ¬μ¨ λ°μ΄ν°λ₯Ό λ€λ£¨κΈ°κ° μ΄λ ΅μ΅λλ€. νμ§λ§ λ€νμ€λ½κ² Dictionary Classλ₯Ό Json ν¬λ§·μΌλ‘ Converter ν΄μ£Όλ Codeκ° μμΌλ―λ‘, μ΄λ₯Ό μ¬μ©νλ©΄ λμ± λ νΈνκ² μμ±μ΄ κ°λ₯ν©λλ€.
Β
Dictionary Class
Dictionary Classλ, λ©λ΄->λꡬ->μ°Έμ‘°-> Microsoft Scripting Runtimeμ νμ±ννμ¬ μ¬μ©ν©λλ€.
μλμ κ°μ΄ νμ±ννμ§ μκ³ μ¬μ©ν μ μμ§λ§, λΆνΈνλ―λ‘ νμ±ννκ³ μ¬μ©νμκΈΈ μΆμ²λ립λλ€.
'νμ±ννμ§ μκ³ μ¬μ©ν μ μ μΈ λ°©λ²(late binding)
Dim DicEx As Object 'Declare
Set DicEx = CreateObject("Scripting.Dictionary") 'Create
'νμ±ν ν μ μΈνλ λ°©λ²(early binding)
Dim DicEx As Dictionary 'Declare
Set DicEx = New Dictionary 'Create
Β
Dictionary Classλ λ€μκ³Ό κ°μ μ€μ κ°μ κ°μ§λλ€.
μμ±
Count : νμ¬ μ μ₯λ κ°μ²΄μ κ°―μλ₯Ό λ°νν©λλ€.
Item(βKeyValueβ) : μ§μ ν ν€μ Valueλ₯Ό λΆλ¬μ€κ±°λ, λ체ν μ μμ΅λλ€.
Key(βKeyValueβ) : μ§μ ν ν€μ Keyλ₯Ό λΆλ¬μ€κ±°λ, λ체ν μ μμ΅λλ€.
CompareMode : Dictionary κ°μ²΄μμ λ¬Έμμ΄ ν€λ₯Ό λΉκ΅νλ λͺ¨λλ₯Ό μ€μ νμ¬ λ°νν©λλ€.(Binary, text λͺ¨λκ° μμΌλ, κ΅³μ΄ λ³κ²½ν νμλ μμ΅λλ€.)
λ©μλ
Add : ν€μ κ°μ μΆκ°ν©λλ€. μ‘΄μ¬νλ ν€μ΄λ©΄ μ€λ₯κ° λ°μν©λλ€.
Remove : μ§μ ν ν€μ ν λΉλμ΄ μλ κ°μ μ κ±°ν©λλ€. μ‘΄μ¬νμ§ μλ ν€μ΄λ©΄ μ€λ₯κ° λ°μν©λλ€.
RemoveAll : λͺ¨λ ν€μ κ°μ μ κ±°ν©λλ€.
Exists : μ§μ ν ν€κ° μ‘΄μ¬νλ©΄ Trueλ₯Ό λ°ννκ³ , μλλ©΄ Falseλ₯Ό λ°νν©λλ€.
keys : λͺ¨λ ν€λ€μ λ°°μ΄λ‘ λ°νν©λλ€.
Items : λͺ¨λ κ°λ€μ λ°°μ΄λ‘ λ°νν©λλ€.
Β
JsonConvertor
Json μμμ VBAμμλ 곡μ μ§μνλ κ²μ΄ μμΌλ―λ‘, μλ λ§ν¬μ μλ JsonConvertorλ₯Ό μ΄μ©ν©λλ€.
GitHub - VBA-tools/VBA-JSON: JSON conversion and parsing for VBA
Β
Dictionary μ¬μ© μμ
μμ 1 : Dictionary Classμ κΈ°λ³Έμ μΈ μ¬μ©λ°©λ²μ λλ€.
Β
μμ 2 : μ¬λ¬λ¨κ³μ κΉμ΄λ₯Ό κ°μ§λ Dictionary Classλ₯Ό λ§λλ μμ μ λλ€.
VBAλ DeepCopyλ₯Ό μ€ννλ λͺ λ Ήμ΄κ° λ°λ‘ μμ΅λλ€(μ κ° μκΈ°λ‘ ). λ°λΌμ μλ μμ μ κ°μ΄ DeepCopy ννμ Functionμ μ΄μ©ν μ μμ΅λλ€. νΉμ μλμ κ°μ΄ λ§λ€κ³ λ²λ¦¬λ λ°λ³΅ μμ μ ν΅ν΄ λ³μμ κ°μλ₯Ό μ΅μννμ¬ μμ±ν μ μμ΅λλ€.
'μλ₯Ό λ€μ΄
Set dic = new dictionary 'Create
'dic μμ ν΄λμ€μ λ±λ‘
Set dic = nothing 'Release
λ°λ³΅
μ΄μ λν λ΄μ©μ κΉμ λ³΅μ¬ VS μμ λ³΅μ¬ (velog.io) μ΄κ±Έ μ°Έμ‘°νμλ©΄ μ΄ν΄κ° λΉ λ₯΄μ€ κ²λλ€.
Β
Β
JsonConvertor μμ
JsonConvertorλ₯Ό λ€λ£¨λ κ°λ¨ν μμ μ λλ€.
Β
μΆκ°
(1) Runtime error - Timeout
μλ μ½λλ μμ μμ μμ νμ©ν HttpRequest Function μ λλ€.
Function WebRequest(Method As String, Command As String, Body As String) As String
Dim TCRequestItem As Object
Dim URL As String
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://localhost:10024"
URL = URL & Command
TCRequestItem.Open Method, URL, False
TCRequestItem.SetRequestHeader "Content-type", "application/json"
TCRequestItem.Send Body
WebRequest = TCRequestItem.ResponseText
End Function
Β
κ°νΉ, μ νμΌλ‘λΆν° Responseλ₯Ό λ°κΈ°κΉμ§ μκ°μ΄ μ§μ°λμ΄, μλμ κ°μ κ²½κ³ μ°½κ³Ό ν¨κ» VBA μλμ΄ λ©μΆλ κ²½μ°κ° μμ΅λλ€. (μ μ κ³Ό μμμκ° λ§μ κ²½μ° λ±λ±)
Β
κ·Έλ΄ κ²½μ° μλμ κ°μ΄ μ½λ ν μ€μ μ½μ ν΄μ£Όμλ©΄ λ©λλ€. λ¨μλ Milliseconds μ λλ€.
Function WebRequest(Method As String, Command As String, Body As String) As String
Dim TCRequestItem As Object
Dim URL As String
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
'SetTimeouts(resolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout)
TCRequestItem.SetTimeouts 60000, 60000, 60000, 60000
URL = "http://localhost:10024"
URL = URL & Command
TCRequestItem.Open Method, URL, False
TCRequestItem.SetRequestHeader "Content-type", "application/json"
TCRequestItem.Send Body
WebRequest = TCRequestItem.ResponseText
End Function
Β
(2) float point error (λΆλμμμ μλ¬)
μ΄ νμ μμΉν΄μμ μ μλ €μ§ μλ¬μΈ λΆλμμμ μλ¬λ₯Ό VBAμμ μ΄λ»κ² λ€λ£¨λμ§μ λν΄ μ€λͺ ν΄λ΄ λλ€.
λΆλμμμ μ μλ¬λ μ»΄ν¨ν°κ° λ°μλ€μ΄λ μ«μλ₯Ό μ²λ¦¬νλ λ°©μμ μν΄μ μκΈ°λ κ±Έλ‘ μ΄ν΄νκ³ μμ΅λλ€.
(κ΄μ¬μ΄ μμΌμ λΆμ Floating-point arithmetic - Wikipedia μ¬κΈΈ μ°Έκ³ ν΄λ³΄μΈμ.)
Β
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ μ½λλ₯Ό μ€νμμΌ λ³΄κ² μ΅λλ€.
Option Explicit
Sub Test()
Dim i As Integer
Dim sngVar As Single
Dim dblVar As Double
For i = 1 To 10000
sngVar = sngVar + 0.0001
Next i
Debug.Print TypeName(sngVar) & " : " & sngVar
For i = 1 To 10000
dblVar = dblVar + 0.0001
Next i
Debug.Print TypeName(dblVar) & " : " & dblVar
End Sub
0.0001λ₯Ό λ§λ² λνλλ°, μνλ κ²°κ³ΌμΈ 1μ΄ λμ€μ§ μμ΅λλ€. κ²λ€κ° μλ£νμ λ°λΌ κ·Έ μ€μ°¨λ μ°¨μ΄κ° μμ΅λλ€. μ΄λ° λ¬Έμ λ νλ‘κ·Έλ¨μ΄λ©΄ λͺ¨λ κ°μ§κ³ μλ λ¬Έμ μ λλ€. μλλ μμ μμ μ λλ€. κ°λ¨ν μ°μ°μμλ λΆκ΅¬νκ³ 9λ²μ§Έ νμ μ°λ¦¬κ° μνλ κ²°κ³Όλ₯Ό 보μ¬μ£Όμ§ λͺ»ν©λλ€.
μ΄λ° μλ¬λ κ°λ¨νκ² μ ν¨ μλ¦Ώμλ₯Ό μ£Όλ λ°©μμΌλ‘ ν΄κ²°ν μλ μμ§λ§, μ‘°κΈλ κ·Όλ³Έμ μΈ ν΄κ²°λ°©λ²μ΄ μλ κ²½μ°κ° μμ΅λλ€. λ°λ‘ μλ£νμ λ°κΏμ£Όλ κ²λλ€.
Β
VBAμμ μ΄λ° λ¬Έμ μ μΈ μ μλ μλ£νμ λ°λ‘ Decimal μλ£νμ λλ€.
μλμ κ°μ΄ 0.0001λ₯Ό Decimal μλ£νμΌλ‘ λ°κΏμ£Όμ΄ λν΄μ£Όκ±°λ, Decimal μλ£νμΌλ‘ μ μΈν΄μ μ°λ λ°©λ² λ±μ΄ μμ΅λλ€.(Decimal μ Variantλ‘ μ μΈν©λλ€.)
Β
Option Explicit
Sub Test()
Dim i As Integer
Dim sngVar As Single
Dim dblVar As Double
Dim decVar1 As Variant
Dim decVar2 As Variant
For i = 1 To 10000
sngVar = sngVar + CDec(0.0001)
Next i
Debug.Print TypeName(sngVar) & " : " & sngVar
For i = 1 To 10000
dblVar = dblVar + CDec(0.0001)
Next i
Debug.Print TypeName(dblVar) & " : " & dblVar
For i = 1 To 10000
decVar1 = decVar1 + CDec(0.0001)
Next i
Debug.Print TypeName(decVar1) & " : " & dblVar
For i = 1 To 10000
decVar2 = decVar2 + 0.0001
Next i
Debug.Print TypeName(decVar2) & " : " & dblVar
End Sub
Β