Вожусь вот с экспериментальными данными. Хотел бы организовать рутинную работу. Буду рад, если подскажите, как это сделать..
Задача - довольно простая. Есть массив данных, разбитый на множество блоков. В каждом блоке есть пара столбцов со значениями, по которым нужно построить графики. Дабы не делать это много раз, склепал и сохранил в Template отформатированный как надо график, который хотел бы сделать для всех этих данных. Всего должно быть графиков 30. Начал писать макрос на VBA и тут же споткнулся.
[/vba] Не работает. Появляется сообщение об ошибке: "Run-time error '1004': The specified dimension is not valid for the current chart type" При нажатии Debug, вот эта строчка выделяется жёлтым: "ActiveSheet.Shapes.AddChart.Select" Что тут неверно?
Вопрос 1: Как правильно вставлять график из Templates?
Но это ещё не всё.. Затем я хотел бы сделать графики определённого размера, чтобы они все были одинаковые. При обычной встаке (ну, не макросом, а "ручками") графики появляются маленькие как я их не сохраняй. Вот тут уже обсуждался вопрос ресайза графиков на определённое количество ячеек. А можно изменять на определённое количество единиц Height и Width? В идеале было бы здорово дописать в макросе пару строчек кода, так чтобы после появления график автоматически ресайзился на заданное количество единиц (скажем, чтобы Height=7" и Width=8").
Вопрос 2: Как с помощью макроса написанного в VBA изменить размер график на заданное количество единиц?
Всем привет!
Вожусь вот с экспериментальными данными. Хотел бы организовать рутинную работу. Буду рад, если подскажите, как это сделать..
Задача - довольно простая. Есть массив данных, разбитый на множество блоков. В каждом блоке есть пара столбцов со значениями, по которым нужно построить графики. Дабы не делать это много раз, склепал и сохранил в Template отформатированный как надо график, который хотел бы сделать для всех этих данных. Всего должно быть графиков 30. Начал писать макрос на VBA и тут же споткнулся.
[/vba] Не работает. Появляется сообщение об ошибке: "Run-time error '1004': The specified dimension is not valid for the current chart type" При нажатии Debug, вот эта строчка выделяется жёлтым: "ActiveSheet.Shapes.AddChart.Select" Что тут неверно?
Вопрос 1: Как правильно вставлять график из Templates?
Но это ещё не всё.. Затем я хотел бы сделать графики определённого размера, чтобы они все были одинаковые. При обычной встаке (ну, не макросом, а "ручками") графики появляются маленькие как я их не сохраняй. Вот тут уже обсуждался вопрос ресайза графиков на определённое количество ячеек. А можно изменять на определённое количество единиц Height и Width? В идеале было бы здорово дописать в макросе пару строчек кода, так чтобы после появления график автоматически ресайзился на заданное количество единиц (скажем, чтобы Height=7" и Width=8").
Вопрос 2: Как с помощью макроса написанного в VBA изменить размер график на заданное количество единиц?Triangle
Без Вашего файла можно только гадать. Скорее всего, Вы неверно указываете макросу область для графика.
В качестве ответа на оба Ваших вопроса. Во вложении Вы найдете кнопку с макросом, которая создаст график, применит к нему шаблон и поиграется с параметрами. Предварительно поменяйте в ячейке G2 путь к шаблону. Сам шаблон также во вложении.
[vba]
Код
Sub Rio_Chart_Clone()
'Author: Roman Rioran Voronov 'Date: the 4-th of September, 2014 'Feedback: voronov_rv@mail.ru
'This is how you may create a chart and use your template on it 'with specifying table header and size
Dim X As Long 'Для обращения к новому графику
'Указываем программе, с каким листом будем работать. 'Далее эта ссылка заменяется точкой перед обращением к объектам листа. With ThisWorkbook.Worksheets("Rio_List")
'Предосторожность для корректного построения графика .Cells(1, 1).Select
ActiveSheet.Shapes.AddChart.Select 'Создаём и выделяем график
'Применяем к графику наш шаблон: ActiveChart.ApplyChartTemplate (.Cells(2, 7).Value)
X = ActiveSheet.Shapes.Count 'Считаем количество фигур на активном листе. Наша - последняя.
'Далее от левой верхней ячейки таблицы вместе с заголовками до правой нижней ячейки таблицы... ActiveChart.SetSourceData Source:=.Range("A1:C9") 'Выбираем область для создания диаграммы
'Меняем размеры таблицы ActiveSheet.Shapes(X).Height = 283.4645669291 '10 cm высота таблицы, задаём ActiveSheet.Shapes(X).Width = 425.1968503937 '15 cm ширина таблицы, задаём
Без Вашего файла можно только гадать. Скорее всего, Вы неверно указываете макросу область для графика.
В качестве ответа на оба Ваших вопроса. Во вложении Вы найдете кнопку с макросом, которая создаст график, применит к нему шаблон и поиграется с параметрами. Предварительно поменяйте в ячейке G2 путь к шаблону. Сам шаблон также во вложении.
[vba]
Код
Sub Rio_Chart_Clone()
'Author: Roman Rioran Voronov 'Date: the 4-th of September, 2014 'Feedback: voronov_rv@mail.ru
'This is how you may create a chart and use your template on it 'with specifying table header and size
Dim X As Long 'Для обращения к новому графику
'Указываем программе, с каким листом будем работать. 'Далее эта ссылка заменяется точкой перед обращением к объектам листа. With ThisWorkbook.Worksheets("Rio_List")
'Предосторожность для корректного построения графика .Cells(1, 1).Select
ActiveSheet.Shapes.AddChart.Select 'Создаём и выделяем график
'Применяем к графику наш шаблон: ActiveChart.ApplyChartTemplate (.Cells(2, 7).Value)
X = ActiveSheet.Shapes.Count 'Считаем количество фигур на активном листе. Наша - последняя.
'Далее от левой верхней ячейки таблицы вместе с заголовками до правой нижней ячейки таблицы... ActiveChart.SetSourceData Source:=.Range("A1:C9") 'Выбираем область для создания диаграммы
'Меняем размеры таблицы ActiveSheet.Shapes(X).Height = 283.4645669291 '10 cm высота таблицы, задаём ActiveSheet.Shapes(X).Width = 425.1968503937 '15 cm ширина таблицы, задаём
Triangle, Вам нужно для всех значений столбца А сделать текстовый формат (возможно, что не обязательно). Плюс, ключевой момент - вставьте сверху таблицы свободную строку и напишите в ней текстовые заголовки. Я это сделал и у меня Ваш макрос сработал.
Можно и без относительных ссылок. Когда добавляется Chart объект, у него генерится имя. У моего шаблона, например, имя: "Rounded Rectangle Х" где Х меняется в зависимости от количества созданных графиков. Вы можете сами задать имя новому Cart'у, если сделаете следующее:
Triangle, Вам нужно для всех значений столбца А сделать текстовый формат (возможно, что не обязательно). Плюс, ключевой момент - вставьте сверху таблицы свободную строку и напишите в ней текстовые заголовки. Я это сделал и у меня Ваш макрос сработал.
Можно и без относительных ссылок. Когда добавляется Chart объект, у него генерится имя. У моего шаблона, например, имя: "Rounded Rectangle Х" где Х меняется в зависимости от количества созданных графиков. Вы можете сами задать имя новому Cart'у, если сделаете следующее:
Плюс, ключевой момент - вставьте сверху таблицы свободную строку и напишите в ней текстовые заголовки. Я это сделал и у меня Ваш макрос сработал.
Сделал так. Всё равно не работает. Всё та же ошибка всё в том же месте. Не могу понять, что такого таинственного в этой строке: [vba]
Код
ActiveSheet.Shapes.AddChart.Select
[/vba]Мы ведь просто говорим этим, что нужно на активном листе создать фигуру, причём не какую-нибудь, а график, а потом нам надо этот график выделить. Всё. По идее, должен создаться совершенно любой график (ну, тот, который стоит по умолчанию), для которого мы уже потом сможем применить наш Template. Может ли быть проблема в создании графика по умолчанию? Что может в данном контексте значить ошибка 1004? [vba]
Код
"Run-time error '1004': The specified dimension is not valid for the current chart type"
Плюс, ключевой момент - вставьте сверху таблицы свободную строку и напишите в ней текстовые заголовки. Я это сделал и у меня Ваш макрос сработал.
Сделал так. Всё равно не работает. Всё та же ошибка всё в том же месте. Не могу понять, что такого таинственного в этой строке: [vba]
Код
ActiveSheet.Shapes.AddChart.Select
[/vba]Мы ведь просто говорим этим, что нужно на активном листе создать фигуру, причём не какую-нибудь, а график, а потом нам надо этот график выделить. Всё. По идее, должен создаться совершенно любой график (ну, тот, который стоит по умолчанию), для которого мы уже потом сможем применить наш Template. Может ли быть проблема в создании графика по умолчанию? Что может в данном контексте значить ошибка 1004? [vba]
Код
"Run-time error '1004': The specified dimension is not valid for the current chart type"
Может, надо все же работать с конкретным объектом, а не с "неким выделенным"? Особенно, если ваш файл включен в "режиме совместимости", а потому и .Shapes не может добавить .Chart. Хотя, если посмотреть со стороны - то, может быть, над опросто задать в .AddChart ещё и размеры?
Давайте воспользуемся старым добрым Embedded, например: [vba]
Код
Set MyChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 100) With MyChart .Name = "Мой график" '... End With
[/vba]
Может, надо все же работать с конкретным объектом, а не с "неким выделенным"? Особенно, если ваш файл включен в "режиме совместимости", а потому и .Shapes не может добавить .Chart. Хотя, если посмотреть со стороны - то, может быть, над опросто задать в .AddChart ещё и размеры?
Давайте воспользуемся старым добрым Embedded, например: [vba]
Код
Set MyChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 100) With MyChart .Name = "Мой график" '... End With
Triangle, спокойствие, только спокойствие, как завещал великий карлсон =)
Беру Ваш же файл (и макрос). Ставлю в файл кнопку. Теперь по нажатию Вам надо будет выбрать шаблон, который применяете. Файл во вложении, попробуйте и поделитесь результатами.
[vba]
Код
Sub InsertGraph2()
Dim strX As String Dim fd As FileDialog Dim FileChosen As Integer
Set fd = Application.FileDialog(msoFileDialogFilePicker) FileChosen = fd.Show
If FileChosen <> -1 Then MsgBox "You chose cancel" Else strX = fd.SelectedItems(1) End If
With ThisWorkbook.Worksheets("Sheet1") Cells(1, 1).Select
ActiveSheet.Shapes.AddChart.Select ActiveChart.ApplyChartTemplate (strX) X = ActiveSheet.Shapes.Count
[/vba] Есть кое-какие подозрения, заодно проверим.
Triangle, спокойствие, только спокойствие, как завещал великий карлсон =)
Беру Ваш же файл (и макрос). Ставлю в файл кнопку. Теперь по нажатию Вам надо будет выбрать шаблон, который применяете. Файл во вложении, попробуйте и поделитесь результатами.
[vba]
Код
Sub InsertGraph2()
Dim strX As String Dim fd As FileDialog Dim FileChosen As Integer
Set fd = Application.FileDialog(msoFileDialogFilePicker) FileChosen = fd.Show
If FileChosen <> -1 Then MsgBox "You chose cancel" Else strX = fd.SelectedItems(1) End If
With ThisWorkbook.Worksheets("Sheet1") Cells(1, 1).Select
ActiveSheet.Shapes.AddChart.Select ActiveChart.ApplyChartTemplate (strX) X = ActiveSheet.Shapes.Count
Скачал последний файл с этим многострадальным макросом. Открываю. Всё работает не в режиме совместимости, всё вроде в порядке.
Нажимаю на кнопку для построения графика. Открывается окно и предложение выбрать template для графика. Нахожу свой *.crtx, выбираю, нажимаю ОК. Макрос спотыкается и появляется сообщение об ошибке:
При дебаге та строчка, о которой я писал, снова выделяется желтым.
Такие дела..
=========================
AndreTM, спасибо за совет. Но тоже не работает. Спотыкается макрос и появляется такое сообщение об ошибке:
При попытке дебага желтым выделена первая же строка: [vba]
Код
Set MyChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 100)
[/vba] =========================
Чё-то я чую, что не прёт, потому что я изначально что-то делаю не так..
Rioran, вот Вам мой отчёт.
Скачал последний файл с этим многострадальным макросом. Открываю. Всё работает не в режиме совместимости, всё вроде в порядке.
Нажимаю на кнопку для построения графика. Открывается окно и предложение выбрать template для графика. Нахожу свой *.crtx, выбираю, нажимаю ОК. Макрос спотыкается и появляется сообщение об ошибке:
При дебаге та строчка, о которой я писал, снова выделяется желтым.
Такие дела..
=========================
AndreTM, спасибо за совет. Но тоже не работает. Спотыкается макрос и появляется такое сообщение об ошибке:
При попытке дебага желтым выделена первая же строка: [vba]
Код
Set MyChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 100)
[/vba] =========================
Чё-то я чую, что не прёт, потому что я изначально что-то делаю не так.. Triangle
Сообщение отредактировал Triangle - Понедельник, 08.09.2014, 05:49
Triangle, давайте ещё кое-что попробуем. Перезапустите компьютер, ничего в экселе кроме моего примера не открывайте. Когда нажмёте на кнопку макроса - выберете приложенный к теме мой или свой шаблон графика.
Triangle, давайте ещё кое-что попробуем. Перезапустите компьютер, ничего в экселе кроме моего примера не открывайте. Когда нажмёте на кнопку макроса - выберете приложенный к теме мой или свой шаблон графика.Rioran
Rioran, yes, sir! Сделано, sir! Всё как Вы сказали, sir! Всё равно ни черта не работает, sir!
В общем, комп перезагрузил, открыл только "Insert_Graph_4.xlsm", запустил макрос. Появляется всё то же Run-time error '1004', а дальше, как и раньше:
Видимо, придётся графики ручками вставлять без всяких макросов. Тогда надо будет хотя бы попробовать написать макрос для форматирования выделенного графика. Что, наверное, займёт чуть больше времени. Ну, это как вариант..
Rioran, yes, sir! Сделано, sir! Всё как Вы сказали, sir! Всё равно ни черта не работает, sir!
В общем, комп перезагрузил, открыл только "Insert_Graph_4.xlsm", запустил макрос. Появляется всё то же Run-time error '1004', а дальше, как и раньше:
Видимо, придётся графики ручками вставлять без всяких макросов. Тогда надо будет хотя бы попробовать написать макрос для форматирования выделенного графика. Что, наверное, займёт чуть больше времени. Ну, это как вариант..Triangle
может, попробовать без Селекта (запускаем при активном листе Sheet1 из книги Insert_Graph_4) [vba]
Код
Sub InsertGraph2() Dim strX As String With Application.FileDialog(msoFileDialogFilePicker) If .Show Then strX = .SelectedItems(1) Else MsgBox "You've chosen cancel": Exit Sub End With With ActiveSheet.Shapes.AddChart .Chart.ApplyChartTemplate (strX) .Chart.SetSourceData Range("$A$1:$B$52") .Height = 200: .Width = 200 End With End Sub
[/vba]
может, попробовать без Селекта (запускаем при активном листе Sheet1 из книги Insert_Graph_4) [vba]
Код
Sub InsertGraph2() Dim strX As String With Application.FileDialog(msoFileDialogFilePicker) If .Show Then strX = .SelectedItems(1) Else MsgBox "You've chosen cancel": Exit Sub End With With ActiveSheet.Shapes.AddChart .Chart.ApplyChartTemplate (strX) .Chart.SetSourceData Range("$A$1:$B$52") .Height = 200: .Width = 200 End With End Sub
Я бы посоветовал тогда Офис переставить Полностью весь комплект. Поскольку у меня всё вышеприведённое нами - отрабатывает на ура в любом случае прямо из кода.
Как вариант - проверьте параллельные процессы офисных прог, а также автозапуски Excel и Outlook...
P.S. Ещё вариант вспомнился - VB/J/дельфи-проги, пользующие у себя Офис в качестве вывода данных. Могут просто (и глупо) взять в монопольку офисные библиотеки для отрисовки некоего онлайна (изображая из себя гаджеты w7/8), а запущенная копия Офиса просто не поймёт, что один из их процессов уже работает как полуDOM...
P.S. Самый простой реал - проверять наши примеры на отдельной НЕ ВАШЕЙ машине. Если уж и там будет то же самое :(
Я бы посоветовал тогда Офис переставить Полностью весь комплект. Поскольку у меня всё вышеприведённое нами - отрабатывает на ура в любом случае прямо из кода.
Как вариант - проверьте параллельные процессы офисных прог, а также автозапуски Excel и Outlook...
P.S. Ещё вариант вспомнился - VB/J/дельфи-проги, пользующие у себя Офис в качестве вывода данных. Могут просто (и глупо) взять в монопольку офисные библиотеки для отрисовки некоего онлайна (изображая из себя гаджеты w7/8), а запущенная копия Офиса просто не поймёт, что один из их процессов уже работает как полуDOM...
P.S. Самый простой реал - проверять наши примеры на отдельной НЕ ВАШЕЙ машине. Если уж и там будет то же самое :(AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Среда, 10.09.2014, 03:22
AndreTM, спасибо! Переустановка офиса - дело проблематичное.. Звать сис.админа, уговаривать переставлять, объяснять, почему мне это надо..
Мне вот уже пришла в голову идея, что надо бы все макросы проверить на домашнем компе. Там правда старенький офис, но не думаю, что это будет круциально. Ну, всяко надо бы поглядеть..
AndreTM, спасибо! Переустановка офиса - дело проблематичное.. Звать сис.админа, уговаривать переставлять, объяснять, почему мне это надо..
Мне вот уже пришла в голову идея, что надо бы все макросы проверить на домашнем компе. Там правда старенький офис, но не думаю, что это будет круциально. Ну, всяко надо бы поглядеть..Triangle
А есть в Excel какое-нибудь специальное меню, позволяющее управлять его взаимопониманием с VBA? Может у меня там нет каких-нибудь несчастных пары галочек, из-за которых VBA пашет так криво? Дурацкий вопрос, но какой вот есть..
Вопросы ко всем:
А есть в Excel какое-нибудь специальное меню, позволяющее управлять его взаимопониманием с VBA? Может у меня там нет каких-нибудь несчастных пары галочек, из-за которых VBA пашет так криво? Дурацкий вопрос, но какой вот есть..Triangle
Sub InsertGraph2() 'Dim strX As String 'With Application.FileDialog(msoFileDialogFilePicker) ' If .Show Then strX = .SelectedItems(1) Else MsgBox "You've chosen cancel": Exit Sub 'End With With ActiveSheet.ChartObjects.Add(150, 250, 200, 200) '.Chart.ChartType = xlLine '.Chart.ApplyChartTemplate (strX) .Chart.SetSourceData Range("$A$1:$B$52") End With End Sub
[/vba]
Оказалось, Андрей уже предлагал (пост №6)
Triangle, а в таком виде работает?: [vba]
Код
Sub InsertGraph2() 'Dim strX As String 'With Application.FileDialog(msoFileDialogFilePicker) ' If .Show Then strX = .SelectedItems(1) Else MsgBox "You've chosen cancel": Exit Sub 'End With With ActiveSheet.ChartObjects.Add(150, 250, 200, 200) '.Chart.ChartType = xlLine '.Chart.ApplyChartTemplate (strX) .Chart.SetSourceData Range("$A$1:$B$52") End With End Sub