Результат изменчивого UDF не отображается, если я редактирую другой Лист и переключаюсь обратно - PullRequest
0 голосов
/ 09 апреля 2019

Я использую изменчивую 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, но я не думаю, что это из-за параметров этой функции. Это должно быть связано с заменой другого листа и переключением обратно на исходный лист.

И да, я прочитал некоторые значения из листа, но я также попытался передать их, и это не имеет значения (я также не изменяю (d) их).

Единственное, что работает (на автоматизированной основе):

' Refresh all Calculations if Sheet is activated
Private Sub Worksheet_Activate()
    Application.CalculateFull
End Sub

Проблема возникает только в том случае, если я меняю лист и выполняю там "что-то" (например, редактирую ячейку).

Это ошибка Excel или что я пропускаю?

1 Ответ

1 голос
/ 09 апреля 2019

strTag = Cells(intTagRow, rngCell.Column).Value совпадает с strTag = ActiveSheet.Cells(intTagRow, rngCell.Column).Value

Таким образом, если rngRange находится на «Sheet1», но вы затем переключаетесь на «Sheet2» и редактируете ячейку (что вызывает пересчет), значение, считанное в strTag, будет поступать с Sheet2, а не с Sheet1. Если соответствующие ячейки на Листе 2 окажутся пустыми, это будет выглядеть так, как будто 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
...