MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 11.01.2019, 23:58   #1
otto-mueller
MOF User
MOF User
Standard Frage - Wie funktioniert CurrentArray in VBA?

Hallo,

kann mir bitte jemand sagen, wie CurrentArray in VBA funktioniert? Am besten anhand eines minimalen Beispiels, das die Funktionsweise zeigt.

Die VBA Hilfe und Google hat mich nicht weitergebracht.

Danke vorab

Viele Grüße

Otto
otto-mueller ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 00:28   #2
Uwe Küstner
MOF User
MOF User
Standard

Hallo Otto,

Code:

Sub Makro1()
    Range("E1:E5").FormulaArray = "=ROW()"
    MsgBox Range("E3").CurrentArray.Address
End Sub

__________________

Gruß Uwe
<pre>Office 2010</pre>
Uwe Küstner ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 12:15   #3
otto-mueller
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo Uwe,

danke für das Beispiel, was auch funktioniert.

Im folgenden Beispiel Makro2 wird das gesamte Array aber nicht erkannt. Offensichtlich wird für jede Zelle ein separates Array erzeugt?:

Code:

Sub Makro2()
    For i = 1 To 5
        Range("E" & i).FormulaArray = "=ROW()"
    Next i
    MsgBox Range("E3").CurrentArray.Address    ' gibt $E$3 zurück
End Sub
Wenn aber einmal der Bereich als Ganzes zum Array gemacht ist, bleibt der Bereich auch nach Überschreiben in der Schleife weiterhin als zusammenhängendes Array erhalten, wie Maktro3 es zeigt:

Code:

Sub Makro3()
    Range("E1:E5").FormulaArray = "=ROW()"
    For i = 1 To 5
        Range("E" & i).FormulaArray = "=ROW()"
    Next i
    MsgBox Range("E3").CurrentArray.Address   ' gibt $E$1:$E$5 zurück
End Sub
Ich verstehe es aber nicht, warum?

Ich verstehe auch nicht, wie man in Excel direkt, also ohne VBA, die Variante
Code:

Range("E1:E5").FormulaArray = "=ROW()"
erzeugen kann. Einzelne Zellen kann man ja mit Strg+Umschalt+Eingabe bestätigen und die Formel wird als Array-Formel erzeugt. Aber das ist dann wieder wie im Makro2, was nicht funktioniert.

Ist es evtl. ein Bug?

Viele Grüße

Otto
otto-mueller ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 12:24   #4
Nepumuk
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Otto,

einfach mehrere Zellen markieren - Formel eingeben und mit Strg + Shift + Enter abschließen. Das ist dann ein zusammenhängendes Array. Darin kannst du dann auch keine Formel mehr ändern oder löschen. Das benötigt man z.B. für eine UDF die ein Array zurückgibt.

Noch ein Beispiel dazu:

Option Explicit

Public Function Test() As Variant
    Dim Temp(1 To 3)
    Temp(1) = "A"
    Temp(2) = "B"
    Temp(3) = "C"
    Test = Temp
End Function

In der Tabelle die Zellen A1-C1 markieren, =Test() eingeben und mit Strg+Shift+Enter abschließen.

*ABC
1ABC

ZelleFormel
A1{=Test()}
B1{=Test()}
C1{=Test()}
Achtung, Matrixformel enthalten!
Die geschweiften Klammern{} werden nicht eingegeben.
Verlassen Sie den Zelleneditor mit Strg+Shift + Enter, statt Enter alleine.

__________________

Gruß
Nepumuk

Geändert von Nepumuk (12.01.2019 um 12:33 Uhr).
Nepumuk ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 13:22   #5
otto-mueller
Threadstarter Threadstarter
MOF User
MOF User
Standard [gelöst] - DANKE!

Hallo Nepumuk,

danke für die schnelle und ausführliche Erklärung. Jetzt weiss ich, wofür es ist und wie es funktioniert.

Jetzt habe ich wieder etwas Neues gelernt - DANKE euch beiden!

Noch eine Ergänzung für andere, die auch diese Frage haben: Wenn die UDF eine Eindimensionales Array zurück gibt, muss die Array-Formel in den entsprechenden Zellen in einer Zeile eingegeben werden - in einer Spalte würde es nur das erste Element des Arrays zurück liefern.
Bei Mehrdimensionale Arrays muss die Array-Formel in einer Matrix aus Zeilen und Spalten eingeben werden.

Code:

Function myArray1() As Variant
'2x2 Matrix
Dim myList(1, 1) As Integer
myList(0, 0) = 1
myList(0, 1) = 2
myList(1, 0) = 3
myList(1, 1) = 4

myArray = myList
End Function
Oder:

Code:

Function myArray2() As Variant
'2x2 Matrix
myArray2 = Array(Array(1, 3), Array(2, 4))
End Function
Zu Makro3: Nach etwas Testen ist mir nun klar, warum das Array nach dem Überschreiben in der Schleife dennoch als zusammenhängendes Array erkannt wird. Der Grund ist: Da der Bereich vor der Schleife ein zusammenhängendes Array ist, Änderungen in einzelnen Zellen des Arrays führt zu Änderung im gesamten Array, d. h. nach jedem Durchgang der Schleife wird die Array-Formel für das ganze Array geändert und somit bleibt das Array nach der Schleife weiterhin zusammenhängend.

Viele Grüße

Otto
otto-mueller ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 13:32   #6
Nepumuk
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Otto,

du kannst ein eindimensionales Array auch in Zeilen ausgeben:

Public Function Test() As Variant
    Dim Temp(1 To 3)
    Temp(1) = "A"
    Temp(2) = "B"
    Temp(3) = "C"
    Test = Application.Transpose(Temp)
End Function

Und ichkenne zumindes eine Excelfunktion in der du ein Formelarray erzeugen musst, nämlich MTRANS.

__________________

Gruß
Nepumuk
Nepumuk ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 16:05   #7
RPP63neu
MOF Meister
MOF Meister
Standard

Zitat: von Nepumuk Beitrag anzeigen

Und ichkenne zumindes eine Excelfunktion in der du ein Formelarray erzeugen musst, nämlich MTRANS.

Moin!
In Excel365 ist dies nicht mehr notwendig.
Die hier relevante Formel steht (nur) in C1,
B2:B15 tut nix zur Sache.

 ABCDEFG
1DatumStatus01.01.201901.01.201902.01.201903.01.201907.01.2019
220.01.2019offenerledigterledigterledigterledigterledigt
302.01.2019erledigt     
412.01.2019-     
525.01.2019offen     
607.01.2019erledigt     
701.01.2019erledigt     
819.01.2019offen     
928.01.2019offen     
1003.01.2019erledigt     
1120.01.2019offen     
1201.01.2019erledigt     
1327.01.2019offen     
1429.01.2019offen     
1514.01.2019offen     

ZelleFormel
C1=MTRANS(SORTIEREN(FILTER(Tabelle1;Tabelle1[Datum]<HEUTE());1;1))
B2=VERWEIS(HEUTE()-A2;{-1E+99;0;1};{"offen"."-"."erledigt"})


Gruß Ralf

__________________

Meine Logik war nicht fehlerhaft, nur meine Interpretation!
Tuvok
RPP63neu ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 16:13   #8
Nepumuk
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Ralf,

die karierte Seite von Excel war mir schon immer suspekt. Von mir aus könnte sich Excel direkt mit dem VBA-Editor öffnen.

__________________

Gruß
Nepumuk
Nepumuk ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 16:15   #9
RPP63neu
MOF Meister
MOF Meister
Standard

__________________

Meine Logik war nicht fehlerhaft, nur meine Interpretation!
Tuvok
RPP63neu ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2019, 16:21   #10
RPP63neu
MOF Meister
MOF Meister
Standard

War auch mehr oder weniger off topic, Nepumuk!
Es gibt mittlerweile so einige Funktionen, die durch Eingabe in einer Zelle eine Ausgabematrix erstellen.
Allerdings wird diese (noch) nicht durch .CurrentArray erkannt.
Nevertheless ergibt es hiermit manch wirklich sinnvolle Anwendung.

Gruß Ralf

__________________

Meine Logik war nicht fehlerhaft, nur meine Interpretation!
Tuvok
RPP63neu ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.01.2019, 19:07   #11
otto-mueller
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo zusammen,

Dankeschön für die weiteren Infos und die Funktionen. Transpose macht die Sache natürlich einfacher. Stimmt, MTRANS gibt es auch noch - hatte ich vergessen.

Viele Grüße

Otto
otto-mueller ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.