Страницы: 1
RSS
Поиск "наборов" ячеек удовлетворяющих условиям
 
Доброго времени суток!
Помогайте новичку, есть конкретная задача , очень хочется ее решить самостоятельно, но пока в голове абсолютная каша. Буду благодарен за Ваши советы по пошаговому решению, или хотя бы направлению в нужное русло.
Есть диапазон данных получаемый из внешних данных (на листе _data)
Нужно найти в этом диапазоне, ВСЕ наборы из Bar, удовлетворяющие условиям, и записать их на лист Stat.
Каждый набор состоит из 5 значений Bar (A,B,C,E,F). Наборы могут "накладываться" друг на друга,поэтому поиск каждого нового набора  должен начинаться со следующего бара после текущего найденного B.

Нарисовал я блок схему, Написал условия для каждого бара (A,B,C,E,F).
проверяю каждый новый бар на условие, и если бар удовлетворяет условию, его значение я записываю в temp_A,перехожу к следующему...., как все temp_, будут записаны значит набор собрался, пишем значения из temp_на лист Stat и переходим к поиску следующего набора( начинаем поиск со следующего бара за найденным B)
Дальше мои познания заканчиваются. Помогите начать писать код VBA
Изменено: omeverest - 01.04.2018 21:08:53
 
Честно пытался понять каким условиям должны удовлетворять эти Bar...
Согласие есть продукт при полном непротивлении сторон
 
Я условия не выкладывал, потому как заткнулся на первом же вложенном цикле. Поэтому и задал вопрос о помощи в написании кода ..пока на уровне "блоков".
а условия вот они

i -исследуемый бар
Temp_A -временное значение для текущего A и т.д
Target=X% от High(Temp_B)-Low(Temp_C)

для A : Low(i)<Low(Temp_A)
для B : High(i)>High(Temp_B) И Low(i)>Low(Temp_A)
для С : High(i)<High(Temp_B) И Low(i)>Low(Temp_A)
для E : High(i)>High(Temp_B)
для F : (High(i)-High(Temp_B))>Target ИЛИ (High(Temp_B)-Low(i))>Target  
 
Sanja, наверно мы зашли в другой БАР :-) без алкогольный.

omeverest, Вот вроде в тексте всего одно иностранное слово, а как будто все have been encrypted.

пока писал, ситуация только ухудшилась. Может подскажете куда вы цикл вложили?
Изменено: БМВ - 01.04.2018 21:43:14
По вопросам из тем форума, личку не читаю.
 
omeverest, в посте 3 Вы написали условия с использованием программного языка. Напишите теперь те же условия, но обычными повседневными словами.
А именно напишите, как Вы получили данные для листа "Stat", для ячейки "A2". Чтобы можно было понять принцип.
Изменено: Karataev - 02.04.2018 21:16:33
 
для листа "Stat", для ячейки "A2".

Поиск начинается со второй строки (с первой строки с данными) на листе _data, проверяем значение в столбце Low, если оно меньше значения Low предыдущей строки, то рассматриваем  текущую строку, т.е в итоговом значении текущую ячейку Bar, как потенциальную на bar_A. почему потенциально -потому что в следующей строке в поиске может быть значение с еще меньшим Low.
Запутано или понятно? Описывать дальше?

В текущем файле примере -на листе Stat лежат значения "от фонаря", просто для показа что должно получиться
Изменено: omeverest - 02.04.2018 23:15:09
 
Цитата
omeverest написал: Запутано или понятно?
Т.е. в Bar_A попадает значение Bar (столбец H) у которого наименьшее Low (столбец E) на конкретную дату (столбец A)? А что попадает в Bar_B, Bar_C и далее по списку?
Цитата
omeverest написал: на листе Stat лежат значения "от фонаря"
А вот это зря. С таким примером Вам подойдет любой макрос (тоже 'от фонаря'), который расставляет Даты/Время по ячейкам.
Заполните пару тройку строк на листе Stat реальными данными с листа Data соответствующие всем тем условиям, которые Вы описали выше и объясните словами (обычными, без привязки к программированию) почему именно так.
Ну а пока, для затравки, макрос для Bar_A как я его понял (см.первый вопрос в этом сообщении)
Код
Sub TaryBary()
Dim arr(), arrBar_A(), I&, iKey
With Worksheets("_data")
    arr = .Range("A2:H" & .Cells(.Rows.Count, "H").End(xlUp).Row).Value
End With
On Error Resume Next
With CreateObject("Scripting.Dictionary")
    For I = 1 To UBound(arr)
        .Add CStr(arr(I, 1)), arr(I, 5) & "|" & Format(arr(I, 8), "dd.mm.yyyy hh:mm:ss")
        If Err <> 0 Then
            If CDbl(Split(.Item(CStr(arr(I, 1))), "|")(0)) > arr(I, 5) Then
                .Item(CStr(arr(I, 1))) = arr(I, 5) & "|" & Format(arr(I, 8), "dd.mm.yyyy hh:mm:ss")
            End If
            Err.Clear
        End If
    Next
    I = 0: ReDim arrBar_A(UBound(.Keys), 0)
    For Each iKey In .Keys
        arrBar_A(I, 0) = Split(.Item(iKey), "|")(1): I = I + 1
    Next
End With
Worksheets("Stat").Range("A2").Resize(UBound(arrBar_A) + 1) = arrBar_A
End Sub
Изменено: Sanja - 03.04.2018 07:29:32
Согласие есть продукт при полном непротивлении сторон
 
Спасибо Sanja,  во вложении описание задачи "деревенским языком", но наглядно попытался изложить :) , там не все влезло на листочек..и почерк корявый, но если понятно в таком виде, то я дорисую  :D
При поиске нужно учитывать что между A B C E F могут быть промежуточные бары , минимальный набор это 4 бара A, B, C, E =F
Когда найден один набор, следующий нужно начинать искать начиная с бара следующего после B. Наборы могут накладываться друг на друга
В итоге  каждый найденный набор (значение Bar) записывать друг за другом на лист Stat

https://yadi.sk/i/X0HSKC1W3U3CbQ тут картинка с описанием задачи

во вложении файл с примером  с "реальными данными", с одним набором, по одному из вариантов расположения баров, там бывает несколько вариантов, но они легко описываются условиями
Изменено: omeverest - 03.04.2018 11:34:53
 
Уточнения:
1. Для понимания. Bar - это ПАРА элементов Low & Hight (для этой задачи)? Все остальные значения в вычислениях не участвуют?
2. Один набор Bar'ов может состоять из Bar'ов разных дат?
Изменено: Sanja - 03.04.2018 12:51:39
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Уточнения:1. Для понимания. Bar - это ПАРА элементов Low & Hight (для этой задачи)? Все остальные значения в вычислениях не участвуют?
Бар это одна строка в листе _data, в вычислениях участвуют только Low & Hight , ну и само значение даты из ячейки Bar
Цитата
Sanja написал:
2. Один набор Bar'ов может состоять из Bar'ов разных дат?
он и должен состоять из баров с разными датами, в "минимальном" случае это будет 4 бара с разными датами, (в случае когда E=F)
Страницы: 1
Наверх