Нечетная проблема с пользовательскими значениями сброса Excel VBA - PullRequest
0 голосов
/ 04 февраля 2019

Я делаю сразу несколько вещей, которые, как я считаю, могут вызывать проблемы.Я тестировал этот VBA в Office 2013 и Office 2016 под Windows 10.

У меня есть множество рабочих листов, каждая из которых называется на основе месяца и года (например: «Ноябрь 2018», «Декабрь».2018 "и т. Д.).Я использую VBA, чтобы сделать две (отдельные) вещи:

  1. Получить имя активной рабочей таблицы
  2. Проследить данные предыдущей рабочей таблицы

Код VBA:

Public Function RelSheet(iPos As Integer, zRange As String)

    'Relative Worksheet Reference Facility
    'eg: =RelSheet(-1,"A3") = Cell A3 in Previous (Left) WSheet
    'eg: =RelSheet(1,"A3") = Cell A3 in Next (Right) WSheet
    'eg: "#Error" when reference does not exist
    'eg: Can do maths =RelSheet(1,"A3")*2

    Dim shtActive As Worksheet
    Application.Volatile True
    Set shtActive = Application.Caller.Worksheet
    On Error GoTo BadSheetReference
    RelSheet = Sheets(shtActive.Index + iPos).Range(zRange).Value

    GoTo ExitFunction

BadSheetReference:
    RelSheet = "#Error"

ExitFunction:
End Function

Function TabName()
  TabName = ActiveSheet.Name
End Function

В моих таблицах я подсчитываю месяц суммирования за месяц, пока не будет создан ближайший год, затем подсчет снова начинается с 0 (или любого значения, которое содержит Jannuary).Ячейка C8 - это значение текущего месяца, ячейка C9 - это сумма значений за предыдущий месяц (C9 предыдущего листа) + значение текущей ячейки рабочего листа в C8.Формула для этой ячейки (C9) выглядит следующим образом: ==IF(ISNUMBER(SEARCH("January", TabName())), C8, RelSheet(-1, "C9")+C8)

К сожалению, как только имя рабочего листа содержит , содержит текст «января», все предыдущие листы также возвращаются ксумма 0. Я считаю, что это связано с функцией RelSheet и, по сути, рекурсивно проверяет себя, но когда я логически разбираю код на бумаге, я не вижу, как это происходит.Мой текущий обходной путь - просто установить значение конкретной ячейки в январской рабочей таблице на 0 и продолжить формулу для последовательных электронных таблиц.

1 Ответ

0 голосов
/ 04 февраля 2019

Пара предложений:

Public Function RelSheet(iPos As Integer, zRange As String)

    'Relative Worksheet Reference Facility
    'eg: =RelSheet(-1,"A3") = Cell A3 in Previous (Left) WSheet
    'eg: =RelSheet(1,"A3") = Cell A3 in Next (Right) WSheet
    'eg: "#Error" when reference does not exist
    'eg: Can do maths =RelSheet(1,"A3")*2

    Dim shtActive As Worksheet
    Application.Volatile True
    Set shtActive = Application.Caller.Worksheet
    On Error GoTo BadSheetReference
    '##added workbook qualifier
    RelSheet = ThisWorkbook.Sheets(shtActive.Index + iPos).Range(zRange).Value

    GoTo ExitFunction

BadSheetReference:
    RelSheet = CVErr(xlErrRef)

ExitFunction:
End Function

Function TabName()
  '## not ActiveSheet
  TabName = Application.Caller.Parent.Name
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...