Результат изменчивого UDF не отображается, если я редактирую другой лист и переключаюсь обратно

Я использую изменчивую 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 или что я упускаю из виду?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Большое спасибо! Это отлично сработало :) Также спасибо за ваше объяснение - теперь оно имеет смысл, и я искал «все» помимо этого.

Andy 09.04.2019 00:59

Другие вопросы по теме