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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2012, 12:38   #1
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию Копирование-вставка диапазона ячеек между двумя книгами

Добрый день, уважаемые форумчане!
Помогите со следующей проблемой. Есть такой код:
Код:
Sub myMacro()
Dim sh As Worksheet
Dim iLastRow As Long
    Set sh = Sheets("База заказов")
    iLastRow = sh.Cells(Rows.Count, 6).End(xlUp).row
Application.OnTime Now() + TimeSerial(0, 15, 0), "myMacro"
Debug.Print Time
Application.ScreenUpdating = False
    Dim myPath As String, myName As String, f As String
    myPath = "D:\Статистика заказов\VSE ZAKAZI\" 'Путь к папке с файлами
    myName = Dir(myPath & "*.xlsx")
    Do While myName <> ""
        If f = "" Then f = myName Else If FileDateTime(myPath & myName) > FileDateTime(myPath & f) Then f = myName
        myName = Dir
    Loop
    
Workbooks.Open Filename:=myPath & f
With Workbooks
Sheets("Заказы").Select
    'автофильтр
    i = Cells(Rows.Count, 1).End(xlUp).row
   
    Range("A1:R" & i).AutoFilter Field:=6, Criteria1:="=БЕЗНАЛ"
    Range("A2:R2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Application.CutCopyMode = True ' не очищаем буфер обмена
ActiveWorkbook.Close SaveChanges = False
End With

    sh.Range(iLastRow + 1, 6).Select
    ActiveSheet.Paste

    
Application.ScreenUpdating = True
    
End Sub
Макрос срабатывает каждые 15 мин, ищет в папке "D:\Статистика заказов\VSE ZAKAZI\" самый свежий файл (по дате-времени сохранения), открывает его, отфильтровывает строки со значением БЕЗНАЛ в столбце F, копирует все ячейки с A по R, и не очищая буфер обмена, закрывает этот файл без сохранения. Потом скопированный диапазон ячеек, который должен быть в буфере обмена, вставляет в следующую свободную ячейку столбца F на листе "База заказов".
Проблема возникает в двух моментах:
1. Скопированный диапазон то есть в буфере обмена, то нет.
2. Но даже если он там есть не работает вставка. Подсвечивается строка
Код:
sh.Range(iLastRow + 1, 6).Select
.
Что не так?
Заранее спасибо!
strannick вне форума Ответить с цитированием
Старый 11.11.2012, 12:47   #2
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

А зачем Вы так спешите закрывать файл? Вставьте данные, потом закрывайте. И проще:
Код:
        i = Cells(Rows.Count, 1).End(xlUp).Row
        Range("A1:R" & i).AutoFilter Field:=6, Criteria1:="=БЕЗНАЛ"
        Range("A2:R2", Range("A2:R2").End(xlDown)).SpecialCells(12).Copy _
        sh.Range(iLastRow + 1, 6)
        ActiveWorkbook.Close SaveChanges = False
    End With
Даже так(зачем Вам там была With?):
Код:
    Loop
    With Workbooks.Open(myPath & f).Sheets("Заказы")
        i = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("A1:R" & i).AutoFilter Field:=6, Criteria1:="=БЕЗНАЛ"
        .Range("A2:R" & i).SpecialCells(12).Copy sh.Range(iLastRow + 1, 6)
        .Parent.Close 0
    End With
    Application.ScreenUpdating = True
End Sub
А это подсвечивалось:
Код:
sh.Range(iLastRow + 1, 6).Select
потому, что вы пытались выделить ячейку на неактивном листе. Сначала надо выделять лист, а потом уже ячейку на нем.
А чтоб сразу перейти, можно:
Код:
application.goto sh.Range(iLastRow + 1, 6)
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728

Последний раз редактировалось kuklp; 11.11.2012 в 13:02.
kuklp вне форума Ответить с цитированием
Старый 11.11.2012, 15:41   #3
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Сработала такая конструкция:
Код:
    Loop
    With Workbooks.Open(myPath & f).Sheets("Заказы")
        i = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("A1:R" & i).AutoFilter Field:=6, Criteria1:="=БЕЗНАЛ"
        .Range("A2:R" & i).SpecialCells(12).Copy sh.Cells(iLastRow + 1, 6)
        .Parent.Close 0
    End With
    Application.ScreenUpdating = True
End Sub
Только в строке:
Код:
 .Range("A2:R" & i).SpecialCells(12).Copy sh.Cells(iLastRow + 1, 6)
Range заменил на Cells во второй части (то бишь где говорится куда вставлять). При Range выдавало ошибку. Почему - не знаю.
А так все в порядке. При ручном запуске срабатывает. Проверяю при запуске по таймеру. Огромное спасибо!!!
strannick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
копирование текста между двумя словами pavel.lug Microsoft Office Word 14 28.08.2009 14:27
Работа с двумя книгами Sotos Microsoft Office Excel 2 10.02.2009 12:30
Работа с двумя книгами tae1980 Microsoft Office Excel 10 10.02.2009 02:49
Копирование файлов и каталогов перетаскиваением между двумя окнами SANTA_KLAUD Общие вопросы Delphi 3 28.05.2008 21:52
работа с двумя книгами Реланиум Microsoft Office Excel 2 23.11.2006 16:37