for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

копирование колонки
axeum
Автор

Сообщений: 48
Дата: 27.07.20 11:05:47
Добрый день, как правильно перевести макрос 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 не получилось?



Исправлено: axeum, 27.07.20 11:16
Ratings: 0 negative/0 positive

Re: копирование колонки
Crispy

Сообщений: 17248
Дата: 27.07.20 13:37:43
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. Т.е. иногда, хотя и редко, приходится использовать какие-то чуть другие команды для того же самого.


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




Исправлено: Crispy, 27.07.20 13:40
Ratings: 0 negative/1 positive

Re: копирование колонки
axeum
Автор

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

Re: копирование колонки
Crispy

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

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


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

Re: копирование колонки
Igor Korolyov

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: копирование колонки
axeum
Автор

Сообщений: 48
Дата: 28.07.20 05:09:26
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



Исправлено: axeum, 28.07.20 07:51
Ratings: 0 negative/0 positive

Re: копирование колонки
Crispy

Сообщений: 17248
Дата: 28.07.20 11:36:33
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


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




Исправлено: Crispy, 28.07.20 11:39
Ratings: 0 negative/0 positive

Re: копирование колонки
axeum
Автор

Сообщений: 48
Дата: 29.07.20 11:36:32
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?



Исправлено: axeum, 29.07.20 11:38
Ratings: 0 negative/0 positive

Re: копирование колонки
Crispy

Сообщений: 17248
Дата: 29.07.20 12:53:46
axeum
как работает scan внутри scan ? примерно так же как if внутри if?

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

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


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




Исправлено: Crispy, 29.07.20 12:57
Ratings: 0 negative/0 positive

Re: копирование колонки
axeum
Автор

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

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



Исправлено: axeum, 29.07.20 13:31
Ratings: 0 negative/0 positive

Re: копирование колонки
of63

Сообщений: 20543
Откуда: Н.Новгород
Дата: 29.07.20 15:03:32
> все же как работает 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

Сообщений: 29537
Дата: 29.07.20 16:01:32
А если нужно начинать сканить с текущей записи, то GO TOP не нужен.

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

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



Исправлено: Simple777, 29.07.20 16:02
Ratings: 0 negative/0 positive

Re: копирование колонки
of63

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

Re: копирование колонки
Crispy

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

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


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

Re: копирование колонки
axeum
Автор

Сообщений: 48
Дата: 30.07.20 08:18:27
  
  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

Сообщений: 17248
Дата: 30.07.20 10:33:01
axeum

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


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

Re: копирование колонки
axeum
Автор

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


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

Re: копирование колонки
axeum
Автор

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



Исправлено: axeum, 30.07.20 11:06
Ratings: 0 negative/0 positive

Re: копирование колонки
Crispy

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

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


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

Re: копирование колонки
axeum
Автор

Сообщений: 48
Дата: 30.07.20 11:56:01
задача то легкая я ведь не спорю с этим, но я писал только пару справок в ворд и не сложынй отчет в 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



Исправлено: axeum, 30.07.20 11:58
Ratings: 0 negative/0 positive



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

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

26.01.2021 05:11:19 exec: 0.36
Mem: 1.518 Mb

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