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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2010, 11:32   #1
FormAlDeGid
Пользователь
 
Аватар для FormAlDeGid
 
Регистрация: 21.10.2009
Сообщений: 58
По умолчанию необходимо доработать макрос

Бодрый день!
Есть макрос который собирает данные из разных книг в одну. и все в нем прекрасно но очень уж хотелось бы чтобы он перед каждым добавленным куском таблицы вставлял пустую строку (разделитель). подкоректируйте пжалста =)
Код:
Option Explicit

Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iPivotRange As Range, iDestinationRange As Range, iBeginRange As Range, Sheet
    Dim iRngAddress As String, oAwb As String, DataSheet As String, _
        iCopyAddress As String, sSheetName As String, oFile
    Dim lLastrow As Long, lLastRowMyBook As Long
    Dim iLastColumn As Integer
    Dim Str() As String

    ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
    DataSheet = ThisWorkbook.ActiveSheet.Name
    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
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .InitialFileName = "*.*"
        .Title = "Выберите файлы"
        If .Show = False Then Exit Sub
        For Each oFile In .SelectedItems
            Workbooks.OpenText Filename:=oFile
            oAwb = Dir(oFile, vbDirectory)

            Application.ScreenUpdating = False
            Workbooks(oAwb).Activate
            For Each Sheet In Sheets
                If Sheet.Name Like sSheetName Then
                    Sheet.Activate
                    Select Case iBeginRange.Count
                    Case 1
                        lLastrow = Cells(1, 1).SpecialCells(xlLastCell).Row
                        iLastColumn = Cells.SpecialCells(xlLastCell).Column
                        iCopyAddress = Range(Cells(iBeginRange.Row, iBeginRange.Column), Cells(lLastrow, iLastColumn)).Address
                    Case Else
                        iCopyAddress = iBeginRange.Address
                        lLastrow = iBeginRange.Rows.Count
                        iLastColumn = iBeginRange.Columns.Count
                    End Select
                    lLastRowMyBook = ThisWorkbook.Sheets(DataSheet).Cells.SpecialCells(xlLastCell).Row + 1
                    iRngAddress = Range(Cells(lLastRowMyBook, 1), Cells(lLastRowMyBook + lLastrow, iLastColumn)).Address
                    Sheet.Range(iCopyAddress).Copy Destination:=ThisWorkbook.Sheets(DataSheet).Range(iRngAddress)
                End If
            Next Sheet
            Workbooks(oAwb).Close False
        Next oFile
    End With
    Application.ScreenUpdating = True
End Sub
FormAlDeGid вне форума Ответить с цитированием
Старый 31.03.2010, 11:43   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А зачем Вы для вставки скопированного диапазона указываете диапазон? Достаточно указать 1-ю ячейку этого диапазона.
Замените строку Вашего кода
Код:
Sheet.Range(iCopyAddress).Copy Destination:=ThisWorkbook.Sheets(DataSheet).Range(iRngAddress)
на строку
Код:
Sheet.Range(iCopyAddress).Copy Destination:=ThisWorkbook.Sheets(DataSheet).Cells(lLastRowMyBook + 1, 1)
при этом формировать iRngAddress станет ни к чему.

P.S. В код макроса не вникал.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 31.03.2010 в 11:48. Причина: Добавлено
SAS888 вне форума Ответить с цитированием
Старый 31.03.2010, 13:05   #3
FormAlDeGid
Пользователь
 
Аватар для FormAlDeGid
 
Регистрация: 21.10.2009
Сообщений: 58
По умолчанию

SAS888 это не мое творение, а я кажися лашара... никак ладу не дам этому чуду.

как я понимаю эта строка
Код:
ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
запускает всё в книге с макросом, но макрос у меня в PERSONAL.XLSB. поэтому ThisWorkbook целесобразно заменить на ActiveWorkbook и в строке ниже та же басня. и почти в самом низу кода опят выдает ошибку. отсюда пара вопросов:
-правильно ли я меняю команду?
-как исправить ошибку внизу?


Код:
Option Explicit

Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iPivotRange As Range, iDestinationRange As Range, iBeginRange As Range, Sheet
    Dim iRngAddress As String, oAwb As String, DataSheet As String, _
        iCopyAddress As String, sSheetName As String, oFile
    Dim lLastrow As Long, lLastRowMyBook As Long
    Dim iLastColumn As Integer
    Dim Str() As String

    ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
    DataSheet = ThisWorkbook.ActiveSheet.Name
    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
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .InitialFileName = "*.*"
        .Title = "Выберите файлы"
        If .Show = False Then Exit Sub
        For Each oFile In .SelectedItems
            Workbooks.OpenText Filename:=oFile
            oAwb = Dir(oFile, vbDirectory)

            Application.ScreenUpdating = False
            Workbooks(oAwb).Activate
            For Each Sheet In Sheets
                If Sheet.Name Like sSheetName Then
                    Sheet.Activate
                    Select Case iBeginRange.Count
                    Case 1
                        lLastrow = Cells(1, 1).SpecialCells(xlLastCell).Row
                        iLastColumn = Cells.SpecialCells(xlLastCell).Column
                        iCopyAddress = Range(Cells(iBeginRange.Row, iBeginRange.Column), Cells(lLastrow, iLastColumn)).Address
                    Case Else
                        iCopyAddress = iBeginRange.Address
                        lLastrow = iBeginRange.Rows.Count
                        iLastColumn = iBeginRange.Columns.Count
                    End Select
                    lLastRowMyBook = ThisWorkbook.Sheets(DataSheet).Cells.SpecialCells(xlLastCell).Row + 1
                    iRngAddress = Range(Cells(lLastRowMyBook, 1), Cells(lLastRowMyBook + lLastrow, iLastColumn)).Address
                    Sheet.Range(iCopyAddress).Copy Destination:=ThisWorkbook.Sheets(DataSheet).Range(iRngAddress)
                End If
            Next Sheet
            Workbooks(oAwb).Close False
        Next oFile
    End With
    Application.ScreenUpdating = True
End Sub
FormAlDeGid вне форума Ответить с цитированием
Старый 01.04.2010, 07:59   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Вы же говорили, что
Цитата:
Есть макрос который собирает данные из разных книг в одну. и все в нем прекрасно
1. В Вашем случае, ThisWorkbook, естественно, по всему коду нужно заменить. Чтобы не отслеживать в коде, какая в данный момент книга активна, предлагаю создать объект Dim wb As Workbook и в коде присвоить ему Set wb = Workbooks("Имя_книги"). В дальнейшем, в коде использовать обращение к этому объекту.
2. Что за "ошибка внизу"?
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 01.04.2010, 09:13   #5
FormAlDeGid
Пользователь
 
Аватар для FormAlDeGid
 
Регистрация: 21.10.2009
Сообщений: 58
По умолчанию

все прекрасно работало до момента переноса макроса из файла в мою книгу макросов.
ошибка в строке:
Код:
lLastRowMyBook = lol.Sheets(DataSheet).Cells.SpecialCells(xlLastCell).Row + 1
FormAlDeGid вне форума Ответить с цитированием
Старый 01.04.2010, 09:54   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Теперь другой вопрос: что в вашей строке
Цитата:
lLastRowMyBook = lol.Sheets(DataSheet).Cells.Special Cells(xlLastCell).Row + 1
означает "lol"?

Как я уже предлагал, если макрос запускается в тот момент, когда активна книга, в которую требуется добавлять лист DataSheet и работать с ней далее, то добавьте в Ваш код самой первой строкой
Код:
Dim wb As Workbook: Set wb = ActiveWorkbook
и далее по коду обращайтесь не ThisWorkbook.Sheets..., а wb.Sheets...
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 01.04.2010 в 10:01.
SAS888 вне форума Ответить с цитированием
Старый 01.04.2010, 12:09   #7
FormAlDeGid
Пользователь
 
Аватар для FormAlDeGid
 
Регистрация: 21.10.2009
Сообщений: 58
По умолчанию

=) "lol" это я для себя пометку ставил и не посмотрел что не с того места копирую, для форума.
строка с ошибкой выглядела так:
Код:
 lLastRowMyBook = ThisWorkbook.Sheets(DataSheet).Cells.SpecialCells(xlLastCell).Row + 1
но сейчас все шикарно. проверяю на корректность выполнения моих задач.

Примного вам благодарен. уже не впервой выручаете =)
FormAlDeGid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос постоянно обрабатывает события. При открытии другой книги макрос обрывается. Ples Microsoft Office Excel 8 17.12.2016 18:15
Макрос вставки файлов в листы-Необходимо изменить ниже приведённый макрос as-is Microsoft Office Excel 4 25.02.2010 07:51
нашел поиском нужный макрос, чуть чуть бы доработать zander Microsoft Office Excel 3 30.09.2009 12:19
есть программа на С++ для КПК, необходимо ее доработать SkivD Фриланс 7 04.06.2009 23:50
В БД необходимо создать макрос, суть которого расчет итоговой строки по условию mex32 Microsoft Office Excel 31 01.04.2009 13:05