2015-02-04 4 views
1

Массивы VBA и варианты массивов меня смущают!VBA-массивы и варианты

Если у меня есть двумерный массив, который по существу является диапазоном в электронной таблице, есть ли способ установить 1-мерный новый массив, равный только одному из этих столбцов в двумерном массиве?

Это имеет смысл?

Edit:

У меня есть таблица, которая является шаблоном цитаты. Некоторые из этих продуктов, которые я цитирую, - это продукты, которые мы не хотим приводить, потому что они не соответствуют нашим рекомендациям.

Я хочу пройти через эти ряды продуктов и определить, какие из них плохие, если у продукта есть поле, в котором говорится «удар». Если да, то я собираюсь сделать другие поля для этой строки (продукта) ударом. Простой макрос. Проблема в том, что я исхожу из Python и C, и я склонен думать об этих электронных таблицах как о наборе массивов в 1 меру, и я обычно пишу петли, чтобы пройти через них.

То, что я делал в прошлом, это диапазон, и я просто создаю кучу 1-мерных массивов, которые затем прокручиваю с помощью цикла «for» или «для каждого цикла». Этот подход работает отлично, но больно назначать все 1мерные массивы. Сегодня я подумал, что, возможно, есть способ, которым я просто делаю то же самое, но с 2-мерным массивом, так как было бы легко быстро назначить целый диапазон как 2-мерный массив.

В любом случае проблема, с которой я столкнулась, заключается в том, что я не знаю, как ссылаться только на одно измерение (col) двумерного массива.

Могу ли я сделать для каждого цикла на одном столбце 2D-массива?

+0

Когда вы говорите _essentially_ - на самом деле диапазон или массив? –

+0

Я экспериментировал с использованием фактического диапазона, а затем использовал значения этого диапазона для заполнения массива. Я не уверен, что лучший подход к тому, что я хочу делать. – timbram

+0

Позвольте мне кратко описать то, что я пытаюсь сделать, потому что, возможно, я собираюсь сделать это неправильно. – timbram

ответ

1

объекты Range является достаточно гибким в Excel. Вы можете делать то, что хотите, разными способами. Я приведу два примера:

For i = 1 to 10 
    b = Range("yourRange").Cells(i, yourColumn) + 1 
Next i 

Если вы назначаете постоянное значение столбцу, вы можете легко прокручивать строки, как показано. Или, если вы более комфортно для каждого цикла:

For each c in Range("yourRange").Columns(1) 
    b = c + 1 
Next 

VBA обрабатывает каждый диапазон Excel как 2-мерный массив в любом случае. Вы даже можете использовать обычный синтаксис массива, например: Range("yourRange")(row, col)

+0

Спасибо, я даже не думал об использовании свойства .Columns. Это определенно поможет некоторым из моих проблем. Я думаю, что некоторые из моих проблем с VBA возникают из-за путаницы в отношении типов данных диапазона. Я имею в виду, что такое диапазон? Я бы ожидал, что диапазон будет набором ячеек, и я мог бы каким-то образом получить доступ к одной ячейке, и тогда я мог бы использовать TypeName() для возврата типа ячейки. Вместо этого, похоже, я все еще получаю тип диапазона! Это запутывает! – timbram

+0

@TimothyBramlett, в Excel, ячейка - это диапазон.Это просто двумерный массив с одним членом в каждом измерении. Это действительно гибко в VBA. Вы можете использовать «Range» («диапазон»). Ячейки (строка, col) 'или' Range (x) .Column (y) .Cells (row, col) 'и т. Д. –

+0

Итак, это действительно интересно. Поэтому, когда я объявляю что-то как диапазон, я не даю ему место, я фактически объявляю его как набор ячеек, и он обладает всеми нормальными свойствами, которые может иметь ячейка/диапазон. Видите ли, я думал о диапазоне, как о местоположении или адресе, относящемся к некоторой группе других объектов. – timbram

1

Это иллюстрирует использование 1-D или 2-D массивов из диапазона

Sub GetCellDataInArrays() 

    Dim rng As Range, a, a2, data, r, c 

    Set rng = ActiveSheet.Range("A1:D12") 

    'get a column: Transpose creates a 1-D array 
    a = Application.Transpose(rng.Columns(2).Value) 

    Debug.Print "Column 2: ", Join(a, ",") 

    'get a row - note the double Transpose 
    a2 = Application.Transpose(Application.Transpose(_ 
       rng.Rows(3).Value)) 

    Debug.Print "Row 3:", Join(a2, ",") 


    'EDIT: how to loop over a 2-D array obtained from a worksheet range 
    data = rng.Value 'data is a 2-d 1-based array 
    For r = 1 To UBound(data, 1) 
     For c = 1 To UBound(data, 2) 
      Debug.Print "Row " & r & ":Col " & c & " = ", data(r, c) 
     Next c 
    Next r 

End Sub 
+0

Хороший пример для учебных целей (+1) –

Смежные вопросы