Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | Диаграмма & Графика


Rambler's Top100


Counter CO.KZ


    [1] [2] [3] [4]

  1. Как запретить пользователю перемещать, изменять размеры и удалять диаграмму на рабочем листе ? NEW 08.04.2018
  2. Как запретить изменение исходных данных в диаграмме ? NEW 08.04.2018
  3. Как запретить изменение форматирования в диаграмме ? NEW 08.04.2018
  4. Как запретить выделение диаграммы и её элементов ? NEW 09.04.2018
  5. Как запретить изменение точек с помощью мышки ? NEW 09.04.2018
  6. Как снять выделение с диаграммы ? NEW 01.05.2018
  7. Как сделать так, чтобы диаграмма заполняла всё окно ? NEW 02.05.2018
  8. Как определить является ли графический об'ект диаграммой или нет ? NEW 03.05.2018
  9. Как определить видимость заголовка диаграммы, как изменить видимость заголовка, как переместить заголовок и как изменить текст заголовка диаграммы ? NEW 03.05.2018
  10. Как программно создать заголовок диаграммы, который будет отображать данные нужной ячейки ? NEW 05.05.2018
    [1] [2] [3] [4]


  • Ответ :

    Для того, чтобы запретить перемещение, изменение размеров и удаление диаграммы на рабочем листе, достаточно у об'екта ChartObject установить значение свойства .ProtectChartObject = True
  • Worksheets(1).ChartObjects(1).ProtectChartObject = True
    Комментарий : Подобный запрет действует только для пользователя, т.е. при попытке переместить, изменить размеры или удалить вручную. Программно же осуществить задуманное можно и после такой защиты.
  • Ответ :

    Для того, чтобы запретить изменение исходных данных (и в строке формул и через стандартное диалоговое окно Исходные данные, если диаграмма построена на основании данных ячеек) достаточно у об'екта Chart установить значение свойства .ProtectData как True

    Если диаграмма расположена на отдельном листе
  • Charts(1).ProtectData = True
    Если диаграмма расположена на рабочем листе
    Worksheets(1).ChartObjects(1).Chart.ProtectData = True
    Комментарий : Подобный запрет действует только для пользователя, т.е. при попытке изменить источник диаграммы вручную. Программно же осуществить задуманное можно и после такой защиты.
  • Ответ :

    Для того, чтобы запретить изменение параметров форматирования, достаточно у об'екта Chart установить значение свойства .ProtectFormatting = True

    Если диаграмма расположена на отдельном листе
  • Charts(1).ProtectFormatting = True
    Если диаграмма расположена на рабочем листе
    Worksheets(1).ChartObjects(1).Chart.ProtectFormatting = True
    
    Комментарий : Подобный запрет действует только для пользователя, т.е. при попытке изменить параметры форматирования вручную. Программно же осуществить задуманное можно и после такой защиты.
  • Ответ :

    Вариант I. Для того, чтобы запретить как выделение всей диаграммы, так и отдельных её элементов, достаточно у об'екта Chart установить значение свойства .ProtectSelection = True

    Если диаграмма расположена на отдельном листе
  • Charts(1).ProtectSelection = True
    Если диаграмма расположена на рабочем листе
    Worksheets(1).ChartObjects(1).Chart.ProtectSelection = True
    Комментарий : Подобный запрет действует только для пользователя, т.е. при попытке выделения вручную. Программно же осуществить задуманное можно (хотя в этом и нет необходимости), однако, в любом случае, после изменения значение свойства .ProtectSelection на True перестанет вызываться событие Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)

    Вариант II. Если диаграмма расположена на рабочем листе, то можно установить защиту листа только в отношении об'ектов, т.е.
    Worksheets(1).Protect Password:="Ваш_пароль", _
    DrawingObjects:=True, Contents:=False
    Правда такая защита коснётся всех об'ектов, находящихся на первом рабочем листе, поэтому перед защитой листа имеет смысл разблокировать те об'екты, которые пользователь вправе выделять и изменять.
  • Ответ :

    Не секрет, что если выделить мышкой точку и изменить её высоту (гистограмма и т.п.) или переместить точку на графике, то это приведёт и к изменению исходных данных (ячейка/элемент массива) И если подобное изменение не должно быть доступно пользователю, то можно у об'екта Chart установить значение свойства .ProtectGoalSeek = True

    Если диаграмма расположена на отдельном листе
  • Charts(1).ProtectGoalSeek = True
    Если диаграмма расположена на рабочем листе
    Worksheets(1).ChartObjects(1).Chart.ProtectGoalSeek = True
    

  • Ответ : Актуально только для MS Excel 97-2003

    Для того, чтобы убрать выделение с диаграммы, можно использовать клавишу ESC. Тот же результат, только программно, можно получить, если воспользоваться методом .Deselect об'екта Chart
  • Worksheets(1).ChartObjects(1).Chart.Deselect
    Обратите внимание на то, разработчики новых версий (начиная с Excel 2007) не смогли сохранить приемственность версий, поэтому в новых версиях, этот метод уже не будет выполнять свою миссию. А чтобы никто не догадался о их фиаско, разработчики просто скрыли этот метод.
  • Ответ : Актуально только для MS Excel 97-2003

    Для того, чтобы масштабировать диаграмму по размеру окна, т.е. сделать так, чтобы она занимала всё окно, достаточно у об'екта Chart изменить значение свойства .SizeWithWindow на True
  • Charts(1).SizeWithWindow = True
    Обратите внимание на то, что :
  • это свойство можно применять только для листов диаграмм
  • в новых версиях (начиная с Excel 2007), это свойство уже не будет выполнять свою миссию.
  • Ответ :

    Для того, чтобы определить является ли графический об'ект диаграммой или нет, можно использовать несколько вариантов :

    Вариант I.
  • Dim iShape As Shape
    For Each iShape In Worksheets(1).Shapes
        If iShape.Type = msoChart Then
           MsgBox "Диаграмма на рабочем листе", , iShape.Name
        End If
    Next
    Вариант II.
    Dim iShape As Shape
    For Each iShape In Worksheets(1).Shapes
        If TypeOf iShape.DrawingObject Is ChartObject Then
           MsgBox "Диаграмма на рабочем листе", , iShape.Name
        End If
    Next
    Вариант III.
    Dim iShape As Shape
    For Each iShape In Worksheets(1).Shapes
        If TypeName(iShape.DrawingObject) = "ChartObject" Then
           MsgBox "Диаграмма на рабочем листе", , iShape.Name
        End If
    Next
    Вариант IV. Только для версии Excel 2007(и старше)
    Dim iShape As Shape
    For Each iShape In Worksheets(1).Shapes
        If iShape.HasChart = True Then
           MsgBox "Диаграмма на рабочем листе", , iShape.Name
        End If
    Next

  • Ответ :

    Для того, чтобы определить отображается или нет - заголовок диаграммы, достаточно использовать свойство .HasTitle об'екта Chart
  • If Worksheets(1).ChartObjects(1).Chart.HasTitle = True Then
       MsgBox "Заголовок виден"
    Else
       MsgBox "Заголовок не виден"
    End If
    Для того, чтобы отобразить заголовок диаграммы, достаточно просто изменить значение свойства .HasTitle на True, а чтобы скрыть, соответственно, на False
    Worksheets(1).ChartObjects(1).Chart.HasTitle = True
    Worksheets(1).ChartObjects(1).Chart.HasTitle = False
    Чтобы переместить заголовок, достаточно у об'екта ChartTitle изменить значения свойств .Top и .Left
    With Worksheets(1).ChartObjects(1).Chart.ChartTitle
         .Top = 10
         .Left = 15
    End With
    А чтобы изменить текст заголовка диаграммы, а при необходимости, и получить его, достаточно использовать любой из трёх нижеопубликованных вариантов :
    With Worksheets(1).ChartObjects(1).Chart.ChartTitle
         .Text = "Новый заголовок"
         MsgBox .Text
         .Caption = "Новый заголовок2"
         MsgBox .Caption
         .Characters.Text = "Новый заголовок3"
         MsgBox .Characters.Text
    End With
    Комментарий : Имейте ввиду, что все манипуляции с об'ектом ChartTitle возможны только при условии наличии заголовка диаграммы. Проще говоря, если заголовок будет скрыт, то любая попытка обратиться к ChartTitle закончится ошибкой. Поэтому, либо предварительно отображайте заголовок (см. выше свойство .HasTitle), либо работайте только с видимым заголовком.
  • Ответ :

    Если тип диаграммы не позволяет указать название диаграммы в строке формул, то можно просто создать текстовое поле и связать его с нужной ячейкой (см. нижеопубликованный макрос) Только не забудьте указать ячейку, с которой должен быть связан заголовок диаграммы, рабочий лист на котором расположена диаграмма, а также саму диаграмму (индекс или её имя)
  • Private Sub ChartTitle_ToLinkCell()
        Dim iChart As Chart, iTitle As ChartTitle
        Set iChart = Worksheets(1).ChartObjects(1).Chart 'Укажите существующую диаграмму
        iChart.HasTitle = True: Set iTitle = iChart.ChartTitle
    
        With iChart.TextBoxes.Add(iTitle.Left, iTitle.Top, 0, 0)
             .AutoSize = True
             .Formula = "'Лист источник'!A1" '"A1"
             With .Font
                  .Bold = iTitle.Font.Bold
                  .Name = iTitle.Font.Name
                  .Size = iTitle.Font.Size
                  .Color = iTitle.Font.Color
                  'и т.д.
             End With
        End With
    
        iChart.ChartTitle.Delete 'iChart.HasTitle = False
    End Sub
    Комментарий : Обратите внимание на то, что новый заголовок диаграммы заимствует месторасположение (Left и Top), а также параметры форматирования у старого(изначального) заголовка.

    Если сие неприемлимо, то просто укажите свои параметры, которые могут быть как константами, например, .Bold = True

    Так и параметрами форматирования ячейки, с которой связан заголовок. Причём, если речь идёт о версиях Excel 97,2000,XP,2003, то при создании связи текстового поля и ячейки, поле автоматически наследует(заимствует) параметры форматирования исходной ячейки :
    Private Sub ChartTitle_ToLinkCell97() '97-2003
        Dim iChart As Chart, iTitle As ChartTitle
        Set iChart = Worksheets(1).ChartObjects(1).Chart 'Укажите существующую диаграмму
        iChart.HasTitle = True: Set iTitle = iChart.ChartTitle
    
        With iChart.TextBoxes.Add(iTitle.Left, iTitle.Top, 0, 0)
             .AutoSize = True
             .Formula = "'Лист источник'!A1" '"A1"
        End With
    
        iChart.ChartTitle.Delete 'iChart.HasTitle = False
    End Sub
    Тоже самое, но без использования переменных :
    Private Sub ChartTitle_ToLinkCell97v2() '97-2003
        With Worksheets(1).ChartObjects(1).Chart
             .HasTitle = True
             With .TextBoxes.Add(.ChartTitle.Left, .ChartTitle.Top, 0, 0)
                  .AutoSize = True
                  .Formula = "'Лист источник'!A1" '"A1"
             End With
             .ChartTitle.Delete '.HasTitle = False
        End With
    End Sub
    Начиная с версии Excel 2007 ситуация, к сожалению, изменилась, и теперь заимствовать параметры форматирвания нужно также, как и в случае с родным заголовком диаграммы, т.е.
    Private Sub ChartTitle_ToLinkCell2007() '2007(и старше)
        Dim iChart As Chart, iTitle As ChartTitle, iCell As Range
        Set iChart = Worksheets(1).ChartObjects(1).Chart 'Укажите существующую диаграмму
        Set iCell = Range("'Лист источник'!A1") 'Worksheets(2).Range("A1")
        iChart.HasTitle = True: Set iTitle = iChart.ChartTitle
    
        With iChart.TextBoxes.Add(iTitle.Left, iTitle.Top, 0, 0)
             .Name = "Название диаграммы" 'iTitle.Name
             .AutoSize = True
             .Formula = iCell.Address(External:=True)
             With .Font
                  .Bold = iCell.Font.Bold
                  .Name = iCell.Font.Name
                  .Size = iCell.Font.Size
                  .Color = iCell.Font.Color
                  'и т.д.
             End With
        End With
    
        iChart.ChartTitle.Delete 'iChart.HasTitle = False
    End Sub
    Примечание : Т.к. связь создаётся только с содержимым ячейки, то дальнейшие изменения параметров форматирования ячейки - никак не отобразятся на текстовом поле(заголовке диаграммы)
    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

    © 2004-2018 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff