1

ドキュメントごとに 9 行の情報を表示するビューがあります。このビューでは、以下のコードを使用してドキュメントを Excel にエクスポートする Excel にエクスポートする機能があります。最初の 2 つのドキュメントのデータが正しくエクスポートされません。たとえば、最初のドキュメントに 7 行ある場合、7 行をエクスポートする必要がありますが、2 行しかエクスポートされません。最初の 2 つのドキュメントのみで発生しており、3 番目のドキュメントからは、エクスポートしている情報の行番号に関係なく、完全に優れています。row% のコードを row% = row%+2 から row% = row%+3 、 4 または 5 に変更しようとしましたが、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:K1").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

 If resp=6 Then 'selected documents
  Set doc = doccoll.GetFirstDocument   
  While Not doc Is Nothing
   If resp=6 Then  
    row% = row%+2
    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
     columnVal=Fulltrim(colval)
     For y = 0 To Ubound(columnVal)
      offset% = row% + y +lastOffset%   
      oWorkSheet.Cells(offset%,col%).value = columnVal(y) 
     Next
    Else
     oWorkSheet.Cells(row%, col%).value = colval  
    End If  

   End Forall
   Set doc = doccoll.GetNextDocument(doc)       
  Wend
 Else 'all documents
  Set otherdoc =view.GetFirstDocument  
  While Not otherdoc Is Nothing
   row% = row% + 2
   col% = 0 'Reset the Columns
  'Loop through all the column entries
  'Forall colval In entry.ColumnValues
   Forall colval In otherdoc.ColumnValues
    col% = col% + 1
    If Isarray(colval) Then
     columnVal=Fulltrim(colval)
     For y = 0 To Ubound(columnVal)
      offset% = row% + y +lastOffset%   
      oWorkSheet.Cells(offset%,col%).value = columnVal(y) 
     Next
    Else
     oWorkSheet.Cells(row%, col%).value = colval  
    End If         
   End Forall
   row%=offset%
   Set otherdoc=view.GetNextDocument(otherdoc)
  Wend
 End If
'errhandler:
 Call oExcel.quit()    
 Set oWorkSheet= Nothing
 Set oWorkbook = Nothing
 Set oExcel = Nothing
 Print "Done"
End Sub 
4

3 に答える 3

1

Excel オートメーションを使用しているようです。Excel の自動化は面倒な場合があります。

Excel XLSファイルのNPOIを試してみます。それを見てください。本当に簡単に操作できます:

C# から Excel (.XLS および .XLSX) ファイルを作成する

于 2010-10-25T14:47:37.547 に答える
1

アップロードしたコードに非常に問題があります。最初の If ループは、それに含まれる While ループを閉じる前に閉じるため、If ループを削除または追加する必要があります。そうは言っても、私はテストしていませんが、これはうまくいくはずです。

Option Public
Option Declare

Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doccoll As NotesDocumentCollection
    Dim view As NotesView 
    Dim doc As NotesDocument
    Dim resp As Integer, row As Integer, offset As Integer, nextrow As Integer, col As Integer
    Dim oExcel As Variant
    Dim oWorkbook As Variant
    Dim oWorkSheet As Variant

    On Error GoTo olecleanup

    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:K1").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

    offset% = 0
    nextrow% = 3

    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

    If resp=6 Then 'selected documents
        Set doc = doccoll.GetFirstDocument
        If doccoll.count = 1 Then
            Print " >1 doc should be selected"
        End If
    Else
        Set doc =view.GetFirstDocument
    End if

    While Not doc Is Nothing
        row% = nextrow%
        col% = 0 'Reset the Columns
        nextrow% = row% + 1

        ForAll colval In doc.ColumnValues
            col% = col% + 1
            If IsArray(colval) Then
                offset% = row%
                ForAll cv In colval
                    If CStr(cv) <> "" Then
                        oWorkSheet.Cells(offset%,col%).value = cv
                        offset% = offset% + 1
                    End If
                End ForAll
                If nextrow% < offset% Then nextrow% = offset% 
            Else
                oWorkSheet.Cells(row%, col%).value = colval  
            End If
        End ForAll

        If resp=6 Then 'selected documents
            Set doc = doccoll.Getnextdocument(doc)
        Else
            Set doc =view.Getnextdocument(doc)
        End If
    Wend

    oExcel.activeworkbook.close
    oExcel.quit
    Set oExcel = Nothing

Finish :
    Print "Done"
    Exit Sub

olecleanup :
'   Call LogError() 'Enable to use OpenLog
    If Not(IsEmpty(oExcel)) Then
        oExcel.activeworkbook.close
        oExcel.quit
        Set oExcel = Nothing
    End If
    Resume Finish
End Sub
于 2011-07-27T14:07:29.100 に答える
0

ええと、このコードは間違いなくもっと読みやすくする必要があります、私はあなたが望むことをするためのより簡単な方法があるに違いありません。
OK、「CRMOpenIssue」ビューを何に使用するのか説明できますか?

各ドキュメントがビューで表される行数を忘れて、ビューの列に直接表示されるデータではなく、データソースとしてドキュメントフィールドを使用することをお勧めします。

于 2011-03-05T18:12:12.827 に答える