|
|
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, All. Отчет печатается из VFP. Шаблон для этого отчета расположен в базе данных. Надо добавить в получившийся отчет в Экселе макрос для печати и кнопку для вызова этого макроса в панели инструментов. Макрос написать удалось. А как добавить его в открытый экселевский файл и прописать там кнопку для вызова этого макроса пока не знаю. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2007, 18:27:17 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp FoxPro у меня отсутствует, так что все опробовалось из-под Word’а: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Чтобы стало возможно обращаться к объектам VBProject нужно в Excel’е разрешить соответствующий доступ: Сервис > Макрос > Безопасность > Надежные источники > Доверять доступ к Visual Basic Project В приведенном примере создается новая книга, сохраняется в корне диска С, в книгу добавляется модуль "myModule", и в него добавляется процедура "mySub". В панель "Стандартная" Excel’я добавляется кнопка с изображением "Принтера" (можно создать и отдельную панель с кнопкой). На кнопку вешается процедура "mySub". Никаких проверок существования книги на диске, существования кнопки на панели "Стандартная" не ведется. Во всем этом деле мне лично не нравится все что связано с кнопкой. Дело в том, что кнопка доступна для любой книги Excel’я – это раз. В существующем варианте каждый раз будет добавляться новая кнопка к уже существующим – это два. Можно конечно удалять кнопку при закрытии книги-отчета и создавать ее при каждом новом открытии. В общем что-то нужно придумывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2007, 18:13:50 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Не мог отвечать в форуме по техническим причинам.:-( Спасибо, lena_####. А как можно изменить ваш код, чтобы макрос писался не в новую книгу, а в существующую? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2007, 17:26:21 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp В первом приближении нужно заменить строки: Код: plaintext 1. Код: plaintext По хорошему еще нужно добавить проверку существования модуля "myModule" и в нем процедуры "mySub". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2007, 22:22:01 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
А можно ли сделать этот макрос без открытия книги, а в текущей? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 10:08:12 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Применяю такой код: Sub s_st(x as string) Dim v_Xl, v_Wb, v_VBComp, v_CM, v_CBar, v_CBarCtrl Dim v_Code As String, v_File As String, v_Macro As String v_File = "D:\program\Client\"+x+".htm" v_Macro = "mySub" Set v_Xl = CreateObject("Excel.Application") Set v_Wb = v_Xl.Workbooks.Open(v_File) Set v_VBComp = v_Wb.VBProject.VBComponents.Add(1) v_VBComp.Name = "myModule" Set v_CM = v_VBComp.CodeModule v_Code = "sub " & v_Macro & "()" & vbCrLf v_Code = v_Code & " Debug.Print Worksheets.Count" & vbCrLf v_Code = v_Code & " For Each mysheet In Worksheets" & vbCrLf v_Code = v_Code & " ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True" & vbCrLf v_Code = v_Code & " Next mysheet" & vbCrLf v_Code = v_Code & " Set mysheet = Nothing" & vbCrLf v_Code = v_Code & "End Sub" v_CM.AddFromString v_Code Set v_CBar = v_Xl.CommandBars.Item("Standard") v_CBar.Visible = True Set v_CBarCtrl = v_CBar.Controls.Add(msoControlButton) With v_CBarCtrl .Caption = "PrintReport" .FaceId = 4 .TooltipText = "Макрос приаттачен к книге " & v_File .OnAction = v_File & "!" & v_VBComp.Name & "." & v_Macro End With v_Xl.Visible = True v_Xl.quit End Sub Но Эксель стал выдавать такое сообщение: Microsoft Office Excel ожидает завершения OLE-операции другим приложением Как с этим бороться? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2007, 18:41:08 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp Может я ошибаюсь, но у меня сложилось впечатление, что макрос, который обсуждается здесь (в моем варианте его имя s, в Вашем s_st) запускается из под Excel'я. Я вообще-то подразумевала, что он будет запускаться из-под какого-то стороннего приложения. Если мои предположения верны и все запускается из-под Excel'я, то его нужно видоизменить (по крайней мере, нет смысла создавать еще один процесс Excel'я). Растолкуйте мне бестолковой поподробней, что же все-таки и в какой последовательности должно происходить по Вашему сценарию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 11:29:19 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
2 lena_#### Теперь у меня стало получаться загружать и запускать из стороннего приложения макрос в Экселе. Поэтому теперь надо написать макрос,который бы в текущей книге делал кнопку из кода которой бы запускался другой загруженный макрос. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2007, 17:55:35 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
lena_#### Заработал такой вариант: Sub st1() Dim v_Xl, v_Wb, v_VBComp, v_CM, v_CBar, v_CBarCtrl Dim v_Code As String, v_File As String, v_Macro As String v_Macro = "mySub" Set v_Xl = GetObject(, "Excel.Application") Set v_Wb = v_Xl.ActiveWorkbook Set v_VBComp = v_Wb.VBProject.VBComponents.Add(1) v_VBComp.Name = "myModule" Set v_CM = v_VBComp.CodeModule v_Code = "sub " & v_Macro & "()" & vbCrLf v_Code = v_Code & "call Макрос2()" & vbCrLf v_Code = v_Code & "End Sub" v_CM.AddFromString v_Code Set v_CBar = v_Xl.CommandBars.Item("Standard") v_CBar.Visible = True Set v_CBarCtrl = v_CBar.Controls.Add(msoControlButton) With v_CBarCtrl .Caption = "PrintReport" .FaceId = 4 .TooltipText = "Макрос приаттачен к книге " & v_File .OnAction = v_File & "!" & v_VBComp.Name & "." & v_Macro End With v_Xl.Visible = True End Sub Но теперь в панели инструментов кнопок очень много. Может перед созданием кнопки удалить все аналогичные кнопки из панели? Каким кодом это можно сделать? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2007, 17:50:08 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp Вариантов борьбы с этим явлением можно придумать несколько. На мой взгляд лучшим был бы такой: Созданную кнопку удалять при закрытии соответствующей книги (событие Workbook_BeforeClose), прятать при дезактивации книги (событие Workbook_Deactivate), показывать при активации книги (событие Workbook_Activate) и вновь создавать (проверяя, есть ли она уже в наличии) при открытии книги (событие Workbook_Open). Но т.к. полные очертания Вашего проекта мне до сих пор не ясны (несомненно в силу моей бестолковости), то ограничусь лишь советом – проверять есть ли кнопка в наличии перед попыткой ее создания, и если есть – то лишь менять ее TooltipText (если это вообще нужно – на работоспособность кнопки это не влияет т.к. это всего лишь всплывающая подсказка), и, что гораздо важней, менять приаттаченый макрос (свойство OnAction). Короче говоря, в выложенном Вами примере (кстати, а чем вам не нравится подсветка кода – вполне удобная фича) замените строки кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. на Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Ну и конечно же удалите сначала все лишние кнопки с предыдущих попыток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2007, 18:53:21 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
lena_#### Спасибо. Теперь кнопки не повторяются. Правда обнаружилась еще одна проблема. Если отчет печатается в двух книгах, то макросы одной книги не доступны для кнопки в другой книге. Что можно предпринять в сложившейся ситуации? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2007, 19:14:38 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp А скажите, Вы свою процедуру: Код: plaintext 1. 2. запускаете из-под какого приложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2007, 20:45:57 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
lena_#### Процедуру Sub st1() запускаю из приложения на VFP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 10:24:26 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
lena_#### А возможно ли из макроса добавить кнопку не в панель инструментов, а на новый лист в текущей книге? Тогда кнопка будет доступна только в текущей книге. На каждой книге делать такую кнопку для печати. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 11:46:58 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Sub st1() Dim lcClickCode As String ActiveWorkbook.Sheets.Add ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _ , DisplayAsIcon:=False, Left:=82.5, Top:=80.25, Width:=438.75, Height _ :=196.5).Select lcClickCode = "Private Sub CommandButton1_click()" + Chr(13) + "Call Макрос2()" + Chr(13) + "End Sub" ActiveSheet.OLEObjects.CommandButton1.CodeModule.addfromstring (lcClickCode) End Sub В текущей книге добавляю новый лист. На нем создаю кнопку. Но прикрепить к ней код на нажатие не получается. На строке: ActiveSheet.OLEObjects.CommandButton1.CodeModule.addfromstring (lcClickCode) выдается ошибка. Как можно программно прикрепить к кнопке код на нажатие? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 16:11:26 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fpНа строке: ActiveSheet.OLEObjects.CommandButton1.CodeModule.addfromstring (lcClickCode) выдается ошибка. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2007, 19:28:40 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ,White Owl. Только теперь надо добавлять в книгу лист с программно задаваемым именем. Возможно ли такое? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 10:57:59 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Нашел в этом форуме, что переименовать лист в Экселе можно командой: Activesheet.Name="oper" Правда сейчас ошибка стала возникать на команде: ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _ , DisplayAsIcon:=False, Left:=144, Top:=162.75, Width:=161.25, Height _ :=53.25).Select Как можно программно добавить на активный лист кнопку? Спасибо. Эксель 2003,СП2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 11:49:26 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp Может в Вашем случае проще создать шаблон отчета (что-то типа Report.xlt) со всякими разными кнопками, макросами и т.п. и потом просто создавать файл на основе этого шаблона и добавлять в него данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 18:15:28 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
lena_#### Формирование отчетов через шаблоны (.xlt) в программе используются. Но в данном случае отчет формируется в формате .html и выводиться через Эксель.Надо в открытый Эксель добавить страницу,кнопку на эту страницу и прикрепить к этой кнопке код на событие Click. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 19:20:01 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Вот вариант с кнопкой другого типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2007, 20:00:57 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
Спасибо, lena_####. Кнопка заработала. Правда теперь необходим макрос,который бы печатал все листы книги поочереди и обходил бы страницу, на которой расположена кнопка запуска этого макроса. У меня был вариант: Sub Макрос2() Attribute Макрос2.VB_Description = "Макрос записан 25.01.2007 (ххх)" Attribute Макрос2.VB_ProcData.VB_Invoke_Func = " \n14" ' ' Макрос2 Макрос ' Макрос записан 25.01.2007 (ххх) ' ' For Each mysheet In Worksheets ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Next mysheet Set mysheet = Nothing End Sub Но этот вариант сейчас не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 12:24:53 |
|
||
|
Печать отчета из VFP с созданием макроса.
|
|||
|---|---|---|---|
|
#18+
igor_fp Вот вариант для печати всех листов кроме листа с именем "Лист1": Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2007, 12:59:33 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=34328053&tid=2183417]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 293ms |

| 0 / 0 |
