Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2013, 15:59   #1
Extril
Пользователь
 
Регистрация: 08.11.2010
Сообщений: 33
Счастье Макрос суммирования книг

Доброго времени суток.)
У меня проблема следующая. Необходимо суммировать данные 14 листов, расположенные в 14 книгах в диапазоне C14:N25/ Суммировать нужно часть книг, результат должен появиться в открытой книге "Итоги", открывать книги при выполнении операции в скрытом режиме
Нашел такой Макрос, но не могу понять что нужно изменить, чтобы он работал по суммированию только определенных книг, и чтобы вносил результат в открытую книгу "Итоги"

Dim Folder As String
Dim wb As String
Dim objWb As Workbook
Dim workWb As Workbook
Dim i As Integer
Dim R, C
Dim Q As Worksheet
Dim REZ()
Dim T()
Application.ScreenUpdating = False
Range("C16:N25").Select
Selection.ClearContents
Range("C16:N25").Select
Set workWb = ActiveWorkbook
REZ = workWb.ActiveSheet.Range(Cells(7, 1), Cells(29, 39)).Value
wb = Dir(workWb.Path & "\*.xlsx")
While Len(wb) > 0 And wb <> Итоги.xls"
wb = workWb.Path & "\" & wb
Set objWb = Workbooks.Open(wb)
For Each Q In objWb.Sheets
Q.Select
m = Q.Range(Cells(7, 1), Cells(29, 39)).Value
For R = 4 To 23
For C = 2 To 39
REZ(R, C) = REZ(R, C) + m(R, C)
Next C
Next R
Next
objWb.Close False
wb = Dir Wend
workWb.ActiveSheet.Range(Cells(7, 1), Cells(29, 39)).Value = REZ
Application.ScreenUpdating = True
MsgBox "Ok", 64, ""
End Sub

Но что то не хочет он работать, кроме того
Extril вне форума Ответить с цитированием
Старый 26.10.2013, 01:04   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Без примера могу ошибиться,макрос суммирует данные первых листов книг.Я засомневался,что есть 14 книг ,каждая с 14 листами
Код:
Sub Сумматор()
    Dim REZ(1 To 12, 1 To 12)   As Double , Sh As Worksheet
    Dim S_Out As Worksheet, Path As String
    Application.ScreenUpdating = False
    Dim НужныеКниги
    НужныеКниги = Array("Вася.xls", "Петя.xls", "Коля.xls")

    Dim oFS: Set oFS = CreateObject("Scripting.FileSystemObject")
    Set S_Out = ActiveSheet
    Path = S_Out.Parent.Path
    On Error Resume Next
    For l = 0 To UBound(НужныеКниги)
        Filename = Path & "\" & НужныеКниги(l)
        If oFS.FileExists(Filename) Then
            Set Sh = GetObject(Filename).Worksheets(1)
            X = Sh.Range("C14:N25").Value
            For n = 1 To 12
                For i = 1 To 12
                    REZ(n, i) = REZ(n, i) + X(n, i)

                Next
            Next
            Sh.Parent.Close (False)
        End If

    Next
    Set oFS = Nothing
    S_Out.Range("C14").Resize(12, 12) = REZ  
    Application.ScreenUpdating = True
    MsgBox "Ok", 64, ""
End Sub
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 26.10.2013 в 01:13.
doober вне форума Ответить с цитированием
Старый 27.10.2013, 07:33   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если имена всех листов книг, из которых требуется получить данные, известны (или вообще одинаковые), то все можно сделать и вовсе не открывая файлов-источников.
Например, пусть листы с данными называются "Лист1" и требуемые файлы находятся в той же папке, где файл с этим макросом.
Код:
Sub Main()
    Dim x As Range, ws As Worksheet, p As String
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    Set ws = Sheets("Итоги"): Set x = ws.[C14:N25]: x.ClearContents
    Sheets.Add.Name = "Temp": p = ThisWorkbook.Path & "\"
    For Each f In Array("Вася.xls", "Петя.xls", "Коля.xls") 'нужные файлы
        With Range(x.Address)
            .ClearContents
            .Formula = "='" & p & "[" & f & "]Лист1'!" & x.Address
            .Copy
            x.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
        End With
    Next
    ActiveSheet.Delete: x.Value = x.Value: Application.CutCopyMode = False
End Sub
Если нужно, добавьте проверки на предмет существования искомых файлов и листов.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 27.10.2013 в 10:54.
SAS888 вне форума Ответить с цитированием
Старый 28.10.2013, 15:18   #4
Extril
Пользователь
 
Регистрация: 08.11.2010
Сообщений: 33
Хорошо

Спасибо большое, только почему то не срабатывает последний скрипт, подсвечивает наименование в строке Set ws = Sheets("Итоги") подсвечивает "Итоги". Может быть это потому что путь где лежат файлы слишком длинный \\nwdata.nw.mmm.ru\DavWWWRoot\sites \ur_dep\DocLib\юристы\
Extril вне форума Ответить с цитированием
Старый 28.10.2013, 17:51   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

это потому, что названия листов и книг здесь вымышленны:
Sheets("Итоги")
"Вася.xls",
"Петя.xls",
"Коля.xls"

рассматривайте это не как готовый код, а как заготовку. вооружитесь напильником и допиливайте пока не начнет работать или пока волдыри на клавиатуре не появятся.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.10.2013, 05:49   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
в строке Set ws = Sheets("Итоги") подсвечивает "Итоги"
Подразумевается, что в открытой книге, содержащей этот код, имеется лист с именем "Итоги", на который и будут помещаться данные. Измените в коде имя листа на требуемое.
Можно поступить так же, как предлагает doober, т. е. присвоить
Код:
Set ws = ActiveSheet
Но, в этом случае, макрос потребуется запускать только в тот момент, когда активным является лист, на который требуется собрать данные.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 31.10.2013, 12:27   #7
Extril
Пользователь
 
Регистрация: 08.11.2010
Сообщений: 33
По умолчанию

Итак, у меня есть папка "Temp", в которой книга "Аналитика", содержащая лист "ИТОГИ" и диапазон B3:N25 в который должны подставиться результаты суммирования других книг. Для суммирования берутся листы "Итоги" из книг "Вася.xlsx", "Петя.xlsx" (диапазон B3:N25 ), в итоге у меня заработал такой скрипт.

Private Sub CommandButton1_Click()
Dim x As Range, ws As Worksheet, p As String
Application.ScreenUpdating = False: Application.DisplayAlerts = False
Set ws = Sheets("ИТОГИ"): Set x = ws.[B3:N25]: x.ClearContents
Sheets.Add.Name = "Temp": p = ThisWorkbook.Path & "\"
For Each f In Array("Вася.xlsx", "Петя.xlsx") 'нужные файлы
With Range(x.Address)
.ClearContents
.Formula = "='" & p & "[" & f & "]Итоги'!" & x.Address
.Copy
x.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
End With
Next
ActiveSheet.Delete: x.Value = x.Value: Application.CutCopyMode = False
End Sub

При суммировании появляются очень странные цифры, похоже что формула содержит ошибку, вот только какую неясно окончательно. Но хоть убей не считает она.
Extril вне форума Ответить с цитированием
Старый 01.11.2013, 07:14   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
При суммировании появляются очень странные цифры, похоже что формула содержит ошибку, вот только какую неясно окончательно.
Макрос работает так: Создается временный вспомогательный лист. В требуемом диапазоне этого листа создаются ссылки на этот же диапазон листа "Итоги" текущего в цикле файла. Затем, с помощью специальной вставки, значения этого диапазона суммируются с значениями соответствующего диапазона листа "ИТОГИ" в этом файле. После цикла по всем нужным файлам, временный лист удаляется.
Какие могут быть ошибки? Единственное, что можно предположить, это то, что значения в суммируемых диапазонах файлов-источников имеют нечисловой формат (например, текстовый).
Попробуйте в код добавить следующее:
Код:
Private Sub CommandButton1_Click()
    Dim x As Range, ws As Worksheet, p As String
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    Set ws = Sheets("ИТОГИ"): Set x = ws.[B3:N25]: x.ClearContents
    Sheets.Add.Name = "Temp": p = ThisWorkbook.Path & "\"
    For Each f In Array("Вася.xlsx", "Петя.xlsx") 'нужные файлы
        With Range(x.Address)
            .ClearContents
            .Formula = "='" & p & "[" & f & "]Итоги'!" & x.Address
            arr = .Value: .NumberFormat = "General": .Value = arr
            .Copy
            x.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
        End With
    Next
    ActiveSheet.Delete: x.Value = x.Value: Application.CutCopyMode = False
End Sub
Для однозначного выяснения проблемы, прикрепите файл с макросом и пару файлов источников.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 01.11.2013 в 07:16.
SAS888 вне форума Ответить с цитированием
Старый 01.11.2013, 11:08   #9
Extril
Пользователь
 
Регистрация: 08.11.2010
Сообщений: 33
По умолчанию

Выкладываю пример файлов,
Extril вне форума Ответить с цитированием
Старый 01.11.2013, 11:15   #10
Extril
Пользователь
 
Регистрация: 08.11.2010
Сообщений: 33
По умолчанию Вложения

Сорри, не прикрепилось с первого раза
Вложения
Тип файла: rar Анализ.rar (484.3 Кб, 16 просмотров)

Последний раз редактировалось Extril; 01.11.2013 в 11:24.
Extril вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос: Сводная таблица из нескольких книг MaxxVer Microsoft Office Excel 7 28.08.2012 14:45
Макрос промежуточного суммирования . Ravvil Microsoft Office Excel 6 26.05.2012 21:39
Написать макрос суммирования. Kreol64 Microsoft Office Excel 24 11.03.2011 19:27
макрос суммирования данных столбца RECit Microsoft Office Excel 3 11.10.2010 15:14
макрос для суммирования jisu Microsoft Office Excel 5 30.03.2009 23:21