Как можно суммировать одну и ту же ячейку в нескольких листах по индексу номера листа в Excel? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь суммировать ячейку Y116 по всем действительным таблицам в моей книге Excel. Чтобы помочь определить действительные листы, я написал функцию VBA, SHEETNAME (число), которая возвращает имя листа по указанному индексу (число) листа. Я сделал это, потому что имена и количество действительных листов никогда не будут постоянными, однако допустимый диапазон всегда будет начинаться с 3-го листа (т. Е. SHEETNAME (3)) и всегда будет заканчиваться третьим от последнего листа (т. Е. SHEETNAME (SHEETS ( ) -2)) в моей рабочей тетради.

Мне кажется, что это должно быть относительно просто с SUM () и INDIRECT (), но я продолжаю получать ошибки ссылок (#REF!).

Я могу получить строку, отформатированную так, как я хочу, с помощью

="'"&SHEETNAME(3)&":"&SHEETNAME(SHEETS()-2)&"'!Y116"

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

=SUM(INDIRECT("'"&SHEETNAME(3)&":"&SHEETNAME(SHEETS()-2)&"'!Y116"))

Я знаю, что ячейка Y116 действительная ссылка во всех моих листах, потому что я могу жестко закодировать формулу с фактическими именами листов вместо индекса, и я получаю ответ, который ищу. Любой совет?

Вот функция SHEETNAME (): Function SHEETNAME(number As Long) As String<br> SHEETNAME = Sheets(number).Name End Function

1 Ответ

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

Чтобы сделать то, что вы хотите с помощью SUM (INDIRECT ()), необходимо вернуть массив имен листов косвенному.

Для этого нужно изменить UDF на:

Function SHEETNAME(srt As Long, ed As Long) As Variant
Application.Volatile

If ed - srt <= 0 Then Exit Function

Dim temp() As Variant
ReDim temp(1 To ed - srt + 1) As Variant

Dim i As Long
For i = srt To ed
    temp(i - srt + 1) = Worksheets(i).Name
Next

SHEETNAME = temp
End Function

Тогда можно использовать:

=SUM(INDIRECT("'"&SHEETNAME(3,SHEETS()-2)&"'!Y116"))

Но если вы собираетесь итерируйте листы в любом случае, почему бы просто не сделать сумму в UDF:

Function MY3DSUM(srt As Long, ed As Long, add As String) As Double
Application.Volatile

If ed - srt <= 0 Then Exit Function

Dim temp As Double
temp = 0

Dim i As Long
For i = srt To ed
     temp = temp + Worksheets(i).Range(add).Value2
Next

MY3DSUM = temp
End Function

Тогда вы бы назвали это:

 =MY3DSUM(3,SHEETS()-2,"Y116")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...