|
[1]
[2] [3]
[4]
- Как запретить пользователю перемещать, изменять размеры
и удалять диаграмму на рабочем листе ? 08.04.2018
- Как запретить изменение исходных данных в диаграмме ?
08.04.2018
- Как запретить изменение форматирования в диаграмме ?
08.04.2018
- Как запретить выделение диаграммы и её элементов ?
09.04.2018
- Как запретить изменение точек с помощью мышки ?
09.04.2018
- Как снять выделение с диаграммы ? 01.05.2018
- Как сделать так, чтобы диаграмма заполняла всё окно ?
02.05.2018
- Как определить является ли графический об'ект
диаграммой или нет ? 03.05.2018
- Как определить видимость заголовка диаграммы,
как изменить видимость заголовка, как переместить заголовок и как
изменить текст заголовка диаграммы ? 03.05.2018
- Как программно создать заголовок диаграммы, который
будет отображать данные нужной ячейки ? 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 |
Примечание : Т.к. связь создаётся только с содержимым ячейки,
то дальнейшие изменения параметров форматирования ячейки - никак не
отобразятся на текстовом поле(заголовке диаграммы)
| | | | | | | | | | |
|