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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2009, 10:41   #1
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию Поправьте код!!!

Есть код, который объединяет книги excel в одну...(нашел на этом форуме)
В нем создается новая книга, куда заносятся данные из разных книг... Всё отлично работает, но мне нужно, чтоб не создавалась новая книга, а вставлялся лист в текущую книгу и туда собиралась информация...
Ну а еще, если не трудно, то чтоб строки, где есть ячейки с заливкой и в которых текст выделен жирным цветов удалялись...


Код:
Sub Объединение()
 
Const strStartDir = "D:\Отчеты_по_отгрузкам\Данные" 'папка, с которой начать обзор файлов
Const strSaveDir = "D:\Отчеты_по_отгрузкам\Результат" 'папка, в которую будет предложено сохранить результат
Const blInsertNames = False   'вставлять строку заголовка (книга, лист) перед содержимым листа
 
Dim wbTarget As New Workbook, wbSrc As Workbook, shSrc As Worksheet, shTarget As Worksheet, arFiles, _
    i As Integer, stbar As Boolean, clTarget As Range
 
On Error Resume Next    'если указанный путь не существует, обзор начнется с пути по умолчанию
ChDir strStartDir
On Error GoTo 0
With Application    'меньше писанины
arFiles = .GetOpenFilename("Excel Files (*.xls), *.xls", , "Объединить файлы", , True)
If Not IsArray(arFiles) Then End 'если не выбрано ни одного файла
Set wbTarget = Workbooks.Add(template:=xlWorksheet)
Set shTarget = wbTarget.Sheets(1)
    .ScreenUpdating = False
    stbar = .DisplayStatusBar
    .DisplayStatusBar = True
 
For i = 1 To UBound(arFiles)
    .StatusBar = "Обработка файла " & i & " из " & UBound(arFiles)
    Set wbSrc = Workbooks.Open(arFiles(i), ReadOnly:=True)
    For Each shSrc In wbSrc.Worksheets
        If IsNull(shSrc.UsedRange.Text) Then 'лист не пустой
            Set clTarget = shTarget.Range("A1").Offset(shTarget.Range("A1").SpecialCells(xlCellTypeLastCell).Row, 0)
            If blInsertNames Then
                clTarget = ">>> " & wbSrc.Name & " -- " & shSrc.Name
                Set clTarget = clTarget.Offset(1, 0)
            End If
            shSrc.UsedRange.Copy clTarget
        End If
    Next
    wbSrc.Close False   'закрыть без запроса на сохранение
Next
    .ScreenUpdating = True
    .DisplayStatusBar = stbar
    .StatusBar = False
 
On Error Resume Next    'если указанный путь не существует и его не удается создать,
                        'обзор начнется с последней использованной папки
If Dir(strSaveDir, vbDirectory) = Empty Then MkDir strSaveDir
ChDir strSaveDir
On Error GoTo 0
arFiles = .GetSaveAsFilename("Результат", "Excel Files (*.xls), *.xls", , "Сохранить объединенную книгу")
 
If VarType(arFiles) = vbBoolean Then 'если не выбрано имя
    GoTo save_err
Else
    On Error GoTo save_err
    wbTarget.SaveAs arFiles
End If
End
save_err:
    MsgBox "Книга не сохранена!", vbCritical
End With
End Sub
Чтобы правильно задать вопрос, надо знать большую часть ответа.

Последний раз редактировалось Viteef; 10.04.2009 в 12:57. Причина: оформляйте код правильно
Klim Bassenger вне форума Ответить с цитированием
Старый 10.04.2009, 15:21   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Замените строки
Set wbTarget = Workbooks.Add(template:=xlWorksheet )
Set shTarget = wbTarget.Sheets(1)


на строку
Set shTarget = ActiveWorkbook.Worksheets.Add

Ну и уберите последние строки в макросе:
Код:
 .ScreenUpdating = True
    .DisplayStatusBar = stbar
    .StatusBar = False
 
On Error Resume Next    'если указанный путь не существует и его не удается создать,
                        'обзор начнется с последней использованной папки
If Dir(strSaveDir, vbDirectory) = Empty Then MkDir strSaveDir
ChDir strSaveDir
On Error GoTo 0
arFiles = .GetSaveAsFilename("Результат", "Excel Files (*.xls), *.xls", , "Сохранить объединенную книгу")
 
If VarType(arFiles) = vbBoolean Then 'если не выбрано имя
    GoTo save_err
Else
    On Error GoTo save_err
    wbTarget.SaveAs arFiles
End If
End
save_err:
    MsgBox "Книга не сохранена!", vbCritical
End With
(сохранять файл будете вручную)
EducatedFool вне форума Ответить с цитированием
Старый 10.04.2009, 16:32   #3
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию

а ЧТО НА СЧЕТ то чтоб строки, где есть ячейки с заливкой и в которых текст выделен жирным цветов удалялись???

И еще ворпос:
Workbooks.Open Filename:= _
"\\Gate02\Exchange\DrobyshAndrey\Жу рналы\Копия Журнал заказов проба 2009.xls"
Sheets("ЛКМ РФ").Select
Range("A3:D3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Вот только, чтоб копировались данные по условию...
В столбце А есть даты (аж с 2005 года)... Так вот мне нужно, чтоб копировались не все данные столбцов, а только те, где, например от 01.01.2009 до 01.04.2009...
Спасибо!
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Старый 11.04.2009, 12:22   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
чтоб копировались не все данные столбцов, а только те, где, например от 01.01.2009 до 01.04.2009...
Можно, например, так:
Код:
Sub SelectBetween()
    Dim r As Long, x As Range
    Workbooks.Open Filename:="\\Gate02\Exchange\DrobyshAndrey\Журналы\Копия Журнал заказов проба 2009.xls"
    Application.ScreenUpdating = False: Sheets("ЛКМ РФ").Activate
    With Columns("A:D")
        .AutoFilter
        .AutoFilter Field:=1, Criteria1:=">=39814", Operator:=xlAnd, Criteria2:="<39904"
        r = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
        Set x = Intersect(Range([A2], Cells(r, "D")), Cells.SpecialCells(xlCellTypeVisible))
        .AutoFilter
    End With
    If Not x Is Nothing Then x.Copy
End Sub
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 11.04.2009 в 12:52.
SAS888 вне форума Ответить с цитированием
Старый 11.04.2009, 12:49   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
чтоб строки, где есть ячейки с заливкой и в которых текст выделен жирным цветов удалялись
Можно, например, так (для активного листа):
Код:
Sub Del()
    Dim i As Long, x As Range
    For i = ActiveSheet.UsedRange.Row To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
        If Rows(i).Interior.ColorIndex = xlNone Then Else _
            If x Is Nothing Then Set x = Rows(i) Else Set x = Union(x, Rows(i))
        If Rows(i).Font.Bold = False Then Else _
            If x Is Nothing Then Set x = Rows(i) Else Set x = Union(x, Rows(i))
    Next
    If Not x Is Nothing Then x.Delete
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 17.04.2009, 01:24   #6
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию

Отлично!!!
Немного подправил и всё работает!
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Старый 27.05.2009, 09:48   #7
ascer
Новичок
Джуниор
 
Регистрация: 27.05.2009
Сообщений: 6
По умолчанию

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

Чтобы, например, ячейке "A1" активного рабочего листа активной рабочей книги присвоить значение ячейки "A1" из первого листа открытого файла "Книга1.xls", можно воспользоваться кодом:
Код:
[A1] = Workbooks("Книга1.xls").Sheets(1).[A1]
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 27.05.2009, 11:07   #9
ascer
Новичок
Джуниор
 
Регистрация: 27.05.2009
Сообщений: 6
По умолчанию

SAS888, спасибо за совет, но мне он не совсем подходит. У меня под тысячу файлов, в них по три листа с таблицами. Нужно брать таблицы из первого листа каждого файла. Этот код (что в первом посте) я немного подправил, чтоб он брал только первые листы, и он отлично справляется, НО стОит попасться файлу, у которого активным листом при сохранении остался лист2 или лист3, выпадает ошибка.
Вот такой цикл я сделал

Код:
For i = 1 To UBound(arFiles)
    .StatusBar = "Обработка файла " & i & " из " & UBound(arFiles)
    Set wbSrc = Workbooks.Open(arFiles(i), ReadOnly:=True)
    
     
     For Each shSrc In wbSrc.Worksheets
      If shSrc.Name <> "Лист1" Then GoTo 30 ' выбор первого листа
        If IsNull(shSrc.UsedRange.Text) Then 'лист не пустой
            Set clTarget = shTarget.Range("A1").Offset(shTarget.Range("A1").SpecialCells(xlCellTypeLastCell).Row, 0)
            If blInsertNames Then
                clTarget = ">>> " & wbSrc.Name & " -- " & shSrc.Name
                Set clTarget = clTarget.Offset(1, 0)
            End If
            lastrow = shSrc.Cells.SpecialCells(xlLastCell).Row  'определение номера последней строки
            shSrc.Range(Cells(6, 1), Cells(lastrow, 10)).Copy clTarget 'копирование диапазона от А6 и до конца в новый файл
        End If
30:
     Next

    wbSrc.Close False   'закрыть без запроса на сохранение
Next

Последний раз редактировалось ascer; 27.05.2009 в 11:21.
ascer вне форума Ответить с цитированием
Старый 27.05.2009, 11:14   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

При обращении к очередному файлу, используйте ссылку на первый лист (Sheets(1)).
Или дайте пример Вашего кода и укажите, в какой строке возникает ошибка.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поправьте, пожалуста! liver1981 Общие вопросы C/C++ 14 28.03.2009 06:45
MASM: HelloWorld разобрался в коде, поправьте немного N!ckeL Помощь студентам 6 25.02.2009 22:03
Код на C++ Иллидан Общие вопросы Delphi 1 08.10.2008 14:02
']'-виртуальный код Var17 Общие вопросы Delphi 2 02.04.2008 14:11