Excel VBA UDF возвращает ошибку #VALUE при добавлении или удалении несвязанного листа - PullRequest
0 голосов
/ 29 января 2020

Первый раз, извиняюсь за ошибки!

Итак, у меня довольно странная проблема с моим UDF. В моей книге у меня есть невидимый «шаблонный» лист с именем «Стандартный фазовый лист» и подпрограмма, которую пользователь может активировать, которая копирует этот шаблонный лист в новый, видимый лист, с которым он затем может работать. В рабочей книге будет много копий этого листа шаблона, но все они будут иметь уникальные имена.

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

Однако, когда пользователь ДОБАВЛЯЕТ новую копию шаблона, ИНОГДА UDF теряет популярность и возвращает ошибки # ЗНАЧЕНИЕ в каждом месте, где используется UDF.

Кроме того, когда пользователь УДАЛЯЕТ одну из копий листа шаблона, UDF ВСЕГДА выходит из строя и возвращает ошибки #VALUE в каждом месте, где используется UDF.

Я не использую ActiveSheet или что-то подобное, и я полагаю, что я правильно даю полные ссылки на диапазоны, с которыми я работаю в UDF. Любая помощь будет оценена, я в затруднении! Код для UDF приведен ниже.

Кроме того, поскольку я уверен, что мне зададут вопрос, переменная neColumn в моем коде - это переменная publi c, которую я использую в нескольких подпрограммах и UDF. Это определено в начале моего модуля. Кроме того, я использую Option Explicit в начале моего модуля.

Спасибо!

Public Function fSum(ByVal Target As Range, bExtended As Boolean) As Single

'This function returns a sum, based on a range provided in the cell that holds the function.
'It checks to see if that line item has been marked as Non-Extended, based on the NE column
'that can be check marked. If that line item is marked NE, then only the NE sum columns can
'use that line item as part of their sum, and those values are removed from the E columns.

Dim sSum As Single
Dim i As Integer
Dim n As Integer

'This small section is used to determine complete references to the cell calling the function.

Dim sheetName As String
sheetName = Application.Caller.Parent.Name

'Loop through provided range, and sum up the contents based on whether they have been marked NE or not.

i = 1
n = Target.row
sSum = 0

If Sheets(sheetName).Visible = True Then

While i < Target.Rows.Count

    If (bExtended = True) Then

        If Sheets(sheetName).Range(neColumn.Address).Cells(n, 1) = vbNullString Then

            sSum = sSum + Sheets(sheetName).Range(Target.Address).Cells(i, 1).Value

        End If

    Else

        If Sheets(sheetName).Range(neColumn.Address).Cells(n, 1) <> vbNullString Then

            sSum = sSum + Sheets(sheetName).Range(Target.Address).Cells(i, 1).Value

        End If

    End If

i = i + 1
n = n + 1

Wend

End If

fSum = sSum

End Function

Ответы [ 2 ]

1 голос
/ 29 января 2020

Причина в том, что ваша neColumn переменная стала Nothing, потому что Excel является изменчивым.

Я предполагаю, что запуск вашего модуля выглядит примерно так:

Option Explicit

Public neColumn As Range

Sub Auto_Open()
    Set neColumn = Sheet1.Range("A1:B2")
End Sub

Когда вы открываете книгу, вы вызываете Auto_Open Sub для Set переменной neColumn. Однако - когда происходят определенные действия, Excel перестраивает VBA, который сбрасывает переменные Publi c (такие как neColumn) к их значениям по умолчанию (что для Object, например Range Nothing). Простой способ вызвать это - преднамеренно выдать ошибку, например, попытаться запустить это:

Sub ThrowErr()
    NotDefined = 1
End Sub

Вы можете сделать это более заметным для вас, добавив следующую строку в код fSum:

If neColumn Is Nothing Then Stop

Вам либо нужен способ восстановить neColumn, когда он был сброшен до Nothing, ИЛИ найти энергонезависимый способ его хранения.

Я предполагаю, что это не подходит, чтобы стать Const, потому что в противном случае это уже будет , но вы можете превратить его в именованный диапазон или сохранить Address на скрытом листе / CustomDocumentProperty. Эти параметры также позволяют сохранять neColumn при сохранении рабочей книги и при ее повторном открытии

1 голос
/ 29 января 2020

Обобщение цепочки комментариев в ответе для потомков:

  • Я не уверен, почему именно вы видите это поведение.
  • Были бы способы улучшить этот UDF (включая использование Long вместо Integer, предпочтение от Do While...Loop до While...Wend, снятие проверки .Visible ...
  • Но в любом случае кажется, что это просто репликация функциональности из SUMIFS, так что вы можете просто подумать о том, чтобы пойти по этому маршруту.
...