:: Visual Foxpro, Foxpro for DOS
копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Добрый день, как правильно перевести макрос excel в vfp?

lFilePathName = 'c:\dolgi_v2.xls'
loexcel = CREATEOBJECT("Excel.Application")
loexcel.workbooks.add(lFilePathName)
loexcel.Cells(2,4).value=ALLTRIM(ALLTRIM(thisform.Text1.value)+ ' '+ '- ' + thisform.Text3.value)
loexcel.Cells(3,4).value=ALLTRIM('xyz'+ ALLTRIM(thisform.Text1.value))
loexcel.Columns("D: D").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
понятно все кроме последней строки с вставлением колонки, как надо изменит строку с Selection. так чтобы можно было копировать или как не копировать а добавить новую колонку у меня через loexcel.Columns.add не получилось?



Исправлено 3 раз(а). Последнее : axeum, 27.07.20 11:16
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
понятно все кроме последней строки с вставлением колонки, как надо изменит строку с Selection. так чтобы можно было копировать или как не копировать а добавить новую колонку у меня через loexcel.Columns.add не получилось?

Обычно в таких случаях срабатывает использование указанных значений параметров в скобках - без указания их имен естественно.
Кстати, есть такой полезный трюк, прочитал когда-то в одной из толстых книжек по программированию VBA Excel (всегда стоит поизучать немного этот язык, сегодня в инете в принципе есть неплохая документация, скажем по данной комманде: docs.microsoft.com ).
Если по ходу макроса встречаются вот такие стыки Select-Selection:
loexcel.Columns("D: D").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

То их можно удалять, сливая две строку в одну. При этом помимо упрощения кода, как пишут, повышается и скорость его обработки.
Т.е. в данном случае может выглядеть как-то так:

loexcel.Columns("D: D").Insert(xlToRight,xlFormatFromLeftOrAbove)

Еще важный момент, который также следует учитывать при переводе синтаксиса под фокспро - в каких-то случаях после такого перевода, какие-то команды могут не срабатывать точно так же из-под фокспро, как в макросах самого Excel. Т.е. иногда, хотя и редко, приходится использовать какие-то чуть другие команды для того же самого.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 4 раз(а). Последнее : Crispy, 27.07.20 13:40
Ratings: 0 negative/1 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
loexcel.Columns("D: D").Insert(xlToRight,xlFormatFromLeftOrAbove)
спасибо работает, но вставляется почему то слева от нужной колонки это можно как то исправить? чтобы вставлялось справа от нужной
Ratings: 0 negative/1 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
loexcel.Columns("D: D").Insert(xlToRight,xlFormatFromLeftOrAbove)
спасибо работает, но вставляется почему то слева от нужной колонки это можно как то исправить? чтобы вставлялось справа от нужной

А в макросе как вставлялось?


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/1 positive
Re: копирование колонки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
axeum
спасибо работает, но вставляется почему то слева от нужной колонки это можно как то исправить? чтобы вставлялось справа от нужной
Выбрать другую колонку, чтобы вставлялось слева от неё. В данном случае колонку Е.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Crispy
axeum
loexcel.Columns("D: D").Insert(xlToRight,xlFormatFromLeftOrAbove)
спасибо работает, но вставляется почему то слева от нужной колонки это можно как то исправить? чтобы вставлялось справа от нужной

А в макросе как вставлялось?
и в макросе тоже слева вставляется(я без данных смотрел поэтому даже не заметил этого), ладно не сильно критично но спасибо


а не подскажете еще как объединить 2 строки для допустим Е колонки(я вчера где то находил пример кода а сейчас не могу найти ничего похожего)
сделал что работает так как надо но что то изменил и теперь ошибка а как исправить и где я что сломал не понимаю
'variable is not found' с указаием на Range("E3:E4").Select но ведь range не переменная
xlToRight = .t.
xlFormatFromLeftOrAbove = .t.
IF kol = 1
*ничего
else
FOR i=1 to kol
loexcel.Columns("E:E").Insert(xlToRight,xlFormatFromLeftOrAbove)
Range("E3:E4").Select
WITH loexcel.selection
.MergeCells = .t.
endwith
i= i +1
ENDFOR
endif



Исправлено 11 раз(а). Последнее : axeum, 28.07.20 07:51
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
сделал что работает так как надо но что то изменил и теперь ошибка а как исправить и где я что сломал не понимаю 'variable is not found' с указаием на Range("E3:E4").Select но ведь range не переменная

Ну так Range же сам по себе не был объявлен как объект, и тем более, это не функция фокспро. Поэтому фокспро не может определить, что с ним делать.
Он должен быть "пристегнут" к объекту excel. Сейчас точно не помню (надо просто посмотреть в справке), но кажется что-то вроде такого:
loexcel.ActiveSheet.Range("E3:E4")

Где ActiveSheet - активная страница. Либо возможно сработает даже и просто к loexcel, если страница одна - это нужно глянуть синтаксис в справке, ну или просто проверить запуская.

В целом же кстати приведенный код также можно упростить.
Т.к. выполнение чего-то нужно только при kol>1, можно сам цикл просто начать с 2.
Также - по упомянутому выше у меня правилу удаления Select-Selection, оставшиеся строки сливаются.
Т.е. в итоге приведенный код будет выглядеть как-то так:
xlToRight = .t.
xlFormatFromLeftOrAbove = .t.
With loexcel
FOR i=2 to kol
.Columns("E:E").Insert(xlToRight,xlFormatFromLeftOrAbove)
.ActiveSheet.Range("E3:E4").MergeCells = .t.
ENDFOR
EndWith

Кстати непонятно, зачем в цикле было наращивать переменную цикла?
i= i +1


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 28.07.20 11:39
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Crispy
axeum
сделал что работает так как надо но что то изменил и теперь ошибка а как исправить и где я что сломал не понимаю 'variable is not found' с указаием на Range("E3:E4").Select но ведь range не переменная

Ну так Range же сам по себе не был объявлен как объект, и тем более, это не функция фокспро. Поэтому фокспро не может определить, что с ним делать.
Он должен быть "пристегнут" к объекту excel. Сейчас точно не помню (надо просто посмотреть в справке), но кажется что-то вроде такого:
loexcel.ActiveSheet.Range("E3:E4")

Где ActiveSheet - активная страница. Либо возможно сработает даже и просто к loexcel, если страница одна - это нужно глянуть синтаксис в справке, ну или просто проверить запуская.

В целом же кстати приведенный код также можно упростить.
Т.к. выполнение чего-то нужно только при kol>1, можно сам цикл просто начать с 2.
Также - по упомянутому выше у меня правилу удаления Select-Selection, оставшиеся строки сливаются.
Т.е. в итоге приведенный код будет выглядеть как-то так:
xlToRight = .t.
xlFormatFromLeftOrAbove = .t.
With loexcel
FOR i=2 to kol
.Columns("E:E").Insert(xlToRight,xlFormatFromLeftOrAbove)
.ActiveSheet.Range("E3:E4").MergeCells = .t.
ENDFOR
EndWith

Кстати непонятно, зачем в цикле было наращивать переменную цикла?
i= i +1
я думал что будет бесконечный цикл если не увеличивать переменную но да я и сам дошел до того что i= i +1 там лишняя, это все неопытность но ничего со временем исправлюсь и там теперь код изменился
FOR i=1 to kol
loexcel.Columns("D: D").Insert(xlToRight,xlFormatFromLeftOrAbove)
loexcel.Range("D3: D4").Select
WITH loexcel.selection
.MergeCells = .t.
.HorizontalAlignment = 3
.VerticalAlignment = 2
.WrapText = .t.
ENDWITH
ENDFOR
еще наврное глупый вопрос но все же как работает scan внутри scan ? примерно так же как if внутри if?



Исправлено 3 раз(а). Последнее : axeum, 29.07.20 11:38
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
как работает scan внутри scan ? примерно так же как if внутри if?

Все подробности по SCAN в принципе хорошо изложены в справочном руководстве к фокспро. ;)
Тем более, есть полный русский его перевод к VFP9. Так что всегда стоит в первую очередь обращаться туда, читать, думать, пробовать.

Если же в двух словах - с IF тут вообще не может быть никаких аналогий, т.к. это же цикл! А не выбор по условию, как в IF.
Даже с циклами FOR или DO WHILE есть много различий.
SCAN - прежде всего нужен, чтобы перемещать последовательно указатель записи по указанной для него таблице, по условиям или без.
Т.е., скажем в такой гипотетической конструкции:
SELECT tabl1
SCAN
* какие-то команды
SELECT tabl2
SCAN
* какие-то команды
ENDSCAN
* какие-то команды
ENDSCAN
внутри каждого блока производится сканирование указанной именно для него таблицы - tabl1 или tabl2.
Хотя обычно такого рода вложения блоков SCAN друг в друга не применяются, в этом просто нет и особого смысла.
Гонять же одну и ту же таблицу туда-сюда вложенными друг в друга сканами - и вовсе как бы бессмысленно.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 29.07.20 12:57
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
так я понимаю что если 1 таблица скан в скане не имеет смысла но проблема как раз в том что курсора 2 и собрать оба курсора в 1 нельзя(совсем разная информация в них), а может тогда заменить на такой формат? но проблема в том что информация из этих 2 курсоров переносится в excel и чтобы не получилось так что в каком то из курсоров не хватает чего то

select t1
scan
*выполнение
select t2
scan
*выполнение
endscan
endscan
**********
**********
select t1
scan
*выполнение
endscan
select t2
scan
*выполнение
endscan



Исправлено 3 раз(а). Последнее : axeum, 29.07.20 13:31
Ratings: 0 negative/0 positive
Re: копирование колонки
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> все же как работает scan внутри scan ? примерно так же как if внутри if?
примерно да

SCAN работает просто - это эквивалент вот такой конструкции:
GO TOP
DO WHILE !EOF()
* внутриSCAN-овые операторы
SKIP
ENDDO
SCAN внутри SCAN в разных курсорах очевиден

SCAN внутри SCAN в одном курсоре - тоже можно, сохраняя и восстанавливая RECNO внешнего SCAN-а:
SCAN
r = RECNO()
SCAN
ENDSCAN
GO RECORD (m.r)
ENDSCAN
Ratings: 0 negative/0 positive
Re: копирование колонки
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
А если нужно начинать сканить с текущей записи, то GO TOP не нужен.

Вааще-та есть какая-то разница по скорости выполнения (или ещё по чему-то) между SCAN и DO WHILE в паре со SKIP?

DO WHILE Вроде как "универсальный" цикл, а не только цикл по таблице.



Исправлено 1 раз(а). Последнее : Simple777, 29.07.20 16:02
Ratings: 0 negative/0 positive
Re: копирование колонки
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Скорость в фоксе могут сажать самые тривиальные команды, скорость измеряется в конкретной проге, с конкретными данными. Скорее всего просто скан малоотличим от ду вхиле по скорости, на простой табличке. Но если в скан добавить FOR, или SET FILTER в случае ду вхиле, то уже хз, хотя если выражения фильтра одинаковы, то может быть опять скорости будут одинаковы. Вобщем, скорость выполнения проги - это этап вторичный, сначала надо просто оживить прогу, изложив ее в правильном грубом направлении...
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
но проблема как раз в том что курсора 2 и собрать оба курсора в 1 нельзя(совсем разная информация в них)

Как это нельзя? При желании все можно. ;)


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
SELECT cr1
SCAN
loexcel.Cells(lRow,1).Value = ALLTRIM(cr1.nls)
loexcel.Cells(lRow,2).Value = ALLTRIM(cr1.fio)
loexcel.Cells(lRow,3).Value = ALLTRIM(cr1.adres)
loexcel.Cells(lRow,4).value = STR(cr1.itgvh_s,9,2)
loexcel.Cells(lRow,kol+5).value = STR(cr1.itogish,9,2)
lColmns = 3
SELECT c2
SCAN
str1 = 's1 = cur1.N' + PADL(ALLTRIM(STR(c2.kop,6)),6,'0')
&str1
str2 = 's2 = cur2.M' + PADL(ALLTRIM(STR(c2.kop,6)),6,'0')
&str2
SELECT cur1
locate FOR cr1.kkd = cur1.kkd
SCAN WHILE lColmns <= kol+2
MESSAGEBOX(str1)
lColmns = lColmns +2
loexcel.Cells(lRow,lColmns).value = ALLTRIM(STR(s1,10,2)) &&начисления
ENDSCAN
lColmns = 3
SELECT cur2
locate FOR cr1.kkd = cur2.kkd
SCAN WHILE lColmns <= kol+2
MESSAGEBOX(str2)
lColmns = lColmns +2
loexcel.Cells(lRow,lColmns+1).value = ALLTRIM(STR(s2,10,2)) &&оплаты
endscan
endscan
lRow = lRow +1
ENDSCAN
задача заполнить колонки выделенные желтым НО у меня получается заполнить только 1 значением в таблице это видно, я думаю что проблема в lColmns если так то как правильно исправить ее? чтобы cur1.N000001 был в ячейке с июлем а cur1.N000002 был в июне у меня получается только заполнить все одним значением для каждой строки, возможно сами расчеты немного не правильные но это же другой вопрос и их проще исправить
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum

Если пока не трогать некоторых ужасов данного кода - что вообще в итоге должно получиться, на пальцах так сказать? И из каких собственно таблиц?
Лучше в ьаких случаях хотя бы на картинках показывать.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
вот пример какой мне прислали и попросили сделать такой отчет, но вся сложность и непонятность в том что динамические таблицы я еще не делал только статичные в которые можно сразу прописать куда что вставить и откуда что отнять/сложить/умножить/поделить и если вдруг где то что то не правильно встало/посчитало быстро это подравить


лиц.счет/фио/адрес/долг на начало выбранного периода а дальше должно идти пояснение:
начислено за первый месяц выбранного периода начислено Х | оплачено за первый месяц выбранного периода Y
и собственно так далее по каждому месяцу в выбранном периоде до того пока не будет достигнут конец выбранного периода
скажет что у нас это июнь-июль 2020г соотв. 2 колонки для июня и 2 колонки для июля(что у меня худо бедно получилось сделать)
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
максимум что смог сюда впихнуть с ограничениями
вот 2 курсора откуда и выгружается все,это оплаты за июнь м000092,а это за м000093 июль а N000092 оплаты выбранных месяцов, и вот эти значения надо выгрузить в таблицу excel в соответствующую колонку, если будет выбран другой период то и (М+номер месяца) соотв. изменится



Исправлено 3 раз(а). Последнее : axeum, 30.07.20 11:06
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
максимум что смог сюда впихнуть с ограничениями вот 2 курсора откуда и выгружается все,это оплаты за июнь м000092,а это за м000093 июль а N000092 оплаты выбранных месяцов, и вот эти значения надо выгрузить в таблицу excel в соответствующую колонку, если будет выбран другой период то и (М+номер месяца) соотв. изменится

Ну на первыый взгляд, задача вроде бы стандартная.
Обычно просто делается итоговая выборка в курсор, аналогичный конечному виду отчета, который потом уже и сканируется в эксель.
В чем вообще проблемы? Почему нельзя сделать все в один курсор?
Зачем второй нужен?


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
задача то легкая я ведь не спорю с этим, но я писал только пару справок в ворд и не сложынй отчет в excel где просто надо вписать нужные значения в нужные колонки и кол-во колонок не изменялось поэтмоу для меня это пока сложно и вызывает столько вопросов, я первый раз пишу что то подобное, а можно тогда скинуть как объединить 2 курсора и объединить так чтобы не было повторяющишься полей? типа fio_a и fio_b, я пытался через left join соединить курсоры но хорошего ничего не вышло

select ;
cur1.*,;
cur2.namefield ;<-что сюда вписать?
from cur1;
left join cur2;
on cur1.kkd = cur2.kkd;
into cursor cursor_finally

я не знаю какие поля указывать если имя поле динамические и сегодyя оно будет m000092 а завтра я уже буду выдавать на M000080
все осн поля я вытащу из cur1.* но cur2 вводит в ступор, union так вроде не тот случай а Join я не знаю как вытащить нужные поля из cur2



Исправлено 3 раз(а). Последнее : axeum, 30.07.20 11:58
Ratings: 0 negative/0 positive


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

On-line: 20 akvvohinc  (Гостей: 19)

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