Object reference not set to an instance of an object

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

    Object reference not set to an instance of an object

    Hallo zusammen,

    irgend etwas muss ich hier wohl noch instanziieren. Da bin ich glaube ich noch nicht objektorientiert genug!

    VB.NET-Quellcode

    1. Dim Selection As Excel.Range = Range("A1")
    2. Selection = Globals.tblXY.Range("A1").CurrentRegion
    3. Dim excelApp As New Microsoft.Office.Interop.Excel.Application()
    4. Dim workSheet As Microsoft.Office.Interop.Excel._Worksheet = excelApp.ActiveSheet
    5. Selection = Globals.tblXY.Range(workSheet.Cells(1, 2), workSheet.Cells(Selection.Rows.Count, Selection.Columns.Count))

    Folgende Meldung erscheint beim ausführen:
    Object reference not set to an instance of an object
    Die Meldung zeigt auf "Selection". Aber die ist doch bereits befüllt und soll nur um die erste Zeile (Spaltenköpfe) gekürzt werden.
    Für einen Hinweis wäre ich sehr dankbar!

    Edit by ~blaze~:
    *vb-Tag eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Wenn Du recht hast, dann ist es Cells. Laut MSDN:
    Ruft ein Range-Objekt ab, das alle Zellen im Arbeitsblatt darstellt (und nicht nur die derzeit verwendeten Zellen)
    Wie kann ich denn sonst ein Range-Objekt mit der Anzahl Zeilen und Spalten beschreiben?

    Edit by ~blaze~:
    Die Farbe rot ist den Moderatoren vorbehalten
    --> *rot zu orange umgewandelt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Mäxchen schrieb:

    soll nur um die erste Zeile (Spaltenköpfe) gekürzt werden.
    Mit

    VB.NET-Quellcode

    1. Globals.tblXY.Range(workSheet.Cells(1, 2), workSheet.Cells(Selection.Rows.Count, Selection.Columns.Count))
    kürzt du aber die erste Spalte und nicht die erste Zeile ;)
    Ausserdem hast du hinterher einen Teufel voll leerer Zellen in deiner Selektion.

    Was ist denn Globals.tblXY ?
    Ein anderes Worksheet?
    Du willst einem Worksheet ein Range-Objekt eines anderen Sheet zuweisen? Das geht nicht.
    Dich interessieren doch eigentlich nur die Adressen.

    Mein Ansatz wäre

    VB.NET-Quellcode

    1. Selection = Globals.tblXY.Range("A2:" & worksheet.UsedRange.SpecialCells(xlCellTypeLastCell).Address)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die Zeilen-Spalten-Verwechselung war mir zwischenzeitlich aufgefallen, trotzdem Danke.
    Vielen Dank auch für die Idee. Ich habe die Zeile noch auf die 2010er Version upgedated

    Quellcode

    1. Imports Ex = Microsoft.Office.Interop.Excel
    2. Selection = Globals.tblXY.Range("A2:" & workSheet.UsedRange.SpecialCells(Ex.XlCellType.xlCellTypeLastCell).Address)
    aber wieder kommt in der Fehlermeldung 1. Zeile:"NullReferenceExeption was unhandled by user code" und in 2. Zeile: s. Überschrift meines Themas. Die Meldung zeigt auf xlCellTypeLastCell. Im Endeffekt benötige ich ein Array mit Spaltenköpfen und eins für die Daten. Ich habs jetzt auch mal als Schleife geschrieben

    Quellcode

    1. For j = 1 To Selection.Columns.Count
    2. sArrHead(j) = Selection.Cells(1, j).Value
    3. Next j
    Dieses Mal zeigt er auf Value mit wieder der gleichen Fehlermeldung! Es ist zum aus der Haut fahren.

    Auch habe ich die Verwendung von Cells noch nicht ganz durchschaut. Oben habe ich ja MSDN zitiert und mit

    Quellcode

    1. Me.Application.Cells.Select()
    werden definitiv alle Zellen der Tabelle angesprochen, andererseits gibt es auch in der Literatur Beispiele wie Sh.Cells(1,1).Value also muss das doch auch in Visual Studio gehen.

    Und mit

    Quellcode

    1. Imports System.Diagnostics
    2. Imports Ex = Microsoft.Office.Interop.Excel
    3. Imports Office = Microsoft.Office.Core
    4. Imports Microsoft.Office.Interop
    5. Imports System.Runtime.InteropServices
    sollten doch auch alle Verweise gesetzt sein.
    ich erklärma Syntax:

    Also mittm . - Operator wird von einem Objekt ein Member aufgerufen, das kann eine Methode, eine Property oder eine Variable sein.

    Wenn das Objekt Nothing ist, gibts deine NullReferenceException, denn Nothing hat keinen Member, den man aufrufen könnte.

    Daher, wenn diese Exception kommt, musst du gucken - wo stehen diese Punkte?
    Der Ausdruck vor einem Punkt bezeichnet ein Objekt, von dem was abgerufen wird.
    ZB
    Selection.Cells(1, j)
    bezeichnet eine bestimmte Excel-Zelle. In dem Ausdruck ist aber selbst wieder ein Punkt, denn auch Selection ist ein Objekt. Also gibts in

    VB.NET-Quellcode

    1. sArrHead(j) = Selection.Cells(1, j).Value

    zwei Objekte, die Nothing sein können: Einmal Selection,
    und zum annern Selection.Cells(1, j).

    Tatsächlich ists noch komplizierter, denn die '()' rufen auch einen Member eines Objekts ab. Daher ists auch möglich, dass sArrHead Nothing ist.

    Wie stellt man fest, ob ein Ausdruck Nothing ergibt?
    also Leute, die zu dumm sind, um den Umgang mit der IDE richtig zu erlernen, können einen Ausdruck an eine Variable zuweisen, und dann einen Haltepunkt setzen. Wenn der Code dann hält, fahrense mitte Maus über die Variable, und bekommen ggfs. angezeigt: "Nothing".

    VB.NET-Quellcode

    1. dim oTester As Object = Selection.Cells(1, j)
    2. dim i=9 'hier den Haltepunkt

    Intelligentere Leute lernen lieber, wie man die Schnellüberwachung nutzt, das Lokal-Fenster, Aufrufeliste und weitere Debug-Techniken.
    Lernt man am besten aus dieses Buch Lesen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Wer Globals kennt sollte diese Frage nicht stellen müssen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mangafreak1995“ ()

    Sry, es ist ein Interface : msdn.microsoft.com/en-us/library/envdte.globals.aspx

    Huppella falscher Link, aber ich meine es gibt einen Namespace der heißt Globals und mit dem konnte man überall drauf zugreifen solange es public war. Globals bezieht sich auf alles aus dem Projekt.
    Erst einmal vielen Dank ErfinderDesRades, das hat mich jetzt schon deutlich weitergebracht. Tatsächlich lag der Fehler links vom Gleichheitszeichen, da hätte ich noch lange gesucht!

    Quellcode

    1. 'Die Lösung ist:
    2. Public sArrHead() As String = {""}
    3. 'statt
    4. Public sArrHead() As String

    Und mit "globals", Mangafreak hat natürlich recht, kann man von jedem Modul oder jeder Klasse auf eine andere zugreifen. Super praktisch! Schön wenn eingefleischte VBler in diesem Thema auch noch etwas neues kennenlernen können.
    Die Bildungslücke gebe ich gerne zu.
    Den Globals-Namespace kannte ich nicht.

    Aber ich kann überlegen so lange ich will, mir fällt keine vernünftige Einsatzmöglichkeit ein.
    Irgendwie sträubt sich etwas im Innern meiner OOP-Seele, quer über alle Klassen hinweg fremde Strukturen zu bearbeiten.
    Das ist ja noch schlimmer als GOTO zu verwenden ;)

    Vielleicht ergibt sich ja eines Tages die Situation, dass man mit Parametern oder Delegates nicht mehr weiter kommt, dann werde ich mich daran erinnern, aber bis dahin versuche ich diesen Namespace so gut wie möglich zu vermeiden.

    Oder kennt jemand eine vernünftige Einsatzmöglichkeit von "Globals", die nicht jeglichem OOP-Ansatz widerspricht?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Es gibt keinen Globals - Namespace.
    Globals ist ein Schlüsselwort, mit dem man Klassen auch dann spezifizieren kann, wenn es andernfalls zu Verwechslungen mit gleichnamigen Klassen (oder Sub-Namespaces) im lokalen Namespace käme.

    Ist ganzngar OOP, nur muß man wissen, wasses bedeutet.
    Ich wusste nicht was Globals vom Typ ist. Aber da das jetzt geklärt ist, ist ja gut.