Office: (Office 2016) Handling von Datenfeldern

Helfe beim Thema Handling von Datenfeldern in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, ich verzweifel gerade mal wieder am Handling von Datenfeldern :mad:. Ich habe ein Excel-Sheet mit 5706 Zeilen und 48 Spalten. Aus... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Lutz Fricke, 18. August 2016.

  1. Lutz Fricke Erfahrener User

    Handling von Datenfeldern


    Hallo zusammen,

    ich verzweifel gerade mal wieder am Handling von Datenfeldern Handling von Datenfeldern :mad:.
    Ich habe ein Excel-Sheet mit 5706 Zeilen und 48 Spalten. Aus diesem Sheet benötige ich 2 Spalten, die ich in ein Feld einlesen und weiterverarbeiten möchte.

    Das ist der Anfang meines Codes, der in der vorletzten Zeile hängen bleibt "Index außerhalb des gültigen Bereichs".
    LetzteZeileDatenQC hat den Wert 5706, Zeile den Wert 5704.
    Versuche ich, das eingelesene Datenfeld über die darüberliegende Schleife auszugeben, bleibt das Makro mit demselben Fehler mit Zeile=1 hängen.

    Option Explicit
    Option Base 1

    Public QCRohDaten(), QCDaten()

    LetzteZeileDatenQC = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

    SpaltePOQC = Cells.Find(What:="Process Order No.", After:=ActiveCell, LookIn:=xlValues, LookAt _
    :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase _
    :=False, SearchFormat:=False).Column
    SpalteDateRes = Cells.Find(What:="Date of Results Rec.", After:=ActiveCell, LookIn:=xlValues, LookAt _
    :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase _
    :=False, SearchFormat:=False).Column

    ReDim QCRohDaten(LetzteZeileDatenQC, 2)

    QCRohDaten = Union(Range(Cells(4, SpaltePOQC), Cells(LetzteZeileDatenQC, SpaltePOQC)), Range(Cells(4, SpalteDateRes), Cells(LetzteZeileDatenQC, SpalteDateRes))).Value

    'ThisWorkbook.Activate
    'For Zeile = 1 To LetzteZeileDatenQC
    ' Cells(Zeile, 1) = QCRohDaten(Zeile, 1)
    ' Cells(Zeile, 2) = QCRohDaten(Zeile, 2)
    'Next


    For Zeile = 1 To LetzteZeileDatenQC
    If QCRohDaten(Zeile, 1) <> "" Then objSD(QCRohDaten(Zeile, 1)) = 0
    Next


    Wo ist der Fehler?

    Natürlich bin ich auch für alle Tips dankbar, die mir das Einlesen der Daten schneller machen.

    Vielen Dank für Eure Hilfe,
    Lutz
     
    Lutz Fricke, 18. August 2016
    #1
  2. Exl121150 Erfahrener User
    Hallo Lutz,

    1) der entscheidende Knackpunkt des Problems liegt in der Zuweisung des UNION-Bereiches aus Excel an das dynamische Array QCRohDaten() in VBA:
    Du möchtest offenbar die Werte zweier nicht nebeneinander liegenden Excel-Spalten an das Array QCRohDaten zuweisen. Das funktioniert auch, so wie du es programmiert hast, genau dann, wenn es sich um 1 zusammenhängenden Zellbereich handelt. Bei einem mit UNION(..) erstellten zusammengesetzten Bereich scheitert diese Zuweisung - es wird zwar dabei weder ein Compiletime- noch ein Runtime-Error erzeugt, aber das Ergebnis ist trotzdem nicht das gewünschte.
    Du möchtest zuerst mittels REDIM das Array QCRohDaten() dimensionieren, was auch geschieht, nur wird dies wieder durch die nachfolgende UNION-Zuweisung zunichte gemacht - es erfolgt dort eine neuerliche Neudimensionierung für ein 1-spaltiges 2-dimensionales Array. In dieses Array werden die Daten der 1. Spalte (Spalte "SpaltePOQC") gespeichert, die Daten der 2. Spalte (Spalte "SpalteDateRes") fallen unter den Tisch.

    2) Eine weitere Problematik ergibt sich, indem der Zellbereich in Zeile 4 beginnt, die REDIM-Dimensionierung ohne Abzug der ersten 3 Zeilen erfolgt.

    3) Mein Vorschlag, der im nachfolgenden Code enthalten ist, besteht darin, das Array QCRohDaten 1-dimensional mit 2 Variant-Elementen zu erzeugen, somit jede Spalte einzeln einem QCRohDaten-Element zuzuweisen. Da eine Zellbereichszuweisung an ein Array stets 2-dimensional erfolgt, auch wenn es nur jeweils um 1 Spalte geht, ist in jedem QCRohDaten-Element wiederum ein 2-dimensionales Array (aber nur für je 1 Spalte) enthalten.
    Daraus resultiert dann im Folgenden die etwas merkwürdige Elementadressierung für QCRohDaten:
    QCRohDaten(Sp)(Zeile,1)
    Dabei ist Sp=1 für die Zellwerte aus Spalte "SpaltePOQC" und Sp=2 für die Zellwerte aus Spalte "SpalteDateRes"
    Die Werte für "Zeile" sind jeweils die Zellnummerierung für die Zellen der Zellspalte (beginnend bei "1" und endend bei "LetzteZeileDatenQC-3")
    Der 3. Indexwert (der 2. in der 2. Klammer) muss stets 1 sein wegen der Einspaltigkeit der dem Array zugewiesenen Bereichswerte.

    4) Die Funktion/Eigenschaft (oder was immer es sein soll) namens "objSD(...)" in der vorletzten Zeile habe ich unverändert übernommen, da die dazugehörige Deklaration nicht vorliegt.

    5) Im folgenden Code habe ich das Ganze in die "Sub ttt1()" gepackt, um es bei mir unter VBA testen zu können, und mit weiteren Deklarationen versehen.

    Code:
    Option Explicit
    Option Base 1
    
    Public QCRohDaten() As Variant, QCDaten() As Variant
    
    Sub ttt1()
     Dim LetzteZeileDatenQC As Long
     Dim SpaltePOQC As Long
     Dim SpalteDateRes As Long
     Dim Zeile As Long
    
     With ActiveSheet.UsedRange
       LetzteZeileDatenQC = .Row + .Rows.Count - 1
     End With
    
     SpaltePOQC = Cells.Find(What:="Process Order No.", After:=ActiveCell, _
          LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
          MatchCase:=False, SearchFormat:=False).Column
     SpalteDateRes = Cells.Find(What:="Date of Results Rec.", After:=ActiveCell, _
          LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
          MatchCase:=False, SearchFormat:=False).Column
    
     ReDim QCRohDaten(1 To 2)
    
     QCRohDaten(1) = Range(Cells(4, SpaltePOQC), Cells(LetzteZeileDatenQC, SpaltePOQC)).Value
     QCRohDaten(2) = Range(Cells(4, SpalteDateRes), Cells(LetzteZeileDatenQC, SpalteDateRes)).Value
    
     'Um die QCRohDaten() wieder in die identischen Zellen zurückzuspeichern,
     'müsste folgende FOR-Schleife eingesetzt werden:
     'For Zeile = 1 To LetzteZeileDatenQC - 3
     ' Cells(Zeile + 3, SpaltePODQC) = QCRohDaten(1)(Zeile, 1)
     ' Cells(Zeile + 3, SpalteDateRes) = QCRohDaten(2)(Zeile, 1)
     'Next Zeile
    
    
     For Zeile = 1 To LetzteZeileDatenQC - 3
       If QCRohDaten(1)(Zeile, 1) <> "" Then objSD(QCRohDaten(1)(Zeile, 1)) = 0
     Next Zeile
    
    End Sub
    
     
    Exl121150, 20. August 2016
    #2
  3. Lutz Fricke Erfahrener User
    Hallo Anton,

    vielen Dank für deine ausführliche Erklärung.

    Leider werde ich aus der Erklärung und dem Code nicht ganz schlau. Ist es richtig, dass du in das Array QCRohDaten zwei 1-dimensionale Arrays schreibst?
    Das Ausgeben kann dann natürlich auch umgekehrt funktionieren, oder?

    Range(Cells(4, 1), Cells(LetzteZeileDatenQC, 1))=QCRohDaten(1)
    Range(Cells(4, 2), Cells(LetzteZeileDatenQC, 2))=QCRohDaten(2)


    Habe noch zwei ergänzende Fragen:

    Wie kann ich die Ausgabe formatieren? In der Spalte DateRes stehen Datums-Werte, die aber offensichtlich nicht sauber ins Array eingelesen werden. Daher arbeite ich im Code immer mit CDate, was gut funktioniert. Aber bei der Ausgabe muss ich die jeweilige Zelle als Datum formatieren. Außerdem sollen Daten, die vor dem heutigen liegen, rot dargestellt werden. In einer For-Next-Schleife läuft das, aber es daaauuuuuuert...

    Wieso bestimmst du die Anzahl an Zeilen so:
    With ActiveSheet.UsedRange
    LetzteZeileDatenQC = .Row + .Rows.Count - 1
    End With

    Und wo ist der Unterschied zwischen .Row und .Rows.Count?

    Vielen Dank für die Hilfe,
    Lutz

    P.S.: objSD ist als Set objSD = CreateObject("scripting.dictionary") definiert und soll die Anzahl der verschiedenen Einträge in Spalte POQC zählen.
     
    Lutz Fricke, 29. August 2016
    #3
  4. Lutz Fricke Erfahrener User

    Handling von Datenfeldern

    Hallo Anton,

    vielen Dank für deine ausführliche Erklärung. Hab's aber noch nicht so ganz verstanden.

    Schreibst du in das Array QCRohDaten zwei 1-dimensionale Arrays?

    Geht die Rückgabe auch umgekehrt, also:
    Range(Cells(4, SpaltePOQC), Cells(LetzteZeileDatenQC, SpaltePOQC))=QCRohDaten(1)
    Range(Cells(4, SpalteDateRes), Cells(LetzteZeileDatenQC, SpalteDateRes))=QCRohDaten(2)

    Bisher habe ich's mit For-Next-Schleife gelöst, da ich dabei auch noch Formatierungen vorgenommen habe (Datums-Format, teilweise rote Schrift).

    Außerdem habe ich in meinem Makro verschiedene Arrays. Dabei weise ich Daten aus zwei anderen Arrays meinem Hauptarray zu. Das mache ich gleich beim Einlesen des Hauptarrays. Wie mache ich das mit Deinem Vorschlag?

    ReDim Daten(LetzteZeileDaten, 14)
    For Zeile = 4 To LetzteZeileDaten
    Daten(Zeile, 1) = Cells(Zeile, SpalteMat)
    Daten(Zeile, 2) = Cells(Zeile, SpalteMatDesc)
    ' Daten(Zeile, 3) = Cells(Zeile, SpalteExMat)
    Daten(Zeile, 3) = Left(Daten(Zeile, 2), 7)
    Daten(Zeile, 4) = Cells(Zeile, SpaltePO)
    Daten(Zeile, 5) = Cells(Zeile, SpaltePOType)
    Daten(Zeile, 6) = Cells(Zeile, SpalteTarQuant)
    Daten(Zeile, 7) = Cells(Zeile, SpalteBasicFinish)
    Daten(Zeile, 8) = Cells(Zeile, SpalteShipTo)
    Daten(Zeile, 9) = Cells(Zeile, SpaltePlannedGI)
    Daten(Zeile, 10) = Cells(Zeile, SpalteOrderStat)
    For Suche = 1 To UBound(QCDaten, 1)
    If Daten(Zeile, 4) = QCDaten(Suche, 1) Then
    Daten(Zeile, 11) = QCDaten(Suche, 2)
    Exit For
    End If
    Next Suche

    For Suche = 1 To UBound(MatListeAlt(1), 1)
    If Daten(Zeile, 4) = MatListeAlt(1)(Suche, 1) Then
    Daten(Zeile, 12) = MatListeAlt(2)(Suche, 1)
    Daten(Zeile, 13) = MatListeAlt(3)(Suche, 1)
    Daten(Zeile, 14) = MatListeAlt(4)(Suche, 1)
    Exit For
    End If
    Next Suche

    Next Zeile


    Die Deklaration zu objSD ist:
    Set objSD = CreateObject("scripting.dictionary")
    und soll die Anzahl verschiedener Einträge zählen.

    Vielen Dank für Deine Hilfe,
    Lutz

    P.S.: Wie bekommt man eigentlich Code in so ein übersichtliches Fenster?
     
    Lutz Fricke, 30. August 2016
    #4
  5. Moin!
    Zwei Möglichkeiten:
    Entweder Du klickst bei der Schnellantwort auf Erweitert, dort gibt es eine Code-Schaltfläche #,
    oder Du gibst die Code-Tags manuell ein:
    [Codx]Dein Code[/Codx]
    (natürlich das x gegen ein e austauschen)
    Beispiel:
    Code:
    DeinCode
    Gruß Ralf
     
  6. Exl121150 Erfahrener User
    Hallo Lutz,

    1) Laut Deklaration "Public QCRohDaten() As Variant" stellt "QCRohDaten()" ein dynamisches Array dar, dessen Array-Elemente den Datentyp "Variant" besitzen. Nur kann natürlich der Datentyp "Variant" selber wieder ein (beliebig) dimensionales Array enthalten.

    2) Tatsächlich wird dann mit "ReDim QCRohDaten(1 To 2)" das Array QCRohDaten() auf ein 1-dimensionales Array eingestellt, das exakt 2 Elemente (vom Datentyp "Variant") enthält:
    QCRohDaten(1)
    QCRohDaten(2)

    3) Mittels "Range(ZelleLinksOben,ZelleRechtsUnten)" wird im aktiven Excel-Arbeitsblatt ein rechteckiges Bereichsobjekt festgelegt. Dieses Objekt stellt viele Eigenschaften und Methoden zur Verfügung. Die Eigenschaft ".Value", die du (bzw. auch ich) verwendet hast, liefert die Zellwerte der Zellen, die in diesem rechteckigen Zellbereich enthalten sind, als quasi einzelnen Wert vom Typ Variant zurück. Dieser einzelne Variant-Wert besteht aber tatsächlich wieder aus einem 2-dimensionalen Array aus Variant-Werten (den Werten der einzelnen Zellen im Rechteck-Zellbereich).
    Die .Value-Eigenschaft des Range-Objektes liefert selbst dann ein 2-dimensionales Array (als Variant-Wert), wenn der Zellbereich im Arbeitsblatt nur aus 1 Spalte besteht (wie in deinem Fallbeispiel).

    4) Dieser einzelne Variant-Wert (der ein 2-dimensionales Arrray von Variant-Werten enthält), wird nun je einem einzelnen Element des dynamischischen Arrays "QCRohDaten()" zugewiesen:
    QCRohDaten(1)=Range(ZelleObenSpaltePOQC,ZelleUntenSpaltePOQC).Value
    QCRohDaten(2)=Range(ZelleObenSpalteDateRes,ZelleUntenSpalteDateRes).Value

    5) Die Kombination aus den Punkten 1)-4) bewirkt, dass ein einzelnes Element des dynam.Arrays "QCRohDaten()" folgendermaßen adressiert werden muss:
    QCRohDaten(Nr)(Zeile,Spalte)
    Anstelle von "Nr" muss entweder 1 oder 2 eingesetzt werden, je nachdem ob man "QCRohDaten(1)" oder "QCRohDaten(2)" ansprechen will. Und da in jedem dieser Elemente wieder ein 2-dimensionales Array steckt, muss man über "(Zeile,Spalte)" mittels "Zeile" die Zeilennummer und mittels "Spalte" die Spaltennummer (die in diesem Fall nur 1 sein kann, da es sich nur um einen 1-spaltigen Zellbereich aus Excel handelt) angeben.

    6)
    Die Rückgabe der Array-Werte zurück wieder in die ursprünglichen (oder auch anderen neuen) Excel-Zellen funktioniert genau so - in umgekehrter Richtung zu Punkt 4)
    Range(ZelleObenSpaltePOQC,ZelleUntenSpaltePOQC).Value = QCRohDaten(1)
    Range(ZelleObenSpalteDateRes,ZelleUntenSpalteDateRes).Value = QCRohDaten(2)
    Es können allerdings nur Daten zurückgegeben werden, denn Formatierungen für Excel-Zellen sind in QCRohDaten() keine enthalten.
    Oder aber du wendest, wie du selber erwähnt hast, die Rückgabeadressierung mittels FOR-Schleifen an. Wie das ausschauen könnte, habe ich dir beispielhaft in meinem 1. Posting (als Kommentar verpackt) dargestellt:
    'For Zeile = 1 To LetzteZeileDatenQC - 3
    ' Cells(Zeile + 3, SpaltePODQC) = QCRohDaten(1)(Zeile, 1)
    ' Cells(Zeile + 3, SpalteDateRes) = QCRohDaten(2)(Zeile, 1)
    'Next Zeile


    7) Da ich bei meinem letzten Posting von deiner weiteren Programmumgebung nichts wissen konnte, konnte ich diese auch nicht berücksichtigen. Dein dynam.Array "Daten()" hat eine Zeilenanzahl "LetzteZeileDaten" und 14 Spalten. Dieses wird zeilenweise mittels FOR-Schleife mit den Inhalten deiner Arbeitsblattzellen befüllt.

    8a) Ich nehme daher an, die beiden Arbeitsblatt-Spalten "SpaltePOQC" und "SpalteDateRes" folgen demselben System, sodass du nur 2 weitere Spalten dazu nehmen musst, statt 14 auf 16 Spalten erhöhen musst. Dann kannst du dir die Speziallösung mit "QCRohDaten()" schenken - oder sehe ich das falsch?

    8b) Oder liest du die beiden Spalten für "QCRohDaten()" erst zu einem späteren Zeitpunkt aus dem Arbeitsblatt ein und willst 2 Spalten des Arrays "Daten()" damit ersetzen? Das müsste so funktionieren, wie du dies bereits bei deinem Array "MatListeAlt(1)" ... "MatListeAlt(4)" gemacht hast - statt einem Array aus 4 Elementen musst du ein Array aus 2 Elementen einlesen:

    Sp=10 'z.B. für Spalte 10 des Arrays "Daten()"
    FOR Zeile = 1 To UBound(QCRohDaten(1),1)
    Daten(Zeile,Sp)=QCRohDaten(1)(Zeile,1)
    NEXT Zeile

    -- bzw. --
    Sp=11 'z.B. für Spalte 11 des Arrays "Daten()"
    FOR Zeile = 1 To UBound(QCRohDaten(2),1)
    Daten(Zeile,Sp)=QCRohDaten(2)(Zeile,1)
    NEXT Zeile

    wobei es eventuell mit unterschiedlichen Zeilenanzahlen zwischen Array "Daten()" und Arrays "QCRohDaten(Nr)" Probleme geben könnte.
     
    Zuletzt bearbeitet: 31. August 2016
    Exl121150, 31. August 2016
    #6
  7. Lutz Fricke Erfahrener User
    Hallo Anton,

    vielen Dank für diese mehr als ausführliche Antwort. Aber ich glaube ich hab's jetzt verstanden. Super ;)
    Ich musste mal wieder feststellen, dass ich bei der Variablen-Deklaration einfach schlampig arbeite und daher auch keine Ahnung habe, was genau hinter welchem Typ steckt.

    Zu 8): Ich lese aus insgesamt 3 Excel-Mappen Daten ein und füge diese in ein Array zusammen. Dabei gibt es nicht für alle Einträge im Hauptarray auch entsprechende Einträge in den beiden übrigen. Auch die Reihenfolge ist unterschiedlich. Daher hilft (soweit ich weiß) nichts als Array auf Übereinstimmungen durchsuchen und in entsprechende neue Spalte einfügen. Aber das funktioniert.

    Noch eine (hoffentlich) letzte Frage. Ich finde die von Dir vorgeschlagene Form etwas sperrig. Aber sie ist natürlich beim Einlesen deutlich schneller als eine For-Next-Schleife (ca. 4 Mal schneller). Macht es Sinn, das eingelesene Array der Übersichtlichkeit wegen im Anschluss in ein "normales" Array zu schreiben?

    Gruß,
    Lutz
     
    Lutz Fricke, 1. September 2016
    #7
  8. Lutz Fricke Erfahrener User

    Handling von Datenfeldern

    Hallo Anton,

    und doch noch eine Frage an den Profi.

    Mit
    Daten = Range(Cells(1, 1), Cells(100, 6))
    lese ich einen 6-spaltigen Bereich in ein Array ein (das logischerweise auch 6 Splaten hat).

    Jetzt möchte ich an anderer Stelle aber nur die ersten beiden Spalten in einen Bereich zurückgeben.
    Geht das auch so elegant wie das Einlesen?

    Gruß,
    Lutz
     
    Lutz Fricke, 1. September 2016
    #8
  9. Lutz Fricke Erfahrener User
    und doch noch mehr Handling von Datenfeldern :(Handling von Datenfeldern :(

    Um weiterzukommen habe ich meinen Teil des Arrays, den ich ausgeben möchte in ein Hilfsarray geschrieben, den ich nun ausgeben will:

    Code:
    ReDim Hilfe(LetzteZeileDatenGesamt, 3)
    For Zeile = 2 To LetzteZeileDatenGesamt
        Hilfe(Zeile, 1) = MatListeGesamt(Zeile, 4)
        Hilfe(Zeile, 2) = MatListeGesamt(Zeile, 5)
        Hilfe(Zeile, 3) = MatListeGesamt(Zeile, 6)
    Next Zeile
            
    With Range(Cells(2, 11), Cells(LetzteZeileDatenGesamt, 13))
        .Value = Hilfe
        .NumberFormat = "dd.mm.yyyy"
        .HorizontalAlignment = xlLeft
        If CDate(.Value) < Date Then
            .Font.Color = -16776961
        Else
            .Font.ColorIndex = xlAutomatic
        End If
    End With
    
    Leider bekomme ich bei
    If CDate(.Value) < Date Then
    einen Fehler "Typen unverträglich".
    In Form einer For-Next-Schleife
    If CDate(MatListeGesamt(Zeile, 4)) < Date Then
    funktioniert's.

    Gruß,
    Lutz
     
    Lutz Fricke, 1. September 2016
    #9
  10. Icebreak3r Erfahrener User
    So wie ich das sehe wählst du mit With eine feste Range aus, da kann man nicht generell nach einem Value fragen.
    Aber warte lieber auf die Antwort eines Profis.
    Eventuell kannst du auf den Bereich eine bedingte Formatierung anwenden, dann bräuchtest du die schleifen nicht.
     
    Icebreak3r, 1. September 2016
    #10
  11. Exl121150 Erfahrener User
    Hallo Lutz,

    Code:
    Sub testen()
    
      Dim Daten15z6s() As Variant
      
      Daten15z6s = Range("B3:G17").Value
      Range("B20:C25").Value = Daten15z6s
      
    End Sub
    
    1) Mit vorgenanntem Makro liest du in den dynamisch deklarierten Array "Daten15z6s()" aus dem aktiven Arbeitsblatt ab Zelle B3 den 15-zeiligen und 6-spaltigen Zellbereich B3:G17 ein. Dabei werden die Array-Dimensionen exakt an diese Größe angepasst.

    2) In der nächsten Zeile werden aus diesem 15x6 großen Array ab Zelle B20 ein 6-zeiliger und 2-spaltiger Zellbereich B20:C25 mit den Daten des Arrays wieder befüllt. Dabei stammen diese Daten aus den ersten 6 Zeilen und den ersten 2 Spalten des Arrays.

    Du hast zuerst mit WITH Range(ZelleObenLinks,ZelleUntenRechts)..... END WITH einen Zellbereich angesprochen. D.h. alle Eigenschaften und Methoden, die mit einem Punkt beginnen innerhalb dieses Codeabschnittes beziehen sich auf diesen Zellbereich.
    Mit der Zuweisung ".Value = Hilfe" weist du jeder Zelle dieses Bereiches den Wert zu, der sich in der Variablen "Hilfe" befindet. Dann formatierst du diesen Bereich mit ".Numberformat...." und ".HorizontalAlignment....". Das funktioniert natürlich so weit alles.
    Dann willst du mit "If CDate(.Value) < Date Then ... End If" an die Datumswertumwandlungsfunktion mittels ".Value" die Wertematrix übergeben und das kann so nicht funktionieren. Denn die CDATE(...) erwartet als Parameter einen einzelnen Wert, den sie konvertieren will und nicht eine Wertematrix.
    Dagegen wird erwartungsgemäß die Version mit der FOR-Schleife funktionieren, denn dort wirst du wahrscheinlich die Funktion CDATE(..) jeweils nur mit 1 Wert füttern.
     
    Zuletzt bearbeitet: 1. September 2016
    Exl121150, 1. September 2016
    #11
  12. Lutz Fricke Erfahrener User
    Hallo Anton,

    ich habe die Punkte mal versucht ein wenig abzugrenzen:

    Formatierungsproblem:
    Ich habe jetzt mein Formatierungsproblem wie folgt gelöst. Erst durchlaufe ich mein Array in einer Schleife und erstelle damit einen Range von Zellen. Diesen färbe ich im Anschluss auf einen Schlag ein. Es funktioniert, ob es Vorteile in der Geschwindigkeit bringt, weiß ich noch nicht.
    Code:
    For Liste = 1 To UBound(MatListe, 1)
        If CDate(MatListe(Liste, 7)) < Date Then
            If Not DatumRot Is Nothing Then
                Set DatumRot = Union(DatumRot, Cells(Liste + 1, 10))
            Else
                Set DatumRot = Cells(Liste + 1, 10)
            End If
        End If
    Next Liste
    
    With DatumRot
        .Font.Color = -16776961
    End With
    
    Teilweise Ausgabe von Datenfeldern:
    Da hab ich nen Fehler in der Beschreibung gehabt.
    Dass Datenfelder bei der Ausgabe in zu kleine Zellbereiche abgeschnitten werden, war mir klar. Wir bekomme ich aber gezielt die 2. und 3. Spalte aus einem 6-spaltigen Array?
    Bei Range("B20:C25").Value = Daten15z6s fehlt mir ja die Angabe der Spalten.

    Ergänzung von Datenfeldern:
    Ich habe meine Daten aus der Tabelle eingelesen und will sie jetzt um einzelne Daten ergänzen. Stoße dabei aber in der vorletzten Zeile auf ein "Laufzeitfehler 13: Typen unverträglich".

    Code:
    ReDim Daten(1 To 14)
    Daten(1) = Range(Cells(4, SpalteMat), Cells(LetzteZeileDaten, SpalteMat)).Value
    Daten(2) = Range(Cells(4, SpalteMatDesc), Cells(LetzteZeileDaten, SpalteMatDesc)).Value
    
    Daten(4) = Range(Cells(4, SpaltePO), Cells(LetzteZeileDaten, SpaltePO)).Value
    Daten(5) = Range(Cells(4, SpaltePOType), Cells(LetzteZeileDaten, SpaltePOType)).Value
    Daten(6) = Range(Cells(4, SpalteTarQuant), Cells(LetzteZeileDaten, SpalteTarQuant)).Value
    Daten(7) = Range(Cells(4, SpalteBasicFinish), Cells(LetzteZeileDaten, SpalteBasicFinish)).Value
    Daten(8) = Range(Cells(4, SpalteShipTo), Cells(LetzteZeileDaten, SpalteShipTo)).Value
    Daten(9) = Range(Cells(4, SpaltePlannedGI), Cells(LetzteZeileDaten, SpaltePlannedGI)).Value
    Daten(10) = Range(Cells(4, SpalteOrderStat), Cells(LetzteZeileDaten, SpalteOrderStat)).Value
    
    LetzteZeileDaten = LetzteZeileDaten - 3
    
    For Zeile = 1 To LetzteZeileDaten
        Daten(3)(Zeile, 1) = Left(Daten(2)(Zeile, 1), 7)             ' hier tritt der Fehler auf!!!
    Next Zeile
    Schon mal vielen Dank für Deine Hilfe.

    Gruß und schönes Wochenende,
    Lutz
     
    Lutz Fricke, 2. September 2016
    #12
Thema:

Handling von Datenfeldern

Die Seite wird geladen...
  1. Handling von Datenfeldern - Similar Threads - Handling Datenfeldern

  2. Handling mehrerer Word-Instanzen

    in Microsoft Word Hilfe
    Handling mehrerer Word-Instanzen: Hallo zusammen, ich habe ein Problem, bei dem ich einfach nicht weiterkomme. Zusammenfassung: Es gibt eine Dokumentenvorlage, auf Basis derer CV's der Mitarbeiter erstellt werden können. Erstelle...
  3. Access bestimmte Datenfelder/-sätze aus Tabelle A in Tabelle B kopieren (über alle Datenfelder)

    in Microsoft Access Hilfe
    Access bestimmte Datenfelder/-sätze aus Tabelle A in Tabelle B kopieren (über alle Datenfelder): Hallo zusammen, ich bin Neuling und habe (noch) keine so richtige Ahnung, daher bitte ich um eure Hilfe. Problemstellung: Ich habe in Tabelle A die Datenfelder [Feld1], [Feld2], [Feld3], [Feld4]...
  4. Exception Handling

    in Microsoft Excel Hilfe
    Exception Handling: hi zusammen, wenn ich so einen Code habe Code: endRow = .Columns(2).Find(endzeit).Row und bekomme dort einen exception aus irgendeinemgrund, wenn die endzeit nicht gefunden kann und soweiter....
  5. Error Handling

    in Microsoft Access Hilfe
    Error Handling: Gibt es einen Weg festzustellen, ob eine Prozedur eine Event Prozedur ist? Ich versuche per Code zu jeder Prozedur ein Error Handling zu erstellen. Dabei stört mich, dass ich nicht unterscheiden...
  6. Neue Datenbank / Fragen zum Handling, Aufbau

    in Microsoft Access Hilfe
    Neue Datenbank / Fragen zum Handling, Aufbau: Hallo erstmal, zunächst einmal möchte ich mich kurz vorstellen: Ich heiße Jörg, komme aus dem schönen Frankenland und betreibe in meiner Freizeit aktiv Musik. Da ich seit einiger Zeit in 2...
  7. Error handling

    in Microsoft Access Hilfe
    Error handling: Hallo allerseits, eine eher allgemeine Fragestellung. Da ich zum Ende meines Praktikums eine schöne große Access-Applikation erstellt habe bin ich nun dabei den Code noch etwas zu optimieren....
  8. Datenfeld benutzerdefiniert sortieren

    in Microsoft Excel Hilfe
    Datenfeld benutzerdefiniert sortieren: Hallo zusammen, ich habe da mal wieder ein Problem, zu dem ich keine befriedigende Lösung finde. Ich habe eine Liste mit vielen Aufträgen, die alle einen Status haben. Nach diesem möchte ich...
Schlagworte:
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden