Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[vb.net] excel bewerkingen + "an unhandled win32 exception"

Pagina: 1
Acties:
  • 749 views sinds 30-01-2008
  • Reageer

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
Ik wil een enkele cel uit een bestaand excel document uitlezen en gebruik daarvoor onderstaande code (in het project is reference - microsoft excel 11.0 object library toegevoegd)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Imports Excel = Microsoft.Office.Interop.Excel

Public Class frmMain

Private Sub btnExcelUitlezen_Click..........
        Dim inhoud_cell As String

        Dim EXL As New Excel.Application
        Dim WSheet As New Excel.Worksheet

        EXL.Workbooks.Open("c:\test.xls")

        WSheet = EXL.Workbooks.Item(1).Worksheets("Sheet1")
        inhoud_cell = WSheet.Cells(1, 1)
End Sub


op de regel EXL.Workbooks.Open(....) krijg ik een error in het immediate window van visual studio (A first chance exception of type System.Runtime.InteropServices.COMexception occurred in prjExcel.exe). Maar naast deze error krijg ik ook een dialoogscherm van "Visual Studio Just-In-Time Debugger) met "an unhandled win32 exception occurred in prjExcel.vshost.exe ....) Waar ik een debugger kan starten of niet.

dim EXL as new Excel.Application werkt wel want er wordt een proces Excel aangemaakt in windows.

Ik heb al verschillende manieren gebruikt (excel declareren als een object zoals in VB6), maar telkens met dezelfde errors. Nu weet ik niet of het aan de foutieve code ligt of als er een probleem is met visual studio, windows of office....

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10:51

gorgi_19

Kruimeltjes zijn weer op :9

Waarom gebruik je geen OleDB?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
omdat ik eigenlijk geen idee heb hoe dit in zijn werk gaat en omdat ik van de bovenstaande code uitleg + voorbeelden heb in een handboek "mastering visual basic.net".

Maar ik zal eens op het net zoeken achter de manier met OleDB

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10:51

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
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
31
32
33
34
35
36
37
38
39
40
  Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Globals.DataPath & "melp.xls" & ";Extended Properties=""Excel 8.0;"""

                ' ********************************************************************
                '
                ' SQL statement and mapping to the dataset
                '
                ' ********************************************************************
                Using ExcelConnection As OleDbConnection = New OleDbConnection(strConn)

                    Using ExcelCommand As OleDbCommand = New OleDbCommand

                        ExcelCommand.Connection = ExcelConnection

                        Using ExcelAdapter As OleDbDataAdapter = New OleDbDataAdapter(ExcelCommand)

                            ExcelConnection.Open()

                            Dim ExcelSheets As DataTable = ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
                            Dim SpreadSheetName As String = String.Empty

                            For Each dr As DataRow In ExcelSheets.Rows
                                Dim dtLocal As DataTable = ExcelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, dr("TABLE_NAME"), Nothing})
                                Dim columns(dtLocal.Rows.Count - 1) As String
                                Dim K As Integer
                                For K = 0 To dtLocal.Rows.Count - 1
                                    columns(K) = Convert.ToString(dtLocal.Rows(K)(3))
                                Next

                                If dtLocal.Rows.Count >= 2 Then

                                    SpreadSheetName = "[" & dr("TABLE_NAME").ToString() & "]"
                                    Exit For

                                End If

                            Next

                            Dim MyDataset As DataSet = New DataSet
                            ExcelCommand.CommandText = "SELECT * FROM " & SpreadSheetName
                            ExcelAdapter.Fill(MyDataset)

Hier een klein stukje relevante code; daarna moet je er wel mee uit kunnen komen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
ok, bedankt...zal me er eens in verdiepen.
is dit eigenlijk de "beste" methode om te gebruiken in visual studio?

  • mmy841
  • Registratie: Juli 2004
  • Laatst online: 09-07-2021
ik heb onderstaand voorbeeld getest, en dit werkt wel effectief...
code:
1
2
3
4
5
6
7
Dim cn As OleDb.OleDbConnection = New oleDb.OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=c:\test.xls;extended properties=excel 8.0;")
Dim adapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter("select * from [Sheet1$]", cn)
cn.Open()
Dim ds As New DataSet
adapter.Fill(ds)
MsgBox(ds.Tables(0).Rows(0).Item(0))
cn.Close()


Het probleem is nu dat ik de inhoud van cel A2 krijg (maar dit is blijkbaar omdat kolom headers moet definiëren en dan wel een range kan bepalen (bv. select * from [Sheet1]$A4:A4)

Maar dit verondersteld dan ook dat al mijn data in het excel document staat zoals in een tabel, nl zonder witregels, ...

Op het net heb ik een korte uitleg gevonden van de 2 werkwijzen:
- mbv ADO.NET en een connectiestring (dus zoals bovenstaand voorbeeld) werkt goed als de data rij per rij staat, zoals in een tabel. Voordeel is dat deze techniek snel is en weinig resources vergt.

- mbv een referentie naar excel (zoals in mijn 1ste poging) indien de data "verspreid" staan over het werkblad (dus data bv in cel A3, C23, ...) of als de kleur van cellen, ... gewijzigd moet worden.

Dit laatste is dus het geval, dus ik zou nog even met mijn 1ste voorbeeld willen testen. Maar nu weet ik nog niet of de error die ik krijg wordt veroorzaakt door een fout in mijn code of door een ander probleem (referentieprobleem, ...)
Pagina: 1