• Arrays in Excel VBA (97 sr2)

    Author
    Topic
    #395537

    I’m trying to import data from an external file using VBA so I don’t need to be here 24/7.
    No problem with the smaller files but I’m hitting a compile error: Out of memory when I try to specify more than say 36 array elements.
    Here’s a section of the code:

    Workbooks.OpenText FileName:= _
    MyfileName _
    , Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
    :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
    False, Comma:=False, Space:=False, Other:=True, OtherChar:=”|”, _
    FieldInfo:=Array(Array(1, 1), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2), Array _
    (6, 2), Array(7, 2), Array(8, 2), Array(9, 2), Array(10, 2), Array(11, 2), Array(12, 2), _
    Array(13, 2), Array(14, 2), Array(15, 2), Array(16, 1), Array(17, 4), Array(18, 4), Array( _
    19, 4), Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), _
    Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array( _
    32, 1), Array(33, 1), Array(34, 1), Array(35, 2), Array(36, 1), Array(37, 2), Array(38, 2), _
    Array(39, 1), Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 2), Array(44, 1), Array( _
    45, 1), Array(46, 2), Array(47, 2), Array(48, 2), Array(49, 2), Array(50, 2), Array(51, 2), _
    Array(52, 2), Array(53, 2), Array(54, 2), Array(55, 1))

    According to other info I have, the number of elements in the array shouldn’t be giving a problem, but it does.
    I have no constants and 3 public dims.
    The filename to open comes from GetOpenFilename sub in same module.

    Any suggestions on how to open a file containing this number (or more when I have 72 columns to import) of csv fields??

    TIA
    Alan
    Cheshire
    UK

    Viewing 1 reply thread
    Author
    Replies
    • #734821

      Although VBA can handle very large arrays, there is a limit on the number of Array(Array(…), Array(..), …). You can get around it by defining the array in a different way:

      Dim arrColumns(1 To 55, 1 To 2)
      Dim i As Long

      For i = 1 To 55
      arrColumns(i, 1) = i
      Next i

      arrColumns(1, 2) = 1
      arrColumns(2, 2) = 2

      arrColumns(54, 2) = 2
      arrColumns(55, 2) = 1

      Workbooks.OpenText FileName:= MyfileName, Origin:=xlWindows, _
      StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
      ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
      Comma:=False, Space:=False, Other:=True, OtherChar:=”|”, _
      FieldInfo:=arrColumns

      • #734881

        Sorry to be a pain but I can’t see the application of that code in my scenario. The array which I am trying to bring in is in typically a csv type file but with pipe separators. The defined array as in the original sample coding can be explained as:
        Array(1,2) – this is first column and is to be imported as “General” format
        Array(2,2) – this is second column and is to be imported as “Text” format
        ….
        Array(17,4) – this is the seventeenth column and is to be imported as “Date” format
        ….
        Array(54,2) – this is the fifty fifth column and is to be imported as “Text” format

        etcetera.
        First number is column number and second number is:
        1 = General format
        2 = Text format
        4 = Date format

        The formats of the columns are already specified from the original transfer.
        Hence my problem is that I need the separate array components to be of 2 values, the second of which needs to be defined and not incremental or to any pattern.

        Hope this sounds clear.

        Is multi-dimensional arrays the answer??

        • #734943

          Have you actually tried it? The code I proposed create a two-dimensional array that is the equivalent of the array of arrays in your code. The first column of this array is simply filled with the numbers 1 to 55. You were meant to complete the list of values for the second column, where I put … since I’m a lazy censored. For example, since your code has Array(18, 4), you should add arrColumns(18, 2) = 4.

          • #736360

            Apologies and thanks Hans,
            My foot is now lodged in my mouth. I was distracted a little by there being no number 4’s and compared them to my original coding – kind of like 2+2=5.
            Just redone the code in two subs and it works fine.
            Many thanks and I appreciate your patience.
            Alan
            Cheshire UK

          • #736361

            Apologies and thanks Hans,
            My foot is now lodged in my mouth. I was distracted a little by there being no number 4’s and compared them to my original coding – kind of like 2+2=5.
            Just redone the code in two subs and it works fine.
            Many thanks and I appreciate your patience.
            Alan
            Cheshire UK

        • #734944

          Have you actually tried it? The code I proposed create a two-dimensional array that is the equivalent of the array of arrays in your code. The first column of this array is simply filled with the numbers 1 to 55. You were meant to complete the list of values for the second column, where I put … since I’m a lazy censored. For example, since your code has Array(18, 4), you should add arrColumns(18, 2) = 4.

      • #734882

        Sorry to be a pain but I can’t see the application of that code in my scenario. The array which I am trying to bring in is in typically a csv type file but with pipe separators. The defined array as in the original sample coding can be explained as:
        Array(1,2) – this is first column and is to be imported as “General” format
        Array(2,2) – this is second column and is to be imported as “Text” format
        ….
        Array(17,4) – this is the seventeenth column and is to be imported as “Date” format
        ….
        Array(54,2) – this is the fifty fifth column and is to be imported as “Text” format

        etcetera.
        First number is column number and second number is:
        1 = General format
        2 = Text format
        4 = Date format

        The formats of the columns are already specified from the original transfer.
        Hence my problem is that I need the separate array components to be of 2 values, the second of which needs to be defined and not incremental or to any pattern.

        Hope this sounds clear.

        Is multi-dimensional arrays the answer??

    • #734822

      Although VBA can handle very large arrays, there is a limit on the number of Array(Array(…), Array(..), …). You can get around it by defining the array in a different way:

      Dim arrColumns(1 To 55, 1 To 2)
      Dim i As Long

      For i = 1 To 55
      arrColumns(i, 1) = i
      Next i

      arrColumns(1, 2) = 1
      arrColumns(2, 2) = 2

      arrColumns(54, 2) = 2
      arrColumns(55, 2) = 1

      Workbooks.OpenText FileName:= MyfileName, Origin:=xlWindows, _
      StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
      ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
      Comma:=False, Space:=False, Other:=True, OtherChar:=”|”, _
      FieldInfo:=arrColumns

    Viewing 1 reply thread
    Reply To: Arrays in Excel VBA (97 sr2)

    You can use BBCodes to format your content.
    Your account can't use all available BBCodes, they will be stripped before saving.

    Your information: