Массив для заголовков столбцов - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь сохранить все заголовки столбцов в массиве, который затем могу использовать для заполнения пользовательской формы. Это позволило бы различным заголовкам действовать как выбор столбца для последующего кода. Тем не менее, я не могу получить массив для правильного назначения

Я пытался использовать различные структуры зацикливания, но продолжаю встречаться с ошибками "Subscript out of range"

Option Explicit

Sub Audit_Template_Autofill()

    Dim column_id() As Variant, A1 As Range, z As Range, c As Range
    Dim x As Long, column_count As Long

    Set A1 = Range("A1")

    Set z = A1.End(xlToRight).Offset(0, 1)

    column_count = Range(A1, z).Count 

    x = 0
    For Each c In Range(A1, z)
         column_id(x) = c.Value
         x = x + 1
    Next c
End sub

Я первоначально тестировалназначение с использованием

For each c in range(A1, z)
     debug.print = c.value
next c

, которое точно напечатало все мои заголовки, я просто не могу правильно назначить их в массив. Я прошу прощения за то, что код не слишком чистый, это скорее тестирование для реализации в более крупной модели. Я делал такой цикл раньше, но я не могу вспомнить, как я это написал. Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2019

Назначение заголовков для массива

Самый простой способ -

  • [1] создать двумерный массив (на основе 1), назначивзначение диапазона, равное headers
  • [2], превращает его в "плоский" 1-dim массив (также, кстати, на основе 1) с помощью двойного преобразования ;(обратите внимание, что это невозможно с помощью ReDim Preserve, который позволяет только переразмерить последний (здесь: 2-е измерение), но не "удалить" измерение).

Кстати, вашему исходному коду не хватаетReDim column_id(0 To …) перед началом назначения циклов, чтобы заставить «работать» ;кроме того, переменная x по умолчанию автоматически принимает значение 0, объявляя ее. Предложите полностью квалифицировать ваши диапазоны ссылок и т. Д.

Sub Columns2Array()
Dim headers() As Variant
  ' [1] create a (1-based) 2-dimensional array by assigning a range's value to headers
    headers = Sheet1.Range("A1:" & Sheet1.Range("A1").End(xlToRight).Address)
  ' [2] make it a "flat" 1-dim array (btw 1-based, too) via double transposition
    headers = Application.Transpose(Application.Transpose(headers))

  ' a) test headers items by one code line
    Debug.Print Join(headers, ",")
  ' b) test headers via loop
    Dim colNo&
    For colNo = LBound(headers) To UBound(headers)
        Debug.Print "headers(" & colNo & ") = ", headers(colNo)
    Next colNo
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...