Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/declaring-arrays#declare-a-dynamic-array
- 'https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/redim-statement -- can be used with UBound to set array upper bound!
- '#
- '---------------------------------------------------------------------------------------------------------------------------
- '#
- Sub somethingConfig()
- Dim output As Variant
- Dim myPath As String
- myPath = "C:\Users\Johny\Desktop\tréning\VBA\advanced_config.txt"
- output = FetchConfig("fuck", myPath, "nice")
- If IsArray(output) Then
- MsgBox "Test: " & Join(output, (vbNewLine & "test: "))
- Else
- MsgBox "Test: " & output
- End If
- End Sub
- '#
- '---------------------------------------------------------------------------------------------------------------------------
- '#
- 'https://stackoverflow.com/questions/2781689/how-to-return-a-result-from-a-vba-function
- Public Function FetchConfig(filterKey As String, Optional configPath As String, Optional ifNothingFound As String, Optional forceUpdateFromFile As Boolean, Optional needHelp As Boolean) As Variant
- 'filterKey -> ktore hodnoty (podla textu pred #) chces
- 'configPath -> kde sa nachadza subor s nastaveniami (a ako sa vola) //prednastavene chcem dat na ThisWorkbookFolder & "\config.txt"
- 'ifNothingDound -> co ma napisat ak nenajde ani jednu hodnotu podla FilterKey
- 'forceUpdateFromFile -/-> stiahne vsetky data nanovo i ked uz boli raz pocas makra stiahnute, prednastavene na False
- 'needHelp -/-> napise MsgBox s tymito komentarmi a vypne funkciu (a idealne i cele makro)
- Dim configWhole As String
- Dim configArr As Variant
- Dim tempDivide As Variant
- Dim tempStr As String
- Dim configValue() As Variant 'Key-Value pairs (google it)
- Dim configKey As Variant
- Dim configOutput As Variant
- Dim i As Long 'i, j a k su len na pocitanie (opakovani a ine pomocne vypocty)
- Dim j As Long
- Dim k As Long
- i = 0
- j = 0
- k = 0
- 'basic cesta ak nevyplnene
- If ((configPath = "") Or IsEmpty(configPath) Or (configPath = "0")) Then
- configPath = "C:\Users\Johny\Desktop\tréning\VBA\advanced_config.txt"
- End If
- 'musim pridat: If IsEmpty(globalConfigArr) Or forceUpdateFromFile = TRUE Then ... dole open ... Else ... pouzi hodnoty z globalConfigArr //musim samozrejme pridat globalConfigArr
- 'pridat kontrolu ci nie je globalConfigArr prazdny a ak ano, daj MsgBox o chybe a nacitaj nanovo zo suboru
- 'netusim ako funguje Open+Input+Close :(, viac info na https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/line-inputstatement
- Open configPath For Input As #1
- configWhole = Input$(LOF(1), 1)
- Close #1
- configArr = Split(configWhole, vbNewLine) 'https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/split-function
- 'musim najprv z nich vytvorit array
- ReDim configKey(0 To UBound(configArr))
- ReDim configValue(0 To UBound(configArr))
- 'teraz napisat Do-While kde Spit configArr pomocou # do tempDivide
- 'nasledne configKey(i) = tempDivide(1) a configValue(i) = tempDivide(2)
- Do While (i < (UBound(configArr) + 1) And i < 500)
- tempStr = configArr(i)
- tempDivide = Split(tempStr, "#", 2)
- Debug.Print tempDivide(0) & " " & tempDivide(1)
- configKey(i) = tempDivide(0)
- configValue(i) = tempDivide(1)
- Debug.Print configKey(i) & " " & configValue(i)
- i = i + 1
- Loop
- 'potrebna priprava k mojmu "filtru"
- i = 0
- j = 0
- 'len ak aspon jeden Key splna FilterKey
- 'If Not IsEmpty(Filter(configKey, filterKey)) Then --staré
- If Len(Join(Filter(configKey, filterKey))) > 0 Then 'musí mat aspon nejaky znak
- 'mozno by sa sem hodil Debug.Print?
- ReDim configOutput(0 To (UBound(Filter(configKey, filterKey)))) As Variant
- Else
- 'ReDim configOutput() As String --neviem preco nejde, mozno nie je potrebne
- configOutput = ifNothingFound
- End If
- 'improvizovany "filter", ktory vyberie len tie hodnoty, ktore chcem a da ich zaradom do array
- Do While (i < (UBound(configKey) + 1) And i < (UBound(configValue) + 1))
- If configKey(i) = filterKey And configValue(i) <> "" Then
- ReDim Preserve configOutput(0 To j) 'bude sa prisposobovat velkosti zatial najdenych poloziek
- configOutput(j) = configValue(i)
- j = j + 1
- End If
- i = i + 1
- Loop
- 'Musel som nejak zabranit chybe v Debug-Printe ked Output obsahuje String a nie array :(
- If Len(Join(Filter(configKey, filterKey))) > 0 Then
- Debug.Print "Fn: " & Join(configOutput, vbNewLine) & "End Fn"
- Else
- Debug.Print "Fn: " & configOutput
- End If
- FetchConfig = configOutput
- End Function
- '#
- '---------------------------------------------------------------------------------------------------------------------------
- '#
- 'source of inspiration
- Sub ReadFromFile()
- Dim configFile As String
- Dim configWhole As String
- Dim configArr As Variant 'nebude to fungovat so String https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary
- configFile = Application.ActiveWorkbook.Path & "\config.txt" 'Application.ActiveWorkbook.Path vráti cestu do zložky aktívneho workbooku
- 'alternativa Application.ThisWorkbook.Path vráti cestu ku zložke v ktorej je súbor s týmto makrom
- Open configFile For Input As #1 'netusim ako funguje Open+Input+Close :(, viac info na https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/line-inputstatement
- configWhole = Input$(LOF(1), 1)
- Close #1
- configArr = Split(configWhole, vbNewLine) 'https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/split-function
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement