Макрос добавлен Функция PrevSheet возвращает ошибку #NAME - PullRequest
0 голосов
/ 22 мая 2019

Я добавил простой макрос предыдущего листа в файл, и он работал нормально, пока не начал возвращать ошибку #NAME, и я не могу понять, почему.

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

Я проверил это, создав новую книгу, заполнив несколько листов и опробовав ее, и она по-прежнему возвращает ошибку #NAME.Когда я оцениваю функцию, ошибка появляется на самом первом этапе: распознавание функции.Однако, когда я печатаю в строке формул, программы предлагают мне формулу нормально.

Я также пытался ссылаться на именованные ячейки по их ячейке и даже добавлять имя листа перед ячейкой (например, "prevsheet(previoussheetname!a1) или prevsheet(thissheetname!a1)). У меня даже есть, в последнем усилии рва"., попытался добавить двойные кавычки перед именем ячейки.

Для полного раскрытия, у меня есть также другая подпрограмма макроса, которая использует ссылки на предыдущий и следующий листы, но так как она не распознает саму функцию (которая должна была быть раннейзнак), он использует относительные ссылки (то есть activesheet(index - 1, activesheet(index + 1)). В то время я не думал, что это испортит функцию, но по мере того, как я становлюсь все более отчаянным и растерянным, возможно, это возможно.

код PrevSheet(), который я использовал:

Function PrevSheet(RCell As Range)

    Dim xIndex As Long

    Application.Volatile

    xIndex = RCell.Worksheet.Index

    If xIndex > 1 Then _
        PrevSheet = Worksheets(xIndex - 1).Range(RCell.Address)

End Function

И как сейчас, как предложил Крис Нейлсен

Функция PrevSheet (RCell As Range) как вариант

Application.Volatile

PrevSheet = RCell.Worksheet.Previous.Range(RCell.Address).Value

Функция завершения

По предложению Криса Нилсена я отредактировал именованные диапазоны так, чтобы они выглядели так:

!(nothing)$column$row с областью действия, установленной на Workbook

name manager

Именованный диапазон недоступен в браузере диапазонов.range browser

Названа только ячейка B1.Он называется «имя» sheet1

PrevSheet () не работает ни с одним диапазоном.sheet2

Макросы включены

macros are enabled

Любой, кто лучше разбирается в VBA, макросах и Excelможете сказать мне, почему это происходит, и как я могу это исправить, чтобы он возвращал значение указанной ячейки на первом листе слева от листа, на котором напечатана функция?(т. е. в sheet4, =prevsheet(A1) вернет значение ячейки A1 в sheet3)

Надеюсь, мой вопрос теперь яснее!

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Это будет работать, если вы правильно определите свои именованные диапазоны. Это можно сделать несколькими способами, но вот один из них самый простой в ИМО.

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

Допустим, вы хотите сослаться на ячейку A1. В диспетчере имен создайте имя, скажем, YourNamedRange область рабочей книги, ссылка =!$A$1 (обратите внимание на ! без ссылки на лист).

При добавлении формулы на лист (например, =YourNamedRange) она будет ссылаться на ячейку A1 на листе, содержащем формулу .

Применяя его к UDF, просто используйте =PrevSheet(YourNamedRange)

enter image description here

Ваш UDF работает (в основном) как есть, но не работает, если активна другая Рабочая книга. Чтобы исправить это, используйте

Function PrevSheet(RCell As Range)
    Dim xIndex As Long
    Application.Volatile
    xIndex = RCell.Worksheet.Index
    If xIndex > 1 Then
        With RCell.Worksheet.Parent 'The workbook containing RCell
            PrevSheet = .Worksheets(xIndex - 1).Range(RCell.Address)
        End With
    End If
End Function

Существует также свойство Worksheet, называемое Previous, которое делает то же самое, поэтому вы можете изменить рефакторинг как

Function PrevSheet(RCell As Range) As Variant
    Application.Volatile
    PrevSheet = RCell.Worksheet.Previous.Range(RCell.Address).Value
End Function
0 голосов
/ 22 мая 2019

Ваш код работает , если он помещен в стандартный модуль :

Public Function PrevSheet(RCell As Range) As Variant
    Dim xIndex As Long
    Application.Volatile

    xIndex = RCell.Worksheet.Index
    MsgBox xIndex
    If xIndex > 1 Then
        PrevSheet = Worksheets(xIndex - 1).Range(RCell.Address)
    End If
End Function

enter image description here

Например, на листе:

* +1012 *enter image description here

Я присвоил ячейку A7 Имя Хлам , а 666 - это значение в ячейке предыдущего листа A7 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...