2015-04-14 3 views
2

Я создаю массив в vba, перейдя через ячейки на листе (originalWS). Так скажем, клетки (2,5) в (2,12) имеют следующие:Как добавить пустые пробелы между значениями в массив vba?

(2,5)Item 
(3,5)Type 
(4,5)Nominal Diameter 
(5,5)Lead 
. 
. 
. 
(12,5)For Use with End Blocks 

Таким образом, когда я петля с кодом ниже я получаю массив, который выглядит следующим образом:

[Пункт , Тип, Номинальный диаметр, Свинец, ..., Для использования с торцевыми блоками].

Однако я хотел бы добавить два пустых пространства между каждым значением в моем массиве. так что это выглядит так:

[Item, "", "", Type, "", "", Номинальный диаметр, "", "", Lead, "", "", ..., For Использование с концевыми блоками, «», «»]

ReDim propertyArr(1, lastRow) 
For i = 1 To lastRow 
    propertyArr(1, i) = originalWS.Cells(i + 1, 5).Value 
    Debug.Print propertyArr(1, i) 
Next 

Я попытался петля, чтобы в окончательном общем размере массива так (lastRow * 3) и шаг вперед на 3. Тем не менее, у меня трудно определить, как я бы сбросил свои оригинальные значения WS.cells (i, 5) так, чтобы они были последовательными.

Других слов, когда я петля пошаговая 3 моих ценностей будет:

propertyArr(1,1) = originalWS.Cells(2,5).value 
propertyArr(1,4) = originalWS.cells(5,5).value 
propertyArr(1,7) = originalWS.cells(8,5).value 

Как я могу цикл так, чтобы хранить значения в моем массиве каждые 2 места, в то время как я получаю значение от последовательного список в листе.

Могу ли я сделать это, не добавляя лишнюю пустую строку , чтобы добавить два пустых пространства между каждым значением в моем исходном цикле, не добавляя лишние пустые строки?

Или я могу добавить два пустых пространства между каждым значением после того, как я создал свой массив в первый раз?

ответ

2

Что-то вроде:

Sub ytrewq() 
    Dim propertyArr(), lastRow As Long 
    Dim originalWS As Worksheet 
    Set originalWS = ActiveSheet 
    lastRow = 5 
    ReDim propertyArr(1, 2 * lastRow) 
    For i = 1 To 2 * lastRow Step 2 
     propertyArr(1, i) = originalWS.Cells(i + 1, 5).Value 
     propertyArr(1, i + 1) = "" 
     Debug.Print propertyArr(1, i) 
    Next 
End Sub 

UNTESTED

+0

Gary, я проверил это, он оптимизирован, чем мое решение. Я думаю, что это может потребоваться '3 * lastRow', так как для каждого элемента ему нужны еще два. Кроме того, ему нужно свойство propertyArr (1, i + 2) = "" ", за которым следует' propertyArr (1, i + 1) = "" '. Поскольку ОР нуждался в двух заготовках. – PaulFrancis

5

Это должно сделать трюк,

Dim lRowNo As Long 

lRowNo = lastRow * 3 
ReDim propertyArr(1, lRowNo) 

For i = 1 To lRowNo 
    If i Mod 3 = 1 Then 
     propertyArr(1, i) = originalWS.Cells(i + 1, 5).Value 
    Else 
     propertyArr(1, i) = "" 
    End If 
    Debug.Print propertyArr(1, i) 
Next 
+1

Спасибо за ваши комментарии ............. Я обновлю свое сообщение в соответствии с вашими инструкциями позже сегодня. –

+0

благодарим вас за ответ, однако у меня все еще есть проблема с тем, как я храню значения из ячеек. Я отредактировал свой комментарий, чтобы сделать свою проблему более ясной. Дайте мне знать, если у вас есть другие вопросы. Спасибо! @PaulFrancis –

+0

@PaulFrancis Я на самом деле просто понял это. Это все о том, как правильно обновить значение ячейки. Я отправил цикл ниже. Спасибо за помощь! –

1

Вы также можете развернуть цикл немного, чтобы сделать это немного более эффективно. Заметим, что для каждой итерации i не увеличивается на 1, но на 3.

Public Sub test() 

    Dim lastRow As Long 
    lastRow = 6 

    Dim lastIndex As Long 
    lastIndex = lastRow * 3 

    ReDim propertyArr(1 To lastIndex) 

    Dim i As Long 
    For i = 1 To lastIndex Step 3 
     propertyArr(i) = CInt(i/3) 
     propertyArr(i + 1) = vbNullString 
     propertyArr(i + 2) = vbNullString 
    Next 


End Sub 
+0

«Более эффективно», как в нескольких строках кода? Я предполагаю, что вы не имеете в виду какие-либо исчезающе крошечные, гипотетические показатели производительности ... Это было бы глупо, не так ли? Во всяком случае, это, вероятно, то, как я это сделаю. –

+0

Это зависит от размера массива @ Jean-FrançoisCorbett. Если это большое количество итераций, этот метод может сократить это число в 3 раза. – RubberDuck

+1

(Ум, что?) Насколько велика большая? Я только что проверил ваши коды и коды PaulFrancis. Действительно, есть фактор ~ 3. Это составляет колоссальную разницу в 0,02 секунды для 'lastRow = 32768'. Для более высоких значений 'lastrow' ваш код переполняется, так что это максимально возможный выигрыш :-) Измените' CInt' на 'CLng', и все вы настроены. Для 'lastRow = 1 миллион' вы получаете примерно полсекунды. Для чего-либо ниже 1000, разница слишком мала для измерения с помощью таймера. Так вот, насколько велика. –

1

Или без петель

Dim ws As Worksheet 
Set ws = Sheets(1) 
propertyarr = Join(Application.Transpose(ws.Range("E1:E5")), ","""","""",") 

положить обратно в массив

propertyarr = Split(Join(Application.Transpose(ws.Range("E1:E5")), ",,,"), ",") 
+0

Это хорошо. Просто небольшая проблема. Значит, это было бы клоакой того, что думает о ФП? 'propertyarr = Join (Application.Transpose (ws.Range (" E1: E5 ")),", "" "", "" "", ") &", "" "", "" "" "'. Кроме того, если 'SPLIT' следует за' JOIN', чтобы вернуть массив? – PaulFrancis

+0

Да, я думаю, вы правы в куске – brettdj

0

Я понял ответ. Я не обновлял нужные мне ячейки. См. Код ниже:

count = 3 
lastIndex = lastRow * 3 

ReDim propertyArr(1, lastIndex) 
For i = 1 To lastIndex Step 3 
     propertyArr(1, i) = originalWS.Cells((count - 1), 5) 
     count = count + 1 
Next 
Смежные вопросы