2015-11-09 6 views
2

Я некоторое время боролся с этим, и мне нужна помощь. Я новичок в vba и буду признателен за некоторые рекомендации по этому вопросу. Моя электронная таблица настроена так, что я в ячейке a2 и читаю значение в b2, которое является целым числом, которое сообщает мне, сколько дополнительных профилей (sups) существует. Предположим, что номер 3 находится в b2. Затем я ожидаю, что 2 строки ниже c2 имеют некоторый текст (роль), введенный в c3 и c4.Прокрутите ячейки и добавьте значения в массив, а затем отобразите в activecell в VBA.

В то время как на a2 я читаю b2 для количества дополнительных профилей, а затем цикл для отображения на a2 ролей, найденных в c2, c3 и c4. Это может измениться, так как в некоторых случаях будет только 2 роли или 3, и так далее.

Для этого я закодированы следующим образом:

Sub testarray() 

Dim sups As Integer 
Dim role, resultrole As String 
Dim test() As String 

role = ActiveCell.Offset(i, 2).Value 
sups = ActiveCell.Offset(0, 1).Value 

i = 0 
Do While i <= sups 
test() = Split(role) 
i = i + 1 
ActiveCell.Value = test() 
Loop 

End Sub 

Проблема заключается в том, что я только получаю строку c2 отображается и не все ниже содержание. Я хотел бы, чтобы a2 отображал значения c2, c3 и c4. Я буду использовать этот код для многих строк, чтобы связать роли.

Смотрите фотку моего кода и таблицы со значениями я читаю

enter image description here Благодарим Вас за помощь в этом ... действительно очень признателен за любую обратную связь!

+0

Я думаю, что вы хотите 'role' внутри цикла, но проще использовать' cells (r, c) 'вместо' offset'. – findwindow

+0

Итак, продолжая логику, в ячейке A5 у вас будут следующие 2? –

+0

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

ответ

0

Некоторые небольшие ухищрения, чтобы держать его как можно ближе к оригиналу. Я предпочитаю не использовать ActiveCell, но у @ScottHoltzman есть решение, которое делает как таковое.

Sub testarray() 

Dim sups As Integer, i& 
Dim role, resultrole As String 
Dim test As String 

role = ActiveCell.Offset(i, 2).Value 
sups = ActiveCell.Offset(0, 1).Value 

i = 0 
Do While i <= sups - 1 
If i = 0 Then 
    test = ActiveCell.Offset(i, 2) 
Else 
    test = test & ", " & ActiveCell.Offset(i, 2) 
End If 
i = i + 1 

Loop 
ActiveCell.Value = test 
End Sub 
+0

Я смог включить это в остальную часть моего кода с большей легкостью ... однако, выше, чем Скотт Х, может быть более эффективным – chepito77

1

Вы видите только первое значение, отображаемое в ячейке A, потому что вы никогда не говорите, что код перемещается в любом месте, кроме активной ячейки. У вас есть цикл, но он просто перебирает число.

Код, приведенный ниже, будет проходить через все ячейки в столбце B и записывать роли в столбец A, смежный с тем, где хранится номер sups. Он напишет содержимое, разделенное |. Вы можете отредактировать, как вы хотите.

Я также взял использование массива. Поскольку вы использовали его, это не дало бы вам то, что вы хотите, - это конкатенированное значение. Вы можете хранить диапазон ячеек в массиве и прокручивать массив, чтобы записать значение ячейки в столбце A, но, похоже, это не является реальным преимуществом для данной проблемы.

Sub testarray() 

Dim sups As Long, x As Long 
Dim role As String 

Dim lRow As Long 

lRow = Range("B" & Rows.Count).End(xlUp).Row 

Dim cel As Range 

For Each cel In Range("B2:B" & lRow) 

    role = "" 

    If Len(cel) Then 

     sups = cel 
     For x = 1 To sups 

      role = role & "|" & cel.Offset(x - 1, 1) 

     Next 

     role = Mid(role, 2, Len(role) - 1) 

     cel.Offset(, -1) = role 

    End If 

Next 


End Sub 
+1

Nice, и OP, видите ли вы, что он сделал, чтобы удалить необходимость использования 'ActiveCell'. – BruceWayne

+0

Это замечательно! Огромное спасибо. Удивительно ... именно то, что я хочу делать. Я изучу этот фрагмент кода. Благодаря!! – chepito77

+0

@ chepito77 - пожалуйста, отметьте ответ, если вы нашли удовлетворительный, чтобы он мог быть полезен другим людям в будущем. –

0

Это должно работать с ActiveCell property по одному за раз.

Sub testarray() 

    Dim sups As Long, roles As Variant 

    With ActiveCell 
     sups = .Offset(0, 1).Value 
     ReDim roles(sups - 1) 

     For sups = LBound(roles) To UBound(roles) 
      roles(sups) = .Offset(sups, 2) 
     Next v 
     .Cells = Join(roles, Chr(10)) 
    End With 

End Sub