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 14.05.2019, 20:15   #1
Mr_Venom
Neuer Benutzer
Neuer Benutzer
Standard VBA - 2D Array, erste mit unbestimmter Länge

Hallo Zusammen,

ich will Daten von ein Worksheet in ein neues kopieren. Hierfür sollen die Daten in ein Array gespeichert werden. Die erste Dimension hat eine unbestimmte Länge. Die zweite Dimension hat nur zwei Werte.

PHP-Code:

Private Sub daten_kopieren()
    
Dim ArrDaten() As Variant
    Dim k 
As Long0
    
    
For 13 To ActiveSheet.Cells(132).End(xlDown).Row
        
If ActiveSheet.Cells(x5).Value "Bearbeiter" Then
        ReDim Preserve ArrDaten
(k1)
        
ArrDaten(k0) = ActiveSheet.Cells(x2).Value
        ArrDaten
(k1) = ActiveSheet.Cells(x8).Value
        k 
1
        End 
If
Next
End Sub 
Ich bekomme beim Ausführen immer einen Laufzeitfehler 9. und kann mir nicht erklären warum.
Muss ich anders vorgehen wenn ich eine Dimension mit bestimmter länge hat.

Grüße
Venom
Mr_Venom ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2019, 20:51   #2
Mase
MOF Koryphäe
MOF Koryphäe
Standard

Hi,

ReDim Preserve:
Die variable k ist danach immernoch 0

__________________

gruß
Marco

Feedback erwünscht.
Wie ? -> Verwende hierzu das mittlere Symbol links.
Mase ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2019, 21:39   #3
Flotter Feger
MOF Profi
MOF Profi
Standard

Hallo,

andersrum wird eine Array draus ...

ReDim Preserve ArrDaten(1, k)

Du kannst immer nur die letzte Dimension ändern, nicht die vorderen.

PHP-Code:

ReDim Preserve ArrDaten(0 to 10 to k)
        
ArrDaten(0k) = ActiveSheet.Cells(x2).Value
        ArrDaten
(1k) = ActiveSheet.Cells(x8).Value
        k 

__________________

VG Sabina

Wer auch weiter Hilfe erwartet, sollte sich nicht zu schade sein, ein kurzes Feedback zu geben.
War der Post für dich hilfreich, darf er von dir auch gerne positiv bewertet werden.
bei mir läuft Win 7 32-Bit - Office 2010 Pro Plus 32-Bit und Office 2016 Pro Plus 32-Bit
Flotter Feger ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.05.2019, 21:44   #4
slowboarder
MOF User
MOF User
Standard

Hi
mit Redim Preserve kannst du immer nur die letzte Dimenson, hier also die zweite (Spalten) ändern.

liegt wahrscheinlich an der Art, wie VBA intern solche Arrays ablegt. Beim Hinzufügen in der letzten Dimension können die Daten einfach weitergeschrieben werden, bei ändernungen in anderen Dimensionen müsste dann warscheinlich alle gespeicherten Werte intern umorganisiert werden und das wäre dann zuviel aufwand.

das Redim Preserve brauchst du aber nicht, weil du ja schon vorher die Anzahl der Elemente in deinem Array bestimmen kannst (Worksheetfunction.CountIf(Columns(5), "Bearbeiter")) und somit das Array schon gleich auf die passende Größe redimmen kannst.

wenn man das Redim Preserve unbedingt braucht, weil man die notwendige Größe nicht vorher ermitteln kann, dann muss man ggf beim Befüllen des Arrays Zeilen und Spalten tauschen und hinterher ggf wieder mit Worksheetfunction .Transpose zurücktauschen:

PHP-Code:

Redim Preserve arrDaten(1k)
ArrDaten(0k) = ActiveSheet.Cells(x2).Value 
ArrDaten
(1k) = ActiveSheet.Cells(x8).Value 

und nach der Schleife dann.

PHP-Code:

ArrDaten Worksheetfunction.Transpose(ArrDaten
Gruß Daniel
slowboarder ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2019, 19:44   #5
Mr_Venom
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Super vielen Dank für eure Tipps.
@Slowboarder kann ich eigentlich auch mit (Worksheetfunction.CountIf(Columns(5), "Bearbeiter")) ein 2d array aufbauen?
Mr_Venom ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2019, 21:04   #6
slowboarder
MOF User
MOF User
Standard

so wie du mit jeder normalen Zahl ein 2-d-Array aufbauen kannst.
Gruß Daniel
slowboarder ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2019, 21:42   #7
ebs17
MOF Guru
MOF Guru
Standard

Denkbar wäre auch, den betrachteten Bereich als Tabelle zu betrachten, auf "Bearbeiter" zu filtern und aus der verblieben Ergebnismenge die Werte der gewünschten Spalten zu kopieren. Stichwort Power Query.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}:{12} <= geklammerte Zahlen sind Einzelthemen
Dein Dankeschön: DBWiki => Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.05.2019, 22:27   #8
knobbi38
MOF User
MOF User
Standard

Hallo Venom,

wie andere schon geschrieben haben, geht es nicht so einfach mit einem 2D-Array, aber man könnte stattdessen ein Jagged-Array verwenden. Hier mal deine Sub entsprechend umgeschrieben:

Code:

Private Sub daten_kopieren()
  Dim ArrDaten() As Variant
  Dim x As Long:
  Dim k As Long
  
  ArrDaten = Array()
  
  For x = 13 To ActiveSheet.Cells(13, 2).End(xlDown).Row
    If ActiveSheet.Cells(x, 5).Value = "Bearbeiter" Then
      k = UBound(ArrDaten) + 1
      
      ReDim Preserve ArrDaten(k)
      
      ArrDaten(k) = Array( _
          ActiveSheet.Cells(x, 2).Value, _
          ActiveSheet.Cells(x, 8).Value _
        )
    End If
  Next
End Sub
Der Zugriff, z.B. auf das erste Element, erfolgt dann mit ArrDaten(k)(0) , anstatt mit ArrDaten(k,0)

Gruß Ulrich
knobbi38 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 09:46 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.