2016-06-01 3 views
1

Мне нужна вложенная петля для добавления формул к 4 определенным столбцам в моей таблице («Таблица 1»). Я бы хотел, чтобы мой цикл For имитировал предыдущий цикл For относительно именования этих четырех дополнительных столбцов («colNames»).Нужна петля для ввода формул/данных в столбцах таблицы excel

Нижняя часть этого кода работает просто отлично, но я хотел бы знать, как работать в цикле.

Sub attStatPivInsertTableColumns_2() 
Dim lst As ListObject 
Dim currentSht As Worksheet 
Dim colNames As Variant, formNames As Variant '<~~ NOTE: As Varient, this is your go to when working with arrays 
Dim oLC As ListColumn, oLData As Variant 
Dim i As Integer, d As Integer 

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

colNames = Array("AHT", "Target AHT", "Transfers", "Target Transfers") 

    For i = 0 To UBound(colNames) 
     Set oLC = lst.ListColumns.Add 
     oLC.Name = colNames(i) 
    Next i 
      ***Below is the code that needs to be looped***         
'lst.ListColumns("Target AHT").DataBodyRange.FormulaR1C1 = "=350" 
'lst.ListColumns("Target Transfers").DataBodyRange.FormulaR1C1 = "=0.15" 
'lst.ListColumns("AHT").DataBodyRange.FormulaR1C1 = "=([@[Inbound Talk Time (Seconds)]]+[@[Inbound Hold Time (Seconds)]]+[@[Inbound Wrap Time (Seconds)]])/[@[Calls Handled]]" 
'lst.ListColumns("Transfers").DataBodyRange.FormulaR1C1 = "=[@[Call Transfers and/or Conferences]]/[@[Calls Handled]]" 

End Sub 

Вот что я буду так далеко, но я бег в ошибки, за то, что, вероятно, очевидные причины:

formNames = 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") 
For d = 0 To UBound(formNames) 
    For i = 0 To UBound(colNames) 
     Set oLData = lst.ListColumns(i).DataBodyRange.FormulaR1C1 = "d" 
    Next i 
Next d 

ответ

1

Постройте еще один вариант массива, содержащие формулы/значение, которые вы хотите для заполнения новых столбцов таблицы.

Sub insertTableColumn() 
    Dim lst As ListObject 
    Dim currentSht As Worksheet 
    Dim h As Long, hdrs As Variant, r1c1s As Variant 

    hdrs = 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) 

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

    With lst 'ActiveSheet.ListObjects("Table1") 
     For h = LBound(hdrs) To UBound(hdrs) 
      .ListColumns.Add 
      .ListColumns(.ListColumns.Count).Name = hdrs(h) 
      .ListColumns(.ListColumns.Count).DataBodyRange.FormulaR1C1 = r1c1s(h) 
     Next h 
    End With 

End Sub 

Я также использовал пары в одном массиве с h = LBound(hdrs) To UBound(hdrs) Step 2 и hdrs(h+1) для формул/значений.

+0

Итак, поправьте меня, если я ошибаюсь. Я до сих пор не пробовал это ... это отрицает необходимость моего первого цикла i, закодированного в моем вопросе? Из того, что я читаю, похоже, что с .ListColumns.Add включал оператор WITH. –

+0

В вашем оригинале (как указано выше) была бы другая строка непосредственно после 'oLC.Name = colNames (i)' с чем-то вроде 'oLC.DataBodyRange.FormulaR1C1 = r1c1s (i)'. – Jeeped

+0

Хорошо, я с вами, спасибо. Вы намного эффективнее. Я до сих пор не видел функции LBound и UBound. Работал отлично. –

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

  • Нет связанных вопросов^_^