Я использую изменчивую UDF, которая работает в основном так, как должна. Я передаю ему диапазон, и если значение в этом диапазоне меняется, он пересчитывает, как нужно. Но когда я переключаюсь на другой лист и редактирую, например, ячейку, а затем переключаюсь обратно, я не вижу вывода этой UDF.
Я изменил значение ячейки на листе, содержащем UDF, или сохранил файл, он снова показывает вывод UDF. я тоже могу сделать
' Refresh all Calculations if Sheet is activated
Private Sub Worksheet_Activate()
Application.CalculateFull
End Sub
Но я не думаю, что это хорошее решение, если оно не является критически необходимым, поскольку лист содержит сотни формул.
Я также проверил UDF#Значение! при переключении листов, который кажется похожей проблемой (без реального ответа).
' Returns Tags-String based on Range/Threshold
Public Function GetTagsString(rngRange As Range) As String
' Define Variables
Dim strTags As String
Dim strTagSeparator As String
Dim strTag As String
Dim intTagRow As Integer
Dim intTagValue As Integer
Dim dblTagMinScore As Double
Dim rngCell As Range
' Initialize Values
intTagRow = Sheets("Locations").Range("TagsRow").Value
dblTagMinScore = Sheets("Settings").Range("TagMinScore").Value
strTagSeparator = Sheets("Settings").Range("TagSeparator").Value
strTags = ""
' Loop through all Cells in Range
For Each rngCell In rngRange
intTagValue = rngCell.Value
strTag = Cells(intTagRow, rngCell.Column).Value
' Include Tag if equal/greater than Tag-Threshold
If (intTagValue >= dblTagMinScore) Then
If (Not strTags = "") Then
' String contains already Tags => append Tag-Separator
strTags = strTags & strTagSeparator & strTag
Else
strTags = strTag
End If
End If
Next rngCell
' Return Tags-String
GetTagsString = strTags
End Function
Я вызываю эту UDF:
=GetTagsString(INDIRECT(ADDRESS(ROW();COLUMN(TagAmusement);4)):INDIRECT(ADDRESS(ROW();COLUMN(TagFun);4)))
TagAmusement и TagFun являются именованными ячейками. Я знаю, что использование INDIRECT, возможно, не лучшее решение, но по нескольким причинам мне нужно быть таким динамичным. Я делаю это во многих формулах, но без использования UDF и без той же проблемы. Проблема должна быть связана с UDF, но я не думаю, что это из-за параметров этой функции. Это должно быть как-то связано с изменением другого листа и переключением обратно на исходный лист.
И да, я прочитал некоторые значения с листа, но я также пытался их передать, и это не имеет значения (я также не меняю их).
Единственное, что работает (на автоматизированной основе):
' Refresh all Calculations if Sheet is activated
Private Sub Worksheet_Activate()
Application.CalculateFull
End Sub
Проблема возникает только в том случае, если я меняю лист и делаю там «что-то» (например, редактирую ячейку).
Это ошибка Excel или что я упускаю из виду?
strTag = Cells(intTagRow, rngCell.Column).Value
то же, что strTag = ActiveSheet.Cells(intTagRow, rngCell.Column).Value
Таким образом, если rngRange
находится на «Листе1», но затем вы переключаетесь на «Лист2» и редактируете ячейку (что вызывает пересчет), значение, считанное в strTag
, будет поступать с Листа2, а не с Листа1. Если соответствующие ячейки на Sheet2 окажутся пустыми, это будет выглядеть так, как будто UDF ничего не возвращает.
Чтобы предотвратить это, укажите рабочий лист, к которому применяется вызов Cells:
strTag = rngRange.Worksheet.Cells(intTagRow, rngCell.Column).Value
или оберните весь цикл For Each в блоке With...End With и заставьте вызов Cells использовать этот объект:
With rngRange.Worksheet
For Each rngCell In rngRange
'...
strTag = .Cells(intTagRow, rngCell.Column).Value
'...
Next rngCell
End With
Большое спасибо! Это отлично сработало :) Также спасибо за ваше объяснение - теперь оно имеет смысл, и я искал «все» помимо этого.