:: Visual Foxpro, Foxpro for DOS
Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Доброго дня всем.
Перерыл весь форум, не не нашел сообщений по этой теме.
Делаю так
**Первая книга в которую надо вставить
XLRelek1=GetObject("","Excel.Application")
XLRelek=XLRelek1.Workbooks.open(cFileNamexls)
XLRelek.application.visible=.t.
XLSheet1=XLRelek.Sheets(1) 
**Вторая книга из которой надо извлчь
cFileNamexls2=ALLTRIM(spisflzip.put_file)
XLRelek1=GetObject("","Excel.Application")
XLRelek2=XLRelek1.Workbooks.open(cFileNamexls2)
***
	i=2  &&Найденная нужная строка в книге2
    k=5303 && Первая чистая строчка первой книги - ставлю пока вручную. Дальше, наверное наращивать буду
	WITH XLSheet2.Range(XLSheet2.Cells(i,1),XLSheet2.Cells(i,11))
		.select 
			.Copy &&Срабатывает
			**Это разные команды, которые нашел на форуме - не могу определиться с синтаксисом
			*.Copy After:=Workbooks("cFileNamexls1").Sheets(Workbooks(cFileNamexls1).Worksheets.Count)
			*loexcel.Columns("D: D").Insert(xlToRight,xlFormatFromLeftOrAbove)
			*Sheets(cFileNamexls2).Copy After:=Workbooks("cFileNamexls1").Sheets(Workbooks(cFileNamexls1).Worksheets.Count)
	ENDWITH 
	WITH XLSheet1.Range(XLSheet1.Cells(k,1),XLSheet1.Cells(k,11))
		.insert && Не срабатывает
			**Это разные команды, которые нашел на форуме - не могу определиться с синтаксисом
			*.insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
			*.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
			*Sheets(cFileNamexls2).Copy After:=Workbooks("cFileNamexls1").Sheets(Workbooks(cFileNamexls1).Worksheets.Count)
	ENDWITH
Помогите, пожалуйста, с синтаксисом или дайте ссылку не тему в форуме


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Baga
Перерыл весь форум, не не нашел сообщений по этой теме.
А в чем вы видите принципиальную разницу между:
1) заполнением ячеек в одном и том же листе текущей книги;
2) заполнением ячеек в другом листе текущей книги;
3) и заполнением ячеек в каком-то листе другой книги?



Исправлено 1 раз(а). Последнее : akvvohinc, 13.01.23 12:57
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Как узнать какая команда Word или Excel выполняет нужное действие

Перевод макроса Excel в синтаксис FoxPro

Метод Range.Copy (Excel)



Исправлено 1 раз(а). Последнее : Владимир Максимов, 13.01.23 13:35
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
akvvohinc
Baga
Перерыл весь форум, не не нашел сообщений по этой теме.
А в чем вы видите принципиальную разницу между:
1) заполнением ячеек в одном и том же листе текущей книги;
2) заполнением ячеек в другом листе текущей книги;
3) и заполнением ячеек в каком-то листе другой книги?
Копировать - вставить, наверное везде один и тот же просесс, а вот исполнение этого действия - разное.
Просто в выбранном мной методике не работает Вставить. Вот и спрашиваю, как сделать правильно.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Владимир Максимов
Как узнать какая команда Word или Excel выполняет нужное действие
Беда в том, что я затрудняюсь перевести макросы на язык фокспро.

Перевод макроса Excel в синтаксис FoxPro
Здесь не нашел примера копирования-вставки

Метод Range.Copy (Excel)
Интересная ссылка. Но опять ВБ...

 Sheets("Sheet1").Select 
    ' Find the last row of data 
    FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 
    ' Loop through each row 
    For x = 2 To FinalRow 
        ' Decide if to copy based on column D 
        ThisValue = Cells(x, 4).Value 
        If ThisValue = "A" Then 
            Cells(x, 1).Resize(1, 33).Copy 
            Sheets("SheetA").Select 
            NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 
            Cells(NextRow, 1).Select 
            ActiveSheet.Paste 
            Sheets("Sheet1").Select 
        ElseIf ThisValue = "B" Then 
            Cells(x, 1).Resize(1, 33).Copy 
            Sheets("SheetB").Select 
            NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 
            Cells(NextRow, 1).Select 
            ActiveSheet.Paste 
            Sheets("Sheet1").Select 
        End If 
    Next x


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
так в чем проблема - перекладываете на фокс и все )))

вот еще файлик с константами экселевскими вам пригодится - приложил
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
...



Исправлено 1 раз(а). Последнее : AndyNigmatec, 13.01.23 16:25
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
AndyNigmatec
так в чем проблема - перекладываете на фокс и все )))
Я же обозначил проблему выше: не могу переводить на язык фокса
вот еще файлик с константами экселевскими вам пригодится - приложил[/quote
Вы, наверное, шутите? )))


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
да без проблем ))

не понял правда у вас в макросе почему так - Cells(x, 1).Resize(1, 33).Copy - но вам там на месте виднее

#DEFINE xlUp -4162
lcNameFile='C:\Work\temp\Книга1.xlsx'
loExcel=CREATEOBJECT("EXCEL.APPLICATION")
loExcel.Visible=.F.
loExcel.EnableEvents=.T.
loExcel.DisplayAlerts=.F.
loExcel.Workbooks.Open(lcNameFile)
lcWbName=JUSTFNAME(lcNameFile)
loSheet1=loExcel.Workbooks(lcWbName).Sheets("Лист1")
loSheetA=loExcel.Workbooks(lcWbName).Sheets("Лист2")
loSheetB=loExcel.Workbooks(lcWbName).Sheets("Лист3")
*!* Sheets("Sheet1").Select
*!* ' Find the last row of data
*!* FinalRow = Cells(Rows.Count, 1).End(xlUp).Row
FinalRow = loSheet1.Cells(loSheet1.Rows.Count, 1).End(xlUp).Row
FOR x = 2 TO FinalRow
ThisValue = loSheet1.Cells(x, 4).Value
DO CASE
CASE ThisValue = "A"
loSheet1.Cells(x, 1).Resize(1, 33).Copy
loSheetA.Select
NextRow = loSheetA.Cells(loSheetA.Rows.Count, 1).End(xlUp).Row + 1
loSheetA.Cells(NextRow, 1).Select
loExcel.ActiveSheet.Paste
CASE ThisValue = "B"
loSheet1.Cells(x, 1).Resize(1, 33).Copy
loSheetB.Select
NextRow = loSheetB.Cells(loSheetB.Rows.Count, 1).End(xlUp).Row + 1
loSheetB.Cells(NextRow, 1).Select
loExcel.ActiveSheet.Paste
OTHERWISE
ENDCASE
ENDFOR
*!* ' Loop through each row
*!* For x = 2 To FinalRow
*!* ' Decide if to copy based on column D
*!* ThisValue = Cells(x, 4).Value
*!* If ThisValue = "A" Then
*!* Cells(x, 1).Resize(1, 33).Copy
*!* Sheets("SheetA").Select
*!* NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
*!* Cells(NextRow, 1).Select
*!* ActiveSheet.Paste
*!* Sheets("Sheet1").Select
*!* ElseIf ThisValue = "B" Then
*!* Cells(x, 1).Resize(1, 33).Copy
*!* Sheets("SheetB").Select
*!* NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
*!* Cells(NextRow, 1).Select
*!* ActiveSheet.Paste
*!* Sheets("Sheet1").Select
*!* End If
*!* Next x
loExcel.Workbooks(lcWbName).Save
loExcel.Workbooks(lcWbName).Close(.F.)
loExcel.Quit
RELEASE loExcel
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Копировать - вставить, наверное везде один и тот же процесс, а вот исполнение этого действия - разное.
Возможно, я чего-то не понимаю.

Но, допустим, есть метод PasteSpecial объекта Range1, которым вы можете вставить предварительно скопированный другой объект Range2.
Какая разница, на каком листе какой книги располагается Range1?
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
akvvohinc
Цитата:
Копировать - вставить, наверное везде один и тот же процесс, а вот исполнение этого действия - разное.
Возможно, я чего-то не понимаю.

Но, допустим, есть метод PasteSpecial объекта Range1, которым вы можете вставить предварительно скопированный другой объект Range2.
Какая разница, на каком листе какой книги располагается Range1?
Синтаксис применения PasteSpecial какой?
loExcel.range.pasteSpecial
loExcel.range.cells(NextRow, 1).pasteSpecial
или какой-то другой?


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Не работает вставка.

PUBLIC loExcel, loSheet1, loExce2, loSheet2,FinalRow 
***Открываем первый файл, куда будут копироваться строчки из второго и последующих файлов
lcNameFile=(cFileNamexls)
loExcel=CREATEOBJECT("EXCEL.APPLICATION")
loExcel.Visible=.F.
loExcel.EnableEvents=.T.    
loExcel.DisplayAlerts=.F.

loExcel.Workbooks.Open(cFileNamexls)
loExcel.application.visible=.t.

lcWbName=JUSTFNAME(lcNameFile)
loSheet1=loExcel.Workbooks(lcWbName).Sheets(1)
***Открываем второй файл
cFileNamexls2=ALLTRIM(spisflzip.put_file)  &&хранится в курсоре
? cFileNamexls2
lcNameFile=(cFileNamexls2)
loExce2=CREATEOBJECT("EXCEL.APPLICATION")
loExce2.Visible=.F.
loExce2.EnableEvents=.T.    
loExce2.DisplayAlerts=.F.
loExce2.Workbooks.Open(cFileNamexls2)
loExce2.application.visible=.t.
lcWbName2=JUSTFNAME(cFileNamexls2)
loSheet2=loExce2.Workbooks(lcWbName2).Sheets(1)

*Вычисляем последнюю строку в первом файле
#DEFINE xlUp   -4162
FinalRow = loSheet1.Cells(loSheet1.Rows.Count, 1).End(xlUp).Row 
?FinalRow

FOR x = 2 TO 24 &&(количество записей заранее не известно. Работаю через DO WHILE)
	***Разные Команды
	**Если выполнено какое-то условие, копируем эту запиь в перву таблицу
	loSheet2.Cells(x, 1).Resize(1, 11).Copy && Работает
	NextRow =FinalRow+1
    loSheet1.Cells(NextRow, 1).Select
    *loExcel.ActiveSheet.Paste  &&Невозможно получить свойство Paste класса Workscheet
    *loExcel.ActiveSheet.PasteSpecial &&Невозможно получить свойство PasteSpecial класса Workscheet
     FinalRow=FinalRow+1
ENDFOR 
loExce2.application.quit
RELEASE loExce2

Чем еще заменить вставку


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
вам не нужно создавать второй экземпляр эксель, работайте в одном ... тот код что я выше перевел из вашего vba я проверил - все работает

т.е. в вашем случае

loExcel=CREATEOBJECT("EXCEL.APPLICATION")
loExcel.Visible=.F.
loExcel.EnableEvents=.T.
loExcel.DisplayAlerts=.F.

создали экземпляр loExcel - так до конца с ним и работайте, далее открываем первый файл и делаем ссылку на первый лист

loExcel.Workbooks.Open(cFileNamexls)
lcWbName=JUSTFNAME(cFileNamexls)
loSheet1=loExcel.Workbooks(lcWbName).Sheets(1)

далее, открываем второй файл и делаем ссылку на первый лист в нем

loExcel.Workbooks.Open(cFileNamexls2)
lcWbName2=JUSTFNAME(cFileNamexls2)
loSheet2=loExcel.Workbooks(lcWbName2).Sheets(1)

далее, преобразуем немного ваш код
#DEFINE xlUp -4162
*Вычисляем последнюю строку в первом файле
FinalRow = loSheet1.Cells(loSheet1.Rows.Count, 1).End(xlUp).Row
?FinalRow
FOR x = 2 TO 24 &&(количество записей заранее не известно. Работаю через DO WHILE)
***Разные Команды
**Если выполнено какое-то условие, копируем эту запиь в перву таблицу
loSheet2.Cells(x, 1).Resize(1, 11).Copy && Работает
NextRow =FinalRow+1
loSheet1.Select
loSheet1.Cells(NextRow, 1).Select
loExcel.ActiveSheet.Paste
FinalRow=FinalRow+1
ENDFOR
&& поскольку вы меняете первый файл - то его надо сохранить перед закрытием, второй как я понимаю можно не сохранять, а просто закрыть
loExcel.Workbooks(lcWbName).Save
loExcel.Workbooks(lcWbName).Close(.F.)
loExcel.Workbooks(lcWbName2).Close(.F.)
loExcel.quit
RELEASE loExcel

вроде все поправил, проверяйте ))



Исправлено 8 раз(а). Последнее : AndyNigmatec, 13.01.23 21:58
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
вроде все поправил, проверяйте ))
Могу лишь дополнить, что:

1) С книгой тоже можно (и гораздо удобнее) работать по ссылке:
m.loBook = loExcel.Workbooks.Open(cFileNamexls2)
Никакие выяснения имени книги и последующие обращения вида:
loExcel.Workbooks(lcWbName2)
не нужны.

2) все используемые команды .Select при работе из-под Фокса не нужны.
То есть обращаться (работать с) к любому объекту Range (в любой книге и на любом листе) можно "напрямую" - без предварительного .Select.

Таким образом, вместо 3 команд:
loSheet1.Select
loSheet1.Cells(NextRow, 1).Select
loExcel.ActiveSheet.Paste
Достаточно задать одну:
loSheet1.Cells(NextRow, 1).PasteSpecial

3) Если уж вы по какой-то причине (для какой-то цели) делаете RELEASE переменной loExcel, то чтобы быть последовательным, по той же причине следовало бы удалять и прочие подобные объектные ссылки, которые были связаны с Excel-объектом - loSheet1 и loSheet2.



Исправлено 1 раз(а). Последнее : akvvohinc, 14.01.23 04:07
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
без предварительной активации .Select дальнейший loExcel.ActiveSheet.Paste не срабатывает вроде, тут тупо проверить нужно, а в целом - да, согласен ))

3) release loExcel - это скорее "на всякий случай", по идее по quit все должно выходить



Исправлено 2 раз(а). Последнее : AndyNigmatec, 14.01.23 09:32
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
sphinx

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
все используемые команды .Select при работе из-под Фокса не нужны.

Скорее всего наш коллега записывал макросы и адаптировал под Фокс 1-в-1. Обычно да, все без них стараются делать.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
без предварительной активации .Select дальнейший loExcel.ActiveSheet.Paste не срабатывает вроде
1) Если текущим (активным) листом уже является тот, для которого выполняется Paste, то .Select для него не нужен.
2) Но я не предлагал пользоваться ActiveSheet.Paste - я использовал Range.PasteSpecial.



Исправлено 1 раз(а). Последнее : akvvohinc, 14.01.23 12:55
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
В целом сработала следующая схема
XLSheet2.Cells(I, 1).Resize(1, 11).Copy
NextRow =FinalRow+1 	
XLSheet1.Cells(NextRow, 1).PasteSpecial
FinalRow=FinalRow+1
В самом цикле, как оветовал akvvohinc, убрал все селекты и использовал Range.PasteSpecial.
Правда, иногда на какой-нибудь записи второго объекта срабатывает ошибка на строчке
XLSheet1.Cells(NextRow, 1).PasteSpecial
Ошибка типа Эксель не может вставить данные
При просмотре в режиме SUSPEND видно, что во втором объекте строчки обведены пунктироной линией (то есть XLSheet2.Cells(I, 1).Resize(1, 11).Copy сработал),
а копируемые данные почти ничем не отличаются от других. Но ничего не поделаешь.
Здесь придется какой-нибудь обработчик писать, чтобы как-то отметить невставленную запись для просмотра в ручном режиме.

Без объявления двух укземпляров экселя, как советовал AndyNigmatec, тоже крайне неудобно.
Ничего не видно, при возникновении ошибки невозможно открыть файл, чтобы посмотреть, на какой записи и что происходит.
Не срабатывают loExcel.ActiveSheet.Paste.
Тем не менее, я кое-чему научился благодаря помощи клуба. Большое спасибо всем за помошь.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
На двух экземплярах экселя как раз и возможны ошибки при Copy-Paste ... Excel вещь в себе )))

по возникающей ошибке - посмотрите что это за ошибка, типа такого:

TRY
XLSheet1.Cells(NextRow, 1).PasteSpecial
CATCH
=AERROR(a2)
?a2[2]
ENDTRY



Исправлено 1 раз(а). Последнее : AndyNigmatec, 14.01.23 21:39
Ratings: 0 negative/0 positive
Re: Кировать строки с одной книги в другую книгу Excel
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
sphinx
akvvohinc
все используемые команды .Select при работе из-под Фокса не нужны.

Скорее всего наш коллега записывал макросы и адаптировал под Фокс 1-в-1. Обычно да, все без них стараются делать.
А есть чисто фоксовские методы?


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 17 (Гостей: 17)

© 2000-2024 Fox Club 
Яндекс.Метрика