Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/МАКРОС Сбор всех листов на один - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
МАКРОС Сбор всех листов на один
televnoy Дата: Понедельник, 08.09.2014, 13:02 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 120
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте имеется макрос:

[vba]
Код
Option Explicit
Sub Consolidated_Range_of_Books_and_Sheets()
        Dim iBeginRange As Object, lCalc As Long, lCol As Long
        Dim oAwb As String, sCopyAddress As String, sSheetName As String
        Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
        Dim wsSh As Object, wsDataSheet As Object, bPolyBooks As Boolean, avFiles
         
        On Error Resume Next
        'Выбираем диапазон выборки с книг
        Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
                       "1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
                       vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
        'Если диапазон не выбран - завершаем процедуру
        If iBeginRange Is Nothing Then Exit Sub
        'Указываем имя листа
        'Допустимо указывать в имени листа символы подставки ? и *.
        'Если указать только * то данные будут собираться со всех листов
        sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
        'Если имя листа не указано - данные будут собраны со вех листов
        If sSheetName = "" Then sSheetName = "*"
        On Error GoTo 0
        'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
        If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then
            avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
            If VarType(avFiles) = vbBoolean Then Exit Sub
            bPolyBooks = True
            lCol = 1
        Else
            avFiles = Array(ThisWorkbook.FullName)
        End If
        'отключаем обновление экрана, автопересчет формул и отслеживание событий
        'для скорости выполнения кода и для ибежания ошибок, если в книгах есть иные коды
        With Application
            lCalc = .Calculation
            .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
        End With
        'создаем новый лист в книге для сбора
        ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
        Set wsDataSheet = ThisWorkbook.ActiveSheet
        'цикл по книгам
        For li = LBound(avFiles) To UBound(avFiles)
            If bPolyBooks Then Workbooks.Open Filename:=avFiles(li)
            oAwb = Dir(avFiles(li), vbDirectory)
            'цикл по листам
            For Each wsSh In Workbooks(oAwb).Sheets
                If wsSh.Name Like sSheetName Then
                    'Если имя листа совпадает с именем листа, в который собираем данные
                    'и сбор идет только с активной книги - то переходим к следующему листу
                    If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
                    With wsSh
                        Select Case iBeginRange.Count
                        Case 1 'собираем данные начиная с указанной ячейки и до конца данных
                            lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
                            iLastColumn = .Cells.SpecialCells(xlLastCell).Column
                            sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
                        Case Else 'собираем данные с фиксированного диапазона
                            sCopyAddress = iBeginRange.Address
                        End Select
                        lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
                        'вставляем имя книги, с которой собраны данные
                        If lCol Then wsDataSheet.Cells(lLastRowMyBook, 1).Resize(Range(sCopyAddress).Rows.Count).Value = oAwb
                        .Range(sCopyAddress).Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
                    End With
                End If
NEXT_:
            Next wsSh
            If bPolyBooks Then Workbooks(oAwb).Close False
        Next li
        With Application
            .ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
        End With
End Sub
[/vba]

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


О-па! 0_o

Сообщение отредактировал televnoy - Понедельник, 08.09.2014, 13:04
 
Ответить
СообщениеЗдравствуйте имеется макрос:

[vba]
Код
Option Explicit
Sub Consolidated_Range_of_Books_and_Sheets()
        Dim iBeginRange As Object, lCalc As Long, lCol As Long
        Dim oAwb As String, sCopyAddress As String, sSheetName As String
        Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
        Dim wsSh As Object, wsDataSheet As Object, bPolyBooks As Boolean, avFiles
         
        On Error Resume Next
        'Выбираем диапазон выборки с книг
        Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
                       "1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
                       vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
        'Если диапазон не выбран - завершаем процедуру
        If iBeginRange Is Nothing Then Exit Sub
        'Указываем имя листа
        'Допустимо указывать в имени листа символы подставки ? и *.
        'Если указать только * то данные будут собираться со всех листов
        sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
        'Если имя листа не указано - данные будут собраны со вех листов
        If sSheetName = "" Then sSheetName = "*"
        On Error GoTo 0
        'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
        If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then
            avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
            If VarType(avFiles) = vbBoolean Then Exit Sub
            bPolyBooks = True
            lCol = 1
        Else
            avFiles = Array(ThisWorkbook.FullName)
        End If
        'отключаем обновление экрана, автопересчет формул и отслеживание событий
        'для скорости выполнения кода и для ибежания ошибок, если в книгах есть иные коды
        With Application
            lCalc = .Calculation
            .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
        End With
        'создаем новый лист в книге для сбора
        ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
        Set wsDataSheet = ThisWorkbook.ActiveSheet
        'цикл по книгам
        For li = LBound(avFiles) To UBound(avFiles)
            If bPolyBooks Then Workbooks.Open Filename:=avFiles(li)
            oAwb = Dir(avFiles(li), vbDirectory)
            'цикл по листам
            For Each wsSh In Workbooks(oAwb).Sheets
                If wsSh.Name Like sSheetName Then
                    'Если имя листа совпадает с именем листа, в который собираем данные
                    'и сбор идет только с активной книги - то переходим к следующему листу
                    If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
                    With wsSh
                        Select Case iBeginRange.Count
                        Case 1 'собираем данные начиная с указанной ячейки и до конца данных
                            lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
                            iLastColumn = .Cells.SpecialCells(xlLastCell).Column
                            sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
                        Case Else 'собираем данные с фиксированного диапазона
                            sCopyAddress = iBeginRange.Address
                        End Select
                        lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
                        'вставляем имя книги, с которой собраны данные
                        If lCol Then wsDataSheet.Cells(lLastRowMyBook, 1).Resize(Range(sCopyAddress).Rows.Count).Value = oAwb
                        .Range(sCopyAddress).Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
                    End With
                End If
NEXT_:
            Next wsSh
            If bPolyBooks Then Workbooks(oAwb).Close False
        Next li
        With Application
            .ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
        End With
End Sub
[/vba]

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

Автор - televnoy
Дата добавления - 08.09.2014 в 13:02
AndreTM Дата: Понедельник, 08.09.2014, 13:29 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
макрос для чистки Определенного листа, а точнее последнего в книге
И что под этим подразумевается?
Как я понял, у вас используемый макрос каждый раз вставляет "в конец" новый лист с результатом:
[vba]
Код
        'создаем новый лист в книге для сбора
          ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
          Set wsDataSheet = ThisWorkbook.ActiveSheet
[/vba]
Ну так либо избавьтесь от .Add (предполагая, что у вас последний результирующий лист и так имеется):
[vba]
Код
        'задаем лист в книге для сбора
          'ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
          Set wsDataSheet = ThisWorkbook.Sheets(Sheets.Count)
          wsDataSheet.Cells.Clear
[/vba]
Либо удаляйте его перед вызовом макроса:
[vba]
Код
ThisWorkbook.Sheets(Sheets.Count).Delete
[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
макрос для чистки Определенного листа, а точнее последнего в книге
И что под этим подразумевается?
Как я понял, у вас используемый макрос каждый раз вставляет "в конец" новый лист с результатом:
[vba]
Код
        'создаем новый лист в книге для сбора
          ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
          Set wsDataSheet = ThisWorkbook.ActiveSheet
[/vba]
Ну так либо избавьтесь от .Add (предполагая, что у вас последний результирующий лист и так имеется):
[vba]
Код
        'задаем лист в книге для сбора
          'ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
          Set wsDataSheet = ThisWorkbook.Sheets(Sheets.Count)
          wsDataSheet.Cells.Clear
[/vba]
Либо удаляйте его перед вызовом макроса:
[vba]
Код
ThisWorkbook.Sheets(Sheets.Count).Delete
[/vba]

Автор - AndreTM
Дата добавления - 08.09.2014 в 13:29
televnoy Дата: Понедельник, 08.09.2014, 13:47 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 120
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
AndreTM, Извените видимо не корректно задал вопрос. Меня он полнстью устраивает, кроме того, что он вставлял значения с формулами. А мне надо было чтоб он вставлял только значения. Так как при сохранении страницы в TXT, получался результат вместо допустим значение=5 "бла-бла" на подобии
"значение=5 """бла-бла""", т.е. получается он добавляет кавычки (там где были формулы)
Но я опять же ки методоим проб и ошибок дописал его сам перед End Sub добавил такие строки
[vba]
Код
Cells.Select
       Selection.Copy
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
           :=False, Transpose:=False
[/vba]

Чем в общем и добился желаемого результата. СПАСИБО ВСЕМ ЗА УЧАСТИЕ!!!


О-па! 0_o

Сообщение отредактировал televnoy - Понедельник, 08.09.2014, 13:50
 
Ответить
СообщениеAndreTM, Извените видимо не корректно задал вопрос. Меня он полнстью устраивает, кроме того, что он вставлял значения с формулами. А мне надо было чтоб он вставлял только значения. Так как при сохранении страницы в TXT, получался результат вместо допустим значение=5 "бла-бла" на подобии
"значение=5 """бла-бла""", т.е. получается он добавляет кавычки (там где были формулы)
Но я опять же ки методоим проб и ошибок дописал его сам перед End Sub добавил такие строки
[vba]
Код
Cells.Select
       Selection.Copy
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
           :=False, Transpose:=False
[/vba]

Чем в общем и добился желаемого результата. СПАСИБО ВСЕМ ЗА УЧАСТИЕ!!!

Автор - televnoy
Дата добавления - 08.09.2014 в 13:47
husky Дата: Суббота, 08.07.2017, 13:01 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Подскажите, пожалуйста, как в этом макросе изменить код, чтобы вместо названия книги, с которой собирались данные записывалось название листа?
 
Ответить
СообщениеПодскажите, пожалуйста, как в этом макросе изменить код, чтобы вместо названия книги, с которой собирались данные записывалось название листа?

Автор - husky
Дата добавления - 08.07.2017 в 13:01
_Boroda_ Дата: Суббота, 08.07.2017, 13:50 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16715
Репутация: 6504 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
1. Вопрос непонятен
2. Прочитайте Правила форума, особенно внимательно п.4 и п.5q - Вам нужно задать свой вопрос
Эта тема закрыта


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение1. Вопрос непонятен
2. Прочитайте Правила форума, особенно внимательно п.4 и п.5q - Вам нужно задать свой вопрос
Эта тема закрыта

Автор - _Boroda_
Дата добавления - 08.07.2017 в 13:50
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!