Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Печать отчета из VFP с созданием макроса. / 24 сообщений из 24, страница 1 из 1
26.01.2007, 18:27:17
    #34286520
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Здравствуйте, All.
Отчет печатается из VFP. Шаблон для этого отчета расположен в базе данных.
Надо добавить в получившийся отчет в Экселе макрос для печати и кнопку для
вызова этого макроса в панели инструментов.
Макрос написать удалось. А как добавить его в открытый экселевский файл и прописать там кнопку для вызова этого макроса пока не знаю.
Спасибо.
...
Рейтинг: 0 / 0
28.01.2007, 18:13:50
    #34288163
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
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.
Sub s()
  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 = "C:\01.xls"
  v_Macro = "mySub"
  Set v_Xl = CreateObject("Excel.Application")
  Set v_Wb = v_Xl.Workbooks.Add
  v_Wb.SaveAs (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 & "  MsgBox ""получилось!""" & vbCrLf
  v_Code = v_Code & "' код поцедуры" & 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

Чтобы стало возможно обращаться к объектам VBProject нужно в Excel’е разрешить соответствующий доступ: Сервис > Макрос > Безопасность > Надежные источники > Доверять доступ к Visual Basic Project

В приведенном примере создается новая книга, сохраняется в корне диска С, в книгу добавляется модуль "myModule", и в него добавляется процедура "mySub". В панель "Стандартная" Excel’я добавляется кнопка с изображением "Принтера" (можно создать и отдельную панель с кнопкой). На кнопку вешается процедура "mySub". Никаких проверок существования книги на диске, существования кнопки на панели "Стандартная" не ведется. Во всем этом деле мне лично не нравится все что связано с кнопкой. Дело в том, что кнопка доступна для любой книги Excel’я – это раз. В существующем варианте каждый раз будет добавляться новая кнопка к уже существующим – это два. Можно конечно удалять кнопку при закрытии книги-отчета и создавать ее при каждом новом открытии. В общем что-то нужно придумывать.
...
Рейтинг: 0 / 0
07.02.2007, 17:26:21
    #34313536
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Не мог отвечать в форуме по техническим причинам.:-(
Спасибо, lena_####.
А как можно изменить ваш код, чтобы макрос писался не в новую книгу, а в существующую?
Спасибо.
...
Рейтинг: 0 / 0
07.02.2007, 22:22:01
    #34314216
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fp

В первом приближении нужно заменить строки:
Код: plaintext
1.
  Set v_Wb = v_Xl.Workbooks.Add
  v_Wb.SaveAs (v_File)
на
Код: plaintext
  Set v_Wb = v_Xl.Workbooks.Open(v_File)

По хорошему еще нужно добавить проверку существования модуля "myModule" и в нем процедуры "mySub".
...
Рейтинг: 0 / 0
08.02.2007, 10:08:12
    #34314798
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
А можно ли сделать этот макрос без открытия книги,
а в текущей?
Спасибо.
...
Рейтинг: 0 / 0
08.02.2007, 18:41:08
    #34317161
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Применяю такой код:
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-операции другим приложением
Как с этим бороться?
Спасибо.
...
Рейтинг: 0 / 0
09.02.2007, 11:29:19
    #34318336
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fp

Может я ошибаюсь, но у меня сложилось впечатление, что макрос, который обсуждается здесь (в моем варианте его имя s, в Вашем s_st) запускается из под Excel'я. Я вообще-то подразумевала, что он будет запускаться из-под какого-то стороннего приложения.
Если мои предположения верны и все запускается из-под Excel'я, то его нужно видоизменить (по крайней мере, нет смысла создавать еще один процесс Excel'я). Растолкуйте мне бестолковой поподробней, что же все-таки и в какой последовательности должно происходить по Вашему сценарию.
...
Рейтинг: 0 / 0
09.02.2007, 17:55:35
    #34320242
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
2 lena_####
Теперь у меня стало получаться загружать и запускать из стороннего приложения макрос
в Экселе. Поэтому теперь надо написать макрос,который бы в текущей книге делал кнопку
из кода которой бы запускался другой загруженный макрос.
Спасибо.
...
Рейтинг: 0 / 0
13.02.2007, 17:50:08
    #34328053
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
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
Но теперь в панели инструментов кнопок очень много.
Может перед созданием кнопки удалить все аналогичные кнопки из панели?
Каким кодом это можно сделать?
Спасибо.
...
Рейтинг: 0 / 0
13.02.2007, 18:53:21
    #34328263
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fp

Вариантов борьбы с этим явлением можно придумать несколько. На мой взгляд лучшим был бы такой:
Созданную кнопку удалять при закрытии соответствующей книги (событие Workbook_BeforeClose), прятать при дезактивации книги (событие Workbook_Deactivate), показывать при активации книги (событие Workbook_Activate) и вновь создавать (проверяя, есть ли она уже в наличии) при открытии книги (событие Workbook_Open). Но т.к. полные очертания Вашего проекта мне до сих пор не ясны (несомненно в силу моей бестолковости), то ограничусь лишь советом – проверять есть ли кнопка в наличии перед попыткой ее создания, и если есть – то лишь менять ее TooltipText (если это вообще нужно – на работоспособность кнопки это не влияет т.к. это всего лишь всплывающая подсказка), и, что гораздо важней, менять приаттаченый макрос (свойство OnAction).
Короче говоря, в выложенном Вами примере (кстати, а чем вам не нравится подсветка кода – вполне удобная фича) замените строки кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  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

на

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  Dim v_CtrlExist As Boolean 'в этой переменной будем хранить флаг - есть ли кнопка
  Set v_CBar = v_Xl.CommandBars.Item("Standard")
  For Each v_CBarCtrl In v_CBar.Controls         'в цикле по всем кнопкам панели "Стандартная"
    If v_CBarCtrl.Caption = "PrintReport" Then   'проверяем, есть ли кнопка с Caption = "PrintReport"
      v_CtrlExist = True 'если есть - "поднимаем" флаг
      Exit For           'и выходим из цикла
    End If
  Next
  
  If v_CtrlExist = False Then  'если кнопки нет
    Set v_CBarCtrl = v_CBar.Controls.Add(msoControlButton) 'создаем ее
    With v_CBarCtrl
      .Caption = "PrintReport"  'устанавливаем свойство Caption (заголовок)
      .FaceId =  4                'определяем картинку на кнопке (принтер)
    End With
  End If
  
'в любом случае устанавливаем следующие свойства
  With v_CBarCtrl
    .TooltipText = "Макрос приаттачен к книге " & v_File
    .OnAction = v_File & "!" & v_VBComp.Name & "." & v_Macro
  End With
  v_CBar.Visible = True 'делаем панель "Стандартная" видимой (на тот случай, если она невидима) 

Ну и конечно же удалите сначала все лишние кнопки с предыдущих попыток.
...
Рейтинг: 0 / 0
14.02.2007, 19:14:38
    #34331454
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
lena_####

Спасибо. Теперь кнопки не повторяются.
Правда обнаружилась еще одна проблема.
Если отчет печатается в двух книгах, то макросы одной книги
не доступны для кнопки в другой книге.
Что можно предпринять в сложившейся ситуации?

Спасибо.
...
Рейтинг: 0 / 0
14.02.2007, 20:45:57
    #34331554
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fp

А скажите, Вы свою процедуру:

Код: plaintext
1.
2.
Sub st1()
'
End Sub

запускаете из-под какого приложения?
...
Рейтинг: 0 / 0
15.02.2007, 10:24:26
    #34332320
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
lena_####
Процедуру Sub st1()
запускаю из приложения
на VFP.
...
Рейтинг: 0 / 0
15.02.2007, 11:46:58
    #34332646
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
lena_####
А возможно ли из макроса добавить
кнопку не в панель инструментов, а на новый лист в текущей книге?
Тогда кнопка будет доступна только в текущей книге.
На каждой книге делать такую кнопку для
печати.
Спасибо.
...
Рейтинг: 0 / 0
15.02.2007, 16:11:26
    #34334027
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
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)
выдается ошибка.
Как можно программно прикрепить к кнопке код на нажатие?
Спасибо.
...
Рейтинг: 0 / 0
15.02.2007, 19:28:40
    #34334862
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fpНа строке:
ActiveSheet.OLEObjects.CommandButton1.CodeModule.addfromstring (lcClickCode)
выдается ошибка.
Код: plaintext
1.
lcClickCode = "Private Sub CommandButton1_click()" + Chr( 13 ) + "Call Макрос2()" + Chr( 13 ) + "End Sub"
Application.ActiveWorkbook.VBProject.VBComponents("Sheet1").CodeModule.AddFromString lcClickCode 
...
Рейтинг: 0 / 0
16.02.2007, 10:57:59
    #34335770
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Спасибо за ответ,White Owl.
Только теперь надо добавлять в книгу лист с программно
задаваемым именем. Возможно ли такое?
Спасибо.
...
Рейтинг: 0 / 0
16.02.2007, 11:49:26
    #34335966
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Нашел в этом форуме, что
переименовать лист в Экселе можно командой:
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
...
Рейтинг: 0 / 0
16.02.2007, 18:15:28
    #34337522
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fp

Может в Вашем случае проще создать шаблон отчета (что-то типа Report.xlt) со всякими разными кнопками, макросами и т.п. и потом просто создавать файл на основе этого шаблона и добавлять в него данные?
...
Рейтинг: 0 / 0
16.02.2007, 19:20:01
    #34337661
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
lena_####
Формирование отчетов через шаблоны (.xlt) в программе
используются. Но в данном случае отчет формируется в формате .html
и выводиться через Эксель.Надо в открытый Эксель добавить страницу,кнопку
на эту страницу и прикрепить к этой кнопке код на событие Click.
...
Рейтинг: 0 / 0
16.02.2007, 20:00:57
    #34337737
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Вот вариант с кнопкой другого типа:

Код: 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.
Sub st1()
  Dim v_Xl, v_Wb, v_Sh, v_VBComp, v_CM, v_Btn
  Dim v_Code As String, v_Macro As String
  
  Set v_Xl = GetObject(, "Excel.Application")
  Set v_Wb = v_Xl.ActiveWorkbook 'получаем ссылку на активную рабочую книгу
  Set v_Sh = v_Wb.Worksheets.Add          'добавляем лист
  v_Sh.Name = "oper"             'переименовываем лист
  
  Set v_VBComp = v_Wb.VBProject.VBComponents.Add( 1 ) 'добавляем модуль
  v_VBComp.Name = "myModule"                        'называем его "myModule"
  Set v_CM = v_VBComp.CodeModule
  
  v_Macro = "mySub"
  v_Code = "sub " & v_Macro & "()" & vbCrLf
  v_Code = v_Code & "call Макрос2()" & vbCrLf
  v_Code = v_Code & "End Sub"
  v_CM.AddFromString v_Code       'создаем макрос "mySub" в модуле "myModule"
  
  Set v_Btn = v_Sh.Buttons.Add( 247 . 5 ,  71 . 25 ,  173 . 25 ,  38 . 25 ) 'добавляем кнопку
  v_Btn.Caption = "Print Report"   'заголовок кнопки
  v_Btn.OnAction = v_Macro         'приаттаченый макрос
  
  v_Xl.Visible = True
End Sub
...
Рейтинг: 0 / 0
19.02.2007, 12:24:53
    #34340549
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
Спасибо, 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
Но этот вариант сейчас не работает.
...
Рейтинг: 0 / 0
19.02.2007, 12:59:33
    #34340676
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
igor_fp

Вот вариант для печати всех листов кроме листа с именем "Лист1":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub s()
  Dim mysheet As Worksheet
  For Each mysheet In Worksheets
    If mysheet.Name <> "Лист1" Then
      mysheet.PrintOut Copies:= 1 , Collate:=True
    End If
  Next mysheet
End Sub
...
Рейтинг: 0 / 0
19.02.2007, 14:11:49
    #34340977
igor_fp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Печать отчета из VFP с созданием макроса.
lena_####
СПАСИБО!!!
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Печать отчета из VFP с созданием макроса. / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]