Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1536to1540
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 in NameRange schreiben

Array in NameRange schreiben
30.01.2017 16:50:05
Lukas
Hallo,
ich habe eine Frage zum Befüllen von Werten in ein NameRange:
Ich habe ein Array und kann damit mein NameRange befüllen (siehe Beispiel). Nun kommen neue Werte hinzu und diese sollen hinten angehangen werden.
Nun müsste ich jeden Zellenwert einzeln einfügen, aber ich möchte das aufeinmal machen, so dass ich das Array übergebe.
Bei curName.RefersToRange gibt es das Value und Value2, muss ich das dadrüber machen? Aber wie kann ich dem sagen, füge diese Werte ab z. B. Index 5 hinzu?
Die einzige Möglichkeit die mir einfällt wäre, die alten Werte auf das Array zu übertragen (müsste das Array vergrößern) und dann das ganze zu übergeben. Allerdings wie vergrößere ich ein Array, so dass die Werte verschoben werden?
Das scheint mir auch zu kompliziert zu sein, so dsas ich das nicht als tolle Lösung durchgehen lassen würde.
Hat vielleicht jemand noch eine Idee?
Danke schon mal!
Lukas

Option Explicit
''Normales befüllen
Public Sub Start()
Dim curName As Name
Set curName = ActiveWorkbook.Names("TestName")
Dim i As Integer
Dim asArray(1 To 5, 1 To 1) As String
For i = 1 To 5
asArray(i, 1) = "Wert - " + CStr(i)
Next i
curName.RefersToRange.Value2 = asArray
End Sub
''Hinzufügen von 2 Werten
Public Sub Add()
''Nur 2 Werte sollen angehangen werden
Dim curName As Name
Set curName = ActiveWorkbook.Names("TestName")
Dim i As Integer
Dim asArray(1 To 2, 1 To 1) As String
For i = 1 To 2
asArray(i, 1) = "Add - Wert - " + CStr(i)
Next i
curName.RefersToRange.Value2 = asArray
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array in NameRange schreiben
30.01.2017 18:18:58
Michael
Hi,
versuch mal das:
Public Sub N_Add(wieViele As Long)
Dim z As Long, i As Long, a
Dim curName As Name
Dim nAdr As String
Set curName = ActiveWorkbook.Names("TestName")
nAdr = curName.RefersTo
i = InStrRev(nAdr, "$")
z = CLng(Mid(nAdr, i + 1)) + wieViele
nAdr = Mid(nAdr, 1, i) & z
curName.RefersTo = nAdr
a = curName.RefersToRange.Value2
z = UBound(a)
For i = z - 1 To z
a(i, 1) = "Add - Wert - " + CStr(i)
Next i
curName.RefersToRange.Value2 = a
End Sub
Sub aufruf() ' hier aufrufen ***
N_Add (2)
End Sub

Add habe ich mal in N_Add geändert.
Schöne Grüße,
Michael
Anzeige
AW: Array in NameRange schreiben
31.01.2017 09:30:48
Lukas
Hallo Michael,
vielen Dank für deine Antwort. Ich habe inzwischen eine Lösung gefunden (ähnlich wie du das hast):
Ich erstelle mir einfach ein neues Range (ab Zelle X bis Zelle Y, Werte kommen zum Teil aus curName.RefersToRange und größe es neuen Arrays) und kann dann das neue Array komplett übergeben. Ich muss das Array also nicht vergrößern, was ggf. Zeit kosten würde.
Kann sein, dass ich mich da kurz vor Feierabend falsch ausgedrückt habe.
Danke nochmal!
Lukas
Zu n-dimensionalen VBA-Arrays ist schon ...
30.01.2017 18:40:50
Luc:-?
…soviel geschrieben worden (hier kürzlich erst wieder, auch von mir!), Lukas,
da solltest/könntest du mit Level „VBA gut“ längst wissen wie das und was geht! Du musst doch nur über den Tellerrand deines eigenen Problems hinaussehen und dich auch mal für andere BTe hier (zumindest solchen mit Array im Betreff!) interessieren.
Außerdem kann's nicht schaden, auch mal in der VBE-Hilfe nachzulesen → Stichwort ReDim Preserve. Dabei aber das Dimensionsproblem beachten (s.u.Folgd)!
Und dann gibt's da ja noch die andere Array-Form aus ggf auch immer 1dimensionalen Arrays, deren verschiedene Ebenen alle für sich redimensioniert wdn können (beim klassischen VBA-Array stets nur die letzte Dimension!).
Die durch Redimensionierung neu vorbereiteten Elemente können dann gezielt belegt wdn.
Das mit RefersToRange ist übrigens Quatsch. Hier wird ein Objekt, nämlich (wie der Name schon sagt) ein Range-Bezug verlangt. Ein Array ist in VBA kein Objekt (schon gar nicht ein Bereich!). Nur ein einem Array vglbares Scripting.Dictionary ist ein solches!
Folglich kannst du ein Array nur mit seinen Werten (als MatrixKonstante in TextForm!) dem .Value bzw .RefersTo oder .RefersToLocal (unterschiedliche Notationsform!) oder alternativ eben einen Zellbezug als Adresse bzw dem o.g. auch als ObjektReferenz zuordnen.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Zu n-dimensionalen VBA-Arrays ist schon ...
31.01.2017 09:23:40
Lukas
Hallo Luc,
danke für die ausführliche Antwort! Beim Schreiben meiner Antwort kam mir doch noch eine Idee und diese funktioniert auch.
Denncoh zum besseren Verständnis lasse ich meine alte Antwort drin. Meine Idee kommt dann im letzten Abschnitt:
Ich kenne ReDim Preserve etc. Musste schon vor über 10 Jahren mit VBA arbeiten, leider. Vielleicht habe ich mich bei meinem Beitrag zum Teil falsch ausgedrückt (kurz vor Feierabend :) )
Ich dachte eher, dass es vielleicht eine Methode gibt, die ich noch nicht kenne, etwas excelspezielles.
Das Array zu vergrößern und dann die WErte einzeln zu übergeben will ich nicht, da ich "Angst" habe, dass dieser Vorgang zu viel Zeit in Anspruch nimmt.
Ich habe anfänglich jede Zelle einzeln befüllt und bei ca. 1000 Zeilen mit 20 Spalten mit mehreren Worksheets konnte man zu schauen, wie Excel alles ausfüllt.
Nachdem ich entdeckt habe, dass man auch ein komplettes Array übergeben kann, war ich zufrieden mit.
Nun kommen im laufenden Prozess neu Werte hinzu und diese sollen angehangen werden. Den Namensbereich habe ich vergrößert, es fehlen nur noch die neuen Werte.
Mir fehlt so was wie, füge ab Index X alle diese Werte (Array) hinzu.
Mir kam beim Scheiben der Einfall, dass ich mir ein Range von Zelle X bis Zelle Y machen kann. Dieses kann ich, wie in meinem Beispiel, mit den Werten aus meinem Array befüllen. Ich muss mich nicht auf den NameRange beziehen.
Gruß
Lukas
Anzeige
AW: Zu n-dimensionalen VBA-Arrays ist schon ...
31.01.2017 09:54:34
Daniel
Hi
beim Arbeiten mit einfachen Wert-Arrays kann man eigentlich problemlos Schleifen verwenden.
Das geht sehr schnell
Bspw ist:

Redim B(LBound(A, 2) to Ubound(A, 2), LBound(A, 1) To UBound(A, 1)
for z = lbound(A, 1) to Ubound(A, 2)
for s = Lbound(A, 2) to Ubound(A, 2)
B(s, z) = A(z, s)
Next
Next
schneller und leistungsfähiger (verarbeitbare Datenmenge) als
B = Worksheetfunction.Transpose(A) 
Sobald du Werte in Excelzellen schreibst, solltest du Schleifen möglichst vermeiden.
Das liegt daran, dass das Schreiben eines Wertes in eine Excelzelle eine Vielzahl von Folgeaktionen auslöst (Bildschirmaktualisierung, Suche nach betroffenen Formeln, ggf Neuberechnung dieser Formeln), während das Ändern eines Array-Werts nichts weiter passiert.
Gruß Daniel
Anzeige
AW: Zu n-dimensionalen VBA-Arrays ist schon ...
31.01.2017 10:04:50
Lukas
Hallo Daniel,
danke für die Infos!
Das mit den Schleifen vermeiden habe ich ja schmerzhaft schon erfahren dürfen :)
Gruß
Lukas
AW: Array in NameRange schreiben
30.01.2017 18:41:41
ChrisL
Hi Lukas
Vielleicht reicht auch:
Spalte = Range("Name").Column
SpaltenEnde = Cells(Rows.Count, Spalte).End(xlUp).Row + 1
Set Bereich = Range(Cells(SpaltenEnde, Spalte), Cells(SpaltenEnde + Ubound(asArray), Spalte))
(Bereichsnamen nur zur Identifikation der Spalte verwendet)
cu
Chris
AW: Array in NameRange schreiben
31.01.2017 09:33:03
Lukas
Hallo Chris,
ja genau, ich erstelle mir ein neuen Bereich und kann dann das neue Array dort übergeben. Diese Idee fehlte mir leider gestern.
Danke!
Lukas
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige