Definitely lots of ways to skin cats and most of them are ridiculous amount of fun. What the first version is doing with
Dim arrType1() As String
is telling the program that you will be using a variable called arrType1, that it is going to be an array(), and that the values of the array will be strings. You are not telling the program how many items the array is comprised of just that it is an array. When you Dim a variable as a string, the program automatically reserves 10 bytes of memory for that variable. When you Dim something as an Array, you reserve 20 bytes plus 4 bytes per Dimension plus the data size. This means that right off the bat with the above Dim, you are reserving 34 bytes of memory. When you do
ReDim arrType1(0 to 999)
you now have 20 bytes for the array + 4 because it is a single dimension Array + (10 * 999) bytes for the reserved strings. That's a total of 10,014 bytes. I know that 10k RAM isn't much these days, but you are doing it three times so you have 30k used and the arrays are still empty, their size only goes up from here. Of course, after you populate them, you are chopping off the unused portion and therefore freeing the memory back up but it is still being used for no reason for a while. What I proposed is that you ReDim the array to be one item longer everytime you are going to add an item so that the array is always the length that you need. By way of example, the strings in the txt file are 35 characters long. Even though block names will vary I'm sure, lets go with 35 for the example. If there were 100 blocks in each list, with the way you were doing it you would have:
10,014 bytes reserved for the array
35 characters X 2 bytes per character X 100 blocks in the list or 7000 bytes
17,014 bytes X 3 arrays
51,042 bytes total used to populate the three lists
Still not an enormous amount but compared with 8,024 bytes to fill one list as needed and you can see that it starts to add up.
Next with the way you had it, after you were finished populating the array, you were cropping it with
Redim Preserve arrType1(0 to I - 1)
followed by redimming one dimension the arrName array the same way which ends up making the first dimension of arrName the same length as arrtype. With my suggestion, instead of using I - 1 to set the ubound, since arrType is set as we went and is the right length, so we use the ubound of arrType to set the ubound of the first dimension of arrName.
Let me know if this actually makes sense to you because I was really feeling like I was starting to talk in circles.