Я делаю сразу несколько вещей, которые, как я считаю, могут вызывать проблемы.Я тестировал этот VBA в Office 2013 и Office 2016 под Windows 10.
У меня есть множество рабочих листов, каждая из которых называется на основе месяца и года (например: «Ноябрь 2018», «Декабрь».2018 "и т. Д.).Я использую VBA, чтобы сделать две (отдельные) вещи:
- Получить имя активной рабочей таблицы
- Проследить данные предыдущей рабочей таблицы
Код 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 и продолжить формулу для последовательных электронных таблиц.