Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
952to956
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
952to956
952to956
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Einbetten von Bytearray

Einbetten von Bytearray
23.02.2008 11:12:00
Bytearray
Hallo,
ich sollte eine Datei in Excel einbetten und später wieder im Dateisystem speichern. Ich habe die Datei in ein Bytearray eingelesen und möchte dieses irgendwie im Excelarbeitsblatt speichern. Gibt es hier eine Möglichkeit (am besten versteckt)? Das Bytearray soll in der Exceldatei erhalten bleiben.
Danke für eure Hilfe,
Klaus

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einbetten von Bytearray
23.02.2008 11:56:23
Bytearray
Hallo Klaus,
eine Möglichkeit ohne Tabelle. Aber, das hat natürlich Folgen für die größe der gespeicherten Datei. In dem Beispiel hab ich's mal bis zur Obergrenze ausgereizt. Die Datei hat 176 MB. Die Grenze für die zweite Dimension lässt sich nicht mehr erweitern!!! Die für die erste nur noch minimal.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub prcArraytoName()
    Dim bytArray(1 To 30000, 1 To 256) As Byte
    Dim lngIndex1 As Long, lngIndex2 As Long
    Call Randomize(Timer)
    For lngIndex1 = LBound(bytArray, 1) To UBound(bytArray, 1)
        For lngIndex2 = LBound(bytArray, 2) To UBound(bytArray, 2)
            bytArray(lngIndex1, lngIndex2) = Fix(255 * Rnd)
        Next
    Next
    Names.Add Name:="ByteArray", RefersTo:=bytArray, Visible:=False
End Sub

Public Sub prcNametoArray()
    Dim vntArray As Variant
    vntArray = [ByteArray]
    MsgBox vntArray(LBound(vntArray, 1), LBound(vntArray, 2)) & vbLf & _
        vntArray(UBound(vntArray, 1), UBound(vntArray, 2))
End Sub

Gruß
Nepumuk

Anzeige
AW: Einbetten von Bytearray
23.02.2008 14:37:00
Bytearray
Hallo Nepumuk,
vielen Dank für deine schnelle Hilfe. Dein Code funktioniert - bei mir ist das Problem, dass beim Hinzufügen meines Bytearrays zu den Namen ein Fehler auftritt - ich weiß nicht, ob es an den Daten liegt.
Ich habe unten meinen Code: ich lese aus einer Zelle einen Dateinamen, lade den Dateiinhalt in ein Bytearray und möchte diesen dann zu den Namen hinzufügen, was aber nicht funktioniert.
Kannst du bitte einen Blick darauf werfen?
Vielen Dank,
Klaus
Hier der Code:
Option Explicit

Private Sub CommandButton1_Click()
Dim strFile As String
strFile = ActiveSheet.Cells(7, 7).Value ' get source file name
Dim rgData() As Byte
rgData = BinaryReadFile(strFile)
Names.Add Name:="ByteArray", RefersTo:=rgData, Visible:=False
End Sub



Private Function BinaryReadFile(ByRef i_strFilename As String) As Variant
On Error GoTo ErrHnd
Dim lLenFile As Long
Dim lFileNum As Long
Dim rgbyBin() As Byte
lFileNum = FreeFile
Open i_strFilename For Binary Access Read As #lFileNum
lLenFile = FileLen(i_strFilename)
ReDim rgbyBin(lLenFile - 1)
Get #lFileNum, , rgbyBin
Close #lFileNum
BinaryReadFile = rgbyBin
Exit Function
ErrHnd:
Err.Raise Err.Number, Err.Source, Err.Description
End Function


Anzeige
AW: Einbetten von Bytearray
23.02.2008 14:45:02
Bytearray
Hallo Klaus,
na das kann ja nicht klappen: rgData = BinaryReadFile(strFile)
Da willst du ein dynamisches Variantarray in einen undeminsioniertes Bytearray unterbringen. Wenn ich dazu mehr sagen soll, dann benötige ich die einzulesende Datei.
Gruß
Nepumuk

AW: Einbetten von Bytearray
23.02.2008 15:25:17
Bytearray
Hallo Nepumuk,
ich habe eine Datei, die ich einlesen möchte, auf den Server geladen. Hier der Link:
https://www.herber.de/bbs/user/50142.zip
Hoffentlich kannst du mir helfen,
Klaus

AW: Einbetten von Bytearray
23.02.2008 16:03:00
Bytearray
Halll Klaus,
mit über 190.000 Datensätzen in einem eindimensionales Array zu groß. Das muss aufgetweilt werden. Mal ein Vorschalg:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private vntTest1 As Variant, vntTest2 As Variant 'nur zum testen********************

Private Sub CommandButton1_Click()
    Dim strFile As String
    Dim vntReturn As Variant
    Dim lngIndex As Long, lngCounter As Long
    Dim lngIndex1 As Long, lngIndex2 As Long
    Dim bytDataArray() As Byte
    strFile = ActiveSheet.Cells(7, 7).Value
    vntReturn = BinaryReadFile(strFile)
    
    '********************nur zum testen********************
    vntTest1 = vntReturn
    '********************nur zum testen********************
    
    For lngIndex = 256 To 0 Step -1
        If (UBound(vntReturn) + 1) Mod lngIndex = 0 Then Exit For
    Next
    Redim bytDataArray(1 To (UBound(vntReturn) + 1) \ lngIndex, 1 To lngIndex)
    For lngIndex1 = 1 To UBound(bytDataArray, 1)
        For lngIndex2 = 1 To UBound(bytDataArray, 2)
            bytDataArray(lngIndex1, lngIndex2) = vntReturn(lngCounter)
            lngCounter = lngCounter + 1
        Next
    Next
    Names.Add Name:="ByteArray", RefersTo:=bytDataArray, Visible:=False
End Sub

Private Function BinaryReadFile(ByRef i_strFilename As String) As Variant
    On Error GoTo ErrHnd
    Dim lLenFile As Long
    Dim lFileNum As Long
    Dim rgbyBin() As Byte
    lFileNum = FreeFile
    Open i_strFilename For Binary Access Read As #lFileNum
    lLenFile = FileLen(i_strFilename)
    Redim rgbyBin(lLenFile - 1)
    Get #lFileNum, , rgbyBin
    Close #lFileNum
    BinaryReadFile = rgbyBin
    Exit Function
    ErrHnd:
    Err.Raise Err.Number, Err.Source, Err.Description
End Function

Public Sub Rebuild_Array()
    Dim vntReturn As Variant
    Dim lngIndex1 As Long, lngIndex2 As Long, lngCounter As Long
    Dim bytDataArray() As Byte
    vntReturn = [ByteArray]
    Redim bytDataArray(1 To UBound(vntReturn, 1) * UBound(vntReturn, 2))
    For lngIndex1 = 1 To UBound(vntReturn, 1)
        For lngIndex2 = 1 To UBound(vntReturn, 2)
            lngCounter = lngCounter + 1
            bytDataArray(lngCounter) = vntReturn(lngIndex1, lngIndex2)
        Next
    Next
    
    '********************nur zum testen********************
    vntTest2 = bytDataArray
    '********************nur zum testen********************
    
End Sub

Public Sub test() 'Testarrays vergleichen ob identisch********************
    Dim lngIndex As Long
    For lngIndex = 0 To UBound(vntTest1)
        If vntTest1(lngIndex) <> vntTest2(lngIndex + 1) Then Stop
    Next
End Sub

Gruß
Nepumuk

Anzeige
AW: Einbetten von Bytearray
23.02.2008 21:32:10
Bytearray
Hallo Nepumuk,
wunderbar! Es funktioniert so. Vielen, vielen Dank!
Kannst du mir noch bitte sagen wieviel Feldeinträge in einem Feld (z. B. Byte Array) maximal möglich sind?
Nochmals vielen Dank,
Klaus

AW: Einbetten von Bytearray
23.02.2008 21:50:00
Bytearray
Hallo Klaus,
ließ meinen ersten Beitrag.
Gruß
Nepumuk

AW: Einbetten von Bytearray
24.02.2008 14:32:18
Bytearray
Hallo Nepumuk,
danke für die Info.
Eine Frage habe ich noch: ich würde das Byte Array gerne im Worksheet einbetten (ActiveSheet.Names.Add Name:="FILE", RefersTo:=bytDataArray, Visible:=False) und dann wieder mit vntReturn = ActiveSheet.Names.Item("FILE") holen. Dieses zweidimensionale Feld wird dann wieder in das ursprüngliche Array zurückgewandelt. Du holst in deinem Beispiel das Feld mit [ByteArray] aus der Workbook Names Collection. Wo liegt hier der Unterschied - kann man das im Worksheet mit dem Item("...") Zugriff auch lösen? Ich sollte nämlich mehrere Dateien im Worksheet einbetten und möchte die Namen der einzelnen Felder dynamisch vergeben.
Vielleicht hast du noch einen Tipp.
Danke,
Klaus

Anzeige
AW: Einbetten von Bytearray
24.02.2008 15:46:06
Bytearray
Hallo Klaus,
der Unterschied beim lesen wäre dann der:
Mappe: Return = [Testname]
Tabelle: Return = [Tabelle1!Testname]
Gruß
Nepumuk

AW: Einbetten von Bytearray
24.02.2008 16:27:00
Bytearray
Hallo Nepumuk,
bei mir ist es so, dass ich irgendein Worksheet habe und einen beliebigen Namen verwenden möchte.
D. h. es solle eine Möglichkeit geben, [Tabellenname!Testname] mit Variablen zu verwenden. Falls es ein String wäre, dann würde ich den Zugriff so zusammenbauen: "[" & Worksheet.Name & "!" & strTestname & "]", das wird so aber nicht funktionieren. Gibt es eine andere Syntax als [Tabelle1!Testname] (über die Names Collection)?
Danke für deine Hilfe,
Klaus

Anzeige
AW: Einbetten von Bytearray
24.02.2008 16:48:38
Bytearray
Hallo Klaus,
du kannst natürlich auch die Value-Eigenschaft des Namens auslesen. Die gibt dir einen String zurück, welcher folgenden Aufbau hat:
Gespeichert ein Array mit folgender Dimensionierung: Array(1 to 5, 1 to 3)
Rückgabe: ={0,0,0;0,0,0;0,0,0;0,0,0;0,0,0}
Du musst also erst die erten zwei und die letzte Stelle entfernen. Dann am Semikolon splitten die einzelnen Einträge des daraus gewonnenen Arrays wieder am Komma splitten. So kannst du die einzelnen Einträge wieder zu einem großen Array zusammenbauen.
Ich denke bei VBA-gut sollte das lösbar sein.
Gruß
Nepumuk

Anzeige
AW: Einbetten von Bytearray
24.02.2008 19:47:40
Bytearray
Hallo Nepumuk,
ich hoffe, ich bin nicht lästig. Das mit dem Splitten des Texts wäre kein Problem, nur liefert mir die Value Property nur einen Bruchteil der gespeicherten Daten (am hochgeladenen Beispiel und auch bei anderen Dateien). Ich kann mir das nicht erklären - kann man über einen anderen Weg noch auf den Wert des Names zugreifen? Gibt es irgendwo eine Doku über den Zugriff mit eckigen Klammern ([])?
Danke für deine Hilfe,
Klaus

AW: Einbetten von Bytearray
24.02.2008 20:08:00
Bytearray
Hallo Klaus,
1. Nicht das ich wüsste.
2. Ich kenne keine.
3. Wenn's nicht anders geht, dann musst du doch in einer Tabelle speichern.
4. Ich frag mich, wozu eigentlich das ganze in Excel sein muss. Würde es eine "normale" Textdatei nicht auch tun?
Gruß
Nepumuk

Anzeige
AW: Einbetten von Bytearray
24.02.2008 20:15:00
Bytearray
Hallo Nepumuk,
danke für die schnelle Antwort.
Mein Problem ist, dass ich eine dynamische Anzahl von Tabellenblättern mit beliebigen Namen habe. Pro Tabellenblatt soll (dzt.) eine Datei (ca. 200kB) gespeichert werden. Es muss innerhalb von Excel sein, da die Exceldatei verschickt wird und die Daten, die aus den Dateien importiert worden sind, in der Exceldatei eingebettet sein müssen, damit man notfalls auf diese zurückgreifen kann. Eine weitere Tabelle scheidet eigentlich aus, da es jetzt schon bis zu 30 Tabellenblätter sind. Hast du evtl. noch eine andere Idee für die Einbettung? An und für sich wäre die Lösung ja top, wenn des Auslesen des Namens funktionieren würde...
Ciao,
Klaus

Anzeige
AW: Einbetten von Bytearray
24.02.2008 21:01:00
Bytearray
Hallo Nepumuk,
ich weise das Byte Array jetzt folgendermaßen dem Worksheet zu:
oSheet.Names.Add Name:="MYKEY", RefersTo:=bytArray, Visible:=False
Das mache ich in unterschiedlichen Tabellenblättern und greife nacher mit "MYKEY" wieder auf den Namen zu, und zwar für alle Tabellenblätter gleich (in einer Klasse):
Dim vntData as Variant
vntData = [MYKEY]
Ein erster Test mit zwei Tabellenblätter speichert und liest unterschiedliche Byte Arrays für unterschiedliche Dateien. Kannst du mir sagen, ob der Zugriff mit [MYKEY] pro Tabellenblatt sicher ist (es ist bei der Abfrage ja keine Zuordnung zum Worksheet; wird zuerst im Sheet, dann im Workbook geschaut?)?
Danke für deine Hilfe,
Klaus
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige