Hallo, bin inzwischen kurz vor dem Aufgeben, ich hoffe hier kenn mir jemand weiterhelfen. Ich möchte Daten aus einer Excel-Datei als Referenz in VB.Net2005 einlesen. Habe dazu auch schon was gefunden: http://www.activevb.de/tipps/vb6tipps/tipp0050.html Jedoch ist das mit VB6 und funktioniert mit vb.net 2005 nicht. Den Verweis auf Excel habe ich gemacht, aber es will einfach nicht. Kann mir jemand weiterhelfen? Am liebsten wäre mir der umgang wie im VB6-Beispiel gezeigt wird.
Als erstes musst du über Projekt->Verweis hinzufügen->COM einen Verweis auf Excel hinzufügen (müsste ungefähr so heißen: "Microsoft Excel 11.0 Object Library"). Code: Dim Excel1 As New Excel.Application Excel1.Workbooks.Open("C:\excel.xls") Excel1.Visible = True 'deine Operationen (z.B. Excel1.Range("A2").Select() Excel1.ActiveWorkbook.Close() Excel1.Workbooks.Close() Excel1.Visible = False
Noch ein Tipp: Falls du nicht weißt, welchen Code du für welche Operation brauchst kannst du in Excel über Extras->Makro->"Aufzeichenen..." eine Makroaufnahme starten. Dann manuell deine Operationen durchführen und dann die Aufnahme beenden. Nun kannst du dir über Extras->Makro->Visual Basic-Editor deine durchgeführten Aktionen als VB-Code anschauen und in dein VB.NET Projekt kopieren.
Schau Dir mal folgendes openbook an: http://www.galileocomputing.de/openbook/vb_net/ Beispiele/Anleitung zu Dateioperation und speziell zu Excell, funktioniert alles wunderbar. Viel Erfolg.
hallo, ich bin per zufall mal hier gelandet weil ich auch was suche um mit vb.net excel dateien bearbeiten möchte, aber vb meckert schon bei Dim Excel1 As New Excel.Application den verweis hab ich auch gemacht, aber das einzige was ich auswählen kann wenn ich "excel." tippe, ist "Form1" und "My" kann mir wer da nen tip geben? thx schonmal
Wahrscheinlich heißt dein Projekt "excel". Versuche es mal mit einem anderen Projektnamen. Dann müßte es funktionieren.
also das projekt heißt nu nicht mehr excel und nu bekomm ich nur die meldung: der typ excel.application ist nicht definiert und das wars :/
im VB-Manager Unter Extras->Verweise dort sollte Excel aktiviert sein. Ich hatte so ein ähnliches problem als ich von Word aus auf ein Excel-Sheet zugreifen wollte mfg Azrael
thx für die hilfe, mit: Dim Excel1 As New Microsoft.Office.Interop.Excel.Application funktionierts nun
Hallo zusammen. ich habe ein änliches problem, ich möchte mit vb.net aus excel daten auslesen. bin anfänger und komme da irgendwie nicht weiter, hat mir jemand ein beispielcode. Danke gruss
Liefern die über deiner Anfrage stehenden Antworten nicht genug Informationen? In Excel gibt es einen Makrorekorder, wenn man ihn verwendet kann man sich das erzeugte Makro als Code anschauen. Auf die selben Objekte, in der gleichen Weise, kann man auch in VB.Net zugreifen. Also einfacher ist nur noch jemanden dafür zu bezahlen, dass er es einem programmiert. Beispielcode ist im Netz genügend zu finden oder du benutzt erstmal die Links die hier im Thread angegeben sind.
habe es mir zu herzen genommen. öffnen kann ich nun das Excel dokument. habe mich schlau gemacht unter den links, übrigens prima infos. nun habe ich doch gewisse probleme mit einlesen besser gesagt auslesen. wie kann ich den wert der Zelle weiter verwenden wie in eine Variable schreiben. und wie wieder zurück. danke für die Hilfe
>wie kann ich den wert der Zelle weiter verwenden wie in eine Variable >schreiben. und wie wieder zurück. Dein Hauptproblem ist wahrscheinlich das du erstmal nicht weisst wie das Objekt heisst ,das du verwenden musst. Also benutze den Makrorekorder in Excel. Mache das was du machen willst und stoppe den Makrorekorder und schau dir das erzeugte Makro im Quellcode an. Das ist VBA Code der ist eigentlich gleich, du siehst wie er zugreift und welche Objekte er benutzt. Diese kannst du auch benutzen über Microsoft.Office.Interop.Excel.xx xx für das jeweilige Object in Excel (muss natürlich mit Dim ... erzeugt werden. Mit dieser Methode kommt man eigentlich sehr weit. Wenn nicht, sollte man sich ein Buch zur Einführung erstmal zu Gemüte führen. Also für deine Frage: Makrorecorder an klicke auf die Zelle ,ändere deren Wert Makrorecorder aus Schau dir das Makro an verstehe es und schmeiss das überflüssige raus. Mach den Zugriff von VB aus.
ok so unrecht hast du ja nicht, ich verstehe hier nicht mehr alles. ein Variablen inhalt wie ein Name übergebe ich der Funktion. Nun möchte ich den wert ins Excel übertragen, aber das ziel wäre es, wenn es den Namen schon gibt, in der Zweiten spalte hochzählen. nun stehe ich mal an, wie bringe ich den wert denn ich über die Funkton bekommen habe in eine Celle, sorry das schaffe ich nun nicht. habe nun mal den Code hier, ergibt eine Fehlermeldung. Private Function Schreiben(ByVal Name As String) As String Dim Excel1 As New Excel.Application Excel1.Workbooks.Open("G:\Import\2005\import.xls") Excel1.Visible = True Dim xlsDatei As Excel.Workbook Dim xlsTabelle As Excel.Worksheet Dim xlsZelle As String xlsZelle = cstr(xlsTabelle.Cells(2, 1)) 'hier stürzt das programm siehe Fehlermeldung MsgBox(xlsZelle) Excel1.Save() Excel1.Workbooks.Close() Excel1.Quit() End Function Fehlermeldung: Zusätzliche Information: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. das Buch habe ich hier, aber es hilft mir leider nicht weiter. Danke für die Hilfe und geduld
>Excel1.Workbooks.Open("G:\Import\2005\import.xls") das ist eine Funktion. Die liefert dir ein Workbookobjekt zurück mit diesem musst du arbeiten! Die Fehlermeldung ist absolut korrekt >Fehlermeldung: Zusätzliche Information: Der Objektverweis wurde nicht >auf eine Objektinstanz festgelegt. du hast mit deinem >Dim xlsTabelle As Excel.Worksheet ein (anderes) Worksheet erzeugt ohne Workbook und versuchst in diesem auf die Zellen zuzugreifen. Du willst aber (denke ich) auf das Worksheet von G:Import... zugreifen also benutze auch dessen WorkbookObjekt.
Hallo, ich hab Probleme den oben angeführten Code zu implementieren. Zum einen bietet er mir statt xlApp = New Excel.Application, das : xlApp = New Excel._ExcelApplication an und zum zweiten gibt es bei Excel.Workbooks kein Open... Eingebunden hab ich die Bibliothek... Es hat den Anschein als findet er die Typen gar nicht. Hat da wer vielleicht eine hilfreiche Idee zu? Danke!
Also ich habe mir jetzt mal den Beitrag komplett durchgelesen und wohl auch zum größten Teil verstanden. Das Öffnen des Excel-Blattes klappt wunderbar. Nur wie kann ich den Inhalt einer bestimmten Excel-Zelle in einem bestimmten Tabellenblatt als Wert an eine Variable innerhalb meines Programms übergeben? Nach etlichem Rumprobieren bin ich nun schon so weit, dass ich per "intellisense" (dieses komische "Autovervollständigen" von Visual Studio) einfach alle Kombinationen ausprobiere. Aber das kann es ja nicht sein. Mein Code: Private Sub read_from_xls(ByVal Pfad As String) Dim Dateiname As String = Dir(Pfad & "\*.xls") Dim Quellpfad As String = Pfad & Dateiname ' ### Excel-Dokument öffnen ### Dim Excel1 As New Excel.Application Excel1.Workbooks.Open(Quellpfad) Excel1.Visible = False Try ' ### Datenoperationen ### Dim Wert As String = Excel1.Range("C5") ' * Hier ist der Fehler * MessageBox.Show(Wert, "Inhalt der Zelle") Catch ex As Exception MessageBox.Show(ex.Message, "Fehler") End Try ' ### Excel und Anwendung schließen ### Excel1.Workbooks.Close() Me.Close() End Sub
>Aber das kann es ja nicht sein nein das ist es wirklich nicht... Es gibt 2 Möglichkeiten: Entweder du liest ein Buch oder du gehst in Excel machst das was du willst und zeichnest es mit dem Makrorekorder auf. Dann hast du den Code den du brauchst. >Dim Wert As String = Excel1.Range("C5") ' * Hier ist der >Fehler * Range ist eine Klasse, du hast bis jetzt nichts getan um eine Objektinstanz davon zu erzeugen, also wundere dich nicht das du darauf auch nicht zugreifen kannst.
>Es gibt 2 Möglichkeiten: >Entweder du liest ein Buch oder du gehst in Excel machst das was du >willst und zeichnest es mit dem Makrorekorder auf. Dann hast du den >Code den du brauchst. Genau da liegt mein Problem: Ich muss noch diese Woche fertig werden und habe daher keine Zeit noch fröhlich in einem Buch zu schmökern. >Range ist eine Klasse, du hast bis jetzt nichts getan um eine >Objektinstanz davon zu erzeugen, also wundere dich nicht das du darauf >auch nicht zugreifen kannst. Und wie kann ich eine Objektinstanz davon erzeugen und auf den Inhalt der Zelle zugreifen? Denn deine Antwort ist so nicht wirklich hilfreich. (ich soll das Projekt noch diese Woche fertig bekommen und habe daher keine Zeit noch mal fröhlich ein Buch zu kaufen und ausführlich darin zu schmökern)
Ok, wenn ich folgendes mache Label2.Text = Excel1.Range("C1").Value dann zeigt er mir den korrekten Wert im Label an. Allerdings funktioniert es so nicht: Dim Wert As String = Excel1.Range("C5").Value MessageBox.Show(Wert, "Inhalt der Zelle") Was muss ich ändern, damit mir die MessagBox den Wert übernimmt?
Schon gut. Dim Wert As String = Excel1.Range("C1").Value MessageBox.Show(Wert, "Inhalt der Zelle") funktioniert doch. Ich hatte bloß die falsche Zelle angegeben (eine ohne Inhalt). kopfklatsch Naja, Dummheit ist auch eine natürliche Begabung...
Ähm, eine Sache wäre da noch: Nehmen wir mal an, die Daten die ich haben will liegen nun nicht in Tabellenblatt1. Wie komme ich da ran?
Hey, warum poste ich hier eigentlich? Nur um meine eigenen Texte zu lesen? Scheint so, denn auch für das Wechseln des Tabellenblattes habe ich die Lösung nun selbst gefunden (das man hier als Gast nicht editieren kann stört ganz schön). Egal. --> Excel1.Sheets("Tabelle2").Select() Mein letztes Problem ist aber, dass er Excel nicht richtig beendet. Ich mache das folgendermaßen: ' ### Excel und Anwendung schließen ### Excel1.ActiveWorkbook.Close() Excel1.Workbooks.Close() Excel1.Application.Quit() Allerdings behält er Excel in der Liste der Anwendungen, wenn man schnell hintereinander auf die Datei zugreift. Versucht man es dann wieder, bekommt man die nette Meldung, dass die Datei geöffnet ist und man nur schreibgeschützte darauf zugreifen kann.
Es ist schön deinen Gedankengängen zu folgen... ;-) >Excel1.ActiveWorkbook.Close() >Excel1.Workbooks.Close() >Excel1.Application.Quit() Du hast die Applikation zwar geschlossen , aber hast in VB das Objekt noch nicht freigegeben , solange du dies nicht tust bleibt excel im Speicher. Nur als Anmerkung: Wenn du eine Datei aufmachst bekommst du ein neues Workbook das dein ActiveWorkbook wird. Dieses besteht aus Worksheets. und auf jedem Worksheet kannst du arbeiten z.b. ein Range machen. Es wäre sauberer, das was du tust über das Activeworkbook zu tun, besonders da du es am Ende wieder schließt.
>Es wäre sauberer, das was du tust über das Activeworkbook zu tun, >besonders da du es am Ende wieder schließt. Wärst du so nett, mir das als Beispielcode zu posten? ' ### Excel-Dokument öffnen ### Dim Excel1 As New Excel.Application Excel1.Workbooks.Open(Quellpfad) Excel1.Sheets("Tabelle2").Select() Excel1.Visible = False ' ### Datenoperationen ### ' Meine Operationen ' ### Excel und Anwendung schließen ### Excel1.ActiveWorkbook.Close() Excel1.Workbooks.Close() Excel1.Visible = False Excel1.Application.Quit()
Meinst du so? ' ### Excel-Dokument öffnen ### Dim Excel1 As New Excel.Application Excel1.ActiveWorkbook.Open(Quellpfad) Excel1.Sheets("Tabelle2").Select() Excel1.Visible = False ' ### Datenoperationen ### ' Meine Operationen ' ### Excel und Anwendung schließen ### Excel1.ActiveWorkbook.Close() Excel1.Visible = False Excel1.Application.Quit()
Excel1.ActiveWorkbook.sheets... oder Excel1.ActiveWorkbook.Worksheets... bei sheets bekommst du noch zusätzlich die Diagrammblätter beide sollte dir den gleichen zugriff erlauben, du machst halt nur sichtbar das du die ganze Zeit mit dem ActiveWorkbook arbeitest. Das gibt einen saubereren und besser lesbaren Code.
Also, nochmal genaueres zu meinem Problem: Ich starte mein Programm und drücke den Button "Auslesen" (der Code unter ist dort hinterlegt). Er zeigt mir den Wert an und im Task-Manager von Windows erscheint Excel. Allerdings bleibt es auch dort, obwohl laut Code ja die Applikation wieder beendet werden soll. Drückt man jetzt nochmal auf den Button, hat man Excel in der Taskliste zwei Mal stehen usw. Erst beim Schließen meines Programms verschwinden Excel wieder aus der Liste. Habe jetzt folgendes gemacht: Try ' ### Excel-Dokument öffnen ### Dim Excel1 As New Excel.Application Excel1.ActiveWorkbook.Open(Quellpfad) Excel1.ActiveWorkbook.Sheets("Tabelle2").Select() Excel1.ActiveWorkbook.Visible = False ' ### Datenoperationen ### ' bla ' ### Excel und Anwendung schließen ### Excel1.ActiveWorkbook.Close() Excel1.Application.Quit() Catch ex As Exception MessageBox.Show(ex.Message, "Fehler") End Try Allerdings wird dann die Exception ausgelöst: "Objektvariable oder WithBlock-Variable wurde nicht festgelegt" ------------------ Anderes Problem: Ich möchte, dass er mir automatisch alle Zellen mit Inhalt ausliest. Die Spaltenzahl ist festgelegt, aber die Zeilenzahl kann variieren. Mit welchem Befehl kann ich denn die verwendeten Zeilen zählen lassen? Versucht habe ich schon: Dim Zeilenzahl As String = Excel1.Rows.Count() Allerdings bekomme ich dann einen Wert um die 65000 (max. Zahl der Zellen in Excel), es müssten aber drei sein.
> Excel1.Application.Quit() danach wie schon gesagt Objekt freigeben excel1=nothing so war es zumindest in VB6 Danach ist Excel1 ungültig >Catch ex As Exception > MessageBox.Show(ex.Message, "Fehler") >End Try >Allerdings wird dann die Exception ausgelöst: "Objektvariable oder >WithBlock-Variable wurde nicht festgelegt" d.h. irgendwo in deinem tryblock hat es gekracht, kannst du das mal eingrenzen? >Excel1.ActiveWorkbook.Open(Quellpfad) Das Open solltest du aber nicht mit dem Activeworkbook machen, das wird erst nach dem Open dein Activeworkbook! Wenn du schon kein Buch lesen willst dann lies wenigstens ein bisschen in der MSDN. Arbeiten mit Microsoft Excel Objekten wäre da ein passender Artikel.
Habe jetzt mal etwas mit dem Auskommentieren probiert: Der Fehler tritt in dem Moment auf, in dem ich irgendwo "ActiveWorkbook." mit reinschreibe. Keine Ahnung wieso. Das "Mulitples-Excel"-Problem besteht auch dann, wenn ich "Open" ohne das "ActiveWorkbook" mache und wenn ich am Ende "Excel1 = Nothing" schreibe. ------------------ Zu meinem anderen Problem: Fällt dir dazu noch was ein?
>Zu meinem anderen Problem: >Fällt dir dazu noch was ein? Usedrange Sag mal schaust du überhaupt in die MSDN? Activeworkbook setzt voraus, dass dein Workbook das aktive ist. Die Methode mit dem Makrorekorder bringt einen schnell vorwärts, ersetzt aber nicht das Lesen eines Buches oder der MSDN. Sonst kommt da zusammengeschusterter Code raus der bei dir funktioniert, aber wenn Excel noch was anderes aufhat geht es voll vor den Baum. Die Zusammenhänge von Workbook, Worksheet und Range sind sind wichtig für die Programmierung mit Excel.
>Sag mal schaust du überhaupt in die MSDN? Ja, das tue ich: http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/modcore/html/deovrWorkingWithMicrosoftExcelObjects.asp Da gibt es einen Unterabschnitt genau über das Thema "Usedrange"... theoretisch zumindest. Denn beim Aufruf dieser Seite erhält man nur einen Server-Fehler. indieEckesetzundheul Scheinbar hat irgend jemand was dagegen, dass ich dieses Projekt beende. Hast du zufällig noch nen anderen Link, wo ich mir dieses Thema zu Gemüte führen könnte? ---------- Das mit dem Beenden von Excel scheint aber an meinem Computer zu liegen. Nach ca. drei Minuten fängt er an (fast) alle Excel-Anwendungen aus der Task-Liste zu schmeißen. Es scheint also doch mehr oder weniger zu funktionieren.
Noch eine Anmerkung: Dim Endwert As String = Excel1.Sheets("Tabelle1").Usedrange.Count funktioniert. Allerdings zählt er den gesamten verwendeten Bereich, nicht die verwendeten Zeilen (was der Wert wäre, den ich benötige). Da ich die Spaltenzahl kenne, kann ich notfalls die Zeilenzahl daraus errechnen, aber gibt es da nicht eine elegantere Lösung?
>*indieEckesetzundheul*
Ich finde es schon etwas verwunderlich das man Projekte schreibt ohne
die MSDN zu Hause zu haben. Wenn ein Link nicht funktioniert gibt es
immer noch die VBA Hilfe von Excel. Also mach den Teppich nicht so
nass... ;-)
Usedrange gibt ein Rangeobjekt zurück und das gibt dir auch
Eigenschaften wie Columns und Rows zurück.
Ich weiß ja nicht ob du dein Problem inzwischen gelöst hast, aber... Wenn du dt als DataTable deklarierst in dem die Excel-Tabelle drin ist, sieht der Code eigentlich so aus: For i as Integer = 0 to dt.rows.count - 1 Me.BindingContext.Item(dt).Position += 1 Next MessageBox.Show("Es sind " & i & " Zeilen in ihrer Arbeitsmappe.")
Danke für den Hinweis, aber von den Datatables bin ich inzwischen komplett weg, weil ich deren Handhabung nicht hinbekommen habe. Momentan kümmere ich mich nur noch um das lästige Debugging...
Hallo, so ein schöner Thread für Anfänger, vielen Dank, habe zum Thema mir schon Stunden mit google verbracht. Das galileo-openbook/vb_net bringt mir zB. gar nichts: http://www.galileocomputing.de/openbook/vb_net/msvb040002.htm ich muß nochmals neu anfangen: Code: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim Excel1 As New Excel.Application Excel1.Workbooks.Open("C:\excel.xls") Excel1.Visible = True 'deine Operationen (z.B. Excel1.Range("A2").Select() Excel1.Range("C1").Value = messwertA ' mein Bsp. Excel1.ActiveWorkbook.Close() Excel1.Workbooks.Close() Excel1.Visible = False End Sub -------------------------- Mir ist nicht klar, warum bei jedem BuutonClick eine neue Exceldatei erzeugt wird? Ich will immer den Wert in Excel1.Range("C1") überschreiben. Wie kann ich einfach in eine geöffnete Excelmappe zB. in Range("C1") meine Messwerte nacheinader rein(über)schreiben? Ich habe das teure (50.-EUR) Buch Excel-Programmierung, aber die dortige Beschreibung auf Seite 80, "Der Zugriff auf geöffnete Arbeitmappen kann über drei unterschiedliche Eigenschaften erfolgen...", bringt mir leider nichts! Z.B. steht dort: ActiveWorkbook ist die Arbeitsmappe, die momentan aktiv ist. Ja schön! Aber was soll ich in meinen Code schreiben? Danke
Entschuldigung! Code: Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim Excel1 As New Excel.Application Excel1.Workbooks.Open("C:\excel.xls") Excel1.Visible = True 'deine Operationen (z.B. Excel1.Range("A2").Select() Excel1.Range("C1").Value = messwertA ' mein Bsp. ' Diesen Teil habe ich auskommentiert, ActiveWorkbook soll offen bleiben 'Excel1.ActiveWorkbook.Close() 'Excel1.Workbooks.Close() 'Excel1.Visible = False End Sub --------------------------
Das sollte doch zB. funktionieren? Excel1.Workbooks("Mappe1").Activate() Geöffnete Mappe ist Mappe1.
Hier hat es noch ein super einfaches Bsp.: http://support.microsoft.com/kb/306022/de Dim oExcel As Object Dim oBook As Object Dim oSheet As Object 'Start a new workbook in Excel. oExcel = CreateObject("Excel.Application") oBook = oExcel.Workbooks.Add 'Add data to cells of the first worksheet in the new workbook. oSheet = oBook.Worksheets(1) oSheet.Range("A1").Value = "Last Name" oSheet.Range("B1").Value = "First Name" oSheet.Range("A1:B1").Font.Bold = True oSheet.Range("A2").Value = "Doe" oSheet.Range("B2").Value = "John" 'Save the Workbook and quit Excel. oBook.SaveAs(sSampleFolder & "Book1.xls") oSheet = Nothing oBook = Nothing oExcel.Quit() oExcel = Nothing GC.Collect() Aber ich komme immer noch nicht drauf, wie ich das Workbook offen lassen könnte, um dann zB. die Namen, "Doe" u. "John" in Range("A2") Range("B2") zu überschreiben. Kann da jemand einen Tip geben? Danke
Falls der Endkunde nicht die selbige Excel Version wie Du auf Deiner Entwicklerkiste hat. Dim MyConnection As System.Data.OleDb.OleDbConnection Dim myPath As String = "Path of the File" Try ''''''' Fetch Data from Excel Dim DtSet As System.Data.DataSet Dim MyCommand As System.Data.OleDb.OleDbDataAdapter MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; data source='" & myPath & " '; " & "Extended Properties=Excel 8.0;") ' Select the data from Sheet of the workbook. MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [sheet1$]", MyConnection) DtSet = New System.Data.DataSet MyCommand.Fill(DtSet) ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' dgViewSample.DataSource = DtSet dgViewSample.DataBind() MyConnection.Close() Catch ex As Exception Dim er As String MyConnection.Close() lese ich die Daten lieber direkt. Gruss Manage
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.