PDA

Vollständige Version anzeigen : Array in Zelle aktiv durch Macro auslesen


VBA_noob
13.11.2008, 10:05
Hallo Freunde,

vorab sei erwähnt, ich bin neu hier im Forum und auch noch kein VBA Profi. Wenn mein Problem nun leicht zu lösen sein sollte oder ein anderer Thread eine Lösung enthält bitte einfach freundlich darauf hinweisen. Hab nämlich nun schon zwei Tage im Netz nach einer Lösung für mein Problem gesucht und nix gefunden ...

Also folgendes benötige ich: Ich will von einer VBA Prozedur aus auf den Wert einer Zelle zugreifen und diesen in eine Variable speichern. Das ist ja nicht weiter schwer, wenn ich mit

variable = Range("A1").Value

den Wert hole. Nun ist in meiner Zelle allerdings ein Array unbekannter Größe und Dimension, welches durch eine Andere Funktion entstanden ist, welche in dieser Zelle aufgerufen wurde. D.h. wenn ich nun mit Value versuche das Array aus der Zelle zu holen, dann bekomme ich leider nur den Eintrag des Arrays im Feld (1,1), jedoch nicht das ganze Array. Die Funktion, welche von der Zelle aus aufgeführt wird und das Array in der Zelle zurückgibt ist z.b. eine UDF oder aus einem Add-in und könnte z.B. so aussehen:

Public Function ReturnArray() As Variant
Dim Array1(5, 2) As Variant
For i = 1 To 6
For j = 0 To 2
Array1(i - 1, j) = i + j
Next j
Next i

ReturnArray = Array1

End Function


Jetzt ist dieses Array in der Zelle nicht entfaltet, d.h. man sieht auch in der Zelle nur den ersten Eintrag (1,1) des (in diesem Fall zweidimensionalen) Arrays. Natürlich könnte ich eine Funktion bauen, und die Funktion mit dem Returnwert der anderen Funktion (=Funktion(ReturnArray())) aufrufen, ich will allerdings das ganze Array in einer Variable in meiner Prozedur haben, da eine Funktion immer einen Rückgabewert hat, was ich in diesem Fall nicht gebrauchen kann.


Hintergrund: Ich will ein Macro schreiben, welches ich mit einem Shortcut (z.B. Ctrl. + Q) aufrufen kann und welches ein Array auf seine optimale Größe ausdehnt. Dass heißt, wenn ich z.B. in Zelle C12 eine Funktion (=ReturnArray(), siehe oben) aufrufe und anschließend Ctrl.+Q drücke, so wird mein Array automatisch entfaltet auf die optimale Größe.

Geht das überhaupt???

Vielen Dank schonmal für eure Hilfe

VBA_noob
13.11.2008, 11:26
Leute, vielen Dank für euere Bemühungen, aber ich habe jetzt selbst eine Lösunge gefunden.

:D Puh, der dreck hat mich jetzt ganz schön aufgehalten, aber wenigstens ist jetzt schluss mit frustig ...

Folgendermaßen habe ich mein Array in meine sub bekommen:


Public Sub MeineSub()
Dim W As Worksheet
Dim R As Range
Dim F As String
Dim v As Variant

Set W = ActiveSheet
Set R = ActiveCell
F = R.FormulaArray

v = R.Parent.Evaluate(F)

If VarType(v) >= 8192 Then
MsgBox "Juhu, ich hab was ich will!!"
Else
MsgBox "scheiße, da klappt was nicht!"
End If

End Sub


Also erst die Formel aus der Zelle ermittlen, dann evaluieren und in Variable speicher, und schon hab ich das ganze Array. Merci euch

NoNet
13.11.2008, 11:34
Hallo n00b ;) ,

das könntest Du z.B. so lösen :

<table align="center" border="1" cellpadding="4" cellspacing="1" width="98%"style="border-collapse:collapse;font-family:Arial;font-size:12;"><tbody><tr><td style="background-color:#EBEBEB;"><b>VBA-Code:</b></td></tr><tr><td style="background-color:#FFFFFF;font-family:Courier New;font-size:12;"><FONT COLOR=#0000FF>Sub</FONT>&nbsp;ArrayAuslesen()
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#008000>'13.11.2008,&nbsp;NoNet</FONT>
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>Dim</FONT>&nbsp;rngZelle&nbsp;<FONT COLOR=#0000FF>As</FONT>&nbsp;Range
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>Dim</FONT>&nbsp;arrWerte
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>Set</FONT>&nbsp;rngZelle&nbsp;=&nbsp;[F7]&nbsp;<FONT COLOR=#008000>'Die&nbsp;Zelle,&nbsp;deren&nbsp;ARRAY&nbsp;ausgelesen&nbsp;werden&nbsp;soll</FONT>

&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>If</FONT>&nbsp;rngZelle.HasArray&nbsp;<FONT COLOR=#0000FF>Then</FONT>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrWerte&nbsp;=&nbsp;rngZelle.CurrentArray
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox&nbsp;"Die&nbsp;Ausmasse&nbsp;des&nbsp;Arrays&nbsp;der&nbsp;Zelle&nbsp;"&nbsp;&amp;&nbsp;rngZelle.Address&nbsp;&amp;&nbsp;vbLf&nbsp;&amp;&nbsp;vbLf&nbsp;&amp;&nbsp;_
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Zeilen&nbsp;:&nbsp;"&nbsp;&amp;&nbsp;<FONT COLOR=#0000FF>UBound</FONT>(arrWerte)&nbsp;-&nbsp;<FONT COLOR=#0000FF>LBound</FONT>(arrWerte)&nbsp;+&nbsp;1&nbsp;&amp;&nbsp;vbLf&nbsp;&amp;&nbsp;_
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Spalten&nbsp;:&nbsp;"&nbsp;&amp;&nbsp;<FONT COLOR=#0000FF>UBound</FONT>(Application.Transpose(arrWerte))&nbsp;-&nbsp;_
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>LBound</FONT>(Application.Transpose(arrWerte))&nbsp;+&nbsp;1,&nbsp;_
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vbInformation&nbsp;+&nbsp;vbOKOnly,&nbsp;"ARRAY&nbsp;:&nbsp;"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox&nbsp;arrWerte(5,&nbsp;1)&nbsp;<FONT COLOR=#008000>'Ausgabe&nbsp;6.Zeile,&nbsp;2.Spalte&nbsp;des&nbsp;ARRAY-Bereiches</FONT>
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>Else</FONT>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox&nbsp;"Zelle&nbsp;"&nbsp;&amp;&nbsp;rngZelle.Address&nbsp;&amp;&nbsp;"&nbsp;ist&nbsp;nicht&nbsp;Bestandteil&nbsp;eines&nbsp;ARRAYS&nbsp;!"&nbsp;&amp;&nbsp;_
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vbLf&nbsp;&amp;&nbsp;vbLf&nbsp;&amp;&nbsp;"Zelle&nbsp;enth&auml;lt&nbsp;nur&nbsp;diesen&nbsp;Wert&nbsp;:&nbsp;"&nbsp;&amp;&nbsp;rngZelle.Value,&nbsp;_
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vbInformation&nbsp;+&nbsp;vbOKOnly,&nbsp;"Kein&nbsp;ARRAY&nbsp;!"
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>End If</FONT>
<FONT COLOR=#0000FF>End Sub</FONT>
</td></tr><tr><td style="background-color:#EBEBEB;font-size:10;">Code eingefügt mit <b><a href="http://rtsoftwaredevelopment.de" target="_blank">Syntaxhighlighter 4.15</a></b></td></tr></tbody></table>