Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Снижение скорости построения графиков с пощью VBA при увеличении их количества
 
Добрый.
Гуру, подскажите.
Есть код, который строит нехитрые графики на основании данных с листа. Потом эти графики копируются на соседний лист. Наблюдаю, что при построении постепенно снижается скорость.
Подумал, что дело в данных, на основе которых строю. Там 27к строк, мб где косяки и тп. Сделал фиктивный кусок данных, протестировал - скорость аналогична. Тесты включали разное количество графиков - 130, 260, 390. Т.к. первая версия кода строила 130 графиков и все было ок по скорости.

Вопрос - падение скорости при построении большого числа графиков - стандартное поведение vba или мой код крив? Не первый раз пишу код, который строит множество графиков, всегда такую картину наблюдаю. Решил положить конец этому безобразию)

Если будет подозрение на код, готов выложить.
Вывод массива дат в ось X графика через VBA, Выводимые числа не распознаются как даты
 
Добрый день!

Подскажите, пожалуйста, такой вопрос. Есть массив Dates(), содержащий даты, заполняется он так:
Код
Dim Dates(1 To 30) As Date

For z = i To j - 1
    If Range("A" & z) > "01.01.2018" Then
       Dates(t) = CDate(Range("A" & z))

        ......

       t = t + 1
    End If
Next z
Проверял - массив заполняется корректными значениями. В ячейках именно даты, можно изменять их формат.
Затем этот массив выводится на график в качестве значений Х для нескольких кривых:
Код
WsG.Activate
    ActiveSheet.Shapes.AddChart.Select
    With ActiveChart
    .ChartType = xlXYScatterSmooth
    .SeriesCollection.NewSeries
    .SeriesCollection(1).Name = "="""KGF""
    .SeriesCollection(1).XValues = Dates
    .SeriesCollection(1).Values = KGF


В итоге на график выводится такая вот ерунда:
Код
=РЯД("KGF";{"1/1/2019";"1/1/2020";"1/1/2021";"1/1/2022";"1/1/2023";"1/1/2024";"1/1/2025";"1/1/2026";"1/1/2027";"1/1/2028";"1/1/2029";"1/1/2030";"1/1/2031";"1/1/2032";...
Эти значения не поддаются форматированию, эксель не воспринимает их как даты.

Пробовал делать массив string, variant, записать в массив text ячейки - ничего не помогало. Куда копать, подскажите, пожалуйста.
Передать пользовательскую коллекцию из функции в модуле в процедуру на рабочем листе
 
Всем добрый день.

Необходимо написать функцию, которая из списка работников с повторениями будет возвращать список уникальных работников + еще пара условий с оглядкой на заливку ячейки.

Думал использовать коллекцию ведь всего лишь одна строка вида решает проблему создания массива уникальных значений из столбца
Код
WorkersColl.Add .Range("B" & i).Value, CStr(.Range("B" & i).Value)
Но коллекция не видна вне функции, т.е. с того листа, с которого была вызвана.
Пробовал вставлять
Код
Public WorkersColl As Collection
и в модуль и в модуль класса - не идет.
Понятно, что можно, получив коллекцию, записать ее значения в массив и дальше работать с массивом, но это ведь менее элегантно)
Кто-нибудь может помочь? Может быть, это вообще невозможно сделать...
Использовать значение EditBox из Ribbon-панели через VBA, поиск мне не помог(
 
Доброе утро, гуру экселя! Давно к вам не обращался)
Но вот появился повод.
Никак не могу обратиться к editbox в коде, вызываемом нажатием соседней кнопки на ribbon-панели. Поиск по форуму и по интернету показывает такие вот конструкции, но не пойму как ими пользоваться:
Код
Public Sub testeditbox(ctrl As IRibbonControl, tttt$) 
MsgBox tttt 
End Sub 
Function tttt(control As IRibbonControl, ByRef returnedVal) 
returnedVal = "" 
End Function
строка XML
Код
 <editBox id="edBox" enabled="true" getText="tttt" onChange="testeditbox"/>
Процедура testeditbox отрабатывает без вопросов,msgbox вываливается, но как вызвать функцию tttt? Какие аргументы ей передать?
В инете куча подобных моему вопросов, но ответы на них у меня не работают, почему-то. Вот еще, например:
Код
Option Explicit

Public RibbonTextBox As String

'Callback for MyEditBox onChange
Sub SetTextValue(control As IRibbonControl, text As String)
     RibbonTextBox = text
End Sub

'Callback for MyButton1 onAction
Sub HelloWorld(control As IRibbonControl)
     MsgBox RibbonTextBox
End Sub
Но как процедуру HelloWorld повесить на кнопку из ribbon-панели?

У меня простецкая задача - в окошко вводится текст, по нажатию кнопки лист с таким именем открывается в активной книге. Вот код xml:
Код
<editBox id="SheetName" onChange="SetText" getText="GetText" label="Имя листа"/>
<button id="Button1" label="Найти лист в открытой книге" onAction="find_well_in_activewb" size="large" imageMso="FindDialog"/>
И в процедуре find_well_in_activewb я не могу получить текст из editbox. Помогите, пожалуйста!
Заранее спасибо)
Имя переменной, получаемое конкатенацией буквы и другой числовой переменной
 
доброго времени суток!
Что-то мне подсказывает, что мое желание не исполнимо, но, все ж таки, вопрос задам:

Есть несколько переменных L1, L2...Li и d1, d2...di. В них записываются значения с определенных ячеек листа.
Есть двумерный массив, в который надо записать первые j переменные из рядов L и d:
Код
    For j = 1 To N_pipe
        NKT_info(j, 1) = L & j
        NKT_info(j, 2) = d & j
    Next j
Такой код, к сожалению, не работает. Каким способом лучше решить эту задачу? Заранее спасибо за ответ.
Сохранение в txt с кавычками, табуляциями и ;, не опять, а снова!) поиском пользовался!
 
Доброго времени суток.
Уважаемые форумчане, возникла проблема - есть листы (будет несколько сотен) с кавычками, пробелами, табуляциями и надо автоматом их сохранять их в тхт.

пробовал найденные на форуме FileFormat:=xlText, FileFormat:=xlTextPrinter - сохраняет не так, как надо. стандартные способы тоже пробовал. без кавычек в получаемом файле нельзя - они загружаются в другую прогу, где кавычки требуются.

прикрепляю пример excel файла и пример файла, который должен получится на выходе. может быть, кто подскажет способ сохранения?) может быть, как-то использовать питон? макросом могу наделать такие файлы на отдельные листы, а потом пачкой сохранить
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
Добрый день, гуру, нужен ваш совет, у меня уже голова кругом идет))
Есть моя функция:

Код
Function 123()
Dim Q_guess1 As Double, Q_guess2 As Double, Q_guess3 As Double
Dim A1 As Double, A2 As Double, A3 As Double, P_tr As Double
Q_guess3 = 400
For P_tr = 5 To 40
    Q_guess1 = Q_guess3
    Q_guess2 = 0.9 * Q_guess3
    A1 = V_zab(Q_guess1, P_tr) - 100500
    A2 = V_zab(Q_guess2, P_tr) - 100500

    ....
    A3 = V_zab(Q_guess3, P_tr) - 100500

   ....
Next P_tr
ThisWorkbook.Worksheets("Расчет").ChartObjects.Select
With ActiveChart
    .SeriesCollection.NewSeries
    .SeriesCollection(.SeriesCollection.Count).XValues = VJ_XTable
    .SeriesCollection(.SeriesCollection.Count).Values = VJ_YTable
End With
End Function 
которая, как и 2 ее идентичные коллеги (работа которых не нарушена) добавляет на график рассчитываемую кривую. С какого-то момента - с какого, я упустил, к сожалению - она перестала работать. Начал разбираться. Поставил брейкпоинт на 7 снизу строку - программа до него не добралась, не было остановки и эта кривая на графике не появилась.
Поставил брейкпоинт на 4 строку, пошагово (shift + f  8)  прошел всю функцию - оба массива рассчитались, линия на графике построилась, программа продолжила дальнейшее исполнение.
Как такое может быть??

Вызывается она таким вот образом:
Код
Call Q_guess_VJ
Call Q_guess_SP
Call Q_guess_NK 
В первом случае остальные 2 функции были выполнены, во втором случае я в ручную перескочил на следующую функции, кривая на графике была нормально построена.
Изменено: peat - 16.01.2014 22:27:00 (aa)
Сохранение 5 столбцов из excel в txt файл с помощью vba
 
Гуру, вновь нужна ваша помощь))
Задача проста - макросом делаю 5 столбцов данных и надо их сохранить в txt файл для загрузки в спец. софт. Можно и руками, конечно, но больно уж хочется красоту навести)
Из рабочих у меня пока только такой вариант:

Код
Range("I1:M" & Cells(Rows.Count, 10).End(xlUp).Row).Copy
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Paste
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs filename:="C:\123\123.txt", FileFormat:=xlUnicodeText, CreateBackup:=False
ActiveWindow.ActiveSheet.Delete
 
Наверное, этот код делает вам больно))) Хотя если добавить строку сохранения в *.xlsm то все будет, в принципе, хорошо) Пытался еще вот так, по найденному в гугле способу, но не получилось адаптировать под свои нужды:

Код
Set ra = Range("I1:M" & Cells(Rows.Count, 10).End(xlUp).Row) '.Resize(, 11)
arr = ra.Value    
Open ActiveWorkbook.Path & "\test.txt" For Output As 1
Write #1, arr
Close #1


Open "c:\1.txt" For Output As #1
For i = LBound(arr) To UBound(arr)
        For j = 1 To 5
            Print #1, arr(i, j)
        Next j
Next i
Close #1
 
помогите, пожалуйста)
Изменено: peat - 14.01.2014 00:56:31 (пыщь)
запись массива в ячейке
 
только не закидывайте камнями, гуглил, но что-то делаю не так...
суть такова:
Код
For i = 1 To 15
    ar(i) = Worksheets("123").Range("C" & i).Value
Next
Worksheets("123").[N8:N23] = ar

в нужный диапазон записываются значения ячейки С1, а мне надо бы, чтобы записался массив в столбец, начинающийся с ячейки N8.
пробовал так:
Код
Worksheets("123").Range("N8:N" & ArrayBound + 8).Value = ar
[n8].Resize(UBound(ar), 1) = ar

результат один и тот же. массив создается не из ячеек, расположенных подряд, может содержать десятки тысяч чисел, посему нужен наиболее оптимальный код) Гуру, подскажите пожалуйста)
почему массив создается строкой, а не стобцом?
Объвлять переменную или нет?, Как лучше x=range("A1).value или использовать range("A1).value?
 
Добрый день всем, даже утром
вам мой вопрос, вероятно, покажется очень глупым, но я из-за незнания программирования его задам:
как каноничнее поступать в случае, если мне нужно 1 раз считать значение с ячейки? создать для этого переменную и в нее записать это значение или использовать непосредственно это значение (например for i = 1 to range("A1").value)?
Изменение счетчика цикла внутри цикла
 
Доброго времени суток

Интересует вот какой вопрос:

методом хорд я нахожу решение уравнения f(x) - C = 0 и строю его график. Делаю это в интервале от 5 до 40:

Код
For X = 5 To 40 Step 0.25
    
Q_guess1 = 0.95 * Q_guess3
Q_guess2 = 0.87 * Q_guess3
A1 = f(x, Q_guess1) - C
A2 = f(x, Q_guess2) - C
Q_guess3 = Q_guess2 - A2 * (Q_guess2 - Q_guess1) / (A2 - A1) 'хорды
A3 =  f(x, Q_guess3) - C

For i = 1 To 100
    If Abs(A1) > Abs(A2) Then 'удаление лишнего начального приближения
        Q_guess1 = Q_guess3
        A1 = A3
        Else
        Q_guess2 = Q_guess3
        A2 = A3
    End If
    If Abs(Q_guess1 - Q_guess2) < 1 Or Q_guess1 < 0 Or Q_guess2 < 0 Then
    Exit For 'критерий останова
    End If
     Q_guess3 = Q_guess2 - A2 * (Q_guess2 - Q_guess1) / (A2 - A1) 'новое значение Q_guess3
    A3 = f(x, Q_guess3) - C
Next i

Next X


кратко код выглядит так. все работает, нареканий нет, свое дело делает. но кривая с шагом 0.25 в интервале от 5 до 40 не нужна. мельчение нужно на определенном интервале, где f(x) ведет себя плохо (это вызвано приближенностью формулы, к делу отношения не имеет). и вот как бы сделать так, чтобы с начала и, допустим, до Х=20 шаг был равен 1, а потом менялся на 0.1?

я пытался делать так:
Код
For X = 5 To 40 Step Step_123
....
If x>20 then Step_123 = ..


Это не работало. Разбивать цикл на 2 - с 5 до 20 и с 20 до 40 тоже не хочется. гугл мне говорил, что это невозможно сделать, но, может быть, гуру знают больше гугла?)
Изменено: peat - 17.10.2013 22:54:58
Число сохранено как текст - после макроса, а если делать то же руками - то все нормально) в чем подвох?)
 
Доброго времени суток!)
не закидывайте меня, тема избита, но ответа на свой вопрос я не нашел)

ситуация такая - тысячи ячеек с числами вида xy.z, а мне нужен разделитель запятая. делая замену - все хорошо. записываю замену макрорекодером, выполняю макрос - числа сохраняются, как текст о0
гугл дал вот такую хитрость:

Код
With Selection
 .NumberFormat = "#,##0.00"
 .Replace ",", "."
 .Formula = .Formula
End With


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

Может быть, тема сформулированна коряво, но нужно вот что: есть процедура, вычисляющая параметр объекта, которая вызывается в ходе итерационных процессов 100500 раз. Внутри этой процедуры есть вызов подпроцедуры - расчета длины объекта.
Естественно, длина объекта не меняется после 1го расчета и вопрос заключается вот в чем - как вынести ее из итерационного процесса? мне пришло на ум не очень изящное решение - в первом выполнение записать значенте длины в ячейку, затем проверять, не пусто ли оно. если не пусто, значит эта и есть длина и нет смысла ее заново считать) есть ли что-то более правильное и более изящное?)
заранее благодарен
Копирование графиков из закрытых файлов *.xls, или быстрое копирование с открытием)
 
Доброго времени суток, гуру!
Прошу вашего совета)
Дело вот в чем:
есть сотни полторы объектов, для каждого из них есть файл, один из листов которого, названный соотв. образом, представляет собой нужную мне диаграмму. Мне нужно выдернуть эту диаграмму и с ней производить манипуляции.
сейчас это делается так:

Код
Workbooks.Open filename:=FileAdressGraf, ReadOnly:=True
Workbooks(FileNameGraf).Sheets("123").ChartArea.Copy
ThisWorkbook.Activate
With Worksheets("111")
    .Range("E9").Select
    .Paste
End With
Workbooks(FileNameGraf).Close SaveChanges:=False


работает ооочень медленно, именно на закрытии тормозки...

кроме графика, каждый объект имеет еще один файл с инфой, к котормоу мне нужно обращаться. нарыл вот такую конструкцию:

Код
Function GetValue(path, file, sheet, ref)
Dim arg As String
arg = "'" & path & "[" & file & "]" & sheet & "'!" & Range(ref).Range("A1").Address(, , xlR1C1)
GetValue = ExecuteExcel4Macro(arg)
End Function

которая делает мне штуки вроде этой:

Код
Range("B" & i + 12) = GetValue(FileAdressO, FileNameO, sheet, adress)


т.к. vba я осваивал самостоятельно, то эту конструкцию под копирование графика переделать не могу. возможно ли это вообще? может, есть какие-то другие способы?

вариант копирования диапазонов, по которым построены кривые на графики не подходит т.к. на одном графике может быть одна кривая, а на другом - 101.
Удаление лишних кривых с графика
 
Дело вот в чем - по кнопке рисую график на листе, на котором имеется таблица.
Задаю всякие его параметры, но мне нужна всего одна кривая на нем, а появляется их чуть ли не 10)
Вот код:
Код
    ActiveSheet.Shapes.AddChart.Select
    With ActiveChart
    .ChartType = xlXYScatterSmoothNoMarkers
    .SeriesCollection(.SeriesCollection.Count).Delete
    .SeriesCollection.NewSeries
    .SeriesCollection(1).XValues = "='123'!$I$8:$I$82"
    .SeriesCollection(1).Values = "='123'!$H$8:$H$82"
    .ChartStyle = 245
    .ChartArea.Left = Worksheets("123").Range("K37").Left
    .ChartArea.Top = Worksheets("123").Range("K37").Top
    .ChartArea.Width = 450
    .ChartArea.Height = 425
    .SeriesCollection(1).Format.Line.Weight = 5
    .Legend.Delete
    .Axes(xlValue, xlPrimary).HasTitle = True: .Axes(xlValue, xlPrimary).AxisTitle.Text = "123"
    .Axes(xlCategory, xlPrimary).HasTitle = True: .Axes(xlCategory, xlPrimary).AxisTitle.Text = "12345, %"
    End With

После его выполнения появлется график где есть чуть ли не все данные с листа, крмое тех, которые нужны.
помогает только вот это:

Код
    .SeriesCollection(11).Delete
    .SeriesCollection(10).Delete
    .SeriesCollection(9).Delete
    .SeriesCollection(8).Delete
    .SeriesCollection(7).Delete
    .SeriesCollection(6).Delete


но это как-то не очень кошерно, наверняка вы знаете куда более простой способ) поделитесь, пожалуйста)
Вычисление значений по линии тренда в виде полинома, VBA
 
доброго времени суток, уважаемые! надеюсь на ваш совет)
имеется: набор точек (x, y) по ним строится график - есть в примере.
программа, исходя из этого графика, вычисляет y, задавая х, но используется линейная аппроксимация:

код

из кода видно, что эта кривая (вернее, таблица, по которой построена кривая), разбивается на 3 части. 1ая и 3я часть меня не очень интересуют - в третьей y всегда постоянный, а в 1ой ничего не придумаешь. а вот во второй на графике можно построить полином. 6ая степень прям идеально ложится на кривую, если у нее удалить "полку" справа. и хотелось бы не использовать линейную аппроксимацию между соседними значениями, а воспользоваться более точным полиномом. я попробовал в лоб - построил тренд, скопировал его формулу в вба, удалил код 2го интервала, занес туда примерно следующее:
Код
Rs = 0000000.0123 (Р^6) + ...

и, почему-то, получилась ерунда - т.е. та величины, для которой рассчитывается Rs получала нефизичные значения. что-то можно здесь придумать, гуру?
если у вас есть какие-то советы по улучшению существующего кода - я с радостью их приму)
Изменено: peat - 10.05.2013 11:18:24
Вычисление прогнозных значений с помощью WorksheetFunction.LinEst, как использовать массив в кач-ве аргумента функций на листе
 
в который раз уже я к вам за помощью, гуру..аж стыдно уже...
дело такое: есть график примерно линейного вида. пользователь на юзер форуме выбирает точки на графике, кривая между которыми более всего напоминает ему прямую, и вводит в юзерформу эти точки. по этим точкам строится линия тренда - спасибо большое Слэн'у, это он подсказал. теперь задача такова - по построенному тренду сделать прогноз - т.е. пользователь построил тренд от 50 до 60 точки на графике (это по х), какими будут значения по у от 61,62 и далее точек.
В хелпе экселя есть вот что:
Цитата
=СУММ(ЛИНЕЙН(B1:B6; A2:A7)*{9;1}) - Вычисляет предполагаемый объем продаж в девятом месяце на основе данных о продажах за 2–6 месяцы
по описанию - то, что доктор прописал. вопрос - как ее написать в вба?)
имеется вот такой код:

Код
Private Sub GoButton_Click()
With Worksheets("123")
Call XarakCalc
    Select Case True
    Case Chart5_Select 'имеется серия графиков, пользователь выбирает, по какому конкретно он хочет получить прогноз
    Dim trendline, x, y
    N = TextBox9.Text: K = TextBox10.Text 'ввод границ прогноз - 50 и 60ая точка, к примеру
    ReDim x(1 To K - N + 1): ReDim y(1 To K - N + 1)
    j = 0
    For i = N To K
        j = j + 1
        If Np_o(i) = Empty Then 'это массив объявляется в XarakCalc, в него заносятся значения ячеек из определнного столбца
            y(j) = 0
        Else
            y(j) = Np_o(i)
        End If
        If ObrTime(i) = Empty Then 'это массив объявляется в XarakCalc, в него заносятся значения ячеек из определнного столбца
            x(j) = 0
        Else
            x(j) = ObrTime(i)
        End If
    Next i
     
     .Range("C7") = WorksheetFunction.Sum(WorksheetFunction.LinEst(y, x))
   .....
  End Sub


сам тренд строится в другой процедуре вот так:
Код
......
trendline = WorksheetFunction.LinEst(y, x, 1, 1) 'y, x вычисляются так же, как и в коде выше
    ReDim x(1 To 2): ReDim Np_o(1 To 2)
    x(1) = ObrTime(N)
    x(2) = ObrTime(K)
    Np_o(1) = trendline(1, 1) * x(1) + trendline(1, 2)
    Np_o(2) = trendline(1, 1) * x(2) + trendline(1, 2)
' далее он добавляется на уже существующи график
.......


попробовал банальщину:
Код
 Range("K5").FormulaR1C1 = "=SUM(LINEST(R[-3]C[-4]:R[36]C[-4], R[-3]C[-5]:R[36]C[-5])*{45,1})"

но вместо RC мне туда надо вставить значения массивов x, y, да и 45 надо менять - т.е. в К5 вставили K-ое значение, в К6 K+1 и тд

нашел ф-ции =ПРЕДСКАЗ(41; F2:F41; G2:G41) и =ТЕНДЕНЦИЯ(F2:F41; G2:G41;41; 1), можно ли как-то вместо подсунуть массив х?
Изменено: peat - 04.05.2013 18:37:28
проблемы с воспроизведением записанного макроса
 
Не раз уже сталкивался за последние дни с этой ерундой, но вот решил спросить у знатоков.
Итак: на листе есть кнопка. По ней строится график. График слегка заслоняет кнопку, хочется ее на передний план. Включаю запись, правой кнопкой по кнопке (извините за тавтологию) - на задний план. Появляется вот что:

Код
    ActiveSheet.Shapes("Button 3").ZOrder msoBringToFront
    ActiveSheet.Shapes("Button 3").ZOrder msoBringToFront


Именно в двойном экземпляре. Отодвигаю кнопку на задний план, пытаюсь воспроизвести макрос - Can't find project or library и выделено это - msoBringToFront. Что за ерунда? Зачем нужен макрорекодер, если потом невозможно использовать этот код?! Офис 10ый, если что.

Пытался с другого конца:

Код
ActiveSheet.Shapes("Chart1").ZOrder msoSendToBack


те же яйца, только в профиль получились.

Еще интересовал бы ответ - как верным образом записать сей макрос?) Уж очень хочется кнопку на передний план) погуглил, поизголялся - не вышло...
Изменено: peat - 09.05.2013 18:02:55
Создание глобальной переменной или константы, в которую будет занесено значение из ячейки
 
Доброго времени суток! Надеюсь на вашу помощь)
История такая - в моем документе куча листов и нудных формул. В самом начале вычисляется кол-во временных интервалов. Надоело в каждой процедуре прописывать это. Их кол-во задается в начале и не меняется. Вот код (я не прогер, так что это говнокод, вероятнее всего):

Цитата

...
    With Worksheets("123")
    God = .Range("God")
    Mes = .Range("Mes")
    Srok = God * 12 + Mes
...
Srok глобально объявлен как целое,

Цитата
Public God, Mes, Srok As Integer
проблем с вызовом в каждой процедуре не было, но в каждую приходится писать эти вот строчки. Хотелось бы в сааааамом начале проекта его вычислить и вставлять по ходу действа, когда нужен.

С другой переменной, тоже задающейся в самом начале, попробовал такую вот штуку:
Цитата
Const StartDate As Date = Worksheets("123").Range("StartDate")

заругалась "constant expression required". Найденные в сети варианты с Set... тоже успехом не увенчались.
прошу вашей помощи, знатоки!

у меня вся эта байда во вкладке "Modules", где у меня описание всех кнопок, функции и тп. Мб куда в другое место надо перенести объявление глобальных переменных/констант?
Работа с линией тренда из VBA
 
Создавал тему с нарушение правил, пересоздаю.
Знатоки и умельцы, просьба такая:

Есть набор графиков с линиями тренда, пользователь в юзер форме выделяет 1 (или несколько) графиков и по ним должен построиться прогноз (или прогнозы). На построенном наборе графика все кривые похожи на прямые, задача пользователя выбрать наиболее прямую. Т.е. зависимость у=f(x) линейна, тогда, зная зависимость из линии тренда, задавшись иском можно вычислить игрек или наоборот.
Сформулирую вопросы (они касательно этих графиков, надеюсь, модератор не заругает):

1) Как привязать конкретный график к конкретной галке в юзерформе? Т.е. галка в 1,6 и 7 - используем тренды этих графиков

2) Как "выдернуть" тренд для прогноза? Уважаемый Слэн в старой теме начал было обьяснять, но я не понял, а тему закрыли...хотелось бы увидеть сам код..т.е. пользователь выбрал график 2, с его тренда и надо строить прогноз.

3) Каждый график имеет 100 точек (примерно). Линейность графика может наблюдаться только с 30ой по 70ю, примерно. А до и после - полный хлам. В юзерформе сделал ввод этих самых 30 и 70 пользователем - как теперь заставить перестроиться линию тренда не от всех 100 точек (она будет выглядеть очень не точно), а по заданным точкам, где она будет почти идеальной прямой?

4) Возможно ли автоматическое определение экселем оптимального тренда? Т.е. он "видит", что с 30 по 70ю точку получается отличнейшая прямая - и рекомендует именно ее. Естесвенно, нужно ограничение на минимальный набор точек- если он ее сделает по 2...))) Наверное, это невозможно, нооо вдруг)

очень надеюсь на вашу помощь!!!
Построение графика из массивов, содержащих нули, через VBA
 
Создавал тему с нарушение правил, пересоздаю.
Знатоки и умельцы, просьба такая:
имеется 2 столбца данных вида
1     0
10   0
100  0
400  1
800  5

завожу их в массивы вот так:

Код
    For Each Cell In Worksheets("Расчеты").Range("Np_o")
        If IsEmpty(Cell) Then Exit For
        N = N + 1
        Np_o(N) = Cell.Value
    Next Cell

    For Each Cell In Worksheets("Расчеты").Range("Np_w")
        If IsEmpty(Cell) Then Exit For
        I = I + 1
        Np_w(I) = Cell.Value
    Next Cell

потом вычисляю их частное:
Код
    For J = 1 To LastRow - 12
      VNF(J) = Np_w(J) / Np_o(J)
    Next J

и от него строю график:
Код
    ActiveSheet.Shapes.AddChart.Select
    With ActiveChart
    .ChartType = xlXYScatterSmooth
    .SeriesCollection.NewSeries
    .SeriesCollection(1).XValues = Np_o
    .SeriesCollection(1).Values = VNF
 . . . . . 


как видно, некоторые значения VNF равны 0 и на графике они отображаются нулями. кол-во нулей в столбце Np_o, лист предполагает ввода туда данных пользователя - ноль может быть 1, а может быть и 1000. важно, что после первого ненулевого значения нуля уже не будет - это накопленный показатель.

как можно избежать нулей на графике? в кодинге плохо понимаю, делал по примерам, но есть догадки, что можно как-то начать вносить элементы в массив после, скажем 20го значения, если именно оно - последний ноле в столбце. тогда и другой массив надо объявить с 20го значения..как это в код записать, помогите, пожалуйста!
Страницы: 1
Наверх