0
votes

Comment boucler des blocs de données inégaux

Donc, fondamentalement, je traite une feuille de données, jusqu'à environ 200 000 rangées. Les données sont quelque peu formatées comme indiquées ci-dessous (fausses données). J'essaie d'analyser chaque cycle pour vous assurer que certaines gammes de température et de pression ont été touchées pour chaque cycle (par exemple, la température est comprise entre 120 et 18 pour tout cycle donné).

var = ThisWorkbook.Sheets("Data").Range("A2")
For i = 2 To lastRow

    If ThisWorkbook.Sheets("Data").Cells(i, 1) = var Then
        'various if statements go here
    Else
        var = var + 1
    End If
next i


5 commentaires

Vos données sont-elles triées par cycle ?


Comme Tim Demanda ... Si les données sont triées par cycle, vous pourriez avoir des variables pour garder min / max de température / pression, ou quels que soient vos besoins. Ensuite, dès qu'un nouveau cycle est atteint, faites toute la sortie que vous souhaitez et réinitialisez les variables.


Oui. Les données sont en réalité des données de série chronologique, chaque cycle étant quelque chose comme 5 secondes. Mais à cause de certaines choses étranges avec quand le cycle commence (13h00:10 vs 13h00h00), nous obtenons les cycles inégaux.


Avec 200 000 lignes, vous voudrez utiliser une approche de variante de réseau. Toute solution qui boucle à travers la gamme sera très lente.


@chrisneilsen Je pensais que pour que les boucles soient lentes (prenant actuellement environ 10 secondes pour une rangée de 100 000, pas très bien, pas horrible). Avez-vous des conseils sur où commencer avec des tableaux de variante dans ce contexte?


3 Réponses :


1
votes

Vous devriez être capable de faire quelque chose comme ceci (en supposant que Cola est trié par cycle et n'a pas de cellules vides) xxx


1 commentaires

Cela semble fonctionner comme prévu jusqu'à présent. Je continuerai à tester et à vous faire savoir si je trouve des problèmes. Merci!



0
votes

Voici une fonction que vous pouvez ajuster si nécessaire. Il prend la plage de données comme une entrée, trouve tous les cycles où les valeurs tombent en dehors de la plage et renvoient une collection de «numéros de titre» de mauvais cycle. Ceux-ci pourraient être mis dans une autre plage, imprimés dans une boîte de message ou traité d'une autre manière.

Public Function findBadCycles(rngRangeToCheck As Range) As Collection

    Dim dblMinTemp As Double
    Dim dblMaxTemp As Double
    Dim dblMinPress As Double
    Dim dblMaxPress As Double

    dblMinTemp = 120
    dblMaxTemp = 130
    dblMinPress = 320
    dblMaxPress = 340

    Dim colBadCycles As Collection
    Set colBadCycles = New Collection

    Dim i As Long
    For i = 2 To rngRangeToCheck.Rows

        If rngRangeToCheck.Cells(i, 2) < dblMinTemp Or rngRangeToCheck.Cells(i, 2) > dblMaxTemp Then
            colBadCycles.Add rngRangeToCheck.Cells(i, 1).Value
        elseif (rngRangeToCheck.Cells(i, 3) < dblMinPress) Or (rngRangeToCheck.Cells(i, 3) > dblMaxPress):
            colBadCycles.Add rngRangeToCheck.Cells(i, 1).Value
        End If

    Next i

    Set findBadCycles = colBadCycles

End Function


2 commentaires

OOH, il s'agit de certaines fonctionnalités qui seraient vraiment nécessaires. Je verrai si je peux en quelque sorte ajouter ceci sur la réponse de Tim.


@ Cybernétique.nomad Bonne prise, merci. Jeté cela ensemble rapidement, il pourrait donc y avoir d'autres problèmes aussi ...



0
votes

Utilisation d'un (code> variante variante Une approche sera beaucoup plus rapide pour 200 000 lignes

une simple boucle sur la matrice, identifiant la première et dernière ligne de chaque cycle, puis une boucle sur ce cycle pour traiter Les données feront.

somtation comme celui-ci

J'ai inclus un exemple de la manière dont vous pourriez traiter les données: renvoyer le déviation type MIN, MAX, AVG et Population de TEMP et Appuyez sur, placé dans la ligne à côté de la première entrée de chaque cycle
(Comme vous ne dites pas ce que votre traitement réel est, traitez-le comme un modèle et une mise à jour en fonction de vos besoins)

sur mon matériel, fonctionne dans 1.7S sur un ensemble aléatoire de données, 200 000 lignes < / p> xxx


0 commentaires