Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1164to1168
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array eines User Defined Type ausgeben

Array eines User Defined Type ausgeben
Jens
Liebes Forum,
ich habe einen benutzerdefinierten Typ mit verschiedenen Datentypen (Date, Double, Integer,...) erstellt, und erstelle in meiner Routine ein Array mit diesem Typ.
Es gibt also das Array myOutput(), das z.B. 100 Einträge umfasst, der Datentyp hat z.B. 10 Variablen.
Nun möchte ich das Array ins Worksheet ausgeben, in einen Bereich mit 100 Zeilen und 10 Spalten.
Ich hab's mal versucht mit
Range(blabla) = myOutput()
aber Excel meldet sich und sagt "Fehler beim Kompilieren: Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden oder an eine zur Laufzeit auflösbare Funktion weitergeleitet werden."
? Keine Ahnung wie man das lösen kann - hat jemand einen Vorschlag?
Vielen Dank sagt
der Jens
AW: Array eines User Defined Type ausgeben
15.07.2010 11:41:21
Tino
Hallo,
so richtig verstanden habe ich Dein anliegen noch nicht.
Aber wie ist es anstatt mit Date, Double, Integer usw..., nur mit den Typ Variant zu arbeiten?
Hier ein Beispiel:
Sub Beispiel()
Dim myOutput()

Call FuellArrTest(myOutput)  'mit Beispieldaten füllen 

Range("A1").Resize(Ubound(myOutput) + 1, Ubound(myOutput, 2) + 1) = myOutput

End Sub


Sub FuellArrTest(meAr())
Dim A As Long, B As Long
Redim meAr(99, 9)
For A = 0 To 99
    For B = 0 To 9
        If A Mod 2 = 1 Then
            meAr(A, B) = Date + A + B
        Else
            meAr(A, B) = A + B
        End If
    Next B
Next A
End Sub
Gruß Tino
Anzeige
AW: Array eines User Defined Type ausgeben
15.07.2010 11:55:05
Jens
Hallo Tino,
danke für deine Antwort.
Ich krieg leider immer noch die gleiche Fehlermeldung. Hat vielleicht damit zu tun, dass mein myOutput as Array meines benutzerdefinierten Typen definiert ist.
Ich denke das Ganze wird etwas klarer, wenn du siehst wie ich's gemacht habe. Kann ich dir mal meinen Code schicken?
Danke sagt
der Jens
lade besser hier ein Beispiel hoch...
15.07.2010 12:00:45
Tino
Hallo,
dann können sich andere auch beteiligen, die vielleicht auch mehr Ahnung haben wie ich.
Gruß Tino
AW: lade besser hier ein Beispiel hoch...
15.07.2010 12:11:59
Jens
Genau das meinte ich...
Ich hab eine verkleinerte Version der Datei hochgeladen, mit nur 1000 Zeilen. Da ist das Problem noch nicht so sichtbar. Die reale Datei hat ca. 400000 Zeilen, da wird's schon blöder...
https://www.herber.de/bbs/user/70595.xlsm
Danke nochmal
der Jens
Anzeige
unvollständig wegen Zeitmangen...
15.07.2010 13:01:32
Tino
Hallo,
also ich würde dies über ein normales zweidimensionales Array machen und
die Zeilen und Spalten entsprechend füllen.
Habe zwar schon angefangen, aber habe irgendwie die Zuordnung durcheinander gebracht.
Kann jetzt leider nicht mehr weiter machen, muss auf die Arbeit.
https://www.herber.de/bbs/user/70596.xlsm
Vielleicht kann sich das ein anderer mal ansehen. (ich lass mal offen)
Gruß Tino
Bitte kein XL2007-Dateiformat!
15.07.2010 16:27:09
Erich
Hi Jens,
das würde ich mir auch ganz gern mal ansehen. Aber mein Excel XP kann mit .xlsm, .xlsx etc. nix anfangen.
Lädst du dein File noch mal für Oldies hoch, also als .xls?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: lade besser hier ein Beispiel hoch...
15.07.2010 17:15:27
fcs
Hallo Jens,
hier eine Variante. Die in die Tabelle zu schreibenden Daten werden in einem 2. Array zwischengespeichert und zum Schluss auf einen Schalg in die Tabelle geschrieben. Das ist zumindest schneller als Einzelwertübertragung.
Wie sich die Geschwindigkeit bei 400000 zu verarbeitenden Zeilen verhält - ?
Gruß
Franz
Option Explicit
' minimum tilted global radiation for starting eta calculation
Const cEpsRad As Double = 0.1
Public Type typeTLFSOutput
TLFSDate As Date
TLFSTime As Date
rad As Double
teTank As Double
teAmb As Double
deltaT As Double
pumpOn As Integer
eta As Double
TLFSResult As Integer
End Type
Public Sub TLFS2_Pumpe_laeuft_nicht_trotz_Strahlung()
Dim iColDate As Integer, iColTime As Integer
Dim iColGlobRad As Integer, iColTeAmb As Integer
Dim iColDmndPump As Integer, iColTankLow As Integer
Dim dDeltaT As Double
Dim dEta As Double
Dim dEta0 As Double, dk1 As Double, dk2 As Double, dHyst As Double
Dim dEtaWarn As Double, dEtaCrit As Double
Dim lRow As Long, lRow2 As Long, lRowMax As Long, lRowStart As Long, iRowStep As Integer
Dim sWksOutputName As String
Dim myOutput() As typeTLFSOutput
Dim arrTmp() As Variant
Dim lCntOutput As Long
Dim dTmp As Double, lTmp As Long
' INITIALISIERUNG
iColDate = 1
iColTime = 2
iColGlobRad = 4
iColTeAmb = 3
iColDmndPump = 15
iColTankLow = 17
lRowStart = 10
iRowStep = 5
dEta0 = Range("eta0").Value
dk1 = Range("k1_").Value
dk2 = Range("k2_").Value
dHyst = Range("Hyst").Value
dEtaWarn = Range("eta_warn").Value
dEtaCrit = Range("eta_crit").Value
sWksOutputName = "Output"
If ActiveSheet.Name = sWksOutputName Then
MsgBox "bitte Arbeitsblatt mit Daten aktivieren"
Exit Sub
End If
' DATEN EINLESEN + VERARBEITEN
lRowMax = Cells(lRowStart, iColDate).End(xlDown).Row
lRow = lRowStart
Debug.Print "Start Berechnung"
ReDim myOutput(1 To 1)
ReDim arrTmp(1 To CLng((lRowMax - lRowStart) / iRowStep), 1 To 9)
Do While lRow + iRowStep  dEtaCrit, 2, IIf(.eta > dEtaWarn, 1, 0))
End If
End If
arrTmp(lCntOutput, 1) = .TLFSDate
arrTmp(lCntOutput, 2) = .TLFSTime
arrTmp(lCntOutput, 3) = .rad
arrTmp(lCntOutput, 4) = .teTank
arrTmp(lCntOutput, 5) = .teAmb
arrTmp(lCntOutput, 6) = .deltaT
arrTmp(lCntOutput, 7) = .pumpOn
arrTmp(lCntOutput, 8) = 100 * .eta
arrTmp(lCntOutput, 9) = .TLFSResult
End With
lRow = lRow + iRowStep
Loop
Debug.Print "Ende Berechnung"
' AUSGABE
Debug.Print
Debug.Print "Start Ausgabe"
Application.ScreenUpdating = False
Worksheets(sWksOutputName).Activate
ActiveSheet.UsedRange.ClearContents
' Ausgabe Überschriften
Range("B2").Select
With ActiveCell
.Offset(0, 0) = "Datum"
.Offset(0, 1) = "Zeit"
.Offset(0, 2) = "SP Einstrahlung"
.Offset(0, 3) = "TE Puffer unten"
.Offset(0, 4) = "TE ambient"
.Offset(0, 5) = "DT Puffer-Koll fiktiv"
.Offset(0, 6) = "D2 pump on?"
.Offset(0, 7) = "PC eta"
.Offset(0, 8) = "TLFS result"
End With
' Ausgabe Werte
Range("B3").Select
Debug.Print "Ende Ausgabe"
Range("B3").Resize(UBound(arrTmp, 1), UBound(arrTmp, 2)).Value = arrTmp
Columns(3).NumberFormat = "hh:mm:ss"
Cells.Columns.EntireColumn.AutoFit
Erase arrTmp
Erase myOutput
Application.ScreenUpdating = True
Debug.Print "fertig! :-)"
End Sub

Anzeige
Kleinkram
15.07.2010 17:41:23
Erich
Hi zusammen,
(das richtet sich jetzt natürlich nicht an Franz, sondern an Jens. Aber ich beziehe mich auf Jens' Code,
so wie Franz ihn jetzt gepostet hat.)
Warum nicht statt
Cells.Columns.EntireColumn.AutoFit
viel kürzer
Columns.AutoFit
oder vielleicht auch
UsedRange.EntireColumn.AutoFit
Statt
Range("B2").Select
With ActiveCell
würde reichen
With Range("B2")
Nun noch eine Frage - aus reinem Interesse: Was war den nun der Fehler?
War ein benutzerdefinierter Typ, nicht einem öffentlichen Modulen definiert?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Kleinkram
16.07.2010 01:17:46
Jens
Lieber Franz, lieber Erich,
vielen Dank für eure Beiträge!
@Franz: danke für den Code, damit funktioniert's wunderbar und recht schnell, jedenfalls akzeptabel für meine Zwecke. Ich hatte gehofft, man könnte sich den Umweg über ein Variant-Array sparen. Wie auch immer, es funktioniert! :-)
@Ernst: sorry, die xl XP Version hab ich nicht hochgeladen. Hab erst jetzt wieder ins Forum schauen können, und jetzt ist der Fall schön gelöst. Wenn du magst, kann ich die Datei natürlich noch als .xls hochladen - sag einfach Bescheid.
Zu deinen Anmerkungen zum VBA-Code: Vielen Dank, und du hast natürlich Recht mit allem. Ist auch bereits umgesetzt. Irgend einen Grund muss es ja geben, dass ich "VBA bescheiden" angegeben hatte :-)
Besten Dank und liebe Grüße sagt
der Jens
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige