Страницы: 1
RSS
Скриптом открыть файл, изменить и записать
 
Доброе.
Задача следующая: имеется файл с данными и файл с шапкой. Нужно данные перенести в нужные колонки файла с шапкой и потом этот файл сохранить.
Реализация: открываем файл с данными, жмем на выполнение Макрос1 и на выходе, в какой нить заданной папке получаем результат.
Собственно открыть файл то я могу. типа:
Код
Dim oAppExcel, oBook, oSheet
Set oAppExcel = CreateObject("Excel.Application")
Set oBook = oAppExcel.Workbooks.Open("D:\Riz\2020\Приложение 5.xlsx")
Set oSheet = oBook.Sheets(1)
Но вот как потом обращаться к ячейкам открытого листа файла с данными не знаю (
Нужно сделать что-то типа
Код
Sheets("Лист2").Select
Range("C1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
oSheet.Select
Range("I6").Select
ActiveSheet.Paste
 
Цитата
RizONE написал:
Set oAppExcel = CreateObject("Excel.Application")
а зачем эта строчка? вы работаете не из Excel?
 
из...
код нашел на просторах сети :oops:  
 
RizONE, покажите из какого файла в какой нужно копировать, или это манипуляция в пределах одного открываемого файла?
Соблюдение правил форума не освобождает от модераторского произвола
 
Да показывать  то особо и нечего
имеем два файла: файл_1 и файл_2
Открываем файл_1 и тыкаем на Макрос1
скрипт открывает (не обязательно делать его видимым) файл_2 и начиная со второй строки (в первой шапка отчета):
в колонку А ставит данные из колонки С файл_1
в колонку В ставит данные из колонки А файл_1
сохраняет файл_2 в корень диска Д
 
Цитата
RizONE написал:
Да показывать  то особо и нечего
ну что ж, тогда адаптируйте самостоятельно:
Код
Sub g()
    Set oBook = oAppExcel.Workbooks.Open("D:\Riz\2020\?????????? 5.xlsx")
    Set oSheet = oBook.Sheets(1)
    ThisWorkbook.Sheets("Лист2").Range([C1], [C1].End(xlDown)).Copy oSheet.[A2]
    ThisWorkbook.Sheets("Лист2").Range([A1], [A1].End(xlDown)).Copy oSheet.[B2]
    oBook.Save
    oBook.Close
End Sub
Соблюдение правил форума не освобождает от модераторского произвола
 
:)
Код
Option Explicit

Sub meowky_meowky_meow()
    Const srcSht = "List1", srcRngBeg = "A1", srcCol1 = 3, srcCol2 = 1
    Const trgSht = "List2", trgRngBeg = "A1"
    Const fltr = "All XLS Files (*.xls*),*.xls*,XLS Files (*.xls),*.xls,XLSX Files (*.xlsx),*.xlsx"
    Const fltrind = 1
    '-----------------------------------------------------------------------------------
    Dim srcvar: srcvar = Application.GetOpenFilename(fltr, fltrind, "Select SOURCE file", , False)
    Application.Wait (Now + TimeValue("00:00:01"))
    Dim trgvar: trgvar = Application.GetOpenFilename(fltr, fltrind, "Select TARGET file", , False)
    If srcvar = False Or trgvar = False Then Exit Sub
    '-----------------------------------------------------------------------------------
    Dim srcWkb: srcWkb = Right(Trim(srcvar), Len(Trim(srcvar)) - InStrRev(Trim(srcvar), Application.PathSeparator, -1, 1))
    Dim trgWkb: trgWkb = Right(Trim(trgvar), Len(Trim(trgvar)) - InStrRev(Trim(trgvar), Application.PathSeparator, -1, 1))
    If srcWkb = trgWkb Then Exit Sub
    If srcWkb = ThisWorkbook.Name Or trgWkb = ThisWorkbook.Name Then Exit Sub
    srcWkb = Empty: trgWkb = Empty
    '-----------------------------------------------------------------------------------
    Set srcWkb = Workbooks.Open(Filename:=srcvar, UpdateLinks:=0, ReadOnly:=True)
    Set trgWkb = Workbooks.Open(Filename:=trgvar, UpdateLinks:=0, ReadOnly:=False)
    srcvar = Empty: trgvar = Empty
    '-----------------------------------------------------------------------------------
    With srcWkb
        With .Sheets(srcSht)
            With .Range(srcRngBeg).CurrentRegion
                srcvar = .Offset(1, srcCol1 - 1).Resize(.Columns(srcCol1).Rows.Count - 1, 1).Value
                trgvar = .Offset(1, srcCol2 - 1).Resize(.Columns(srcCol2).Rows.Count - 1, 1).Value
            End With
        End With
        .Close False
    End With
    Set srcWkb = Nothing: srcWkb = Empty
    '-----------------------------------------------------------------------------------
    With trgWkb
        With .Sheets(trgSht)
            .Select
            With .Range(trgRngBeg)
                With .Cells(.CurrentRegion.Rows.Count, 1)
                    .Select
                    .Offset(1, 0).Resize(UBound(srcvar, 1), 1).Value = srcvar
                    .Offset(1, 1).Resize(UBound(trgvar, 1), 1).Value = trgvar
                End With
            End With
        End With
    End With
    srcvar = Empty: trgvar = Empty
    Set trgWkb = Nothing: trgWkb = Empty
    '-----------------------------------------------------------------------------------
    With ThisWorkbook
        .Saved = True
        .Close False
    End With
End Sub
:)  
 
Спасибо большое, идею понял

ЗЫ
не идет. дает ошибку "метод Select ... завершен неверно" на выборе Лист1
Код
Sub Forma_5_Create()
    Dim oBook, oSheet ' Application Excel, Book, Sheet
    Set oBook = Workbooks.Open("D:\Riz\2020\Приложение 5.xlsx")
    Set oSheet = oBook.Sheets(1)
    
    ThisWorkbook.Sheets("Лист1").Select
    Range("A9:B9").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    oSheet.Select
    Range("D6").Select
    ActiveSheet.Paste
    oBook.Save
    oBook.Close
End Sub
Изменено: RizONE - 07.05.2020 14:21:10
 
"Select" предназначен только для активного объекта (тут: "Приложение 5.xlsx" и какой-то лист), так как объект в данный момент неактивен (тут: "Лист1" в "ThisWorkbook"), это будет ошибка выполнения команды ("Select").
 
Идею понял, селект! :)
Да забудьте про селекты и активации, насколько я помню это нужно только для "заморозки" областей.
 
Цитата
RizONE написал:
идею понял
прям заинтриговали - что за идея-то стала понятна? (я-то имел ввиду копирование без select)
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
ocet p написал:
"Select" предназначен только для активного объекта (тут: "Приложение 5.xlsx" и какой-то лист), так как объект в данный момент неактивен (тут: "Лист1" в "ThisWorkbook"), это будет ошибка выполнения команды ("Select").
вот это и не понятно было изначально: как делать активным сначала Лист1 открываемого файла. копировать данные, а потом переключаться на лист oSheet второго, записываемого файла?
 
не нужно ничего специально делать активным, в Excel есть все необходимые инструменты для обращения к требуемым обьетам
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
RizONE написал:
как делать активным сначала Лист1 открываемого файла. копировать данные, а потом переключаться на лист oSheet второго, записываемого файла?
зачем делать активным? я вот это для кого написал:
Цитата
buchlotnik написал:
ThisWorkbook.Sheets("Лист2").Range([C1], [C1].End(xlDown)).Copy oSheet.[A2]
т.е.
Код
откуда.Copy куда
БЕЗ активации
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
БЕЗ активации
не работает этот код, что тут не так в строке 5? Не копирует.
Код
Sub Forma_5_Create()
 Dim oBook, oSheet ' Application Excel, Book, Sheet
 Set oBook = Workbooks.Open("D:\Riz\2020\Ïðèëîæåíèå 5.xlsx")
 Set oSheet = oBook.Sheets(1)
 
 ThisWorkbook.Sheets("Лист1").Range([A9], [B9].End(xlDown)).Copy oSheet.[D2]
 oBook.Save
 oBook.Close
End Sub

вот так работает, но файл при этом не меняется, т.е. копирование не выполняется

Код
Sub Forma_5_Create()
    Dim oBook, oSheet ' Application Excel, Book, Sheet
    Set oBook = Workbooks.Open("D:\Riz\2020\Ïðèëîæåíèå 5.xlsx")
    Set oSheet = oBook.Sheets(1)
    
    ThisWorkbook.Sheets("Лист1").Range("A9:B15").Copy _
        Destination:=oSheet.Range("D2")
    oBook.Save
    oBook.Close
End Sub

Изменено: RizONE - 10.05.2020 13:59:31
 
Не так то, что у [A9], [B9] не указан родитель, и в результате эксель будет пытаться их брать из активного листа, или листа где прописан код. Т.е. есть вариант что и сработает, если именно в той пятой строке пропишите удачный код :)
Изменено: Hugo - 10.05.2020 14:11:07
 
Понял в чем было дело!
Макрос запускается из PERSONAL.XLSB  и соответственно для него Лист1 естественно пустой!
Перенес макрос в Модуль открываемого файла и все заработало.
Соответственно вопрос: как теперь заставить все это работать из личной книги макросов? не тянуть же макрос с собой во все нужные книги.
 
Да просто указать из какой книги и что именно собираетесь копировать. И куда.
А в чём было дело до конца не поняли...
Изменено: Hugo - 10.05.2020 14:41:41
 
Цитата
Hugo написал:
А в чём было дело до конца не поняли...
код
Код
ThisWorkbook.Sheets("Лист1").Range("A9:B15").Copy oSheet.Range("B2")
берет данные из Лист1 файла PERSONAL.XLSB т.к. функция объявлена в нем. Лист1 в нем пуст, вот он пусто и копирует в файл Приложение_5
 
Я говорил про тот первый код, где не указаны родители ячеек. Там поняли в чём была причина ошибки?
Ну а про этот - если поняли что такое ThisWorkbook, то должны догадаться как этот объект заменить на другой. Какой - мне отсюда не видно...
Страницы: 1
Наверх