powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Диаграмма в Excel на основе изменяющегося количества листов
14 сообщений из 14, страница 1 из 1
Диаграмма в Excel на основе изменяющегося количества листов
    #39241338
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дано: несколько листов, называющихся месяцами, и еще несколько листов, называющихся как-то по-другому и находящихся в книге постоянно. По мере наступления нового месяца, добавляется новый лист с его названием. На всех листах-месяцах информация представлена в однородном виде, но с разным количеством столбцов - сколько дней в месяце + столбец-среднее (в самом конце) + столбец с наименованием параметров (в самом начале). Столбец-среднее подводится только по части параметров, а для остальных пуст, и поэтому значительно короче столбца с наименованием параметров.

Найти: построить гистограмму, на которой по месяцам будут выводиться средние значения параметров. Соответственно, на каждом листе-месяце надо выдернуть столбец-среднее, кусок столбца с наименованием параметров (ну, его можно один раз выдернуть, получается), сунуть в сводную на новом листе, добавить строку с наименованиями листов-месяцев, откуда сдернуто, и по этой табличке построить гистограмму.

Очень прошу помощи в реализации. На vba, естественно. В идеале, чтобы оно само туда подтягивалось по мере обновления данных, а не генерилось каждый раз по кнопке, хотя такой вариант тоже приемлем. Идей, как реализовать это при динамическом количестве листов, особо не имею. Только если записывать куда-то в левое место названия новых листов и вытягивать их потом оттуда. Готовые коды, которые попадались мне в интернетах, используют ADODB или ODBC, вследствие чего малопонятны и вызывают опасения при перетаскивании файла с одной версии Excel на другую, например. как выдергивать только кусок столбца - тоже затрудняюсь, поскольку лобовое задание диапазона не знаю, куда прицепить, при условии, что при формировании сводной нужно указывать названия столбцов.

При необходимости приложу файлик с примером листа-месяца.
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241348
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA,

VBA не нужен. Вашу задачу можно решить функциями листа.
Есть такая функция "ДВССЫЛ". Она преобразует текст в ссылку на ячейку.
Например, =ДВССЫЛ("Лист1!A1") ссылается на ячейку Лист1!A1.
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241351
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр,

И чего с этим знанием делать, когда количество листов для обработки изменяется? Как мне каждый раз добавлять туда новые? Беглый гугл пояснил, что ДВССЫЛ используется для изменения адреса ячейки в формуле, но если мне надо добавить новые элементы в нее? Простите, пожалуйста, я немного чайник.
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241428
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA,

Есть ли у вас алгоритм по которому формируются имена листов с данными?
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241435
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA, написано левой ногой.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Function BuildIt()
Dim WS As Worksheet
Dim target As Range
Dim AvgValue As Variant
Dim DataArray() As Variant
Dim s As Series
Dim c As Chart

For Each WS In ActiveWorkbook.Worksheets
    Debug.Print WS.Name
    Set target = SearchForRow(WS, "Значение")
    If Not target Is Nothing Then
        WS.Activate
        AvgValue = Application.Average(WS.Range(Cells(target.Row + 1, target.Column), target.End(xlDown)))
        If (Not DataArray) = -1 Then
            ReDim DataArray(0 To 1, 0 To 0)
        Else
            ReDim Preserve DataArray(0 To 1, 0 To UBound(DataArray, 2) + 1)
        End If
        DataArray(0, UBound(DataArray, 2)) = WS.Name
        DataArray(1, UBound(DataArray, 2)) = AvgValue
    End If
Next

ActiveSheet.Shapes.AddChart.Select
Set c = ActiveChart
Set s = c.SeriesCollection(1)
s.Values = GetArrLine(DataArray, 1)
s.XValues = GetArrLine(DataArray, 0)

End Function

Private Function GetArrLine(arr() As Variant, line As Long) As Variant
Dim i As Long
Dim res As Variant
    ReDim res(LBound(arr, 2) To UBound(arr, 2))
    For i = LBound(arr, 2) To UBound(arr, 2)
        res(i) = arr(line, i)
    Next
    GetArrLine = res
End Function

Private Function SearchForRow(WS As Worksheet, value As String) As Range
    Set SearchForRow = WS.Cells.Find(value)
End Function


Каждый столбец значений (по которому будет вычисляться среднее значение) должен быть озаглавлен соответственно (в примере "Значение")
При переборе листов, если идентификатор столбца с требуемым заголовком не обнаружен - лист будет пропущен
При обнаружении такого столбца - вычисляем его среднее значение.
По окончании перебора строим гистограмму вычисленных средних значений по именам листов (в твоем случае - будут наименования месяцев).
По надобности - причешешь сам - думаю труда не составит.
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241452
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hclubmk,

Спасибо огромное!
Пара уточняющих вопросов: мне нужно среднее по строке, а не по столбцу, соответственно строка
Код: vbnet
1.
 AvgValue = Application.Average(WS.Range(Cells(target.Row + 1, target.Column), target.End(xlDown)))


Поменяется на
Код: vbnet
1.
 AvgValue = Application.Average(WS.Range(Cells(target.Row, target.Column+1), target.End(xlDown)))


Правильно? И единственное, мне нужно не до конца строки, а до определенного столбца, вместо End(xlDown) можно подставить тот же target.Column(111)?

И гистограмма из вашего кода строит получается по какому-то одному параметру гистограмму средних его значений по месяцам, правильно понимаю?
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241455
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тьфу, прошу прощения, вместо End(xlDown) будет WS.Range(Cells(target.Row, target.Column(111)) же, да?
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241460
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
target.End(xlToRight)
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241462
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ гистограмма из вашего кода строит получается по какому-то одному параметру гистограмму средних его значений по месяцам, правильно понимаю? правильно.
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39241474
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hclubmk,

для теста программка требует пары доработок, так что по итогу отпишусь позже :)
И еще раз большое спасибо!
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39243914
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
target.End(xlToRight)


Не получается, не то. Этот синтаксис пробегает строку до последнего заполненного столбца, а мне надо не до последнего, до определенного. Пробовала заменить на указание конкретной ячейки через Ws.Range.Cells, пробовала тупо указать столбец, не получается. Стильно туплю.

И еще, подскажите, пожалуйста, как результирующую гистограмму вставить на лист? Нужен ли для этого синтаксис .charts, или можно просто засунуть результат функции в переменную и вставить в какую-то ячейку на листе?
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39244073
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoHnA,
1.
Код: vbnet
1.
target.Offset(0, <Нужное смещение>)


2. "Засунув" результат функции в переменную, на листе можно лишь получить значение, вычисленное этой функцией.
Здесь вариантов может быть несколько: либо вставлять график, либо обновлять график (если существует), либо заполнять результирующую таблицу, к которой будет привязан" график, ну или ещё какие либо варианты...
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39244087
YoHnA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hclubmk,

1. И еще раз спасибо!
2. Интересует вариант обновления графика, построенного на таблице, наверное. Чтобы добавил новую сточку месяца, добавился новый столбик в гистограмму. Если пересоздавать таблицу, график будет же обновляться? Или упадет?
...
Рейтинг: 0 / 0
Диаграмма в Excel на основе изменяющегося количества листов
    #39244114
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, если обновить значения - график обновится автоматически, но если добавить значения в таблицу - нужно будеит указать область данных (изменившуюся/увеличившуюся) посредством
Код: vbnet
1.
Chart.SetSourceData
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Диаграмма в Excel на основе изменяющегося количества листов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]