我正在使用未经处理的文档,因此它仅在选定文档上运行,但在选择后,它会在视图中查找列值以将文档导出到Excel。我使用下面的代码工作正常,但我的第一个文件总是在excel表中的所有其他导出文档后显示在最后。知道可以用代码做什么,以便导出的文档在视图中按顺序显示。
请查看以下用于导出的代码 -
Sub Initialize
'On Error Goto errhandler
On Error Resume Next
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doccoll As NotesDocumentCollection
Dim view As NotesView
Dim doc As NotesDocument
Dim otherdoc As NotesDocument
Set db = session.CurrentDatabase
Set view = db.GetView("CRMOpenIssue")
Set doccoll=db.UnprocessedDocuments
Set oExcel = CreateObject ( "Excel.Application" )
Set oWorkbook = oExcel.Workbooks.Add
Set oWorkSheet= oWorkbook.Sheets ( 1 )
oWorkSheet.Cells(1,1).value="Quote# "
oWorkSheet.Cells(1,2).value="Quote Line#"
oWorkSheet.Cells(1,3).value="Customer - fab"
oWorkSheet.Cells(1,4).value="OppNum"
oWorkSheet.Cells(1,5).value="OppLine#"
oWorkSheet.Cells(1,6).value="Open Issue#"
oWorkSheet.Cells(1,7).value="Open Issue"
oWorkSheet.Cells(1,8).value="Category"
oWorkSheet.Cells(1,9).value="Due date"
oWorkSheet.Cells(1,10).value="Owner to resolve issue"
'oWorkSheet.Cells(1,11).value="Owner/PME Verify when closed"
oExcel.Worksheets(1).Range("A1:J1").Font.Bold = True
oExcel.columns("A:A").ColumnWidth=15.00
oExcel.columns("B:B").ColumnWidth=8.00
oExcel.columns("C:C").ColumnWidth=15.00
oExcel.columns("D:D").ColumnWidth=10.00
oExcel.columns("E:E").ColumnWidth=8.00
oExcel.columns("F:F").ColumnWidth=8.00
oExcel.columns("G:G").ColumnWidth=30.00
oExcel.columns("H:H").ColumnWidth=30.00
oExcel.columns("I:I").ColumnWidth=15.00
oExcel.columns("J:J").ColumnWidth=15.00
'oExcel.columns("K:K").ColumnWidth=30.00
row% = 1
offset% = 0
lastOffset% = 0
If doccoll.count >1 Then 'if more than one doc selected then confirm
resp = Messagebox("Do you want to export only the " & _
"selected " & doccoll.count & " documents?", 36, "Selected only?" )
Else
Messagebox "Exporting all rows. (To export only selected " & _
"rows tick those required in the left margin first.)"
End If '6= yes
oExcel.visible=True
Dim i As Integer
If resp=6 Then 'selected documents
Set doc = doccoll.GetFirstDocument
While Not doc Is Nothing
If resp=6 Then
'row% = offset% + 2
If y="" Then
row% = row% + 2
Else
row%=row%+y+1
End If
col% = 0 'Reset the Columns
Set otherdoc = view.getnextdocument(doc)
If otherdoc Is Nothing Then
Set otherdoc = view.getprevdocument(doc)
If otherdoc Is Nothing Then
Print " >1 doc should be selected"
End
Else
Set otherdoc = view.getnextdocument(otherdoc)
End If
Else 'got next doc
Set otherdoc = view.getprevdocument(otherdoc)
End If
End If
Forall colval In otherdoc.ColumnValues
col% = col% + 1
If Isarray(colval) Then
''If col%=10 Then ''''''''
columnVal=Fulltrim(colval)
For y = 0 To Ubound(columnVal)
offset% = row% + y +lastOffset%
'offset% = row% + y
oWorkSheet.Cells(offset%,col%).value = columnVal(y)
'i=offset%
Next
Else
oWorkSheet.Cells(row%, col%).value = colval
'offset% = offset% + 1
End If
'''' oWorkSheet.Cells(row%, col%).value = colval '''''
'''''''End If''''''''
End Forall
Set doc = doccoll.GetNextDocument(doc)
Wend
End if
答案 0 :(得分:1)
虽然我同意Ben,Alexey和Ken的观点,但我认为问题的一部分未被触及 - 当你ColumnValues
时,你如何导出NotesDocumentCollection
:< / p>
无论您是使用NotesDatabase.UnprocessedDocuments
还是NotesUIView.Documents
获取所选文档,以上情况都是如此,两者都会在查看操作中使用时返回所选文档。
我过去遇到过类似的问题,虽然我没有代码,但我会尝试描述一个可行的解决方案:
这是一个工作测试,使用另一种方法检查循环中的当前ViewEntry
是否实际上是所选文档之一:
Sub Click(Source As Button)
Dim selectedDc As NotesDocumentCollection
Dim tempDoc As NotesDocument
Dim allVec As NotesViewEntryCollection
Dim tempVe As NotesViewEntry
Dim thisView As NotesView
Dim thisDb As NotesDatabase
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim thisUiView As NotesUIView
Set thisUiView = ws.CurrentView
Set selectedDc = thisUiView.Documents
If (selectedDc.Count = 0) Then
Messagebox "No selected documents!"
Exit Sub
End If
Set thisDb = session.CurrentDatabase
Set thisView = thisUiView.View
Set allVec = thisView.AllEntries
Set tempVe = allVec.GetFirstEntry
While Not tempVe Is Nothing
If (tempVe.IsDocument) Then
Set tempDoc = selectedDc.GetDocument(thisDb.GetDocumentByUNID(tempVe.UniversalID))
If Not (tempDoc Is Nothing) Then
Messagebox Cstr(tempVe.ColumnValues(1))
End If
End If
Set tempVe = allVec.GetNextEntry(tempVe)
Wend
End Sub
注意:这是一个相当古老的问题,但是我发布这个答案是因为从选定的文档到按照它们在视图中出现的顺序导出它们的棘手部分。
答案 1 :(得分:0)
我认为你可以删除整个部分:
Set otherdoc = view.getnextdocument(doc)
If otherdoc Is Nothing Then
Set otherdoc = view.getprevdocument(doc)
If otherdoc Is Nothing Then
Print " >1 doc should be selected"
End
Else
Set otherdoc = view.getnextdocument(otherdoc)
End If
Else 'got next doc
Set otherdoc = view.getprevdocument(otherdoc)
End If
结束如果
我不确定你的目的是什么,但看起来你正在测试选择了多个文档。您可以通过测试doccoll.count属性轻松完成此任务:
If doccoll.count <=1 Then 'etc...
然后只需将您的Forall语句更改为doc而不是otherdoc:
Forall colval In doc.ColumnValues ...
答案 2 :(得分:0)
我也完全不明白这个循环的用途。 UnprocessedDocuments只是一个NotesDocumentsCollection。您可以在while循环或类似循环中使用GetFirstDocument / GetNextDocument来浏览它。警告表示没有选择任何文件应该放在第一位,而不是在循环中。
Set db = session.CurrentDatabase
Set doccoll = db.UnprocessedDocuments
If doccoll.Count = 0 Then
Print " >1 doc should be selected"
Exit Sub
End If
之后,进行Excel初始化和循环
Set doc = doccoll.GetFirstDocument
While Not doc Is Nothing
' enter code here'
Set doc = doccoll.GetNextDocument(doc)
Wend
关于列,我会仔细检查。 NotesDocument只是一个总是应该表现相同的对象。但Notes是Notes ...我也会检查并给你一个反馈。