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

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

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

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

С моими массивами тоже все ок, выходит, дело в типе диаграмм было...Немного странно это, но ок)
Вывод массива дат в ось X графика через VBA, Выводимые числа не распознаются как даты
 
Цитата
Sanja написал:
В макросе от  ProFessor ,  тип диаграммы - xlXYScatterSmooth, у меня - xlLineMarkers
Я пытался в Вашем коде, вот так:

Код
Sub u()
Dim iShp As Shape, arr()

lastrow = Worksheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row
ReDim Timee(1 To lastrow - 1) As Double, debit(1 To lastrow - 1)
k = 1

For i = 2 To lastrow
    Timee(k) = Range("a" & i).Value
    debit(k) = Range("b" & i)
    k = k + 1
Next i

With Worksheets("Лист2")
    '---удаляем все диаграммы на листе---
    For Each iShp In .Shapes
        If iShp.Type = msoChart Then iShp.Delete
    Next
    '------------------------------------
    arr = .Range("A2:B" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
    With .Shapes.AddChart(xlLineMarkers, 120, 10, 700, 300).Chart
        With .SeriesCollection(1)
            .XValues = Timee ' Application.Index(arr, , 1)  '
            .Values = debit 'Application.Index(arr, , 2)  '
        End With
    End With
End With

End Sub
Цитата
Код
Sanja написал:
Если изменить вручную тип построенной диаграммы
И еще при каких-то других вариантах, не смог точно их установить.
Изменено: peat - 18.04.2018 07:55:49
Вывод массива дат в ось X графика через VBA, Выводимые числа не распознаются как даты
 
ProFessor, спасибо, но при попытке изменить формат чисел оси Х на ДД.ММ.ГГГГ появляется 1900 год.

Sanja,  спасибо, не знал что так можно создавать диаграммы! Но если в столбце А дата в формате ДД.ММ.ГГГГ, то ошибка 1004 после строки
Код
With .SeriesCollection(1)
При различных форматах и в массиве arr и в массиве Timee оказываются даты, в Watches видны одинаковые записи, но вывод на график почему-то отличается. Эксель что-то пытается додумать или он у меня сломанный?
Вывод массива дат в ось X графика через VBA, Выводимые числа не распознаются как даты
 
Ребят, кто-нибудь еще предложит что-нибудь?
Вывод массива дат в ось X графика через VBA, Выводимые числа не распознаются как даты
 
Но в вашем файле совсем нет кода и график построен вручную. Вопрос-то был в том, как вывести на график даты, собранные в массив через VBA
Вывод массива дат в ось X графика через VBA, Выводимые числа не распознаются как даты
 
Конечно!
Спасибо за отклик!
Вывод массива дат в ось X графика через 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 ячейки - ничего не помогало. Куда копать, подскажите, пожалуйста.
Передать пользовательскую коллекцию из функции в модуле в процедуру на рабочем листе
 
Всем огромное спасибо за отклик!
Попробовал ваши варианты, понял, что мой вариант, схожий с предложенным уважаемым Юрий М, работает в точности так же. В чем я ошибся - не обращался к коллекции в процедуры, из которой я вызвал процедуру, сформировавшую коллекцию. Я видео "out of context" в Watches и думал, что коллекция не видна. А она видна)
Спасибо вам большое, наставили на путь истинный ;)
Передать пользовательскую коллекцию из функции в модуле в процедуру на рабочем листе
 
Всем добрый день.

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

Думал использовать коллекцию ведь всего лишь одна строка вида решает проблему создания массива уникальных значений из столбца
Код
WorkersColl.Add .Range("B" & i).Value, CStr(.Range("B" & i).Value)
Но коллекция не видна вне функции, т.е. с того листа, с которого была вызвана.
Пробовал вставлять
Код
Public WorkersColl As Collection
и в модуль и в модуль класса - не идет.
Понятно, что можно, получив коллекцию, записать ее значения в массив и дальше работать с массивом, но это ведь менее элегантно)
Кто-нибудь может помочь? Может быть, это вообще невозможно сделать...
Использовать значение EditBox из Ribbon-панели через VBA, поиск мне не помог(
 
Цитата
StepanWolkoff написал:
воспользуйтесь редактором ленты  Ribbon XML Editor
Именно им и пользуюсь, но не могу понять, как это сделать. Вы можете помочь советом?
Цитата
Doober написал:
Возможно вам подойдет этот вариант.
Спасибо, попробую
Использовать значение EditBox из Ribbon-панели через VBA, поиск мне не помог(
 
Doober, спасибо большое! Все работает, однако, я не совсем понимаю, как)
Вы просто добавили в процедуру find_well_in_activewb событие control As IRibbonControl? Но я так пробовал делать, не взлетало...
Использовать значение EditBox из Ribbon-панели через VBA, поиск мне не помог(
 
StepanWolkoff, спасибо за ответ! Прикладываю файл! Но в нем не особо что есть.
Цитата
StepanWolkoff написал:
Имя листа вы получаете при срабатывании процедуры "SetText". По логике, в ходе этой процедуры имя листа должно записаться в переменную, которую будет видно в процедуре "find_well_in_activewb". Как у вас написано, нам не ведомо.
Именно так! Но у меня никак не написано. Ну, почти никак. Вот что есть:
Код
Public SheetNameText As String
Sub SetText(control As IRibbonControl, text As String)
     SheetNameText = text
End Sub
Этот кусок кода отрабатывает нормально - если я в окно пишу "123" то в переменную SheetNameText записывается "123".
Вот код, который срабатывает по кнопке "Button1":
Код
Sub find_well_in_activewb()
Dim Sheet_name As String
Sheet_name = SheetNameText
ActiveWorkbook.Worksheets(Sheet_name).Activate
End Sub
Но в эту процедуру значение SheetNameText не приезжает. Если предварительно перед нажатием кнопки в editbox внести новое выражение, то ошибка "Wrong number of arguments or invalid property assignment"
Использовать значение 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. Помогите, пожалуйста!
Заранее спасибо)
Имя переменной, получаемое конкатенацией буквы и другой числовой переменной
 
V не совсем корректно я написал - они тянутся с листа, но с ними потом происходят арифметические действия, которые не надо выводить на лист.
Sanja замечательно, и что ж я сам не сообразил такую простую вещь. спасибо!
Имя переменной, получаемое конкатенацией буквы и другой числовой переменной
 
доброго времени суток!
Что-то мне подсказывает, что мое желание не исполнимо, но, все ж таки, вопрос задам:

Есть несколько переменных 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 с кавычками, табуляциями и ;, не опять, а снова!) поиском пользовался!
 
Казанский, работает, как надо, спасибо большое! Пришлите в личку какой-нибудь номер мобилы (с оператором), я вас отблагодарю.
Сохранение в txt с кавычками, табуляциями и ;, не опять, а снова!) поиском пользовался!
 
Доброго времени суток.
Уважаемые форумчане, возникла проблема - есть листы (будет несколько сотен) с кавычками, пробелами, табуляциями и надо автоматом их сохранять их в тхт.

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

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

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


Код
Workbooks(FileNameGraf).Sheets(SheetName).ChartArea.Copy
ThisWorkbook.Activate
With Worksheets("Расчет")
    .Range("F11").Select
    .Paste
    .Range("E6").Copy ' "очищаем" буфер обмена
End With 

и все-таки, уважаемый Слэн, почему не исполняется цикл, когда до активчарт еще очень далеко?? Ведь просто  в цикл он должен же был зайти...
Изменено: peat - 16.01.2014 16:16:20 (фф)
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
ikki чуть позже попробую засунуть функцию в процедуру. Весь код показать не могу - софтина будет оформляться, в инете ее светить не желательно) пожалуй, функцию из первой месаги надо затереть, чтобы не палить контору)))

Слэн а какие еще у вас зачем?? задавайте их, пожалуйста, вы меня уже многому научили
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
Цитата
а зачем P_tr объявлена как Double?
я здесь много уже чего спрашивал и кто-то рекомендовал использовать именно дабл и лонг, я на автомате для этой величины использовал дабл, хотя в этой функции подходит действительно лонг, большое спасибо за рекомендацию!)

Цитата
и зачем объявлена функция?
отличные вопросы вы задаете!)
действительно, в этой функции-то смысла нет, можно в сабе все сделать...это поможет чуть-чуть ускорить работу и избавить от ошибки, которая лечится циклом DoEvents?
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
Цитата
не срабатывает chart.select,
но ведь код не заходит даже на эту строчку:

Код
For P_tr = 5 To 40 
когда до chart.select еще далеко...
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
я попытался попробовать цикл - но не совсем разобрался с ним, гуглил только дуивентс, забыв про цикл. сейчас вставил такой цикл:


Код
Dim Current As Long

    Current = Timer
    Do Until Timer - Current >= 10
        DoEvents
    Loop 
и все заработало....но почему??! очень интересно услышать ваше объяснение

мне казалось, в данном случае пример не важен т.к. дело внутр функции)не хочется его выкладывать, там оочень много всего))
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
Слен
Массивы VJ_XTable, VJ_YTable заданы как паблик т.к. я использую их значение дальше. По кнопке строится график и тп, потом вызываются эти 3 функции, которые вынесены в отдельный модуль. Сейчас я провел эксперимент, 2 раза вызвал эту функцию:

Код
Call Q_guess_VJ
Call Q_guess_VJ
Call Q_guess_NK
Call Q_guess_SP

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

Раньше это нормально работало, видимо, потому, что до этих 3 функций вызывалась другая, вспомогательная, так сказать - она формировала путь к папке, теперь я от нее избавился

Хм. Я стал вызывать до них другую функцию из того же модуля, вообще никак не связанную с ними и не делающую ничего, и все хорошо...Но почему так?? Может, что-то надо инициализировать?
Изменено: peat - 16.01.2014 13:19:33 (йй)
При пошаговом выполнении пользовательская функция работает, а автоматически - нет!
 
Уважаемый Слэн, а чем может помочь пример?
Как вообще может быть такое, что пошагово функция работает, а в нормальном режиме - нет?)

Я ставлю брейкпоинт на первую строчку цикла - ничего не происходит!Только если ставлю на строку Q_guess3 = 200, то появляется возможность "шагать"...что ж такое-то

а при вызове с рабочего листа функция строит кривую на существующем графике о0 делаааа)

да, проблема где-то у меня в коде. я вызываю 3 функции:

Код
Call Q_guess_VJ
Call Q_guess_NK
Call Q_guess_SP

и не работает первая из них. Обязательно первая. Меняешь местами первую с третьей - третья не работает, первая работает...
Изменено: peat - 16.01.2014 13:09:50 (йй)
Цикл с использованием двух файлов 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)
Страницы: 1 2 3 4 След.
Наверх