Столбец промежуточных итогов VBA и печать в том же столбце

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь запустить =subtotal() функцию для всего столбца и вставить значение в тот же столбец, но вы не можете запустить функцию в том же столбце, в котором я пытаюсь подвести итог.

 ActiveCell.Value = "Total No. of chargeable hours"
ActiveCell.Offset(0, 2).Select
ActiveCell.Value = "=SUBTOTAL(9,G:G)"
  

Поскольку это возвращает ошибку, я попытался использовать вспомогательную ячейку для вырезания и вставки, но получил ошибку отладки в PasteSpecial = xlPasteValues строке.

 ActiveCell.Value = "Total No. of chargeable hours"
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "=SUBTOTAL(9,G:G)"
ActiveCell.Cut
ActiveCell.Offset(0, 1).Select
ActiveCell.PasteSpecial = xlPasteValues
  

Количество строк меняется каждый раз при создании рассматриваемого листа, поэтому невозможно использовать определенный диапазон ячеек.

У кого-нибудь есть рабочий способ добиться этого?

Спасибо.

Комментарии:

1. вы имеете в виду изменение =SUBTOTAL(9,G:G) на =SUBTOTAL(G1:G) ?

Ответ №1:

 Sub WriteSubtotal()

    With ActiveCell
        .Value = "Total No. of chargeable hours."
        .Offset(0, 1).Value = Application.WorksheetFunction.Subtotal(9, .Parent.Range("G1").EntireColumn)
    End With

End Sub
  

Как правило, вам не нужно выбирать или активировать ячейки. Просто обратитесь к ячейке и управляйте свойствами или вызывайте методы. Приведенный выше подраздел помещает метку в активную ячейку, а затем изменяет значение свойства ячейки вправо.

Обратите внимание, что второй аргумент для промежуточных ИТОГОВ использует .Родительское свойство. Внутри блока With для ActiveCell, the .Родительское свойство будет ссылаться на лист.

Ответ №2:

Вам нужно написать формулу, которая возвращает массив, чтобы вы могли объявить свою функцию как

 Function SubTotal(InputRange as Range) as Variant
    Dim Output() as Variant
    ' ReDim Output(.... to the correct rows, column size)

    ' Run your subtotal code here
    ' Output (Row, 1) = YourAnswer(Row)

    SubTotal = Output
End Function
  

VBA не позволит функции изменять электронную таблицу с помощью операций типа copy paste.

Комментарии:

1. что вы подразумеваете под «VBA не позволит функции изменять таблицу распространения с помощью операций типа cop paste»? Не уверен, что я полностью понимаю этот бит.

2. Функции VBA могут возвращать значения напрямую, но если вы включите в свою функцию код для изменения форматирования некоторой ячейки и т.д., Это будет запрещено. Вам нужно будет вложить свой код в Sub вместо функции, чтобы изменить электронную таблицу. Если вам нужен только UDF, он сможет принимать аргументы и возвращать значения обратно в ячейку, из которой он был вызван.