marcoborn
Goto Top

Structure von Arrays in VB.NET

Hallo Forum,
ich habe 2 Fragen zum Thema Structures in VB.NET:

1. Ist es möglich, in VB.NET eine Structure zu definieren, deren Parameter Arrays sind?
Public Structure MeineStruktur
  Public Spalte1(0 To 100) As Long 
  Public Spalte2(0 To 100) As String
  Public Spalte3(0 To 100) As Long
  Public Spalte4(0 To 100) As Long
  Public Spalte5(0 To 100) As Long
  Public Spalte6(0 To 100) As String
End Structure

2. Nachdem ich die Struktur mit Werten gefüllt habe, möchte ich gern die ganze Struktur in einen Zellbereich in Excel einfügen. Also irgendwas in der Art.
'AppXL ist als Excel-Objekt definiert  
Dim MyStructure as Meine Struktur
...
AppXL.ActiveSheet.Cells = MeineStruktur.Value

Ist das Ganze möglich? Und wie würde der Code für Frage 2 aussehen?

Vielen Dank,
M. Born

Content-ID: 246735

Url: https://administrator.de/contentid/246735

Ausgedruckt am: 24.11.2024 um 15:11 Uhr

colinardo
Lösung colinardo 18.08.2014, aktualisiert am 20.08.2014 um 09:36:40 Uhr
Goto Top
Hallo M.Born,
ja das geht. Du hast hier zwei Möglichkeiten das gewünschte Umzusetzen. Einmal indem du für jede Spalte ein Array definierst (wie du es machen willst) oder es mit einem einzelnen zweidimensionalen Array das du mit allen deinen Werten füllst.(p.s. ich verwende im Beispiel die .NET-Referenz zum Zugriff auf Excel.)
back-to-topBeispiel: Variante 1 mit einem einzelnen zweidimensionalen Array
Public Structure myStruct
  Dim Spalten(,) As Object
End Structure

Sub FillRange()
    Dim objXL As New Excel.Application

    'Struktur erzeugen  
    Dim s As myStruct
    'zweidimensionales Array anlegen (Zeilen,Spalten)  
    s.Spalten = New Object(10, 10) {}

    'Array mit Beispieldaten füllen  
    For c = 0 To 10
        For r = 0 To 10
            s.Spalten(r, c) = "Test" & c & "." & r  
        Next
    Next

    'Excel anzeigen und Workbook und Worksheet referenzieren  
    objXL.Visible = True
    Dim wb As Workbook = objXL.Workbooks.Add()
    Dim ws As Worksheet = wb.Worksheets(1)

    'Array einem Bereich in Excel zuweisen  
    ws.Range("A1").Resize(s.Spalten.GetLength(0), s.Spalten.GetLength(1)).Value = s.Spalten  
End Sub
back-to-topBeispiel Variante 2 mit mehreren Arrays für die Spalten
Public Structure myStruct
    Dim Spalte1(,) As Object
    Dim Spalte2(,) As Object
End Structure

Sub FillRange()
    Dim objXL As New Excel.Application

    'Struktur erzeugen  
    Dim s As myStruct
    'Arrays anlegen  
    s.Spalte1 = New Object(10, 0) {}
    s.Spalte2 = New Object(10, 0) {}
    'Arrays mit Beispieldaten füllen  
    For i = 0 To 10
        s.Spalte1(i, 0) = "Daten Spalte 1." & i  
        s.Spalte2(i, 0) = "Daten Spalte 2." & i  
    Next
    'Excel anzeigen und Workbook und Worksheet referenzieren  
    objXL.Visible = True
    Dim wb As Workbook = objXL.Workbooks.Add()
    Dim ws As Worksheet = wb.Worksheets(1)

    'Über die Arrays in der Struct iterieren  
    Dim t As Type = GetType(myStruct)
    Dim counter As Integer = 1
    For Each myField As System.Reflection.FieldInfo In t.GetFields()
        'Array holen  
        Dim arr As Object = myField.GetValue(s)
        ' Anzahl der Zeilen des Arrays ermitteln  
        Dim arr_length As Integer = arr.GetLength(0)
        'Daten in Excel schreiben  
        ws.Cells(1, counter).Resize(arr_length).Value = arr
        counter += 1
    Next
End Sub
Grüße Uwe
MarcoBorn
MarcoBorn 18.08.2014 um 14:44:15 Uhr
Goto Top
Hallo Uwe,
vielen Dank für die schnelle Beantwortung. Ich tendiere eher zur 2. Fassung, da ich meine Struktur auch in einer Schleife befülle. Kann ich auch die Struktur als Ganzes an einen Range in Excel übergeben? Das zellenweise Befüllen kostet zuviel Performance und ist der eigentliche Grund, warum ich erst die Werte in einer Struktur zwischenspeichern möchte.

Vielen Dank,
M. Born
colinardo
colinardo 18.08.2014 aktualisiert um 15:04:44 Uhr
Goto Top
Das ist kein zellenweises Befüllen sondern nur ein Iterate über die Arrays im Struct....Die Arrays werden jeweils in einem Rutsch an Excel übergeben.

Btw. lässt sich das Befüllen auch in der ersten Variante problemlos machen. Ich würde die erste bevorzugen...
MarcoBorn
MarcoBorn 18.08.2014 um 14:51:52 Uhr
Goto Top
Ok, danke. Bin gerade dabei, das Ganze in meinen Code einzubauen.