Не работает Plotarea с другого листа

Автор Bregra, 15 ноября 2015, 01:50

Bregra

Здравствуйте!

Помогите, пожалуйста, решить проблему. Я хотел бы, чтобы размер графика полностью совпадал со всей диаграммой, для этого я plotarea приравниваю к parent (m.Chart.PlotArea.Left = m.Chart.Parent.Left). Если запускать макрос с листа на котором находятся данные, то все прекрасно работает, но если запускать с другого листа, то выводится ошибка method 'left' of object 'plotarea' failed. Run time error. Подскажите, есть ли способы исправить эту ошибку? Запускать макрос с того же листа не получится, потому что листов много и на всех есть plotarea. Спасибо.

Администратор

Bregra, какая у вас версия Excel?

Вообще, это:
m.Chart.PlotArea.Left
расстояние между левым краем области построения и левым краем диаграммы.

А это:
m.Chart.Parent.Left
расстояние между левым краем диаграммы и левым краем листа.

Вы делаете бессмысленное действие.
Если вы хотите чтобы левый край графика совпал с левым краем диаграммы, то нужно установить здесь ноль:
m.Chart.PlotArea.Left = 0

Bregra

Версия excel 2007.  Моя задача нарисовать график в ячейке, для этого я приравниваю parent к размерам ячейки, а потом я хочу область приравнять к области диаграммы. Код работает если его выполнять на листе на котором находятся данные, но если его запускать с другого листа, то он работать перестает. Сам код

Set w = Sheets("Sheet1")
Set m = w.Shapes.AddChart(clustered)
Set n = w.Cells(3, 3)
    n.RowHeight = 10
    n.ColumnWidth = 7
   
m.Chart.SetSourceData Source:=Range("e8:h8"), PlotBy:=xlColumns
m.Chart.Parent.Left = n.Left
m.Chart.Parent.Width = n.Width
m.Chart.Parent.Height = n.Height
m.Chart.Parent.Top = n.Top
m.Chart.PlotArea.Left = m.Chart.Parent.Left
m.Chart.PlotArea.Width = m.Chart.Parent.Width
m.Chart.PlotArea.Height = m.Chart.Parent.Height
m.Chart.PlotArea.Top = m.Chart.Parent.Top

Администратор

Вот так логично:
m.Chart.PlotArea.Left = 0
m.Chart.PlotArea.Top = 0

Bregra

Все тоже самое не помогает, выводит такую же ошибку. Если запускать с листа, где данные работает, но если перейти на другой лист, то работать перестает.

Администратор

Посмотрю в течение дня.
Возник такой вопрос. Ячейка Cells(3, 3) очень маленькая и вы в неё вставляете диаграмму. Не понятно, что происходит. Такая диаграмма маленькая или в чём смысл?

Bregra

Я в диаграмме все надписи убрал, поэтому график будте виден хорошо, если не будет выдаваться ошибки)) И размеры ячейки можно изменить, дело не в них. Я как понимаю ошибка происходит из-за того, что excel почему то не может выполнять Plotarea с другим листом. Может я путь как то неправильно для него прописал. PS Кстати range записан как Range(Sheets("Sheet1").Cells(8,5),Sheets("Sheet1").Cells(8,8))
Спасибо.

Администратор

После того, как макрос создаёт диаграмму, нужно отобразить на мониторе лист, на котором была создана диаграмма, а затем снова можете перейти на нужный лист. При этом обновление монитора (Application.ScreenUpdating = False) отключать нельзя.

Пока можно предположить, что это сбой в работе программы "Excel".

Код
Sub Макрос1()
   
    Dim sh As Excel.Worksheet, chrt As Excel.Chart, cel As Excel.Range

   
    '1. Vba-именование листа, на котором нужно создать диаграмму.
    Set sh = Sheets("Sheet1")
   
    '2. Создание диаграммы.
    Set chrt = sh.Shapes.AddChart(xlColumnClustered).Chart
   
    '3. Отображение на мониторе листа, чтобы не было ошибки при работе с "PlotArea".
    sh.Select
   
    '4. Отображение на мониторе нужного листа.
    Worksheets(2).Select
   
    '5. Vba-именование ячейки, в которую нужно поместить диаграмму.
    Set cel = sh.Cells(3, 3)
   
    '6. Изменение размеров ячейки.
    cel.RowHeight = 10
    cel.ColumnWidth = 7
   
    '7. Настройка диаграммы.
    chrt.SetSourceData Source:=sh.Range("E8:H8"), PlotBy:=xlColumns
   
    '8. Перемещение и изменение размеров диаграммы.
    chrt.Parent.Left = cel.Left
    chrt.Parent.Top = cel.Top
    chrt.Parent.Width = cel.Width
    chrt.Parent.Height = cel.Height
   
    '9. Настройка области построения диаграммы.
    chrt.PlotArea.InsideLeft = -4
    chrt.PlotArea.InsideTop = -4
    chrt.PlotArea.Width = chrt.Parent.Width
    chrt.PlotArea.Height = chrt.Parent.Height
   
End Sub
[свернуть]

Bregra

Спасибо. Этот вариант работает. Но возникла другая проблема. Вариант работает если просто запускаешь макрос. Но если запускаешь макрос через форму, то проблема остается. А в чем разница между пунктами 3 и 4?

Администратор

Пункты 3 и 4 делают разное. Пункт 3 отображает на мониторе лист, на котором была создана диаграмма. А пункт 4 отображает на мониторе лист, который отображался на мониторе перед запуском макроса.

По поводу UserForm сейчас посмотрю у себя.

Администратор

У меня нет ошибки при использовании UserForm. Я тестировал так. Создал UserForm с одной кнопкой. Кнопка запускает макрос, который я выложил на форуме. Ошибок не было.

Bregra

Спасибо. Сейчас еще раз проверю, может я что то неправильно написал в коде, поэтому не хочет исправлять ошибку.

Bregra

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