2016-06-01 4 views
0

У меня есть макрос, который до сих пор добавляет 4 новых столбца таблицы в существующую таблицу («Таблица 1»). Теперь я хотел бы, чтобы макрос отформатировал 3-ю и 4-я строки в процентах. Я хотел бы включить это в цикл, уже указанный в моем коде. Я попробовал несколько разных способов сделать это. Я не думаю, что я вполне понимаю, как работает UBound-функция, но, надеюсь, вы можете понять, что я пытаюсь сделать.Excel VBA - вложенный цикл для форматирования столбцов таблицы excel

Я также не уверен, что мне разрешено продолжать использовать инструкцию WITH в моем вложенном цикле For в отношении переменной «lst».

@Jeeped - Я снова смотрю на тебя для этого ... спасибо за в основном шел меня через весь этот проект лол

Sub attStatPivInsertTableColumns_2() 

Dim lst As ListObject 
Dim currentSht As Worksheet 
Dim colNames As Variant, r1c1s As Variant 
Dim h As Integer, i As Integer 

Set currentSht = ActiveWorkbook.Sheets("Sheet1") 
Set lst = ActiveSheet.ListObjects("Table1") 

colNames = Array("AHT", "Target AHT", "Transfers", "Target Transfers") 
r1c1s = Array("=([@[Inbound Talk Time (Seconds)]]+[@[Inbound Hold Time (Seconds)]]+[@[Inbound Wrap Time (Seconds)]])/[@[Calls Handled]]", "=350", "=[@[Call Transfers and/or Conferences]]/[@[Calls Handled]]", "=0.15") 

With lst 
For h = LBound(colNames) To UBound(r1c1s) 
    .ListColumns.Add 
    .ListColumns(.ListColumns.Count).Name = colNames(h) 
    .ListColumns(.ListColumns.Count).DataBodyRange.FormulaR1C1 = r1c1s(h) 
    If UBound(colNames(h)) = 2 or UBound(colNames(h)) = 3 Then   
     For i = UBound(colNames(h), 2) To UBound(colNames(h), 3) 
      .ListColumns(.ListColumns.Count).NumberFormat = "0%" 
    End if 
     Next i 
Next h 
End With 

End Sub 

ответ

1

Вам не нужно гнездиться второй for петлю. Если вы хотите установить третий и четвертый столбцы в процентах, вам нужно только установить это, когда итерация цикла (h) равна 2 или 3 (помня, что индекс массивов от 0). Вы также не должны пересекать массивы для основного цикла, и поскольку LBound в большинстве случаев 0, вы можете просто использовать это в любом случае. Попробуйте это:

With lst 
    For h = 0 To UBound(r1c1s) 
     .ListColumns.Add 
     .ListColumns(.ListColumns.Count).Name = colNames(h) 
     .ListColumns(.ListColumns.Count).DataBodyRange.FormulaR1C1 = r1c1s(h) 
     If h = 2 or h = 3 Then   
       .ListColumns(.ListColumns.Count).NumberFormat = "0%" 
     End if 
    Next h 
End With 

Чтобы ответить на другую точку в вашем вопросе, UBound(array) просто дает индекс наибольшего элемента (верхняя граница) в данном массиве. Итак, где у вас есть 50 элементов в таком массиве, UBound(array) вернет 49 (основанный на нуле, как упоминалось ранее). LBound просто дает другой конец массива (нижний граничный), который обычно равен нулю.

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