Цикл для сбора этикеток и расчетов

Цель программирования:

1) Зациклить и сохранить индивидуальную статистику:

а. Просканируйте серийный номер, смещение и соберите следующее для каждого: я. PL #

II. Версия прошивки

iii. Емкость (все, что находится в ячейке ниже)

iv. Технология (все, что находится в ячейке ниже)

v. Батарея #

Для каждого отдельного PL следующие расчеты ...

vi. Среднее, минимальное, максимальное (*% уровня заряда)

vii. Средн., Мин., Макс. (Температура)

viii. Мин., Макс., Сред. (I начало заряда (А))

ix. Количество вхождений Равно. Время в «= 0», «(1,419)», «(420 839)», «= 840»

Икс. Количество случаев низкого уровня «да» и «нет»

xi. Соотношение да / (да + нет)

xii. Сумма (Disch. Ah-)

xiii. Сумма (Ач + заряд)

xiv. Соотношение (Ач + / Ач-)

2) Вывести таблицу на новый лист:

а. Создать таблицу с заголовками, соответствующими i-xii

б. Каждый отдельный PL # с соответствующим значением для i-xii

c. Сумма равных. Время в сегментах для всех данных

3) Вывод графиков на новый лист:

а. Все даты (y) и *% состояния заряда (x) 2D линейный график, ось y 0-100, с

постоянная зеленая линия на 100 и постоянная красная линия на 20

б. Двухмерный линейный график всех дат и темпов с постоянной красной линией на отметке 138

Я работаю над (1). Вот как я буду сканировать и собирать каждый кусок ...

Sub GetData()

Dim ArrPK() As String, SearchString As String
Dim SerialNo As Range, aCell As Range
Dim ws As Worksheet
Dim PkCounter As Long
Dim LstBox As msforms.ListBox

Set ws = ThisWorkbook.Sheets("Sheet1")
SearchString = "Serial#"
Set LstBox = UserForm1.ListBox1

PkCounter = 1

With ws
    Set SerialNo = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)

    For Each aCell In SerialNo
        If aCell.Value2 = SearchString Then
            ReDim Preserve ArrPK(1 To 5, 1 To PkCounter)
            ArrPK(1, PkCounter) = aCell.Offset(0, 1) 'Serial#
            ArrPK(2, PkCounter) = aCell.Offset(1, 1) 'Firmware#
            ArrPK(3, PkCounter) = aCell.Offset(3, 1) 'Capacity
            ArrPK(4, PkCounter) = aCell.Offset(3, 3) 'Technology
            ArrPK(5, PkCounter) = aCell.Offset(3, 11) 'Battery#
       'Collected information labels, now run calculations...
            PkCounter = PkCounter + 1
        End If
    Next
End With

ЧТО Я ХОЧУ СДЕЛАТЬ:. Я хочу вывести таблицу с собранными метками и соответствующими расчетами. Цикл, который у меня есть до сих пор, получает ярлыки.

Пример файла:

https://drive.google.com/open?id=1vDqnt2aHL06xB2Fg9k5MZ2WeCefqQZ1n1

вам нужно выполнить все эти вычисления после того, как вы соберете все данные, верно? в этом случае вам нужно выполнять вычисления вне цикла, вы должны использовать новый цикл для всех этих вычислений.

Ibo 13.09.2018 18:36

Необработанные данные были собраны в таблице. Когда вы говорите «после того, как вы собрали все данные ...», я думаю, вы имеете в виду сбор их в цикле. Как мне вызвать каждую переменную, чтобы выполнить вычисление столбца, если в первом цикле есть только метки?

AKow 13.09.2018 18:57

вы задаете слишком много вопросов в одном вопросе. Поэтому сложно понять, чего именно вы хотите. У вас есть набор данных, вы хотите узнать MAX, MIN и т. д. Столбцов, верно? или вы хотите выбрать некоторые из них, а затем найти МИН, МАКС и т. д.?

Ibo 13.09.2018 19:02

@Ibo Я понимаю, что это много информации. У меня есть необработанные данные на одной странице с фрагментами разного размера для каждой батареи (PL ###). Каждый блок содержит информацию о каждой батарее. Я хочу собрать отдельные метки и расчеты в настраиваемую таблицу.

AKow 13.09.2018 19:10

ты не ответил на мой вопрос. Я пытаюсь понять, что такое PL #, всего за несколько минут, а все остальное то же самое, у кого-то, кто не знаком с данными, требуется слишком много времени, чтобы просмотреть ваш код и снимок, чтобы понять, что вы хотите. Вам нужно разбить это на очень простой вопрос, предоставить образец данных вместо снимка. Это увеличит ваши шансы на привлечение внимания

Ibo 13.09.2018 19:16

@Ibo Хорошо, Ибо. Мне очень жаль, что я не ответил на ваш вопрос. Я отредактировал и предоставил файл.

AKow 13.09.2018 20:46

Хорошо, теперь я вижу это лучше, это на шаг впереди, лучший подход - объединить все данные на одном листе и выполнить все вычисления с использованием этого листа

Ibo 13.09.2018 20:54

@ibo Да, я сейчас этим и занимаюсь. В моих данных 15 000 строк, поэтому я хочу автоматизировать процесс.

AKow 13.09.2018 21:05

Теперь я понимаю, позволь мне показать тебе кое-что

Ibo 13.09.2018 21:07

@ibo Я тоже вопрос перефразировал, надеюсь более нагляднее stackoverflow.com/questions/52320226/…

AKow 13.09.2018 21:16

Мой ответ был удален, так как я уделял слишком много внимания части автозаполнения, а не расчетной части. удачи

KySoto 13.09.2018 21:54
1
11
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

это требует большего количества кода, вы можете параметризовать его намного больше, но простота имеет преимущества, если вы экспортируете формат файла Excel не изменится. Я рассчитал среднюю температуру и вставил ее в ваш массив. После того, как вы собрали все свои данные, вам нужно транспонировать массив и вставить его в лист:

Sub GetData()

    Dim ArrPK() As String, SearchString As String
    Dim SerialNo As Range, aCell As Range
    Dim ws As Worksheet
    Dim PkCounter As Long
    'Dim LstBox As msforms.ListBox
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")
    SearchString = "Serial#"
    'Set LstBox = UserForm1.ListBox1

    PkCounter = 1

    With ws
        Set SerialNo = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)

        For Each aCell In SerialNo
            If aCell.Value2 = SearchString Then
                ReDim Preserve ArrPK(1 To 6, 1 To PkCounter)
                ArrPK(1, PkCounter) = aCell.Offset(0, 1) 'Serial#
                ArrPK(2, PkCounter) = aCell.Offset(1, 1) 'Firmware#
                ArrPK(3, PkCounter) = aCell.Offset(3, 1) 'Capacity
                ArrPK(4, PkCounter) = aCell.Offset(3, 3) 'Technology
                ArrPK(5, PkCounter) = aCell.Offset(3, 11) 'Battery#


                'define the data block for the battery
                Set rng = aCell.CurrentRegion 'data block for one battery
                Set rng = rng.Offset(6, 0)
                Set rng = rng.Resize(rng.Rows.Count - 6, rng.Columns.Count)

                'now range is defined, run the calculations using the worksheet functions, or use a loop over the range columns
                '### calculate avg, min and max temperature (8th column in block)
                ArrPK(6, PkCounter) = Application.WorksheetFunction.Average(rng.Columns(8)) 'average temperature



                PkCounter = PkCounter + 1
            End If
        Next
    End With
End Sub

не стесняйтесь выбирать это в качестве ответа и голосовать за него, если он вам помог :)

Ibo 13.09.2018 21:18

Другие вопросы по теме