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

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

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

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

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

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

Есть ли у вас алгоритм по которому формируются имена листов с данными?
...
Рейтинг: 0 / 0
23.05.2016, 14:44
    #39241435
hclubmk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диаграмма в Excel на основе изменяющегося количества листов
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
23.05.2016, 15:09
    #39241452
YoHnA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диаграмма в Excel на основе изменяющегося количества листов
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
23.05.2016, 15:13
    #39241455
YoHnA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диаграмма в Excel на основе изменяющегося количества листов
Тьфу, прошу прощения, вместо End(xlDown) будет WS.Range(Cells(target.Row, target.Column(111)) же, да?
...
Рейтинг: 0 / 0
23.05.2016, 15:16
    #39241460
hclubmk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диаграмма в Excel на основе изменяющегося количества листов
Код: vbnet
1.
target.End(xlToRight)
...
Рейтинг: 0 / 0
23.05.2016, 15:18
    #39241462
hclubmk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диаграмма в Excel на основе изменяющегося количества листов
авторИ гистограмма из вашего кода строит получается по какому-то одному параметру гистограмму средних его значений по месяцам, правильно понимаю? правильно.
...
Рейтинг: 0 / 0
23.05.2016, 15:29
    #39241474
YoHnA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диаграмма в Excel на основе изменяющегося количества листов
hclubmk,

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


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

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


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

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


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