Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1316to1320
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 und Select Case

Array und Select Case
21.06.2013 20:47:48
JAck
Hallo Gemeinde
Ich tüftel grad über ein Problem (ist nicht meines, wurde im Forum erstellt) und versuch das zu lösen =)
Ich würde gern ne Mappe Hochladen was aber bei meinem Mac nicht geht -.-
Sei es drum
Ich lese ein Array (6x2) funktioniert auch klaglos
Nun möchte ich leere Datumswerte abfangen
Aber die Select Case Verwendung bringt mich nicht weiter
(Sie selektiert nicht)
In meinem Beispiel sind die Zellen(2,4) und (2,5) leer
sie werden demzufolge im Array an Position (0,0) sowie (0,1) eingebracht
Nun meine Frage: was mache ich denn falsch? Wo ist mein Denkfehler?
Zweite Frage, Ich hab jetzt mit 1 und 99999 maximalwerte angegeben im späteren soll dann überprüft werden ob eine DAtum dazwischen liegt (für den Fall das kein Datum eingetragen ist, soll die Abfrage positiv sein (liegt also auf jeden Fall dazwischen)) kann man das auch anders lösen?
ReDim Preserve VarDatenspanne(IntLeZeile - 2, 1)
For IntZeile = 2 To IntLeZeile
For Spalte = 4 To 5
'' Leere Datumsfelder abfangen
Select Case .Cells(IntZeile, Spalte)
Case .Cells(IntZeile, 4) = ""           'Startdatum leer
VarDatenspanne(IntZeile - 2, Spalte - 4) = CDate(1)
Case .Cells(IntZeile, 5) = ""           'Enddatum leer
VarDatenspanne(IntZeile - 2, Spalte - 4) = CDate(99999)
Case Else
VarDatenspanne(IntZeile - 2, Spalte - 4) = .Cells(IntZeile, Spalte)
End Select
Next Spalte
Next IntZeile
Grüße und
Thanks in advance

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Wie sah das DFeld denn ursprüngl aus, ...
21.06.2013 21:26:51
Luc:-?
…Jack,
da du ja ReDim Preserve benutzt? Man kann zwar ein DFeld Dim VarDatenspanne() ReDimmen, also hier ReDim VarDatenspanne(IntLeZeile - 2, 1), aber nicht ein DFeld ReDim VarDatenspanne(IntLeZeile, 1) in der 1.Dimension mit (IntLeZeile - 2, 1) verändern. Das geht nur mit der jeweils letzten Dimension wie du auch in der VBE-Hilfe zu Preserve leicht nachlesen kannst!
Du musst aber nicht unbedingt ein 2dimensionales VBA-DFeld benutzen! Man kann auch einen Variant verwenden, der einen Vektor enthält, dessen Elemente ebenfalls Vektoren sind. Dazu habe ich schon des öfteren hier und anderswo geschrieben*. Außerdem ist For Each nicht nur eleganter, sondern auch schneller. Man muss nur wissen, wie man so etwas geschickt handhabt.
* Ggf nutzt dir auch meine UDF Collect (im Archiv) was - zumindest als Bsp.
Gruß Luc :-?

Anzeige
AW: Wie sah das DFeld denn ursprüngl aus, ...
21.06.2013 22:12:46
JAck
Hallo Luc
danke für deine Antwort.
..da du ja ReDim Preserve benutzt?
Das ist in dem Fall unnötig. Ich hatte das mangels besseren Wissens so gemacht.
(Im weiteren Verlauf des Makros erweitere ich es allerdings noch im eine Dimension (IntLeZeile;2) )
Man kann zwar ein DFeld Dim VarDatenspanne() ReDimmen, also hier ReDim VarDatenspanne(IntLeZeile - 2, 1), aber nicht ein DFeld ReDim VarDatenspanne(IntLeZeile, 1) in der 1.Dimension mit (IntLeZeile - 2, 1) verändern.
Das mach ich in dem Fall auch nicht IntLeZeile ist die jeweilige Zeile des Quellrange (Zeile2:7)
Daher das -2
Das geht nur mit der jeweils letzten Dimension wie du auch in der VBE-Hilfe zu Preserve leicht nachlesen kannst!
Nur damit ich es nicht falsch verstehe die letzte Dimension meint DFeld(Dimension1,Dimension2) Das heisst ich kann nur eine weitere Dimension hinten anfügen bzw. die letzte (2.) Raushauen?
Oder meint es In Dimension1 bzw. 2 den letzten Wert?
Du musst aber nicht unbedingt ein 2dimensionales VBA-DFeld benutzen! Man kann auch einen Variant verwenden, der einen Vektor enthält, dessen Elemente ebenfalls Vektoren sind. Dazu habe ich schon des öfteren hier und anderswo geschrieben*.
Also ein DFeld(DFeld()) ?
Außerdem ist For Each nicht nur eleganter, sondern auch schneller. Man muss nur wissen, wie man so etwas geschickt handhabt.
Das ist mir in dem Moment nicht eingefallen. Aber stimmt. Ich könnte den Range "abklappern" (for each Cell in Range) (so oder so ähnlich:-D)
* Ggf nutzt dir auch meine UDF Collect (im Archiv) was - zumindest als Bsp.
Archiv.. Wo find ich das denn?
Grüße
Und vielen Dank

Anzeige
Es bestehen da wohl Unklarheiten beim ...
22.06.2013 00:25:02
Luc:-?
…Dimensionsbegriff, Jack;
bei der Dimensionierung eines VBA-DFeldes erscheinen die Dimensionen als Aufführung ihrer MaxPositionen, nicht direkt als Zahl, was du mit „DFeld(Dimension1,Dimension2)“ anscheinend verstanden hast. Mit ReDim Preserve kann man nun die letztaufgeführte Dimension in ihrer Elementeanzahl verändern (auch gänzlich entfernen, dann sind aber auch deren Werte weg!) oder eine neue Dimension (hier Dimension3 ) hinzufügen. Die wäre dann natürlich noch leer.
Ein Variant als Vektor aus Vektoren entspricht konzeptionell weitgehend dem Array-Objekt anderer Pgmiersprachen wie zB J[ava]Script. Mit varArray(0) erhält man hierbei einen ganzen (den 1.) Vektor. Ein einzelnes Element muss dann bspw mit varArray(0)(0) identifiziert wdn. Ein solches DFeld lässt sich gerade aus diesem Grund mitunter leichter handhaben als ein „normales“ 2dimensionales VBA-DFeld, weil es somit leichter zerlegbar ist. Außerdem dürfen sich die Elementeanzahlen der einzelnen vektoriellen Elemente voneinander unterscheiden.
Im Ggsatz dazu kann bei L- bzw UBound die Dimension, auf die sich diese vbFktt beziehen sollen, als 2.Argument direkt mit Nr angegeben wdn.
Bei For Each muss man aber beachten, dass jedes Element nacheinander aufgerufen wird. Dabei unterscheidet sich die Aufrufreihenfolge idR danach, ob es sich um einen Range (ZBereich) oder ein Array (DFeld) handelt. Spalte vor Zeile gilt nur für ZBereiche, bei DFeldern ist es andersherum. Ist das aufgerufene Element ein Vektor, repräsentiert die Laufvariable idR den ganzen Vektor und kann deshalb indiziert wdn (wird mE in keinem ForumsTutorial erwähnt!). Bei derart organisierten ZBereichsangaben passiert das eher nicht. Viell ist das ja auch von der (hier kaum beeinflussbar automatischen) Aufrufreihenfolge abhängig.
…Im Archiv (RechercheButton klicken - Suchbegriff Collect eingeben - Archivsuche klicken → gleich der 1.Eintrag) — genauer →hier! Hierbei geht's aber in 1.Linie um ein stets 1dimensionales ParamArray (als FktsArgument), dessen Elemente mit Vektoren, Matrizen oder Tensoren „bestückt“ wdn können, weil es ebenfalls ein Variant ist.
Gruß Luc :-?

Anzeige
AW: Es bestehen da wohl Unklarheiten beim ...
22.06.2013 01:00:33
JAck
Nabend Luc..
Sicherlich bestehen da für mich Unklarheiten. Ich glaub das generelle Problem ist, dass ich Programmieren so nicht gelernt hab.
Ich versuche mich als Anwender nur retrograd in die von mir benutzten (und auch neue) Elemente einzudenken und weiter zu entwickeln. also nicht das klassische Bottom-Up.. eher Top-Down..
Um Kurz meine Sichtweise auf ein DatenFeld zu erklären( so wie ich es verstehe) ich sehe darin 2 vektoren die sich im 90° Winkel entfernen. Also Vereinfacht gesagt eine Matrix mit X und Y Achse die ich auch so ansprechen kann (X=2 und Y=3 ergeben dann den Datenfeldwert(2,3)
Alternativ 8und das sehe ich darin, ist es eine aneinanderreihung von "parallelen" Vektoren
Das ist eben auch hier meine Denke. Das ich einen Vektor erstelle (a,b,c,d,e,f)
und dazu einen korellierenden Vektor (1,2,3,4,5,6) in dem ich dann ableiten kann das c=3 ist
bei der Dimensionierung eines VBA-DFeldes erscheinen die Dimensionen als Aufführung ihrer MaxPositionen, nicht direkt als Zahl, was du mit „DFeld(Dimension1,Dimension2)“ anscheinend verstanden hast.
Das mit der Max position versteh ich nicht. Meinst du damit die position innerhalb des Vektors in relation zum ersten Eintrag?
Also um im meinem Beispiel zu bleiben Vektor(a,b,c,d,e,f) entspricht die C=3 weil er die 3. position über eintrag Null ist?
  • Mit ReDim Preserve kann man nun die letztaufgeführte Dimension in ihrer Elementeanzahl verändern (auch gänzlich entfernen, dann sind aber auch deren Werte weg!) oder eine neue Dimension (hier Dimension3 ) hinzufügen. Die wäre dann natürlich noch leer

  • Also doch dass ich zu dem Vektor(a-f) und dem Vektor(1-6) noch einen Dritten Vektor(I-VI) hinzufügen kann bzw den Vektor(1-6) ändern bzw. manipulieren kann, jedoch nicht den ersten Vektor (a-f)
    Den kann ich dann auch nicht in der länge Verändern? zb. Vektor(a-d) (unter der vorraussetzung das Vektor(1-6) gleich "lang" bleibt...Richtig?
    Ein Variant als Vektor aus Vektoren entspricht konzeptionell weitgehend dem Array-Objekt anderer Pgmiersprachen wie zB J[ava]Script. Mit varArray(0) erhält man hierbei einen ganzen (den 1.) Vektor. Ein einzelnes Element muss dann bspw mit varArray(0)(0) identifiziert wdn. Ein solches DFeld lässt sich gerade aus diesem Grund mitunter leichter handhaben als ein „normales“ 2dimensionales VBA-DFeld, weil es somit leichter zerlegbar ist. Außerdem dürfen sich die Elementeanzahlen der einzelnen vektoriellen Elemente voneinander unterscheiden.
    Also mal für mich ganz einfach ausgedrückt,
    Ich spreche den "Hauptvektor"(den 1.) mit varArray(0) an und gelange somit auf den 2. Vektor der sich aus dem "Hauptvektor" erstreckt.
    Den sekundärVektor erreiche ich dann über den 2. Parameter varArray(0)(1) ?
    Also erreiche ich mit varArr(2,4) = d
    1 xxxx
    1 abcd
    1 xxxx
    1
    Im Ggsatz dazu kann bei L- bzw UBound die Dimension, auf die sich diese vbFktt beziehen sollen, als 2.Argument direkt mit Nr angegeben wdn
    Was kann ich hinter dem Teil-Satz "als 2. argument direkt mit Nr. angegeben wen"?
    Ich dachte das LBound sowie UBound nur die "Grenzen" des Aray wieder geben?
    Bei For Each muss man aber beachten, dass jedes Element nacheinander aufgerufen wird. Dabei unterscheidet sich die Aufrufreihenfolge idR danach, ob es sich um einen Range (ZBereich) oder ein Array (DFeld) handelt.
    Spalte vor Zeile gilt nur für ZBereiche, bei DFeldern ist es andersherum. Ist das aufgerufene Element ein Vektor, repräsentiert die Laufvariable idR den ganzen Vektor und kann deshalb indiziert wdn (wird mE in keinem ForumsTutorial erwähnt!). Bei derart organisierten ZBereichsangaben passiert das eher nicht. Viell ist das ja auch von der (hier kaum beeinflussbar automatischen) Aufrufreihenfolge abhängig.

    ganz vereinfacht für mich als Laien.... Bei for each durch einen
    Range A1:B3 -- A1-A2-A3-B1-B2-B3
    Array("länge"3) V1:V2 ---V1(1) -V2(1) -V1(2)-V2(2)-V1(3)-V2(3)
    …Im Archiv (RechercheButton klicken - Suchbegriff Collect eingeben - Archivsuche klicken → gleich der 1.Eintrag) — genauer →hier! Hierbei geht's aber in 1.Linie um ein stets 1dimensionales ParamArray (als FktsArgument), dessen Elemente mit Vektoren, Matrizen oder Tensoren „bestückt“ wdn können, weil es ebenfalls ein Variant ist.
    Das schau ich mir jetzt an =)
    Vielen Dank für deine Mühe und Geduld
    Grüße

    Anzeige
    Na, dann weiter, ...
    22.06.2013 04:43:51
    Luc:-?
    …Jack; ;-]
    diesmal nummeriert:
    1. Es gibt in VBA grdsätzlich 2 sich konzeptionell deutlich unterscheidende Arten von DatenFeldern, …
    a) das „normale“ 1- bis n-dimensionale VBA-Array (Vektor, Matrix, 3…n-Tensor), dessen Dimensionen bei der Deklaration (Dim bzw ReDim ) indirekt durch die Anzahl der aufgeführten MaxPositionsnrn - das, was die vbFkt UBound(arrvarname, n) liefern würde (für n=optionale Dimensionsnr, DefaultWert=1) - angegeben wdn; dabei ist ein horizontaler Vektor stets 1-, ein vertikaler stets 2-dimensional (zur Unterscheidung); ein Zellbereich ist, egal, ob Vektor beliebiger Ausrichtung (Zeile oder Spalte), stets 2-dimensional;
    b) einen Variant, der ein DFeld enthält, das ebenfalls Vektor, Matrix oder n-Tensor sein kann. Dabei besteht die Besonderheit darin, dass jedes Element dieses 1…n-Tensors ebenfalls einen 1…n-Tensor enthalten kann, weil der Datentyp ja Variant ist; natürlich lassen sich nur wenige der dadurch bestehenden Möglichkeiten auch direkt in Gänze auf einen Zellbereich abbilden, sie lassen sich aber in Subroutinen verwenden und auswerten; die Grenze der Abbildbarkeit ist eine reguläre Matrix bzw ein DFeld, das auf einfache Weise automatisch in eine solche überführt wdn kann.
    Die ElementPositionsnummerierung beginnt normalerweise stets bei 0 (kann per Option-Eintrag generell geändert wdn, wirkt aber nicht in jedem Fall), für ZBereiche bei 1 (auch WorksheetFunctions, die eine Positionsnr zurückgeben (zB Match ), beginnen stets bei 1. Bei deinem Bsp entspräche c2, wenn die Zählung bei 0 beginnt. Wenn du 2 korrelierende Vektoren (wie in deinem Bsp) anlegst, könntest du mit Index 2 aus dem einen c und dem anderen 3 auslesen.
    2. Ja, Manipulationen sind stets nur an der letzten (rangniedrigsten) Dimension eines n-Tensors möglich (also n) bzw man kann ihn alternativ auf n+u up- bzw n-d (d=1…n-1) „downgraden“.
    3. Hier handelt es sich um den 2.DFeld-Typ Variant mit Array. Man erhält mit varArray(0) wie üblich das 1.Element des „HptVektors“ (besser PrimärVektor), das aber ebenfalls ein Vektor sein kann, also den ersten eines ganzen Bündels von Vektoren, das in seiner Gesamtheit den PrimärVektor bildet (seine Benennung als „1.Vektor“ wäre hier irreführend). Mit varArray(0)(1) erreicht man das 2.Element des 1.Sekundärvektors, der in seiner Gänze dem 1.Element des Primärvektors entspricht. Ein derart aufgebauter Variant mit 3 Elementen, die aus Vektoren unterschiedl Elementeanzahl bestehen, könnte bspw so kreiert wdn:
    varArr = Array(Array("x", "y", "z"), Array(1, 2, 3, 4), Array("a", "b", "c", "d", "e"))
    Allerdings ließe sich der nicht auf einen ZBereich abbilden, weil sowohl Primär- als auch SekundärVektor(en) gleichgerichtet sind. varArr(2, 4) gäbe es nicht, weil das primäre DFeld keine Matrix, sondern ein horizontaler Vektor ist. Aber mit varArr(2)(4) erhielte man "e".
    4. Argumente der vbFktt L- und UBound s.VBE-Hilfe und Pkt 1.!
    5. Spalte vor Zeile bedeutet, dass zeilenweise vorgegangen wird, also zuerst alle Elemente (Spalten) der 1., dann der 2.Zeile usw. Bei DFeldern dann umgekehrt spaltenweise.
    For Each elem In varArr sollte beim ob.angegebenen Inhalt von varArr 3× durchlaufen wdn. Dabei repräsentiert elem stets einen SekundärVektor, so dass eines seiner Elemente mit elem(n), für n=0…UBound(elem), gelesen, aber nicht mit Wirkung auf den eigentl SekundärVektor geändert wdn kann.
    6. Viel Spaß! Die Handhabung der UDF für einen Einsatz in ZellFmln muss gut durchdacht wdn, will man ihre Möglichkeiten voll ausschöpfen und sich dabei nicht verheddern. ;-)
    Morrn, Luc :-?

    Anzeige
    Danke Luc
    22.06.2013 14:01:45
    JAck
    Mein Kopf stellt sich heut auf Stur.. und will noch nicht so recht deinen Text verstehen
    Ich werd ihn später nochmal und nochmal lesen.
    Wollte aber dennoch kurz bescheid geben.
    Vielen Dank erstmal
    Grüße

    Naja, wird ja wieder kühler, dann wird's auch ...
    22.06.2013 14:15:10
    Luc:-?
    …mit dem Verständnis klappen, Jack! ;-)
    Ansonsten, einfach mal alles ausprobieren → also learning by doing!
    Gruß+schöWE, Luc :-?

    =)
    22.06.2013 14:26:32
    JAck
    Das hoffe ich doch (wenn ich mal groß bin) =)
    Aber trotzdem vielen Dank für deine Zeit und Mühe =)
    Und wenn ich überlege wie ich vor 2 Jahren "programmiert" hab, und das mit heute vergleiche so ist das ein Himmelweiter unterschied (von .select und .activate mal ganz abgesehen =)
    Grüße
    Und auch dir ein schönes WoEnd

    Anzeige
    AW: Array und Select Case
    21.06.2013 21:53:14
    Gerd
    Hallo Jack,
    das ist vermutlich mehr als einer. Zeige ode beschreibe bitte die ganze Geschichte.
    Gruß Gerd

    AW: Array und Select Case
    21.06.2013 22:15:37
    JAck
    Hallo Gerd
    Auch dir, vielen DAnk für die Antwort...
    DAs ich mehr als nur einen Denkfehler habe / haben werde, ist nahezu unbestritten =)
    aber gern anbei mein Code
    Ich hoffe er erklärt sich weitgehend selber
    Sub Preisguggen()
    Dim lngDatum As Long
    Dim StrDebitor As String
    Dim StrVKCode As String
    Dim LngPReis As Long
    Dim VarDatenspanne() As Variant
    Dim IntLeZeile As Integer
    Dim IntZeile As Integer
    Dim VarDatumZeile() As Variant
    With Worksheets("Tabelle1")
    ''' BSP 1
    lngDatum = .Cells(10, 2).Value
    StrDebitor = .Cells(11, 2).Value
    StrVKCode = .Cells(12, 2).Value
    LngPReis = .Cells(13, 2).Value
    '' letzte Zeile aktueller Bereich
    IntLeZeile = .Range("A1").CurrentRegion.Rows.Count
    '' Datensammler Datum Einlesen
    ReDim Preserve VarDatenspanne(IntLeZeile - 2, 1)
    For IntZeile = 2 To IntLeZeile
    For Spalte = 4 To 5
    '' Leere Datumsfelder abfangen
    Select Case .Cells(IntZeile, Spalte)
    Case .Cells(IntZeile, Spalte) = ""      'Datum leer
    If Cells(IntZeile, 4) = "" Then VarDatenspanne(IntZeile - 2, Spalte - 5) = CDate(1) ' _
    Startdatum leer
    If Cells(IntZeile, 5) = "" Then VarDatenspanne(IntZeile - 2, Spalte - 4) = CDate(99999)  _
    'Enddatum leer
    Case Else
    VarDatenspanne(IntZeile - 2, Spalte - 4) = .Cells(IntZeile, Spalte)
    End Select
    Next Spalte
    Next IntZeile
    ''Prüfung ob im Datumbereich
    ReDim Preserve VarDatenspanne(IntLeZeile - 2, 2)
    For IntZeile = 2 To IntLeZeile
    If VarDatenspanne(IntZeile - 2, 0) =  _
    lngDatum Then
    VarDatenspanne(IntZeile - 2, 2) = "JA"
    Else
    VarDatenspanne(IntZeile - 2, 2) = "Nein"
    End If
    Next IntZeile
    For i = 0 To IntLeZeile - 2
    MsgBox "Zeile" & i + 2 & Chr(13) & _
    "Start - " & VarDatenspanne(i, 0) & Chr(13) & _
    "Ende - " & VarDatenspanne(i, 1) & Chr(13) & _
    " Datum - " & CDate(lngDatum) & Chr(13) & _
    "Geht" & VarDatenspanne(i, 2)
    Next i
    'MsgBox lngDatum & StrDebitor & StrVKCode & LngPReis
    End With
    End Sub
    
    Grüße
    und danke für die Unterstützung

    Anzeige
    AW: Array und Select Case
    22.06.2013 12:55:38
    Gerd
    Hallo Jack,
    nur damit vielleicht etwas läuft. Die Vorteile von Datenfeldern werden so nicht ausgeschöpft.
    Sub Preisguggen()
    Dim lngDatum As Long
    Dim StrDebitor As String
    Dim StrVKCode As String
    Dim LngPReis As Long
    Dim VarDatenspanne() As Variant
    Dim IntLeZeile As Long
    Dim IntZeile As Long
    Dim VarDatumZeile() As Variant
    Dim Spalte As Long
    Dim i As Long
    With Worksheets("Tabelle1")
    ''' BSP 1
    lngDatum = .Cells(10, 2).Value
    StrDebitor = .Cells(11, 2).Value
    StrVKCode = .Cells(12, 2).Value
    LngPReis = .Cells(13, 2).Value
    '' letzte Zeile aktueller Bereich
    IntLeZeile = .Range("A1").CurrentRegion.Rows.Count
    '' Datensammler Datum Einlesen
    ReDim VarDatenspanne(IntLeZeile - 2, 2)
    For IntZeile = 2 To IntLeZeile
    For Spalte = 4 To 5
    '' Leere Datumsfelder abfangen
    Select Case .Cells(IntZeile, Spalte)
    Case Empty    'Datum leer
    If Spalte = 4 Then If Cells(IntZeile, 4) = "" Then VarDatenspanne(IntZeile - 2, Spalte - _
    4) = CDate(1) ' _
    Startdatum leer
    If Spalte = 5 Then If Cells(IntZeile, 5) = "" Then VarDatenspanne(IntZeile - 2, Spalte - _
    4) = CDate(99999) _
    'Enddatum leer
    Case Else
    VarDatenspanne(IntZeile - 2, Spalte - 4) = .Cells(IntZeile, Spalte)
    End Select
    Next Spalte
    Next IntZeile
    ''Prüfung ob im Datumbereich
    For IntZeile = 2 To IntLeZeile
    If VarDatenspanne(IntZeile - 2, 0) = _
    lngDatum Then
    VarDatenspanne(IntZeile - 2, 2) = "JA"
    Else
    VarDatenspanne(IntZeile - 2, 2) = "Nein"
    End If
    Next IntZeile
    For i = 0 To IntLeZeile - 2
    MsgBox "Zeile" & i + 2 & Chr(13) & _
    "Start - " & VarDatenspanne(i, 0) & Chr(13) & _
    "Ende - " & VarDatenspanne(i, 1) & Chr(13) & _
    " Datum - " & CDate(lngDatum) & Chr(13) & _
    "Geht" & VarDatenspanne(i, 2)
    Next i
    'MsgBox lngDatum & StrDebitor & StrVKCode & LngPReis
    End With
    End Sub
    
    Gruß Gerd

    Anzeige
    AW: Array und Select Case
    22.06.2013 13:59:42
    JAck
    Hallo Gerd.
    vielen Dank für die Anpassung.
    ein zwei fragen haben sich jedoch ergeben.
    1. Die Dimensionierung der Zeile auf Long, da man im zweifel mehr als 32k Zellen erwartet?
    2. Dimensioniert man von Anfang an das Datenfeld auf die maximale Größe? Ich ging bisher davon aus, das es effizienter ist, wenn man das immer erst unmittelbar davor "vergrößert"?
    3. Wie meinst du das, dass die Vorteile von Datenfelder nicht ausgeschöpft werden?
    Letztlich war es ja die Case Empty anweisung die mir fehlte.. right? (Von unzulänglichkeiten der "Programmierung" mal abgesehen) =)
    Grüße und Vielen Dank

    Anzeige
    AW: Array und Select Case
    22.06.2013 14:39:47
    Gerd
    Hallo Jack!
    1.) Ja u. weil bei der Auswertung der Cells-Eigenschaften die Indizes für Zeile u. Spalte ansonsten erst noch von VBA-intern in Long konvertiert werden müssen.
    2.) Wenn die benötigte Größe der letzten(rechten) Dimension von vornherein feststeht (... , 0 to 2), ist Redim Preserve entbehrlich.
    3.) Je nach Datenmenge ist es performanter, die zum Vergleich benötigten Zellenwerte komplett in ein/das Datenfeld einzulesen,
    Vergleiche u. Änderungen darin vorzunehmen u. die Daten en block in die Tabelle zurückzuschreiben.
    Select Case Ausdruck
    Case Dieser Ausdruck ist ...?
    Ob in deinem Fall die Prüfung auf LEER ausreicht, kann ich nicht wissen.
    Gruß Gerd

    AW: Array und Select Case
    22.06.2013 15:08:21
    JAck
    Hallo Gerd
    1.) Ja u. weil bei der Auswertung der Cells-Eigenschaften die Indizes für Zeile u. Spalte ansonsten erst noch von VBA-intern in Long konvertiert werden müssen.
    Kommt dann nicht ein Fehler? Also wenn Der Index höher geht?
    2.) Wenn die benötigte Größe der letzten(rechten) Dimension von vornherein feststeht (... , 0 to 2), ist Redim Preserve entbehrlich.
    Es ist also nicht effizienter..
    Aber, um meine Art und Weise "zu Rechtfertigen", Ich weiss noch nicht wieviele Dimensionen ich noch benötige =)
    Ich weiß, sollte ich wahrscheinlich vorher wissen bzw. sich vorher nen Plan zu schmieden =)
    3.) Je nach Datenmenge ist es performanter, die zum Vergleich benötigten Zellenwerte komplett in ein/das Datenfeld einzulesen,
    Vergleiche u. Änderungen darin vorzunehmen u. die Daten en block in die Tabelle zurückzuschreiben.

    Wie meinst du das? einfach
    range( lbound to ubound) = Datenfeld (lbound to ubound) ?
    Die Idee ist, dass ich dann die Auswertungen innerhalb des Datenfeldes machen wollte um nicht unnötig variablen hin und her zu reichen . Siehe Datumsvergleich
    Select Case Ausdruck
    Case Dieser Ausdruck ist ...?
    Ob in deinem Fall die Prüfung auf LEER ausreicht, kann ich nicht wissen.

    Das ist richtig.. Woher auch =)
    Grüße

    Mal noch dazu, ...
    22.06.2013 19:41:10
    Luc:-?
    …Jack;
    zu 1) idR ja, wenn einer Integer-Variablen ein Long-Wert zugewiesen wird (F6: Überlauf). Dann gelangt das Pgm gar nicht mehr zur Range-Festlegung!
    zu 3) Nee, meint Gerd bestimmt nicht, sondern Range("AdresseErsteBereichsZelleLinksOben") = Datenfeld !
    Gruß Luc :-?

    Ergänzung: Hier hatte ich noch etwas vgessen, ...
    25.06.2013 15:59:39
    Luc:-?
    …Jack;
    du hattest range(lbound to ubound) = Datenfeld (lbound to ubound) vorgeschlagen und ich hatte daraufhin in Range("AdresseErsteBereichsZelleLinksOben") = Datenfeld korrigiert. Da fehlte noch das Resize zur Festlegung des ganzen ZielBereichs:
    Range("AdresseErsteBereichsZelleLinksOben").Resize(UBound(Datenfeld, 1) + 1 - LBound(Datenfeld, 1), UBound(Datenfeld, 2) + 1 - LBound(Datenfeld, 2)) = Datenfeld
    Das gilt so, falls es sich bei Datenfeld um eine Matrix (bzw einen vertikalen Vektor) handelt. Bei einem horizontalen Vektor sähe es so aus:
    Range("AdresseErsteBereichsZelleLinksOben").Resize(1, UBound(Datenfeld) + 1 - LBound(Datenfeld)) = Datenfeld
    In einer Fktsprozedur wäre es einfacher; da müsste das DFeld nur dem Fktsnamen zugewiesen wdn. Den Rest muss man per MatrixFml-Bereichsauswahl manuell erledigen (sofern man dafür keine AutoExpansionsTools wie bspw FlexArr u/o RFix einsetzen kann):
    fktsname = Datenfeld
    Das Fktsergebnis darf dabei aber nicht als nicht-variant vordeklariert sein!
    Gruß Luc :-?

    Geehrter Leser, vgl auch ...
    25.06.2013 18:35:22
    Luc:-?
    hier!
    Luc :-?

    AW: Array und Select Case
    22.06.2013 22:58:41
    Gerd
    Hallo Jack!
    Sub Preisguggen()
    Dim lngDatum As Long
    Dim varDaten As Variant, varCheck As Variant
    Dim lngRow As Long
    With Worksheets("Tabelle1")
    lngDatum = .Cells(10, 2).Value
    '' Spalte D:E im aktueller Bereich
    varDaten = .Range("A1").CurrentRegion.Columns(1).Offset(, 3).Resize(, 2)
    '' Datensammler Datum Einlesen
    ReDim varCheck(1 To UBound(varDaten))
    'Anfangs- bzw.Enddatum in leeren Zellen einsetzen
    For lngRow = 1 To UBound(varDaten, 1)
    If IsEmpty(varDaten(lngRow, 1)) Then varDaten(lngRow, 1) = CDate(1)
    If IsEmpty(varDaten(lngRow, 2)) Then varDaten(lngRow, 2) = CDate(99999)
    'Prüfung, ob Anfangsdatum = Vergleichsdatum
    varCheck(lngRow) = "Nein"
    If varDaten(lngRow, 1) = lngDatum Then varCheck( _
    lngRow) = "JA"
    Next
    'Prüfungsergebnisse in Spalte nach Enddatum:
    .Range("A1").CurrentRegion.Columns(1).Offset(, 5) = WorksheetFunction.Transpose(varCheck)
    'Daten mit geänderten Leerwerten in Tabelle zurückschreiben
    .Range("A1").CurrentRegion.Columns(1).Offset(, 3).Resize(, 2) = varDaten
    End With
    End Sub
    
    Gruß Gerd

    Ich möchte mal wissen
    24.06.2013 08:46:04
    JACKD
    Guten Morgen Gerd, guten Morgen Luc:?
    ... warum ich mir so ne Mühe mache und das alles mit ner Schleife abklapper =)
    Dazu jedoch nicht ne Frage.
    Current Region bildet ja eine Zusammenhängende Fläche aus gefüllten Zellen (nach der angegebenen"Start"- Zelle)
    jetzt sind ja bei mir Zellen ja teilweise leer.. die ignoriert ja ja geflissentlich und holt sich dennoch die Zellwerte. Gibt es dazu ne allgemeingültige aussage?
    Grüße
    Und vielen Dank

    AW: Ich möchte mal wissen
    24.06.2013 11:30:23
    Rudi
    Hallo,
    (nach der angegebenen"Start"- Zelle)
    das ist falsch.
    Range("C5").CurrentRegion.Address = $A$1:$D$10
    ABCD
    1x1x2x3x4
    221222324
    331323334
    441424344
    551525354
    661626364
    771727374
    881828384
    991929394
    10101102103104

    Gruß
    Rudi

    also
    24.06.2013 12:36:23
    JACKD
    "um" statt nach.. ?

    AW: also
    24.06.2013 12:39:29
    Rudi
    Hallo,
    genau.
    Currentregion ist der durch leere Zeilen und Spalten begrenzte Bereich.
    Gruß
    Rudi

    AW: also
    24.06.2013 12:55:29
    JACKD
    Hallo Rudi..
    Dank dir..
    Das heisst, es muss sowohl die GANZE Spalte als auch die GANZE Zeile leer sein?
    Grüße

    AW: also
    24.06.2013 13:09:16
    Rudi
    Hallo,
    nein, nur rundrum.
    2 Bereiche:
    ABCDEF
    1      
    2 xxxx   
    3 xx    
    4 xxxx   
    5      
    6  yyyyyyy 
    7  yy yyy 
    8  yyyy  
    9      

    Wenn du in B5:D5 was reinschreibst, wird es ein Bereich.
    Gruß
    Rudi

    Gut
    24.06.2013 13:12:44
    JACKD
    Hallo,
    Hab mich etwas unglücklich ausgedrück =) Das meinte ich auch.. =)
    Vielen Dank
    Grüße

    Ähm
    24.06.2013 12:37:46
    JACKD
    Hallo Rudi.. hab ich leider vergessen.. mea culpa
    und Grüße =)
    Und vielen Dank
    Also, so alles was man falsch machen konnte -.-

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige