Можно поподробнее? Как передавать данные в эксель я в курсе, а вот как получать, и как потом быть с экселем? "Глушить"процесс?Можно заполнять тот же Excel в фоне, делать вычисления. затем импортировать данные.
If Not wApp Is Nothing Then
Call wApp.quit()
Set wApp = nothing
End If
Use {OSInterface_Lib} 'Библиотека для работы с Temp
'Обьявим переменные для работы с Excel
Dim exApp As Variant, exAppWbk As Variant, wb As Variant
Dim i As Long, row As Long, row1 As Long, row2 As Long
'Обьявим переменные для работы с юзерским %Temp%
Dim tmpDir As String, tmplFileName As String, tmplName As String, FileName As String
'Обьявим массив для работы со значениями electro, Firm, eDT
Dim keyArr( 2 ) As String
'Обьявим переменные для работы с окном выбора дат
Dim eDT As NotesDateTime
'Обьявим переменные для работы с ServiceDesk.nsf
Dim docSD As NotesDocument, dbSD As NotesDatabase, ndcSD As NotesDocumentCollection, sbV As NotesView
'Обьявим переменные для работы с intfirm.nsf
Dim docIF As NotesDocument, dbIF As NotesDatabase, ndcIF As NotesDocumentCollection
Dim docIF1 As NotesDocument, ndcIF1 As NotesDocumentCollection
'Обьявим переменные для работы с template.nsf
Dim dbTE As NotesDatabase, ndcTE As NotesDocumentCollection, ritmTE As NotesRichTextItem
'Обьявим переменные для работы с RentPayments.nsf
Dim docRP As NotesDocument, dbRP As NotesDatabase
'Обьявим переменные для работы с массивом keyArr
Dim docByKey As NotesDocument, ndcByKey As NotesDocumentCollection
Sub Initialize
Dim wsC As New NotesUIWorkspace
Dim sesC As New NotesSession
Dim dbC As NotesDatabase
Set dbC = sesC.CurrentDatabase
Dim docC As New NotesDocument( dbC )
'Вызываем окно по форме ParamsForReport и берем значение из этой формы
If Not wsC.DialogBox( {ParamsForReport}, True, True, , , , False, {Параметры для отчета}, docC, True ) Then Goto endh
Set eDT = New NotesDateTime( {01.} & docC.GetItemValue( {selMonth} )( 0 ) & {.} & docC.GetItemValue( {selYear} )( 0 ) )
keyArr( 0 ) = {electro}
keyArr( 2 ) = CStr( Year( edt.DateOnly ) ) & {-} & Trim( CStr( Month( edt.DateOnly ) ) )
'Из базы template.nsf берем шаблон по полю RentElectroCalculation и кладем его в tmpDir = "C:\Users\user\AppData\Local\Temp"
tmpDir = OSI_GetUserTemp()
Set dbTE = sesC.GetDatabase( {domi/org}, {scat_escado\template.nsf} )
Set ndcTE = dbTE.Search( {(Form="TemplateOffice") & (Code="RentElectroCalculation")}, Nothing, 0 )
Set docC = ndcTE.GetFirstDocument
Set ritmTE = docC.GetFirstItem( {Body} )
'Цикл обрабатывает встроенные элементы, кладет в объект E то что нашел
ForAll e In ritmTE.EmbeddedObjects
tmplFileName = {tmpl_} & e.Name 'Получает имя из объекта е и добовляет к нему tmpl_
Call e.ExtractFile(tmpDir & tmplFileName ) 'Извлекаем полученный фаил в юзерский Temp
Exit ForAll
End ForAll
Set ritmTE = Nothing 'Разрушаем объект ritm
'Подключаемся к базе ServiceDesc
Set dbSD = sesC.GetDatabase( {domi/org}, {scat_escado\ServiceDesc.nsf} )
Set sbV = dbSD.GetView( {(ServiceByElectro)} )
'Подключаемся к базе intfirm.nsf и обрабатываем коллекцию всех документов в базе
Set dbIF = sesC.GetDatabase( {domi/org}, {scat_escado\intfirm.nsf} )
Set ndcIF = dbIF.AllDocuments
Set docIF = ndcIF.GetFirstDocument
'В базе intfirm.nsf перебираем все документы и берем поле Firm
While Not ( docIF Is Nothing )
Print docIF.GetItemValue( {Firm} )( 0 )
Call ProcessDoc( docIF )
Set docIF = ndcIF.GetNextDocument( docIF )
Wend
'Закрытие Excel и уничтожаем tmpDir & tmplFileName
Call exApp.Quit()
Kill tmpDir & tmplFileName
'IsObject проверяет, является значение выражения ссылкой на некоторый объект exApp и повторно закрываем Excel
If Isobject( exApp ) Then Call exApp.Quit()
endh:
End Sub
Sub ProcessDoc( doc As NotesDocument )
Dim sesC As New NotesSession
'Берем поле Firm из базы intfirm и сравниваем с видом (ServiceByElectro) по первому столбцу
keyArr(1) = doc.GetItemValue({Firm})(0)
Set ndcByKey = sbV.GetAllDocumentsByKey( keyArr, True )
If ndcByKey.Count < 1 Then GoTo endh
Set docByKey = ndcByKey.GetFirstDocument
If docByKey.GetItemValue({Arendator})(0) = "" Then GoTo endh
'Создание документа в базе Оплата аренда
Set dbRP = sesC.GetDatabase( {domi/org}, {scat_escado\RentPayments.nsf} )
Set docRP = dbRP.CreateDocument
Call docRP.ReplaceItemValue({Form}, {PaymentElectro} )
Call docRP.ReplaceItemValue({ExtFirm}, keyArr( 1 ) )
Call docRP.ReplaceItemValue( {StopDate}, edt )
Call docRP.ReplaceItemValue( {Date}, edt )
'Берем внутреннюю фирму и номер договора
Set dbIF = sesC.GetDatabase( {domi/org}, {scat_escado\intfirm.nsf} )
Set ndcIF1 = dbIF.Search( {(Form="uslug") & @IsMember( "Электроэнергия";uslugpodog) & (Arendator = "} & Replace(doc.GetItemValue( {Firm} )( 0 ), {"}, {\"} ) & {")}, Nothing, 0 )
Set docIF1 = ndcIF1.GetFirstDocument
If Not ( docIF1 Is Nothing ) Then
Call docRP.ReplaceItemValue( {IntFirm}, docIF1.GetItemValue( {intfirm} )( 0 ) )
Call docRP.ReplaceItemValue( {numdog}, docIF1.GetItemValue( {datenumdog} )( 0 ) )
End If
Call docRP.ComputeWithForm( True, False )
Call docRP.Save( True, False )
'Создание Excel по шаблону RentElectroCalculation
tmplName = tmpDir & tmplFileName
Set exApp = CreateObject( {Excel.Application} )
exApp.Visible = False
Call exApp.Workbooks.Add( tmplName )
Set wb = exApp.ActiveWorkbook
row = 10
row1 = 6
While Not ( docByKey Is Nothing )
i = 0
While i<=UBound(docByKey.Tariffs)
'Заполнение листа Арендатор и перенос значений из Excel в поля pdoc
exApp.Sheets("Показания Арендатор").Select
'Поиск по форме Elcount по полю коэффициент трансформации и проставление коэффициента в excel шаблоне
Set ndcSD = dbSD.Search({Form = "Elcount" & numsch = "}&docByKey.Tariffs(i)&{" }, Nothing,0)
'Один счетчик на 2 арендатора
If docByKey.Tariffs(i) = "03854324" Then
If ndcSD.Count > 0 Then
Set docSD = ndcSD.Getfirstdocument
wb.Application.Range( {E} & Trim(CStr( row1 ) ) ).Value = docSD.ktr(0)
wb.Application.Range( {K} & Trim(CStr( row1 ) ) ).Value = docSD.sitesinstall(0) + " " + docSD.sitesinstallNum(0)
End If
wb.Application.Range( {C} & Trim(CStr( row1 ) ) ).Value = docByKey.Arendator(0)
wb.Application.Range( {D} & Trim(CStr( row1 ) ) ).Value = docByKey.Tariffs(i)
wb.Application.Range( {F} & Trim(CStr( row1 ) ) ).Value = docByKey.PrevTsumm(i)
wb.Application.Range( {G} & Trim(CStr( row1 ) ) ).Value = docByKey.tSumm(i)
wb.Application.Range( {I} & Trim(CStr( row1 ) ) ).Value = 4
row1 = row1 + 1
GoTo nt
End If
'Один счетчик на 1 аренадатора
If ndcSD.Count > 0 Then
Set docSD = ndcSD.Getfirstdocument
wb.Application.Range( {E} & Trim(CStr( row ) ) ).Value = docSD.ktr(0)
wb.Application.Range( {K} & Trim(CStr( row ) ) ).Value = docSD.sitesinstall(0) + " " + docSD.sitesinstallNum(0)
End If
wb.Application.Range( {C} & Trim(CStr( row ) ) ).Value = docByKey.Arendator(0)
wb.Application.Range( {D} & Trim(CStr( row ) ) ).Value = docByKey.Tariffs(i)
wb.Application.Range( {F} & Trim(CStr( row ) ) ).Value = docByKey.PrevTsumm(i)
wb.Application.Range( {G} & Trim(CStr( row ) ) ).Value = docByKey.tSumm(i)
wb.Application.Range( {I} & Trim(CStr( row ) ) ).Value = 4
Call docRP.ReplaceItemValue( {summ}, wb.Application.Range( {summ} ).Value )
row = row + 1
nt:
i = i + 1
Wend
Set docByKey = ndcByKey.GetNextDocument( docByKey )
Wend
'Присвоение Excel файлу дата + имя, сохранение Excel файла и закрытие Excel
FileName = tmpDir & Replace(CStr(Date), ".", "" ) & {_electro.xlsx}
Call wb.SaveAs( FileName )
Call wb.Close()
Call exApp.Quit()
'Прикрипление Excel документа в поле Comment в pdoc и сохранение pdoc
Dim rti As New NotesRichTextItem( docRP, {Comment} )
Call rti.EmbedObject( EMBED_ATTACHMENT, {}, FileName, {} )
Call docRP.ComputeWithForm( True, False )
Call docRP.Save( True, False )
'Уничтожаем FileName
Kill FileName
endh:
End Sub
Option Public
Option Declare
Private Const LibName = {OSInterface_lib}
Function OSI_GetUserTemp As String
Dim funcName As String
funcName = {OSI_GetUserTemp}
On Error Goto errh
Dim objWshShell As Variant
Set objWshShell = CreateObject( {WScript.Shell} )
Dim objWshEnvironment As Variant
Set objWshEnvironment = objWshShell.Environment( {USER} )
Dim tmpPaths As Variant
tmpPaths = objWshShell.ExpandEnvironmentStrings( objWshEnvironment( {TEMP} ) )
Set objWshEnvironment = Nothing
Set objWshShell = Nothing
If Isarray( tmpPaths ) Then
OSI_GetUserTemp = Cstr( tmpPaths( 0 ) )
Else
OSI_GetUserTemp = Cstr( tmpPaths )
End If
If Right( OSI_GetUserTemp, 1 ) <> {\} Then OSI_GetUserTemp = OSI_GetUserTemp & {\}
Goto endh
errh:
Error Err, LibName & {: } & funcName & {: строка } & Erl & {:} & Chr(13) & Error$
endh:
End Function
к чему есть претензии:
-инициализация объекта эхеля и его убиение - непозрачно
-использование эхеля как такового - есть POI
-нахаркодены имена полей (очень сложно менять/поддерживать)
-стринги в тексте ф-ций
этот код просто заносит/получает данные их эхеля?
Function fullcost (doc As NotesDocument, Dates() , fullPay() As Double) As Double ' Dates() - массив из разницы дней, fullPay() - массив платежей
Dim p,i,j,n As Integer
Dim psk As Double
Dim pstep As Double ' шаг
n = doc.Months(0)
psk = CInt (doc.Percent(0))/100
p = 0
ReDim Preserve finDate (n) As Integer
j=0
For i = 0 To n
finDate(i)= j+Dates(i)
j=finDate(i)
p = p + fullPay(i) / ((1 + psk) ^ Dates(i) / 365)
Next i
j=0
pstep = 0.01
While j <> 20
Do
psk=psk+pstep
p=0
For i = 0 To n
p = p + fullPay(i) / ((1 + psk) ^ (finDate(i) / 365))
Next i
Loop While p>0
j=j+1
pstep = pstep/(-2)
Do
psk=psk+pstep
p=0
For i = 0 To n
p = p + fullPay(i) / ((1 + psk) ^ (finDate(i) / 365))
Next i
Loop While p<0
j=j+1
pstep = pstep/(-2)
Wend
fullcost = psk*100
End Function
Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab