I have a program in VB.net that generates PDF files from items in a datagridview. It loops through the datagridview, determines what type of file it is, opens the file, saves a PDF, and closes the file. Often, these lists use several worksheets from the same Excel file, each with it's own entry in the datagridview. To prevent the sub from constantly opening and closing the same Excel file 20 times, I am trying to keep the file open if the next item in the list is the same file.
Here is the problem. If the list has a different Excel file than the first one, I get this error:
System.Runtime.InteropServices.COMException: 'Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))'
on this line:
xl.Workbooks(WorkbookName).Sheets(CurrentSheet).ExportAsFixedFormat(0, FileName:=ReportPath & "\" & PDFName)
Here is the full code (irrelevant lines have been eliminated for efficiency):
Sub PrepareForPDF()
Dim xl As Object
Dim DocPath As String
Dim ReportPath As String
Dim CurrentFile As String
Dim CurrentBook As Excel.Workbook
Dim CurrentSheet As String
Dim PDFName As String
Dim WorkbookName As String
Dim WbOpen As Boolean = False
DocPath = Form1.txtSourcePath.Text.ToString
ReportPath = Form1.txtSavePath.Text.ToString
'Loop through DGV, generate a PDF of each file
For i As Integer = 0 To Form1.DataGridView1.Rows.Count - 1
CurrentFile = DocPath & "\" & Form1.DataGridView1(1, i).Value.ToString
'Build the PDF file name
PDFName = Form1.DataGridView1(0, i).Value.ToString & " - " & Form1.DataGridView1(1, i).Value.ToString
If Form1.DataGridView1(2, i).Value.ToString = "Excel" Then
PDFName += " - " & Form1.DataGridView1(3, i).Value.ToString
End If
PDFName += ".pdf"
'Generate PDF based on file type - eliminated other file types for efficiency
If Form1.DataGridView1(2, i).Value.ToString = "Excel" Then
WorkbookName = Form1.DataGridView1(1, i).Value.ToString
CurrentSheet = Form1.DataGridView1(3, i).Value.ToString
If WbOpen = False Then
xl = New Excel.Application
xl.Workbooks.Open(FileName:=CurrentFile, UpdateLinks:=False)
CurrentBook = xl.ActiveWorkbook
Else
CurrentBook = xl.ActiveWorkbook
End If
CurrentBook.Sheets(CurrentSheet).ExportAsFixedFormat(0, FileName:=ReportPath & "\" & PDFName)
If i < Form1.DataGridView1.Rows.Count - 1 Then
If Form1.DataGridView1(1, i + 1).Value.ToString = WorkbookName Then
WbOpen = True
End If
Else
WbOpen = False
CurrentBook = Nothing
xl.Workbooks(WorkbookName).Close(False)
xl.Quit()
ReleaseObject(xl)
End If
End If
Next
xl = Nothing
End Sub
I did some debugging, and it appears that it is not properly reassigning the CurrentBook variable to a new Excel file but rather keeping the value of an old one.
User contributions licensed under CC BY-SA 3.0