#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, он сможет принимать аргументы и возвращать значения обратно в ячейку, из которой он был вызван.