Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Array in einem Array geht das? | Herbers Excel-Forum


Betrifft: Array in einem Array geht das? von: Dirk
Geschrieben am: 01.02.2012 07:17:35

Hallo Freunde,

ich habe ein kleines aber hoffendlich lösbares Problem.
In einer Tabelle (länge und breite ariable) muss ich alle daten zellenweise einlesen und verarbeiten.
bierbei will ich jede Spalte in ein Array einlesen.

meine Frage jetzt ist kann man, da ich die anzahl der Spalten ja nicht kenne, ein Array bilden, das die anzahl der Spalten darstellt und in diesem Array ein Array belden, das für die Zeilen (zellen) steht??

Spalte1 zeile1 = arrayspalte(1).arrayzeile(1)

geht sowas?

Gruß
Dirk

  

Betrifft: AW: Array in einem Array geht das? von: Harald Kapp
Geschrieben am: 01.02.2012 08:11:51

Hallo Dirk,
das geht als mehrdimensionales Array. Beispiel:

Sub test()
Dim xxx(10, 10) As Integer
ReDim Preserve xxx(10, 100)
End Sub

In diesem Beispiel:
DIM erstellt eine Matrix von 10*10.
REDIM verändert die Größe auf 10*100

Alles Weitere ist in der Hilfe zu DIM und REDIM eigentlich recht gut erklärt.

Harald


  

Betrifft: AW: Array in einem Array geht das? von: Dirk
Geschrieben am: 01.02.2012 09:08:13

Hoin Harald,
Dank dir erstmal
ich werd das gleich mal versuchen.

Gruß
Dirk


  

Betrifft: Was mach ich Falsch? von: Dirk
Geschrieben am: 01.02.2012 10:28:41

Ich hab hier irgendwo einen Denkfehler drinn.
zur info bei meiner Tabelle handelt es sich um eine Wordtabelle.
da ich die nicht anders eingelesen bekommen habe lese ich jede Zelle einzeln ein und verknüpfe die mit einem #.
im anschluss daran wird mit split das array generiert.

Sub test()
Dim xxx(10, 10) As Integer
'ReDim Preserve xxx(10, 100)
EL = tbel(1, "#")
xxx(1, 1) = Split(EL, "#")
End Sub

Private Function tbel(ByVal s As Integer, ByVal tz As String) As String
Dim er As Boolean
Dim i As Integer
er = False
i = 0
Do While er = False
i = i + 1
On Error GoTo erro
strel = ThisDocument.Tables(1).Cell(i, s)
erro:
If Len(strel) < 3 Then
er = True
Else
EL = EL & tz & Left(strel, (Len(strel) - 2))  '-2=zeilenschaltung entfernen
End If
Loop
tbel = EL
End Function
kann mir einer Sagen wo der Denkfehler liegt?

Gruß
Dirk


  

Betrifft: AW: Was mach ich Falsch? von: Rudi Maintaire
Geschrieben am: 01.02.2012 10:56:29

Hallo,
wie sieht denn EL aus?
Wenn du ein Array mit Split aufbaust, musst du vorher nicht die Dimensionen festlegen, bzw. Split erzeugt immer ein eindimensionales Array.
xxx=Split("1#2#3#4#5","#") wird zu Array("1","2","3","4","5")

Gruß
Rudi


  

Betrifft: AW: Was mach ich Falsch? von: Reinhard
Geschrieben am: 01.02.2012 10:59:43

Hallo Dirk,

beachte, beim Array fängt der Index normalerweise bei 0 an.
Schaue dazu in der Hilfe u.a. zu Data base.
Dim xxx(10, 10) erzeugt also 11 * 11 = 121 Elemente.
Ein Ansatz für Word wo der Index bei 1 beginnt:

Sub Tabelle()
Dim Zei As Long, Spa As Long, Tabelle As Table, AnzZeilen As Long
Dim AnzSpalten As Long, tmp As String
Set Tabelle = ActiveDocument.Tables(1)
AnzZeilen = Tabelle.Rows.Count
AnzSpalten = Tabelle.Columns.Count
ReDim x(1 To AnzZeilen, 1 To AnzSpalten) As String
For Zei = 1 To AnzZeilen
  For Spa = 1 To AnzSpalten
    tmp = Tabelle.Cell(Zei, Spa).Range.Text
    x(Zei, Spa) = Left(tmp, Len(tmp) - 2)
  Next Spa
Next Zei
MsgBox x(1, 1)
End Sub

Gruß
REinhard


  

Betrifft: AW: Was mach ich Falsch? von: Dirk
Geschrieben am: 01.02.2012 11:44:00

@Reinhand
viel dank
so hab ich das jetzt auch erstmal gelöst.
Ich dachte nur , da ich die Zellen einer Spalte schon in einem Array habe das ich die einfach gleich setzten könnte.

@Rudi Maintaire
genau so nur das halt Text oder Dezimalzahlen verwendet werden
sprich xxx=split("Fe#Cr#Ni#Co#....")
oder halt xxx=split("1,2 vbcrlf 1,1#2,0 vbcrlf 2,1#.......")
bei den Zahlen handet es sich in der regel um 2 Zahlen/Zelle


Gruß
Dirk


  

Betrifft: Code von: Dirk
Geschrieben am: 01.02.2012 11:48:58

so sieht der Code mim aus

Sub richtig()
Dim wert As Variant
Dim i, j As Integer
bl = ls
Dim xxx(5, 30) As Variant
For a = 1 To bl
wert = tbel(a, "#")
wert = Split(wert, "#")
j = UBound(wert)
For b = 1 To j
xxx(a, b) = wert(b)
Next b
Next a
MsgBox (xxx(1, 1))
End Sub


Private Function tbel(ByVal s As Integer, ByVal tz As String) As String
Dim er As Boolean
Dim i As Integer
er = False
i = 0
Do While er = False
i = i + 1
On Error GoTo erro
strel = ThisDocument.Tables(1).Cell(i, s)
erro:
If Len(strel) < 3 Then
er = True
Else
EL = EL & tz & Left(strel, (Len(strel) - 2))
End If
Loop
tbel = EL
End Function
Gruß
Dirk


  

Betrifft: AW: Was mach ich Falsch? von: Rudi Maintaire
Geschrieben am: 01.02.2012 16:22:29

Hallo,
oder halt xxx=split("1,2 vbcrlf 1,1#2,0 vbcrlf 2,1#.......")
also Zeilentrennung durch vbCrLf?
2x Splitten!

xx=Split(EL,vbCRLF) ergibt
xx(0)=1,2
xx(1)=1,1#2,0
xx(2)=2,1#...

jetzt dieses Array durchgehen und jedes Element splitten

For i=0 to ubound(xx)
xxx=split(xx(i),"#")
'was mit dem Array machen, z.B
Cells(i+1, 1).Resize(, UBound(xxx) + 1) = xxx
next

Gruß
Rudi


  

Betrifft: AW: Was mach ich Falsch? von: Dirk
Geschrieben am: 01.02.2012 20:13:12

Hallo Rudi

xxx=split("1,2 vbcrlf 1,1#2,0 vbcrlf 2,1#.......", "#") heißt es eigendlich.
mit vbcrlf wollte ich nur andeuten, das da ne zeilenschaltung mit eingelesen wurde


ich bin jetz auf den code von Reinhard umgestiegen.
der ist schöner und läuft echt gut
an dieser Stelle auch nochmal DANKE

Gruß
Dirk


  

Betrifft: AW: Was mach ich Falsch? von: Reinhard
Geschrieben am: 01.02.2012 21:14:00

Hallo Dirk,

hier wird die Word-Tabelle als Block eingelesen.
In dem Block sind die Zellen einer Zeile zwischen sich mit Zeichen 9 getrennt.
Die Zeilen sind im Block mit vbCrLf (13 10) getrennt.

Sub DirkinWord()
Dim Daten As New DataObject, Dat, Z As Long, S As Long, anzS As Long
anzS = ThisDocument.Tables(1).Columns.Count
ThisDocument.Tables(1).Range.Copy
Daten.GetFromClipboard
Dat = Split(Replace(Left(Daten.GetText(1), Len(Daten.GetText(1)) - 2), _
  Chr(13) & Chr(10), Chr(9)), Chr(9))
Z = 2
S = 3
'Zugriff auf C3 = Cells(2,3) in Excel-Beschriftung der Wordtabelle:
MsgBox Dat((Z - 1) * anzS + (S - 1) Mod anzS)
End Sub

Gruß
Reinhard