Прежде чем предложить вам альтернативное решение, вот несколько замечаний относительно вашего существующего кода.
Объявление переменной
Со следующей декларацией ...
Dim rowcount, x, rowx As Long
... rowcount и x оба объявлены как Variant, а не Long, и rowx как Long. Чтобы объявить все переменные как Long, объявите их следующим образом ...
Dim rowcount as Long, x as Long, rowx as Long
Для каждого ключа в dict / Next
Для каждой итерации назначается ключ текстовое значение (ie. "arr_1"), а не массив. Таким образом, Array (Key) возвращает Variant, содержащий нулевой одноэлементный массив. Так, например, в первой итерации первым элементом будет текст «arr_1».
Для каждого num In Array (Key) / Next
With На каждой итерации num присваивается элемент из Array (Key). Однако, поскольку Array (Key) состоит из одного элемента, будет только одна итерация, где num будет просто присвоен текст "arr_1".
arr = Array (Key)
arr присваивается массив из одного элемента, поскольку Array (Key) возвращает массив из одного элемента. И поэтому один элемент будет получен с помощью arr (0).
Альтернативное решение
Option Explicit
Sub test()
Dim sourceRange As Range
Dim lastRow As Long
With Sheets("Sheet1")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set sourceRange = .Range("D1:P" & lastRow)
End With
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim colIndex As Long
With sourceRange
For colIndex = 1 To .Columns.Count Step 2
'key is being assigned the column number
'item is being assigned a two-dimensional (n by 1 column) array
dict.Add Key:=.Columns(colIndex).Column, item:=.Columns(colIndex).Value
Next colIndex
End With
Dim dictionaryItem As Variant
Dim currentArray As Variant
Dim i As Long
For Each dictionaryItem In dict.items()
currentArray = dictionaryItem
For i = LBound(currentArray) To UBound(currentArray)
Debug.Print currentArray(i, 1)
Next i
Next dictionaryItem
End Sub