VBA ARRAY ein und auslesen
#1
Heje Excelfreunde,

Versuch (stringdaten = Tagesdatum) in ein Array ein- und auszulesen. Mit den for-Schleifen funktioniert das auch ganz gut, nur etwas müsig. Die Daten werden in ComboBoxen eingelesen. Zurvor werden die Basisdaten zu Daten ohne Duplikate aufbereitet. Einmal auf
die reinen Jahreswerte in eine Combobox und die Tagesdaten in eine weiter Combobox. Mit Auswahl einer Jahreszahl werden in der zweiten Combobox die Tageswerte entsprechend auf die der Jahreszahl reduziert. Vorgang beendet, werden anschließend wieder die Tageswerte vollständig in die Combobox zurückgeschrieben.
Das Array "strYearSortDatum" ist modulweit und beinhaltet die duplikatfreien Tageswerte. Im Codebeispiel werden die Daten in das Array geschrieben. Funktioniert auch. In ähnlicher Weise werden die Daten auch zurückgeschrieben. Das muss schneller und eleganter gehen.
Habe schon einiges probiert, aber irgendwie klappt es nicht...

Bitte um Vorschläge, Ideen...Werte aus einem Rangebereich in ein Array zu schreiben und Daten wieder in einen Rangebereich zurückzuschreiben.

so wie: strYearSortDatum = rngSp02.value oder anders...

Siehe nachfolgendes Code-Bsp.

Code:
Private Sub YearSortDatumArryBefuellen()
Dim WSTab03 As Worksheet
Dim lngLastRow02 As Long
Dim rngSp02 As Range
Dim lngZ01 As Long

    On Error GoTo Fehler
    Set WSTab03 = ThisWorkbook.Worksheets("Tabelle3")
    Set rngSp02 = ThisWorkbook.Worksheets("Tabelle3").Range("AR10:AR25008")
    lngLastRow02 = rngSp02.Rows(rngSp02.Count).End(xlUp).Row
   
    With ActiveWorkbook
        .Unprotect
        With WSTab03
            .Unprotect
                Erase strYearSortDatum()
                ReDim strYearSortDatum(1 To (lngLastRow02 - 9))
               
                For lngZ01 = 1 To (lngLastRow02 - 9) Step 1                'Das Array wir aus AR10:AR25008 befüllt
                    strYearSortDatum(lngZ01) = CStr(.Range("AR" & lngZ01 + 9).Value)
                    'Debug.Print strYearSortDatum(lngZ01)
                Next lngZ01
           
            .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        End With
        .Protect Structure:=True, Windows:=False
    End With
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#2
Beipeildatei vergessen hochzuladen ?
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#3
Hallöchen,

Zitat:so wie: strYearSortDatum = rngSp02.value
welches Problem hast Du damit? Falsch dimensioniert? (korrekt wäre nur Dim strYearSortDatum)

1)
Du kannst doch einen Bereich direkt in ein Array übernehmen und anschließend wieder zurückschreiben, das geht ohne Schleife.
2)
manchmal sind interne Funktionen auch schnell und einfach zu programmieren. Du kannst einen Bereich an andere Stelle kopieren, Duplikate entfernen, sortieren, und dann in der Combo als Source verwenden oder das über ein Array tun.
3)
für eindeutige Werte kannst Du auch eine Collection nehmen. Du musst dann allerdings die Collection in einer Schleife durchgehen und die Combo füllen.
4)
...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#4
Heye Excelfreunde, snb, schauan,

snb:  Das extrahieren von Daten ist nicht zulässig, bzw. auch nicht eben so mal...ich dacht dass der originalauszug aus dem einen
Macro reicht und es sich mehr um "schreibtechnische Darstellungen" handelt und so als Ideenlieferandt ausreicht.

Schauan: Deine Vorschläge werden schon in Form zb. advancefilter stark angewandt und so auch die Daten in comboboxen implementiert. das Array wird auch mit dim korrekt angelegt.

strYearSortDatum = rngSp02.value wenn das keine Probleme machen würde, würde es in Anwendung kommen. Auch habe ich einen anderen rngBereich über set definiert und datenkonform angepasst. Daten können über debug.print jeweils ausgelesen werden, aber
kann die Daten nicht in das Array übertragen...Fehlercode 13, Typ unverträglichkeit. Bei den Daten handelt sich immer im strings, auch wenn sie ein Datum darstellen. Ebenso wirden die Bereiche in den Tabellen als "Text" definiert...
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#5
Hallöchen,

nimm eine neue Datei.
Trage in A1:A3 die Zahlen 1-3 ein

Führe diesen Code aus

Sub test()
Dim arrBereich
arrBereich = Range("A1:A3").Value
Stop
End Sub

Schaue beim Stop in die Überwachung von arrBereich oder ins Lokalfenster dazu.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#6
Hey Excelfreund, schauan

habe das oben genannte Bsp. ausgeführt und es funktioniert auch... Im nach folgenden Code Schnipsel dargestellt, habe ich
das Bsp. nachgebaut, keine der Varianten funktioniert. Immer der Fehler 13. Nur die For-Next Schleife funktioniert tadellos.

Code:
    strBer = "AR10:AR" & lngLastRow02  '>>> im Bsp. = 50
    Set rngSp01 = ThisWorkbook.Worksheets("Tabelle3").Range(strBer)
    Erase strYearSortDatum()
    ReDim strYearSortDatum(1 To (lngLastRow02 - 9))
               
1)  strYearSortDatum = .range(strBer).Value

2)  strYearSortDatum = .range("AR10:AR50").Value

3)  strYearSortDatum = rngSp01.Value
 
    Stop

For lngZ01 = LBound(strYearSortDatum) To UBound(strYearSortDatum) Step 1  'Das Array wir aus AR:AR25008 befüllt
    strYearSortDatum(lngZ01) = CStr(.Range("AR" & lngZ01 + 9).Value)
    Debug.Print strYearSortDatum(lngZ01), lngZ01
Next lngZ01
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#7
Hallöchen,

wenn Du mein Beispiel umsetzt, warum nimmst Du

ReDim strYearSortDatum(1 To (lngLastRow02 - 9))

Ich habe das so nicht.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#8
Moin


Zitat:Im nach folgenden Code Schnipsel dargestellt, habe ich das Bsp. nachgebaut, keine der Varianten funktioniert.
Ich denke du hast es nicht nachgebaut, sondern entscheidend verändert.

Das sehe ich nicht bei @Schauan und wird wahrscheinlich das Problem verursachen.
Erase strYearSortDatum()
ReDim strYearSortDatum(1 To (lngLastRow02 - 9))

Sondern:
Dim strYearSortDatum
               
strYearSortDatum = Range("AR10:AR50").Value

PS: Nu war Andre doch schon Wach Wink

Gruß Elex
Antworten Top
#9
Heje Excelfreunde, schauan, Elex,

ok ok, wer lesen kann ist im ein Vorteil... das funktioniert, auch in umgekehrter Weise. Siehe hierzu  1) und 2).

Nun führt diese For-Next Schleife zu einem Problem mit der Fehlermeldung: Fehlercode 9, Index ausserhalb des gültigen Bereichs.????
Meine ARRAY-Welt ist am Schwanken...
Code:
1)   .Range("AZ10:AZ" & lngLastRow02).Value = strYearSortDatum

2)    strYearSortDatum = .Range("AR10:AR" & lngLastRow02).Value


lngZ02 = 10
For lngZ01 = 1 To (lngLastRow02 - 9) Step 1
    If UserForm5.cmb05Jahr.Value = Year(strYearSortDatum(lngZ01)) Then
        .Range("AZ" & lngZ02).Value = strYearSortDatum(lngZ01)
        lngZ02 = lngZ02 + 1
    End If
Next lngZ01
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#10
Im Lokal-Fenster kannst du dir das Array und seine Dimensionierung ansehen. Je nach dem wie man es füllt hat es Unterschiede in der Dimension.

In dem Fall sollte das so Klappen.
Code:
lngZ02 = 10
For lngZ01 = 1 To (lngLastRow02 - 9) Step 1
    If UserForm5.cmb05Jahr.Value = Year(strYearSortDatum(lngZ01,1)) Then
        .Range("AZ" & lngZ02).Value = strYearSortDatum(lngZ01,1)
        lngZ02 = lngZ02 + 1
    End If
Next lngZ01

Gruß Elex
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • radagast
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste