I am trying to build a vba tool that breaks out nested data from a particular cell and repeats the other fields in each row for each nest value. For example, the following:
Bldg 3000 | Floor 2 | 201, 20, 203
Bldg 7010 | Floor 1 | 110, 151
Should become:
Bldg 3000 | Floor 2 | 201
Bldg 3000 | Floor 2 | 202
Bldg 3000 | Floor 2 | 203
Bldg 7010 | Floor 1 | 110
Bldg 7010 | Floor 1 | 151
I started making the below program to import all the spreadsheet data into an array; however, I wasn't sure how to handle the nested values so this is just copying the spreadsheet as is so far:
Sub import()
Dim ws As Worksheet
Dim rng As Range
Dim listing() As Variant
Set ws = ThisWorkbook.Sheets("Export Worksheet")
Set rng = ws.Cells.CurrentRegion
spreadsheet = rng
Set ws2 = ThisWorkbook.Sheets.Add
ws2.Name = "test"
For i = 1 To UBound(spreadsheet, 1)
For j = 1 To UBound(spreadsheet, 2)
Debug.Print spreadsheet(i, j)
ws2.Cells(i, j) = spreadsheet(i, j)
'Need to somehow get nested data in the appropriate cells and count/store the
'unique words so that when I write to sheet, I can have another nested loop that repeats
'all row data except the target column which loops through unique words and breaks them 'out 1 x 1
Next j
Next i
End Sub
So I tried to incorprate a function that get the unique words. It worked before I made the array that stores the unique words as two dimensional, so that I can store the row number as well as each uniqe word (in our example above, I'd have 3 entries with a row number of 1, and their corresponding values would be 201, 202, and 203. Then I'd have 2 entries with a row number of 2, with the unique values being 110 and 151).
My attempt is below and I receive an error when I try to redim preserve the multidimensional array. I'm sure this isn't the best approach and any guidance would be appreciated.
Dim words() As Variant
Dim strng As String
Dim myRng As Range, r As Range
ReDim words(0, 2)
Function getWords_new(st As String, address As String, row As Long)
'Dim words() As Variant
'ReDim words(0, 2)
'ReDim words(0)
word_length = Len(st)
Start = 1
If word_length = 0 Then
words(UBound(words, 1), 1) = row
words(UBound(words, 1), 2) = "NULL"
Else:
For i = 1 To word_length
If Mid(st, i, 1) = "," Then
finish = i
Gap = finish - Start
If Gap > 0 Then
word = Mid(st, Start, Gap)
lim = UBound(words, 1)
If lim > 0 Then
'ReDim Preserve words(1 To lim + 1, 1 To UBound(words, 2))
'from: https://stackoverflow.com/questions/25095182/redim-preserve-with-multidimensional-array-in-excel-vba
y = UBound(words, 2)
ReDim Preserve words(lim + 1, y)
words(lim, 2) = word
Else:
ReDim Preserve words(lim + 1, UBound(words, 2))
words(0, 2) = word
End If
Start = finish + 1
End If
ElseIf i = word_length Then
word = Mid(st, Start, word_length)
lim = UBound(words, 1)
If lim > 0 Then
ReDim Preserve words(lim + 1, UBound(words, 2))
words(lim, 2) = word
Else: words(0, 2) = word
End If
Start = finish + 1
End If
Next i
End If
word_count = UBound(words, 1)
'If word_count > 0 Then
' 'Debug.Print address & " - Word count is: " & word_count
Debug.Print "Words are: "
For i = 0 To UBound(words, 1)
For j = 0 To UBound(words, 2)
' Set ws = ThisWorkbook.Sheets("Stats")
' lr = ws.Cells(Rows.Count, 1).End(xlUp).Row
' ws.Cells(lr + 1, 1) = address
' ws.Cells(lr + 1, 2) = words(i)
' ws.Cells(lr + 1, 3) = word_count
Debug.Print words(i, j)
Next j
' Next i
'End If
End Function


ReDimthe last dimension of an array so if you really need to do it for both dimensions, you should use 2 seperated arrays.