2016-12-07 5 views
0

Я пытаюсь создать функцию или функции, которые могут суммировать ежедневные часы с карт времени для каждого клиента, чтобы придумать общее количество часов, отработанных в день. У каждого клиента есть собственный лист внутри одной книги.Excel VBA Sum из нескольких листов

В настоящее время у меня есть функция, которая определяет лист, который идет с первым клиентом (третий лист в книге):

Function FirstSheet() 
Application.Volatile 
FirstSheet = Sheets(3).Name 
End Function 

И один, чтобы найти последний лист:

Function LastSheet() 
Application.Volatile 
LastSheet = Sheets(Sheets.Count).Name 
End Function 

Часть, с которой у меня возникают проблемы с этим, чтобы они работали в функции sum.

=sum(FirstSheet():LastSheet()!A1 

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

Любая помощь была бы принята с благодарностью.

+1

дайте мне знать, если я ответил на ваш вопрос - если вам нужна дополнительная помощь, не стесняйтесь, дайте мне знать. – user1274820

ответ

1

Итак, пример формула будет выглядеть следующим образом:

=SUM(Sheet2!A1:A5,Sheet3!A1:A5,Sheet4!A1:A5)

Это было бы подвести Sheet2-Sheet4, A1:A5 на всех листах.

Есть ли причина, по которой вам нужно написать код VBA для этого?

Не можете ли вы просто ввести его в качестве формулы один раз?

Кроме того, если у вас возникла проблема с написанием VBA для создания формулы, может возникнуть больше смысла просто делать сумму полностью в коде VBA.

Если нет, то попробуйте следующее:

Sub GenerateTheFormula() 
Dim x, Formula 
Formula = "=SUM(" 'Formula begins with =SUM(
For x = 3 To Sheets.Count 
    Formula = Formula & Sheets(x).Name & "!A1," 'Add SheetName and Cell and Comma 
Next x 
Formula = Left(Formula, Len(Formula) - 1) & ")" 'Remove trailing comma and add parenthesis 
Range("B1").Formula = Formula 'Where do you want to put this formula? 
End Sub 

Результаты:

Results

+1

Мне нравится gif. Возможно, вам стоит рассмотреть возможность уменьшения пробела и отображения вкладок. Сравните ваши с моей демонстрацией, где я изменяю размер окна Excel [demo] (https://www.dropbox.com/s/r6m7p08nmqey02q/demo.gif?dl=0) –

+0

Ха-ха хорошо, спасибо за подсказку - я бросаю его вместе обычно, но это неплохая идея. Мне редко приходится показывать лист - я в основном просто беспокоюсь о том, что размер gif невелик, потому что размер файла ужасен. – user1274820

+0

Поскольку вы дали мне совет, я дам вам один. Оформить заказ 'ScreenToGif'. Это бесплатно и супер полезно. https://screentogif.codeplex.com/ – user1274820

1

Функции возвращают строки, а не фактические рабочие листы. Рабочий лист не разбирает строки хорошо. Так добавить третью функцию, которая использует функцию Evaluate:

Function MySum(rng As Range) 

MySum = Application.Caller.Parent.Evaluate("SUM(" & FirstSheet & ":" & LastSheet & "!" & rng.Address & ")") 

End Function 

Тогда вы бы просто назвать его: MySum(A1)

Он использует две другие функции вы уже создали, чтобы создать строку, которая может быть оценена как формула.

+0

Кажется, что он должен работать, но я получаю # ВАЛЮТ! когда я пытаюсь его использовать. Я в Excel 2016, если это имеет значение. – bearded4glory

+0

Работает на моем Office 365 Excel. Я использую окна. Я не уверен в Excel 2016. –

+0

Я получил его на работу, не зная, почему он не работал изначально, но в итоге я просто перевернул другие функции в этот, поскольку они были довольно короткими. Спасибо! – bearded4glory

0

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

Sub countHours() 
Dim last_Row As Integer 
Dim sum As Double 
sum = 0 
    'Because I know number of client 
    For i = 1 To 2  'i shows client particular sheet 

    last_Row = Range("A" & Rows.Count).End(xlUp).Row 

    Sheets(i).Activate 

    For j = 2 To last_Row 

    'In my Excel sheet column 1 contains dates and column 2 contains number of hours 

    sum = sum + Cells(j, 2) 
    'MsgBox sum 
    Next j 

    'Sheet 3 is my final sheet 
    ThisWorkbook.Sheets(3).Cells(i + 1, 2).Value = sum 
    sum = 0 
    Next i 

    End Sub 

Happy Coding:

Смежные вопросы