Arrays VBA:从数据表创建包含数组数组的.txt文件

Arrays VBA:从数据表创建包含数组数组的.txt文件,arrays,vba,Arrays,Vba,我在excel工作表上有一个20x3表格。这三列中的每一列都标有日期、价格和数量。我想将此数据转换为一个.txt文件,该文件包含一个数组,即一个包含二十个数组的数组,其中二十个数组中的每一个都具有格式[日期、价格、体积]。最终数组的格式应为: [[Date_0, Price_0, Volume_0], . . .,[Date_19, Price_19, Volume_19]]. 我相信这可以通过为每一行编写一个循环并作为一个数组打印来实现。您可以使用输出的开放路径调用来实现,然后在数组的两个方

我在excel工作表上有一个
20x3
表格。这三列中的每一列都标有日期、价格和数量。我想将此数据转换为一个.txt文件,该文件包含一个数组,即一个包含二十个数组的数组,其中二十个数组中的每一个都具有格式
[日期、价格、体积]
。最终数组的格式应为:

[[Date_0, Price_0, Volume_0], . . .,[Date_19, Price_19, Volume_19]].

我相信这可以通过为每一行编写一个循环并作为一个数组打印来实现。

您可以使用输出的
开放路径
调用来实现,然后在数组的两个方向上进行迭代

Sub writeArrToFile(ByRef arr() As String, ByVal path As String)

    Dim lOuter As Integer, _
        uOuter As Integer, _
        lInner As Integer, _
        uInner As Integer

    Open path For Output As #1
    Let lOuter = LBound(arr(), 1)
    Let uOuter = UBound(arr(), 1)
    Let lInner = LBound(arr(), 2)
    Let uInner = UBound(arr(), 2)

    Print #1, "[";
    For i = lOuter To uOuter
        Print #1, IIf(i > lOuter, ",", ""); "[";
        For j = lInner To uInner
            Print #1, IIf(j > lInner, ",", ""); arr(i, j);
        Next j
        Print #1, "]";
    Next i
    Print #1, "]";
    Close #1
End Sub
或者,您可以通过使用更现代、面向对象的方法来实现这一点

Sub writeArrToFile(ByRef arr() As String, ByVal path As String)

    Dim fso     As Object, _
        fOut    As Object, _
        lInner  As Integer, _
        lOuter  As Integer
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fOut = fso.CreateTextFile(path, overwrite:=True, Unicode:=False)

    Let lInner = LBound(arr(), 2)
    Let uInner = UBound(arr(), 2)

    With fOut
        .Write "["
        For i = LBound(arr(), 1) To UBound(arr(), 1) Step 1
            .Write IIf(i > lOuter, ",", "") & "["
            For j = lInner To uInner
                .Write IIf(j > lInner, ",", "") & arr(i, j)
            Next j
            .Write "]"
        Next i
        .Write "]"
        .Close
    End With
End Sub
测试仪功能 您可以使用此函数测试上述内容。修改文件路径以指定子例程的输出位置

Sub tester()
    Dim arr(0 To 2, 0 To 2) As String

    arr(0, 0) = "a"
    arr(0, 1) = "b"
    arr(0, 2) = "c"
    arr(1, 0) = "d"
    arr(1, 1) = "e"
    arr(1, 2) = "f"
    arr(2, 0) = "g"
    arr(2, 1) = "h"
    arr(2, 2) = "i"

    writeArrToFile arr, "C:\[your directory]\Test.txt"
End Sub
输出 上述测试仪功能输出到
“C:\[您的目录]\Test.txt”


这是上面的修改,将输入作为一个范围。它能够处理多个区域的范围(多重选择)

测试员 这是一个通用的测试用例,但我认为您应该在您的用例中使用一个命名的范围来代替
选择

Sub tester()
   writeRangeToFile Selection, "C:\[your directory]\Test.txt"
End Sub
输出 鉴于选择

测试仪功能输出

[[B2,C2,D2,E2,F2,G2],[B3,C3,D3,E3,F3,G3],[B4,C4,D4,E4,F4,G4],[B5,C5,D5,E5,F5,G5]]
[[M3,N3,O3,P3,Q3],[M4,N4,O4,P4,Q4],[M5,N5,O5,P5,Q5],[M6,N6,O6,P6,Q6],[M7,N7,O7,P7,Q7],[M8,N8,O8,P8,Q8]]
[[D10,E10,F10,G10,H10,I10,J10],[D11,E11,F11,G11,H11,I11,J11],[D12,E12,F12,G12,H12,I12,J12],[D13,E13,F13,G13,H13,I13,J13],[D14,E14,F14,G14,H14,I14,J14],[D15,E15,F15,G15,H15,I15,J15],[D16,E16,F16,G16,H16,I16,J16]]
[[Q15,R15,S15,T15],[Q16,R16,S16,T16],[Q17,R17,S17,T17],[Q18,R18,S18,T18],[Q19,R19,S19,T19],[Q20,R20,S20,T20]]

谢谢我让他工作。非常感谢。然后如何将此测试仪函数应用于任意大小的表?例如,如果我将一个arbietrary表保存为一个命名范围,那么您是否将数据存储为一个范围,而不是2D数组?这将大大简化事情——给我一秒钟,我会为你们写一些东西。它是一个2D数组,它只是一个NxM表。然而,我在一张工作表中有几个这样的表,每个表都保存为不同的命名范围。您应该看到一个额外的答案,该答案应该处理将输入作为一个范围的问题。只需将该答案的tester函数中的
选择更改为对您指定范围的引用,您应该很好。我正在使用以下writeRangeToFile(“MM”,“X:\Derivs\Johnny\Test\u 2.txt”)MM是指定范围,但是excel会给出一个类型不匹配错误。您需要将
“MM”
包装在
范围()中
打电话。如果命名范围不在活动工作表上,则可能需要添加工作表引用。这看起来像是
Sheets(“[您的工作表]”)。范围(“MM”)
Hey Taylor。如何修改此算法以生成JSON格式的txt。文件标签将是日期、价格和数量。是否可以将下面的范围参数宏更改为输出JSON格式的文件?
Sub tester()
   writeRangeToFile Selection, "C:\[your directory]\Test.txt"
End Sub
[[B2,C2,D2,E2,F2,G2],[B3,C3,D3,E3,F3,G3],[B4,C4,D4,E4,F4,G4],[B5,C5,D5,E5,F5,G5]]
[[M3,N3,O3,P3,Q3],[M4,N4,O4,P4,Q4],[M5,N5,O5,P5,Q5],[M6,N6,O6,P6,Q6],[M7,N7,O7,P7,Q7],[M8,N8,O8,P8,Q8]]
[[D10,E10,F10,G10,H10,I10,J10],[D11,E11,F11,G11,H11,I11,J11],[D12,E12,F12,G12,H12,I12,J12],[D13,E13,F13,G13,H13,I13,J13],[D14,E14,F14,G14,H14,I14,J14],[D15,E15,F15,G15,H15,I15,J15],[D16,E16,F16,G16,H16,I16,J16]]
[[Q15,R15,S15,T15],[Q16,R16,S16,T16],[Q17,R17,S17,T17],[Q18,R18,S18,T18],[Q19,R19,S19,T19],[Q20,R20,S20,T20]]