trying to store text file rows in VBA

前端 未结 2 1309
别那么骄傲
别那么骄傲 2020-12-04 01:08

Greetings, I\'m hoping for help in figuring out how to store each row of a text file read into a VBA program as a string. I want to modify one of the strings and then put t

相关标签:
2条回答
  • 2020-12-04 01:43

    If you don't want to add references, you could just go with straight vba code.

    Take for instance the following file wordlist.txt:

    realize
    empty
    theorize
    line
    socialize
    here
    analyze
    

    The following code uses two methods to do as you described (one more common than the other):

    Option Explicit
    
    Sub main()
        Dim sFileName As String
        Dim sMergedLineArray() As String
        Dim sTextToFind As String
        Dim sReplacementText As String
        Dim sOutputFile As String
        Const MY_DELIMITER = "|"
    
        sFileName = "C:\deleteme\wordlist.txt"
    
        sMergedLineArray = ReadFileIntoArray(sFileName)
    
        sTextToFind = "ze"
        sReplacementText = "se"
    
        'Loop through each value in the array and make a change if you need to
        Dim x As Integer
        For x = 0 To UBound(sMergedLineArray)
            If InStr(1, sMergedLineArray(x), sTextToFind, vbTextCompare) > 0 Then
                sMergedLineArray(x) = Replace(sMergedLineArray(x), sTextToFind, sReplacementText, 1, -1, vbTextCompare)
            End If
        Next x
    
        sOutputFile = "C:\deleteme\UK_Version.txt"
        If Not SpitFileOut(sOutputFile, sMergedLineArray) Then
            MsgBox "It didn't work :("
        End If
    
    
        'OR...put it all together, make a mass change and split it back out (this seems unlikely, but throwing it in there anyway)
        sTextToFind = "se"
        sReplacementText = "ze"
        Dim sBigString As String
        Dim sNewArray As Variant
        sBigString = Join(sMergedLineArray, MY_DELIMITER)
        sBigString = Replace(sBigString, sTextToFind, sReplacementText, 1, -1, vbTextCompare)
    
        sNewArray = Split(sBigString, MY_DELIMITER, -1, vbTextCompare)
    
        sOutputFile = "C:\deleteme\American_Version.txt"
        If Not SpitFileOut(sOutputFile, sNewArray) Then
            MsgBox "It didn't work"
        End If
    
        MsgBox "Finished!"
    
    End Sub
    
    
    Function ReadFileIntoArray(sFileName As String) As String()
        Dim sText As String
        Dim sLocalArray() As String
        Dim iFileNum As Integer
        Dim iLineCount As Integer
    
        iFileNum = FreeFile
    
        Open sFileName For Input As #iFileNum
        Do Until EOF(iFileNum)
            Input #iFileNum, sText
            ReDim Preserve sLocalArray(iLineCount)
            sLocalArray(iLineCount) = sText
            iLineCount = iLineCount + 1
        Loop
    
        Close #iFileNum
    
        ReadFileIntoArray = sLocalArray
    
    
    End Function
    
    
    Function SpitFileOut(sFileName As String, sMyArray As Variant) As Boolean
        Dim iFileNum As Integer
        Dim iCounter As Integer
    
        SpitFileOut = False
    
        iFileNum = FreeFile
    
        Open sFileName For Output As #iFileNum
            For iCounter = 0 To UBound(sMyArray)
                Print #iFileNum, sMyArray(iCounter)
            Next
        Close #iFileNum
    
    
        SpitFileOut = True
    End Function
    

    If you run the main sub, you'll end up with two files:

    • UK_Version.txt: This is the result of the first method
    • American_Version.txt: This is the result of the second

    There's lesson 1 of VBA, young Padawan; absorb it, learn and change your login name :P

    0 讨论(0)
  • 2020-12-04 01:45

    Look into the FileSystemObject (ref: 1, 2, 3)

    You have to go to menu and include the Microsoft Scripting Runtime and create a global variable Global fso as New FileSystemObject. Now anywhere in your code do things like fso.OpenTextFile() which returns a TextStream. Each TextStream has methods loke ReadLine(), ReadAll(), SkipLine(), WriteLine(), etc ...

    VBA References

    Here is a quick sample code.

    Sub TEST()
        Dim ts As TextStream
        Set ts = fso.OpenTextFile("text_file.txt", ForReading, False)
        Dim s As String
        s = ts.ReadAll()
    End Sub
    
    0 讨论(0)
提交回复
热议问题