__Страница_001
__Страница_001
__Страница_001
__Страница_001
__Страница_001
__Страница_001
__Страница_001
__Страница_001
__Страница_001
__Страница_01
__Страница_002
__Страница_002
__Страница_002
__Страница_002
__Страница_002
__Страница_002
__Страница_002
__Страница_002
__Страница_002
__Страница_02
__Страница_003
__Страница_003
__Страница_003
__Страница_003
__Страница_003
__Страница_003
__Страница_003
__Страница_003
__Страница_003
__Страница_03
__Страница_01
__Страница_004
__Страница_004
__Страница_004
__Страница_004
__Страница_004
__Страница_004
__Страница_004
__Страница_004
__Страница_004
__Страница_04
__Страница_02
__Страница_005
__Страница_005
__Страница_005
__Страница_005
__Страница_005
__Страница_005
__Страница_005
__Страница_005
__Страница_005
__Страница_05
__Страница_03
__Страница_006
__Страница_006
__Страница_006
__Страница_006
__Страница_006
__Страница_006
__Страница_006
__Страница_006
__Страница_006
__Страница_06
__Страница_04
__Страница_007
__Страница_007
__Страница_007
__Страница_007
__Страница_007
__Страница_007
__Страница_007
__Страница_007
__Страница_007
__Страница_07
__Страница_05
__Страница_008
__Страница_008
__Страница_008
__Страница_008
__Страница_008
__Страница_008
__Страница_008
__Страница_008
__Страница_008
__Страница_08
__Страница_06
__Страница_009
__Страница_009
__Страница_009
__Страница_009
__Страница_009
__Страница_009
__Страница_009
__Страница_009
__Страница_009
__Страница_09
__Страница_07
__Страница_010
__Страница_010
__Страница_010
__Страница_010
__Страница_010
__Страница_010
__Страница_010
__Страница_010
__Страница_010
__Страница_10
__Страница_08
__Страница_011
__Страница_011
__Страница_011
__Страница_011
__Страница_011
__Страница_011
__Страница_011
__Страница_011
__Страница_011
__Страница_11
__Страница_09
__Страница_012
__Страница_012
__Страница_012
__Страница_012
__Страница_012
__Страница_012
__Страница_012
__Страница_012
__Страница_012
__Страница_12
__Страница_10
__Страница_013
__Страница_013
__Страница_013
__Страница_013
__Страница_013
__Страница_013
__Страница_013
__Страница_013
__Страница_013
__Страница_13
__Страница_11
__Страница_014
__Страница_014
__Страница_014
__Страница_014
__Страница_014
__Страница_014
__Страница_014
__Страница_014
__Страница_014
__Страница_14
__Страница_12
__Страница_015
__Страница_015
__Страница_015
__Страница_015
__Страница_015
__Страница_015
__Страница_015
__Страница_015
__Страница_015
__Страница_15
__Страница_13
__Страница_016
__Страница_016
__Страница_016
__Страница_016
__Страница_016
__Страница_016
__Страница_016
__Страница_016
__Страница_016
__Страница_16
__Страница_14
__Страница_017
__Страница_017
__Страница_017
__Страница_017
__Страница_017
__Страница_017
__Страница_017
__Страница_017
__Страница_017
__Страница_17
__Страница_15
__Страница_018
__Страница_018
__Страница_018
__Страница_018
__Страница_018
__Страница_018
__Страница_018
__Страница_018
__Страница_018
__Страница_18
__Страница_16
__Страница_019
__Страница_019
__Страница_019
__Страница_019
__Страница_019
__Страница_019
__Страница_019
__Страница_019
__Страница_019
__Страница_19
__Страница_17
__Страница_020
__Страница_020
__Страница_020
__Страница_020
__Страница_020
__Страница_020
__Страница_020
__Страница_020
__Страница_020
__Страница_20
__Страница_18
__Страница_021
__Страница_021
__Страница_021
__Страница_021
__Страница_021
__Страница_021
__Страница_021
__Страница_021
__Страница_021
__Страница_21
__Страница_19
__Страница_022
__Страница_022
__Страница_022
__Страница_022
__Страница_022
__Страница_022
__Страница_022
__Страница_022
__Страница_022
__Страница_22
__Страница_20
__Страница_023
__Страница_023
__Страница_023
__Страница_023
__Страница_023
__Страница_023
__Страница_023
__Страница_023
__Страница_023
__Страница_23
__Страница_21
__Страница_024
__Страница_024
__Страница_024
__Страница_024
__Страница_024
__Страница_024
__Страница_024
__Страница_024
__Страница_024
__Страница_24
__Страница_22
__Страница_025
__Страница_025
__Страница_025
__Страница_025
__Страница_025
__Страница_025
__Страница_025
__Страница_025
__Страница_025
__Страница_25
__Страница_23
__Страница_026
__Страница_026
__Страница_026
__Страница_026
__Страница_026
__Страница_026
__Страница_026
__Страница_026
__Страница_026
__Страница_26
__Страница_24
__Страница_027
__Страница_027
__Страница_027
__Страница_027
__Страница_027
__Страница_027
__Страница_027
__Страница_027
__Страница_027
__Страница_27
__Страница_25
__Страница_028
__Страница_028
__Страница_028
__Страница_028
__Страница_028
__Страница_028
__Страница_028
__Страница_028
__Страница_028
__Страница_28
__Страница_26
__Страница_029
__Страница_029
__Страница_029
__Страница_029
__Страница_029
__Страница_029
__Страница_029
__Страница_029
__Страница_029
__Страница_29
__Страница_27
__Страница_030
__Страница_030
__Страница_030
__Страница_030
__Страница_030
__Страница_030
__Страница_030
__Страница_030
__Страница_030
__Страница_30
__Страница_28
__Страница_031
__Страница_031
__Страница_031
__Страница_031
__Страница_031
__Страница_031
__Страница_031
__Страница_031
__Страница_031
__Страница_31
__Страница_29
__Страница_032
__Страница_032
__Страница_032
__Страница_032
__Страница_032
__Страница_032
__Страница_032
__Страница_032
__Страница_032
__Страница_32
__Страница_30
__Страница_033
__Страница_033
__Страница_033
__Страница_033
__Страница_033
__Страница_033
__Страница_033
__Страница_033
__Страница_033
__Страница_33
__Страница_31
__Страница_034
__Страница_034
__Страница_034
__Страница_034
__Страница_034
__Страница_034
__Страница_034
__Страница_034
__Страница_034
__Страница_34
__Страница_32
__Страница_035
__Страница_035
__Страница_035
__Страница_035
__Страница_035
__Страница_035
__Страница_035
__Страница_035
__Страница_035
__Страница_35
__Страница_33
__Страница_036
__Страница_036
__Страница_036
__Страница_036
__Страница_036
__Страница_036
__Страница_036
__Страница_036
__Страница_036
__Страница_36
__Страница_34
__Страница_037
__Страница_037
__Страница_037
__Страница_037
__Страница_037
__Страница_037
__Страница_037
__Страница_037
__Страница_037
__Страница_37
__Страница_35
__Страница_038
__Страница_038
__Страница_038
__Страница_038
__Страница_038
__Страница_038
__Страница_038
__Страница_038
__Страница_038
__Страница_38
__Страница_36
__Страница_039
__Страница_039
__Страница_039
__Страница_039
__Страница_039
__Страница_039
__Страница_039
__Страница_039
__Страница_039
__Страница_39
__Страница_37
__Страница_040
__Страница_040
__Страница_040
__Страница_040
__Страница_040
__Страница_040
__Страница_040
__Страница_040
__Страница_040
__Страница_40
__Страница_38
__Страница_041
__Страница_041
__Страница_041
__Страница_041
__Страница_041
__Страница_041
__Страница_041
__Страница_041
__Страница_041
__Страница_41
__Страница_39
__Страница_042
__Страница_042
__Страница_042
__Страница_042
__Страница_042
__Страница_042
__Страница_042
__Страница_042
__Страница_042
__Страница_42
__Страница_40
__Страница_043
__Страница_043
__Страница_043
__Страница_043
__Страница_043
__Страница_043
__Страница_043
__Страница_043
__Страница_043
__Страница_43
__Страница_41
__Страница_044
__Страница_044
__Страница_044
__Страница_044
__Страница_044
__Страница_044
__Страница_044
__Страница_044
__Страница_044
__Страница_44
__Страница_42
__Страница_045
__Страница_045
__Страница_045
__Страница_045
__Страница_045
__Страница_045
__Страница_045
__Страница_045
__Страница_045
__Страница_45
__Страница_43
__Страница_046
__Страница_046
__Страница_046
__Страница_046
__Страница_046
__Страница_046
__Страница_046
__Страница_046
__Страница_046
__Страница_46
__Страница_44
__Страница_047
__Страница_047
__Страница_047
__Страница_047
__Страница_047
__Страница_047
__Страница_047
__Страница_047
__Страница_047
__Страница_47
__Страница_45
__Страница_048
__Страница_048
__Страница_048
__Страница_048
__Страница_048
__Страница_048
__Страница_048
__Страница_048
__Страница_048
__Страница_48
__Страница_46
__Страница_049
__Страница_049
__Страница_049
__Страница_049
__Страница_049
__Страница_049
__Страница_049
__Страница_049
__Страница_049
__Страница_49
__Страница_47
__Страница_050
__Страница_050
__Страница_050
__Страница_050
__Страница_050
__Страница_050
__Страница_050
__Страница_050
__Страница_050
__Страница_50
__Страница_48
__Страница_051
__Страница_051
__Страница_051
__Страница_051
__Страница_051
__Страница_051
__Страница_051
__Страница_051
__Страница_051
__Страница_51
__Страница_49
__Страница_052
__Страница_052
__Страница_052
__Страница_052
__Страница_052
__Страница_052
__Страница_052
__Страница_052
__Страница_052
__Страница_52
__Страница_50
__Страница_053
__Страница_053
__Страница_053
__Страница_053
__Страница_053
__Страница_053
__Страница_053
__Страница_053
__Страница_053
__Страница_53
__Страница_51
__Страница_054
__Страница_054
__Страница_054
__Страница_054
__Страница_054
__Страница_054
__Страница_054
__Страница_054
__Страница_054
__Страница_54
__Страница_52
__Страница_055
__Страница_055
__Страница_055
__Страница_055
__Страница_055
__Страница_055
__Страница_055
__Страница_055
__Страница_055
__Страница_55
__Страница_53
__Страница_056
__Страница_056
__Страница_056
__Страница_056
__Страница_056
__Страница_056
__Страница_056
__Страница_056
__Страница_056
__Страница_56
__Страница_54
__Страница_057
__Страница_057
__Страница_057
__Страница_057
__Страница_057
__Страница_057
__Страница_057
__Страница_057
__Страница_057
__Страница_57
__Страница_55
__Страница_058
__Страница_058
__Страница_058
__Страница_058
__Страница_058
__Страница_058
__Страница_058
__Страница_058
__Страница_058
__Страница_58
__Страница_56
__Страница_059
__Страница_059
__Страница_059
__Страница_059
__Страница_059
__Страница_059
__Страница_059
__Страница_059
__Страница_059
__Страница_59
__Страница_57
__Страница_060
__Страница_060
__Страница_060
__Страница_060
__Страница_060
__Страница_060
__Страница_060
__Страница_060
__Страница_060
__Страница_60
__Страница_58
__Страница_061
__Страница_061
__Страница_061
__Страница_061
__Страница_061
__Страница_061
__Страница_061
__Страница_061
__Страница_061
__Страница_61
__Страница_59
__Страница_062
__Страница_062
__Страница_062
__Страница_062
__Страница_062
__Страница_062
__Страница_062
__Страница_062
__Страница_062
__Страница_62
__Страница_60
__Страница_063
__Страница_063
__Страница_063
__Страница_063
__Страница_063
__Страница_063
__Страница_063
__Страница_063
__Страница_063
__Страница_63
__Страница_61
__Страница_064
__Страница_064
__Страница_064
__Страница_064
__Страница_064
__Страница_064
__Страница_064
__Страница_064
__Страница_064
__Страница_64
__Страница_62
__Страница_065
__Страница_065
__Страница_065
__Страница_065
__Страница_065
__Страница_065
__Страница_065
__Страница_065
__Страница_065
__Страница_65
__Страница_63
__Страница_066
__Страница_066
__Страница_066
__Страница_066
__Страница_066
__Страница_066
__Страница_066
__Страница_066
__Страница_066
__Страница_66
__Страница_64
__Страница_067
__Страница_067
__Страница_067
__Страница_067
__Страница_067
__Страница_067
__Страница_067
__Страница_067
__Страница_067
__Страница_67
__Страница_65
__Страница_068
__Страница_068
__Страница_068
__Страница_068
__Страница_068
__Страница_068
__Страница_068
__Страница_068
__Страница_068
__Страница_68
__Страница_66
__Страница_069
__Страница_069
__Страница_069
__Страница_069
__Страница_069
__Страница_069
__Страница_069
__Страница_069
__Страница_069
__Страница_69
__Страница_67
__Страница_070
__Страница_070
__Страница_070
__Страница_070
__Страница_070
__Страница_070
__Страница_070
__Страница_070
__Страница_070
__Страница_70
__Страница_68
__Страница_071
__Страница_071
__Страница_071
__Страница_071
__Страница_071
__Страница_071
__Страница_071
__Страница_071
__Страница_071
__Страница_71
__Страница_69
__Страница_072
__Страница_072
__Страница_072
__Страница_072
__Страница_072
__Страница_072
__Страница_072
__Страница_072
__Страница_072
__Страница_72
__Страница_70
__Страница_073
__Страница_073
__Страница_073
__Страница_073
__Страница_073
__Страница_073
__Страница_073
__Страница_073
__Страница_073
__Страница_73
__Страница_71
__Страница_074
__Страница_074
__Страница_074
__Страница_074
__Страница_074
__Страница_074
__Страница_074
__Страница_074
__Страница_074
__Страница_74
__Страница_72
__Страница_075
__Страница_075
__Страница_075
__Страница_075
__Страница_075
__Страница_075
__Страница_075
__Страница_075
__Страница_075
__Страница_75
__Страница_73
__Страница_076
__Страница_076
__Страница_076
__Страница_076
__Страница_076
__Страница_076
__Страница_076
__Страница_076
__Страница_076
__Страница_76
__Страница_74
__Страница_077
__Страница_077
__Страница_077
__Страница_077
__Страница_077
__Страница_077
__Страница_077
__Страница_077
__Страница_077
__Страница_77
__Страница_75
__Страница_078
__Страница_078
__Страница_078
__Страница_078
__Страница_078
__Страница_078
__Страница_078
__Страница_078
__Страница_078
__Страница_78
__Страница_76
__Страница_079
__Страница_079
__Страница_079
__Страница_079
__Страница_079
__Страница_079
__Страница_079
__Страница_079
__Страница_079
__Страница_79
__Страница_77
__Страница_080
__Страница_080
__Страница_080
__Страница_080
__Страница_080
__Страница_080
__Страница_080
__Страница_080
__Страница_080
__Страница_80
__Страница_78
__Страница_081
__Страница_081
__Страница_081
__Страница_081
__Страница_081
__Страница_081
__Страница_081
__Страница_081
__Страница_081
__Страница_81
__Страница_79
__Страница_082
__Страница_082
__Страница_082
__Страница_082
__Страница_082
__Страница_082
__Страница_082
__Страница_082
__Страница_082
__Страница_82
__Страница_80
__Страница_083
__Страница_083
__Страница_083
__Страница_083
__Страница_083
__Страница_083
__Страница_083
__Страница_083
__Страница_083
__Страница_81
__Страница_084
__Страница_084
__Страница_084
__Страница_084
__Страница_084
__Страница_084
__Страница_084
__Страница_084
__Страница_084
__Страница_82
__Страница_085
__Страница_085
__Страница_085
__Страница_085
__Страница_085
__Страница_085
__Страница_085
__Страница_085
__Страница_085
__Страница_83
__Страница_086
__Страница_086
__Страница_086
__Страница_086
__Страница_086
__Страница_086
__Страница_086
__Страница_086
__Страница_086
__Страница_84
__Страница_087
__Страница_087
__Страница_087
__Страница_087
__Страница_087
__Страница_087
__Страница_087
__Страница_087
__Страница_087
__Страница_85
__Страница_088
__Страница_088
__Страница_088
__Страница_088
__Страница_088
__Страница_088
__Страница_088
__Страница_088
__Страница_088
__Страница_86
__Страница_089
__Страница_089
__Страница_089
__Страница_089
__Страница_089
__Страница_089
__Страница_089
__Страница_089
__Страница_089
__Страница_87
__Страница_090
__Страница_090
__Страница_090
__Страница_090
__Страница_090
__Страница_090
__Страница_090
__Страница_090
__Страница_090
__Страница_88
__Страница_091
__Страница_091
__Страница_091
__Страница_091
__Страница_091
__Страница_091
__Страница_091
__Страница_091
__Страница_091
__Страница_89
__Страница_092
__Страница_092
__Страница_092
__Страница_092
__Страница_092
__Страница_092
__Страница_092
__Страница_092
__Страница_092
__Страница_90
__Страница_093
__Страница_093
__Страница_093
__Страница_093
__Страница_093
__Страница_093
__Страница_093
__Страница_093
__Страница_093
__Страница_91
__Страница_094
__Страница_094
__Страница_094
__Страница_094
__Страница_094
__Страница_094
__Страница_094
__Страница_094
__Страница_094
__Страница_92
__Страница_095
__Страница_095
__Страница_095
__Страница_095
__Страница_095
__Страница_095
__Страница_095
__Страница_095
__Страница_095
__Страница_93
__Страница_096
__Страница_096
__Страница_096
__Страница_096
__Страница_096
__Страница_096
__Страница_096
__Страница_096
__Страница_096
__Страница_94
__Страница_097
__Страница_097
__Страница_097
__Страница_097
__Страница_097
__Страница_097
__Страница_097
__Страница_097
__Страница_097
__Страница_95
__Страница_098
__Страница_098
__Страница_098
__Страница_098
__Страница_098
__Страница_098
__Страница_098
__Страница_098
__Страница_098
__Страница_96
__Страница_099
__Страница_099
__Страница_099
__Страница_099
__Страница_099
__Страница_099
__Страница_099
__Страница_099
__Страница_099
__Страница_100
__Страница_100
__Страница_100
__Страница_100
__Страница_100
__Страница_100
__Страница_100
__Страница_100
__Страница_100
Текст
                    Excel 2003 и VBA
Справочник программиста
Пол Киммел
Джон Грин
Стивен Буллен
Роб Боуви
Роберт Розенберг
Брайан Паттерсон
"Диалектика"
Москва • Санкт -Л етербурr • Киев
2006


ББК 32.973.26-01 8.2 .75 К40 УДК 681.3 .07 Компьютерное издательство "Диалектика" Главный редактор С.Н. Tpuzyб Зав. реда1щией В.Р. Гиизбург Перевод с английского и редакция О.А. Леzу;ииского П о общим вопросам обращайтесь в издательство "Диалектика" по адресу: info@dialektika.com, http:// >11\Nw.di al ektika.com 115419, Москва, а/я 783; 03150, Киев, а/я 152 Киммел, nол, Грин, Джон, Буллен, Стивен, Боуви, Роб, Розенберг, Роберт и др. К40 Excel 2003 и VВА. Справочник программиста.: Пер . с англ. - М.: Издатель- ский дом "Вильяме", 2006. - 1088 с.: ил. - Парал. тит. англ. ISBN 5-8459-0921-Х ( рус.) В данной книге рассматриваются вопросы проектирования и разработки приложе­ ний Excel с использованием встроенного языка VВА Начав с основ VВА, вы познакоми­ тесь с принципами автоматизации большинства вы п олняемых в Excel задач , а также с созданием надстроек, применением Windo~·s API, п рофессиональными приемами от­ ладки и обработки о шибок , использовани ем языка SQL для получения данных из внеш­ них источ ников и программным управлением други ми приложениями Office. В книге содержится множество примеров кода и , п ри н еобходимости, п риводятся ко пии экра­ нов. Все авторы являются признанными экспертам.и по разработке приложени й для Excel, и их советы окажугся полезны ка~' начинающим , так и опытным пользователям Excel, а также разработчи~<ам. ББК 32.973.26-018. 2. 75 Все названия программных продуh-тов являются зарегистрированными торговыми марками соот· ветствующих фирм. Никакая часть настоящего издания пи в каких целях не может быт1, воспроизведена в какой бы то ни было форме и какими бы то ни было средствам:и , будь то электронлые или механические, включая фото:копирование и зarrn п~ на маг1-1итFtьrй носитель, если на это нет пис1)менного разрешения изда­ тельства J O H N '.vJLEY&Soпs, Inc. Copy1:ight © 200() Ьу Dialektika Comptttel' PнЫishing . 01·igi..11al English laпgttage editioп Copy1·igl1t © 2004 Ьу Wiley PuЫ.isl:ri.ng, Iпс. All 1ights Iese1ved iпcluding tl1e гigl1t of 1·epгoduction iп \V l10le 01' iп part iп апу foгm . T h.i s u·aпslatioп is puЫished Ьу a1тangeme11t \Vitl1 W iley PttЫishiпg, Iпс. ISBN 5-8459-0921-Х (рус . ) ISBN 0-7()45-5()()0..() (англ.) © Компьютерное из11-во "Диалектика '', 2006, nepeno11, оформление, макетирование © Wiley PttЬlishiпg, Iпс., 2004
.Оглавление Введение 31 Глава 1. Пример и~пользощшия VВА в Excel 41 Глава 2. Программирование в редакторе VВЕ 103 Глава 3. Объект Application 115 Глава 4. Теория о'ISъектно-ориентированного программирования и VВА 129 Глава 5. Процедуры обработки событий 143 Глава 6. Модули классов 153 Глава 7. Создание надежного кода 167 Глава 8. Отладка и тестирование Глава 9. ДиаЛогоnые окна UserForm Глава 10. Добавление элементов управления . , Глава 11. Доступ к данным с помощью ADO Глава 12. Создание и использование надстроек Глав.а 13. Надстройки Automation и. .надстройки СОМ Глава 14.. Настройка редактора VВЕ Глава 15. Взаимодействие с др -~ч:ми приложениями Office Глава 16. Программирование с Ii~мощью Windows API Глава f7. Проблемы интернационализации Глава 18. Книги и листы Глава 19. Использование диапазонов Глава 20. Использование имен Глава 21. Работа со списками Глава 22. Сводные таблицы Глава 23. СпИ:ски с фильтрами Глава 24. Генерация диаграмм ~:лава 25. Файлы и папки Office " Глава 26. Командные панели Глава 27. Смарт-теги Глава 28. Excel и сеть lnternet Глава 29. ХМL и Excel Приложение А. Объектная модель Excel 2003 Приложение Б. Объектная модель VВЕ Приложение В. Объектная модель Office 2003 Предметный указатель • • 191 207 223 237 285 293 321 351 365 397 433 449 477 489 499 517 531 547 563 601 625 655 665 959 987 1074
'Г Содержание Введение Глава 1. Пример использования VВА в Excel Использование механизма записи макросов Запись макроса Личная книга макросов Запуск макросов Комбинации клавиш Абсолютная и относительная запись Редактор VBE Модули кода Процедуры Окно проекта Окно Свойства Другие методы запуска макросов Кнопки на листе Панель инструментов Формы Панель инструментов Control Toolbox Панели инструментов Процедуры обработки событий Удаление присоединенной панели инструментов Определенные пользователем функции Создание определенных_ пользователем функций Непосредственная ссылка на диапазоны Чего, не могут определенные пользователем функции Объектная модель Excel Объекты Коллекции Поля Свойства Методы События Получение справки Окно Object Browser Эксперименты в окне Immediate ЯзьiкVВА Базовый ввод и вывод Передача параметров по позиции, Передача параметров по имени Константы . ·, ." 31 41 42 42 45 46 • 46 47 49 50 50 51 51 52 52 52 53, 55 57 58 59 59 62 63 63 63 64 65 66 67 68 69 70 71 72 73 74 74 76
Возвращаемые значения Функция InputBox Вызов функций и подпрограмм Оператор Call ·. · Объявление переменных Оператор Option Explicit Область видимости и время жизни переtrенных Тип переменной Определение типа переменной Объявление функции и типы параметров Константы Соглашения по именованию переменных Объектные переменные Конструкция Witl1 ". End With Принятие решений Оператор If Блочный оператор If Оператор Select Case Циклы Цикл WЬile".Wend Цикл Do".Loop Цикл Fог". Next Цикл For Each " . Next Массивы Многомерные массивы Динамические массивы Обработка ошибок на этапе выполнения · Оператор 011 Еггоr Resшne Next Резюме Глава 2. Программирование в редакторе VВЕ Написание кода Программирование для людей Написание кода в редакторе VВЕ Куда делся мой код? Управление проектом Управление расположением элементов управления Добавление классов Модификация свойств Импорт и экспорт кода Visual Basic Редактирование Управление параметрами редактора Запуск и отладка кода Использование контрольных значений Содержание 7 76 77 78 79 79 79 81 82 84 84 84 85 85 86 87 87 88 89 90 91 91 93 95 95 97 98 99 101 102 103 103 104 105 105 106 ·107 108 109 110 111 111 112 112
8 Содержание Использование окна Просмотр объектов Резюме Глава 3. Объект Application Глобальные члены Свойства Active Вывод предупреждений Обновление экрана Оценка Метод InputBox Строка состояния Свойство SendKeys Метод OnTime Метод OnKey Функции листа Свойство Caller Резюме Глава 4. Теория объектн -ориентированного программирования и VВА Сравнение классов и интерфейсов Определение интерфейса Реализация интерфейса Определение методов Аргументы Передача аргументов по значению Передача аргументов· по ссылке Необязательные аргументы Реализация рекурсивных методов Отказ от рекурсии через использование циклов Определение полей Определение свойств Свойства только для чтения Свойства только для записи Определение событий Определение событий в классах Срздание· события Обработка событий Сокрытие информации и квалификаторы доступа Инкапсуляция, агрегация и ссылки Резюме 113 114 115 115 116 117 118 118 120 122 122 123 124 125 126 127 129 129 131 131 132 133 133 134 134 134 135 135 136 137 137 137 138 139 140 140 141 142
1 1 \ 1 Содержание 9 Глава 5. Процедуры обработки событий 143 События листа 144 Включение событий 145 Событие Wo1·ksheet Calculate 145 События диаграммы 146 Событие Bef~гeDouЬ!eC!ick 147 События книги 149 Coxpai;eюie изменений 150 Верхние и нижние колонтитулы 151 Резюме 152 Глава 6..Модули классов 153 Создание собственных объектов 154 Использование коллекций Коллекция в модуле класса Перехват событий приложения Встроенные собьiтия диаграмм Коллекция элементов управления UserFoгm Ссылки на классы из других проектов Резюме Глава 7. Создание надежного кода Использование метода Debug.Pгint Использование метода Debug.Asseгt Краткая история отладки на ПК 1 Создание многоразовых инструментов на основе объекта Debug Определени,е последовательности выполнения Получение маршрута выполнения кода Проверка инвариантных условий Вывод сообщений об ошибках Создание обработчиков ошибок О,ператор On Епог GoTo Оператор On' Епог Resume Next Оператор On Епог GoTo О Использование объекта Еп Создание обвязки Запись в журнал событий Резюме / Глава 8. Отладка и тестирование Пошаговое выполнение кода Выполнение кода '•· 155 156 158 160 161 163 165 167 168 169 170 173 173 176 178 181 183 183 184 186 186 186 188 190 191 192 192
10 Содержание Шаг с заходом 193 Шаг с обходом 194 Шаг с выходом 194 Выполнить до текущей позиции 194 Следующая инструкция 195 Отобразить следующую инструкцию 195 Использование точек останова 195 Использование контрольных значений 196 Добавление ко~трольного значения 196 Изменение контрольного значения 198 К<0нтрольное значение 199 Окно Локальные переменные 199 Тестирование выражения в окне Проверка 200 Источники получения информации об определениях 200 Команда Краткие сведения 200 Команда Сведения о параметре 202 Команда Завершить слово 202 Команда Список свойств/методов 202 Команда Список констант 202 Команда Закладка 202 Команда Описания 203 Команда Просмотр объектов 203 Просмотр стека вызовов 204 Проверка инвариантных предположений 205 Резюме 205 Глава 9. Диалоговые окна UserForm 207 Отображение диалогового окна UserForm 207 Создание диалогового окна UserForm 209 Непосредственный доступ к элементам управления диалогового окна 211 Отключение кнопки Закрыть 215 Поддержка списка данных 215 Немодальные диалоговые окна UserForm 221 Резюме 221 Глава 10. Добавление элементов управления 223 Панели инструментов 223 Элементы управления ActiveX 224 · Полоса прокрутки 225 Счетчик 226 Флажок · 227 Переключатель 227 Элементы управления с панели Формы (Forms) 228
Содержание 11 Динамические элементы управления ActiveX 232 Элементы управления, встроенные в диаграмму 235 Резюме 236 Глава 11. Доступ к данным с помощью ADO 237 Введение в структурированный язык запросов 238 Оператор SELECT 239 Оператор INSERT 240 Оператор UPDATE 241 Оператор CREATE ТАВLЕ 242 Оператор DROP TABLE 243. Обзор технологии ADO 243 Объект Connection 244 Свойства объекта Coпnection 245 Методы объекта Coпnection 247 События объекта Con11ectio11 и асинхронное программирование 250 Коллекции объекта Connectioп 252 Объект Recordset 253 Свойства объекта Recordset 253 Методы объекта Recoгdset 254 События объекта Recoгdset 257 Коллекции объекта Recoгdset , 257 Объект Command 258 Свойства объекта Сошшапd 259 Методы объекта Сошш апd 260 Коллекции объекта Сошшапd 262 Использование ADO в приложениях Microsoft Excel 262 Использование библиотеки ADO вместе с Micгosoft Access 263 Подключение к Microsoft Access 263 Получение данных из базы .данных Micгosoft Access с помощью простого запроса Получение данных из Micгosoft Access с помощью хранимого запроса Вставка, обновление и удаление записей в базе данных Microsoft Access с помощью простого текстового запроса SQL Использование ADO вместе с Microsoft SQL Se1-ver Подключение к Micгosoft SQL Se1-veг Хранимые процедуры Micгosoft SQL Server Несколько наборов записей Отключенные наборы записей Использование библиотеки ADO для доступа к нестандартным источникам данных Запрос к книгам Micгosoft Excel Вставка и обновление записей в книгах Micгosoft Excel Запросы для текстовых файлов Резюме 264 266 267 270 270 272 276 277 280 280 283 283 284
12 Содержание Глава 12. Создание и использование надстроек 285 Сокрытие кода 286 Преобразование книги в надстройку 287 Закрытие надстройки 289 Изменение кода 289 Сохранение изменений 290 Установка надстройки 290 Событие установ~и надстройки 291 Удаление надстройки из списка надстроек 292 Резюме 292 Глава 13. Надстройки Automation и надстройки СОМ 293 Надстройки Automation 293 Создание простой надстройки 294 Регистрация надстроек Automation в Excel 295 Регистрация через пользовательский интерфейс Excel 295 Создание ссылки на надстройку из кода VBA 295 Добавление надстройки посредством редактирования системного реестра 296 Использование надстроек Automation 298 Вызов функции из листа Excel 298 Вызов надстройки из кода VBA 299 Введение в интерфейс IDTExtensibility2 299 Надстройка Complex - генерация уникального случайного числа 302 Изменение порядка случайных чисел 305 Надстройки СОМ 308 Продолжение обзора интерфейса IDTExtensibility2 308 Регистрация надстройки СОМ в Exce l 309 Конструктор надстроек СОМ 311 Подключение к Excel 312 Использование надстройки СОМ из кода VВА 316 Связывание с несколькими приложениями Office 317 Резюме 319 Глава 14. Настройка редактора VВЕ 321 Идентификация объектов редактора VВЕ 322 Объект VВЕ 322 Объект VВPгoject 322 Объект VВComponent 323 Объект CodeModule 324 Объект CodePane 324 Объект Designeг 324 Начинаем 325 Добавление пунктов меню в редакторе VВЕ 326
Содержание 13 Создание меню на основе таблиц 328 Вывод встроенных диалоговых окон, диалоговых окон UserForm и окон сообщений 335 Работа с кодом 340 Работа с диалоговыми окнами UserForm 344 Работа со ссылками 348 Резюме 350 Глава 15. Взаимодействие с другими приложениями Office 351 Установка подключения 352 Позднее связывание 352 Раннее связывание 354 Открытие документа в Word 356 Доступ к активному документу Woгd 357 Создание нового документа Word 357 В~аимодействие с Access через библиотеку DAO 358 Взаимодействие Access, Excel и O~tlook · 359 Когда вирус не является вирусом? 361 Резюме 362 Глава 16. Программирование с помощью Windows API 365 Анатомия вызова программного интерфейса приложений 366 Интерпретация объЯвлений в стиле С 3q7 Константы, структуры, обработчики и классы 370 Что делать, если что-то пошло не так? 373 Сокрытие вызовов API в модулях классов 374 Примеры классов 378 Класс таймера высокого разрешения 379 Модуль класса Higl1ResTiшeг 379 Замораживание диалогового окна UseгFoi-m 380 Модуль класса FгееzеFогш 380 Класс информации о системе 382 Получение разрешения экрана (в пикселях) 382 Получение глубины цвета (в битах) 382 Получ ение ширины пикселя в координатах диалогового окна UsегFогш 383 Получение регистрационного идентификатора пользователя 383 Получение имени компьютера . 383 Модификация стилей диалоговых окон UseгFoгm 384 Свойства окон 384 Класс FoгшCl1anger 38р Диалоговые окна UseгFoгm переменного размера 387 Абсолютные изменения 388 Относительные изменения 389
111 Содержание Класс FormResizeг 389 Использование класса FoгmResizer 393 Другие примеры 394 Изменение пиктограммы Excel 394 Воспроизведение файла .wav 395 Резюме 395 Глава 17. Пробдемы интернационализации 397 Изменение региональных параметров Windows· и языка пользовательского интерфейса Office ХР 398 Обработка региональных параметров и языка интерфейса Windows 398 Идентификация региональных параметров пользователя и языковой версии Windows 399 Функции преобразования VВА с точки зрения интернационализации 399 Неявное преобразование 399 Строки с датами 401 Функции IsNнmeгic и IsDate 401 Функция CStг 402 Функции СDЫ, CSng, CLng, Clпt, CByte, ССш и CDec 402 Функции CDate и DateValнe 402 Функция CBool 402 Функция Format 402 Функции FormatCuгreпcy, FoгmatDateTime, FormatNomber и FormatPeгceпt 403 Функция Str 403 Функция Val 404 Функция Applicatioп.Evaluate 405 Взаимодействие с Excel 405 Отправка данных в Excel 406 Чтение данных из Excel 408 Правила работы с Excel 409 Взаимодействие с пользователями 410 Размер бумаги 410 Вывод данных 410 Интерпретация данных 411 Свойства xxxLocal 411 Правила работы с пользователями 412 Возможности интернационализации в Excel 2003 413 Возможности, не следующие общим правилам 415 Использование функции ОрепТехt 416 Функция SaveAs 417 Подпрограмма Sl10wDataForm 418 Подпрограмма RunMeпu 418 Вставка текста 419 Вычисляемые поля и элементы сводной таблицы, а также формулы· условного форматирования 419
Содержание 15 WеЬ-запросы 420 Использование функции листа ТЕХТ 420 Свойства Raпge.Value и Raпge.FormulaAггay 421 Метод Raпge .AutoFilteг 421 Метод Raпge .AdvaпcedFilter 422 Использование функций Applicatioп . Evaluate, Applicatioп.CoпveгtFoгmula и Applicatioп.ExecuteExcel4Macгo 422 Обработка языковых параметров Office ХР 422 Откуда извлекается текст? 423 Хранилище региональных параметров 423 Языковые параметры пользовательского интерфейса Office 423 Языковая версия Wi пdows 424 Идентификация языковых параметров пользовательского интерфейса Office 424 Создание многоязыковых приложений 425 Рекомендуемый подход 425 Как хранятся строковые ресурсы 426 Работа в многоязыковой среде 427 Оставляйте свободное место 427 Использование объектов Excel 427 Использование функции SeпdKeys 428 Правила разработки м1-~:огоязыковых приложений 429 Полезные функции 429 Реализация функции WinToNum · 429 Реализация функции WinToDate 430 Реализация функции FoгmatDate 431 Реализация функции ReplaceHoldeгs 431 Резюме 432 Глава 18. Книги и листы 433 Использование коллекции Workbooks , 433 Создание книги 433 Сохранение активной книги 434 Активизация книги 434 Получение имени файла из полного пути 435 Файлы в том же каталоге 437 Перезапись существующей книги 437- Сохранение изменений 439 Коллекция Sheets 439 Листы 440 Методы Сору и Move 441 Группирование листов 443 Объект Window 444 Синхронизация листов 445 Резюме 447
16 Содержание Глава 19. Использование диапазонов Методы Activate_и Select Свойство Range Сокращенные ссылки на диапазоны Диапазоны на неактивных листах Свойство Range объекта Range Свойство Cells Использование свойства Cells в качестве параметра свойства Range Диапазоны на неактивных листах Дополнительная информация о свойстве Cells объекта Range Ссылка на диапазон с единственным п~раметром Свойство Offset Свойство Resize Метод SpecialCells Поиск последней ячейки Удаление чисел Свойство CuгrentRegion Свойство End Получение ссылки на диапаз~ны через свойство End Суммирование диапазона Свойства Columns и Rows Области Методы Union и Intersect Пустые ячейки Копирование значений между массивами и диапазонами Удаление строк Резюме Глава 20. Использование имен Именование диапазонов Использование свойства N ame объекта Range Специальные имена Хранение значений в именах Хранение массивов Сокрытие имен Работа с именованными диапазонами Поиск имени Поиск имени диапазона Определение имен, пересекающих диапазон Резюме 449 449 451 451 452 452 453 454 454 455 456 457 458 460 460 462 462 464 465 465 466 467 469 469 471 473 475 477 478 479 479 480 481 482 482 483 485 486 488
Содержание 17 Глава 21. Работа со списками 489 Создание списка 489 Сокращенные команды для списков 490 Сортировка и фильтрация списка 490 Создание диалогового окна UseгFoгm на основе списка 491 Изменение размера списков 492 Перетаскивание маркера изменения размера в нижнем углу списка 492 Суммы столбцов 492 Преобразование списка в диапазон 493 Публикация списков 493 Публикация списка 495 Внесение изменений в список 495 Просмотр списка на сервере SharePoint 496 Удаление списка 497 Резюме 497 Глава 22. Сводные таблицы 499 Создание отчета для сводной таблицы 500 Колле.кция PivotCaches 502 Коллекция PivotTaЬles 503 Коллекция PivotFields 503 Коллекция CalculatedFields 506 Коллекция Pivotitems 508 Группирование 508 Свойство VisiЬ!e 511 Коллекция Calculateditems 512 Сводные диаграммы 512 Внешние источники данных 514 Резюме 515 Глава 23. Списки с фильтрами 517 Структурирование данных 517 Команда Форма 518 Автофильтр 519 Пользовательский Автофильтр 520 Добавление. раскрывающихся списков 520 Получение точной даты 523 ·Копирование видимых строк 524 Поиск видимых строк 525 Расширенный фильтр 527 Резюме 529
18 Содержание Глава 24. Генерация диаrрамм Листы диаграмм Записанный макрос Добавление : 111 ста диаграммы с помощью кода VВА Встроенные диаграммы Использование механизма записи макросов Добавление встроенной диаграммы с помощью кода VВА Редактирование рядов данных Определение рядов диаграммы с помощью массивов Преобразование диаграммы для использования массивов Определение использованных в диаграмме диапазонов Метки диаграмм Резюме Глава 25. Файлы и папки Office Объект FileSeaгcl1 Свойство FoundFiles Свойство PгopertyTests Коллекция FileTypes Коллекция Seaгcl1Scopes Свойство ScopeFoldeг Коллекция SearchFoldeгs Объект FileDialog Коллекция FileDialogFilters Коллекция FileDialogSelectedltems Типы диалоговых окон Метод Execute Свойство MultiSelect Резюме Глава 26..Командные панели Панели инструментов, панели меню и всплывающие меню Встроенные командные панели Excel Элементы управления любого уровня вложенности Идентификаторы Faceld Создание новых меню Макрос OnAction Передача значений параметров Удаление меню Создание панели инструментов Контекстные меню Отображение всплывающих командных панелей 531 532 532 533 534 535 535 536 540 542 543 544 546 547 548 550 551 552 553 554 555 557 559 559 559 559 560 561 563 563 566 569 572 574 575 576 577 578 582 585
Отключение командных панелей Отключение комбинации клавиш для доступа к диалоговому окну Настройка Создание командных панелей на основе таблиц Резюме Глава 27. Смарт-теги Улучшения в механизме смарт-тегов Библиотека типов Micгosoft SmaгtTags 2.0 Смарт-тег FileName Структура объекта SmartTag Уникальный идентификатор смарт-тега Класс Recognizeг Класс Actions Реализация возможностей объектов SmartTag -в-Office 2003 Регистрация смарт-тега Использование смарт-тега FileName Управление смарт-тегами из кода VВА Проверка активности класса распознавания Удаление смарт-тега из диапазона Добавление смарт-тега в диапазон Проблемы, связанные с использованием смарт-тегов Метод Recognize Покрытие Резюме Глава 28. Excel и сеть Internet Что за ажиотаж? / Использован~е сети Internet для хранения книг Использование сети Internet в качестве источника данных Открытие WеЬ-страниц в качестве книг Использование WеЬ-запросов Разбор WеЬ-страницы для получения конкретной информации Использование сети Inteгnet для публикации результатов Настройка WеЬ-сервера Сохранение листов в виде WеЬ-страниц Добавление интерактивности с по~ощью WеЬ-компонентов Использование сети Internet в качестве канала связи Связь с WеЬ-сервером Передача данных от клиента к серве рному приложению Передача данных от серверного приложения к клиенту Приложение WеЬ-сервера - запись журнала ошибок База данных Access для хранения журнала ошибок Содержание 19 587 588 589 599 601 603 603 604 605 .60 5 607 610 616 618 620 621 ()21 622 622 623 623 624 624 625 626 626 627 627 628 631 633 633 634 634 636 636 637 637 637 638
20 Содержание Виртуальные каталоги Страница ASP, записывающая данные в журнал ошибок Страница ASP для просмотра журнала ошибок XML СловариХМL Схема XML-SS Использование XSLТ для преобразования XML Резюме Глава 29. ХМL и Excel Что такое XML? Что такое XSD? Что такое XMLSS? Импорт данных в формате XML BlackJack: гибкость данных Импорт файла XML Что такое XSL и XSLТ? Экспорт листа в файл XML Резюме Приложение А. Объектная модель Excel 2003 Общие свойства коллекций и связанных с ними объектов Общие свойства коллекций Общие свойства объектов Объекты Excel, их свойства, методы и события Объект Addin и коллекция Addins Общие свойства объе~тов Addin Объект Adjustments Объект AllowEditRange и коллекция AllowEditRanges Объект Application Коллекция Агеаs Объект AutoCoпect Объект AutoFilter Объект AutoRecover Объект Axis и коллекция Axes Объект AxisTitle Объект Boгder и коллекция Boгde1·s Коллекция CalculatedFields Коллекция Caleulatedltems Объект CalculatedMembeг и коллекция CalculatedMembeгs Объект CalloutFormat Объект Cel!Fo1·mat Объект Chaгacteгs Объект Chart и коллекция Chaгts 638 639 641 645 646 647 650 653 655 655 656 658 658 659 661 661 663 664 665 665 665 666 666 666 666 667 668 670 691 693 694 696 697 700 702 703 704 704 706 707 710 711
Содержание 21 Объект ChartAгea 723 Объект ChaгtColoгFoгmat 725 Объект ChaгtFillF01-mat 725 Объект ChaгtGгoup и коллекция CliaгtGгoups 727 Объект Cl1aгtObject и коллекция ChaгtObjects 730 Объект ChaгtTitle 735 Объект ColoгFoгmat 736 Объект Comment и коллекция Comments 737 Объект ConnectoгFoгmat 738 Объект ContгolFoгmat 740 Объект Согnегs Объект CubeField и коллекция CubeFields Объект CustomP1·opeнy и коллекция CustomPгopeгties Объект CustomView и коллекция CustomViews Объект DataLabel и коллекция DataLabels Объе.кт DataTaЫe Объект DefaultWebOptions Объект Diagгam Объект DiagгamNode и коллекция DiagгamNodes Объект DiagramNodeChildгen Объект Dialog и коллекция Dialogs Объект DisplayUnitLabel Объект DownBaгs Объект DгopLines Объект Епог и коллекция Епогs Объект ЕпогВагs Коллекция Eпo1·CheckingOptions Объект FillFoгmat Объект Filteг и коллекция Filteгs Объект Flooг Объект Font Объект FoгmatCondition и коллекция FormatConditions Объект FгeefoгmBuildeг Объект Gгaphi'c Объект Gгidlines Коллекция GгoupShapes Объект HiLoLines Объект HPageBгeak и коллекция HPageBгeaks Объект Hypeгlink и коллекция Hypeгlinks Объект Inteгio1· Объект IRtdSet-veг Объект IRTDUpdateEvent Объект LeaderLines Объект Legend 1 742 743 745 747 748 752 753 755 758 760 760 761 763 763 764 765 766 768 770 771 772 773 775 776 778 779 779 780 781 783 784 785 786 786
22 Содержание Объект LegendEntгy и коллекция LegendEntгies Объект LegendKey Объект LineFoгmat Объект LinkF01-mat Объект ListColumn Объект ListDataFoгmat Объект ListObject Объект ListRow Объект Maileг Объект Name и коллекция Names Объект ОDВСЕпо1· и коллекция ODBCEгi·oгs Объект ОLЕDВЕпи и коллекция OLEDBEпors Объект OLEFoгmat . ' Объект OLEObject и коллекция OLEObjects Объект Outline Объект PageSetup Объект Pane и коллекция Panes Объект Рагаmеtег и коллекция Pai·ameteгs Объект Phonetic и коллекция Phonetics Объект PictшeFoгmat Объект PivotCache и коллекция PivotCaches Объект PivotCell Объект PivotField, коллекция PivotFields и коллекция CalculatedFields Объект PivotFoгmula и коллекция PivotFoгmulas Объект Pivotltem, коллекция Pivotitems и коллекция Calculatedltems Объект PivotltemList Объект PivotLayout . Объект PivotTaЫe и к9ллекция PivotTaЫes Объект PlotAJ:ea Объект Point и коллекция Points Объект Protection Объект PuЫishObject и коллекция PuЫishObjects Объект QuегуТаЫе и коллекция QueгyTaЫes Объект Range Объект RecentFile и коллекция RecentFiles Объект RoutingSlip ОбъектRТD Объект Sc enai·io и коллекция Sc enarios Объект Seгies и коллекция SeriesCollection Объект Se1·iesLines Объект ShadowF01·mat Объект Shape и коллекция Shapes Объект ShapeNode и коллекция ShapeNodes Коллекция Sl1apeRange 788 789 791 792 793 793 794 795 795 796 798 799 00 801 805 806 809 810 812 813 814 817 818 823 823 825 826 827 835 837 839 841 843 847 860 861 862 863 864 869 869 870 875 877
Содержание 23 ~оллекция Sheets 880 Объект SmartTag и коллекция SmartTags 882 Объект Smai·tТagAction и коллекция SmartTagActions 883 Коллекция SmaгtTagOptions 884 Объект Smai·tTagRecongnizer и коллекция SmaгtTagRecongnizers 884 Объект SoundNote 885 Объект Speech 885 Коллекция SpellingOptions 886 Объект Style и коллекция Styles 887 Объект ТаЬ 889 Объект TextEffectFormiit 890 Объект TextFгame 891 Объект ThreeDFoгmat 892 · Объект TickLabels 894 Объект TгeeviewConti·ol 895 Объект Trendline и коллекция Trendlines 895 Объект U pBars 897 Коллекция UsedObjects 898 Коллекция UserAccess 898 Коллекция Use1AccessList 899 Объект Validation 900 Объект VPageBгeak и коллекция VPageBгeaks 902 • Объект Walls 903 Объект Watch и коллекция Watches 904 Объект WebOptions 905 Объект Window и коллекция Windows - 906 Объект Workbook и коллекция Woгkbooks 911 Объект Woгksheet и коллекция Woгksheets 925 Объект WorksheetFunction 934 Объект XmlDataBinding 956 Объект XmlMap 957 Приложение Б. Объектная модель VВЕ 959 Связь между объектной моделью Excel и объектно й моделью VBE 960 Общие свойс~а и методы 960 Объект Addln и коллекция Addlns 961 Общие свойства объекта Addln 961 Свойства объекта Addln 962 Методы коллекции Addlns 962 Примеры использования надстроек 962 Объект CodeModule 963 Общие свойства объекта CodeModule 963 Свойства объекта CodeModule 964 Методы объекта CodeModule 965
24 Содержание Пример использования объекта CodeModule Объект CodePane и коллекция CodePanes Общие свойства объекта CodePane Свойства объекта CodePane Методы CodePane Свойства коллекции CodePanes Примеры использования объекта CodePane Объект CommandBaгEvents События объекта CommandBaгEvents Примеры использования объекта CommandBarEvents Объект Events Свойства объекта Events Примеры использования объекта Events Коллекция LinkedWindows Методы коллекции LinkedWindows Объект Ргорегtу и коллекция Pгopeгties Общие свойства объекта Р1·орегtу Свойства объекта Property Примеры использования объекта Propeгty Объект Refeгence и коллекция Refeгences Общие свойства объекта Refeгence Свойства объекта Reference Методы коллекции Refeгences События коллекции Refeгences Примеры использования объекта Reference Объект RefeгencesEvents События объекта RefeгencesEvents Примеры использования объекта RefeгencesEvents Объект VВComponent и коллекция VBComponents Общие свойств а объекта VBComponent Свойства объекта VВComponent Методы объекта VВComponent Методы коллекции VBComponent Примеры использования объекта VВComponent ОбъектVВЕ Свойства объекта VВЕ Примеры использования объекта VВЕ Объект VВPгoject и коллекция VВProjects Общие свойства объекта VBPгoject Свойства объекта VВPгoject Методы объекта VВPгoject Методы коллекции VBProjects Примеры использования объектов VBProject - / --. - -9 969 970 9;:. g;: о;_ 9;_ 97: 9; 0;2 912 9;3 9/3 9/3 97-± 974 974 976 977 977 977 978 978 979 979 979 980 980 981 981 981 982 983 983 983
Объект Window и коллекция Windows Общие свойства объекта Window Свойства объекта Window Методы объекта Window Методы коллекции Windows Примеры использования объекта Window Приложение В. Объектная модель Office 2003 Общие свойства коллекций и связанных с ними объектов Общие свойства коллекций Общие свойства объектов Объекты пакета Office, их свойства и собь\тия Объект AnsweгWizaгd Коллекция AnsweгWizaгdFiles Объект Assistant Объект Balloon КоллекцИя BalloonCheckBoxes Объект BalloonCheckBox Коллекция BalloonLabels Объект BalloonLabel Коллекция COМAddins Объект COМAddin Коллекция CommandBaгs Объект CommandBaг Объект CommandBaгButton Объект CommandBaгComboBox Коллекция CommandBaгContгols Объект CommandBaгContгol Объект CommandBaгPopup Объект DocumentLibгaгyVeгsion Коллекция DocumentLibгaгyVersions Коллекция DocumentProperties - Объект DocumentPгopeгty Объект FileDialog Коллекция FileDialogFilteгs Объект FileDialogFilte1- Koллeкция FileDialogSelectedltems Объект FileSearch Коллекция fileTypes Об-рект FoundFiles Объект HTMLPгoject Коллекция HTMLPгojectltems Объект HTMLPгojectltem Объект LanguageSettings Содержание 25 984 984 984 985 985 985 987 987 987 988 988 988 989 990 994 995 996 996 996 998 999 1000 1002 1005 1009 1014 1015 1019 1023 1024 1024 1026 1028 1031 1032 1033 1036 1038 1039 1039 1042 1042 1043
26 Содержание Объект MsoEnvelope Объект NewFile Коллекция ODSOColumns Объект ODSOColumn Коллекция ODSOFilteгs Объект ODSOFilteг Объект OfficeDataSouгceObject Объект Peгmission Коллекция Pгope1·tyTests Объект PгopeгtyTest Коллекция ScopeFoldeгs Объект ScopeFoldeг Коллекция Sci-ipts Объект Scгipt Коллекция SearchFolde1·s Коллекция Seaгch$copes Объект Seai·chScope Объект ShaгedWoгkspace Объект SharedWorkspaceFile Объект SharedWorkspaceFoldeг Объект ShaгedWorkspaceLink Объект Sha1·edWorkspaceMember Коллекция Sha1·edWoгkspaceMembers Объект ShaгedWoгkspaceTask Коллекция SharedWorkspateTasks Объект Signatuгe Коллекция SigпatureSet Объект SmartDocument ОбъектSуnс Объект UserPermission Коллекция WebPageFonts Объект WebPageFont Предметный указатель : 052 : .53 :с -~ :51 ~с- : с59 ~ 060 Об: 062 :063 063 1064 1065 1065 1065 1066 1066 1067 1069 1069 1070 1070 1071 1074
Об авторах Пол Киммел В 1990 году Пол Ки~шел (Paul Kimmel) основал компанию Softwaгe Conceptions, Inc . и с тех пор занимался проектированием и созданием программного обеспечения, а также писал книги на компьютерную тематику . Он является автором нескольких книг, посвя­ щенных VВА, VB, VВ . NET, С#, De l phi и С++, кроме этого, раз в два месяца пишет статьи в колонку VВ Today на сайте www. codeguru . сот и часто публикуется в периодических и сетевых изданиях, включая www. I nforтi Т. сот. С Полом Киммелом можно связаться по электронной почте по aдpecypk immel@softconcepts. сот. Стивен Буллен Стивен Буллен (Stephen Bullen) живет в Карлоу, Ирландия, и в Лондоне, Англия. Рабо­ тает в собственной компании Business Modelling So l utions, Ltd. с 1997' года, специализиру­ ясь на разработках и консультациях по Excel . Стивен имеет опыт сотрудничества с круп­ нейшими мировыми компаниями . На сайте компании BMS по aдpecywww. BMSLtd. со . uk доступно большое количество его разработок, включая инструменты и утилиты для расши­ рения функциональности Excel и множество примеров разработки приложений для Ехсе! . Значительную часть своего свободного времени Стивен уделяет поддержке других пользователей Excel, отвечая на вопросы на форуме CompuSeгve , посвященном Excel , и в Intегnеt-конференциях компании Micгosoft. Признавая его вклад и учитывая уровень знаний, начиная с 1996 года компания Micгosoft ежегодно награждает Стивена званием Most ValuaЫe Pгofessional. Стивен написал бщrьшую часть последних глав в книге Excel 2000 VBA Programmeт's Refeтence и Excel 2002 VВА Pтograrnmer's Refeтence. Переработанные и обновленные Полом Киммелом фрагменты этих книг были интегрированы в настоящее издание . Стивен не при­ нимал непосредственного участия в работе над этой книгой. Джон Грин Джон Грин Qohn Gгeen) живет в Сиднее, Австралия, и работает независимым кон­ сультантом, специализируясь на Ехсе] и Access. Имея 30-летний опыт работы с компью­ терами, диплом инженера по химии и степень бакалавра, он применяет свои разносто­ ронние знания в работе . Джон ведет тренинги по приложениям и операционным систе-
мам как в Австралии, так и за ее пределами. Начиная с 1995 года компания Micгosoft еже­ годно награждает Джона званием Most ValuaЬ!e Professional. Джон бьт основным автором книг Excel 2000 VBA Prograrnrner's R.eferenceи Excel 2002 VВА Progгa:mrner·'s R.eference. Его материал был использован Полом Киммелом при созд аmш этой книги . Джон не принимал непосредственного участия в работе над ней. Роб Боуви Роб Боуви (Rob Bovey) разрабатывает программное обеспечение и специализпруется на приложениях для Micгosoft Office , Visual Basic и SQL Sегvег. Он является осн овате..1б1 и президентом компании Application Pгofessionals, занимающейся разработкой п р1ыоже­ ний. Роб разработал несколько надстроек, которые распространяются компанией :\licro- soft в составе пакета Excel . Кроме этого, Роб являлся соавтором пакета Micгosoft Excel 97 Developeг' s Kit. Начиная с 1995 года компания Micгosoft ежегодно награждает Р оба зва­ нием Most ValuaЬ!e Pгofessional . Роб является автором главы о доступе к данны ~1 через ADO в книге E xcel 2002 VВА Prograrnrner's R.eference, но непосредственного участия в созда­ нии этой книги он не принимал . Роберт Розенберг Роберт Розенберг (Robeгt Rosenbeгg) работает в собственной консалтинговой ко~mа­ нии, специализирующейся на предоставлении решений и обучении работе с продукта: ш Micгosoft Office. Среди его клиентов можно заметить компании , входящие в спис ок For- tune 500. Как обладатель звания Most ValuaЬ!e Pгofessional в области Excel он постоянно оказывает расширенную интерактивную поддержку пользователям Excel от лица ко~1 па­ нии Micгosoft в ее Intегnеt-конференциях. Роберт отвечал за обновление предметных указателей по Ехсе] и Office для редакции книги 2002 -го года. Это также касается о бнов­ ления кода примеров и листингов для существующих объектов VBA, листингов опи сания новых объектов, методов , свойств и аргументов, а также примеров кода. Брайан Паттерсон . (соавтор) На данный момент Брайан Паттерсон (Bгian Patteгson) работает в компании Illinois Mutual Life в качестве координатора разработки программного обеспечения, уделяя ос­ новное внимание использованию С# в WinForms и корпоративному Inteгnet -caйтy. Бр ай­ ан написал множество статей с 1994 года. Он также является соавтором нескольких кн иг , посвященных технологии .NET, включая "Migгating to Visual Basic.NET" и " .NET En teг­ prise Development with VВ.NET ". Обычно его можно найти в MSDN Newsgгoups или в ме­ сте с женой и тремя детьми. С Брайаном можно связаться по электронной почте по адре­ су bdpatterson@illinoisrnutual. corn.
Благодарности Пол КИммел Я хотел бы поблагодарить хорошего друга и редактора Шерон Кокс (Shaгon Сох), а также Кэти Мор (Katie Моlн) и Адаоби Оби Тултон (Adaobi Obi Tulton) из издатель­ ства Wi ley. Без них и Дэвида Фьюгейта (David Fugate) (моего агента из компании Wateг­ side), а также всех авторов книги я не смог бы работать над этим проектом. Работа с профессионалами из издательства Wiley доставила мне настоящее удовольствие. Работая над этим проектом, я одновременно принял участие в ·проекте по С# в компа­ нии Pitney Bowes. Особая благодарность Эдварду Ронга (Edwaгd Ronga), проявившему себя в качестве отличного менеджера; он совершал чудеса вместе с инженерами, которые иногда вели себя неадекватно. В компании Pitney мне довелось работать с такими людь­ ми, как Леонард Бертелли (Leonaгd Beгte lli ), Джей Фуско Qay Fusco), Энцо Маини (Enzo Maini), Питер Гомис (Реtег Gomis), Кип Стробл (Kip St1·0Ыe), Карл Далзелл (Сагl Dal ze ll ), Дебра Алберти (DеЬга Albeгti), СанЖей Гулати (Sanjay Gulati) и мой сосед по комнате Чарльз Хейли (я слушал Нору Джоне четыре месяца , и Чарльз ни разу не пожа­ ловался). Я стараюсь все оставлять в лучшем состоянии, чем нашел, и мне всегда в этом помогают новые хорошие взаимоотношения. Хочу поздравить с Новым годом всех новых и старых друзей. Эрик Коттер (Егiс Cot- te1·) обладает более острым умом и большим энтузиазмом, чем все, кого я знаю, а Роберт Голиб (Robe1·t Golieb) всегда готов к действию и является тем человеком, которого мне приятно называть другом. Хочу передать привет знакомым в заведении Порки в Шелто­ не, штат Коннектикут, воспоминания о которых всегда ассоциируются с теплым прие­ мом, отличными куриными крылышками и алкогольными напитками. Самую большую благодарность я хочу выразить своей семье. Моя жена Лори всегда была для меня опорой и вдохновением. Еще мне повезло, что я имею четырех здоровых и красивых детей (Тревора, Дугласа, Алекса и Ноа). Больше всего я желаю , чтобы все мои знакомые имели благословение в виде любимой здоровой семьи. • Стивен Буллен Я хотел бы начать раздачу благодарностей с покупателей книги Excel 2002 VВА Programmer's &ference, а также читателей, отправнвших предложения и поздравления с выходом этого издания по электроf!НОЙ почте . Именно ваша поддержка позволила про­ вести обновление книги до версии Excel 2002. Кроме этого, я хотел бы поблагодарить 'Джона Грина а ohn Gгeen) за ТО, ЧТО он согласился выступить соавтором нового издания, Роба Боуви (Rob Bovey) за главу, посвященную ADO, и Роберта Розенберга (Robeгt Ro- senbeгg) за работу над разделом справочника. Как всегда, сотрудники издательства Wгох Press и технические редакторы просто совершили чудо. Именно их вклад сделал возмож­ ным создание этой отличной книги.
Со своей стороны я хотел бы посвятить главы специалистам-офтальмологам, докто­ рам и медсестрам в Temple Street Childгen's Hospital в Дублине за то, что они помоглИ справиться Джейн с опухолью, а также всем членам команды Ford PгoPrima за их дружбу и поддержку в течение последнего года. Роб Боуви Я хотел бы поблагодарить свою жену Мишель за то, что она мирилась с моими ком­ пьютерными привычками, и свою с~баку Харли за согреваемые во время работы ноги. Роберт Розенберг Я хотел бы поблагодарить Джона Грина, Стивена Буллена и Роба Боуви за то, что ме­ ня пригласили в один проект с тремя самыми значительными специалистами по Excel на данный момент. Этот вызов был для меня честью . Особую благодарность хотелось бы выразить Робу Боуви, моему учителю, который все­ гда помогал мне, отвечал на все вопросы , учил множеству приемов и предоставил в озмож­ ность поучаствовать в создании этой книги; а также моему лучшему другу и брату Эллиоту, который прошел со мной огонь и воду; и наконец , маме и папе за бесконечную· любовь.
Введение Впервые программа Excel появилась на платформе Macintosh в 1985 году и никогда не теряла место самого популярного приложения электронных таблиц в среде Macintosh. В 1987 году она была перенесена на ПК для работы под управлением операционной сис­ темы Windows. Вытеснение с рынка Lotus 1-2 -3 (одна из наиболее успешных программ­ ных систем в истории персональных компьютеров на тот момент) заняло много лет. До появления Платформы IBM РС существовало несколько популярных приложений электроllных таблиц. Это бьши VisiCalc, Quattгo Рт и Multiplan. Все началось с VisiCalc, но этот продукт оказался на"обочине достаточно рано. Multiplan выпускался компаНией Micгosoft до выхода Excel. В этом продукте для адресации ячеек использовался формат RlCl, который до сих пор доступен в Excel. Но именно Lotus 1-2-3 вырвался на вершину славы сразу после выхода в 1982 году и стал доминировать на рынке приложений электронных таблиц для ПК. / Ранние форм .ы макросов для электронных таблиц Пакет 1-2 -3 был первым приложением электронных таблиц, в котором предоставля­ лась возможность использования электронных таблиц, диаграмм и механизмов баз дан­ ных в пределах одного пакета. Но основной причиной успеха являлась возможность соз­ дания и использования макросов. Существует легенда, что разработчики создали макро­ сы в качестве инструмента отладки и тестирования продукта. Считается, что потенциал макросов был оценен ·в последний момент и возможность их использования была вклю­ чена в состав продукта в конце цикла разработки. Несмотря на происхождение; макросы предоставляют непрограммистам простой способ стать программистами и автоматизировать собственные электронные таблицы. Пользователи ухватились за эту возможность и "побежали". Наконец они получили оп- ; б . ределенную степень сво оды от компьютерного отдела. Оригинальные макросы 1-2 -3 выполняли поставленную задачу, повторяя последова­ тельность нажатий клавиш, которая позволяла выполнить данную задачу вручную. Таким образом, для создания макроса не нужно было учиться ничему новому и можно было сра­ зу переходить от ручного управления к программной манипуляции таблицами. Доста­ точно было запомнить и записать последовательность нажатий клавиш. Единственным движением в сторону традиционного программирования были восемь дополнительных команд ./х. Команды /х предоставляли примитивный механизм принятия решений и ветвления, получения данных от пользователя и способ создания меню .
32 Введение Одной из основных проблем при применении макросов 1-2 -3 являлась их уяЗвимость. Книга из нескольких листов еще не была изобретена, и макросы должны были записывать­ ся непосредственно в ячейки поддерживаемой электронной таблицы, рядом с данными и расчетами. Макросы отдавались на милость пользователя, который мог случайно повре­ дить их, вставив или удалив строки или столбцы . Кроме этого, макросы оказывались под полным контролем программиста. Некорректно спроектированный макрос мог самоунич­ тожиться в результате попытки отредактировать данные в электронной таблице . Несмотря на проблемы, пользователи наслаждались возможностями программирова­ ния и на этом сложном языке были написаны миллионы строк кода, в которых применя­ лись загадочные методики, позволяющие обойти огра~°Iичения языка. Весь мир зависел от плохо продуманного кода, который практически· всегда был плохо документирован и очень уязвим, хотя использовался для поддержки критических систем управления . Язык макрос~в XLM Для использования оригинального языка макросов Excel они записывались на специ ­ альном листе, сохраняемом в файле с расширением . хlщ. Таким образом, макросы хра­ нились отдельно от листа электронной таблицы, который сохранялся в файле с расши­ рением . xls. Часто для обозначения этих макросов использовалось название XLM или макросы Excel 4, •п:о позволяло отличить их от макросов на языке VBA, предоставленном в составе Excel 5. Язык макросов XLM состоял из вызовов функций, расположенных в столбцах на лис­ те макросов. Сотни функций обеспечивали доступ ко всем возможностям Excel и допус­ кали программное управление. Язык XLM был более сложI;IЫМ и мощным, чем макроязык 1-2-3, даже с учетом улучшений, которые были внесены во 2 и 3 версии . Но код на этом языке был таким же сложным и запутанным. Сложность макроязыка Excel была обоюдоострым мечом. Он хорошо подходил спе­ циалистам с хорошими навыками программирования, но был недоступен для понимания большинству пользователей. Не существовало простой свЯ:зи между ручным управлением электронными таблицами Excel и методами программирования. Язык XLM имел очень крутую кривую обучения и высокий порог входа. Еще одним препятствием для широкого распространения Excel на ПК являлась необхо­ димость использования операционной системы Windows. Ранние версии Windows страдали от ограниченного доступа к оперативной памяти и больши},\ требований к аппаратным средствам по сравнению с операционной системой DOS. Графический интерфейс пользо­ вателя выглядел привлекательно, но накладные расходы в виде стоимости апп аратных средств и снижения производительности рассматривались как серьезное препятствие" Компания Lotus совершила ошибку , предположив, что операционная система Win- dows не удержится на рынке достаточно долго . и будет замещена операционной системой • OS/2, поэтому портирование 1-2 -3 на операционную систему Windows не планировалось и ~сновное внимание уделялось версии 1-2 -3/G с графическим интерфейсом, которая работала под управлением операционной системы OS/2. Ставка на единственную ло­ шадь оказалась причиной неудачи продукта 1-2 -3 в борьбе за рынок. К тому моменту, когда стало ясно, что операционная система Windows продолжит свое существование, компания Lotus оказалась в неприятной ситуации, наблюдая массо­ вый переход пользователей на Excel. Первая попытка создания 1-2-3 для операционной системы Windows в 1991 году на самом деле являлась версией 3 для DOS в графической
Введение 33 оболочке. Последующие версии . позволили сократить разрыв между 1-2 -3 и Ехсе!, но этот рывок начался слишком поздно, чтобы остановить практически повсеместный переход на пакет Micгosoft Office. · ' ExcelS Компания Microsoft приняла смелое решение по унификации программного кода при­ ложений Office, представив язык VВА (Visual Basic fог Applications) в виде общего макро­ языка для приложений в составе пакета Office. Выпущенная в 1993 rоду Exce l 5 была первой программой, в составе которой предоставлялась поддержка макроязыка VВА. Постепенно поддержка этого языка появилась и в друrих приложениях Micгosoft Office. В составе Offi~ ХР язык VВА используется в таких приложениях, как Ехсе!, Wo1·d, Access, PoweгPoint, FrontPage, Visio, Pгoject и Outlook. (Своими действиями компания Micгosoft демонстрирует стремление расширять поддержку языка VВА в предлагаемых продуктах.) С момента выхода Excel 5 одновременная поддержка языков XLM и VВА сохраняется и будет сохраняться в обозримом будущем, но значение этой ·поддержки будет снижаться наряду с переходом потребителей на использование языка VВА. VВА является объектно-ориентированным языком программирования. По структуре и способам работы с объектами этот язык идентичен языку Visual Basic 6.0 . В будущих вер­ сиях языка VВА. можно будет наблюдать сближение этого языка с языком Visual Bas ic .NЕТ. Изучив язык VВА в Excel, можно использовать этот язык и в друrих приложениях Office. Разные приложения Office предоставляют различные объекты для использования в VВА. Для программирования приложения необходимо познакомиться с объектной моде­ лъю (object тodel), представляющей собой иерархию всех объектов, которые доступны в пределах приложения. Например, фрагмент объектной модели Excel описывает объект Application, в составе которого доступен объект Workbook, содержащий объект Worksheet. В составе объекта Worksheet дос·тупен объект Range . 1 Язык VBA изучается немного проще, 'Ч,ем, макроязъ~к XLM. Кроме этого, он предоставля­ ет болъше возможностей, обы'Ч,НО более эффективен и позволяет создаватъ хорошо структурированиый код. Язык позволяет писатъ и плохо структурированный код, но придерживаясъ несколъких простых прииципов, можно по крайней мере создаватъ по­ нятиый другим разработ'Ч,икам простой в сопровождении код.. В Excel 5 код VВА записывался в модули, которые являлись листами книги. В составе книг Ехсе! 5 можно было создавать листы, листы диаграмм и диалоговые листы. Ехсе197 Вместе с Excel 97 компания Mici-osoft предоставила несколько значительных измене­ ний в интерфейсе VВА и в объектной модели Excel" Начиная с Excel 97 модули не видны в окне приложения Excel и больше не являются объектами в составе объекта Workbook. Модули содержатся в проекте VВА, который связан с книгой и может просматриваться и редактироваться только в ~кне Visual Basic Editor (VBE).
34 Введение Кроме стандартных модулей, были введены . модули классов, позволяющие создавать собственные Классы. Вместо меню и панелей инструментов были введены командные панели (объекты CommandBar), а диалоговые окна UseгFoгm (объекты UserForm) заме­ нили диалоговые листы. Как и модули, диалоговые окна UserFoгm могут редактировать­ ся только в окне VВЕ. Как обычно, замененные объекты все еще поддерживаiотся в Excel, но рассматриваются как скрытые . В справочном руководстве отсутствует информация о скрытых объектах. В предыдущих версиях Excel такие объекты, как встроенные в лист кнопки, реагировали только на одно событие. Обычно эJГо было событие Click. В Excel 97 значительно расши­ рено количество событий, на которые может отвечать .код VВА. Кроме этого, была форма­ лизована процедура обработки событий. Для этого были предоставлены обработчики со- 1'ытий для обЪектов книги, листа и листа диаграммы. Теперь книга может реагировать на 20 событий, например BeforeSave, BeforePrint и BeforeClose. Кроме этого, в Excel 97 предоставляется поддержка элементов управления ActiveX, которые могут быть встрое­ ны в лист;ьr и диалоговые окна UserFoгm. Элементы управления ActiveX могут реагировать на широкий диапазон событий, например, GotFocus, MouseMove и DЫClick. Редактор VВЕ предоставляет пользователям значительно большую поддержку, чем в предыдущей версии редактора. Например, при .написании кода появляются всплы­ вающие подсказки со списком методов и свойств объекта, а также аргументами и значе­ ниями параметров для функций и методов. Утилита Object Browser (Просмотр объектов) теперь работает значительно лучше, поддерживая поиск и предоставляя подробную ин­ формацию о встроенных константах. Компания Micгosoft предоставила библиотеку расширений Extensibility, которая обеспечивает создание кода VВА, управляющего средой редактора VВЕ и проектов VВА. Это позволяет создавать код, получ;~ющий непосредственный доступ к модулям кода и диалоговым окнам Use1·Foi-m . Существует возможност;ь создавать приложения, которые выравнивают строки кода в модуле или экспортируют код из модулей в текстовые файлы. Excel 97 была портирована на Macintosh и получил название Excel 98. ~ сожалению, большинство упрощавших работу программистов возможностей справочного руково­ дства VВЕ не были включены в версию продукта на другой платформе . Возможности расширения редактора VBE также не были перенесены на платформу Macintosh. Excel 2000 . С точки зрения программирования на языке VВА в Excel 2000 значительных изменений не произошло. В этой версии Office и Excel был значительно переработан пользовательский ин­ терфейс и улучшены некоторые возможности Excel, например PivotTaЬle (сводная таб­ лица). Была добавлена новая возможность PivotChart (сводная диаграмма) . Изменения в Excel 2000 больше всего затронули пользователей Web. В основном это касалось возможно­ сти сохранения книг в виде WеЬ-страниц. Кроме этого, появились новые возможности груп­ повой работы, которые предоставляли механизмы распространения информации. Одним из самых ожидаемых улучшений VBA было введение немодальных диалого­ вых окон UserFoi-m. Ранее Excel поддерживала только модальные диалоговые окна, кото­ рые перехватывали фокус после появления на экране и не позволяли выполнять другие операции, пока окно не будет закрыто . Немодальные диалоговые окна могут исirользо­ ваться для вывода заставок при загрузке приложения Excel или для вывода индикатора текущего состо:Яния при выполнении большого макроса.
Введение 35 Ехсе12002 В Excel 2002 также были предоставлены только минимальные улучшения. И в этот раз самые значительные улучшения касались пользовательского интерфейса, а не про­ граммных возможностей. Компания Micгosoft продолжает концентрироваться на связан­ ных с Web возможностях, которые значительно упрощают доступ к данным и их распро­ странение через сеть Internet. Среди полезных для программистов VBA новых возмож­ ностей можно перечислить объекты Protection, SmartTag, RTD (данные реального времени) и расширенную поддержку XML. Новый объект Protection позволяет избирательно управлять доступными для пользователя возможностями защищенной книги . Например, можно выборочно разре­ шить сортировку, изменение форматирования ячеек или вставку и удаление строк , и столбцов. Кроме этого, предоставлен новый объект AllowEdi tRange, который может применяться для определения списка пользователей , имеющих право редактировать ~онкретные диапазоны (возможна защита с помощью пароля). К разным диапазонам' мо­ гут применяться различные комбинации разрешений. Смарт-теги позволяют Excel распознавать вводимые в ячейки данные, как имеющие специальное значение. Например, Excel 2002 может распознавать биржевые аббревиату­ ры (MSFT соответствует Miaosoft Corpoгation). При обнаружении такой аббревиатуры Excel выводит символ смарт-тега, с которым связано всплывающее 'меню . Это меню мож: но использовать для получения дополнительной информации, например последней це- , ны акции или итогового отчета компании. Компания Micгosoft предоставляет инстру­ ментарий, позволяющий разработчикам создавать новое программное обеспечение смарт-тегов. В ближайшее время можно ожидать появления· большого количества при­ ложений, использующих возможности смарт-тегов для предоставления данных в преде­ лах организации или в сети Inteгnet. Данные реального времени позволяют разработчикам создавать источники инфор­ мации для пользователей . росле создания ссылки на лист, изменения в данных переда­ ются автоматически. Очевидным применением этой возможности является получение биржевых цен, которые меняются в реальном времени в процессе торгов. Еще одним приложением является возможность создания журнала показаний научных инструментов или промышленных контроллеров процессов. Как и в случае смарт-тегов, можно ожидать появления большого количества приложений, помогающих пользователям Excel полу­ чать доступ к динамической информации. Расширенная поддержка XML. означает более простое создание приложений, обме­ нивающихся данными по сети Internet и корпоративным сетям. С уси;,лением зависимо­ сти от развивающихся технологий эта возможность станет еще важнее. Ехсе12003 Web является неотъемлемой частью современной жизни. С увеличением значитель­ ности Web во всем мире компания Microsoft сместила внимание на предоставление ре­ шений, отвечающих возрастающей важности этих технологий в мире компьютеров . По этой причине в Excel 2003 можно обнаружить значительное количество изменений, от­ ражающих перемены в современном мире.
36 Введение Кроме новых, связанных с сетью Internet, возможностей, предоставляются расши­ ренные возможности книг, новая функциональность для анализа данных , усовершенст­ вованная поддержка XML и общего доступа к книгам из сети lnte1-net, а также улучшен­ ный внешний вид и поведение пользовательского интерфейса. XML, или eXtensiЫe Maгkup Language, является расширяемым языком разметки гипер­ текста. По сути, XML является текстовым открытым промышленным стандартом, -поддер­ живающим расширение для различных применений и предназначенным для передачи ин­ формации в сети Inteгnet. Увеличение поддержки XML упрощает обмен данными элек­ тронных таблиц Excel с другими промышленными решениями, которые используют XML. Предоставляется расширенная поддержка управлением списками диапазонов, а поль­ зовательский интерфейс улучшен через добавление возможностей для модификации , фильтрации и идентификации этих списков. Упрощена процедура общего доступа и обновления данных Excel при использо вании служб Windows Sharepoint Seгvices. Например, из~енения в списках Excel автоматически обновляются на сервере Shaгepoint Seгvices . Поддержка автономной модификации дан­ ных с их ресИ:нхронизацией при следующем подключении упрощает работу пользовате­ лей, работающих за пределами сети, например, в ситуации Великого Затмения 2003'. В Excel было добавлено несколько десятков новых и мощных статистических функ­ ций, а также возможность сравнения книг, больший объем справочной информации и под­ держка связи с беспроводными устройствами, например, планшетными ПК. Все эти воз­ можности позволяют сделать работу пользователей более продукtивной . Что рассматривается в этой книге В основном эта книга предназначена для пользователей Ехсе!, которые желают совладать с мощью языка VВА в собственных приложениях Excel. Язык VВА всегда рассматривается в контексте Excel, а не только как язык программирования универсальных приложений. Остальная часть книги делится на три раздела: О программирование; . О р~сширенные возможности Excel; О новые возможности, обеспечивающие интерактивный совместный доступ к ин­ формации. В приложениях А, Б и В представлено полное справочное руководство по обновлен­ ной объектной модели. К11ига была реорган:Изована таким образом, чтобы информация о программировании была перенесена в начало. Кроме этого, были добавлены новые главы, в которых основное внимание уделяется объектно-ориентированному> программированию, обработке ошибок и созданию стабильного кода. В этих главах предоставлена информация обо всем, от инкап­ суляции, интерфейсов обработки ошибок и отладки до создания надстроек, программиро­ вания с использованием Windows API и решения Проблем интернационализации . В основF.iом разделе книги рассматриваются новые расширенные возможности, дос­ тупные пользователям Excel. Эти возможности (например новая поддержка диапазонов • Omм'l(JЧtmue электроэнергии на все.л~ востач:ном побережье Северной Америки в 2003 году. - Примеч. ред.
Введение 37 и списков) необходимы для максимального исп~льзования потенциала Ехсе! как средства программирования и средства повышения личной производительности. В третьей части книги рассматриваются ресурсы для совместного доступа к данным Ехсе! через сеть Inteгnet. Так как !'!астоящая книга в основном является справочным руководством для про­ граммистов, основное внимание уделяется именно им. Но кроме этого, были оставлены главы, в которых описываются возможности, больше предназначенные для· пользовате­ лей (при необходимости, содержимое таких глав было обновлено). Номера версий Изн.ачально данная книга создавалась для Excel 2000 и теперь расширена для Excel 2003, входящей . в состав Office ХР. Учитывая, что изменения в объектной модели по сравнению с Excel 97 были минимальны, книга может использоваться для работы со все­ ми тремя версиями Excel. При обсужд~нии возможностей, которые не поддерживаются в более ранних версиях, на это будет явно указано в тексте. Что нужно для использования книги Практически для всех рассматриваемых тем приводятся примеры. Приводятся полные фрагменты кода, а также снимки экранов, если в этом возникает необходимость. Версия операционной системы Windows не имеет значенИя. Важно, чтобы на диск был установлен полный набор компонентов Ехсе!, а при рассмотрении более сложных тем связи между Excel и другими приложениями Office потребуется установка полного состава Office. Удосто­ верьтесь, что установленные компоненты предоставляют доступ к редактору VВЕ и файлам справочного руководства по VВА. При установке эти компоненты можно отключить . Обратите внимание, что в главах 13 и 14 требуется наличие установленной среды VВб, так как в этих главах рассматривается использование надстроек СОМ и смарт-тегов. Соглашения Для упрощения понимания текста в книге используется несколько соглашений по форматированию . · в таких поf1ях приводится важная- : информация, которую нужно запомнить. ·маци11 непосредственно относится к тексту раздела . Советъt, подсказки, прие.лtъt и ииформ'шция, ш оптосящаяся шпосредствен,ио к рас­ сматриваемой те.лtе, въ~деляются таким шрифтом. Стилевое оформление в тексте: О важные слова выделяются при первом появлении в тексте; О комбинации клавиш выделяются следующим образом <Ctrl+A>; О имена файлов, URL и код в тексте выделяется таким шрифтом: persistence.properties; О код выделяется двумя разными шрифтами.
38 Введение . J3 •.пr?~1.':fepqx .. J;!O!?.~~ ~_:-~a}Цi~rli!~ t<?.!Г:~мi{~-~~-~3.i:i.~,;~i;~вЬ~Ф2i:!9Ii~,:· : .~j%:~: Для менее важного кода в данном контексте выделение серым фоном не используется. Также такое выделение не используется для повторяющегося кода. Исходный код При работе с примерами в данной книге можно вручную вводить весь код или воспользо­ ваться файлами с исходным кодом, которые пр~едоставляются вместе с книгой. Весь исходный код для этой книги доступен для загрузки на сайте http :./ /www. wrox. com. После открытия сайта найдите раздел книги (воспользуйтесь полем Search или выберите название из списка) и щелкните на ссылке Download Code на странице, посвященной настоящей книге. Так как м·н.огие к'Н.иги имеют похожие 'Н.азва'Н.ИЯ, для поиска к'Н.иги проще восполъзо­ ватъся номером ISBN; эта к'Н.ига имеет номер ISBN О-764-55 660-6 . После загрузки кода распакуйте его любым подходящим инструментом. Кроме это~о, можно перейти на основную страницу загрузки кода издательства Wrox по адресу ht tp: / /www.wrox.com/ dynaтic /books / download . aspx и просмотреть код, дос­ тупный для этой книги и других книг издательства Wrox. Ошибки Мы приложили все усилия, чтобы исправить ошибки в тексте и в ко.Де . Но никто не совершенен, поэтому ошибки иногда встречаются. Если в одной из наших книг будет найдена ошибка (орфографическая или ошибка в коде), мЬI будем благодарны за сообще­ ние о ней . Отправив сообщение об ошибке, вы сохраните другим читателям несколько часов неудачных попыток заставить код работать. В то же время, этим вы поможете нам выпускать более качественные книги. Для доступа на страницу со списком ошибок в этой книге перейдите на сайт по адресу ht tp: / /www. wrox. сот и найдите книгу по названию с помощью поля Поиск (Search). После этого щелкните на ссылке Book Errata. На этой странице можно просмотреть все сообщения об ошибках, предоставленные пользователями и редакторами в издательстве Wi-ox. Полный список книг со ссылками на страницы сообщений об ошибках доступен по адресуwww.wrox.com/тisc -pages /bookl ist. shtml. Если "ваша" ошибка отсутствует на странице со списком ошибок, переходите на стра­ ницу по адресу ht tp: / /www . wrox.com/ contact / techsupport . sht.тl и заполните форму для отправки нам сообщения об ошибке. Мы проверим полученную информацию и, в случае необходимости, опубликуем сообщение на странице сообщений об ошибках в этой книге. Обнаруженная проблема будет решена в последующих редакциях этой щиги. • В случае кризиса Существует множество мест, куда можно обратиться в случае проблем. Лучшим источни­ ком информации о всех аспектах Excel являются такие же пользователи. Они доступны во множестве конференций.новостей в сети Internet. Попытайтесь настроить программу чтения конфереrщий новостей на сайт, где достаточно людей, готовых помочь решнть Проблему: о msnews .тicrosoft . сот
Введение 39 Подпишитесь на группу тicrosoft. puЫic. excel. programming или на другую подходящую группу новостей. Ответ на отправленный вопрос обычно появляется в те­ чение часа. Стивен Буллен и Роб Боуви поддерживают очень полезные WеЬ-сайты, на которых можно найти бс;>Льшой объем информации и файлы, доступные для бесплатной загрузки . Сайты доступны по следующим адресам: О http: / /www.bтsltd. со. uk О h t tp: / /www. appspro. сот Еще один полезный сайт поддерживается Джоном Уокенбахом (John Walkenbach) по адресу: О http://www. j-walk. сот С издательством }\Тгох можно связаться непосредственно на сайтах: О ht tp: / /www. wrox. сот - поддержка и загрузка исходного кода; О http://p2p.wrox.coт/list.asp?list=vba_excel- открытое обсуждение Excer'VВA. Непосредственные вопросы можно задавать по aдpecypkimmel@softconcepts. сот. (Помните, что мы можем попытаться ответить на все вопросы, но нельзя ответить на все вопросы сразу. Желательно отправлять вопрос нескольким источникам информации, что позволит получить ответ быстрее и выбрать наиболее подходяfцее решение из не­ скольких ответов . ) Друrие, связанные с компанией Micгosoft, источники информации доступны по сле­ дующим адресам: О http://www.тicrosoft. coт/office/ - актуальные новости и поддержка; О http: / /тsdn. тicrosoft. сот/ office/ - новости для разработчиков и статьи о работе с продуктами Microsoft; О http://www.тicrosoft. coт/technet - статьи Microsoft Knowledge Base, ин­ формация о безопасности и большой объем другой информации, связанной с ад­ министрированием. р2р. wrox.com Для обсуждения с авторами ~ другими читателями присоединяйтесь к форумам Р2Р по адресу р2р. wrox. сот. Форумы представляют собой основанную на Web систему от­ правки сообщений о книгах издательства Wrox и связанных с ними технологиях, а также взаимодействия с другими читателями и пользователями этих технологий. Форум пре­ доставляет возможность подписки для получения интересующих тем по электронной · почте. На этих форумах доступны авторы и редакторы из издательства Wгох, а также эксперты и читатели. По адресу ht tp: / /р2р. wrox. сот доступно несколько форумов, которые моrут помочь не только в процессе чтения книги, но и при разработке собственных приложений. Для при­ соединения к форумам необходимо выполнить такую последовательность действий .
40 Введение 1. Перейдите на сайт по адресу р2р. wrox. сот и щелкните на ссылке Rs; s :s r (Регистрация). 2. Прочитайте правила пользования форумом и щелкните на кнопке Agree (Саг а-=-- 3. Введите необходимую информацию, а также необязательную информацию . - 70- рую можно предоставить, и щелкните на кнопке Submit (Зарегистрировать). 4. По электронной почте будет отправлено сообщение с инструкциями по пр озер:ь:е учетной записи и завершении процесса присоединения к форумам. Для чтения сообщений на форумах Р2Р регистрация не требуется, но для отпраз= собственных сообщений она обязательна. · После присоединения· к форумам можно публиковать новые сообщения и отвечать на сообщения других пользователей. В Web сообщения можно читать в любой момент. Ес.й~ необходимо, чтобы новые сообщения из определенного форума отправлялись по э:1ек­ тронной почте, щелкните на кнопке Subscribe to this Forum (Подписка на этот фо р ) возле им~ни форума в списке форумов. Дополнительная информация об использовании форума Wгох Р2Р доступна в списке часто задаваемых вопросов о работе программного обеспечения форума, а также о фору­ мах Р2Р и книгах Wrox. Для чтения списка часто задаваемых вопросов щелкните на ссылке FAQ на любой странице сайта Р2Р. Ждем ваших отзывов! Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть · изданным нами. Нам интересно услышать и любы е дру­ гие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо либо просто посетить наш WеЬ-сервер и остав:Ить свои замеч а­ ния там. 'Одним словом, любым удобным для вас способом дайте нам знать, нравится вам эта книга или нет, а также выскажите свое мнение о том, как сделать наши книги боле е 1 . интересными для вас. Посылая письмо или сообщение , не забудьте указать название книги и ее авторов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязатель­ но учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: E-mail: WWW: info@dialektika.com http://www.dialektika.com Адреса для писем: из России: 115419, Москва, а/я 783 из Украины: 03150, Киев, а/я 152
Пример использования VBA в Excel Эта глава предназначена для тех, кто не знаком с Excel и записью макросов в Excel, а· также тех, кто не обладает достаточным опытом программирования с помощью языка . Visual Basic fог Applications (VВА). Если предоставляемые Excel возможности уже извест­ ны, запись макросов не вызывает трудностей и есть опыт применения языка VВА и ре­ дактора VВЕ, можно сразу переходить к главе 3. В этой же главе предоставл:Яется информация, которая необходима для удобного пе­ рехода к расширенным возможностям, представленным в следующих главах. Здесь рас­ сматриваются следующие темы: О запись макросов в Excel; О определяемые пользователем функции; О объектная модель Excel; О концепции программирования с использованием языка VВА. Язык Ехсе! VВА является языком программирования, позволяющим использовать код Visual Basic для управления многими возможностями пакета Ехсе!. VВА позволяет моди­ фицировать поведение приложений Ехсе!. 08ычно фрагменты кода VВА называются · макросами. В этой главе рассматривается более формальная терминология, но термин макрос будет использоваться как универсальное название для фрагмента кода VBA . Если при обычном использовании Ехсе! определенная последовательность команд выполняется несколько раз, выполнение этих операций из макроса позволяет заметно сэкономить усилия и время. Если приложение Ехсе! необходимо предоставить пользова­ телям, не знакомым с принципами работы в Ехсе!, с помощью макросов можно создать
42 Глава 1 кнопки и диалоговые окна, которые пр,оведут через приложение и позволят автоматизи- ровать промежуточные операции. . Если операцию можно выполнить вручи~, запись макроса позволит получить после­ довательность команд для выполнения этой операции. Это быстрый и простой процесс , не требующий предварительных знаний VBA . Многие пользователи Excel записывают и запускщот макросы, не утруждая себя изучением языка VВА. Но полученный в результате записи макроса код может оказаться недостаточно гибким , то есть, данный конкретный макрос может быть использован для выполнения определенной операции на определенном диапазоне ячеек. Кроме этого, записанный макрос может работать значительно медленнее, чем код, написанный знакомым с языком VВА программистом . Если необходимо создавать интерактивные макросы, адаптир}тющиеся к изменениям и быстро вы­ полняющие свою функцию, а также макросы, которые используют такие расширенные воз­ можности Excel, как собственные диалоговые окна, язык VВА придется изучить . Не п6дума~т~, что Mbl не реком~ндуем заnисьjвать с;~акрось\. За~ис~ ма!<рqсов является наИб0лее 'ценным инструментом программистЬв на язь1ке V.BA. ·это 'сам~,1й 'быстрый спо­ соб генерации работающего кода: : Нр Для п6riуЧениЯ гибкого .!;! эффе!<тивноrо кода к за­ писанному макросу ' не0бходим6 'hриложИть'.'собств~ннd~. !ЗнанИе ·яЗЬ1к,:~ . VB.A, В этой книге . '..' , ьlвается /макрос, поспе чего .. выпол- 2 ;.i,.,v~ / ~'\ ;-' 1-: . ../' В данной главе будет показано, как записывать и запускать макросы в Excel, а также как использовать редактор VВЕ для просмотра и изменения кода макроса, выходя за пре ­ делы записи макросов и прикасаясь к мощи языка VВА и объектной модели Excel. Кроме этого, язык VВА может использоваться для создания собственных функций лис­ тов. В составе Excel предоставляются сотни встроенных функций, например СУММ и ЕСЛИ, которые МОJКНО применять в формулах внутри ячеек. Но если часто используется сложный метод расчета, который не входит в список стандартных функций Excel (например, расчет налогов или специализированная формула), можно определить собственную функцию. Использование механизма записи макросов Запись макросов в Excel выполняется так же, как запись приветствия на автоответчи­ ке. Для записи приветствия сначала его необходимо отрепетировать. После этого вклю­ чить автоответчик и записать приветствие. После завершения можно отключить автоот­ ветчик. Приветствие будет звучать каждый раз, когда никто не берет трубку телефона. Запись макроса в Excel происходит подобным образом. Сначала нужно продумать не­ обходимые операции и решить, в какие моменты начнется и закончится запись макроса. Для это~о необходимо подготовить эле_ктронную таблицу, включить механизм записи макроса, выполнить определенную последовательность операций и отключить механизм записи макроса. В результате будет получена автоматизированная процедура, которую можно будет запустить одним нажатием кнопки . Запись макроса Предположим, что необходимо создать макрос, который выводит шесть названий ме­ сяцев в в:Иде трехбуквенных аббревиатур в верхней строке листа начиная с ячейки Bl. Это достаточно простой макрос, так как этого же эффекта можно добиться с помощью
Пример использования VВА в Excel 43 операции автоматического заполнения (AutoFill), но данный пример будет использован для демонстрации важных универсальных концепций. О Сначала представьте, как будет выполняться эта операция. ·в данном случае все просто - необходимо ввести данные в лист. Помните, что более сложный макрос может потребовать более длительного обдумывания перед записью. О После этого подумайте, в какой момент необходимо начать запись . В данном слу­ чае в макрос необходимо включить операцию выделения ячейки Bl. Таким обра­ зом, название месяца "Янв" всегда будет попадать в ячейку Bl. Если операцию вы­ деления не включить в макрос, будет записан ввод последовательности символов "Янв" в активную ячейку. При воспроизведении макроса активная ячейка может находиться в любом месте. О После этого подумайте, в какой момент необходимо завершить запись. Может возникнуть желание включить в состав макроса операцию форматирования, на­ пример выделение сqдержимого ячеек полужирным шрифтом и курсивом. Кроме этого, необходимо выбрать положение активной ячейки после завершения работы макроса. Это может быть как ячейка со словом "Июн", так и ячейка в следующей строке столбца А или столбца В, что позволит сразу же начать ввод данных. Пред­ положим, что в качестве активной ячейки после завершения работы макроса вы­ брана ячейка А2, поэтому перед отключением механизма записи макроса необхо­ димо выделить ячейку А2. О Теперь можно настроить экран и начинать запись макроса. В данном случае можно начинать с пустого листа, на котором выделена ячейка Al. Ес­ ли отдается предпочтение работе с панелями инструментов, воспользуйтесь командой Вид<>Панели инструментов (View<>Toolbaгs) и установите флажок напротив Visual Basic. Для начала записи макроса нажмите кнопку Записать макрос (Recoгd Мапо) (на кнопке изображена красная точка). При желании, запись макроса можно включить с по­ мощью команды Сервисс;>Макрос<>Записать макрос (Tools<>Maпo<>Recoгd New Масго) ;i.rз панели меню листа. , В поле Макрос (Масго name) замените принятое по умолчанию значение Maciol на имя, которое будет присвоено зап~санному макросу. Имя должно начинаться с буквы и содержать только буквы, цифры и символ подчеркивания . Максимальная длина имени составляет 255 символов. Имя макроса не должно содержать специальных символов, на­ пример, ! , ? или пробелов. Кроме этого, лучше использовать короткие описательные имена, легко узнаваемые в будущем. Для разделения слов можно применять символ под­ черкивания, но намного лучше для этих·целей подходит использование заглавных букв. Обратите внимание, что разделение ·слов в имени переменной с помощью заглавных букв н~зывается разделением в стиле Паскаль; как в РазделениеВСтилеПаскаль. Исполь­ зование nрописной буквы · в начале первого слова и заглавных букв в начале всех осталь- · НЫХ_ 'слов называется разделением в стиле верблюда, как в разделениеВСтилеВерблюда•. Такие чувствительные к регистру языки, как с++, Pascal '1 С#, предлагают варианты ., в. написании заглавных букв в виде соглашения по именованию. Многие программисты . следуют эти~ соглашениям. Так как VBA не чувствителен к ре~истру, можно -использо~. ваrь любой удобный стандарт. * Есrпъ горбъ~ и начинается с длинной шеи. - Примеч. ред.
44 Глава 1 Назовите макрос MonthNamesl, так как скоро будет создана еще одна версия макроса. В поле Сочетание клавиш (Sl10гtcut key:) аведите единственный символ. Позднее нажатие этой клавиши в комбинации с клавишей <Ctгl> приведет к запуску макроса. В данном случае будет использован символ m. Точно так же можно использовать символ М. В таком случае для запуска макроса при нажатии клавиши <М> придется удержив ать клавиши <Ctгl> и <Shift> . Комбинация клавиш необязательна. Макрос можно запустить и нескЬлькими другими способами. В поле Описание (Descгiption:) можно ост~вить предложенное описание или вв~сти собственный комментарий. Эта последовательность символов будет указана в начале ко­ да макроса. Она не имеет никакого значения для интерпретатора VВА, но предоставляет вам и другим пользователям информацию о макросе. Комментарии можно отредактиро­ вать позднее, поэтому сейчас лучше оставить принятое по умолчанию описание. Все мак­ росы Excel создаются в пределах книги. В поле Сохранить в (Stoгe maci-o in:) можно выбрать, где будет сохранен записанnый макрос. Предоставляется три варианта. Если выбрать Новая книга (New Woгkbook), для макроса будет открыта новая пустая книга. Вариант Личная книга макросов (Peгsonal Macro Woгkbook) соответствует специальной скрытой книге, которая рассматривается ниже. В данном случае будет выбран пун~<т Эта книга (This Woгkbook), чтобы макрос был сохранен в активной книге (рис. 1.1). ~!:'-~.~~~~~---··- ·······-·-··-~·-·-··-······- ·······- ·- - · ·· -···- ·- -· ·- - - - - , i MonthNames 1 ······-······-··...] Сочетание 1$.ЛdВНW ; Со хрё!жть Q.: Ctrl+[] r·э~~-~~~~~~".".. "·-·~: Оnнсание: Личная книга макросов л. r---- ·- - Нова я книга ~ макрос ~"nнсан 10.~Ёi- BDiBBDlll'jll.:::J •....." ·-···-- ·- - - ·- J, ··ок · 'J[ Отмен• Рис. 1.1 . Выбор юtuzu для сохранения макроса • По сле запол~iения полей в диалоговом окне Запись макроса (Recoгd Масго) щелкните на кнопке ОК. Слева в строке состояния в нижней части окна появится надпись Запись (Recoгding), а на экране появится панель инструментов Остановить запись (Stop Recoгd­ ing). Обратите внимание, что если во время предыдущей попытки записи макроса панель Остановить запись (Stop Recording) бьта закрыта, она на экране не появляется. Если па­ нель не появилась, восстановите ее в соответствии с инструкциями в разделе "Абсолютная и относительная запись". Но в. данном случае эта панель не нужна, так как запись можно ос­ тановить из панели инструментов Visual Basic или из меню Сервис (Tools). Если панелъ Остановить запись (Stap &coтding) появиласъ на Э1Сране, удостовеfrь­ тесъ, 'Что 'Кноn'Ка Относительная ссылка (&lative &fетепсе) от'/СЛЮ'Чена. В01Сруг 'КНОп'Ки должна отсутствоватъ рам'Ка, то естъ '/СНОп'Ка должна въ~глядетъ не mа'К, 'Как показано на рис. 1.2 . По умол'Чани10 при записи макросов исполъзу10тся абсол10тнъ~е ССЪ/ЛКи на Я'Чейки.
Пример использования VВА в Excel 45 Рис. 1.2. Включение относительных ссылок при записи макроса После этого необходимо щелкнуть на ячейке Bl, ввести "Янв" и заполнить остальные ячейки, как показано на рис. 1.3. Теперь выделите ячейки Bl:Gl и щелкните на кнопках Полужирный (Bold) и Курсив (Italic) на панели инструментов Форматирование (Format- ting). Щелкните на ячейке А2 и остановите запись макроса. Для остановки записи макроса можно щелкнуть на кнопке Остановить запись (Stop Recording) на панели инструм~нтов Остановить запись (Stop Recoi-ding) или щелкнуть на кнопке Остановить запись (Stop Recol'ding) на панели управления Visual Basic (после начала записи кнопка Начать запись (Start Recording) меняется на кнопку Остановить запись (Stop Recoгding) ). Кроме этого, можно воспользоваться командой меню Сервисq МакросqОстановить запись (ToolsQMacгoQStop Recording). Сохраните книгу под име­ нем Recorder. xls. B~Жtio1~e ';аб~п~:, . запись макроса. Если' оставить .механиз~'·:;~;~с; в~ю!-jеннь1м И лопЬl­ :татьсJ!. ~апуститt;. записанный макрос, приложение ·~ожет ;;йтИ ~ ··Цикл', в' kоторо":': мак- « · ррс1·поsтоянно заnускает сам себя; · в так.ом с11учае' (а также.;в случае nоявriеi;ия'Сд;р~rих i ошибок) удерживайте клавишу <Ctrl> . и нажмите клавишу <Вrеаk> >Для неме~енного;>· даверше11ия работь1 макроса. · После этого можно зав.ер:шиr~:. .выполнение макроса или •· переключиться в режим ··• отладки для поиска ошибок~ Кро~е этог~.· работу ~акроq.а > можно 'прервать с П.о~ощью нажатия клаВИ!-LJИ .<Esc>' ' этот сnос~б работает ·. не ,.;r,a!,< •i · эффективttо, как комбина~и_я, <Ctrl+Break>. ·· >•'· Рис. 1.3 . Ввод значений в процессе записи макроса Личная книга макросов J ' Если выбрано сохранение макроса в Личной книге макросов, макрос добавляется в специ- альный файл, который называется Personal . xls. Это скрытый файл, сохраняемый в ката­ логе Excel Startup при завершении работы Excel. Это значит, что файл Personal. xls ав­ тома;ически загружается при запуске Excel и сохраненные в нем макросы доступны для всех остальных книг. Если файл Personal . xls еще не существует, он будет создан механизмом записи макросов. Для просмотра этой книги в окне Excel можно воспользоваться командой меню Окноq0тобразить (WindowQUnhide), но эта возможность редко оказывается востребо­ ванной, так как для редактирования макросов из книги Personal. xls лучше воспользо­ ваться редактором VВЕ. Как исключение, книгу Personal. xls можно сде.Лать видимой для сохранения данных на листах этой книги. Для сокрытия книги после сохранения
46 Глава 1 данных можно воспользоваться командой меню Окно~Скрыть (Window~Hide). Если создается универсальный вспомогательный макрщ:, который должен быть доступен в любой книге, сохраните этот макрос в книге Personal· . xls. Если макрос относится к приложению в текущей книге, сохраните макрос вместе с приложением. Запуск макросов Для запуска макроса вставьте новый лист в книгу Recorder. xls или откройте новую пустую .книгу , оставив в памяти книгу Recorder. xls. Макросы можно запускать только из открытой книги, но работать они могут .в любой другой открытой книге. Для запуска макроса удерживайте клавишу <Ctгl> ·и нажмите клавишу <m>, которая была назначена макросу в процессе записи. Кроме этого, для запуска макроса можно вос­ пользоваться командой меню Сервис~Макрос~Макросы (Toolsr::::>Macгor::::>Mac1·os ) и вы­ полнить двойной щелчок на имени макроса. Также можно выбрать имя макроса в спи ске и щелкнуть на кнопке Выполнить (Run), как показано на рис . 1.4 . Макрос . С[!~ . qпHt:<;i~иe ·?,"·-·?···-· _."._ ·•:- , , Макрос записан 10.04 .2005 (leschinsky Oleg) Рис. 1 ,4 . Запуск макроса из диалогового окна Для открытия этого диалогового окна можно воспользоваться кнопкой Выполнить макрос (Run Масго) в панели инструментов Visual Baslc (рис. 1.5) . Комбинации клавиш m:~·~~r~".:~.:~ ~:1 РШ:.1.5. Зarry<X макроса из па­ нели инструменrrwв Для изменения назначенной макросу комбинации клавиш откройте диалоговое окно Макрос (Maci·o) (для этого выберите Сервисr::::>Макросr::::>Макросы (Toolsr::::>Macгor::::>Macros) или щелкните на кнопке Выполнить макрос (Run Macro) на панели инструментов Visual Basic). После этого выберите имя макроса из списка и ще.zrкните на кноп~е Параметры (Options). Откроется диалоговое окно, показанное на рис. 1.6.
Пример использования VВА в Excel 47 Имя Макроса rvIOnthNames 1 Сочетание 15.лВБl?ш: .~. Ctrl+f~l Qn11caн11e: • г--~-----------··---'"-------1 ;Макрос 3ап11сан 10.04.2005 (leschinsky Oleg) J t.~...... " .......................................................... ~············ ·"···· ···· ····· ·················· ··"· ····· ···••>< ОК....Jj Отмена J Рис. 1.6 . Настройка параметров макроса С помощью этого диалогового окна макросам можно назначить одну и ту же комбина­ цию . клавиш в пределах одной книги (диалоговое окно, которое появляется при записи макроса, не позволяет задать макросу уже назначенную комбинацию клавиш). , , , , , , ~ Кроме 'Этого; высока вероятность, что · макросы с одинаковыми комбинациями клавиш будуr находитьсЯ в разных открытых книгах. Возникает пробЛема определения макроса, _который будет запущ'ен при нажатии конкретной комбl'tнации клавиш. Для этого сущест­ вует Правило., по которому запускается 'ТОТ макрос, имя которого оказывается первым в' алфавитном порядке. · Комбинации клавиш имеют смысл для тех макросов, которые используются очень часто, · особенно, если большую часть времени руки находятся на клавиатуре. Стоит за­ помнить комбинации клавиш, используемые регулярно. Для макросов, которые запуска­ ются редко или предназначены для облегчения работы менее опытных пользователей, комбинации клавиш не нужны. Лучше назначить таким макросам осмысленные имена и запускать их из диалогового окна Макрос. С другой стороны, макросы можно запускать с помощью кнопок, размещенных на листе или на панели инструментов. Ниже будет по­ казано, как добавлять такие кнопки. Абсолютная и относительная запись . , При запуске макроса MonthNamesl он возвращается к тем же ячейкам, которые были выбраны при вводе имен месяцев. Не важно, какая ячейка была активна на момент запуска макроса. Если в макросе присутствует команда выделения ячейки Bl, именно эта ячейка и будет выделена. Макрос выбирает Ячейку Bl, так как он создавался с использованием аб­ солютных ссылок. Альтернативный режим относительных ссылок запоминает положение ячеек относительно активной ячейки. Если выделить ячейку AlO, включить запись макроса и выделить я~ейку BlO, будет записан выбор ячейки справа от активной, а не ячейки BlO. Ниже будет записан второй макрос, который называется MonthNames2. В этом мак­ росе есть три отличия от предыдущего: q в панели инструментов Остановить запись (Stop Recording) будет нажата кнопка Относительная ссылка (Relative Reference). Это первая операция после включе­ ния механизма записи макроса; О перед вводом не будет выбираться ячейка "Янв" . При запуске макроса слово "Янв" должно вводиться в активную ячейку; О перед завершением записи макроса будет выбрана ячейка под словом "Янв", а не яЧейкаА2.
48 Глава 1 Начните с пустого листа и выделите ячейку Bl. Включите запись макроса и вв едuте имя макроса MonthNames2. В поле назначенной клавиши введите букву М (верхний ре­ гистр). Повторное использование клавиши <ш> в качестве комбинации для запус ка ~ак­ роса невозможно . Щелкните на кнопке ОК и на кнопке Относительная ссылка (RelatiY e Refeгence) в панели инструментов Остановить запись (Stop Recoгding) . Если па~~ль' l-iнструменто~ Остановить запись (Stop Recordiпg) ~е появляется автома-'1- чески !1()СЛе начала. записи макроса, выберите в меню Вид~ПаН!ЭЛИ инструментов (Vie v. ~ ··Tobli5°ars) и "установите флажок · Остановить запись (Sfop Recordiпg}. · После этого панегь Инсч~у1.ентов Останqвить запись (Stop Recordiпg} должн~ появиться на 'экране. Обра:~<­ те внимание, что после этого нуЖно немедnеннр щелкнуть на кнопке Остановить заnис::о (Stop R~cordiпg) и начать запись еще раз. В противном случае Записанный макрос бу{:!..ет выводИть на экран ·панель инструментов при каждом запуске.' После этого панель инстру­ менто11 будет появля~;ься при : каждом запуске механизма _записи макросов, если не за­ крыт~ ,.ее в процессе записи. Если возникла необходимость ресинхронизации панели инструментов Остановить запись (Stop Recoгding) в соответствии с приведенными ранее инструкциями, клавиша <М> уже будет назначена. Если не удается назначить мaкpocyMonthNames2 клавишу С.1>, воспользуйтесь другой клавишей, например <N>. После завершения записи назначеНН}Ю комбинацию клавиш можно будет изменить. Для этого воспользуйтесь командой ~1еню СервисqМакросqМакросы (Too[sQMacгoQMacros), выберите имя макроса и щелкните на кнопке Параметры (Optioris), как было показано ранее в разделе "Комбинации клавиш ". Введите "Янв" и названия других месяцев, как и при записи мaкpocaMonthNames l . Выделите ячейки BJ:G l и щелкните на кнопках Полужирный (Bold) и Курсив (Italic) на панели инструментов Форматирование (Foгшattiпg) . Удостоверьтесь, что .диапа-зон B1:G1 выделяется слева направо, и ячейка В1 остается ак­ -тивной . В процессе записи макроса существуе+ небольшая особенность, которая может пр1-1вести к появл_ениiо ош11бок пр1-1 выделениИ ячеек справа ,J-iалево или снизу вверх. При записи макроса с относительными ссылками всегда выделяйте диапазон начиная с 'верх­ него левого у1та. Эта проблема характерна для всех версий Excel УВА .' '(Выбор ячеек' справа налево приводит к~r~qявлению ошибки . времени выполнения· 1004 при попытке за- пуска, такого · макро~а.) · • · Наконец, выберите ячейку В2 под ячейкой со словом '_'Янв" и остановите запись макроса. Перед запуском макроса MonthNames2 выберите начальную ячейку, например, AlO . В этот раз макрос будет вводить имена месяцев в строке 10 начиная со столбца А. В за­ вершение своей работы макрос выделит ячейку под начальной ячейкой. Перед записью макроса, выделяющего ячейки, необходимо обдумать причины вь;бора абсолютных или относительных ссьшок. Если ячейки выбираются для ввода данных или указания области печати, стоит использовать абсолютные ссылки. Если необходимо запус­ кать макрос в различных областях листа, стоит использовать относительные ссьшки. Если для выбора посЛ:едней ячейки массива данных необходимо воспроизвести пове­ дение комбинации клавиш <Сtгl+клавиша управления курсором>, стоит воспользоваться относительными ссылками. Между относительными и абсолютными ссылками можi~о переключаться непосредственно в процессе записи макроса. Може'т потребоваться выде­ ление вершины столбца с применением абсолютной ссылки, после чего переключиться на использование относительных ссылок и воспользоваться комбинацией клавиш <Сt1·l+вниз> для выбора последней ячейки столбца и клавишей <вниз> для выбора сле- дующей свободной ячейки . ·
Пример использования VВА в Excel 49 Впервые возможностъ записи выбора блО'Ка ячеек с помощъю '}(омбинац,ии '}(Лавиши <Ctrl> и '}(Лави~и управления курсоjJом появиласъ в Excel 2000. Если въ~делитъ верхний ле­ вый угол массива данных, то, удеjJживая '}(Омбинац,ию <Ctrl+Shift> и нажав <..! ,> и <--7 >, можно въ~делитъ весъ блd'К даннъtх (если в блО'Ке отсутствуют промежут'}(и). Ес­ ли записатъ эти опер'ац,ии с применением относителънъ~х ссъtлО'К, ма'}(рос можно ис­ полъзоватъ для въtбоjJа бло'}(а переменной размерности. В предъtдущих версиях Excel за­ писъ~вался въtбоjJ бло'}(а исходного размера с применением абсолюmнъ~х ссъtл()'}С вне зави­ симости от режима записи. Редактор VBE Теперь пришло время познакомиться с процессами, которые происходят за кулисами. Если необходимо понять, что представляют собой макросы, попытаться модифициро­ вать макрос и прикоснуться к полной мощи языка VВА, придется науч:Иться пользоваться редактором VВЕ, который работает в собственном окне, отдельно от окна Excel. Пользо­ вателю предоставляется несколько методов активизации редактора VВЕ. Редактор можно запустить с помощью кнопки Peдaктop_Visual Basic (Visual Basic Edi- toг) на панели инструментов Visual Basic. Кроме этого , для активизации редактор а мож­ но нажать и удерЖивать клавишу <Alt>, после чего нажать клавишу <F l 1>. Комбинация· <Alt+Fll> выступает в роли переключателя , позволяющего переходить между окнами Excel и VВА. Если необходимо отредактировать конкретный макрос, воспользуйтесь ко­ мандой меню Сервисс::>Макрос<::>Макросы (Toolsc::>Macгoc::>Mac1·os) для открытия окна Макросы (Масгоs) , выберите макрос и щелкните на кнопке Изменить (Edit) . Внешний вид окна VВЕ показан на рис. 1.7. ~ Лист 1 Worksheet AlphoЬet;c Jc~t~~~d J Лнст l · O isp!4yPa9eBreaks:fa1se · Di·~p·1~YRiQhtT~l~f-t!F~~-~·· ~:~~~(~:~~OE~~~i::::::F.~~~:::::··:· EnaЬleCalc ulation ,True ~~:·t::~~:~:~~:::~~::::::···. ........................................................ .,..' . - iJ;ii••'(jj§J ш : l7:1---~8AProject (Книга.1) 9-·~ Мicrosoft Ехсе1 Object s ' :·· Q)HMll1фh · ··i![) Л>Кт2 (Лист2) ·i([J Л>КТЗ (ЛистЗ) . '·· -~ ЭтаКнwа Н· С1 Мodules ' ~ Мodulel SuЬ ИonthNames l () Mor1'tt -:Na.1:t1esl }la:r.poc: Макрос з аписан 10. Q.q . 2005 ( Lescl'linsky Oleg) ActiveCell. Offset (O, 1) .Range("Al") . Sel ect Act.ive:Ce:ll For-mulaR1Cl • "ЯН8 11 Act.iveCell.Of:fset.(0, 1 ) .Ranqe(,tAl") . Select Act.iveCell. FormulaRl Cl "' "Фе5'' Act. i v e Cell . Offset(O, 1 ) .Ranqe("Al") .Select Act.iveCell . FormulaR1C1 • "Нар " Active:Cell. Offset (O, 1) .Range ("Al") . Se: l e:ct ActiveCel l. For-mu l aRlCl = ".Anp" Acti veCell.Offset (O, 1) . Range ("Al") . Sel ect Act i veCell. FormulaRlCl "' "Май " ActiveCell . Offset(O, 1) . Ranqe("Al ") . Sele ct Active:Cell . FormulaRlCl • "Июн " - 6х Range(Select.ion, Selection.End(xlToLeft)) .Select Se lect ion. Font. Ite.lic "' True Selection .Font.Bold "' Tr- ue Encl SuЬ Рис_ J_7 . Записанный ма~срос в о~сне редактора VВЕ
50 Глава 1 Вполне вероятно, что после первого запуска реда'Ктора VВЕ на Э'Кране будет видна толъ'Ко панелъменю. Если панелиинстру.ментов отсутствую_т, выберите Viewc;>Too/bars (Виде;> Панели инструментов) и установиrпе флажО'К Standard (Стандартная) . Въtберuте Viewc;>Project Explorer (Вид90кно проекта) и Viewc;>Properties (Вид9Свойства) для отображения nО'Казаннъtх слева О'КОН. Если модулъ 'Кода справа отсутствует, въtnолните двойной щелчО'К на пи'Ктограмме Module 1 в окне Project Explorer (Окно проеюпа) . Модули кода Все макросы расположены в модулях кода. Один из модулей показан справа в окне VВЕ на рис. 1.7. Существует два типа модулей кода- стандартные и модули классов . На рис . 1.7 показан стандартный модуль. Модуль класса можно использовать для создания собственных объектов. Дополнительная информация о работе с модулями классов приводится в главе 6. Некоторые модули классов настроены предварительно . Они связаны с листами в кни­ ге, а один модуль класса связан со всей книгой. Эти модули видны в окне Project Explorer (Окно проекта) в папке Microsoft Excel Obj ects. Дополнительная информация об этих модулях приводится далее в данной главе . В книгу можно добавлять лю.бое количество модулей. Показанный выше мoдy.(.!ьModulel бьт добавлен механизмом записи макросов. В пределах каждого модуля может содержаться несколько макросов. В небольших приложениях'все макросы обычно стоит хранить в преде­ лах одного модуля. В больших проектах для организации кода не связанные друг с другом мак­ росы можно хранить в разных модулях. Процедуры В VBA макросы называются процедурами. Существует два типа процедур - подпро­ граммы и функции. Функции рассматриваются в след~ощем разделе. При записи макро­ сов создаiотся только подпрограммы. На рис. 1.7 показана пoдпpoгpaммaMonthNamesl, которая была создана в процессе записи одноименного макроса. Подпрограммы начинаются с ключевого слова Sub, после которого указывается имя процедуры , а также открывающая и закрывающая скобки. Конец подпрограммы обозна­ чается ключевыми словами End Sub. Существует соглашение, по которому код подпро- , граммы выравнивается относительно ее начала и конца, что значит~льно упрощает его чтение. Более глуб-окое выравнивание используется для выделения· фрагментов кода, на­ пример условий If и структур циклов . Любая строка, которая начинается с одинарной кавычки, является комментарием. Комментарии игнорируются интерпретатором VВА. Однако они являются важным ком­ понентом хорошей практики программирования . Кроме этого, комментарии можно до- бавлять справа от стр ок кода. Например : · :RangeJ"~вY"T .·seJ.ecГZ :~~1;3щ~л~~ги~·)151~f{[vi. J?г:= __ ·· ,~-···-~~-·- на этом этапе код кажется непонятным, но об общем смысле кода можно догадаться. Если просмотреть код подпрограммы MonthNamesl, можно заметить выделение ячеек и присвое­ ние названий месяцев в качестве значения формулы ячейки. Некоторые фрагменты кода можно редактировать. Например, если · название месяца было введено неправильно, его можно исправить в коде подпрогр~ммы; кроме этого, можно найти и удалить строку, уста­ навливающую полужирный шрифт. Также можно выделить и удалить весь макрос. Обрати­ те внимание на различия между макросами MonthNamesl и MonthNames2. В макросе MonthNamesl выбираются конкретные ячейки, например, Bl и Cl. В мaкpoceMonthNames2 для выбора ячеек в этой же строке справа от активной ячейки используется ключевое слово Offset. Уже сейчас стоит сказать, что возможности языка VВА стали доступнее.
Пример использования VВА в Excel 51 1 Окно проекта Окно Project Explorer (Окно проекта) является инструментом навигации. Каждая книга содержит собственный проект VВА. В окне Project Explorer (Окно проекта) выво­ дится список всех открытых проектов, а также их. компонентов (рис. 1.8). VBAProject (Книrаl) В ~ Microsoft Excel Objects i '·· ··i[JЛмстl (Лмстl) : , ···i[J Лмст2 (Лмст2) ' i····'- J ЛмстЗ (ЛмстЗ) ; ~····11:1 ЭтаКнига .[~;---~ Modules - ~... Рис. 1.8 . О~сно проекта Окно Project Explorer (Окно проекта) можно использовать для поиска и активизации модулей кода в пределах проекта. Для открытия и активизации модуля Достаточно выпол­ нить двойной щелчок на пиктограмме модуля. Кроме этого, в окне Project Explorer (Окно проекта) можно вставлять и удалять модули кода. Щелкните правой кнопкой мыши в лю­ бом месте окна Project Explorer (Окно проекта) и выберите меню lnsert (Вставка) для до­ бавления нового стандартного модуля, модуля класса или диалогового окна UserForm. Для удаления модуля Modulel щелкните правой кнопкой мыши на пиктограмме модуля и выберите пункт Remove Module (Удалить модуль). Обратите внимание, что для модулей, связанных с книгой и листом, эта операция недоступна. Кроме этого, код из модуля можно экспортировать в отдельный текстовый файл или импортировать из текстового файла. Окно Свойства В окне Properties (Свойства) всегда выводятся свойства активного объекта, которые можно изменить на этапе проектирования. Например, если щелкнуть на объекте Sheetl в окне Project Explorer (Окно проекта), то в окне Properties (Свойства) будут показаны следующие свойства. Свойство ScrollArea было установлено в значение Al:DlO для ограничения доступа пользователей к остальной части листа. . Propetl'te• - Пистt ® Рис. 1.9 . Устшю/1/Ш. своШ:rтюа обоекта
52 Глава 1 Поддерживается быстрый переход от свойства к соответствующей странице справоч­ ного руководства. Достаточно выделить свойство, например ScrollArea, показанное на рис. 1.9, и нажать клавишу <Fl>. Други~ методы запуска макросов Ранее было показано, как запускать макросы с помощью комбинации клавиш или из меню Сервис (Tools). Ни один из этих методов не оказался достаточно удобным. Для их использования необходимо довольно хорошо знать собственные макросы. Связав макрос с кнопкой, его можно сделать намного более доступным. Если макрос относится к определенному листу И будет использоваться в пределах конкретного диапазона листа, стоит встроить запускающую кнопку возле соответствую­ щего диапазона. Если необходимо применить макрос вместе с любым листом или книгой в любом диапазоне листа, то его можно связать с кнопкой на панели инструментов. Существует множесцю других объектов, с которыми можно связать макросы. Это ка­ сается списков, комбинированных списков, полос прокрутки, флажков и переключате­ лей. Все эти объекты называются элементами управления. Дополнительная инфор:-.1ация о них приводится в главе 10. Кроме этого, макросы можно связывать с графичес:КИ."\!И объектами на листе, например с геометрическими фигурами, созданными с помощью па­ нели инструментов Рисование (Drawing). Кнопки на листе В Excel 2003 предоставляются два разных набора элементов управления, которые могут быть встроены в лист. Один набор доступен на панели инструментов Формы (Foгms), авто­ рой- в панели 'инструментов Элементы управления (Contгol Toolbox). Панель инструмен­ тов Формы (Forms) унаследована от Excel 5 и Excel 95. Эти элементы управления используют­ ся в диалоговых листах Excel 5 и Excel 95 для создания диалоговых окон. В Excel 97 появились новые элементы управления ActiveX, которые доступны на Панели инструментов Элементы управления (Contгol Toolbox). Эти элементы управления можно использовать в диалоговых окнах UserForm в редакторе VВЕ для создания диалоговых окон. Для сохранения совместимости с более старыми версиями Excel, в Excel 97 и более старых версиях поддерживаются оба набора элементов управления и методы создания диалоговых окон. Если . сохранение обратной совм естимости с Excel 95 и Excel 5 не тр е­ буется, можно использовать только элементы управления ActiveX (кроме встраивания элементов управления в диаграммы; на данный момент в диаграммы можно встраивать только элементы управления Формы (Forms) ). Панель инструментов Формы Еще одной причиной использования элементов управления Формы (Forms) является простота их применения, так как они не обладают вtеми возможностями элементов управ­ ления ActiveX. Например, элементы управления Формы (Foгms) могут реагировать только на единственное предопределенное событие, которым обычно является щелчок мышью. Элементы управления ActiveX могут реагировать на большое количество событий, напри­ мер на щелчок м·ышью, двойной щелчок и нажатие клавиши на клавиатуре. Если эти воз­ можности не нужны, можно остановиться на использовании элементов управления Формы (Forms) . Для отображения панели инструментов Формы (Forms) необходимо выбрать пункт ВидqПанели инструментовqформы (ViewqToolbaгsqForms) . Для создания кнопки на листе щелкните на четвертой слева кнопке на панели инструментов Формы (Forms) (рис. 1.1 О).
Пример использования VВА в Excel 53 Рис. 1.10 . Панель инструментов Формы После этого кнопку можно перетащить на лист . Для этого нужно щелкнуть на листе в том месте, где долж~н находиться угол кнопки. Потом указатель необходимо перета­ щить в ту точку, в которой должен находиться противоположный угол кнопки. Откроет­ ся показанное на рис. 1.11 диалоговое окно, предоставляющее возможность связывания макроса с созданной кнопкой. jj~~~mm=Шlг·····················"· ===·····-~ Г oi( . J ! MonthNames 1 .,. ~1 !iiJHtl:).;i:J1ij1,~@~?-ifi!JNШ&!l\'!=;f~••••••••1 '· . , 1' -_ от_м _е н_ •_ _,1 1 1'--=!Jр.э-•к_•__, ! j ::<:'!11...:(iir~• . i j 1 ' j j L..--~;~~;~~~~:=-.:~;;;:;;--- =~~ Рис. 1.11 . Связывание макроса с кнопкой на листе Щелкните на кнопке ОК для завершения назначения. После этого можно отредакти­ ровать текст на кнопке, что позволит более ясно указать ее назначение. После щелчка на ячейке листа щелчок на кнопке приводит к запуску связанного с кнопкой макроса . Для редактирования кнопки щелкните на ней правой кнопкой мыши. Это приведет к выделе­ нию элемента управления и появлению контекстного меню. Если появление контекстно­ го меню нежелательно, удерживайте клавишу <Ctгl> и длЯ выделения кнопки щелкните на ней левой кнопкой мыши . (Не перетаскивайте указатель мыши при нажатой клавише <Ctl"l>, так как это приведет к созданию копии кнопки.) Если кнопку необходимо выровнять относительно направляющих линий на листе, нажмите и удерживайте клавишу <Alt> в процессе пер етаскивания указателя мыши. Если размер кнопки уже указан, выделите кнопку и удерживайте нажатой клавишу <Alt>, рас­ тягивая кнопку за белые Прямоугольники на краях кнопки. Перетаскиваемый край кноп­ ки будет выровнен по ближайшей направляющей линии. Панель инструментов Control Toolbox Для создания кнопки на основе элемента управления ActiveX щелкните на шестой слева кнопке панели инструментов Элементы управления (Contгol Toolbox) (рис. 1.12).
54 Глава 1 Рис. 1.12 . Панель инструментов Элементы управления При перетаскивании кнопки на лист приложение переходит в режим конструктора. В ре­ жиме конструктора щелчок левой кнопкой мыши позволяет выбрать элемент управления и начать редактирование. Для того чтобы элемент управления реагировал на события, реЖ1n1 конструктора нужно отключить. Для этого необходимо отключить пиктограмму режима кон­ структора на панели инструментов Элементы управления (Contгol Toolbox) или на панели управления Visual Basic, как rюказано на рис. 1.13. При создании командной кнопки ActiveX возможность назначения макроса не пре­ доставляется, но для кнопки необходимо написать процедуру обработки события щелчка. Процедура события является подпрограммой, запускаемой при возникновении события, например, при щелчке на кнопке. Для создания такой процедуры в режиме конструктора выполните двойной щелчок на кнопке. Откроется окно редактора VBE и. будет показан модуль кода, связанный с листом. В модуль будут вставлены ключевые слова Sub и End Sub, между которыми ' можно будет добавить строки кода из мaкpocaMonthNames2 , как показано на рис. 1.14 . Для запуска этого кода переключитесь обратно на лист, отключите режим конструк­ тора и щелкните на командной кнопке. Если необходимо внести изменения в j<Омандную кнопку, придется включить режим конструктора, щелкнув на кнопке Режим конструктора (Design Mode) . После этого мож­ но выбрать командную кнопку и изменить ее размер и положение на листе . Кроме того, ._можно вывести свойства кнопки, щелкнув на кнопке · правой кнопкой мыши и выбрав Свойства (Ргоре1·tiеs) • из контекстного меню. Откроется окно Свойства (Pгope1·ties), по­ казанное на рис. 1.15. Рис. 1.13. Создание командной кноп~си
Пример использования VВА в Excel 55 .v. Книrа1 - Лнст1 (Code) ~§~ Jco.mmend~~on1 Private SuЬ Comme.ndButton1 Click() Call MonthNameэ2 1 - End SuЬ Рис. 1.14. Код обработ~ш события для команд­ ной кноп~ш .., .. LОё~·а········ !тrue ~::::~t~r ЩJ~~:~ti.~i~~iP~i>t~;O.~i~~1\· Picture i(None) ' PicturePosition ·:·1:?::~.:~~~i~(~i~~O~~j06~~~~~.; Рис. 1.15. Свойства объекта CommandButton Для изменения текста на командной кнопке измените значение свойства Caption. Кроме этого, можно указать шрифт надписи и цвет фона и текста. Если кнопка должна удовлетворительно работать и в Excel 97, желательно изменить значение свойства Take- FocusOnClick на False (г;:о умолчанию принято значение True). Если при щелчке кнопка Получает фокус, Excel 97 не позволит присваивать значения некоторы~свойст­ вам, например, cвoйcтвyNumЬerFormat объекта Range. Панели инструментов Если макрос необходимо связать с кнопкой на панели инструментов, можно модифи­ цировать одну из встроенных панелей инструментов ~и создать собственную панель. Для создания собственной панели инструментов воспользуйтесь командой Вид~па-нели инструментов~Настройка (View~Toolbars~Customize) . Откроется окно Настройка (Cus- tomize). Щелкните на кнопке Создать (New) и введите имя новой панели инструментов (рис. 1.16).
56 Глава 1 Па!j_ели жструментов: - ---- -- -- ----· 0 Во в ~~~.~-~J~!!:!P.~~=~~~~-~---·-·-···--···-·--··-··--·-··, RJ ВЬIХО [МonthTools j О Грони ' ·· ···· ······ ···················- · · · ·· · · ·· ············· ·- ~: · ·· :· ·· ·-······ ····· ···· ·· ·· · · ·· · ·· ' О диагр ОК. . 11 Отмена J Однагр----------.-..,.....--_. О Зав11снмост11 1 В Защнта : НаеrтроНка юображення fO Настроi1ка объема ;,; .: ..." ' [О Настроi1ка тенн .:5::::.:. Закрь1ть • Рис. 1.16. Создание новой панели инструментов В диалоговом окне Настройка (Customize) активизируйте вкладку Команды (Commands) и выберите категорию Макросы (Macros). Перетащите объект Настраиваемая кнопка (Custom Button) с пиктограммой улыбающегося лица на новую или уже существующую панель инструментов . После этого щелкните на кнопке Изменить выделенное (Modify- Selection) или щелкните правой кнопкой мыши на кнопке новой панели инструментов для получения доступа к контекстному меню. Выберите пункт Назначить макрос (Assign Масго) и имя макроса (в данном случае это MonthNames2), который будет назначен кнопке. Кроме этого, щелкнув на кнопке Выбрать значок длЯ кнопки (Change Button Image), можно изменить пиктограмму на кнопке. Можно назначить существующее изображение из предоставленной библиотеки или отредактировать изображение, щелкнув на кнопке Изменить значок на кнопке (Edit Button Image) . Обратите внимание , что при внесении этих изменений диалоговое окно · Настройка (Customize) должно оставаться открытым. Желательно ввести описательный текст в поле Имя (Name). Этот текст будет выводиться на экран во всплывающей под­ сказке. После этого диалоговое окно Настройка (Customize) можно закрыть. Для запуска макроса выберите начальную ячейку для названий месяцев и щелкните на но­ вой кнопке на панели инструментов. Если новую панель инструментов необходимо передать другим пользователям вместе с книтой, панель инструментов можно связать с книгой. После этого панель инструментов будет появляться на компьютере другого пользователя сразу при открытии книги (если панель инструментов с таким же именем еще не существует). При связывании · панми инструментов с 'Книгой возни'Кает потенц,иалъная проблема. Та'К ~са'К Excel не заменяет существующие паН!Ии инстру.ментов, может исполъзоватъся панмъ инструментов, присоединенная 'К более старой версии ~шиги. Решение этой про­ блемы предлагается в следующем раздме при описании процедур обработ'Ки собъ~тий. Для присоединения панели инструментов к активной книге воспользуйтесь командой ВидqПанели инструментовqНастройка (ViewQToolbarsQCustomize). Откроется диало­ говое окно· Настройка (Customize ). Активизируйте вкладку Панели инструментов (Toolbars) и щелкните на кнопке Вложить (Attach) . Откроется диалоговое окно Управ­ ление панелями инструментов (Attach Toolbars) , показанное на рис. 1.17 .
Пример использования VВА в Excel 57 Панели КНИ[И: с·--~--- --zl jMonth Тools ,~'I [R,,..,.,, »=1 1 1 1 1 ~-----;__J ОК J\ Отмена J \ Рис. 1.17 . СвяЗывание панели инструментов с книгой Выберите имя панели инструментов в левом списке и щелкните на кнопке Копировать >> (Сору»). Если к книге присоединена более старая версия панели инструментов, выберите па­ нель инструментов в правом списке и щелкните на кнопке Удалить ' (Delete) (эта· кнопка доступна при выборе пункта из правого списка) для ее удаления. После этого выберите имя Панели инструментов в левом списке и еще раз щелкните на кнопке Копировать >> (Сору>>). Щелкните на кнопке ОК для завершения подключения панели инструментов и выхода из диалогового окна Настройка (Customize). Процедуры обработки событий Процедуры обработки событий являются специальными функциями, которые вы­ полняются в Ьтвет на возникающие в Ехсе! события. Среди событий можно выделить действия пользователя, например щелчок на кнопке, и действия системы, например пе­ ресчет содержимого листа. Начиная с Ехсе! 97 в Excel предоставляется множество собы­ тий , для которых можно создавать обрабатывающий код. Хорошим примером является процедура обработки события щелчка для командной \ кнопки ActiveX, запускающей макрос MonthNames2. Код для этой процедуры обработки события вводился в модуль кода, связанный с листом, в которой встроена командная кнопка . Все процедуры обработки событий хранятся в модуле кода, связанном с книгой, листом, диаграммой или диалоговым oкнoмUserForm. Для просмотра доступных событий можно активизировать модуль (например модуль ЭтаКнига), выбрать из левого раскрывающегося списка объект, например Workbook, и активизировать правый раскрывающийся список (рис. 1.18). Процедура обработки события Workbook_Open () может использоваться для ини­ циализации книги при откр~,rтии ~ Код может быть достаточно про стым, например акти­ визировать определенный лист или диапазон для ввода данных. Код может быть более сложным и обеспечив~ть создание новой панели меню для книги. Дnя сохранення совместимостн с Excel 5 и Excel 95 в стандартном модуле можно соз" дать подпрограмму, которая называется Auto_Open.() н запускается пр11 открыт11и кн~- · ги. ЕслИ При этом одновременно существует лроЦедура W:orkЬook_Open ();она ;;ianyc- ~:4 кается в первую _очередь .
58 Глава 1 "'- Кннrа1 - ЭrаКннrа (Code) ~rgj/1Xl Private SuЬ \Jork:Ьook...:_Ppen() · End SuЬ eforeXmlExport eforeXmllmpor1 eeictiverte ewSheet ~;v~a111!т1.1>1.lllcю1s1ec1o1nnect•Юn•••••••••f~ 1:;:~~o~oмectlon ~E#- heetBeforeDouЫeClick heetBeforeRlghtClidc heetCalculate heetCMnge Рис. 1.18. События, доступные в модуле ЭтаКнига Не сложно заметИть, что выбор событий достаточно велик. Некоторые события, на­ пример BeforeSave и BeforeClose, допускают отмену события. Следующая проце дура обработки события запрещает сохранение книги, пока в ячейке Al листа Sheetl небу- Кроме этого, такой код :иредотвращает закрытие окна Excel. Удаление присоединенной панели инструментов Как было показано ранее в этой главе, если к книге присоединена панель инструмен­ тов, при отправке новой версии панели инструментов вместе с книгой может возникнуть проблема. Такая же проблема возникает, если по.льзователь сохраняет книгу под другим именем. При открытии новой книги существующая панель инструментов не замещается, а старая панель инструментов запускает макросы из старой книги . Одним из решений, позволяющих снизить вероятность этой проблемы, является уда­ ление собственной панели инструментов при закрытии книги: !J?r.iyat~ 'silБ workБook:Jз~J:areciose (caiice1 . A .s -вoblean· · --~ · 1 On Error Resume Next {. _(l:pplication:. cori]riiЭ; ~~л9.{§У:1?~,:;"" J....,=•.;.. .• .э.,':;:11~·:ш. Оператор On Error обрабатывает ситуацню, когда пользоватець вручную удаляет панель инструментов перед закрытием книги. Если не добавить оператор On Error, то при попытке удаления отсутствующей панели инструментов приложение выдаст сооб­ щение об ошибке времени выполнения. Оператор On Error Resurne Next _заставляет приложение игнорировать сообщения об ошибках и продолжать выполнение со следую­ щей строки кода.
Пример использования VВА в Excel 59 Определенные пользователем функции В составе Excel. предоставляется множество встроенных функций листов, которые можно использовать при создании формул в ячейках. Для просмотра списка функций можно выбрать пустую ячейку на листе и воспользоваться командой меню Вставкаq Формул а (InseгtQFoi-mula) . Среди наиболее часто используемых функций можно выде­ лить СУММ, ЕСЛИ и VLOOKUP. Если необходимая функция отсутствует в составе Excel, с помощью VВА можно определить собственную функцию. Определенные пользователем функции позволяют снизить сложность листа. Слож­ ные расчеты с множеством промежуточных результатов в нескольких ячейках можно уп­ ростить до единственной формулы в одной ячейке. Кроме этого, определенные пользо­ вателем функции можно применять для повышения производительности пользователей, если некоторые из них применяют одни и те же процедуры расчетов. Можно даже соз­ дать библиотеку функций, специфичных для конкретной организации. Создание определенных пол ·ьзователем функций В отличие от ручных операций, определенные пользователем функции записать невоз­ можно. Такие функции необходимо создавать с нуля на основе стандартного модуля в ре­ дакторе VВЕ. Для вставки стандартного модуля необходимо щелкнуть правой кнопкой мы­ ши на окне Project Explorer (Окне проекта) и выбрать пункт lnsertqModule (ВставкаQ Модуль). Простой пример определенной пользователем функции показан ниже: rFunctlon "cёn'i:.igradётoFahr.enhei't (Centigracie) k. CentigradeToF:ahrenheit ; = Centigrade * 9 / 5 + 32 1Eцg". E):1I19tion. .• ~ ... -· ·· ... Функция CentigradeToFahrenhei t () предназначена для преобразования градусов по Цельсию в градусы по ФаренгейТу. В ст~лбце А на листе можно указать значения тем­ пературы по шкале Цельсия и воспользоваться функцией Cent igradeToFahrenhei t () для получения соответствующих значений температуры по шкале Фаренгейта в столбце В. Если выделить ячеЙJ..)' В2, то определенная пользователем формула будет показана в строке Ф о рмула (Foгmula) (рис. 1.19). В ячейки диапазона В3:В13 была скопирована формула. Главным отличием подпрограммы от функции является возвращаемое значение функции. Функция CentigradeToFahrenhei t () возвращает числовое значение, вы­ водимое в ячейке листа, в которой указана функция CentigradeToFahrenhei t (). Для возврата значения оно присваивается имени функции. · Функции обычно получают ОДИН или несколько входных параметров. ФyнкцияCen­ tigradeToFahrenheit () получает один параметр, который называется Centigrade. Этот параметр используется для расчета возвращаемого значения. При вводе формулы =CentigradeToFahrenheit (А2) значение ячейки А2 передается функции в качестве значения параметра Cent;igrade. Если в качестве параметра функции передается значе­ ние О, функция возвращает значение 32. Результат передается обратно и выдается в виде значения ячейки В2, как показано ранее. То же происходит в каждой ячейке, содержащей ссылку на формулу =CentigradeToFahrenhei t (). '
60 Глава 1 ест~ Фор~[от_ ~- 11.•нные Qю-ю · - 6х •• 1~•.10 .:,iжк 9. ' "":;;;: """~L~ %1ЕВ·&•.А· f.i =CentigradeToFahrenheit (A2) В С D !По Цельсию j По Фаренгей;у · .. •• :QI 32[ 30: 4о: 50: 7с)Г 8оГ ···· ················· 90:·· 50 68 86. 104 · 122 140 158 ! 176 194 ; 212; .... f,J 12 13 111-1 _4-; ......... ...·····...... ............. . J ... ..............f .. 15 1 ;/~ . ;;~;~~~!~L~iii/ . : ·J{Jj~~~,;;;1 .. Готово Рис. 1.19. Использование определенной пользователем форАtулы Еще один пример снижения сложности формул на листе показан на рис . 1.20. Табли­ ца поиска в ячейках A2:D5 содержит цены каждого продукта, граничный объем для полу­ чения скидки и процент скидки после превышения граничного объема. При использова­ нии обычных формул листа для расчета суммы пользователям пришлось бы применять комбинацию из трех формул поиска с логическими проверками. ' А с D Е i Продукт : Цена ' Граничный объем для скидки · Скидка : i~ppj~~~~~-:=··......... :·===!-~-=~-·:::~~:==::::. :.=~-:··--=:·===:_:==: jQ(-- . -~f{ ::__ ....... : мangos . 30 50 10%' 4 :.i~~9i~=c.•.:::=-:======~=:::::===-::=:·::==:::=·:==··: :· ·j9g·~--- ··-· · s01~г ···· - -· - · ··· 5 : r:.Щ!r!. __ _;____ --· --··---·-·· )~~----· "". -- ···--- -·---- -- ----- -."..J . . OQ ... -····-§"(~ j-· -- -- 6 :--··· --······ ....i..··················-···- - ....1 ····-···· .............."....." .. -- ·-··· . .......• ··········-·· ~ :f~~~i=~:9~6-:=~=:~3:~-~;~~I :~~Г:: ~-.: ··--- 10 1дiJiJiё5· -т -·-· 15·0 ~----- · --- - -··-···· ----- ·· 1475 . - "- 11 1м_~9.оi:т:==::=~==::==-J.о:.==:=:===:=:=:::_::.= ===~- =-=~-.::.Ш:i~о ::: . ···-· · --- -- -- -у -- • , .~" ·r--"-·~-k·---~---~- 12 it:P..P!~!'i....J ....... ..... -···-·-·-~Q.:.. .... .... . "ш ••••·• -• ·• · ·· · ···••• ·· 200 ' .... "..", ·ш••"• " . • •••, 13i ..."__ ;__ ..... "".. .... "..." .. 14 ! ··---"--.."....:."................•......"..__; __......•.. •..... -- . .. ; .." ·---···-J 15i . 1 1 ;•'~,:;·=:;к~-~E;~~;.;~~;~1~1====·=:=:::.::::_:::=:==j~~~;~~~~i~---+··-- · · · ·- - ; ;;fit) Готово Рис. 1.20. Использование формул для снижения сложности расчетов
Пример использования VВА в Excel 61 Функция InvoiceAmount () использует три параметра: Product содержит имя про­ дукта, Volurne содержит количество продаваемых единиц, ТаЫе содержит таблицу по­ иска. Формула в ячейке CS определяет диапазоны для каждого параметра: "'Function 'inV'oi ceNoюU.n t (вyvai· Prod.uct- A .s · str~ng, _ · · ByVaJ Volume As Integer, ByVal ТаЫе As Range) ··· Поиск цены в таблице Price · = WorksheetFunction. VLookup (Pr,oducti' ТаЫе, .· 2) , . ' Поиск граничного объема для получени.я скидки DiscountVolume = WorksheetFunction. VLookup ( Prpd'uct ' · ТаЫе, 3) Сравнение объема с граничным объемом для определения возможно'С:: ти предоставить скидку If ' Volume > DiscountVolurne Then " - подсчитать цену со скидкои Else DiscountPercent = WorksheetFunction.VLookщ;>(Product, InvoiceArnount = Price * DiscountVolurne + Price * _ (1 - DiscountPercent) * (Volume - Disco'uq.,tVolume) ' подсчитать цену без скидки ' InvoiceAmount = Price * Volume End I.f таые, 4) Используется абсолютный диапазон таблицы, что позволяет формулам ни.Же ячейки CS находиться в одном и том же диапазоне. Сначала в функции используется функция VLookup, которая позволяет найти продукт в таблице поиска и получить соответствую­ щее значение из второго столбца таблицы. Полученное значение присваивается пере­ менной Pri ce. Если в процедуре VBA '/iеобходимо исполъзоватъ фуюсции листа E xcel, и'liтерпретатар VВА должт З'liатъ, где '!iайти эту фующию. Для этого перед uме'/iем фун?Сции необхо­ димо добавитъ WorksheetFunction и точку . Для сохранения совместимости с Excel 5 и Excel 95 вместо WorksheetFunction .можно у?Сазатъ Application. Не все фун?Сции листа доступ,нъt тa?Cw.t образом. Если фун?Сцuя О?Сазъ~вается недоступной, Э?С­ вивалттная ей фун?Сцuя (или математический оператар) доступ'/iа в VВА и выполня­ ет ту же операцию. В следующей строке функции выполняется поиск граничного объема для получения скидки. Полученное значение граничного объема присваивается переменной Dis- countVolurne. Проверка If в следующей строке сравнивает продаваемый объем в пере­ менной Volurne со значением переменной DiscountVolume. Если значение Volurne больше, чем DiscountVolurne, выполняются расчеты до оператора Else. В противном случае, выполняются расчеты пос.Ле оператораЕls е. Если значение Volurne оказывается больше Discount Volume , в таблице выполняет­ ся поиск процента скидки и найденное значение присваивается переменной Discount- Percent. После этого рассчитывается стоимость заказа. Для этого объем заказа в пере­ менной DiscountVolurne умножается на цену единицы товара. После этого к стоимости заказа добавляется цена со скидкой всех единиц товара свыше DiscountVolurne. Обра­ тите внимание на использовани е символа подчеркивания, перед которым указывается символ пробела. Такая комбинация обозначает продолжение кода на следующей строке .
62 Глава 1 Результат присваивается переменной с именем . функции, InvoiceAmount. Зн ачени е этой переменной будет возвращено в ячейку на листе. Если значение переменнойVо l urnе не превышает значение переменной DiscountVolurne, стоимость заказа рассч итьmается как произведение цены и количества единиц продукта. Значение произведения присваи­ вается переменной с именем функции. Непосредственная ссылка на диапазоны При определении функции вместо использования параметров можно непосредстве н­ но ссылаться на диапазоны листа. Эта возможность демонстрируется в следующе й фун к­ ции InvoiceAmount2 (): Обратите внимание, что переменная ТаЫе больше не является параметром функ­ ции . Вместо этого оператор Set определяет переменную ТаЫе с помощью непосред­ ственной ссылки на диапазон листа. Хотя этот метод работоспособен, возвращаемое зна­ чение функции не будет пересчитываться при модификации соде.ржимого таблицы по­ иска. Excel не осознает необходимости пересчета функции при изменении содержимого таблицы, так как не знает, что таблица используется в функцИ:и. Excel пересчитывает определенные пользователем функции только при изменении входных параметров. Если таблицу поиска необходимо исключить из списка параметров функции, но при этом сохранить возможность автоматического пересчета, функцию можно определить, кaкvolatile. Такое определение функции показано ниже: PuЬlic Function InvoiceAmount2(ByVal Prod As String, ByVal Volume As ~nteger) As DouЫe Dim ТаЫе As Range Set TaЬle=ThisWorkbook . W~rksheets ( "Sheet2") . Range ( " А2: D5") Но стоит обратить внимание, что такая возможность имеет свою цену. Если опреде­ ленная пользователем функции объявлена, как vo latil e , функция будет пересчиты­ ваться при изменении любого значения на листе. Если функция используется в большом количестве ячеек, накладные расходы на пересчет функций могут стать заметны.
Пример использования VВА в Excel 63 Чего не могут определенные пользователем функции Распространенной ошибкой многих пользователей является попьrrка создания функции, которая меняет структуру листа (например, путем копирования диапазона ячеек). Такие по­ пытки завершаются неудачей. Сообщения об ошибках не выдаются, так как Excel просто иг­ норирует соответствующие строки кода и причина неудачи оказывается неочевидна. Вы.Э'ь1в~емые из ячеек листа определенные пользователем функции . не могут менять структу­ ру листа. Это значит, · что такая функция не может вернуть значение не в ту ячейку, из кото­ рой она бьtла вызвана. Кроме этого,, такая функция не Изменяет физические характеристики ячей~(И, нагiрим~р Цвет шрифта или цвет фона. Также определенные пользователем функции не выполняют такие операции, как копирование и перемещение ячеек листа. Определенные пользователем функции .даже не могут выполнять операции, неявно подj:>азумеваю~е пе­ р~мещение курсора, например, вызывать. команду Правка9Найти (Editi:::>Find). Определен­ ная Пользователем функция может вызывать другую функцию или даже подпрограмму, но эти процедуры оказы·ваются связаны теми же ограничениями, что И опреде.гfенные пользова­ телем функции. Им также нельзя модифицировать структуру листа. Интерпретатор VВА в Excel различает определенные пользователем функции, которые применяются в яЧейках листа, и функции, не связанные с ячейками листа. Если исходная процедура не являлась определенной пользователем функцией в ячейке листа, функция может выполнять все допустимые в Excel операции, как и обычная подпрограмма. Стоит обратить внимание, что определенные пользователем функции работают не так эффективно, как встроенные функции листа Excel. Если на листе применяется боль­ шое количество определенных пользователем функций, время пересчета листа окажется больше, чем при использовании такого же количества встроенных функций Excel. Объектная модель Excel Язык программирования Visual Basic fи Application используется во всех приложени­ ях из состава Micгosoft Office. Кроме Excel, язык VBA может применяться в Woгd, Access, PoweгPoint, Outlook, FrontPage и Pгoject. Изучив язык, его можно использовать в любом из этих приложений. Но для работы с конкретным приложением необходимо ознако­ миться со списком доступных объектов . В Wo1·d приходится работать с документами, аб­ зацами и словами . В Access предоставляются объекты баз данных, наборов записей и по - лей. В Ехсе! доступны книги, листы и диапазоны. · В отличие от множества других языков программирования, в VВА для Office нет не­ обходимости создавать собственные объекты. В приложении четко определено множе­ ство объектов : организованных в · определенную иерархию. Эта структура называется объектной моделью приложения. Этот раздел можно рассматривать как введение в объ­ ектную модель Excel. Полное описание объектной модели приводится в приложении А (это приложение также доступно на сайте www. wrox. com). Объекты Для начала рассмотрим базовые понятия, характерные для объектно-ориентирован­ ного программирования. Это не формальное описание , и его достаточно для понимания принципов работы с объектами Excel. В основе объектно-ориентированного программирования лежит возможность деле­ ния всех известных сущностей на классы. Экземпляры классов называются объектами. Вы и я являемся объектами класса Личность. Такими же объектами являются мир и вс е-
64 Глава 1 ленная. В Excel объектами являются книга, лист и диапазон . Кроме перечисленных объ­ ектов , в объектной модели Excel доступно еще около 200 объектов. Рассмотрим ряд при­ меров использования объекта Range в коде VВА. Ссылка на ячейки диапазона В2 : С4 мо­ жет выглядеть следующим образом: .J<c:ip.яe. c·~~2. =.S::.4., Если диапазону ячеек присвоить имя Data, это имя можно использовать таким же об­ разом: Кроме этого , существуют способы ссылаться на текущую активную ячейку и текущее выделение. В ситуации, показанной на рис. 1.21, свойство ActiveCell ссылается на ячейку В2, а свойство Selection - на диапазон В2:Еб. · Рш. 1.21 . Ра:лшца между ттсущи.м выделтшем и актшпlой ячейкой Коллекции В кол1:1 екцию входит несколько объекто:~;~ . Городской квартал является коллекцией зданий . Здание является коллекцией обЪектов этажей. Коллекция объектов сама являет­ ся объектом, хранящим другие, тесно связанные, объекты. Коллекции и объекты часто формируют иерархическую структуру или структуру в виде дерева. Даже приложение Excel является объектом . _Этот объект называется Application. В него входит коллекция Workbooks, в которой хранятся объекты WorkЬook для всех открытых книг . Каждый oб'l;>eктworkbook содержит коллекцию Worksheets, в которой хранятся объекты Worksheet для листов этой книги .
Пример использования VВА в Excel 65 Если необходимо сослаться на члена коллекции, можно указать его позицию в кол­ лекции (номер индекса, начиная с 1) или имя (текст в кавычках). Если в определенный 1 момент открыта только одна книга, которая называется Data. xls, на нее можно со- слаться с использованием следующих операторов: :wo:rkь0·0ы· <1 J ;}'iicф~J;>oя~::>J '')}а to:, х~§ ;· ) Если в активной книге открыто четыре листа, называемые North, South, East и West (именно в таком порядке), на второй лист можно сослаться одним из следующих операторов: w0r:r<·sьeet.sт2т · · LW.O:i:-ksJ:~eet(s ("South") Если необходимо сослаться на лист Data i nput в книге Sa l es . x l s, но книга Sa l es. xls не является активной, ссылку на лист необходимо квалифицировать с помо ­ щью ссылки на книгу, разделив квалификаторы точкой, как показано ниже: :'i'Joi:кJ:).9.9J{iiJ ;, s~le~ :x{s") .worksh.eets eьat.}i;r:ni:>_it "Т::·-:.: ' ~""""'·~-. С точки зрения объектно-ориентированного программирования символы>, <, = и . называются операторами. Точка (.) называется оператором членства. Например, можно сказать, что коллекция Worksheets является членом класса Workbook. Если в определенный момент активна . другая книга, то для ссылки на ячейку В2 .на листе Datainput необходимо использовать следующий код: !Workoo_oJS§J ·~aJ,i.s : xl9 _:· J . wor:K~[~ej;.§(.~l:J.?,_t~]:n)21} t~")" ' R~n.9'~_(:_13:;z,_:·· [....,~~=" Предполагается, что оператор Workbooks ( "Sales. xls " ) возвращает экземпляр класса Workbook. Оператор . Worksheets ( "Datainput") возвращает единственный объект Worksheet, а оператор . Range ( "В2") - единственный диапазон . Интуитивно можно догадаться, что вся строка извлекает один объектWоrkЬооk, один объект Wo r k - sheet и конкретный диапазон. Теперь можно более подробно рассмотреть объекты и методы манипуляции объекта­ ми из кода VВА. Существу~т четыре ключевых характеристики объекта, о которых нужно помнить. Это поля, свойства, методы и события, связанные с объектом. Поля Поля представляют собой переменные, хр.анящие состояние объекта . Поля могут со­ держать любую информацию, которую должны ЗН<!ТЬ экземпляры классов. Например, класс Customer должен знать имя потребителя. Выражение "должен знать" используется из-за того, что необходимая информация зависит от проблемной области. Если расши­ рить данный пример , то класс Customer до:11жен получать доступ к информации Em- ployer Identification Numbeг (EIN). Но если потребители не являются юридическими лицами, номер EIN не имеет никакого значения, а номер социального страхования имел бы больший смысл в данном случае . Вот пример поля EIN : i;P1::5;'Y:JiI§ F]>ffip~oymeni:rdёnt1 tf~aП6J1!iЧ~e}:: 11;5. ~ ~Eririg· ··::, .. Следуя этому соглашению , будет использован префикс F - для того, чтобы указывать, что имя является именем поля (для свойств префикс F- не используется; свойства рас­ сматриваЮтся в следующем разделе). Еще одно соглашение предполагает, что поля объ­ являются частными и доступ к ним осуществляется опосредованно через свойства. Мо­ дификаторы доступа (например, Private) более подробно рассматриваются в главе 5.
66 Глава 1 Свойства Свойства являются результатом определенного развития. Изначально классы имели только поля и методы. Через некоторое время оказалось, что для обеспечения допусти­ мости присваиваемых значений поля нуждались в соответствующих методах. Свойства стали результатом смешения простоты использования и проверки действительности. Свойства на самом деле являются специальными методами, которые для потребителя (пользователя класса) выглядят как поля, но ведут себя и программируются создателем (автором класса) как методы. Свойства обеспечивают управление доступом к информа­ ции о состоянии объекта. Следовательно, свойства являются атрибутами, как и поля. В свойствах неявно ком­ бинируется поведение вызова метода и простота обращения к полю. Существует согла­ шение , по которому имена свойств ·совпадают с именами полей без префикса F-. Другие авторы книги могут придерживаться других соглашений. Вместо того чтобы делать вид, что различия в соглашениях по именованию не существуют, можно выбрать подходящее соглашение и следовать ему при создании собственного кода. (В других соглашениях по именованию префиксы используются для предоставления информации о типе данных поля или свойства. Выберите одно из соглашений и применяйте его постоянно :) Свойства в Ехсе! можно рассмотреть на примере объекта Range. Объект Range имеет свойство RowHeight и свойство ColumnWidth. ОбъектWоrkЬооk имеет свойство Name, в котором хранится имя файла. Некоторые свойства предоставляют механизм изменения значения, например , свойство ColumnWidth объекта Range. Для этого свойству можно просто присвоить новое значение. Другие свойства, например, свойство Name объекта Workbook, предназначены только для чтения. Для изменения значения свойства Name недостаточно просто присвоить новое значение . Ссылка на свойство состоит из имени объекта, после которого указывается название свойства. Имена объекта и свойства разделяются точкой (оператором членства). Напри­ мер, для изменения ширины столбца, в который входит активная ячейка, и установки ширины в 20 пунктов свойству ColumnWidth объекта Act i veCel 1 необходимо присво­ ить значение 20: Для ввода имени "Florence" в ячейку ClO это имя присваивается свойствуVаluе объ­ екта Rаngе: Если интересующий объект Range находится не на активном листе активной книги, необходима более конкретная ссылка на объект: :i;lg:f)S'Q9Q.Jf~I[.:$9Д:_Ei~ ,_;Ii§.;o:r:; и:.;{~]~§Ц~~§~ t1rpjt:[:lliQ.\i~I":J~--~Ц:9:§I:::Q:(g '· I::.v~J;il.§~'~J::+9s!J~I~i
Пример использования VВА в Excel 67 В предыдущих примерах было показано, как присваивать значения свойствам объек­ тов. Кроме этого, значения свойств объектов можно присваивать переменным или свой­ ствам других объектов. Следующий код можно использовать для непосредственного при­ своения ширины одной ячейки на активном листе ширине другой ячейки: [~~i}g§J:'G.t.'J~,(;:9.Ju.niriWJ"Sitli: §..: ~~1l_ge_C· АУ'·), . co1!--!11Ui>:Yisi!h : ".. ···"*''"""."""""'"'' Значение ячейки Cl активного листа можно присвоить ячейке DIO на листе, который называется Sales. Для этого можно применить следующий код: iWork:SK~~~.s..::c;:~~~~§~"-Г~ilЯ~l: "R~O~"l·.~y(iiue.·:-~ . RSJ.nge\".t;'h:::1~·2:~itI~ --,&,~~-::·:: Значение свойства можно присвоить переменной для дальнейшего использования в коде. В этом примере текущее значение ячейки MIOO сохраняется в переменной, ячей­ ке MIOO присваивается новое значение, на экран вьrводится автоматически пересчитан­ ный результат, и ячейке MIOO присваивается первоначальное значение: : Oi;)eriingstoёk ; R.аngё(•мrьь"·т .\raiue ·· · - ,,...".. " ." .•."... Range ( "MlOO") . Value = 100 ~ActiveSheet.PrintOut .· · ' ~13:<:!:!1!;!.е c~~J..99.::J : V_9:J!:!!' 7.~.9.E~ll~J!Яe!-В.CJ5 '· . ~".'. ". Некоторые свойства предназначены только для чтения. Это значит, что непосред­ ственное присвоение значения этим свойствам невозможно. Иногда существует опосре­ дованный способ. В качестве примера можно привести свойство Text объекта Range. Для ввода значения в ячейку оно присваивается свойствуVаluе. Для определения фор­ мата отображения чисел в ячейке используется свойство NumЬerFonnat. Свойство Text позволяет получить уже отформатированное содержимое ячейки. В следующем примере в окне сообщения выводится строка $12,345.60: 'R.ange г· вiо ••т :va:Iue""';; •12з 4·5:-б· Range("BlO") .NumberFormat = " $#.##0.00 " }f~~.вох)':~Я~С::.,Щ.Q") .т~t:~·~~""'~. - · Это единственный способ, с помощью которого можно изменить значение свойстваText. Методы В то время как свойства являются квалифицирующими характеристиками объектов, ме­ тоды являются операциями, которые могут выполняться объектами или над объектами. С лингвистической точки зрения классы можно рассматривать как существительные, объ­ екты - как экземпляры существительных , поля и свойства - как прилагательные, а мето· ды - как глаголы. Методы часто используются для изменения свойств объекта. Зоолог мог бы определить класс Человек разумный с глаголом Ходить. Глагол Ходить мог бы реализо­ вываться в терминах Скорости, Расстояния и Направления, которые позволяют получить новое Положение. Компания по выпуску кредитных карт могла бы реализовать класс Кли­ ент с методом Расход. Оплата за товары (метод Расход) может приводить к уменьшению доступной кредитной линии (свойство ДоступныйКредит) . Простым примером метода в Excel является метод Select объекта Range. На метод можно ссылаться как и на свойство: сначала указывается имя объекта, а потом точка и имя метода (а также необходимые параметры). 'Возвращаясь к методу Ходить, можно выделить так:Ие параметры, как расстояние, направление и время работы метода. Резуль­ татом ~аботы метода будет новое Положение .(предполагается, Что известно текущее по­ ложение). Следующий код позволяет выделить ячейку G4: :в.a:ng:j~·.u g:4•г-; se ieёi:: ."",.,.._·~~~-~-·~- ·~
68 Глава 1 Еще одним примером является метод Сору объекта Range. Следующий код копир ·ет диапазон Ai:B3 в буфер обмена: , Часто методы получают параметры (или аргументы), используемые для управления работой метода. Например, метод Paste объекта Worksheet позволяет вставлять со­ держимое буфера обмена в лист. Но если не указать место, в которое будут вставлятъс.я данные, верхний левый угол вставляемых данных будет находиться в активной ячеШе. Для переопределения такоr:.о поведения используется параметр Dest i nat i on (парамет­ ры рассматриваются далее в этом разделе) : ~f:t д,1f:~si5~~fi:t .'f ai ~~;~D~§.(ЦI~I~~;f]3:_~lli:J.IO :~-~В::':I2~-:~. ~ .~---·,. ·:: ";,: ~;.::::::;.~- .. ане=. Часто методы Excel позволяют применять щ>ротк~ форму записи. ПредыдуJШiе примеры использования методов Сору и Pas t e могут быть записаны одной строкой: iR~ч9~.I::i{l~:J33 :·.1~,_C.otiY•. Ч~§. F;:in.~ i;i})Il: ::в!=C1iiie·(;_:G_::t:: 1· .~ ..''."."····~ .. .ы.·'-~ ''"' "', " •• Этот код оказывается значительно эффективн.ее кода, который создается механизмо~1 записи макросов: :R.ange (•·А.1 ·: в з ~ J ·:se1'eё't-": :selecti6n .' Copy ' ~ange (/G4 '!l . select ~SJiioY:~§P:E!.E!t. :1'.a,st~ " , События Еще одной важной концепцией языка VВА являются события, на которые могут реа­ гировать объекты. Щелчок мышью на командной кнопке, двойной щелчок на ячейке, пе· · ресчет листа и открытие или закрытие книги являются примерами событий. На просто~~ языке события являются тем, что происходит. В контексте языка VВА события являются тем, что происходит с объектами. · Все элементы управления ActiveX, доступные в панели инструментов Элементы управления (Control Toolbox), могут реагировать на события . Эти элементы управления могут использоваться как на листах, так и в диалоговых окнах Us erForm для расшир ения функциональности этих объектов. Листы и книги также реагируют на целый ряд событий. Если объект должен реагиро­ вать на определенное событие, для этого события необходимо написать процедуру обра­ ботки. На самом деле события являются не чем иным, как адресами (числами). Все сущно­ сти в компьютере являются последовательностями чисел. Для компьютера главное , как ис­ пользуются эти числа. Номер события является адресом (тоже числом), который ссылается на адрес (еЩе одно число) метода. При возникновении события связанный с ним адрес ис­ пользуется для вызова метода, на который ссылается этот адрес. Эти методы называются обработчиками событий. К счастью, интерпретатор самостоятельно ч:rравляется с выделе­ нием и назначением этих адресов. От нас требуется только знание синтаксиса, используе­ мого, чтобы сообщить объекту, что определенный обработчик должен вызываться при воз­ никновении соответствующего события . К счастью, среда VВЕ делает еще один шаг на­ встречу: редактор VВЕ автоматически генерирует и назначает обработчики событий. Ко­ нечно, программист может назначать обработчики вручную, что оказывается полезным при работе с классами, которые не входят в библиотеки Excel или ActiveX.
Пример использования VВА в Excel 69 Например, можно определить, что пользователь выделил новую ячейку и подсветить весь столбец или строку, в которой находится эта ячейка. Для этого редактор VВЕ должен сгенерировать обработчик события SelectionChange, а программист - написать код об­ работчика события . Существующее соглашение по именованию предполагает, что редактор VВЕ указывает имя объекта, символ подчеркивания и имя события. Таким образом, обра­ ботчик события SelectionChange будет называться Worksheet_SelectionChange. Выполнение показанной ниже по_следовательности действий приведет к создания обработ­ чика события: О сначала активизируйте окно редактора VВЕ, нажав комбинацию клавиш <Alt+Fl l>; О в левом раскрывающемся списке Object (Объект) выберите пункт Worksheet, а в пра­ вом раскрывающемся списке Proce~ure (Процедура) выберите пункт SelectionChc;inge; О в сгенерированной подпроrрамме введите следующий код: E>ГIV:atё·-sц1:Г wO'rk.s:fiёёi;:' 'sё1е.ё ЕТдnсь:а:пg.Noе <БУ:vа1··-т а r9- еt: ·д5 ··:Ran9-«3T :"" ·~ ~ '., . ·· ·-. Rows. Int:er ior. Colorindex = xlColorTndexNone · · тarget.БntireColumn.Interior.Colorindex = 36 · Target . БntireRow : Interior. Colorindex = 3 6 ;Еч.d suь ..:.с. д• ,. _ Этот обработчик события выполняется каждый раз, когда пользователь выделяет но­ вую ячейку или блок ячеек. Параметр Target ссылается на выделенный диапазон, пред­ ставленньrй объектом Rang·e. Первый оператор сбрасывает свойство Color.Index всех ячеек листа (ячейки теряют цвет фона). Второй и третий операторы устанавливают цвет фона всей строки и всего столбца, в которых находятся выделенные ячейки (цвет фона делается бледно-желтым). Если палитра цветов Excel была модифицирована, предопре­ деленная константа xlColorindexNone может не соответствовать кремовому цвету. В этом примере свойства используются более сложным образом, чем было показано ранее . Рассмотрим отдельные составляющие. Если предположить , что параметр Target является объектом Range, который соответствует ячейке BlO, то следующий код исполь­ зует свойство EntireColumn объекта Range ячейки BlO для получения ссылки на весь столбец В. Столбцу В соответствует диапазон Bl :B65536 или, в коротком варианте, В:В. ·тai9-:~1:_ ,_gi!}E.i. з;~c;:.9. 1.ii1Nl. t_nt:§J:;E,_i: ::c0 +·0.f):iic1~?:< . .з § Точно так же следующая строJ<а кода меняет цвет строки 10 , которой соответствует диапазон AlO :IVlO или , в коротком варианте; 10: 10 . т~x:ie t ~йli ~i:r:~R.2yl ~ ±n!:~F°!o:{:;c::ё2Jsii: ~P'c:i ~J(_.:~1} . ·:"' ~.. . .: Свойство Interior объекта Range ссылается на объект Interior, описывающий фон диапазона. Наконец, свойство Colorindex объекта Interior устанавливается равным индексу интересующего цвета. Многим этот код может показаться неинтуитивным , поэтому возникает вопрос , как получить информацию об использовании определенного объекта Excel? Получение справки Простым способом получения кода, соответствующего определенной операции, яв­ ляется использование механизма записи макросов. Записанный код скорее всего оказы­ вается неэффективным, но в таком коде можно обнаружить ссылки на необходимые объ­ екты и используемые свойства и методы. Если включить механизм записи макроса и из­ менить цвет фона ячейки , в результате будет получен следующий код:
70 Глава 1 Конструкция Wi th ... End Wi th рассматривается более подробно далее в этой главе. Этот код эквивалентен следующей конструкции: s~Гect~~o/i': ±ntёrior;~cЪ'l'<?~ пае:Х :7,;-· з ·.Ei~.J,~<;!:J,9.It:.i...:r.r:i.t;.~.i;cj,ЯE,J?~~!::€'!.ЕР. . =_,;:<:],§ Вторую строку вводить необязательно, так как сплошная заливка используе·тся по умолчанию. Механизм записи макроса явно указывае:r все значения и не использует не­ явные значения и поведение объектов. В первой строке можно обнаружить информа­ цию, полезную для создщ1ия собственного кода. В данном случае необходимо узнать, как превратить объект Range (Selection) в целую строку или целый столбец. Если это возможно, для этого придется использовать свойство или метод объектаRаngе. Окно Object Browser Окно Object Browser (Просмотр объектов) является незаменимым инструментом для получения информации о полях, свойствах, методах и событиях объектов Excel. Для отображения окна Object Browser (Просмотр объектов) необходимо переключиться в окно редактора VBE. Для этого можно воспользоват~ся командой меню View~Object Browser (Вид~Просмотр объектов), нажать клавишу <F2> или щелкнуть на кнопке Object Browser (Просмотр объектов) на панели инструментов Standard (Стандартная). В результате откроется окно, показанное на рис . 1.22 . ' ~ AutoShowRange . W PivotTaЫe li:!i' ColumnRange ' ' !;;;>" ----- - =:: = ::=:~==:==::===:~~~ij!o~J~Ёc=: ::=:===::====~п~~i"=в.:о:~Ji~_эья~=====J ;: mPivotTaЫe t:!i' DataBodyR ange 1 1\ Excel 1\ Excel ~ PivotTaЫe ~ DatalabelRange 9.la~S.8t3~ ~ Protection ~ PuЫishObject W PuЫishObjects ' ., <:!> EdilionOplions Ш QueryTaЫe ! r1ff End ~ QueryTaЫes . ; r1f/ Er.tlroCotumn ~~~~~~~;;~:::::J""j :: ~~~":Row mRecentFile s . .•,~ FillDown ~ RoutingSlip :· •• •<:!> FillLen i:!iJ RTD "'" "'•~ FillRight .~1) С'",.,... ..,~;,., -~_l .-·А. Cllll 1.... ... . P~~%~ntlreCDl~mo ~s Rarшe MemЬer ~t.~~ Рис. 1.22 . Окно Object Browseт ~ DataRang e ;m. Объекты перечислены в окне, которое называется Classes (Классы) . Для быстрого перехода к объекту Range можно щелкнуть на окне и нажать клавишу <r> .
Пример использования VВА в Excel 71 С другой стороны, можно щелкнуть на поле поиска (возле пиктограммы в виде бинок­ ля) и ввести range. После нажатия клавиши <Entel"> или щелчка на пиктограмме с изо ­ бражением бинокля будет п0казан список объектов, содержащих в имени введенный фрагмент. При щелчке на объекте Range в окне результатов поиска , в окне Classes (Классы) будет выделен объект ·Range. Этот прием оказыва~тся полезным при поиске информации об определенном свой~тве, методе или событии. После этого становится доступен список всех полей, свойств, методов и событий это­ го объекта, отсортированный в алфавитном порядке. Щелчок на списке правой кнопкой мыши позволяет выбрать пункт Group Members (Члены групп) для разделения свойств, методов и событий. Такое разделение значительно упрощает чтение. Беглый просмотр списка позволяет найти свойства EntireColшnn и EntireRow, которые выглядят ре­ альными кандидатами для решения поставленной задачи. Для подтверждения выбора выберите свойство EntireColwnn и щелкните на пиктограмме? в верхней части окна Object Browser (Просмотр объектов). Откроется окно, показанное на рис. 1.23. Entirecolumn Property See дlso дppnes То Examp1e Returns а ~ object that represents the entire column (or columns ) that contalns the specified range. Read·only. Example This example sets the value of the first cel in the column that contains the active ce ll. The example must Ье run from а worksheet . ActiveCell.Enti:t:eColumn. Cells ( 1, 1) . Value = 5 Рис. 1.23. Оюю со справочной информацией Часто этот метод можно использовать для доступа к информации о других объектах и методах. На данный момент достаточно связать найденные свойства и применить их вместе с подходящим объектом. Эксперименты в окне lmmediate Если возникло желание поэкспериментировать с кодом, можно воспользоваться ок­ ном lmmediate (Проверка) в редакторе VВЕ. Примените команду меню Viewqlmmediate Window (ВидQОкно Проверка), нажмите комбинацию клавиш <Ctl"l+G> или щелкните на кнопке lmmediate Window (Окно Проверка) на панели инструментов Debug (Отладка). После этого окно lmmediate (Проверка) появится на экране. Окно Excel и окно редакто­ ра VВЕ можно расположить на экране рядом, что позволит вводить команды в окне lmmediate (Проверка) и видеть результат их выполнения в окне Excel (рис. 1.24).
72 Глава 1 YBAProject (Objects .кls) З···~ Мicrosoft Excel Objects ·. . Q) Лнстi (Sheetl) . ·l @J Лнст2 (Sheet2) • ·l @J ЛнстЗ (SheetЗ) !....[] ЭтаКн..-о ? Range( "Б2") .Value Пр одажи Ranqe("B2 " ) .Сору Deзt ination : "'Range("J2") Рис. 1.24 . Прос.м.отр результата работы команд, вводимых в окне Iттediate При вводе команды· в окне lmmediate (Проверка) (нижний правый угол рис . 1.24) и нажатии клавиши <Enteг> команда выполняется немедленно. Для повторно~;-о выпол­ нения одной и той же команды щелкните на строке команды и еще раз нажмите клавишу <Enter>. В данном случае свойству Value объекта ActiveCell присваивается значение "Прод ажи ". Если нужно выв ести значение, перед кодом необходимо ввести знак вопро­ са, который является синонимом команды Print: f?Ё:_aл9~ЛI~.~·· J..,yaj ч~.:'!'::~Js"$J1~9J1~l1jfi<?':(.!$oмa~д~·· X'~-:Lrt, Ж~g~ lJ·~2•· 1,.Y<Фie ·· Этот код распечатает слово "Продажи" в следующей строке окна lmmediate (Проверка). Последняя команда скопирует значение из ячейки В2 в ячейкуJ2. ЯзыкVВА В этом разделе будут показаны компоненты языка VВА, которые присутствуют во всех версиях Visual Basic и во всех приложениях Micгosoft Office, а также использованы при­ меры на основе объектной модели Excel.. Но главная цель - демонстрация общего син­ таксиса. Многие структуры и концепции применяются и в других языках программиро­ вания, хотя синтаксис может отличаться. Здесь будут рассмотрены следующие вопросы:
Пример использования VВА в Excel 73 О сохранение информации в переменных и массивах; О условные операторы; О использование циклов; О базовые механизмы обработки ошибок. Базовый ввод и вывод Для начала рассмотрим простые способы коммуникации с пользователем, которые сделают макросы более гибкими ' и полезными . Если необходимо выдать сообщение, применяется функция MsgBox. Сообщение может использоваться для выдачи предупре­ ждения или получения ответа на простой вопрос. В первом примере перед началом операции печати необходимо убедиться в доступ­ ности принтера. С помощью следующего кода генерируется диалоговое окно, показанное на рис. 1.25. Получив это сообщение, пользователь может проверить состояние принте­ ра. Макрос приостанавливает работу до щелчка на кнопке ОК: ±11>яй'9?ё_ ··•'-'""- -, ,-,,,7: .<с:" ::"•,С-"1 < l);~оверьте готовt-ЮстЬ прннтера ic печа тн li··::oE::::=:I Рис. 1,25. Вывод предупрежде­ ния с помощью функции MsgBox ~Если нужно поэкспериментировать, то для выполнения таких строк кода воспользуй­ тесь окном lmmediate (Проверка) . С другой стороны, код можно ввести в стандартный модуль в окне редактора VBE. В таком случае придется добавить ключевые слова Sub и End Sub, как показано ниже: (sub тesti (J- · Msg_Box "Проверьте готовность принтера к печати,'' :End .$ .\lb,_,. .,,'.. " ". .. ·"' ·· '" "'""°""'' ·""" ··'·"' '"· Для запуска подпрограммы щелкните на любой строке кода и нажмите клавишу <FS> . Функция MsgBox принимает множество параметров, которые управляют типом кно­ пок и Пиктограмм, доступных в диалоговом окне. Для получения справочной .информа­ ции о функции MsgBox или о любом ключевом слове ~А поместите курсор на ключевое слово и нажмите клавишу <Fl>. Сразу же после нажатия клавиши откроется окно спра­ вочного руководства, в котором будет показана информация о ключевом слове. Кроме всего прочего, в справочном руководстве указывается список доступных параметров функции: l:t1.s9"~.oX Ji?~6nii)t[, ьuttons ГT r·:·:tiц~ c· [ ;:·l}@IP,Ir:~ё; · co~t~i(t1 ·г.: Параметры в квадратных скобках являются необязательными . В данном случае един­ ственным обязательным параметром является сообщение. Если в заголовке диалогового окна должен выводиться текст, переда!iте его ф~кции в качестве параметра. Значени.я параметров можно указывать как по позиции, так и по им'ени.
74 Глава 1 Передача параметров по позиции Если указывать параметры по позиции , придется соблюдать правильный порядок па­ раметров. Кроме этого, вместо отсутствующих параметров нужно указывать дополни­ тельные запятые. Следующий код выводит диалоговое окно с заголовком, передавая па­ раметр заголовка по позиции (рис. 1.26) : :f1;igf,19~ :::·!ll?'fй~ie!:i~ ~i{,iiiчti~ii~?,:Г;<~7i.~'.!2~fi~a, ~~ ~1 ·· .:.~- _:- .· Г\jннтер включен? Рш:. 1.26 . Сообщение с заголовком Передача параметров по имени Передача параметров по имени обеспечивает несколько преимуществ: О параметры могут вводиться в любом порядке и не нужно .вводить. дополнительные запятые для обозначения не определенных параметров; О вместо оператора= необходимо использовать оператор : =,как было показано ранее. Следующий код позволяет получить такое же диалоговое окно, как и в предыдущ ем примере: И~.lfil9_X,,2t1If~T3Z-"J~'НJ1М~l!к~:cc;.::R,~giiiPtI'S.:'Л:P.Иii.Ji.~2=~~-кЛЮ\iei-J ?;о:·;::• •· Еще одним преимуществом указания параметр<;>в по имени является большая доку­ ментиро!}анность кода. Такая запись делает код намного понятнее. Дополнительная информация о параметре buttons доступна в таблице параметров в справочном руков одстве редактора VВЕ на странице функции MsgBox. Ниже показаны возможные значения этого параметра: 1 Константа Значение Описание VbOKOnly о Отображает только кнопку ОК VЬOKCancel 1 Отображает кнопки ОК и Отмена (Cancel) VЬAbortRetryignore 2 Отображает кнопки Отмена (Abort), Повтор (Retry) и Игнорировать (lgпore) VbYesNoCancel 3 Отображает кнопки Да (Yes), Нет (No) и Отмена (Сапсеl) VbYesNo 4 Ото~ражает кнопки Да (Yes) и Нет (No) VbRetryCancel 5 Отображает кнопки Повтор (Retry) и Отмена (Сапсеl) VbCritical 16 Отображает пиктограмму Критическая ошибка VbQuestion 32 Отображает пиктограмму вопроса VЬExclamation 48 Отображает пиктограмму предупреждения
Константа Значение VЫnformation 64 VbDefaultButto nl о VЬDefau ltButt on2 256 VЬDefaultButtonЗ 512 VЬDefaultButton4 768 yьдpplicatoinMod~l о VЬSystemМodal 4096 VbMsgBoxHelpButton 16384 VbMsgBoxSetForeground 65536 VЬMsgBo xRi ght 524288 VbMsgBoxRtlReading 1048576 Пример использования VВА в Excel 75 Описание Отображает пиктограмму информационного сообщения По умолчанию выделена первая кнопка · По умолчанию выделена вторая кнопка По умолчанию выделена третья кнопка По умолчанию выделена четвертая кн опка Модальное приложение . Пользователь должен от­ ветить на сообщение перед тем, как продолжить работу с текущим приложением Модальная система . Все приложен ия приостанав­ ливают работу , пока пользователь не ответит на сообщение Добавляет кнопку Справка (Help) в окно сообщения Выводит окно сообщения на передний план Текст выравнивается по правому краю Заставляет выводить текст справа налево, если используется еврейская или арабская система , чтения Значения от О до 5 управляют кнопками, которые выводятся в окне (рис. 1.27). Зна­ чение 4 заставляет окно отображать кнопки Да (Yes) и Нет (Nо): Microsof1 Excel ~8;. Рш:. 1.27 . Вывод с.ооб- щения с ююпками 1 Значения с 16 по 64 управляют пиктограммами, отображаемыми в окне сообщения (рис . 1.28). Значение 32 заставляет окно отображать пиктограмму со знаком вопроса. Ес­ ли необходимо одновременно указать значения 4 и 32 , их можно просто сло жить : tl199:~o~J='Fo!l}I:>X ,,;.·-YМ:~i~~;~1i:r!:!f.~.:z}~, .вiSJ;Jon~iI~.г,··· ;~~: :::·:~ -· :._ ··~· ---...,~-.-" .... ..."""·""''"" Microsoft Excel Х ф УдОЛ11ТЬ"""'1СЬ? Рш:. 1.28 . Вывод сообщения с кноn'КllМи и пиюпограммой
76 Глава 1 Константы Если в ка_честве значения параметра Bu ttons указать 36, код будет никому не поня­ тен, кроме самых закаленных программистов . Именно поэтому язык VВА предоставляет константы, показанные слева от значений на странице справочного руководства. Вместо указания числового значения параметра Buttons можно использовать символьные кон­ станты, которые более понятно описывают смысл использованного. значения. Следую­ щий код генерирует та,кое же диалоговое окно, как и в предыдущем примере: :~i9-!39~ .·~r:o!Ili2I:~s:vJ:i~Jf~i·~~.:.I3?п!'f1::;,i:~;:::~.i:lI~:cin:~I~\тШe§йo. Константы являются . специальным типом переменных, который не поддерживает изменение значения . Константы используются для хранения ключевых данных и обес­ печивают механизм создания более понятного кода. В языке VВА доступно м~южество встроенных констант. Программист может определить собственные константы, как по­ казано далее в этой главе. Возвращаемые значения В примерах применения функци~: MsgBox кое -чего не хватает. Приложение задает вопрос, но не получает ответ пользователя. Это связано с тем, что MsgBox рассматрива­ ется как оператор, а не как функция . Такая интерпретация допустима , но для избежания синтаксических ошибок необходимо знать некоторые правила. Для получения возвра­ щаемого значения функции MsgBox оно присваивается переменной. Но если попытаться выполнить следующий код, будет выдано сообщение о синтакси­ ческой ошибке: .--~·-~,,_.. •: __ ~~ .., , . , . .",,, .. _.н_··· vvv v·'"'"'''',.,,, ..::·'~ v·A····•н·.v.-v"'< """~'·v~·v··>н ··: _ ... , ,_ ,. 7•.,,,, _., ~-,-,v-,.",,:,:нx,·_:;;p·--·v: ·v• ~--,., .. , . ._.,. "- -_ -_-· - - ~---~- - , ., .• _." . _, ,. , ·: · :~ . .·,.,,· :· ·· 'ffi~·,...m··~ ·-" >;щ-:,~v·-~г Jl.IlsJte;~ MsяJЗ'?.::.S.J'k.:S:ЧDPJ. : ,o;; ;;.X,ц~,Ш1'R?.._§щt!19l>Z,;' !"'"?яtt.ori.i:; .: =yl:}Ye,~No ,,;t"x;t;>,Qчe;;J;.i.gp · ·;: Сообщение об ошибке Expected: End of Stat ement не проясняет ситуацию. Мож­ но щелкнуть на кнопке Справка (Help) и получить более подробное описание, но даже этой информации может оказаться недостаточно для обнаружения источника ошибки. Скобки В приведенном выше коде проблема заключается в отсутствии скобок вокруг аргумен­ тов функции . Правильный код должен выглядеть следующим образом: tAЧf?vi.~~•~2::.~Fii~:>C: ш:t:PmP:t:Ee\;·!tJJ/iJi'#~ь';§~1li1~1;-f::7::,·:~;~ч~t:toб§ ::·ь:v9\:esN2.I:t.;:Sr.oP\1&:§.e:if§P:1.;1r:iJ Как правило, если необходимо получить возвращаемое значение функции, аргументы функции нужно заключить в скобки. Этой проблемы можно избежать, если всегда заклю­ чать в скобки аргументы вызова процедуры. Если возвращаемое значение не вызывает интерес , скобки можно не указывать или добавить в начале вызова ключевое cлo~oCa l l, н;щример: 1diiЦ \r:t~Q"~"~;X;}l~iirri~:;:i::}(д.~.ii!:ilL].~!1i1f~Ь'
Пример использования VВА в Excel 77 Правило скобО'К относится и -к методам обое-ктов. Многие методы возвращают зншче­ ние, -котоfюе можно игнорироватъ или исполъзоватъ. Соответствующий пример рас­ сматривается в разделе, посвященном обое-ктнъ~м переменнъ~м далее в этой главе. Теперь, когда возвращаемое значение функции MsgBox сохраняется в переменной, его необходимо как-то использовать . И в этом случае дополнительная информация дос­ тупна в справочном руководстве в виде следующей таблицы: Константа Значение Описание vьок ок VbCancel 2 Отмена {Cancel) VbAbort 3 Прервать (Abort) VbRetry 4 Повторить (Retry) Vbignore 5 Игнорировать (lgnore) VbYes 6 Да (Yes) VbNo 7 Нет (No) Если щелкнуть на кнопке Да (Yes), функция вернет значение 6. В проверке If мо~но использовать как числовое значение, так и константу vbYes: :A:ns"wer · ;;~ -мggвc;'XT1'romi5t: ·;·;•·у-да.л·ить·· запис:ь ?•: вU:i:'tons: ;v-ьY-ёsNo Пf Answer = vbYes Than ActiveCel l.EntireRow.Delete · Функция lnputBox Еще одна полезная функция VВА называется InputBox. Она позволяет получать от пользователя текстовые данные. Следующий код генерирует диалоговое окно, показан­ ное на рис. 1.29: ' 'YeE:.~~~itt§:~.~': JnРЧtйоЯ: (f.roln~.~: ~:.· g13едйiе -~мв_: 5§irь:з_9_Б?.,~·е:дЯ'" Micr~ft [;,.;~,~ · ------ - ,- --· --~ Введ~1те нмя пользователя Рис. 1.29. Диалоговое ОIСНО с полем ввода Результатом вьJ:зова функции InputBox является текстовая строка. Даже если ввести чи­ словое значение, результат все равно останется текстовой строкой. Если щелкнуть на кнопке Отмена (Cancel) или ОК, не вводя ничего в текстовое поле ввода, функция InputBox воз­ вращает строку нулевой длины. Желательно проверять возвращаемое значение перед про­ должением работы. В следующем примере подпрограмма не выполняет никаКих действий при щелчке на кнопке Отмена (Cancel) . Оператор Ex i t SuЬ завершает вьmолнение подпро­ граммы . В противном случае введенные данные копируются в ячейку В2:
78 Глава 1 V'~ ·- ~· , "">-" ";·-~ ~~--·~·<:'-' ;..:;<·"' В . приведенном выше коде условие If сравнивает значение переменной Sales со строкой нулевой длины. Между двойными кавычками ничего нет. Не поддайтесь иску­ шению ввести пробел между кавычками. Сущесщвует более мощная версия функции Inpu tBox, котоfiая является методом обо­ екта Appl i са t i оп. Эта функция ' позволяет ограничитъ тип вводимъtх данн'Ых. Она рассматривается в главе 3. Вызов функций и подпрограмм При разработке приложения не пытайтесь разместить весь код в одной большой процеду­ ре. Стоит писать небольшие процедуры, выполняющие конкретную задачу, что позволит про­ верять работоспособность каждой процедуры в отдельности. После этого можно создать глав­ ную процедуру, которая вызывает процедуры конкретных задач. Этот подход зцачительно уп­ рощает. тестирование и отладку приложения, а также его дальнейшую модификацию. В следующем коде показан пример модульного подхода, хотя в реальном приложении процедуры будут содержать больший объем кода: '.SU:Б~мa'S'ter()"'о/'7·. ·-··=,·~'"'''\У''ш"'""~F!'~·"!'"'''.\'Г~'~::"•п···,·с::··-·-··~·уг·"! Dim SalesData As String SalesData = GetSalesData() If (SalesData <> ""} ' Then call Pos tinpu.t ( Salespata, End If . ;Endsuь Fun6tion G:etSaiesbata () ! GetsalesData "End .Ftнic. tion !?.I!<?_.§У,)?..~··- Процедура Master использует функцию GetSalesData и подпрограмму Postinput. Функция GetSalesData выдает запрос , вызывая функцию InputBox, и возвращает введен­ ные пользователем данные. ПроцедураМаstеr проверяет ответ пользователя на неравенство пустой строке. Если значение не является пустой строкой, подпрограммаРоstinрut копиру~ ет данные на лист .
Пример использования VВА в Excel 79 Оператор Call Ключевое слово Cal l является таким же старым, как и подпрограммы. На самом деле ключевое слово Call происходит из языка ассемблера, в котором применялась одно ­ именная инструкция. Использование оператора Call и скобок позволяет явно указать, что код вызывает метод, и параметры являются аргументами вызова процедуры. Объявление переменных Ранее было показано множество примеров использования .переменных для хранения информации. Пришло время рассмотреть различные типы переменных , наиболее под­ ходящие способы их определения, а также правила соз:дания имен перем енных . До этого момента переменные создавались через простое использование. Этот так ,на­ зываемое неявное объявление переменной . Большинство языков программирования требуют явного объявления переменных . Это значит, что перед применением в коде не­ обходимо определить ·имена всех переменных. Язык VВА поддерживает оба типа . объяв­ лений. Для явного определения переменной используется оператор Dim или один из его вариантов, рассматриваемых далее . Следующий оператор Dim объявляет переменную, которая называется SalesData: Неявное объявление переменных также поддерживается, но его стоит избегать . Код должен быть как можно более явным. Явный код и объявления переменных выглядят более осмысленно и делают код более точным. Кроме этого , неявные переменные полу­ чают инвариантный тип данных. Инвариантный тип данных требует дополнительной фоновой обработки для определения типа данных при каждом использовании перемен­ ной . Дополнительный код добавляется автоматически, и, кроме снижения ясности кода , инвариантные типы данных связаны с дополнительными накладными расходами во время выполнения. Оператор Option Explicit Существует метод,; принудительного включения явных объявлений в языке VBA. Для этого оператор Option Explicit вставляется в начало модуля, как показано на рис. 1.30.
80 Глава 1 SuЬ I!aster () Dim SalesData As String SalesData = GetSalesData() If (SalesData <> '"') Then Call Post!nput (SalesData, "ВЗ") End If Function GetSalesData() GetSalesData ::::: lnputBox ( ''Enter Sales Data") End Function SuЬ Poэtlnput ( InputData , _ Target) Range(Target) .Value = InputData :а:;; J.L .J Рис. 1.30. Оператор Option Explicit указь1вается в начале модуля Onepaтop} o;-tion Explicit относ~тся ~~лько к ' тому 'модулю, в котором он указан . . Это-f оnератор дол~~н быть д06авлен в . ка>tщ~м ·~оду.Пе'; требующем явного объЯвления переменных :•: · · · '1..' ·\с;> .·' ,, При попытке компиляции кода или запуска процедуры в модуле с включенным явным объявлением переменных интерпретатор VВА найдет все не объявленные переменные, выделит их другим цветом и выдаст сообщение об ошибке. Эта возможность VВА часто ока­ зывается очень полезной. Рассмотрим следующую версию процедуры GetSalesData, в модуле которой не указьщается оператор Option Explici t. В этом случае будет ис­ пользоваться неявное объявление: 1Get!SataП ~="'· -= •w= . · ,... ,.,. · ""'"' = ·' • · , saiesData = Inputвox (Prornpt: = ;, ВведИте >• If . SalesData = "" Then· Exit suь .'· .· Ra~ge ( "В2") . Value = salesDa:ta · w;;!l<:'l .ei.lь... ;.; .., "" . .. . Этот код никогда не введет данные в ячейку В2 . Интерпретатор VВА примет непра­ вильно введенное имя переменной SaleData в условном операторе If в качестве новой переменной, не имеющей значения. Для интерпретатора эта переменная будет эквива­ лентом пустой строки и всегда будет выполняться оператор Exi t Sub, а последняя строка не будет выполняться никогда. Ошибки такого типа, особенно в коде большого объема, могут долгое время оставаться незамеченными. Если указать оператор Option Explici t в . начале раздела объявлений, а оператор Dim Sal esData в начале подпрограммы GetSalesData, при попытке выполнения проЦедуры будет выдано сообщение об ошибке "Переменная не определена". Не опреде­ ленная переменная будет .выделена другим цветом, что позволит очень быстро обнару­ жить источник ошибки.
Пример использования VВА в Excel 81 Область видимости и время жизни переменных С переменными связано две очень важных концепции : О область видимости, определяющая возможность доступа к переменной; О время жизни , определяющее, как долго эта переменная будет сохранять присвоен­ ное значение . В следующей процедуре приводится пример времени жизни переменной: , .SJЬ L1feт1Пie.I J • ~~- у: •\ bim Sales , A:o( Integer iSales = .Sales т 1 Call MsgBox(Sales) При каждом запуске процедуры LifeTime выводимое значение переменной будет равно 1. Это связано с тем, что переменная Sales существует в памяти только до завер­ шения работы процедуры. Память, выделенная для хранения переменной Sa l es, осво­ бождается после достижения оператора End Sub. При следующем запуске процедуры LifeTime переменная Sales создается повторно и по умолчанию получает значение О. Область видимости переменной Sales находится в пределах процедуры LifeTime, а время жизни переменной равно времени выполнения процедуры , в которой она опре­ делена. Для увеличения времени жизни переменной ее можно определить как статиче­ скую (ключевое слово Static): Sub LifeTime () Sales = Sales + 1 MsgBox Sales End Sub Время жизни переменной Sales увеличивается до времени, в течение которого оста­ ется открытой книга. Значение переменной Sales увеличивается с каждым запуском процедуры LifeTime. В следующих процедурах на примере показана область видимости переменной: sc'O i:>elП '~'·:· . ~-w· , .. Static . Sales As Integer Sales ~ s~les 1 · MsgBox Sales .Бnd suь ... !.. . ;siiь Scope2 ( ) 1 Static ·sales As 'f· . Sales = Sales + r~hq~~~g~-~:les
82 Глава 1 Переменная Sales в процедуре Scopel не совпадает с переменной Sal es в проце­ дуре Scope2. При каждом запуске процедуры Scopel значение переменной Sal es уве­ личивается на единицу независимо от значения переменной Sales в подпрограмме Scope2. Точно так же переменная Sal es в подпрограмме Scope2 будет увеличиваться на 10 при каждом вызове подпрограммы Scope2, независимо от переменной Sales в подпрограмме Scopel. Любая переменная, определенная внутри процедуры, имеет область видимости в пределах этой процедуры. Переменная, определенная в процедуре, называется переменной уровня процедуры. Кроме этого, переменные могут определяться в разделе объявлений в начале модуля, как показано в следующем фрагменте кода: ;_optIOllt»>EXP1rc:Ct'= i<r"!"' "'~"'-'' , .. , ., ..." -·~···-·~ ." - - · tDim Sales As Integer (:· ~Sub \ End ~Sub Scop.el () Sales = Sales + 1 MsgBox Sales Sub Scope2 () ~ Sales = Sales · MsgBox Sales . f_Ep.d , ?ub ,_, ~·- ~····'·'··---······"''·""•·'··'''" В данном случае подпрограммы Scopel и Scope2 работают с одной и той же пере­ менной Sales. Переменная, которая определена в разделе объявлений модуля, называ­ ется переменной ' уровня модуля и область ее видимости совпадает с границами модуля. Таким образом, переменная остается видимой для всех процедур внутри модуля. ~ремя жизни переменной соответствует времени, в течение которого остается открытой книга. Если процедура внутри модуля объявляет переменную с тем же именем, что и у пере­ менной уровня модуля, последнЯя станет невидимой для процедуры. В этом случае про­ цедура будет работать с собственной переменной уровня процедуры. Переменные уровня модуля, объявленные в разделе объявлений модуля с помощью оператора Dim, не видимы· из других модулей. Если переменная должна использоваться одновременно в нескольких модулях, ее необходимо объявить с применением квалифи­ катора PuЬlic: lJ?u~!Ic:::·_$.ciJ~§2A§':1..itt§Я~!-:: .т.~.::- -~ :::·. Такие переменные можно сделать видимыми и в других книгах или проектах VВА. Для этого в другую книгу необходимо добавить ссылку на книгу, содержащую перемен­ ную PuЬlic. Для добавления ссылки можно воспользоваться командой меню Toolsq References (СервисqСсылки) в редакторе VВЕ. Тип переменной Компьютеры используют различные методы хранения разных типов данных. Метод хранения чисел значительно отличается от метода хранения текстовых строк. Разные ка­ тегории чисел также имеют разное представление в памяти. Целое число (без десятич­ ной точки) хранится не так, как хранится число с десятичной точкой . Большинство язы­ ков требует объявления типа данных, для хранения которого будет использоваться пере­ менная. В языке VВА такое требование не предъявляется, но код будет работать более эффективно , если типы переменных объявить заранее . Кроме этого , при раннем опре-
Пример использования VВА в Excel 83 делении типа переменной упрощается обнаружение проблем, связанных с преобразова­ нием данных из одного типа в другой. Следующие таблицы были скопированы из справочного руководства по языку VВА. В таблицах определены различные типы данных, доступные в языке VВА, а также требо­ вания этих типов к объему памяти. Кроме этого, указывается диапазон значений, под­ держиваемый каждым типом: Тип данных Размер представ- Диапазон значений пения в памяти Byte Boolean Integer Long (длинное целое) 1 байт 2 байта 2 байта 4 байта Single (число с плавающей 4 байта точкой одинарной точности) DouЫe (число с плавающей 8 байт точкой двойной точности) Currency 8 байт (масштабированное целое) Decimal 14 байт Date 8байт· Object 4 байта string (переменная длина) 10 байт+ длина строки string (фиксированная длина строки длина) variant (числовые данные) 16 байт Variant (символьные 22 байт+ длина данные) строки Определенный пользовате- Объем, необходи­ лем тип (определяется мый для хранения с помощью ключевого слова элементов Туре) ОТ0ДО255 True или False ОТ -32768 ДО 32767 ОТ -21 47483648 ДО 2147483647 от -3.402823Е38 до -1.401298Е-45 для от­ рицательных значений и от 1.401298Е-45 до 3.402823Е38 для положительных значений от -1.79769313486231 ЕЗО8 до -4.94065645841247Е-324 для отрицательных значений и от 4.94065645841247Е-324 до 1.79769313486231 ЕЗО8 для положительных значений ОТ -922337203685477.5808 ДО 922337203685477. 5807 +/-79228162514264337593543950335 без десятичной точки, +/-7 .9228162514264337593543950335 с 28 знаками после десятичной точки. Наи­ меньшее ненулевое значение составляет +!-О. 0000000000000000000000000001 от 1 января 100 года до 31 декабря 9999 года ссылка на любой объект от О до примерно 2 миллиардов символов . от 1 до примерно 65400 символов Любое числовое значение в пределах диапазона типа DouЫe Тот же диапазон, что и тип Striпg с пере­ менной длиной строки Диапазон каждого элемента совпадает с диапазоном типа данных
84 Глава 1 Если не объявить тип переменной, по умолчанию будет применен типVariant. Этот тип данных использует больший объем памяти, так как вместе со значением переменной хранится информация о типе данных, которые в данный момент содержит переменная. Использование типа Variant связано с дополнительными накладными расходами при обработке . Интерпретатор VВА должен определить, с каким типом данных приходится ра­ ботать, а также необходимость его преобразования. Если от приложения требуется макси­ мально возможная скорость работы, типы всех переменных необходимо определить явно. При этом применяйте типы, которые требуют минимального объема памяти для хранения значений. Например, если известно, что будут использоваться только целые числа в диапа­ зоне от -32000 до 32000, стоит объявлять переменные типа Integer. Определение типа переменной Тип переменной можно определить с помощью оператора Dim с использованием до­ полнительных квалификаторов, например Public. В следующей строке переменн ая Sales объявляется как число с плавающей точкой и двойной точностью : В одной строке можно объявить больше одной переменной: ':ЬЭJn.-s;~J·esD.[t a~~JЭ9}д3:ce:; :_r!LclёX 'As '·r::цъ:~я~r ;~s_t:a J:;:.'fp_it<§: :жs::!S~f:e'W?"ff · Следующая строка может стать ловушкой для неопытного пользователя: [DlЩ:'~~c·g~~;·wм·.R9~~~J1.~e·r:~fi§::!i5Iёg~t;:~.~~4::::=~~;::;,~-x=·-·~~-·v·y:·~-~ -~- ""''-'"'""'""''"""' Многие пользователи предполагают, что эта строка объявляет все переменные, как имеющие тип Integer. Это не так. Переменные Col и Row получают тип Variant.' так как явное объявление типа отсутствует. Для явного определения всех переменных необ­ ходимо воспользоваться следующим кодом: J?Xiii:::~ol.Ж~IJjIt;§Q"§E ,J'.[9~~~i I~\f:.€~1jj~;:·,=§tt~~~"t:•::~§::::tf-~tj~i;i!э.'i:31E!11i.:;'J;:t1f1&~:r&~~:::';:::::::_ Объявление функции и типы параметров Если в подпрограмму или функцию передаются параметры, тип каждого из них мож· но определить в первой строке процедуры, например: Кроме этого, можно определить тип возвращаемого значения функции. Функция из следующего примера возвращает значение True или False: ~F\iii<::)~Jofl.,";;,_e.~~·.;,;-.c'.=·'",q,:c"~}:v~i.~t;.<,-,~':::C'_q_~:.kc1.?.''"'--"'''°··~·,.,_",_,_,,,-;, ~'-':''o.-=..c=."'~--~-···'~·-'·"··;;;1;,"31""''"-"""·'-&i:k, &.i.Нн,;,:;,,;,д,х Константы Ранее было показано, что в языке VВА предоставляется множество встроенных кон­ стант. Язык поддерживает определение собственных констант. Константы полезны для хран~ниЯ чисел или текстовых строк, которые не меняются в процессе работы приложе­ ния, но часто используются в расчетах или сообщениях. Константы объявляются с по­ мощью ключевого cлoвaConst, как показано ниже : :qqii~t·i[i: ;. "'"~"'"'·"--.:" .- -.,,,,_€::t,~:~;}~5J'z:~·;:,;:.:;:iI~;··:J1:9J::.:;:~~~-:~iktiШ'dJ1]~•~11iibl~~;~~йШШiдflli~;'11~1'i~iШ:i:1 Но желательно указывать в объявлении и тип константы :
Пример использования VВА в Excel 85 Константы следуют тем же правилам определения области видимости , что и пере­ менные. Если определить константу внутри процедуры, константа останется локальной для процедуры. Если определить константу в начале модуля, она будет доступна всем процедурам в пределах модуля. Если константа должна быть доступна всем модулям, ее можно объявить с квалификатором PuЬlic, наприм~р: i.~iдi~:[S:: ~2fi§I;~ g~·~oJ;I§I:..'AsJ•$I1-?:'~Ei9-IE';');И~P~~<:й:~:ie.;}~~~=f\9дE,:i~w~~м;::.i<a,k Соглашения по именованию переменных Самым важным правилом именования переменных в языке VВА (и в других языках программирования) является использование единого стиля именования . Многие про­ граммисты привыкли использовать префиксную запись, в которой несколько первых букв обозначают тип данных . Префиксная запись была разработана Чарльзом Симонием (Charles Symonyi) из компании Micгosoft для слабо типизированного языка программи­ рования С, и называлась Венгерской нотацией. (В сильно типизированных языках ком­ пилятор внимательно следит за соответствием объявленных типов аргументов и типов передаваемых в метод параметров.) Так как теперь большинство языков программирова­ ния обеспечивают более сильную типизацию, даже компания Mi.crosoft рекомендует раз­ работчикам применять явные объявления, полагаться на сильные типы и использовать контекст для описания назначения переменных, одновременно отказываясь ~т префикс­ ной нотации. Любой разработчик может применять собственное соглашение по именованию - компьютерам все равно, но людям плохо удается чтение и запоминание аббревиатур . Ес­ ли в имя переменной необходимо включить тип, используйте полное имя класса, напри­ мер ButtonUpdateStatus вместо btnUpdateStatus. С другой стор.оны , можно при ­ менять вариант UpdateStatusButton, который читается еще легче. В данном случае гл авное - сохранять единообразие при создании имен переменных. Объектные переменные Рассматриваемые до этого момента переменные хранили числа или текстовые стро ­ ки . Кроме этого, сушествует возможность создания объектных переменных , которые ссылаются на объекты , например листы или диапазоны. Оператор Set используется для присвоения ссылки на объект объектной переменной. Как и обычные переменные , объ­ ектные переменные также требуют объявления и назначения типа . Если тип переменной не известен заранее , в объявлении можно указать универсальный типОЬj ect: :bБn''. м:YWori<Ьёok "As -ьь::Jеёt:«· ··· :··"''*··=··,,,,,,· ·? • -· • ~ .,.. ····-·-· \set MyWorkbook = ThisWorkbooк ' ;.!>f9gJ:3o?C, }"Y.Y,lorJ<:Ьo,ok. ~aI!}§ •. ... • " ,, ;~- - -· - "' "''·.с!.: .. По возможности стоит использовать конкретный тип объекта . Следующий код созда­ ет объектную переменную aRan~e, ссылающуюся на ячейку BlO на листе Sheetl в той же книге, в которой хранится код. После этого объекту и ячейке над ним присваиваются новые значения : 1su:Б '61:3:i ect'iia iTaЫe ( j ' r_ .· · ·Dim aRange As Range % -Set aRange = Th:lsworkЬook . Worksheets (" Sheetl") . Range ( "ВlО"} r aRange. Value = InputBox (-"Введите объем продаж зд. > январ-ь") aRange.Offset(-1,0) ..Value = "January Sales" J?ло -~~!?.. ·-ж..• " · ."··- ."" . ~~=-··. .~
86 Глава 1 Если на один и тот же объект нужно ссылаться несколько раз, стоит объявить объектную перемеНН}'19, а не несколько раз вводить длинную спецификацию объекта. Кроме этого, ис­ пользование объектных переменных делает код проще для чтения и модификации. Объектньrе переменные также полезны при сохранении возвращаемых значений не­ которых методов . Особенно это касается методов создания новых экземпляров объектов. Например, метод Add объекта Workbooks или Worksheets возвращает ссылку на но­ вый объект. Эта ссылка может быть присвоена объектной переменной , используемой для обращения к объекту в дальнейшем: .SUb . Networkbo6k ( Г"". ~'" ~, ,,_.?",у., ,,,,~- ~-н-·'" ,~~"';,,, ;ч·. Dim aworkbook. 'As Workbook·, aWorksheet Set aWorkbook = Workbooks.Add set aworksheet = aWorkbook . Worksheet.s. . Add After: = aworkbook . Sheets (aWorkbook .. Sheets. Count)) aWork$heet. Name = ." Январь " ' · aWo;rksheet.Range("A1,") .Value· = "да'нн'"1е о продажах " . awo rkbook.SaveA$. Fi],ename:="JanSales.xls" ' В этом примере создается новая пустая книга, ссылка на которую присваивается объ­ ектной переменной aWorkbook. В книгу после существующих листов добавляется новый лист, ссылка на который Присваивается объектной переменной aWorksheet. Имя вкладки в нижней части листа меняется на "Январь", _а в ячейку Al вносится заголовок "Данные о продажах". Наконец, новая книга сохраняется в файле Ji=шSales. x l s. Обратите внимание, что параметр вызова метода Worksheets. Add укаЗан в скобках. Так как результат вызова методаАdd присваивается объектной переменной, все параметры 1 вызова должны указываться в скобках. Предпочтительней следовать этому соглашению. Ес- ли бы возвращаемое значение метода игнорировалось, скобки можно было бы не указывать: :w1{ь'.}!.9!-1<:~1:1~~1::·10 .."J.Cid. A.I~ er ~.~$.J:!e.~t:S' iW~IJ /~Б:e~~-~:~oSJ.IiIГ::·.:::"·.~: · ·:.: ..~)- J Но обычно стоит придерживаться единого стиля. Хорошей политикой является вы­ бор удобного стиля кодирования с постоянным его использованием. (Помните, что очень немногие языки программирования поддерживают вызовы методов без скобок. Таким образом, начав программировать на другом языке, можно столкнуться с пробле­ мами при попытке вызова метода без указания скобок: Так как придется программиро­ вать на нескольких языках, проще использовать .скобки везде . ) Конструкция With ... End With Объектные переменные обеспечивают простой способ создания коротких ссылок на объекты. Кроме этого, объектные переменные обрабатываются в VBA более эффектив­ но, чем полные ссылки на объекты . Еще одним способом сокращения объема кода и уве­ личения эффективности работы интерпретатора является использование структуры Wi th. . . End Wi th. Предыдущий пример можно переписать следующим образом: 'Wi fJ:i aworkьo'ok:' . •. i Workshee·ts. ;:g:nd Wit;h Интерпретатор VВА знает, что имя, начинающееся с точки, является именем свойст­ ва или метода объекта, указанного в операторе Wi th. Можно переписать всю процедуру NewWorkbook .и отказаться от использования объектной переменной aWorkbook:
Пример использования VВА в Excel 87 Можно пойти еще дальше и полностью отказаться от использования объектной пере­ менной Wks: :siJЪ' Nёwwork:ьooк ( · With Workьooks . Add ' With . Worksheet:S .Add(After: =. Sheeti;; (_. r ' "Name = "Январ" " , . Range ( "Al ") .Value = "Данные Enq With · · ~ sд.VeAs Filen~пl'~: = 11 JanSales . ·x1l'1 ; J:;:nd With 1En_g .,SцЬ,,, _, __ ,,___,_ Если такая форма записи кажется запутанной, можно найти компромисс между ис­ пользованием объектных переменных и конструкции With. . . End Wi th: \sU.Б Newworl<Бooк( ) ---г-~·';7""'~'7'~·~=­ ' Dim aworkЬook · As Workbook, ' aWorksheet 1 ' ·set aworkbook = workbooks. Add With aWorkbook · set aworksheet = .worksheets.Add(After: =.Sheet:s Wi .th aWorksheet · · .Name. = "январ" " . Raдge("Al") :vaiue End With "Данные о .SaveAs FileName:=".:ТanSales.xls" End With Sub.' .-"~~ • .. ~. •~'\' ><' ~.т~Ю.-<1;ж.~.>М.'J> .• ~ Конструкция Wi th. End Wi th особенно · полезна, когщ1. ссылки на объекты по- вторяются несколько раз в небольшом фрагменте кода. Принятие решений В языке VВА предоставляется две основных структуры для принят~я решений и вет­ вления . Это операторы If и Select Case. Оператор If предоставляет большую гиб­ кость , но Select Case удобнее при проверке значения единственной переменной. Оператор lf Оператор If может принимать три формы: функция IIf, однострочный оператор If и блочный оператор If. В следующей функции Тах используется функция IIf (Immediate If): f unc-tion .тa's(:Proflt:Вeforeтa'X -'As ''ЬO'Ublё) '-д.s""''"fiouble ",~- ~ с'Гаs = :(If(ProfitBef6reTax >О, Q" З * ProfitBeforeTaX, 0) ;_шn9,...:.,~_чnq:tJ9.rt_~ -~~ ~"_;ill_"_ -.<•• · '·" " '" "'k - . . ~=»>.-.,. •"" ,:_ ~-~..A-..f:":-.," --··""--<~·---=--~\>о<..'.:"·.:~--"-. Функция I I f похожа на тернарный оператор?: из языков С, С++ и С#. Этот опер а­ тор имеет форму Проверка ?истина : ложь и похож на функцию IF для листов Excel. "
88 Глава 1 Функция I I f принимает три аргумента: первый является логическим условием, вто­ рой - выражением, которое вычисляется при истинности условия, а третий - выраже­ нием, вычисляемым при ложности условия. В этом примере функция II f сравнивает значение переменной ProfitBeforeTax с О . Если условие истинно, функция IIf вы­ числяет 30% от значения переменно ProfitBeforeTax. Если условие ложно, функция II.f возвращает О. Вычисленное значение функции IIf передается как возвращаемое значение функции Тах. Функцию Тах можно переписать для использования одностроч­ ного оператора If: FuncH'on т~x(Pr o fitБeforeтax дs bouble) As ."Douыe ' · If ProfitBeforeTa;x: >О Then Тах = 0.3 •pro f itвeforeTax ~Elseтах =о J?.nQ.".~un.c;:.tJ.on= ."~--"-- •.. "~....".•. W•*~""-··:. "- -~·" ·= · · -1 Единственной разницей между функцией II f и оператором I f явля~тся необяза­ тельность раздела El se в однострочном варианте оператора I f. Функция I If требует определения всех трех параметров, в то время как в VВА часто бывает полезно опустить раздел Else: Еще одно отличие - это способность функции IIf присваивать значение ·только од­ ной переменной, а однострочный оператор I f может присваивать значения разным пе­ ременным: :+I Jj:)~ii~§.ce>X:Et:?.:,J1~~i:r~[C,.<S.:r:§ тlieri ~21i~..~~ iJ'otm~+:. I.~~:iiГ~· w?::r::V.. ~. .• fi~i;-yj '",,",,•. _ .. "" " " ' Блочный оператор lf Если ·при истинности условия необходимо выполнить больше одного действия, мож­ но воспользоваться блочным оператором I f, который показан ниже : ;тt ····JьEnss ~o r ё -; ··иa:rys'sc'Ore= ть.'ёn ""'"":·~· ···""''"''""··· · f John=John+1 · k: Mary· = Mary ·- 1 J?ло ;r:J ·-·'"~=~"--··~- ~··· - ·· При применении блочн.ого оператора I f код должен вводиться в следующей строке, а не после ключе~;~ого слова Then. После строки с условием можно указывать любое коли­ чество строк кода. Область видимости оператора If необходимо завершить ключ евым словом End If. В блочном операторе If можно использовать.раздел Else, наприм е р: ,.,.. ..,.,~. ~,- . .." ."".", .,..,,,;::,.,,..,...,",.._п·< . ,. .,.-·" "'""""'-""""""'~" ...,.._ " ..,., "..,.•,."•....,..._ .,"i'" .. ,.., ..,_..,.~ [I f ,JohnsScore > MarysScore Then John John +'1 ,. Mary =Mary 1. ' Else .. ;i ~~•' ~~~- : ~~~~ +.1 ;J;:11g";.If ,щ,+,., Кроме этого, в блочном операторе I f можно использовать любое количество разде­ лов Else i f: if Jonnsscore > мarysScore тhen t·'John=John+1 i·'маrу =Mary·,;_1 tElseif JohnsScore < · Mary~Score John = John 1 -~9--~_Х:,..":::.,Ц;~:~:~;у, . .! .1..~-,_J;, . . . .,~~~<><м.оМ . . • . .~< > .= о
{Eis.e:, - ,~, ·~ - -~ ~·~· ~·. John маrу l;ri.4 .•I.f Пример использования VВА в Excel 89 При применении блочного оператора If с одним или несколькими разделами Elseif интерпретатор VВА продолжает проверку условий, пока не будет найден раздел с истинным условием. Сначала выполняется код из этого раздела, после чего выполнение продолжается с .оператора, который следует за ключевым словом End If. Если ни одно из условий не яв­ ляется истинным, выполняется код из разделаЕlsе . Блочный оператор If не выполняет никаких действий, если ни одно из условий не является истинным :r;r раздел Else отсутствует . Блочные операторы I f можно вклады­ вать друг в друга. Стоит использовать выравнивание, чтобы обозначить область видимо­ сти каждого оператора. Это очень важно, так как очень легко запутаться во вложенных блоках If внутри другИх блоков If и блоках If внутри блоков Else. Если при написании кода выравнивание не используется, сопоставление каждого I f с соответствующим End If превращается в сложную задачу: Not ''"тhiswor kbook .'sav'ed .Then"'W'• ,, '''~<'''"'' -=·=· ·т ·- .,, ,, ..С"'""''' .".,,.."' ,..• . " "'''7 ' "'" - '"""' An~wer . = MsgBox ("Сохранить изменения", vbQuestioц + ._ vbYesNo) 'rf .Answer = vbYes Then ThisWorkbook.Save ThisWorkЬook. Narne &·· " сохранена" В этом коде применяется свойство Saved объекта Workbook, в котором хранится код. Свойство показывает, сохранялась ли книга после внесения изменений. Если изме­ нения не сохранены, у пользователя запрашивается разрешение на их сохранение . Если пользователь утвердительно отвечает на запрос, внутренний: блок If сохраняет книгу и сообщает об этом пользователю. Оператор Select Case Следующий блочный оператор I f проверяет значение одной и той же переменной в каждом разделе: i:Fiinёi:i on :PrJ. се <i?rod.i .icf' 'A.s .s tiTn:g: г·д5·· vaiГant -· -· ""·~· .- · т· ~ If Product = · "Apples" Then .· ; Price = 12.5 Elseif Product "Апельсины" Then Price = 15 Elseif Product "Гру11ш" Tht:n .Price = 18 ElseI f Product "Манго" Then .. ~· 25 CVErr\xlErrNA) , . N.V.ornм&<л~=.:й<><. ·"""··~·· · ~. ·'°"•' •~- ,.,_. Если соответствующее значение переменной Product не найдено, функция Price возвращает сообщение об ошибке Excel (#NA). Обратите внимание, что возвращаемое значение функции Price по определению имеет тип Variant. Это значит, что функция может возвращать как числовое значение, так и значение сообщения об ошибке. В такой ситуации более удобным решением было бы использование конструкции Select Case . В данном случае эта конструкция выглядела бы следующим образом:
90 Глава 1 1F-u.n:cн·ьц ·· i":rтe:eт:Pr:oci:u.c:t: ·лs "st:.rrцg:г :·дs- v.arгa:п·f- =·~ ·- - ·······~ _,,,. ·•·= ), . Select Case .Product ' . ase "ЯбЛокИ" · Price = 12.5 "Манго_.j , Price = ~ase Else ' · / Ptice = Ehd select .§!lgд f:~!I9J::J.9.!l. , Если для каждого случая выполняется только один оператор, можно воспользоваться следующим форматом конструкции. Для указания нескольких операторов в одной строке между ними необходимо вставлять точку с запятой(;). !'Funct:Lon E>r ice·c?foCiuct''A.s· ' · Sele!Ct Case Pr-oduct · • C;'ase "Яблоки": · Price Case "Апельси~ы": Price = 15 ,_ case ''Груши":· Price = 18 .· Case ".Ма:нго'': . 25 , dase~ Else ~· ' End Select· · !E;J'\.c11,кJ,ln,gJ;Jo . Конструкция Select Case также позволяет работать с диапазонами чисел или с тек­ стом. Кроме этого, в условии сравнения можно использовать ключевое слово Is. В следую­ щем примере рассчитывается стоимость проезда для детей до 3 лет, для лиц старше 65 лет, а также для лиц, попадающих в промежуточную возрастную категорию. Если в качестве па­ раметра функции указать отрицательный возраст, будет выдано сообщение об ошибке. tiiuncl:i6n'" F'are (лi;fk!' 'A$""':".Г:ht';;;ger'j *А.Б ~сvа:НаnГ Selec\: Case Age ·:,' Case О То 3, Is~~ Fare=О Case4ТоlS Fare = 10 Case 16 То 65 Fare = 20 Case Else Fare = CVErr (xlE.rrNA)· End Select ·~risl _FμпgJ.f oч. Циклы Во всех языках программирования предоставляются эффективные механизмы для мно­ гократного повторения одних и тех же или похожих последовательностей операций. В языке VВА даются четыре конструкции, позволяющие циклически выполнять один и тот же код. Это конструкции Whi le. . . Wend, Do. . . Loop, For. . . Next и For Each. · В конструкциях Whi le .. ~ Wend и Do. . . Loop условие указывается в начале цикла. В конструкции While ... Wend условие указывается в начале цикла и тело цикла может выполняться О или больше раз. В конструкции Do. . . Loop условие можно указывать как в начале, так и в конце цикла. Если условие )тказывается в конце цикла, тело цикла будет
Пример использования VВА в Excel 91 выполняться как минимум один раз. Цикл For. . . Next обычно используется, когда ко­ личество итераций цикла известно заранее, например, при переборе массива из 50 эле­ ментов. Цикл For Each Используется для обработки объектов, входящих в коллекцию. Пример каждого цикла приводится в следующих разделах. Цикл While...Wend Цикл While ... Wend имеет следующий синтаксис: While (условие) .. . Wend. Тело цикла указывается между операторами Whi le и Wend. Пример цикла While ... Wend по- казан ниже. Этот код меняет цвет фона ячеек в каждой строке. ,.,-· ыз:c:= su::i3" :ShaaeE-veГ:Y:Sec'orid:RowWБПewёii"d() . R·ange ( "А2") . EntireRow. select \mi'le · дctiveCell. Value < > · " " · · .se1ection. Interior. Co1orindex = 10 . Ac(iV'erell. Of fset ( 2, • О) . EntireRow. Select ~ ·wend · lliв._cЬ.9JJF>. :::"'··'.;,, ~,· Цикл Do... Loop · Для демонстрации работы цикла Do ... Loop создадим процедуру, которая закраши­ вает каждую вторую строку листа , как показано на рис. 1.3 1. Макр о с должен работать на разных листах отчетов с разным количеством продуктов, поэтому макрос проверяет столб~ц А в каждой строке, пока не встретит строку с пустой ячейкой в столбце А. Это и будет условием завершения цикла. 7 J Проду1<!6 ! Ц ·-в ••111вв1111111BIВ-'Blrllllll88•••1A 9 !Продуl<!З i \/ l::I1[0Jiliiilllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll'1:~ [I~2~1 J!Пlplolдlyкrlll10111111111111111' l.llllllllllllllllllllllllllllllllllllllllllllll[1 t·Il3~··-·niploдlyiкrll12lllllllllllllllllllllllllllllllllll"111111111111111111111111111111' 1 1-14 \J 15 ! Продукт14 ';• [I1[6•••111111111111111111111111111111111111••••••••••••••?~ 17 i Продукт16 :J ~1~e"iilllllllllllllllllll111111111811"llllllll"11111111111111 }9.:]nродукт18 ' ,1:'') .,• ",i\§,t:i~~~!l~g".,t?J$h§~\д Готово Рис. 1.31. Форматирование ячеек с помощью цикла Первый макрос будет выбирать каждую вторую строку и применять соо~ветствующее форматирование :
• ·. .". '.. ·,.;." 92 Глава 1 ·i:>t.iБ1 rc· ·s\J.i5 sЬ:ac1eБv'E!ryseё9ildR.6'WCГ "" · ~ange("A2") . ~nt~reRoW.Select ~ Do .Wfiile ActiveCell. Value ' <> ..·:" ;у SeJ;.ectiori. Interior. C_olorinde.x _· : . .., i•-•, ActiveCell. Offset ( Z, 1 О) : En ow .. Se!ect · Loop · ,· :~n?. _sзJ:t;._ Подпрограмма ShadeEverySecondRow начинает работу со второй строки. После этого она выделяет всю строку, и самая левая ячейка (А) становится активной ячейкой. Код между операторами Do и Loop выполняется до тех пор, пока свойство Value актив­ ной ячейки не станет равно пустой строке, J:O есть, rroкa активная ячейка содержит дан­ ные. В цикле макрос устанавливает :iпщекс. цвета фона выдеЛенной ячейки равным 15 (серый цвет). После этого макрос .вьiделяет всю строку на две строки ниже активной ячейки. После выделения строк~; ~- которой ячейка А не содержит данных, условие While становится ложным и выцол,нение ц_икла завершается. Процедуру ShadeEverySecondRow можно ускорить, если отказаться от выделения. В VВА очень редко -rребуется вьrде.Ji:ение ячеек, но здесь этот подход использовался из-за того, что именно так эти oпepaЦl:Ifl :еыhолняются вручную и такой результат получаетс11 в процессе работы механизма заn,ИсИ макросов. . В следующей версии про~е~ры ShadeEverySecondRow ячейки не выделяются и процедура работает примерн;06. :& Шесть раз быстрее . В процедуре определяется пере' менная индекса i, указываЮiцая ·.на строку листа. Изначально переменной присваивается значение 2. Свойство Ce!ls Qi]:Ьекта" листа позволяет ссылаться на ячейки по номеру строки и номеру столбца,\ пQ,Эtому в начале работы цикла оператор Cells ( i, 1) указы- . tf' -1-'- ' вает на ячейку А2 . При каждо~ выполнении тела цикла значение переменной i увеличи- вается на 2. Таким обр.μ9:/>'1,- ссьrл;у на активную ячейку можно заменить на ссьrлку Cells ( i, 1) и использов,ать' с~оЙСFво EntireRow того объекта, который возвращается вызовом Ce lls ( i, 1) . В. результате-будет получена ссылка на всю строку: .. .. ' ·J5 i l ьr : r с"' su:ь ·· sпa.aeБve±-}lseaond-R:bw ~ Dim -1 As . IrrtegeJ:', ' ""• · · · •·i ·= 2· . ". Do pntil ('• . ·;- "оку.. ~- 1<i~.че5~ве· ~H~<;f: :"/ " . .:·' . '11.•'·J •. · . :~ро~~: э"~о;о:, .· существует возможность завершения цикла с пом.ощью . условия в теле циюfа,,:?Р.~~fа1:ор·~ Exit Do . Такая конструкция -Показ ана в сл е дующ е м приме р е . Также в приl{W,е П'qказ.ан еще один способ получения ссылки на всю строку. ; ~~·7,~~\..":..: ..-~,·7· .1
Пример использования VВА в Excel 93 i~·y~::~~6su~ sьa<ieБveryseconctRow (г -- ·· 1·..Do· ' . l;.i=i.·+2 ~"· If· IsEmp.ty(Cells(i, · 1)) Then . Exit Do Rows(i) .Interior.Colorindex = 15 ' Lobp ,/~. . Ь;:ш1 ~У:!:>··•.,, - " . •. . ... .-~- Еще один вариант подразумевает добавление ключевого cлoвaWhile или Until в стро­ ке с ключевым словом Loop. Это позволяет обеспечить как минимум одно выполнение тела цикла. Если условие указывается в строке с оператором Do, оно может быть ложным .с самого начала и тело цикла не будет выполнено ни разу. Иногда условие стоит проверять в последней строке цикла. В следующем примере видно, что проверка правильности ввода пароля (Pa9sWord) имеет смысл только после получения ввода от пользователя, хотя код будет работать даже в том случае, если усло­ вие Until· yкaзaть в строке Do : ti'tiБГi·c~·sиь·c;et.?assworc'I( Dim PassWord As String, i As Integer i =·о Do i=i+1 i i+i Ifi>3Then . MsgBox " ИзвИ.ните, только три попытки" . Exit Sub ' ·End If '· passWord = InputBox ("Введите пароль") Loop Until Password = "ХХХ" MsgIЗox "Добро Пожаловать" En<l..9.Jib Подпрограмма GetPassword выполняет тело цикла, пока не будет введен пароль ХХХ, но не более трех раз. Цикл For." Next Цикл For. . . Next отличается от цикла Do. . . Loop в двух_ аспектах . В цикле For. . . Next используется встроенный счетчик, который автоматически ув еличивается на каждой итерации цикла, и цикл завершает работу, когда значение счетчика превысит указанное пороговое значение. То есть, количество итер,аций не зависит от указанного П')ЛЬзователем логического условия. В следующем примере полный путь и имя книги ука­ зываются в центре нижнего колонтитула каждого листа активной книги: II'iublTc sU.Б FilePathinFoot'ёr( )' Dim i AI> Integer, FilePath As String FilePath = ActiveWorkbook.FullNarne For i = 1 То Worksheets.Count Step 1 Worksheets ( i) . PageSetup. CenterFoote.r = FilePath Next. i , , ;:E:!ld~ .S ,u):) ~.:.. ~ . • .• 1 -~ в версиях Excel ДО Excel 2003 отсутствовала возможность автомат_и:-~еск9го вкцюче- ния полного пути файла в верхний или нижний колонтитулы, поэтому такой макрос можно исriользовать для реализации недостающей функциональности. Вначале !'1акр~с присваивает значение свойства FullName _объекта активной книгИ переменн_9Й . ,· _. FilePath. Цикл начинается с оператора For и выполняется до оператора Ne:x;t. Пер~'. _·, "....'. . .'·\ . ;:, ....;
94 Глава 1 менная i используется в качестве счетчика начиная с 1 и заканчивая значением свойства Worksheets. Count. Свойство Count коллекции Worksheets применяется для опре- В первом цикле For . . . Next для определения количества символов в значении пере­ менной FilePath используется функция Len. После этого счетчик i настраивается на обрат: ный перебор начиная с позиции последнего символа в сторону начала строки. Функция Mid$ извлекает символ строки FilePath в позиции i, после чего символ сравнивается с точкой. После обнаружения точки в имени файла ее позиция заносится в переменную Point, и первый цикл For. . . Loop завершает свою работу. Если в имени файла отсутствует рас­ ширение, точка не будет найдена и переменная Point будет иметь принятое по умолчанию значение О. В таком случае условие If присвоит переменной Point мнимую позицию точ­ ки, которая находится на один символ правее последнего символа имени файла. Этот же прием используется во втором цикле For. . . Next. Начиная со следующего слева символа после точки, цикл перебирает имя файла, пока не обнаружит обратную косую черту. Позиция обратной косой черты заносится в переменную BackSlash. После этого символы между точкой и обратной косой чертой извлекаются из имени файла с помощью функцииМid$. · '\
Пример использования VВА в Excel 95 ,Цикл For Each." Next Если приходится обрабатывать каждый член коллекции, можно воспользоваться циклом For Each. . . Next . Следующий пример является переработкой процедуры FilePathinFooter: · ;J?U:ь1:l:c" s\.iь-~.FJ..1eI>a flirnF'oo t.еrтг~·~ ·· ·~·· f. DiЩ~fil.ePa th AS String, aWo:r;-k,sheet As Worksheet r . !;. ~· FilePath = ActiveWorkbook : FullName For · Басh aworksheet· Iri Worksheets aworksheet".PageSetup.CenterFooter Next·· aWorksheet LE!в!:l, §11:0. .·~ •."~;""_ Fil.ePath !.......m Тело цикл<t' перебирает всех членов коллекции. На каждой итерации ссылка на сле­ дующего члена присваивается объектной пepeмeннoйaworksheet.. В следующем примере выводится список файлов корневого каталога на диске С. В этом случае используется объект Microsoft Office FileSearch, позволяющий сгенерировать объект FoundFiles, в котором содержатся имена найденных файлов. в · данном случае для вывода имен файлов используется цикл For Each. . . Next. · r:P:u.ъг:I:<:: sиь FileList. ( )' 'Dim]ile As Variant . With Application.FileSearch .. <Lookrn·= "С:\ " . FileType = msoFileTypeAllFiles . Execute \ For Each' File In .FoundFiles ·МsgBox File Next File End .Wi.th ' ~E;Q,!1_$)JJ:J,•.: : -- --· '' -·-···' ·· ····~·' Если работа процедуры проверяется на каталоге с большим количеством файлов, не­ обходимость постоянно щелкать на кнопке ОК может утомить. В таком случае можно воспользоваться механизмом прерывания работы подпрограммы, который вызывается комбинацией клавиш <Ctгl+Bгeak>. Массивы Массивы представляют собой переменные. VВА, в которых хранится больше одного элемента данных. Массив объявляется при помощи скобок, указываемых после ero имени. В скобках указывается целое число, которое определяет количество элементов массива: фiiii ' ~t.?.J~J J\!? J ij. teg<?f'. · ". · Для присвоения значений элементам массива необходимо указать номер элемента, как показано ниже: Количество элементов в массиве зависит от базового индекса массива. Принятый по }'молчанию базовый индекс равен О. Это значит, что первый элемент массива имеет но­ мер О. Если базовый индекс равен О, оператор Dim Data (2) As Integer объявляет . массив из трех целых элементов . В то же время в разделе объявлений модуля можно до- бавить следующий оператор, который сделает базовый индекс массива равным 1: . ,j (bpt-~oii • 1. ."
96 Глава 1 При использовании единичного базового индекса оператор Dim ~ta (2) As Integer будет объявлять массив из двух целых элементов. Элемент с индексом О не будет существовать. Для проверки эффекта оператора Option Base можно воспользоваться следующей процедурой: В массиве Arrayl используются функции LBound (нижняя граница) и UBound (верхняя граница) для определения наименьшего и наибольшего значения индекса мас­ сива. Функция листа Count применяется для определения количества элементов . масси­ ва. Если запустить этот код· после выполнения оператора Option Base О или без опе­ ратора Option Base, наименьшее значение индекса массива будет равно О, а в массиве будет 11 элементов. При использовании oпepaтopaOption Base 1 наименьший индекс составит 1 и в массиве будет храниться 1О элементов. Обратите внимание на исполъзование встроенн,ой кон,стантъt vbCr, в которой хра­ нится символ возврата каретки. Константа vbCr применяется для разбивки текста сообщения на ЖС'Колъко строк. Если размер массива не должен зависеть от оператора Option Base, нижнее и верх­ нее значения индекса можно определить явным образом, например: Массивы исключительно полезны для обработки групп элементов. Если необходимо создать короткий список, воспользуйтесь функциейАrrау, как показано ниже: После этого список можно использовать в цикле For. . . Next. Например, можно открыть и обработать последовательность книг, которые называются Север. xls, Юг. xls, Восток. xls и Запад. xls: , sиь.:лгr~у2 '<У­ пim Data . AsNari I:Jim i ' As Inte'gE!r
Пример использования VВА в Excel 97 Многомерные массивы До этого момента рассматривались массивы только с одним измерением. На самом деле можно определять массивы с несколькими измерениями (до 60). Хотя компьютеры с легкостью справляются со сложностью n-мерных массивов, где n больше 4 или 5, люди практически не в состоянии воспринимать такие конструкции. Следующие операторы определяют двумерные мhссивы: :JSim ьа.tаснг. :HJ-)• д5· rnt.ege r = JJ iin Dj1:;~Cl . J'<:J. l Q, 1 , '!'9 . ~QJ _ Ao; · ln_teg"'r Двумерный массив можно представить в виде таблицы с данными. В предыдущем примере определяется таблица с 10 строками и 20 столбцами. Массивы в Excel очень удобны для обработки данных из диапазонов на листах. За­ грузка данных из листа в массив, обработка и запись результата обратно на лист оказыва­ ется намного эффективнее, чем обработка каждой ячейки в отдельности. В следующей процедуре показано, как значения из диапазона присвоить переменной типа Variant. В этом коде функции LBound и UBound испqльзу~отся для определения размерности массива Data. Обратите внимание, что функции LBound и UBound прини­ мают второй параметр, который указывает интересу~ощий индекс. Если этот параметр не указывать, функция будет рассматривать первый индекс: 'J?U:ьйс. ·sиь-.д.гrауЗ () Dim Data As Variant, Х As Variant Dim Message As String, i As Integer Data = Range("Al:A20") .. Value i=1 , Do f Message = "Нижняя гр,э.ница = " & LBound (Data, i) '. & vbCr J Message = Message & · " В~рхняя граница " & UBound {:Ьа .tа, i) & vbCr .!, t MsgBox Message, "Индекс= " &i ~- ~n=E~r~-r1 Resume Next ! Х = UBound{Data, i) {, I f Err.NumЬer <> О Then Exit Do 1 On Error GoTo О i Loop t Message = " Количество · непустых элементов = · " ~ & WorksheetFunction.CountA(Data) & vbCr ~ МsqBox Message t.F,:rid Sub , . При первом выполнении цикла Do . . . Loop подпрограмма ArrayЗ определяет верхнюю и нижнюю границы первого индекса массиваDаtа, так как переменная i имеет значение 1. После этого значение переменной i увеличивается на единицу для просмот­ ра второго индекса. Работа цикла завершается в случае сообщения об отсутствии допол­ нительных измерений. Передавая в подпрограмму ArrayЗ различные диапазоны, можно увидеть, что при назначении диапазона значений переменной типа Variant создается ~вумерный массив. Такой массив создается даже в том случае, если в диапазоне присутствует только одна строка или один столбец . Кроме этого, оказывается, что нижняя граница индекса всегда равна 1, вне зависимости от oпepaтopaOption Base в начале модуля.
98 Глава 1 Динамические массивы При создании кода не всегда можно заранее определить размер массива, который потребу­ ется в процессе работы. Например, может понадобиться загрузить в массив имена всех фай­ лов с расширением . xls из текущего каталога. Одним из вариантов является объявление дос­ таточно большого массива, который вместит максимально возможное количество э.Лементов. Но это решение отличается неэффективностью. Вместо этого можно определить динамиче- ский массив, размер которого устанавливается в процессе работы процедуры. · Для определения динамического массива достаточно не указывать размерность в объ­ явлении: Для указания необходимого размера в процессе работы воспользуйтесь оператором ReDim. При этом размер массива можн~ передавать в виде значений переменных: !R'eiiIIK' baEжa<IIfёwS:-IcБiunщs 1:лз ~sь=:tng~' .•. . ' ' iE§!RJi:rt: P?:t}!.i!!!:J:Jll3;0W .tg :fuЙ?!iBOl'{J.•!Q.:i,ЧC:RJ j:Q :!шЭ:к.С:я1)_:]\..§-.$,t.;:J Использование оператора ReDim приводит к переинициализации 1'4ассива и уничто­ жению всех хранящихся в массиве данных. Для сохранения данных необходимо приме­ нять ключевое слово Preserve. Это ключевое слово используется в следующей процеду­ ре. В этом примере имена файлов загружаются в динамический массив FNames в теле цикла Do. . . Loop. При этом на каждой итерации верхняя граница индекса массива увеличивается на единицу, чтобы обеспечить место для храuения нового имени. Функ­ ция Dir возвращает первое имя, соответствующее шаблону из переменной FType. По­ следующие вызовы функции Dir без параметра приводят к использованию того же шаб­ лона, но функция возвращает следующий файл, соответствующий спецификации. После возвр<).та всех имен файлов функция возвращает пустуЮ строку. {P~.uьiIC:~"suь-~-FIГe.Name.з:·(·····Г'"".. ~··· Dim FNo;шi:e А!З String . • ' Di·m. . .F:Names () As string Dim FType As . strin:g Dim . t ., l\.s :tnteger " Если планируетс.я обрабоm?Са файлов из ?Са.талога с послеi!ующuм сохранением резулъта­ тов, желателъно сна'ЧШ/,а палучитъ весъ спш01С файлов (1Са1С в пpov,e(}ypeFileNames), па­ сле 'Чего исполъзоваrпъ этот спш01С для обрабоm?Си. Если приложение поспwянно 'Чита.еrп и перезаписывает файлы в ?Саталоге, на фун?Сv,ию Dir палагатъся не стоит.
Пример использования VВА в Excel 99 Обработка ошибок на этапе выполнения При проектировании приложения необходимо предусмотреть возникновение всех проблем, возможных при использовании приложения в реальных условиях . МоЖно ис­ править все ошибки и спроектировать безупречную логику, которая срабатывает при всех наборах условий, но простая проблема в работе аппаратных средств может привести к аварийному завершению работы кода с невразумительным сообщением об ошибке. Например, если попытаться сохранить файл книги на гибком диске в приводе А, ко­ гда гибкий диск в приводе отсутствует, код остановит свою работу и выдаст сообщение, которое не каждый пользователь сможет расшифровать. Если есть вероятность появления такой ошибки, код может незаметно обработать та­ кую ситуацию. Для этого язык VВА предоставляет механизм перехвата ошибочных со­ стояний с помощью следующего оператора: '9Р:. ):.rr§~ ... qo~o : Li~e.]ja.i?]il :~ ::. - · -· "':~ ..;,~- ·-:;:~ ::.:~.:~2:';·""'"''м•·'""" LineLabel является меткой, добавляемой в конец нормального кода, как показано ниже (метка errorTrap). Обратите внимание, что после . метки указывается символ двоеточия. Метка строки обозначает начало кода обработки ошибки. Перед меткой необ­ ходимо добавить оператор Exi t, который предотвратит выполнение кода обработки ошибки после нормального завершения работы кода: i.PUbIIC "SU1J E"ir6!:-тrapi'TY" '" "":''"~'<'"""<'';'"No··:т·v ;<V<O'~~·,··v· ~"•• , 1; Dim Дnswer ]\.s Loцg, : MyFile As Stririg . Dim мessage As String, currentPath As ' errorTrap CurDir$ ' ' Попь1таться сменить диск на диск А: ChEJri ve "А" ChDrive CurrentPath ChDir CurrentPath MyFi1e ' = "A:\Data.xl's" Ai;>plication.DisplayAlerts =• Fэ,l~e ~ Попыта·ться сохранить лист на диск А: ActiveWorkbook .SaveAs FileName:=MyFile. 1TidyUp: . ChDrive CurrentPath ChDir CurrentPath tExit Sub lerrorTrap : ~ Message " Номер ошибки : =· " & Err. Number & vbCr Message Message & Err.Desciiption & vbCr & vbCr Message · Message & " Встiцзьте диск в привод А:" & vbCr Message Message & "и щелкните на кнопке ОК" & vbCr & vbCr Message Message & " Щелкните на кнопке Отмена для отмены \~ сохранения" , · Answer = MsgBox (Message , vbQuestion + vbOKCancel, . "Error ''} If Answer vbCancel Then Resume TidyUp ;·· Resume j:ц,(;1, §11.1? , .., ' После выполнения оператора On Error механизм перехвата ошибок оказывается включен. При возникновении ошибки не выдаются никакие сообщения и выполняется код, который находится после соответствующей метки. С помощью объекта Err можно полу-
f·• ~. 100 Глава 1 чить информацию о возникшей ошибке. Свойство NumЬer объекта Err возврашает номер ошибки, а в свойстве Description предоставляется сообщение, связанн0е с этой ошиб­ кой. Свойство Err. NumЬer можно использовать для определения возникшей ошибки при наличии нескольких различных ошибок . Содержимое свойства Err. Descr i pt i on можно использовать в собственном сообщении об ошибке. В Excel 5 и Excel 95 'КОНструкц,ия Err представляла собой не оби:кт, а фун'Ку,ию, 'Кото­ рая возвращала номер ош,ибки. Та'К 'Как свойствоNитЬеr является принятым по умол­ •~анию свойствам обr,екта Err, исполъзование Err эквивалентно исполъзованию Err. NumЬer. Это позволяет 'Коду из более старых версий Excel без изменений работатъ в Excel 97 и более новъ~~ версиях. После оператора On E rror код процедуры ErrorTrapl сохраняет текущий путь и имя диска в переменной CurrentPath. Потом выполняется оператор ChDrive, который пы­ тается активизировать привод А Если в приводе отсутствует гибкий диск, возникает ошиб­ ка 68 (Device unavailaЬle) и выполняется код обработки ошибки . В демонстрацион­ ных целях код ошибки и описание выводятся на экран, и пользователю предоставляется возможность вставить диск в привод и продолжить работу или отказаться от сохранения. Если пользователь выбирает завершение работы, управление передается обратно на метку TidyUp и процедура восстанавливает начальные параметры диска и каталога. В противном случае выполняется оператор Resume, который передает управление опе­ ратору, выполнение которого привело к появлению ошибки. Если в приводе А до сих пор нет диска, код обработки ошибки будет выполнен еще раз. В противном случае код про­ должит нормальную работу. Единственным назначением оператора ChDr i ve "А" является проверка готовности привода А, поэтому код восстанавливает параметры диска и каталога. Перед сохранени­ ем активной книги код устанавливает свойство DisplayAlerts объекта Application в значение Fa l se. Это позволяет с.крыть предупреждение о перезаписи старого файла Data. xls новым . (Дополнительная информация о свойстве DisplayAlerts приво­ дится в главе 18.) ,fj- Оператор Resume доступен в трех вариантах: О Resume - приводит к выполнению оператора, который привел к появлению ошибки; О Resume Next - передает управление оператору, следующему после оператора, который привел к появлению ошибки; О Resume LineLab~l - передает управление на произвольную метку строки. Это позволяет продолжить выполнение кода в любом месте. В следующем коде оператор Resume Next используется для обхода оператора Ki l l, если возникает такая необходимость. Оператор с симпатичным названием Kill позво­ ляет у,!J;алить файл с диска. В следующем коде делается попытка удаления всех файлов с таким же именем, как у сохраняемого файла, что позволит обойти предупреждение с запросом о перезаписи существующего файла . Проблема заклю:чается в том, что оператор Ki l l приводит к появлению фатальной ошибки, если удаляемый файл не существует. Если вызов oпepaтopaKill привел к чояв­ лению ошибки, выполняется код обработки ошибки и оператор Resume Next передает, управление следующему за оператором Kil l оператору (SaveAs). Вызов функции MsgBox добавлен только в демонстрационных целях. В реальном приложении он обьiчно не используется:
WorkbOoks . Add MyFile . = "C:\Data.xls " Kil1 MyFile Пример использования VВА в Excel 101 1 . ActiveWorkbook. saveAs FileName: =MyFile ~. ActiveWorkbook . Cl ose · Exit Sub ~errorTrap, · ~ Message · ''Номер ошибки: = " & Err . Nurnber & vbCr ~ Message'· = Message & Err. Description & vbCr & vbCr ' Message = Message & "Файл не существует " Ariswer = MsgBox (Message, vЫnf'ormation, "Ошибка") Resume Next .J?.!19: ":?.11.1:> .· '- ... . . . .:. . Оператор On Error Resume Next В качестве альтернативы оператору On Error GoTo можно использовать следующий оператор: ,QP.~:J?ir<Jr.... Resume Этот оператор приводит к игнорированию ошибок . Такая возможность должна при­ меняться с осторожностью . Следующий код является результатом переработки процеду­ ры ErrorTrap2: fsilь Бrrorтra:Pз <J- ~- ~ · Dim MyFi1e As String, Message As String ~. ! Workbooks .Add ' MyFile = "С: \Data. xls" ~ On Error Resume Next t Kill MyFile On · Error GoTo О Activeworkbook. SaveAs FileName: =MyFi.le Activeworkbook.Close !~nc1" ?~b Оператор On Error Resume. Next используется сразу перед оператором Kill. Если файл С: \Data. xls не существует, ошибка в работе оператора Kill игнорируется, и вы­ полнение процедуры продолжается со следующей строки. ·В конце концов, нас не волнует отсутствие файла, так как именно этого мы пытаемся добиться с помощью оператораКi l l . Оператор On Error GoTo О может ввести в заблуждение. На самом деле его задачей является сброс объекта Err. Оператор On Error . Resume ;Next используется для создания кода, который в про­ тивном случае был бы менее эффективным. В следующей подпрограмме определяется существование имени в активной книге: PuЫ ic sU.ь ··тesi:ForName () If NameExists ( "SalesData ") .Then MsgBox "Имя: существует" Else . MsgJ?o?C "Им я: не существу~'J.'·;
102 Глава 1 '~ ~End'rf'I'·Р:: .~ jEnd suч . Процедура TestFo:tName вызывает функцию NameExists, которая использует оператор On Error Resume Next для предотвращения фатальной ошибки при попытке назначения переменной имени из свойства RefersTo. В данном случае необходимости в операторе On Error GoTo О не возникает, так как обработка ошибок в · процедуре отключается после за­ вершения ее работы (хотя значение свойства Err. NurnЬer и не сбрасывается). Если ошибка не возникает, свойство NumЬer объекта Err остается равным нулю. Если свойство Err. NumЬer имеет ·ненулевое значение, напрашивается вывод, что возникла ошибка. В этом случае можно предположить, что имя не существует, поэтому функция NameExists возвращает значение False и состояние ошибки сбрасывается. Альтерна­ тивой такой однопроходной функции является циклический перебор всех имен в книге в попытке найти совпадение. Если в книге присутствует большое количество имен, про­ цесс может оказаться достаточно длительным. Резюме В этой главе были представлены компоненты языка VВА, которые позволяют создавать полезные и эффективные процедуры. Было показано, как добавлять в макросы интерактив­ ность с помощью функций MsgBox и InputBox, а также как использовать переменные для хранения информации и получать справочную информацию о ключевых словах языка VВА Демонстрировалось, как объявлять переменные и определять их тип, а также влияние различных способов объявления на область видимости и врем~ жизни пер~менных. В главе рассматривалось использование блочных структур If и Select Case для проверки условий и выполнения альтернативных вычислений. Циклы Do. . . Loop и For. . . Next позволяют эффективно повторять похожие вычисления. Также было рассказано, как использовать мас­ сивы, особенно в комбинации .с циклическими процедурами. Кроме этого, было продемонст­ рировано использование операторов On Error для перехвата и обработки ошибок. При создании кода VВА для Excel проще всего начинать с применения механизма за­ писи макросов. После этого код можно модифицировать для адаптации к конкретным требованиям и повышения эффективности с помощью редактора VВЕ. Окна Object Browser (Просмотр объектов), Help (Справка) и справочный раздел в этой книге позво­ ляют найти объекты, методы, свойства и события, которые не используются механизмом записи макрос·ов. Язык VBA предоставляет структуры, позволяющие эффективно обра­ батывать большие объемы данных и автоматизировать монотонные процессы. Для программистов VВА редактор VВЕ является оснqвным инструментом . В следую­ щей главе будут рассмотр ены некоторые возможности этого редактора. Знакомство с ним окажется полезным при рассмотрении более сложных тем программирования в главе 4.
Программирование в редакторе VBE С момента появления Boгland ТuгЬо Fascal для DOS современные программисты по­ лучили предмет роскоши в виде интегрированной среды разработки, представляющей , собой текстовый редактор (как Блокнот (Notepad) или Word), специально настроенный на написание кода на одном или нескольких языках программирования. Редактор VВЕ является интегрированной средой разработки, которая предоставляется вместе со всеми продуктами, поддерживающими язык VВА (вклIQчая Micгosoft Excel). Таким образом, научившись использовать редактор VВЕ и язык VBA в одном приложении, можно счи­ тать, что умеешь это делать во всех приложениях. Остается только изучить объектную модель каждого приложения Office, для которого необходимо писать интересующий код. К счастью, ответы на большинство вопросов приводятся в справочном руководстве. Эта книга посвящена программированию, поэтому желательно хорошо познакомить­ ся с возможностями редактора VВЕ. Опытные программисты на языке VВА, которым уже доводилось использовать редактор VВЕ, могут просто просмотреть эту и следующую гла­ вы, чтобы убедиться, что в редакторе не появились новые, не встречавшиеся раньше средства. Нови~rки в программировании на языке VВА могут почерпнуть из этой главы приемы оптимизации процессов написания и отладки кода. Написание кода Компьютеры ничего не знают о с.Лавах или правописании. Компьютер интересуется только бИ:тами и байтами. Даже языки нИзкого уровня с простым синтаксисом, например ассемблер, рассматриваются точно так же, как языки 13ысокого уровня. Синтаксис и язы­ ки программирования интересуют только компилятор и чело11ека. Так как задачей ком-
104 Глава 2 пилятора является преобразование языка программирования в биты и байты для выпол­ нения кода компьютером, компилятор должен получать н а входе код с правильным син­ таксисом. Чем проще код для чтения человеком , тем проще его поддерживать. Следова­ тельно, программист должен изучить синтаксис для обеспечения правильной работы компилятора и сформировать хороший стиль программирования для облегчения работы человека. Все эти принципы наиболее полно достигаются при использовании редактора . Программирование для людей Компилятор четко выполняет предоставленные инструкции; для этого код должен быть синтаксически правилен, а стиль программирования к·омпилятор не интересует. Но кроме компилятора код пишется и для человека , поэтому стоит обратить внимание на несколько простых концепций и применять эти концепции в своей работе . , Обычно люди плохо воспринимают аббревиатуры, поэтому лучше использовать Це­ лые слова. Кроме этого, существительные и глаголы в английском языке составляют полное предложение , поэтому выбирайте хорошие существительные для имен классов и хорошие глаголы для имен методов . Более того, компилятор воспримет даже одну мо­ нолитную процедуру, в которой решается поставленная задача , пока синтаксис процеду­ ры остается правильным. С другой стороны, люди испытыв ают значительные сложности в попытках понять смысл такого кода . Они не в состоянии одновременно воспринимать несколько идей и исключительно хорошо справляются с обработкой одной идеи в опре­ деленный момент . Поэтому методы и свойства должны быть короткими и однозначны­ ми, а не длинными и многозначными - другими словами , процедура должна решать одну задачу и имя процедуры отражать ее назначение. Код намного сложнее понять, если в процедуре применяется больше нескольких строк кода. Если в процедуре необходимо использовать большое количество строк или очевидность кода под вопросом , напишите комментарий. Комме нтарии не всегда обяза­ тельны. Компилятор не обращает на них внимання, поэтому комментарии лучше исполь­ зовать для прояснения алгоритма, а не для дублирования очевидного кода. Создание ко­ ротких процедур делает большие процедуры проще в отладке и позволяет разработчикам реорганизовывать существующие процедуры для решения новых задач . Часто монолит­ ные процедуры могут использоваться то1;1ько в одном контексте . Кроме этого , оказывается полезной визуальная организация кода. Именно поэтому стоит использовать выравнивание для обозначения структуры. Старайтесь всегда при­ менять одинаков'ые параметр'ы выравнивания. Код является результатом труда програм­ миста и должен быть правильно организован . Старайтесь всегда явно и точно формулировать мысли. Используйте oпepaтopOp t ion Exp licit в начале каждого модуля и явно объявляйте все переменные с помощью наи­ более подходящего типа данных. Если значение не будет меняться в процессе работы, применяйте константу. Константы не меняются, поэтому если константа инициализиро­ вана с использованием подходящего значения, это значение всегда будет правильным и всегда будет приводить к получению надежного результата. Наконец, тестируйте код небольшими фрагментами. Каждая процедура или свойство должны быть как можно более независимыми. Для этого нужно снижать зависимость от ар­ гументов за пределами области видимости внутри процедуры. При создании кода процеду­ ры (включая процедуры свойств) проверяйте каждую процедуру на получение ожидаемого результата при предоставлении известных параметров . Быстрое тестирование созданной процедуры можно выполнить в окне lmmediate (Проверка). (Дополнительная информация о создании надежного кода, тестировании и отладке приводится в главах 7 и 8 .)
Программирование в редакторе VВЕ 105 Если следовать этим рекомендациям , получающийся в результате код будет правиль­ ным, единообразным и, несомненно, более простым для понимания. Результатом такого подхода к программированию будет большая готовность других программистов помочь в случае проблем в работе кода. ' Написание кода в редакторе VBE Чтение и написание большого объема кода - лучший способ получения опыта. Можно импортировать существующий код, который рассматривается далее в этой главе (JJ;ополни­ тельная информация приводится в разделе "Импорт и экспорт кода Visual Basic"), но в большинстве случаев задачи программирования решаются с помощью редактора VВЕ. Редактор VВЕ является отдельным приложением. Он связан с определенным инструмен­ том Office. Для запуска редактора VВЕ в Excel (или в другом приложении Miп·osoft Office) можно нажать комбинацию клавиш <Alt+Fl 1> или выбрать команду меню Сервисе::> Макросе::> Visual Basic Editor (Toolsc::>Macгoi=>Visual Basic Editor). После запуска редактора VВЕ его мож­ но воспринимать как специальный инотрумент текстового процессора, поддерживающий синтаксис языка VВА. Вводимый текст будет распознаваться редill<тором VВЕ и редактор будет реагировать на синтаксические конструкции, состоящие из специальных ключевых слов. На­ пример, редактор VВЕ будет автоматически конвертировать имена процедур в формат Pascal. Помните, что все программисты имеют собственное мнение и склонность к опреде­ ленному стилю написания кода, так как стиль кодирования - это совершенно субъектив­ ное понятие. Хорошим правилом является использование явно успешного стиля кодиро­ вания или использование стиля, который · аргументировано более предпочтителен. Куд1а делся мой код? Весь код хранится в модулях, модулях классов или в объектах UserForm. Это специ ­ альные окна текстового процессора, используемые в редакторе VBE для обнаружения синтаксических ошибок и, с применением компилятора, программных оuiибок. Модуль можно воспринимать, как пустой лист бумаги, а клавиатур.у - как печатающую машинку. Если планируется написать короткий рассказ, можно сразу приступать к работе. Но боль­ шинство задач программирования требуют определенного планирования. Существует несколько подходов к написанию кода. Опытные программисты начина­ ют с использования инструмента проектирования, например, инструмента моделирова­ ния на языке Rational Unified Modeling Language (UML). Этот инструментарий поддер­ живает методический подход к решению проблем, позволяя описывать решение с помо­ щью графических символов . Но Изучение языка UML занимает некоторое время ,' так как это отдельный язык Программирования. Язык моделирования обладает тем преимуще­ ством, что графические символы лучше передают смысл к проще в создании и чтении, чем о_бычный код. Более простая форма инструмен"I:а моделирования позволяет рисовать · диаграммы, которые описывают поток · выполнения. Но инструмент для построения блок-схем предоставляет меньше возможностей, чем инструмент для моделирования UML, хотя и требует определенного времени на освоение . Кроме этого, существуют про­ стые методы записи алгоритмов на бумаге обычным человеческим языком. Эта техника часто используется в курсах по компьютерным наукам в течение последних 20 лет. Осо­ бые программисты, которые называются архитекторами, должны знать все эти тонкости, но по ряду причин такой подход является не самой лучшей отправной точкой для начи­ нающих программистов. Возможно, самым оптимальным началом для новичков является
106 Глава 2 написание кода, но код необходимо писать, помня об основном направлении. Рассмот­ рим более подробно значение этого утверждения . Если необходимо добавить несколько простых макросов , можно начать с их записи. Это быстрый и простой подход. Если необходимо внести изменения, переключитесь в редактор VВЕ и модифицируйте записанные макросы. Если приходится писать прило­ жение для Excel, можно комбинировать записанные макросы, собственные процедуры и диалоговы е окна UserForm. После этого мысленно сгруппируйте проблемы и создайте отдельные модули, модули классов и диалоговые окна UserForm для каждой группы . На­ конец, начинайте создавать поля, свойства, методы и события, позволяющие решить проблемы из каждой группы. Этот подход хорош для цроблем средней сложности. Но для больших проблем подход "просто написать" может оказаться не самым понятным реше­ нием. На этом этапе справиться со сложным кодом поможет метод, который называется рефшкторингом (refactoring). Дополнительная информация о рефакторинге приводится в книге Мартина Фаулера (Mai-tin .Fowleг) Refactoтing: Irnproving tlie Design of Existing Code (Addison-Wesley , 1999). К сожалению, данная тема выходит за рамки нашей книги . Последний совет : если заране е известно, что создается критическое приложение для Excel и у вас нет опыта в создании таких приложений, обратитесь за помощью как можно раньше . Учитель, архитектор или опытный помощник позволят обойти проблемы, кото­ рые могут возникнуть в процессе разработки . Рефакторинг является неотъемлемой ча­ стыо уточнения, повторного использования и упрощения кода, но даже рефакторинг об­ ладает определенными огр аничениями. Критические приложения уровня предприятия должны проектироваться опытным архитектором или человеком, который уже имеет опыт успешного создания приложений сопоставимого уровня сложности. Лучше заранее осознать с обств енные огр аничения и найти способ их компенсировать . Управлени е пр.оектом Приложения VBA основаны на концепции проекта. Код в составе модулей является компонентом большего проекта , в который входят книги и листы . Из редактора VВЕ со­ став проекта !'южно определить с помощью окна Project Explorer (Окно проекта). Для открытия окна Project Explorer (Окно проекта) воспользуйтесь командой меню Vie'wq Project Explorer (ВидqОкно проекта) или нажмите комбинацию клавиш <Cti·l+R>. При создании новой книги окно Project Explorer (Окно проекта) должно выглядеть, как пока­ зано на рис., 2.1. VBAPraject (Книга!) [~)·"~ Microsoft Excel Objects ~ fIOlr ФIUФШJ ! l[J Лист2 (Лист2) :. ·i[J Листз (ЛистЗ) ··iJ ЭтаКнига Рис. 2.1. Оюю Project ExpЮrer в 1ювой книzе
Программирование в редакторе VВЕ 107 Листl является модулем класса, представляющим лист Листl. Лист2 представляет лист Лист2, а ЛистЗ ~лист ЛистЗ. ЭтаКнига также будет модулем класса, который представляет книгу, открытую в данный момент. Эти модули являются представлением книг и .листов с точки зрения VВА. Таким образом, при добавлении нового листа .к при­ нятой по умолчанию группе из трех листов в окне Project Explorer (Окно проекта) будет показан еще один модуль классаЛист4. Хотя обычный пользователь мо)J<ет не догадываться о существовании модулей клас­ сов, представляющих каждый лист и книгу, разработчики должны об этом знать. Окно Project Explorer (Окно проекта) предоставляет средства для организации модулей и форм приложения. При необходимости здесь можно добавлять новые модули, модули классов и диалоговые окна UserForm. Эти сущности добавляются в проект с помощью меню lnsert (Вставка) в редакторе VВЕ или с помощью контекстного меню в окне Project Explorer (Окно проекта). (Контекстные меню активизируются с помощью щелчка правой кнопкой мыши на объекте: в данном случае это щелчок правой кнопкой мыши на самом окне Project Explorer (Окно проекта).) ' Управление расположением элементов управления При добавлении в проект диалоговоrо окна UserForm добавляется новый модуль формы (рис. 2.2). Кроме этого, открывается диалоговое oкнoControl Toolbox (Элементы управления). Добавление элементов управления в окно формы очень похоже на исполь­ зование программы для рисования - щелкните на элементе управления в окне Control Toolbox (Элементы управления) и щелкните на том месте формы, в котором должен на­ ходиться элемент управления . Кроме . этого, можно воспользоваться левой кнопкой мы­ ши и перетащить прямоугольник, очерчивающий область, которую должен занимать элемент управления (см. рис. 2.2). .......... ... ~ .::;::;:::·:;;·::;:;:~~: .....'... . .•...... ....".~;......;· . ......;.,·..... ·····"· .'";~..,•·...•'...... ·::.:::· ' Рис. 2.2. Добавление диалоzовоzо окна UserFarm р! L.J _J ~ ;!!.·~ Точки на поверхности формы в процессе проектирования облегчают выравнивание элементов управления, помогая . создавать визуально одинаковый интерфейс. Кроме это­ го, в меню редактора VВЕ Format (Формат) предоставляются несколько подменю, позво­ ляющих управлять в.ыравниванием , размером, центрированием, порядком, а также вер­ тикальными и горизонтальными промежутками меЖдУ элементами управления. Эти пункты меню работают с группами элементов управления. Для выделения нескольких
108 Глава 2 элементов управления необходИ:мо щелкнуть левой кнопкой мыши и . перетащить пунк­ тирную линию вокруг интересующих элементов управления. (Также можно воспользо­ ваться клавишей <Shift>. Удерживайте клавишу <Shift> и щелкайте на интересующих элементах управления, чтобы добавить их в группу.) Например, для выравнивания эле­ ментов управления Label по левому краю выделите интересующие элементы управле­ ния и выберите команду меню Formati:::> A lig ni:::> Left (Формат<=:> Выравнивание~:::> По левому краю). В большинстве случаев названия пунктов меню говорят сами за себя и, при нали­ чии определенной практики, оказываются достаточно простыми и удобными . Добавление классов Модуль класса представляет собой особый тип модуля, в котором описывается класс Component Object Module (СОМ). Если речь заходит об объектно-ориентированном программировании вообще или объектно-ориентированном программировании в VBA, то подразумевается создание кода для модулей классов или кода, использующего суще ­ ствующие классы , например Workbook, Worksheet или Range. Если определить модуль класса, то переменные этого типа (типа этого класса) при­ дется определять с использованием имени модуля. Для создания и инициализации эк­ земпляров класса применяются операторы Set и New. Простой модуль в составе Excel не требует использования этих операторов. Члены простых модулей технически являются статическими членами, то есть процедура в простом модуле - член единственного эк­ земпляра класса (член модуля, в котором содержится процедура). Отвлечемся на минуту. В языке С++ статические члены класса доступны до создания экземпляра класса (объекта); статические <шены <;:уществуют в единственном экземпляре для всех экземшrяров класса. В та­ ких языках, как С++, программист должен явно определять все конструкции, поэтому исполь­ зование статических членов в С++ требует дополнительных трудозатрат от програ,"1миста. Напротив, в таких языках, как VВА, прос'тота достигается за счет снижения мощности доступ­ ных средств. Например, в VВА модуль является статическим к.Jiассом (не с точки зрения VВА, а с точки зрения С++) и все члены класса доступны при указании имени модуля даже без соз­ дания экземпляра класса (модуля). Кроме этого (что еще больше вводит в заблуждение), в VВА слово статический (static) Имеет собственный смысл. В языке VВА слово статический (static) используется для обозначения переменных уровня процедуры, которые хранятся не в стеке. Вместо этого в VВА статические перемен­ ные хранятся в памяти данных. Ограниченная область видимости переменных уровня процедуры связана с тем, что они создаются ~ области стека центрального процессора, ко­ торая увеличивается при запуске каждой процедуры и уменьшается при завершении работы процедуры. Память стека используется повторно при каждом завершении одной процедуры и запуске другой. Это приводит к перезаписи области стека, включая хранящиеся там зна­ чения переменных уровня процедуры. Слово статиЧеский (static) в языке VВА означает, что переменная области процедуры хранится в памяти данных и не перезаписывается в ре­ зультате уменьшения или увеличения области стека. Именно по этой причине статические переменные в VВА сохраняют значение между вызовами процедуры. Если вы хотя бы раз страдали от насмешек программистов С++ над языком VВА, то должны уже понимать, что на самом деле для программирования на языке С++ (Delphi, VВ.NET или С#) необходимо знать намного больше, чем для программирования на языке VВА (что иногда приводит к распуханию юношеского эго) . Но в то же время стоит отме­ тить, что су:шествует множество проблем, которые быстрее и проще решаются с помо-
. Программирование в редакторе VВЕ 109 щью VBA. Кроме этого, на любом языке код могут писать как хорошие, так и плохие про­ граммисты. Если возникло устойчивое желание изучить такие концепции, как указатели, адреса, доопределение операторов, . статические члены, интерфейсы, наследование, множественное наследование, многопоточность, кадрl?I стека, полиморфизм, абстракт­ ные классы, шаблоны и универсальные классы, изучите язык С++ и язык ассемблера. Ес­ ли необходимо обрабатывать числа и данные, то эта книга Именно то, что нужно. Модификация свойств В главе 1 было показано, что классы и модули имеют свойства. Это касается как новых, так и существующих классов. В редакторе VВЕ, как в инструменте визуального проектиро­ вания, могут модифицироваться классы специального вида, называемые элементами управления. Предоставляется возможность выделения классов элементов управления, а также изменения их состояния на этапе проектирования в окне Properties (Свойства). Для открытия окна Properties (Свойства) в редакторе VВЕ необходимо выбрать команду меню ViewqProperties (ВидqСвойства) или нажать клавиirrу <F4>. В окне Properties (Свойства) предоставляется раскрывающийся список элементов управления, а также от­ сортированный в алфавитном порядке список открытых свойств. Свойства выбранного элемента управления можно модифицировать. Изменение' значения свойства станет замет­ но уже на этапе проектирования. Например, для изменения заголовка объекта UserForml из последнего раздела на MyForm достаточно щелкнуть на диалоговом окне UserForm, най­ ти свойство Caption и изменить текст в поле ввода справа от имени свойства. Некоторые свойства модифицируются так же легко, как свойство Caption. Другие свойства предоставляют более сложные механизмы модификации . Например, для изме­ нения шрифта в диалоговом окне UserForm необходимо выделить диалоговое окно, от­ крыть окно Properties (Свойства), найти свойство Font и щелкнуть на кнопке в поле ввода (рис. 2.3). Propertles - Userforml 18) ! Us~rforml Userform _:J AlphoЬetic 1cateQOrized 1 Рис. 2.3. Изменение шрифrrш в диалоговом о~сне UserForm
110 Глава2 · :- ~~~~ ~-:. -.- -щ-~~_,...,,....,.<"t?" --~~~-----~, -.., . - -.,, ., - ~-~ ШрнфтJ1''-',\,N"> :."-"9-v~~;J~~~~.~ri;r"J<~--"'~~;o;k~ :;.·~i..~~" "~. ~~ ЩриФТ: . Начертанне: fа_змер: ок ~-.------ ,~,;;;;; м-·--- г- 1 ~~1 .".. -· ,__О_тм_е_на__, курсив Т erminal О Tim es New Roman () Тrebuchet MS О TunQa О Verdono О W'ebdings · жирный ".·: .·· . ' 1 Ж><рный курсив ;y~l Г В~оизменение ······1 Г Образеu ···· IJГ ,Зачеркнутый . j 11 • ..-1--А-о-ВЬ_Бб_Ф_ф-~- ., Г ПОЦ'!еркнутый i. с.•' 1.. i·· ш :, ; J . j На~р сим1'01Юе: ,_ _ __.. ;,_, _____J J c~1r1!!ic .:J '" :.. Pzu:. 2 .4 . Выбар шрифта для диалогового 1ЖШ1 UserForm Щелчок на кнопке приведет к запуску р едактора этого свойства (см. рис.:? ...! ) . После модификации свойства щелкните на кнопке ОК. Внесенные изменения будут отражены в окне Properties (Свойства) и в элементе управления. Импорт и экспорт кода Visual Basic Код VВА и код Visual Basic практически ничем не отличаются. Это значит, что при необходимости поделиться кодом или при поиске подходящего кода мо жно искать как код, специально написанный для Micгosoft Office, так и код, написанный для Visual Basic 6.0 . То есть в мире существует несколько миллионов програ~мистов на Visual Basic, с кото­ рыми можно объединить усилия. (Например, Пол Киммел ведет бесплатную газету для сайта codeguru. сот, посвященную Visual Basic .. Эта газета называется Visual Basic Today. Большая часть кода из этих статей может использоваться непосредственно при програм­ мировании на Excel VВА.) · Хорошим правилом является повторное использование как можно большего объема ко­ да еще до написания собственного кода. Существующий код, скорее всего, уже был несколь- ' . ко раз вычитан и отлажен и, несомненно , намного лучше подходит для решения проблемы. Кроме чужого кода, не забывайте повторно использовать собственный код. Существующий код можно импортировать с помощью меню File (Файл) или контекстнQГо меню в окне Project Explorer (Окно проекта). Например, вьщелите Sheet1 в Окне проекта и выберите ФайлqЭкспорт файла (FiJeqExport File) для сохранения листа Sheet1 в файле Sheetl. cls. (Расширение . cls указывает на то, что Sheetl является модулем класса.) Помните, что различные инструменты и среды используют разные принятые по умолчанию параметры. Например , объекты , которые полностью доступны в составе проекта Workbook (Workbook и Worksheet), не будут автоматически предоставляться в Visual Basic 6. В этом случае в проект Visual Basic 6 придется добавлять ссылку на Micro- soft Excel . Совместное ис~;тользование кода Excel VBA между пользователями Excel не должно вызывать трудностей; совместное же использование кода с пользователями дру­ гих версий Visual Basic может потребовать некоторых усилий. (Дополнительная инфор­ мация о применении кода Visual Basic 6 в Excel приводитс·я в главе 14.)
Программирование в редакторе VВЕ 111 Редактирован·ие Выполнимость редактирования в среде VBE комбинирует в себе возможности тексто­ вого процессора и возможности, необходимые для работы с языком программирования. В меню Edit (Правка) предоставляются функции копирования , вставки и вырезания, а также поиска, замены текста и отмены операций. Кроме этого, команды меню Editqlndent (ПравкаqВыровнять вправо) и EditqOutdent (ПравкаqВыровнять влево) помогают при выравнивании блоков кода. Как и в других текстовых процессорах, в меню Edit (Правка) ·предоставляется возможность установки закладок в произвольных местах кода. Это позволит быстро перемещаться между интересующими фрагментами кода. Все доступные параметры предоставлены в меню EditqBookmark (ПравкаqЗакладка). Еще одной возможностью, характерной для редакторов кода, является автоматиче­ ское дополнение слов - EditqComplete Word (ПравкаqДополнить слово). Для вызова этой функции необходимо нажать комбинацию клавиш <Сtrl+пробел>, при этом появля­ ется раскрывающееся меню со списком вариантов. Эта возможность не работает для ключевых слов. Например, если необходимо просмотреть сriисок членов объекта Work- sheet, просто введите имя объекта Worksheet и точку, после чего нажмите ко мбина­ цию клавиш <Сtl"l+пробел>. Будет показан список всех членов клaccaWorksheet. Современные объектные модели обычно оказываются слишком большими для запо­ минания. Лучшие программисты могут освоить синтаксис, распространенные идиомы и мощные шаблоны проектирования, а обязанность помнить особенности типов, а также порядок и количество параметров, перекладывается на справочное руководство и интел­ лектуальные редакторы. Управление параметрами редактора \ Изменение параметров редактора VВЕ требуется крайне редко. Самым значительным из­ менением может стать изменение ширины символа табуляции с 4 до 2 (рис. 2.5). Для про­ смотра и модификации парамеiров редактора выберите команду ToolsqOptions (Сервисq Параметры) в главном меню VВЕ. · 1 .Wi . .ndo.w Settings :"""" :""" ". · . · 1 7 Q.r og·ond·Drop Тext Editing J;; Del ault to F,uil ~odule VieW 1 р· ~OCedure Seper~tor L..,...;.::............_____-"-···i----·- Рис. 2.5. Оюю параметров редактора VВЕ
112 Глава2 Опыт показывает, что самым рас пространенным изменением является увеличение размера шрифта при создании презентации. Принятый по умолчанию размер шрифта в 10 пикселей недостаточен при демонстрации презентации через проектор. В остальном в этом окне не предоставляютс.я какие-то параметры, которые могут увеличить произво­ дительность труда, но знать о сушествовании такого окна все равно стоит . Запуск и отладка кода Знакомство с функциями записи и отладки кода в редакторе VBE позволяет значи­ тельно увеличить производительность труда. В меню Run (Выполнить) предоставляются команды Run SuЬ/UserForm (Выполнить подпрограмму/UsеrFо~-m), Break (Прервать), Reset (Сбросить) и Design Mode (Режим констрУктора). В меню Debug (Отладка) пре­ доставляются команды Compile VBAProject (Откомпилировать проект VBA), Step lnto (Шаг с заходом), Step Over (Шаг с обходом), Step Out (Шаг с выходом), Run То Cursor (Выполнить до текушей позиции) , Add Watch (Добавить контрольное значение ), Edit Watch (Изменить контрольное зна~1ение), Quick Watch (Контрольное значение ), Toggle Breakpoint (Точка останова), Clear All Breakpoints (Снять все точки останова), Set Next Statement (Следующая инструкция) и Show Next Statement (Отобразить следующую ин­ струкцию). Все эти пункты меню могут быть полезны, 'но чаще всего используются ко­ манды Ruri (Выполнить), Step lnto (Шаг с заходом), Quick Watch (Контрольное значе­ ние) и Toggle Breakpoint (Точка останова). Язык VВА является интерпретируемым, но поддерживается компиляция в РЕ-код (или переносимый исполнимый код). Пункты меню Run (Выполнить) и Step lnto (Шаг с заходом) запускают процесс отладки. Пункт меню Quick Watch (Контрольное значение) открывает диалоговое окно, показывающее значение переменной, над именем которой находится кур­ сор. Команда Toggle Breakpoint (Точка останова) вставляет низкоуровневое прерывание 3 и добавляет индикатор в виде красной точки напротив выбранной строки . Кроме этого, стро­ ка кода выделяется темно-красным цветом. Прерывание 3 является низкоуровневым преры­ ванием отладки, которое предоставляется BIOS компьютера. Использование точек останова позволяет запускать длительный процесс, останавливая выполнение как раз в тот момент, ко­ гда необходимо оценить состояние приложения. (Дополнительная информация об отладке и тестировании приводится в главах 7 и 8.) Использование контрольных значений Контрольные значения позволяют оценить состояние приложения. Окно Watch (Контрольные значения;) можно активизировать из меню View (Вид) или из меню Debug (Отладка) . В меню View (Вид) предоставляется доступ к окнам lmmediate (Проверка), Locals (Локальные переменные), Watch (Контр ольные значения) и Call Stack (Стек вызо­ вов). В меню Debug (Отладка) предоставляется доступ к командам Add Watch (Добавить контрольное значение), Edit W atch (Изменить контрольное значение) и Quick Watch (Контрольное значение) . В окне lmmediate (Проверка) программист может непосредственно вводить код и про­ верять его работу. Результат выполнения кода выдается немедленно. В окне Locals (Локальные переменные) (рис. 2 .6) выводится список переменных, которые доступны в локальной (или процедурной) области видимости. Например, для класса Worksheet в ок­ не Locals (Локальные переменные) всегда будет показана, как минимум, внутренняя ссылка на себя - объект Ме (указатель на объект).
r!f'Project.f\1cтl.test CircularReference CodeNeme Consolidstionfunction + Consolid$ion0plions ConsoБdationSOLl'ces Creetor + CustomProperties Va/ue Nothing xlSum Е""'у :dCreetorCode Программирование в редакторе VВЕ 113 Applicetion/App~cel!ion Autofilter Rвng~enge · Range String CommentsJC.ommenls XIConsoПdвtlonFunction VeriзntNorienl(1 to З) Vari&ntЛ:mpty XICreetor CustomPropertlesJC.ustomProper1ies Рис. 2. 6 . Оюtо Локальные переменные Окно Watch (Контрольные значения) ведет себя точно так же, как и окно Locals (Локальные переменные), но объекты в окно Watch (Контрольные значения) добавляютс~ программиста~ . Окно Watch (Контрольные значения) позволяет следить за изменением состояния приложения в процессе выполнения . С другой стороны, в окне Quick Watch (Контрольное значение) предоставляется значение только одной переменной и эта ин­ формация выводится в модальном диалоговом окне; то есть, при использовании oкнa Ouick Watch (Контрольное значение ) работа приложения приостанавливается. Окна Locals (Локальные переменные), Watch (Контрольные значения) и Quick Watch (Контрольное значение) предоставляют информацию о состоянии объекrов приложения. . В окне Call Stack (Стек вызовов) предоставляется обратный порядок вызовов функ­ ций в программе. Последний вызов указывается первым. После него указывается пред­ последний вызов и т.д. Одним из применений окна Cal l Stack (Стек вызовов) является проверка порядка вызова методов. Кроме этого, окно обеспечивает быстрое перемеще­ ние между методами в окне редактора. Иногда окно Call Stack (Стек вызовов) незамени­ мо при отладке кода . Окна Add Watch (Добавить контрольное значение) и Edit Watch (Изменить кон­ трольное значение) являются модальными и используются для добавления или модифи­ кации значений в окне Watch (Контрольные значения) . Контрольные значения могут быть простыми переменными, сложными объектами или действительными выражения­ ми. Например, A=lO явля ется действительным контрольным значением, результатом ко­ торого будет True или False, в зависимости от значения переменной А. (Практические примеры отладки и тестирования кода приводятся в главах 7 и 8.) И~пользование окна Просмотр объектов Вероятно, существуют десятки объектных моделей для каждого языка программиро­ вания и каждой инфраструктуры. Мы неплохо программируем на таких языках, как С++, С, С#, Delphi, Visual Basic, VBA, и справляемся с ассембле ром, Jsci-ipt, VВSci-ipt, J ava, Clippei-, Fox Pro, а также вполне выживаем в таких языках, как Cobol. Ключом к про­ граммированию на любом языке является изучение синтаксиса. К счастью, разные языки программирования часто имеют похожий синтаксис, поэтому остается только изучить объектную модель конкретного языка или инфраструктуры, а также принятые в языке конструкции и идиомы . В Delphi используется собственная инфраструктура, которая называется Visual Con- trol Libi-aiy (VCL). В языках С# и VВ .NET прим еняется инфраструктура .NET Fi -amework.
114 Глава 2 В Microsoft С++ используется библиотека Micгosoft Foundation Classes , а в Borland С++ (до появления С++ Buildeг) - Object Windo\vs Libraгy. Инфраструктуры существуют для таких языков, как Java . Кроме этого, некоторые сторонние производители предлагают собственные инфраструктуры. (Есть ли еще программисты на С++, которые помнят биб­ лиотеку Zinc для ранних версий языка?) Необходимо по-мнить о существовании всех этих языков и инфраструктур, чтобы изучение любой из них входило в дальнейшую перспективу. При наличии 1000 языков программирования, большого количества вариантов каждого языка, существовании де­ сятков тысяч классов , методов, свойств , полей, событий и интерфейсов в каждой инфра­ структуре практически невозможно запомнить др.же ·небольшой фрагмент одной из ин­ фраструктур. Неплохой стратегией является изучение ключевых слов и синтаксиса каж­ дого языка, который планируется использовать . После этого желательно ознакомиться с распространенными идиомами и конструкциями и в остальном полагаться на справоч­ ное руководство . Для этого в редакторе VВЕ (и множестве других инструментов) под­ держивается окно Object Browser (Просмотр объектов) . Выбрав команду Viewc::>Object Browser (Виде::> Просмотр объектов) в меню редактора VВЕ, можно получить доступ к диалоговому окну Object Browser (Просмотр объектов). В этом окне предоставляется список классов и их чл енов в иерархически структурированной форме. Дополните:Льная информация об интересующих объектах приводится в справочном руководстве. Таким образом, со временем сформируются устойчивые знания о тех частях инфраструктуры, которые используются постоянно. Начинающим разработчикам можно посоветовать найти решение в составе объект­ ной модели VВА еще до того, как оно будет создаваться с нуля. Если интересующий ре­ зультат отсутствует в объектной модели VВА или-в справочном руководстве, обратитесь к Windows API (дополнительная информация приводится в главе 16). Но даже если это не принесло результата, перед созданием собственного решения поищите готовое решение в сети Inteгnet или среди предложений сторонних производителей. Наконец, создавайте решение только в том случае, если это действительно необходимо. Даже пара часов по" иска существующего решения оказывается более полезным использованием рабочего времени, чем реализация тривиальных алгоритмов с нуля. Резюме Профессиональный рост в программировании требует постоянной практики . Как и любая умственная или физическая деятельность, программирование заставляет учиться мозг и тело. В этой главе были перечислены некоторые ключевые возможности редакто­ ра VВЕ, которые будут использоваться на протяжении всей книги. Почему эти возмож­ ности рассматриваются здесь? Недавно мы работали с группой разработчиков, которые программировали в течение года и не знали о существовании окна Quick Watch (Контрольное значение). Теперь вы знаете. Редактор VВЕ является мощным инструментом, предназначенным для работы с язы­ ком программирования Visual Basic for Applications. Рекомендуем потратить некоторое время на ознакомление с главным меню редактора и контекстными меню, а также · пане­ лями инструментов каждого компонента редактора. Скорее всего, в процессе ознакомле­ ния будут найдены возможности , которые не использовались ранее. Это позволит рабо­ тать более эффективно как с этой книгой, так и в процессе программирования .
Объект Application В этой главе рассматривается подмножество функциональности Excel. Здесь описы­ ваются возможности, которые Н6 обязательно связаны друг с другом. В общем , объектная модель Excel содержит объекты, предназначенные для решения вполне определенных задач . Объект Application находится на вершине объектной модели Excel и содержит все остальные объекты. Кроме этого, объект Application выступает хранилищем для свойств и методов, которые не подходят для включения в любой другой объект, но необ­ ходимы для программного управления Excel. Например, существуют свойства объекта Application, предназначенные для управления обновлением экрана и включения пре­ дупреждений . Существует метод объекта Application, подсчитывающий формулы в открытых книгах. Глобальные члены Многие методы и свойства объекта Application являются членами группы < globals>, доступной в самом на'чале списка классов в окне Obj ect Browser (Просмотр объектов) (рис. 3.1). Если свойство или метод входит в группу <globals>, на него можно ссылаться, не указывая ссылку на объект. Например следующие две ссылки эквивалентны: ,д,pp1rca.t ion . Act ivecefi ' }>ctiv_§Cell · Но следует соблюдать осторожность. Некоторые часто используемые свойства объек­ та Application, например ScreenUpdating, не являются глобальными . Показанный ниже код является корректным: ~A.2i;>Si_9.~.tio!i:§:ci~-eriiJJ2'<:fiз.iAii ··· ;·~t~Is.:i::>."' - ,. _
116 Глава 3 А результат использования следующего кода может .оказаться неожиданным: Этот код создает переменную и присваивает ей значение False. Для избежания по­ добных ошибок стоит добавить строку Option Explicit в начале каждого модуля. По­ сле этого на этапе компиляции все ссылки подобного рода будут помечены как неопреде­ ленные переменные. • · Object Browser lr!~!m Classes , 1i О§Ффj§ &'2 Addln W Addlns Ш Adjustments Ш AllowEditRange W AllowEditRanges ~ Answer\'Vizard Ш AлswerwizardFiles j:rJ Application ~ Areas <g!o!Jals::. Class Members of'<globa1s>' ~! ",,~ Abs ;&."l<; ~ ActiveCel l ~ ActiveChar1 ~ ActiveP rinter • ~ ActiveSheet ~ Active\'Vindow { irfil Activewo rk boak l1i' Addlns ' • •~ AppActivate 1у1;: ~ Application ~..iW ··~ ·""'". .. · Member ·~ Рис. 3.1 . Окно Просмотр объектов. Группа <globals> Свойства Active Объект Application предоставляет множество ссылок, которые можно применять для обращения к активным объектам без указания явного имени. Это позволяет исполь­ зовать объекты, активные в момент выполнения макроса. Кроме этого, эти свойства да­ ют возможность создавать универсальный код, который работает с объектами одного и того же типа, но имеющими разные имена . Следующие свойства oбъeктaApp l ication являются глобальными и позволяют ссы­ латься на активные объекты. О ActiveCell О ActiveChart О ActivePrinter
О ActiveSheet О ActiveWindow О Activeworkbook О Selection Объект Application 117 Если только что была создана новая книга и ее необходимо сохранить под конкрет­ ным именем, воспользуйтесь свойством Activeworkbook для получения ссылки на объ­ ект Workbook. [WorkbQQk~~·д.dd.: ~":ш '!:"'~' • ~ .~~~ -~·~"~ ~~·,-т~-" .~ !~c;ЦveWo:r:Jd:ю9Js. SaveAs Filena'rne: ="<;:: \ pat9- . _ xl9" Если необходимо создать макрос, включающий полужирный шрифт для выделенных ячеек, можно воспользоваться свойством Selection. Оно позволяет получить ссылку на объект Range, в который входят выделенные ячейки. ~s~iёс~'i6Ц~-'t61Гt:~в91<з:·: '; .· т:rие · Помните, что свойство Selection не будет возврашать ссылку на объект Range, если выделен объект другого типа, например Shape, или активный лист не является листом электронной таблицы. Возможно , в макрос потребуется добавить условие, которое будет проверять, выделен ли лист электронной таблицы, перед тем как вставлять данные. tГ{ TypeName(A.cйvesheetJ <> ~worksheet "- o:r·· _ -~ ...., - TypeNarne (S1йection) <> "Range" Then _ MsgBbx "Этот макрос может ·использоваться только вместе с '~ диапазоном", vbCritical . Exit. Sub ;J';l}d If Вывод предупреждений Реагирование на предупреждения приложения во время работы макроса может оказать­ ся утомительным. Например , если макрос удаляет лист, выдается окно предупреждения с кнопкой ОК и Отмена (Cancel). Пользователь может щелкнуть на кнопке Отмена (Cancel) , что приведет к отмене операции удаления и отрицательно повлияет на работу остального кода макроса, в котором делается предположение об успешном завершении удаления. Большинство предупреждений можно отключить, установив свойство Display-. Alerts в значение False. При подавлении днало говых окон с пр едуп реждения ми авто ­ матически выполняется операция, связанная с принятой по умолчанию кнопкой диало­ гового окна, например: :дppiication. DisplayAlerts ; · Faise- iActivesheet. Delete '!1:.12pJ,..is::s!~iqp.,DA~PlayAlert,s = Тrц~-- . . УсТанавливать свойство bisplayAlerts· в з1:1ачение True по завершении работы макроса Н!Юбязате11ьно, так как интерпретатор VBA устанавливает свойсrво автомаП1чески. Но обычно Имеет смысл устанавЛивать свойство сразу · после подавления опРеделенного сообщения, что­ бы неожиданные nредуriреждения выдавались на экран. / •, , . •;.;.:~ " Свойство DisplayAlerts обычно используется для подавления предупреждений о пере­ записи существующих файлов с помощью команды Файл9 Сохранить Как (File9SaveAs). При подавлении этого пр едупреждения вьшолняется действие, принятое по умолчанию, и файл перезаписывается без прерывания работы макроса.
118 Глава 3 Обновление экрана Мерцание экрана во время работы макроса может раздражать . Это происходит при выделении или активизации объектов и обычно характерно для макросов, сгенериро­ ванных автоматически. СтоИт. _избегать выделенИя объекто~ средст11ам11 кода УВА. .~то ред~о ~6гд.з ;тр~буется\ 11 при отказе от выделения • или активизации объектов 1:<од буДет работать ·· быстрее,, Большая часть кода в этой книге работает".\)ез вьщ~ления объектов. • "' • '\. ·· . ·. z"" Если экран необходимо зафиксировать на время работы макроса, воспользуйтесь сле­ дующим кодом: 1.!\j:.>1J± is.~fi.9_n·;-'~C.!"~~I?-чi?.S1.9'"1=:J-!!g: .~ : t~~-~Ё:!. .~: ·-~. Экран будет заморожен до установки свойства ScreenUpdating в значение True или до завершения работы макроса и передачи управления пользовательскому интер­ фейсу. Присваивать переменной ScreenUpdating значение True стоит только в том случае, если экран должен обновиться еще в процессе работы макроса. Существует одна ситуация, когда желательно установить свойство ScreenUpdating в значение True еще до завершения работы макроса. Если в процессе работы макроса на экран выводится диалоговое окно UserForm или встроенное диалоговое окно, обновле­ ние экрана стоит включить еще до вывода объекта на экран. Если пользователь перета­ щит диалоговое окно UserForm в то время, когда обновление экрана отключено, контур окна будет оставаться по всему пути окна, Перекрывая содержимое экрана. Обновление экрана можно отключить после вывода объекта на экран. Пi::>ЛQ>t<~,пельным nобоч~ым эффектом отключен'ия' обновд~~Ия<;;Э~рана является у:скоре~ · ние работы кода. Ускоряется. даже код·, ,к6тор1,нй не ~ёn6льзу-=т выдеnенИе с объ'ектов . :· и не _нуждается в обновлении ~крана."Для получения макtимаriьной прой~водительнрстi-1 откажИtесь от выделения объектов и отключите обновление э'кр"ана. ,.. · "·" · ~. . " . ;! "' Оценка Метод' Evaluate может использоваться для расчета значения формул листов Excel и генерации ссылок на объекты Range. Стандартный синтаксис вызова метода Evaluate выглядит следующим образом: Кроме этого, существует сокращенная форма вызова, в которой отсутствуют двойные кавычки , а выражение заключается в квадратные скобки, например: На месте Выражения может находиться любое действительное выражение на листе с или без знака равенства слева. Также это может быть ссылка на диапазон ячеек. Расчеты на листе могут включать в себя функции, недоступные в VВА через oбъeктworksheet­ Function. Также это могут быть формулы массивов на листе . Дополнительная инфор­ мация об объекте WorksheetFunction приводится далее в этой главе. Например, функция ISBLANK, которую можно использовать в собственных формулах на листе, недоступна для кода VВА через объект WorksheetFunction, так как эквива-
Объект Application 119 лентная функция VВА IsEmpt y предоставляет те же возможности . Хотя при желании можно использовать и функцию I SBLANK. Следующие два примера являются эквива­ лентными и возвращают значение True, если ячейка Al пустая, и False в противном случае: 1Msg'вox · :Бvaiua ЕеТ" ';J: sв:LA&к (А.1 У ;, l1~g?_c:.fl.J1&1?Ы.Ш!S:\.A1) J ~·""··' •• •;,_ . ,, , ....•· - ' ··~·'""""~ Преимуществом первого подхода является возможность генерации строкового значе­ ния в результате работы JFOдa. Это делает код исключительно гибким. Второй прием име­ ет боЛее короткую запись, но выражение можно изменить только с помощью редактиро­ вания кода. Следующая процедура выводит значение True или False в зависимости от пустоты активной ячейки. Кроме этого, в процедуре демонстрируется гибкость первого подхода: 1t>U.Ыlc ' sufГTsдct:Cvece1iEШP"€y Dim" F~nctionName As String, cellReference As J?unctionName = "ISBLANK" CellRefer~nce = ActiveCell . Addres~~ MsgBox . Evaluate (FunctionName & " (" & CellRef~rence & ") ' ' ) ;~-~2..1,~~.~~)?.",~~ .. !<~ .~....... ··'~ "...,;:i<:.w.r.; ."''·"' \!:.~.~. ,1,>.;; , .••~.'.1.•.~"."7"". •.~.>.• • .•~.-.~. Обратите внимание, что второй прием не позволяет оценивать значение выражения, содержащего переменные. В следующем примере показаны два способа использования мeтoдaEvaluate для ге­ нерации ссылки на объект Range с присвоением значения этому объекту: 1:Е:vаП1аtё (·'A:i="'' г:·vaiu e ·= ЛГ ··; · - .. ..". "- .~ ~~.,,~'"!""""""" HЛJJ::YAJ~-~ .i ~kQ~ -·· "~ . Эти выражения эквивалентны. Выражение можно сократить еще больше, опустив свойство Value, так как это принятое по умолчанию свойство объектаRаngе: it.AtJ . Более интересным примером использования метода Evaluate является возврат со­ держимого коллекции имен книг Names с эффективной генерацией массивов значений. В следующем коде создается скрытое имя для хранения пароля. Скрытые имена не видны в диалоговом окне lnsert<=>Name <=> Define (Вставка<=>Имя<=>Определение), поэтому они являются удобным методом хранения информации о книге с сохранением чистоты поль­ зовательского интерфейса. l'Jiim~s:,_~c:iд::.~~!Ч.e: ~":ra~~w.9:~.o:~·-,...1{§.t_Ц~т&'/;, ·~?~~ёnКо_s ;, ; yi":зД:~~e:· :;;r_al~~~:,.:.__.1,.,, После этого скрытые данные можно использовать в следующих ~ыражениях: i:Useibli;>lit."" ·,,;''"тn:Рut:вохТ"~БёдИте Па"РоЛЬ ;;Т"" ,lf Userinput = [PassWord] Then i.: -~,.."··'-",;~,,.,. 1,.oo(,,:.@i.;:~~~!O..~;.g::.x."-.1"-.--~~;:,,,,...i:-'*"';.;~\iv,.."->~"••~ Применение имен для хранения данных рассматривается в главе 21. _ Кроме этого, метод Evaluate можно исirользовать вместе с массивами. В следующем выражении генерируется двумерный массив типа Variant на 100 строк и один столбец. В массиве хранятся значения от 101 до 200. Этот код работает эффективнее, чем цикл For ... Next:
120 Глава 3 Точно так же следующий код присваивает значения от 101 до 200 диапазону Bl:BlOO. И в этом случае используется меньший объем кода, чем в цикле For . . . Next: Ш311i?IQ9Г~ rZisбYJJ.X9I~~IY9)J <. • Метод lnputBox В языке VВА существует функция InputBox, которая предоставляет простой способ получения данных у пользователя. Кроме этого , метод InputBox предоставляется объ­ ектом Application. Метод объекта Application ?Редоставляет похожее диалоговое окно , но имеет больше возможностей. Этот метод позволяет управлять типом данных, · которые может вводить пользователь, а также обнаруживать нажатие клавиши Отмена (Cancel). Если в окне используется неквалифицированный вызов функции InputBox (как по­ казано ниже), будет вызвана функция InputBox из языка VВА: [AJl['~f::~~i,il,fi'G't:!}9~I!?~o'%J?t:.~..~ ': ~~~дY!i~,. ди:~Пa,::зoli ")".~..~:-"•·-"'''""'·····""·'·'"~·.•&. Пользователь может вводить в диалоговое окно только данные . Выбор ячейки с по­ мощью указателя мыши невозможен. Возвращаемое значение функции InputBox всегда имеет строковый тип и проверка содержимого строки никогда не выполняется. Если пользователь ничего не вводит, возвращается строка нулевой длины . Если пользователь щелкает на кнопке Отмена (Cancel), также возвращается строка нулевой длины . Код не позволяет различить отсутстви·е ввода и щелчок на кнопке Отмена (Cancel). В следующем примере применяется метод InputBox объекта Application. В от­ крывшемся диалоговом окне выдается запрос на выбор диапазона: t~ii§kf~x ::~:лr;Pr i"c_~t:д:iJ:i ~- t:iii:JЧ:E~(:;CX: (_i?f9@P.t: ;· ~}I;е,Чи i'е ··диau~~o.,ii:ii~7тYJ?.§J ~§ .CЗ"":'~~;;:~ Пар~метр Туре может принимать следующие значения (или сумму этих значений): Значение о 2 4 8 16 64 Описание Формула Число Текст (строка) Логическое значение (True или False) Ссылка на ячейку, как объект Range Значение ошибки, например, #N/ А Массив значений Пользователь может выбирать ячейки с помощью мыши или вводить данные . Если введены данные неподходящего типа, метод InputBox выдает сообщение об ошибке и запрашивает ввод новых данных. Если пользователь щелкает на кнопке Отмена (Cancel), метод InputBox возвращает значение Fal se. Если возвращаемое значение присваивать переменной типа Variant, для большин­ ства типов данных мо'жно сравнить возвращаемое значенне с False, чтобы определить щелчок на кнопке Отмена (Cancel). Если запрашивается диапазон, то возникает более сложная ситуация. В этом случае необходимо использовать следующий код:
\ ~l?i..iЬI:LE · sиь · se'ieCtRangeCГ"''"' ·:~ \' Dirrr' aRange As Range , On Error Resume Next Объект Application 121 t .Set aRange = Application. InputBox (prompt: ="Введите . диапазон", i~ '· Туре: =8) ;. , . . . Н aRange' Is Nothing ' The,n ~sgBox "Операция отменена" · Else . aRange-.Select ~En?if ;вng, ?~J? , ·' Во время выполнения этого кода вывод будет выглядеть, как показано на рис. 3.2. '· Рис. 3 . 2. Диалоговое окно, предоставляемое методом Application.InpиtBox Проблема заключается в том, Что для назначения объекта Range, объектной пере­ менной необходимо использовать оператор Set. Если пользо.ватель щелкает на кнопке Отмена (Cancel) и возвращается значение False, оператор Set неудачно завершает ра­ боту, и возникает ошибка времени выпС!лнения . Использование оператора On Error Resume Next позвол яет избавиться от ошибки времени выполнения и проверить гене­ рацию правильного диапазона. Известно, что встроенные механизмы проверки типов метода InputBox проверяют действительность диапазона при щелчке на кнопке ОК. Ес­ ли метод возвращает пустой диапазон, то можно предположить, что пользователь щелк­ нул на кнопке Отмена (Cancel).
122 Глава3 Строка состояния Свойство StatusBar позволяет управлять текстом, который отображается слева в строке состояния Excel в нижней части экрана. Строка состояния предоставляет сред­ ство информирования пользователей во время работы большого макроса. Пользователь должен знать, что программа работает, особенно если отключено обновление экрана и приложение не проявляет никакой визуальной активности. Даже если обновление эк­ рана отключено, в строке состояния можно выводить сообщения. Этот прием может применяться в процедуре с циклом (следующий код демонстрирует такое использование строки состояния) : IP.uЫ{cs~ь""~snёwstai:us·(г=-,"_r~~ .•"=- ·· ·--:-~"'"""""~" Ap~lication.ScreenUpdating = False ~" \\ i Dim I ,AS ···Long · fQr,. ' i >= О то• 10000-0,00 . ~ 'I ~6d 1000000 = {) ~heri После завершении обработки свойство StatusBar необходимо установить в значе­ ние False для переключения строки состояния в нормальный режим работы. В против­ ном случае последнее сообщение останется на экране. Свойство SendKeys Свойство SendKeys позволяет отправлять нажатия клавиш активному окну. Эта воз­ можность используется для управления приложениями, не поддерживающими другие формы взаимодействия, например DDE (Dynamic Data Exchange) или OLE, и обычно рассматривается как последнее средство . В следующем примере открывается приложение Блокнот (Notepad), которое не под­ держивает DDE и OLE. После открытия в документ записывается строка данных: :p\iblic " su.ь' senд.к'e:YТest( J Dim . ReturnValue As DouЬle . ., fS.eturnViJ,lue = shell ("'NOTEPAD. ЕХЕ .'' ·' call Appl\.ctivate (ReturnValue ). ··' · Appl°ication.Sendieys Appl·ication . SendКeys r·' Application: . SendKeys [EI1,c;l' SuJ;> ' ' ВаЖно понято, '!то фу.нкu.f1~- ~.endКeys отпра!З~Яет .нажатия ~ав~ш активН'о.му прилоЖенИю. EqiИ Jгьт макрос· запустить в редакторе V13E, .редактор получит фокус nocrie вьlзqва функ­ ци'~:t SendКeys:и нажатьiе клаВУ!ШИ будут, отправлены редактору"'Для nравильноr:о· сохране­ ния ф0кус? на nрИложенУ1и Блокнот {l)Jotepa,d) заnускай~:е этот макрос из Excet': . . "• . ·2~ - - ~
Объект Application 123 Процедура SendKeyTest использует комбинацию клавиш <Alt+F+A> для выполне­ ния операции Файле::> Сохранить Как (Filec::>SaveAs) и вводит имя файла ВАТСН. Символ % используется вместо клавиши <Alt>, а символ - - вместо клавиши <Ente1·> . Символ л используется вместо клавиши <Ctгl>. Для представления друтих специальных клавиш их имена указываются в фигурных скобках, например, для передачи нажатия клавиши <Del> применяется последовательность символов {Del} (передача нажатий этих клавиш пока­ зана в следующем примере) . Нажатия клавиш можно отправлять и в Excel. В следующей процедуре очищается содержимое окна lmmediate (Проверка). Если окно lmmediate (Проверка) использовалось для экспериментирования или вывода отладочной инфор­ мации с помощью вызова Debug. Print, в этом окне может содержаться большой объем лишней информации. Эта процедура переключает фокус в окно lmmediate (Проверка) и отправляет нажатие комбинации клавиш <Cti·l+a> для выделения всего текста в окне. После этого текст удаляется с помощью нажатия клавиши <Del>. ;J?цьдёт:sиi:гrhiте-атаЕ ew1n:ac;v.тc1ear"( ~·, · :.. Application. VBE. Windows. Item( "!mmediate" ). Set.Focus ) Applicatoin.SendKeys "ла" ' '. Application. SendKeys' "{Dep" Li;:Rd ,_s)lь "" " .:. . · .-v- «/'-:;/j. '< - - , ',- - ' _,;:< '· .-:. ,: !:",: Щiя · лравИльной работы ·~т~rо макроса . ДОЛ>/(еl:! 6~1ть разрешен ..nроrраммнь1и . доступ . к /nроекту )/isual ~asic: Для . разрешения достуnа выберюе в меню Excel (не VBE) команд.у' (J''ервИ~<=:>Макросыt::>Безопасность (Tools9Macrosc::>$ecurity) · и активизируйте вкПаДку _Надеж~-!ь1~ источники (Tr_uste~ Sources). · Метод OnTime Метод OnTirne можно использовать для планирования запуска макроса на какой-то момент в будущем. Необходимо указать дату и время запуска макроса, а также имя макро­ са. Если воспользоваться методом Wai t объекта Appl ication для приостановки работы макроса, приостанавливается вся активность Excel, включая интерактивное взаимодей­ ствие с пользователем. Преимуществом метода OnTirne является возможность возврата к нормальному взаимодействию с Excel, включая запуск других макросов в процессе ожи­ дания запланированного запуска . Предположим, существует открытая книга со ссылками на книгу Data. xls, которая хранится на сетевом сервере, но t;ще не открыта. В 15:00 необходимо обновить связи с книгой Data. xls . Следующий пример планирует запуск макроса RefreshData в 15:00 в этот же день. Функция Date возвращает текущую дату, а функция TirneSerial исполь­ зуется для добавления необходимого времени: rPuь1a.'.c7suь ~Runonт1me ·(;·. ~·- -=~,/ ''. · App1ication.Onтime Date + TimeSerial(15, О, 0), (:[!;:qQ;' ?JAfJ__,:~ :~,Ж~м..-_ ;, •~ '' ; " .·.. ••·- ~ - •-"
124 Глава 3 В следующем макросе RefreshData связи с книгой Data. xls, находящиеся в книге ThisWorkbook, обновляются с помощью метода UpdateLink. Объект ThisWorkbook является удобным способом ссылки на книгу, в которой находится макрос: 'Pu'ьli 6 sliь RefreshDataЛ ' "*'-· - ""' . · ThisWorkbook. Upda teLink Narne: ="с: \Data. xl.s " , Туре: =xlExcelLiцks _ El}.C\ . $}11;,>."" '"'"· . '=·~··=·' ;~.,•."."- · -· .~"- .-~" ...•.~..~·-··-"-"""·-··-··""· ,,.,"",_ ," "~ . Если данные необходимо обновлять регулярно, макрос можно заставить запускать са­ мого себя: Dirn schedu1blтiine "'A.S "oal:.e tPuЬlic sцЬ .: RefreshD,;ta: () " ThisWorkbook.UpdateLipk Narne: ="С: \Data .xls", . ScheduledTirne = Now + TimeSeria1 (о, l, О} ~.. Applicatiqn. OnTime ScheduledTirne i. ·" Ref,reshData·; . ' End. Sub · ' 'PuЬlic · Sub StopRefresh (.) · Appli·cation. OnTirne ScheduledTirne, . ~.....~~4 . .. .... .§\1,..l?~~М~;м,,';.,._м -~.~~~-><rУ...,.,Й'.~.. . :\. .,,·h ~::'.~ ~. "RefreshData ,; · , После запуска подпрограммы RefreshData она будет планировать собственный за­ пуск каждую минуту. Для остановки макроса необходимо знать время запланированного запуска, поэтому переменная уровня модуля ScheduledTime содержит время следующе­ го запланированного запуска. Подпрограмма StopRefresh устанавливает четвертый параметр метода OnTime в значение False, что приводит к отмене запланированного за­ пуска подпрограммы RefreshData. Кроме этого, метод Onтime может оказаться полезным для приостановки обработки до возникновения неподконтрольного события. Например, с помощью DDE данные можно отправить другому приложению, но до продолжения обработки необходимо по­ дождать ответа ·от получателя данных. Для этого создается два макроса. Первый отправ­ ляет данные и планирует запуск второго, который обрабатывает ответ чеr.ез определен­ ный промежуток времени. Второй макрос может продолжать работу, пока на листе или в окружении не будут обнаружены изменения, вызванные ответом внешнего приложения. Метод OnKey Метод OnKey может использоваться для назначения макроса нажатию клавиши или нажатию любой комбинации клавиш <C trl>, <Shift> или <Alt> с любой другой клавишей. Этот метод также применяется для отключения определенных комбинаций клавиш. В следующем примере показано, как назначить макрос DownTen клавише управления курсором <вниз>. После запуска мaкpocaAssignDown нажатие клавиши <вниз> будет при­ водить к запуску макроса DownTen и перемещению выделения на 1О строк вместо одной: ri'liB:JT c , , '·' i Applicati.on.OnKey ;, :F:nd," ~uЧ." ". " ..= .• . ··~-"··· -~"-~."- 11:· , tiDo~Teд ."
\' .,у;'. \P'иbli~,;ph9. •p?wnтe;:з. 0( ) '' : . ; !: ActiVeCell ..Offs.et(lO, iБp4 : s'iiь· · · " .·· ;Pu):)li'c Stib ClearDown () \': · . A pplicatiqn.OnKey "{Down}" ~~ш;1_. §11!:>.: ::., ,;,.,·;;; ' .·~~~-···= ·" · Объект Application 125 Метод ClearDown возвращает клавише <вниз> стандартную функциональность. Метод Or:iKey может использоваться для отключения существующих комбинаций кла­ виш. Например, для отключения комбинации клавиш <Ctгl +c>, обычно используемой для копирования, можно применить следующий код. Этот код присваивает комбинации клавиш пустую процедуру: stopGopyS orYёutП ~--m . - --• мм Application.OriKey нлс"' "" ;,EJlO.,, §\lJ:> ·~ -~·•.. .:.. "~··=·; . ~~-''''-·'·· -·- -~ . •. :.• _: :__, "' ' .. " - - ·-- <.•.с . ·, .-/ ·=··- - ~-:";,!»;у..-.~·, ..<:....~= • Обратите внимание, что используется обозначение "с" в нижнем регистре. Верхний регистр ("С") будет описывать комбинацию клавиш <Ctгl+Shift+c >. Для восстановления функциональности комбинации клавиш <Ctгl+c> восполнЗуйтесь следующей процедурой: :sиь-cfёarcO'PY-sЬ:ort.ёuттг ·,~s-N ·- ,,,.,- ' : Application:,OnKey нлс" fto0.'"" ?.1J.1:J. .т. ·- ···;t:,,:_ --~м. ·~·· .••·"'"''"°"·"''"·'"'"~11.с'""'"' · 1:iаз наче1 :1иЯ, сделанные с 'Помощью метода OnKey, относятся . ко всем открыть1м книгам .и, сохра':!яl<;>тся в течение в:сего ~еанса работы в Excel. · · Функции листа В коде Excel VВА можно использовать код из двух источников . Одна группа функций является частью языка VBA, а вторая - подмножеством функций листов Excel. Excel и язык Visual Basic (в виде VВА) не были одним целым до выхода Excel 5. Каж­ дая система разрабатывалась отдельно и имела собственные функции. Это привело к су­ ществованию нескольких пересечений и конфликтов между множествами функций. На­ пример, в Excel есть функция DATE, а в VВА - функция Date. Функция Excel DATE при­ нимает три аргумента (год, месяц и день) для генерации конкретной даты . Функция VBA Date не имеет аргументов в возвращает текущую дату, полученную от системных часов. Кроме этого, в VBA существует функция DateSerial, которая принимает те же аргу­ менты и возвращает тот же результат, что и функция Excel DATE. Наконец, функция Excel TODAY не имеет аргументов и возвращает тот же результат, что и функция VВADate . Как правило, если функция VВА вьшолняет ту же задачу, что и функция Excel, функция Excel оказывается недоступна для кода VВА (хотя метод Evaluat e позволяет получить доступ к любой функции Excel, как было показано в предыдущей главе ) . Кроме этого, стоит особо от­ метить функцию Excel MOD, которая недоступна непосредственно для кода VВА, но оператор VВAMod решает ту же задачу. В следующей строке кода используется мeтoдEvaluate для вы­ вода номера дня недели с помощью функции Excel MOD и функции Excel TODAY: Тот же результат можно получить при использовании функцииDаtе и оператораМоd: iJ::isЯ:в-9'~ 'I5atE; )!9~<1 .
126 Глава3 Кроме этого, в VВА недоступна функция CONCATENATE . Вместо этого можно восполь­ зоваться оператором & (который можно использовать и в формуле на листе Excel) . Если не­ обходимо применить функцию CONCATENATE в коде VBA, созд<iйте следующий код: ii""U.Б'i:Lc(si1E"'coБc7-i t:ёna~:Exampiei·(r''"'"7~':- .~ . . \ / D'i .m i :As String', у- А~ string 1' - • " Г Х ,;; .·"Jac_k "~' - · - - • У = ,; smith" .._ .~sg'BOx .;E'.(alu-ai:e "CONCATENATE'( " " ,;· & Х & " " '! , " " '' ~-~,n"9~9'9-.P~:.'> ~4, ..:_.~.,х, .~.~.~-~~·~пИ .~.ir),fW~i<t" С другой стороны, можно отказаться от лишней работы и получить тот 'же результат с использованием следующего кода: ii>uьI·r9·'·s:u:ь· c-oпcatenat:-eвxahipГe :г<·г-­ :".,c ' Dirn -х ;.,s string_; .'_ У As string , /J(= ' "Jack' " ' - ~: ..,, У ;,, · ; ·smith" [/!'' MsgBox. Х & У \E;J}.0::?1--:1.0.;~d-"-""'·- ~:'••• - ~-'=--'--·•·--- "'~--'"-·"'""~·-·=J':..~"-~"~-·- -"''"""'"···"-"'''"""''"'''-'·"'-'"'"'''- ~'"'"'' - Такие функции VВА, как Date, DateSerial и IsErnpty, могут применяться без ква­ лификации, так как они входят в группу <globals>. Например, следующий код вполн е допустим: Такие функции Excel, как VLOOKUP и SUМ, являются методами объекта Worksheet- Functions и требуют использования следующего синтаксИ:са: !foJ;]J.~::~:w:orиeh~~<iiif.iiЧct:rctчE:s.gщш~JШ_g:E;:жx::-.~ro:IJ:1:'~:rc:::::r~-: ''"'-:.:::rt12::zdI:1~"-~::1 Для совместимости с Excel 5 и Excel 95 вместо oбъeктaWorksheetFunctions можно использовать объект Application: Полный список функций листов, непосредственно доступных в VВА, предоставляет­ ся в описании объекта WorksheetFunctions в соответствующем разделе справочного руководства. Свойство Caller Это свойство объекта Application возвращает ссылку на объект, который вызвал или запусти'л макрос. Оно широко применялось в Excel 5 и Excel 95, где использовалось вместе с меню и элементами управления на диалоговых листах. В Excel 97 и более новых версиях панели инструментов и элементы управления ActiveX в диалоговых oкнaxUser~ Forrn пришли на замену меню и элементам управления на диалоговых листах. В новых возможностях Excel свойство Cal ler не используется. Свойство Caller все еще применяется совместно с элементами управления с панели инструментов Формы (Forms), с объектами рисования, к которым подключены макросы, и с определенными пользователем функциями. В частности , это свойство позволяет найти
Объект Application 127 ячейку, из которой была вызвана определенная пользователем функция. На показанном на рис. 3.3 функция WorksheetName используется для вывода имени листа в ячейке В2. При применении в функции свойство Application.Caller возвращает ссылку на ячейку, из которой была вызвана эта функция. Свойство возвращает ссылку ·в виде объ­ екта Range. В следующей функции WorksheetName свойство Parent объекта Range используется для генерации ссылки на oбъeктWorksheet, в котором содержится объект Range. Свойству Name объекта Worksheet присваивается возвращаемое значение функ­ ции. Метод Volatile объекта Application заставляет Excel пересчитывать функцию при каждом пересчете содержимого листа, поэтому при изменении имени функция п.о­ кажет новое имя листа. i:PU.Ьr:Lc .Fiiricfion wor'ksheeEN-ame CГ:д:s-- si:r'ing , - *' \'Appl'. i:catJ.on. volatile " . . .. . . . t''' . · .WorksheetName = Application. Caller. Parent' . .Name tE;Qd.~!.i,ifigJ:i9n•. " ··"" ..•. "" .. : ..:":,•. ""д 2 з. с ~~~~~~ ~--;-~~~~--~---...."-~---·-·-· .... .. .. ш~Sales Data ' 4 ....... .............;. . . ..... ···· ·· ·r·· 5 6 7 ". Готоsо Рис. 3.З. Использование свойства Caller Использование следующего кода в фyнкцииWorksheetName можно считать ошибкой: Если пересчет выполняется в то время, когда активен другой лист, функция вернет неправильное имя листа . Резюме В этой главе были описаны некоторые полезные свойства и методы oбъeктaAppli­ cation. Так как объект Application используется для предоставления универсальной функциональности, которая не подпадает под назначение других объектов, некоторые из очень полезных возможностей можно пропустить. В этой главе были рассмотрены следующие методы и свойства: . о ActiveCell - содержит ссылку на активную ячейку; О ActiveChart - содержит ссылку на активную диаграмму; О ActivePrinter - содержит ссылку на активный принтер; О ActiveSheet - соде рж ит ссылку на активный лист;
128 Глава3 О Ас t i veWindow - содержит ссылку на активное окно; О ActiveWorkbook - содержит ссылку на активную книгу; О Са11 er - содерж~т ссылку на объект, который вызвал макрос; О DisplayAlerts - управляет отображением диалоговых окон с предупрежде­ ниями; О Evaluate - используется для расчета значения фуНкций Excel и генерации объ­ ектов Range; О InputBox - используется для запроса ввода у пользователя; О OnKey - настраивает запуск макроса по нажатию клавиши или комбинации кла- циш (в комбинации с <Ctrl>, <A.lt> и т .д.) ; О OnTime - используется для планирования запуска макроса в будущем; О ScreenUpdat i ng - управляет включением или отключением обновления экрана; О Selection - содержит ссылку на выделенный диапазон; О SendKeys - отправляет нажатия клавиш в активное окно; О StatusBar - позволяет выводить сообщения в строке состояния; О Wo r ksheetFunction - содержит функции Excel, доступные для использования вVВА. Это небольшой фрагмент общего количества свойств и методов объекта Applicat i on. В Excel 2003 предоставляется около 200 таких свойств и методов. Полный список приво­ дится в приложении А.
Теория об.ъектно- ориентированного программирования и VBA Юлий Цезарь говорил: "Разделяй и властвуй " . Оригинальное утверждение относилось к ведению войны, в частности, к тактике разделения врага и победе над каждым батальоном в отдельности. Интересно, но этот результат относится и к победе над проблемами при проектировании программного обеспечения . Большие проблемы можно разделить на не­ сколько маленьких и победить каждую из них. С другой стороны , можно позволить пробле­ ме разделить наше внимание и победить нас . Хорошим правилом является организация решения начиная с самой сложной и кри­ тической проблемы. Обычно эти фрагменты - . основополагающие элементы решения, а приложение без этих фрагментов было. бы неполным. В этой главе рассматривается механизм, который обеспечивает разделение проблем и победу над ними - класс . В главе· 5 будет рассматриваться общая теория объектно­ ориентированного программирования, а также поддержка этой теории в языке VВА: Сравнение классов и интерфейсов Общая теория объектно-ориентированного программирования поддерживает два спо­ соба описания чего-то. Первым способом является класс. Обычно классы используются для описания сущностей в проблемной области . Крайне простым способом описания класса яв­ ляется его представление в виде существительного, имеющего значение в предметной об­ ласти. Распространено представление класса в виде схемы, а объекта - в виде экземпляра сущности, которую описывает схема . Второй описательной конструкцией является интер­ фейс. Обычно интерфейс опИ:сывает возможности или определенный аспект сущности .
130 Глава4 Для сравнения можно привести пример, в котором класс описывает телевизор, а интер­ фейс - возможности телевизора, например возможность увеличивать или уменьшать гром­ кость. Но эта возможность может существовать не только в телевизоре. Например, увели­ чение громкости являутся аспектом всех сущностей , способных издавать звуК. Автомобиль­ ные приемники, стереосистемы , телевизоры, проигрыватели, рожки и множество других предметов поддерживают возможность увеличения громкости " При этом между рожками и проигрывателями существует очень мало общего. Как это связано с VВА? Ответ заключается в том, что модуль класса является гибри­ дом между классом и интерфейсом. Если в модуле класса присутствуют только объявле­ ния, но отсутствует реализация (нет ни одной строки кода), то модуль является интер­ фейсом. Если в модуле класса присутствует реализация членов класса, то модуль класса является классом, реализующим интерфейс, точно соответствующий членам класса. (Важность реализации объявленных членов интерфейса заключается в том, что в неко­ торых объектно-ориентированных языках программирования класс может реализовы­ вать несколько интерфейсов или ни одного, или некоторые члены, которые не опреде­ лены в других интерфейсах.) По большей части модуль класса можно воспринимать как класс, но желательно помнить о существовании незаметного отличия. И классы , и интерфейсы поддерживают полиморфизм. Это значит, что гибридный мо­ дуль класса также поддерживает полиморфизм. Полиморфизм классов поддерживается че­ рез наследование, возникающее при определении класса и второго подкласса , который ге­ нераЛизует и расширяет первый класс. Например, существует концепция класса Элемент управления , Кнопка является конкретным типом элемента управления. В терминах объ­ ектно-ориентированного программирования Кнопка является элементом управления. На­ следование класса Элемент управления классом Кнопка называется генерализацией. Ге­ нерализация является синонимом наследования . Например, класс Элемент управления может поддерживать поведение Щелчок , а класс Кнопка расширяет это поведение, под­ держивая изменение внешнего вида кнопки; пересмотренное поведение Щелчок является одной (из множества возможных, на что указывает слово полиморфизм) формой поведе­ ния Щелчок. Язык VВА не поддерживает наследование классов. В языке VВА поддерживается Полиморфизм интерфейсов . Полlfморфизм интерфейсов ортогонален полиморфизму классов. ·При использовании классов можно объявить тип Элемент управления и инициализировать его с использованием класса Кнопка. При об­ ращении к методу Элемент управления . Щелчок фактическое поведение Щелчок будет соответствовать поведению кнопки , так как Кнопка является Элементом управления. При полиморфизме интерфейсов объявляется тип интерфейса. Этому типу удовлетворяет любой класс, реализующий интерфейс. При этом никаких требований к связи между реали­ зующими интерфейс типами не предъявляется. Рассмотрим классы Собака и Шахматная фигура . Эти классы не имеют ничего общего, но оба могут быть реализованы с возможно­ стью Перемещение: Собака. Перемещение и Ферзь . Перемещение. Можно реализовать интерфейс Перемещаемый (IrnoveaЬle- префикс I используется в VВА при обозначении интерфейсов, а не модулей классов), в котором будет осуществлен метод Перемещение. Впо­ следствии любой код , использующий интерфейс Перемещаемый (IrnoveaЫe), сможет вы­ зывать метод Перемещение, и фактический результат будет зависеть от конкретного объекта. Технически полиморфизм классов поддерживает получение ч:асти поведения от под­ класса. Например, вызов метода Элемент управления.Щелчок может приводить к возникновению события OnClick, а вызов метода Кнопка . Щелчок - к перекрашива­ нию кнопки и передаче управления родительскому коду, в котором создается событие. Полиморфизм интерфейсов скорее всего приведет к полной независимости от других
Теория объектно-ориентированного программирования и VВА 131 классов, реализующих интерфейс. Например, перемещение объекта Собака совершенно не повлияет на несвязанный объект Шахматная фигура. Если планируется программировать на других языках, например Visual Basic .NET, стоит изучить незаметные различия между классами и интерфейсами. На данный момент оставим общие вопросы и перейдем к особенностям языка VВА. Определение интерфейса Язык VBA поддерживает определение интерфейса в одном модуле класса и реализа­ цию интерфейса в другом модуле класса. Использование этого подхода позволяет реали­ зовать один, два или больше классов, поддерживающих одинаковое поведение. Эта воз­ можность полезна для доопределения методов в одном модуле класса. Доопределение означает существование более чем одного метода с одним и тем же име­ нем и разными сигнатурами аргументов. Доопределение методов в одном и том же классе невозможно, но можно воспользоваться полиморфизмом интерфейсов и определить не­ сколько классов, предоставляющих одинаково именованное поведение. Предположим, что необходtумо определить класс, которьrй расс<J:итывает факториал числа. Математически эта функция записывается как N! . Факториал является произведе­ нием всех целых чисел от 1 до N, где N является числом, для которого необходимо рас­ считать факториал . Факториалы полезны при решении полиномиальных уравнений. (Реализацию функции факториала писать необязательно , так как можно воспользоваться встроенной в Excel функцией Fact (n). Для демонстрации возможностей интерфейсов сделаем вид, что метод необходимо реализовать самостоятельно.) В редакторе VВЕ мож­ но добавить модуль класса и объявить интерфейс IFactorial, в котором объявлен единственный метод Calculate. Вот соответствующий код метода : :Func tion ca:ГC'ui·a teTвyvaCN"~As~f.o ng Г A. s'"'I..ong"' ~ "''" F~· . ~~ч~ fμ_n.,9,_t;:.iQJ!~,Ш....:At; ~·;..,..~.•- ,,,~,~ .~~...,.,~. .. ..":.~., .. . .. <\i.r. • • ~A " '" " ~,.1.=i_,~~:~~"- ·-~·"'~:ц.C!JV;;;,.,.~. В VВА модули классов с пустыми определениями являются чистыми интерфейсами. Если в окне Properties (Свойства) изменить значение свойства Narne на IFactorial, то фактически будет объявлен чистый интерфейс IFactorial, в котором объявлен един­ ственный метод Calculate. Мет~д Calculate принимает единственный параметр ти­ па Long и возвращает значение типа Long. Теперь необходимо реализовать несколько версий этого интерфейса. Реализация интерфейса Для реализации интерфейса необходим второй модуль класса, в котором использует­ ся оператор Irnplernents. Например, для реализации IFactorial из предыдушеrо раз­ дела необходимо добавить второй и третий модули класса , добавив в каждый из них опе­ ратор Irnplernents .IF actorial. В каждом модуле класса необходимо предоставить реализацию метода Calculate . В следующих листингах приводятся примеры осуществ­ ления интерфейса IFactorial. В первом классе метод реализован в виде рекурсивной функции, а во втором классе - без рекурсии: : 1 п;p 1ements . if'actor iaГ'"""_,.. - - ., ....,,,""_. · · ,,,.,, ,".." ,.. · ., JPrivate Function IFactorial_Calculate (ByVal N As Long) As Long If-(N>1)Then IFactorial_Calculate N '* IFactorial _ Calculate (N - 1) ~- J?lse-
132 Глава4 , · fFaEEor'iaI~ca1cuiat:e ; "i ' EndIf· iEnd Fuдctioд '}· l '(: ' >rпiplemehts · IFactorial· ' Pi'ivate Fuдction IFactorial:_Calculate(ByVal N As Lohg) As Long <· Dim 1 .10\ .s Long, result As Long . ~.• result' ,= 1 ! · i rest11t '' NeXt..I ·resu1t' * r IFactorial~Calculate = result • ., у ' .<tfh~;j:'!;j,Ж.J\,;;.,.., . . ;, ;& ,,:, ., -,... ,М.м".;;.;.п=..,, .t;; ,~_;.. ··-'"'· В любом месте, где можно использовать интерфейс IFactorial, разработчику предо· ставляется возможность выбора конкретной реализации. В следующем листинге демонст­ рируется вызов второй реализации метода Calculate. Для использования второй реали­ зации I F actorial_ Calculate в операторе Set замените Fac~oriall на Factorial2: tsu.ь · тe:~t:F'actoriai СГ" :;~ ~·-· ·-,-~- ·:-~,,,., •. , _,. .• .,-,~· b:i,m ,Factqrial As IFactorial SetFactorial = NewFactorial2 MsgBox ' Factorial. caiculate (4) · ' .· ;~ "·, ' :;,:Чs1 _§эь.."..~ :..,,,_, _,, ~ . · = · Естественно , что самостоятельное выполнение метода Factorial имеет смысл толь­ ко при отсутствии удовлетворительной реализации. Как и в других ситуациях, придется решать, как определенную методику можно применить в конкретном случае.' В данном случае можно определить единственный модуль класса , в котором опреде­ лены методы RecursiveFactorial и LoopFactorial (или подобные мето.ды), но объявление интерфейса IFactor.ial и пары вариантов метода упрощает выбор поведе­ ния за счет полиморфизма. Использование интерфейса позволит менять только опера­ тор создания объекта, реализующего интерфейс, и не модифицировать все вызовы мето­ дов, так как вызовы сохра!-Iят форму объект . метод, как показано в предыдущем приме­ ре . Если используется один класс и два метода, то замена метода потребует модификации всех вызовов в коде. Другими словами, при применении интерфейсов код меняется только в одном месте - в объявлении, а при использовании старого способа с примене­ нием нескольких имен код придется модифицировать в нескольких местах. Кто-то может спорить, утверждая , что в данном случае гибкость использования интер­ фейсов практически незаметна, но успешное программирование является скоординиро­ ванным применением лучших из лучших практик. В итоге, используя лучшие практики, в данном случае интерфейсы, можно получить бо.лее качественный общий результат . Определение методов Методы описывают поведение класса. Все действия класса должны быть реализованы в виде подпрограмм или функций в пределах класса. Подпрограммы и функции в классах назы­ ваются методами . Хорошие имена методов обычно состоят из целого глагола и существитель­ ных. Если необходимо возвращать единственное значение, реализуйте функцию. Если необ­ ходимо выполнить определенную задачу без возврата значения, реализуйте подпрограмму.
Теория объектно-ориентированного программирования и VВА 133 Объявление функции состоит из модификатора доступа, Friend, PuЬlic, Private (дополнительная информация приводится в разделе "Сокрытие информации и квали­ фикаторы доступа" далее в этой главе), необязательного ключевого слова Static, клю· чевого слова Function, имени функции, необязательных параметров и типа возвращае­ мого значения. Объявление функции состоит из модификатора доступа, необязательного клюЧевого слова Static , ключевого слова Sub, имени и необязательных параметров . Выбор между функцией или подпрограммой, выбор количества и типа параметров, а также типа возвращаемого значения (если это функция) определяется практическими соображениями. Вот несколько хороших правил : О используйте комбинации глаголо\в и существительных, а также целые слова для со­ ставления имен методов; О передавайте только совершенно необходимые'параметры. Если параметр является полем того же класса, что и метод, его можно не п ередавать в качестве параметра; О используйте целые слова, желательно существительные, для обозначения пара­ метров; О осторожно выбирайте модификаторы доступа, стараясь максимально сократить количество методов с модификатором PuЬlic (дополнительная информация приводится далее в этой главе в разделе "Сокрытие информации и квалификато­ ры доступа") . Синтаксис объявления методов приводится в справочном руководстве. Кроме этого, в этой и в других главах рассматривается множество примеров объявлений. Аргументы Аргументы могут передаваться по значению, по ссылке и в виде необязательного па­ раметра. Аргументы по значению определяются с помощью ключевого слова ByVal. Присутствие ByVal означает, что изменение значения аргумента незаметно за предела­ ми метода, так как в метод передается копия оригинального значения. Аргументы по ссылке определяются с помощью ключевого слова ByRef . Аргументы после ByRef явля­ ются ссылками на значения параметров; модификация передаваемых по ссылке парамет­ ров отражается за пределами метода. Наконец, модификатор Optional может Исполь­ зоваться вместе с ключевыми словами ByVal и ByRef. Необязательн ые аргументьi должны следовать после обязательных. Передача аргументов по значе·нию Аргументы ByVal могут меняться в пределах метода, но это изменение не отражается за его пределами . Например , если определить такую процедуру: :sиБ f56s6metblni:i (вyvaI '" i дs ·i nteger) I=.10 .. End SuЬ и вызвать процедуру DoSomething из следующего кода: 'bim j ' A.s rii.teger 'J =-7 ;, DoSomething (J) r'.=д.- В(::~ . ~ще P~f!HO - 7
134 Глава4 После завершения работь~ процедуры DoSomething значение аргумента J все еще будет равно -7 . Необходимо понять механизмы управления состоянием приложения, что позволит успешно это состояние контролировать. Другими словами, передаваемый по значению (ByVal) параметр меняется только в пределах метода. Передача аргументов по ссылке Если не указывать квалификатор аргумента, по умолчанию аргументы передаются по ссылке. Квалификатор ByRef по сути определяет указатели на переменные. Таким обра­ зом, при модификации процедуры DoSomething для использования ссылок на аргумен­ ты после завершения работы метода переменнаяJ будет иметь значение 10. Чтобы понять, как обрабатываются аргуме~ты, Передаваемые по ссылке и по значе­ нию, стоит помнить, что любой объект является числом. Переменные представлены двумя числами. Первое определяет положение переменной в памяти. Второе - значение переменной. При передаче аргумента по знаЧению передается два числа. Первое указы­ вает расположение копии переменной, а второе - значение копии переменной . При пе­ редаче аргумента по ссылке передается расположение переменной, а значит использует­ ся один экземпляр значения. Необязательные аргументы Вот основной принцип использования необязательных параметров: если определить параметр, который большую часть времени имеет определенное значение, разработчик экономит время потребителей. Наnример, если определить класс, рассчитывающий налог с продаж, а приложение в основном используется в штате Мичиган, то можно определить необязательный параметр Тах, который по умолчанию имеет значение в 6 процентов: В соответствии с определением процедуру AddSalesтax можно вызывать с одним параметром SaleAmount или с параметрами SaleAmount и Тах. Например, если метод используется в штате Орегон, в качестве значения параметра Тах можно передать О, так как в Штате Орегон отсутствует налог с продаж. Реализация рекурсивны~ методов_ Рекурсивные методы вызывают сами себя в процессе работы. Обычно в пределах мето­ да присутствует условие завершения работы. Рекурсивные функции, нaпpимepFactorial, рассматривались ранее в этой главе. Функции такого типа можно реализовать быстро и Просто. Единственная проблема заключается в развертывании стека. При вызове метода адрес текущей процедуры записывается в стек, который является ограниченным ресурсом. После этого в стек добавляются параметры, и метод вызывает­ ся еще раз. Адрес текущей процедуры используется для возврата после завершения рабо­ ты метода. После вызова в стек добавляются локальные переменные. Таким образом, при каждом вызове метода в стек добавляется информация, которая не извлекается до завер­ шения работы метода.
Теория объектно-ориентированного программирования иVВА 135 Рекурсивные методы вызывают сами себя до завершения своей работы, складируя информацию в стеке . Если количество итераций оказывается слишком большим, память стека может закончиться, взорвав стек. Если такая ситуация возникает в VВА, приложе­ ние 1выдаст сообщение об ошибке времени выполнения 28 , "Out of stack space". Из-за вероятности взрыва стека рекурсивные методы недостаточно жизнеспособны. Обычно для избавления от рекурсии используются циклы. Отказ от рекурсии через использование циклов Рекурсивные методы вызывают сами себя в процессе решения задачи . Вызов самого себя является неявным циклом, а условие завершения - граничным условием цикла. На­ пример, рекурсивный метод Factorial вызывает себя до момента, когда N будет равно 1. После этого работа метода завершается. Это значит, что граничными условиями яв ­ ляются 1 и N. Так как 1 * М равно М, 1 тоже можно и.сключить из условия. Это значит, что граничными условиями являются 2 и N. Так как для использования цикла необходи­ мо знать верхнюю и нижнюю границы, можно реализовать рекурсивный алгоритм под­ счета факториала с помощью цикла. Существует несколько причин, по которым рекурсию лучше заменять на циклы: пер­ вая причина заключается в большей скорости цикла FOR по сравнению с разворачивани­ ем стека и вызовом метода; вторая причина в том, что цикл может выполняться беско­ нечное ко~ичество раз, а объем стека рано или поздно зако нчится. Следовательно , из­ бавляйтесь от рекурсивных методов, так как они могут стать причиной проблем у конеч­ ных пользователей . Определение полей Поля описывают состояние объекта . Они могут принадлежать любому типу . }Ке­ лательно предоставлять принятое по умолчанию начальное значение полЯ в методе Class_Initialize, а принятое по умолчанию конечное значение в методе Class_ Terrninate. Инициализация полей позволяет обеспечить известное состоя­ ние объекта в начале жизни. Добавление финального состояния является хорошей привычкой, которая помогает избежать использования уничтоженных объектов. Например, если объект · имеет строковое поле MyField и в процедуре Class_ Terrninate полю присваивается значение "done", перед использованием объ­ екта всегда можно проверить значение поля MyField и сравнить его со строкой "done". Хотя этот прием оказывается более полезным в таких языках, как С++, С и Object Pascal, управление состоянием является наиболее важной привычкой. Сигнатурой поля является ключевое слово Private (по соглашению все поля явля­ ются закрытыми), имя поля и ключевое слово As, после которого указывается тип поля. Поля являются закрытыми, так как неограниченный доступ 1< состоянию усложняет управление состоянием объекта. Проблема полей заключается в том , что большинство из них могут иметь конечное множество значений . Например, существует конечное число действительных почтовых индексов. Это значит, что необходимо обеспечить присвое­ ние полям конечного количества действительных значений, чтобы обеспечить действи­ тельные начальное и последующие состояния. Сложность заключается в том, что само по себе поле не может вызывать код. Для этого существуют свойства. 1
136 Глава4 Определение свойств Хотя поля - это неотъемлемые компоненты управления состоянием, любое поле, предоставляемое потребителю, должно сопровождаться свойством. Свойство является специальным методом, который используется как поле, но на самом деле выполняет оп­ ределенный код. В результате свойства можно использовать вместо полей , получая удоб­ ный механизм управления конечным множеством действительных значений поля . Свойства имеют специальную сигнатуру, но выглядят как методы. Сигнатура свойства состоит из модификатора доступа (обычно PuЬlic ), ключевого слова Property, ключе­ вого слова Get, Let или Set, имени свойства и тела функции или подпрограммы . Для определения свойства, возвращающего значение, используется ключевое слово Get, скобки, ключевое слов As и тип возвращаемого значения. Для определения свойства , ко­ торое устанавливает значение, применяются ключевое слово Set или Let и параметр для типа устанавливаемого значения. Если значение записывается в поле классового ти­ па, используется ключевое слово Set. Если поле имеет неклассовый тип , применяется ключевое 5=ЛОВО Let. Например, если существует поле для хранения имени, можно опре­ делить следующую комбинацию полей и свойств : ;.PrivaEe ' -F:FirsENarne ·л;гst:r .:in:g. · - fpublic Property t .. . р . First~ame End " Property Get FirstName () As String .F FirstName J=>uЬlic Property Let FirstName (:SyVal Va1ue As String) FFirstName = Va1ue ~Ji1.19." PJ::pp§!E.tY.,. , ... . ~~·μ •• • По соглашению префикс F используется для обозначения полей. Для получения имени свойства достаточно убрать префикс F. Полученное имя позволит легко определить соответ­ ствующее свойству поле. (Некоторые программисты применяют префикс в виде аббревиату­ ры названия типа, но изобретатель этого стиля, компания Micгosoft, рекомендует от этого от­ казаться. В данном случае каждый решает сам для себя. Имя FirstName с использованием префикса может быть записано как sFirstName, m_FirstName или mvar_FirstName.) Свойство Get возвращает значение поля. Свойство Let r.rрисваивает значение аргумента Value (по соглашению это имя используется для обозначения аргументов свойства) полю объекта. Если необходимо написать код проверки действительности значения, он до;rжен быть добавлен между первой и последней строками оператора свойства. Обычно код проверки действительности присутствует только в методах свойств Let и Set. В первом листинге показано, как проверить действительность значения свойства налога с продаж, который должен быть неотрицательным и не должен быть меньше 10 % . Во втором листинге показано, как можно создавать составное свойство FullName на ос­ нове полей имени и фамилии: 'Private FSale'~тax As Db~ble ~-. . . ;Public Property Let. •salesTax (ByVal Value As Doubl, e) • .If (Value< О Or.Value > О.1).Then ~ • сделать что-то , чтобы сообщИтъ ·Об ошибке End. If • FSalesTax Value ;f:цd . P:i;:opeз,;J:y
Теория объектно-ориентированного программирования иVВА 137 В предыдущем примере продемонстрировано, как проверять действительность зна­ чения свойства SalesTax. Можно предположить, что налог не будет превышать 10% еще в течение нескольких месяцев, а отрицательных налогов не существует. iPu:ЬHc "'' P'ropert.:Y det: · f'il1iN"aШe с J ·л~ ·st.:Г:L n.g: ··· ' FtillName = .F FirstName ·& " " & FLastName В данном случае показано, как можно создавать составное свойство. Свойство FullName соответствует полям FFirstName и FLastName (не забывайте о соглашении по использова­ нию префикса F). При желании можно написать свойство Let FullName, которое будет де ­ лить строку на две подстроки и присваивать результат полям FFirs tName и FLastName. · Помните, что свойства на самом деле являются специальными .методами . Хотя в теле свойства можно написать любой код, основным назначением свойства является контроль допустимости данных . Это значит, что свойство отвечает за надежность установки и воз­ врата значений полей . Свойства только для чтения Предназначенное только для чтения свойство имеет лишь определения Property Get (без определения методов Set и Let). Если используется составное свойство или неизменяемое поле, которое потребители могут читать, но не должны менять его значе­ ние, определите только метод Property Get. Предназначенные исключительно для чтения свойства имеют только метод Get, но синтаксис этого метода не отличается от методов обычных свойств . Свойства только для записи Свойства только для записи имеют методы Property Set и Property Let, но не имеют метода Property Get. (Let исполь зуется для записи в необъектные перемен­ ные, а Set - для записи в объектные переменные.) Свойства только для записи встреча­ ются достаточно редко , но время от времени используются. Например , бензин можно за­ ливать в бак автомобиля через крышку, но если нет желания набирать бензин в рот, бен­ зин невозможно удалить через то же отверстие, через которое он был залит. Только езда на автомобиле приведет к снижению уровня бензина в баке. Другими словами, свойства только для чтения технически . возможны, но практически используются очень редко. Определение событий Операционная система Windows и Ехсе!, как одно из приложений, построены на базе троицы состояния , поведения.и сигналов . Составляющие троицы реализуются идиомами состояния и свойства , метода и события. События являются способом, которым объекты сообщают получателям, что выполнено определенное действие и сейчас самое подходя­ щее время прореагировать. Не стоит предполагать, что отличное внутреннее проектирование Ехсе! обеспечивает возможность программирования приложений Ехсе! без понимания механизмов событий. На самом деле, если досконально изучить механизмы событий, станет очевидным их применение в приложениях. Поэтому здесь приводится концептуальное описание собы­ тий: производители (которые создают классы) не всегда. наперед знают, как потребители (которые используют классы) будут реагировать на изменение состояния, поэтому в та­ кой ситуации используются события, предоставляющие получателям неограниченное
138 Глава4 пространство для реакции на изменение состояния . За кулисами синтаксиса событие яв­ ляется не более чем неинициализированным числом, которое указывает на метод . Когда црограммист связывает обработчик события (обычный метод) с событием, оно больше не является неинициализированным числом. Теперь событие имеет номер (который на­ зывается адресом) обработчика событий. При определении метода в класс добавляется предварительно инициализированное число, которое ссылается на определяемый метод . При определении события добавляет­ ся неинициализированное число, которое позволяет потребителю добавить код в точке возникновения события. Таким образом, события являются зарезервированными места­ ми для добавления необходимых потребителям отве~::ов. Перед произвощпелем стоит две задачи: определение событий, выступающих в роли сиг­ натур точек подключения, а также генерация событий в точках; где потребителям разрешено подключать собственный код. С точки зрения потребителя, событие - это возможность реа­ гировать на изменение состояния объекта. Например, при изменении значения свойства TextBox потребитель может проверить, является ли значение числом от 1 до 9 или строкой в формате почтового кода CIIIA. Производитель не может заранее знать о необходимой по­ требителю функциональности. Следовательно, он программирует универсальную функцио­ нальiюсть, а потре?итель конкретизирует ее для решения собственных задач. Определение событий в классах Не существует двух одинаковых типов реализаций объектных языков. Изучение не­ скольких языков позволяет получить общее представление о доступных возможностях. Например, идиома событий в VBA ограничена модулями классов, формами и документа­ ми, но так как событие является указателем на функцию, напрашивается вывод, что это ограничение налагается сqмим языком VВА. Кроме ограничения определения и использования событий в пределах модулей клас­ сов, форм и документов, события в VВА должны объявляться как подпрограммы и не могут применять именованные и необязательные параметры, а также параметры ParamArray. События можно определять и использовать внутри классов (формы и документы явля­ ются специальными классами). Определение событий в обычном модуле не поддержива­ ется . (В друтих языках идиома указателей на функции не связана такими ограничениями. С этой точки зрения больше всего возможностей доступно в С++.) Определять событие в классе имеет смысл там, где потребитель может вставить реак­ цию на изменение состояния класса. В определении события используется модификатор доступа (обычно PuЬlic), ключевое слово Event и заголовок подпрограммы, где клю­ чевое слово Sub неявно подраЗумевается под ключевым словом Event. В следующем примере показано , как определить событие для потребительского калькулятора. Это со­ бытие предоставляет точку вставки, где потребители класса Calculator могут реагиро­ вать на изменение потребительского параметра Discount (одним из вариантов реакции является пересчет общей суммы): .PuЬlic ,Everit ri i's 'c6unt.changed <й:Yval serider·· A .s cai.ёU:l"a tor , · _ . ' <,. ~yyal Ne~p;!:s~9uч,.t..,,A:зc. D91._1g),E) . .-...- ."" , Как показано в объявлении, используются ключевые слова PuЬlic и Event. После них указывается определение подпрограммы с аргументами, но без типа возвращаемого значе­ ния. В этом примере есть ссылка на объект, содержащий событие. (Полезность этого прие­ ма доказана во множестве объектно-ориентированных языков, поэтому здесь эта практика также применяется.) В качестве второго аргумента передается знaчeниeNewDiscount.
Теория объектно-ориентированного программирования и VВА 139 Создание события Процесс создания события по соглашению состоит из двух этапов: вызова метода с квалификатором доступа Private и создания события этим методом . Использование метода-оболочки обеспечивает конкретное место для реализации дополнительного ' пове­ дения , а для самого создания события применяется оператор RaiseEvent. В следующем примере показано, как создавать событие DiscountChanged. * "" ° '" .. ".~.~,, ,- =ж ., .. ,,, 'J '~ "< r' •Ч" ''"· ~·}"~ "'"'" ''"'< " (• - "' ' " '.'~н-•·"..,,,.,~" .., ..._,~·--···~~-. :~;-~,.,,,,,,. ,...,,,:~::;?"" ~P~~,~~fe 'F??-~.Tount As, Do~~le . \ '', . · , ·: tрцЧТ~с Prope~\y ~Get':'Dis~ount С) ' •,, Disc;ount =' FDiscount •' !Erid, Pr,ope'rty, ' · ~'- ,· ' ' .. ' ' '' i Pцbbl.c .. Property Let Discount (ByVa1 ~:~- If (va·ri:ie ·::- >· FDiscount) The.n · i!, ' FDiscount = value ,, ~:·' } сан Do'DisC:ou ntChanged ( FDiscount) ~;;·Ei:i<:1If. ' , Щnd property ~-''·. ''_ .. " . . ' ~riyate Sub. DoDiscountChanged(ByVal ··· NewDisc.cJUnt ~ : R(iiseEvent DiscouцtChanged (Ме, · NewDiscount)' ~~.Р.9.."-.:$._~р ·- h,~w;;,._ ~-"··"""°~-- =·"""".!'~.:..... •. :~,_,J.;::"jj.io.';:>~~м . . . . .Ji:.;м:I.)! ,h.-,h~~~ . ". h . .. .~~:..-,.~.~,"~ ~·~=hh.'Пlooow.;.--." . . . .". В этом листинге представлены · все элементы, имеющие значение в процессе создания и использования события. Первый оператор определяет поле, в котором хранится величина скидки. Оператор Property Get позволяет получить текущее значение скидки, а оператор Property Let проверяет, стоит ли выполнять код изменения поля (если значение скидки не меняется , то соответствующий код не выполняется) . Условный оператор в свойстве Property Let является просто соглашением . Если значение скидки все-таки меняется , свой­ ство вызывает метод DoDiscountChanged, который объявлен с квалификатором доступа Private. Наконец, метод DoDiscountChanged создает событие. На самом деле для созда­ ния собьrгия необходим только оператор RaiseEvent, но использование метода-оболочки позволяет отказаться от передачи первого аргумента - ссылки на себя. Соглашения принимаются одним из двух способов : тяжелым методом проб и ошибок или через копирование опыта тех, кто уже прошел по этоr.rу пути. Соглашение по сокрытию создания событий позволяет локализовать любой зависящий от внешних факторов код. Например, предположим, что принято решение о сохранении величины скидки в базе дан­ ных, файле или системном реестре. Вместо добавления этого кода во всех точках, где должно создаваться событие, код добавляется только в мeтoдDoDiscountChanged. , Наконец, рассмотрим вопросы обеспечения производительности и качества. Следо­ вание соглашениям, например сокрытию создания события, даже если это не всегда име­ ет смысл, позволяет получать однородный и симметричный код, который сам по себе яв­ ляется признаком профессионализма . При этом потребители и другие разработчики кода сразу поймут, чего от него ждать. Кроме этого, делая ОДНО и ТО же в одинаковых обстоя­ тельствах, разработчик экономит время, не думая о том, как и почеr.rу что-то делается именно так. В конечном результате надежные привычки формируются намного быстрее и разработчик может уделять основное внимание проблеме и ее решению, а не обдумы­ ванию методологии написания кода.
140 Глава4 Обработка событий При определении события разработчик выполняет роль производителя . При создании кода обработчика события разработчик выполняет роль потребителя. Роль производителя и потребителя в одном лице несет в себе определенный риск , так как потребитель, одновре­ менно являясь производителем , обладает знанием о внугреннем поведении потребляемого класса и может попытаться "срезать напрямик", например, записывая код непосредственно в поле, вместо создания и использования события. Оптимальным решением является созда­ ние классов для среднего потребителя в соответствии с правилами хорошего производителя, после чего, даже будучи потребителем собственного кода, можно создать хороший код, пред­ полагая, что о внутреннем устройстве потребляемых классов ничего ~еизвестно. Для обработки события с помощью ключевого слова Wi t hEvents необходимо объя­ вить переменную и использовать редакт.ор кода для генерации обработчика события . В следующем листинге показано, как в п ределах листа можно определить экземпляр клас­ са Ca l cu l ator и выбрать класс и событие из раскрывающихся списков Object (Объект) и Pr ocedure (Процедура): '.PrTvate ' wП:.hЁveni:.s ·· t'hecaicU:fai:.o r '' A.s caicU:iator PuЬlic Sub. TestCalculator () !.. Set theCalcu.lator = New Ca1 culator theCalculator.Discount "' .0,05 · .End' Sub · . . • . ;Pμi vate. sub theCa1cu l at6r_ DiscountChanged(ByVal ,_ · вyval N1=wDisco.unt · л's DouЫe) · · · .. , -~·-· " -· :,.. ~ ··, "><' Саll · мsgВох(':Скидка иЗмениласъ на · " & NewDiscount) ) ~. ' ·\ ~,: , ' j;p,~,;§1::1}2,~ =:,с..& ~"'·"~;~~ .~- -"-~·'"· . Первый оператор определяет переменную калькулятора с помощью ключевого слова Wi t hEvents . При этом переменная theCalculator будет добавлена в список объектов в редакторе кода. Выберите theCalcu l ator из списка объектов, тогда в списке проце­ дур станет доступна процедура Di scountChanged. Так как это единственное событие, в модуль потребителя будет добавлена процедура theCa l culator_ DiscoundChanged. В этом примере просто выводится новая величина скидки. В реальном приложении может потребоваться пересчет итоговой суммы или подобная операция. Обычно лучше добавлять события во все места, где потребителю потребуется среагировать на измене­ ние состояния. Помните, что разработчик как производитель, не в _состоянии преду­ смотреть все существующие и будущие применения класса. Использование событий по­ зволяет увеличить вероятность успешного применения класса в новых условиях , что уве ­ личивает срок жизни кода бе~ дополнительной модификации . Сокрытие информации и квалификаторы доступа На протяжении этой главы несколько раз упоминались квалификаторы доступа. В языке программирования VВА квалификаторами доступа являются ключевые слова P ri vate, PuЬlic и F riend. Перед тем как рассматривать значение конкретных ключевых слов, отметим, что в VВА все сущности можно определить с квалификатором PuЬl i c, что
Теория объектно-ориентированного программирования и VВА 141 особенно полезно в самом начале знакомства с языком. Но используя только открытый дос· туп, разработчик отказывается от одной из самых полезных, хотя и сложных, возможно­ стей объектно-ориентированного программирования. Перед знакомством с различными аспектами квалификаторов доступа разберемся, что эти слова означают на практике. И потребитель, и производитель могут вызывать открытые (puЬlic) методы. Открытые члены класса похожи на общественные туалеты. Любой может войти и делать .что угодно. Закрытые (pгivate) члены класса доступны только производителю. Только производитель класса может обращаться к закрытым членам. Друзья (Friend) могут только модифицировать процедуры в модулях Form и Class и не поддерживают позднюю привязку. Квалификатор Friend означает, что процедура является открытой в пределах про­ екта и закрытой для внешних проектов. С точки зрения Excel это значит, что процедуры Friend можно вызывать из любого места в пределах книги, но не из внешних книг. Зачем нужны квалификаторы и в чем их польза? В основном, чем меньше в классе откры­ тых .членов, тем он проще в использовании. Это значит, что открытыми должны быть только несколько необходимых членов, а все остальные должны быть объявлены, как закрытые. Это очень субъективное мнение. С другой стороны можно рассмотреть следующее обстоятельство: если член является закрытым, превращение его в открытый не сделает зависящий от него код неработоспособным, но закрытие открытого <шена может привести к неработоспособности зависящего от него кода. Вот основные рекомендации, которым необходимо следовать, при­ нимая решение об использовании квалификаторов доступа РuЫ ic и Pri vate: О старайтесь предоставлять не более пяти открытых членов; О если сложно принять решение , сделайте член закрытым и проверьте его способ- ность выполнять поставленную задачу; О все поля должны быть закрытыми; О все свойства должны быть открытыми; О все события должны быть открытыми; О если возникает необходимость в более чем 6 открытых членах, рассмотрите воз­ можность разбиения класса; О при необходимости нарушайте любое правило ; никто за это не наказывает. Инкапсуляция, агрегация и ссылки Завершим главу кратким обсуждением полезных, но сложных для понимания концеп­ ций. Имеются в виду инкапсуляция; агрегация, ссылки и зависимости. Инкапсуляция опи­ сывает хранение чего-то, агрегацИя - составление целого из фрагментов; ссылки - знание чего-то одного и использование чего-то другого, а зависимости говорят сами за себя. В объектно-ориентированном мире говорят "инкапсуляция", а подразумевают "хранящий данные класс". Например, класс WorkЬook инкапсулирует класс Worksheets. Инкапсуля­ ция обычно проявляется именем переменной, членом оператора и инкапсулированной информацией. Наiiример, лист инкапсулирует ячейки . Их связь в клacceWorkshee t может быть представлена в виде свойстваСеlls. Тогда код будет выглядеть, как Sheetl. Cel l s. Агрегация описывает целое, части и сумму этих частей. Автомобиль состоит из колес и шин, двигателя -и трансмиссии, сидений и руля. При соединении частей формируется новый предмет . Смысл агрегации заключается в том, что, при наличии частей и исполь­ зовании различных способов их комбинирования, в итоге можно получать разный ре­ зультат (целое). Автомобиль Hu·mmeг не является автомобилем Jeep, но они могут ис­ i:rользовать одинаковые детали. Как минимум, они используют одинаковые концепции.
142 Глава4 Самолет не является автомобилем, но и самолеты, и автомобили имеют общие компо­ ненты, например двигатели внутреннего сгорания и шины. Агрегация напоминае~, что комбинирование частей позволяет получить более мощный результат, чем при использо­ вании единичного монолитного предмета. Концепция ссылки описывает знание одного класса о другом классе. Например, эк­ земпляр класса Calculator можно добавить в класс Worksheet. В таком случае лист бу­ дет отвечать за создание калькулятора . Кроме этого, за создание калькулятора может от­ вечать другой класс, а класс Calculator будет просто ссылаться на созданный калькуля­ тор. Если объект класса Worksheet создает объект класса Ca.lculator, то объект класса Calculator является частью целого и такое отношение называется агрегацией; если объект класса Worksheet просто ссылается на объект класса Calculator, то такое от­ ношение называется ссылкой . Хорошим примером отношения ссылки является объект Application. Многие классы в Excel имеют свойство App l ication, но при удалении объекта Worksheet объект Application не исчезает. Но если приложение Excel за­ крывается, исчезает и объект Worksheet (хотя содержимое объекта и сохраняется в файле), Таким образом, отношение между объектами Application и Worksheet яв­ ляется агрегацией, а мeждyworksheet и Application- ссылкой. Наконец, существует отношение зависимости, при котором существование одного объ­ екта зависит от существования другого. Объект Worksheet зависит от существования объ­ ектов ячеек. Если класс А зависит от другого класса В, то объект класса А не может функцио­ нировать без объектов класса В. Т;у<ое отношение зависимости существует между объектом Application (приложение Excel) и объектом Worksheet. Приложение Excel реализова­ но таким образом, что на экране должен быть виден как минимум один лист. Следовательно, всегда можно положиться на истинность условия ThisWorkЬook. Sheets. Count >= 1. Определение и использование зависимостей основано на надежности условий: где существует один объект, там должен существовать и второй. Эти термины приводятся здесь, так как они будут использоваться на протяжении всей книги. Так как это универсальные объектно-ориентированные концепции, они полно­ стью справедливы и для VВА. Понимание этой терминологии позволит вест~ более пло­ дотворное обсуждение и сделает понятными многие расширенные методы программи­ рования, которые описываются в специализированных и общих книгах по объектно­ ориентированному программированию. Резюме Excel является практическим инструментом, неплохо справляющимся с математиче­ скими задачами и графическим представлением решений этих задач. Но VВА также являет­ ся мощным языком программирования и подходит для решения задач общего характера. VВА почти ничем не отличается от Visual Basic, а язык Visual Basic позволяет решать прак­ тически любые задачи. Рассмотрев универсальные объектно-ориентированные концепции, можно наиболее полно использовать возможности Excel и обратиться к более сложным конЦепциям. Если Excel необходима для решения проблем, требующих примене~ия других приложений Office или Visual Basic, эти знания могут оказаться исключительно полезными. Если возникла необходимость более глубоко изучить язык программирования VВА, реко­ мендуем познакомиться с книгами о шаблпнах (раиетs) и рефа1Сmарише (refactoring), например Add R.efactoring: Improving the Design ofExi.sting Code Мартина Фаулера (Maitin Fowler) или Design Patterns Эрика Гамма (Erich Gamma) и др. С объектно-ориентированной точки зрения Excel отлично справляется с "перемалыванием" чисел, а язык VВА является не просто макроязыком.
Процедуры обработки событий Excel значительно облегчает создание кода, который обрабатывает событие листа, листа диаграммы или книги. В предыдущих главах было показано, как подсветить актив­ ную строку или столбец листа, добавив код в процедуру обработки coбытияworksheet_ Selec t i onChange (глава 2) . Эта процедура запускается каждый раз, когда пользователь вы­ деляет новый диапазон ячеек. (Кроме этого, в главе 19 будут представлены примеры синхро­ низации листов в книге с помощью событий Worksheet_Deactivate иWorksheet_ Activate.) События книг, листов диаграмм и листов создавать очень легко, так как Excel автома­ тически предоставляет модули кода для этих объектов. Но стоит обратить внимание, что предоставляемые автоматически события диаграмм в модуле диаграммы относятся толь­ ко к листам диаграмм и никак не связаны со встроенными диаграммами. Для создания процедур обработки событий встроенных диаграмм потребуются дополнительные зна­ ния и трудозатраты. Кроме этого, существует множество других высокоуровневых событий, к которым может получить доступ разработчик, например события объекта Application. Они рассматриваются далее в главах 6 и 14. События элементов управления и форм также анализируются в соответствующих главах. В этой же главе более подробно будут рас­ смотрены события листов, диаграмм и книг, а также - проблемы, связанные с использо­ ванием этих событий. . '"' ~ ""~,·· "·_ /.;• Процедуры обработки событий всеr:да связываются с определенным объектом и хранят- ' ся в модуле класса, которыJ:i соответствует данному объекту. Например, ~то может быть модуль объекта ThisWorkbook или модуль кода, связанный с листом или диалого­ .вым окном UserForm. Событ11я определяются только в модулях классов.
144 Глава 5 События листа Следующие процедуры обработки событий листа доступны в модуле кода, связанном с каждым листом: О Private Sub Worksheet_Activate() О Private Sub Worksheet_BeforeDouЬleClick(ByVal Target As Range, Cancel As Boolean) О Private Sub Worksheet_BeforeRightClick (ByVal Target As Range, Cancel As Boolean) О Private Sub Worksheet_Calculate () О Private Sub Worksheet_Change(ByVal Target As Range) О Private Sub Worksheet_Deactivate() О Private SuЬ Worksheet_FollowHyperlink (ByVal Target As Hyperlink) О Private Sub Worksheet_PivotTaЬleUpdate(ByVal Target As PivotTaЬle) О Private Sub Worksheet_SelectionChange(ByVal Target As Range) Для создания шаблона процедуры обработки события можно воспользоваться рас­ крывающимся списком в верхней части модуля кода. Например, в модуле кода листа можно выбрать объект Worksheet из левого раскр:бrвающегося списка. Это приведет к генерации следующего кода: )"iivate ''stiь ''waiкsh'e·н:::_seiectioТlch.ange(вyvaJ.. t~,n4,?~)2 ,,""· .&с "~:,'.,..,,.,,,.~,."" Событие SelectionChange является принятым по умолчанию для объекта Worksheet. Из правого раскрывающегося списка можно выбрать другое событие. После этого необ­ ходимо удалить из модуля строки кода из предыдущ его примера. Вместо использования . раскрывающихся списков строки определения процедуры можно ввести вручную. Тип процедуры, а также тип, количество и порядок аргументов (так называемая сигнатура) должны совпадать с предыдущим кодом. При необходимости используйте другие имена параметров, но лучше--' стандартные имена, что позволит из­ бежать ненужной путаницы . Большинство параметров процедур обработки событий должны объявляться с ква­ лификатором ByVal, что защищает соответствующие объекты или сущности от модифи­ кации в процессе работы процедуры. Если параметр является объектом, можно исполь­ зовать методы . этого объекта И менять его свойства, но обратная передача определения объекта через присваивание нового определения параметру невозможна. Некоторые процедуры обработки событий выполняются до возникновения события и имеют параметр Cancel, который передается по ссыл.ке (ByRef). Параметру Cancel можно присвоить значение True, что приводит к отмене данного события. Например, пользователю можно запретить доступ к контекстному меню листа. Для этого в процеду­ ре Worksheet_ BeforeRightClick нужно отменить событие RightClick: · s:uь · work:s11e·ecвeJ:ore':Ri9-1it:c1iё1< /вyva.т · тarget: "' A.s"· :Ra:n.g:e; Cancel .As . Bool~an,) т:rue
Процедуры обработки событий 145 Включение событий В некоторых процедурах обработки события необходимо отключать. Это позволяет избежать неявной рекурсии. Например, если процедура обработки события листа Chan ge меняет его содержимое, она сама будет приводить к возникновению события Change, что вызовет повторный запуск процедуры. Процедура обработки событий еще раз изменит содержимое листа и еще раз создаст событиеСhаngе и т.д. Если в такой рекурсии принимает участие только одна процедура , Excel 2000 , 2002 и 2003 обнаружит рекурсию и завершит выполнение процедуры после нескольких сотен повторений (Exce l 2003 повторит выполнение процедуры Change после 226 повторе­ ний, а Exce l 97 прекратит после 40 по,вторений.) Если в рекурсии принимает участие бо­ лее одной процедуры обработки событий, процесс будет продолжаться неограниченное время, пока пользователь не нажмет клавишу <Esc> или комбинацию клавиш <Ctrl+Break> столько раз, сколько было запущено процедур обработки событий. Например, могут быть активны процедуры обработки событий Calculation и Change. Если обе процедуры меняют ячейку, на которую ссылаются расчеты, обе про ­ цедуры обработки события будут вызываться в процессе интерактивной цепной реакции. То есть, первая процедура обработки события приводит к вызову второй процедуры, а вторая - к вызову первой и т.д. Следующая процедура обработки события Change за­ щищается от цепной реакции, отключая обработку событий во время изменения содер­ жимого листа . Ее необходимо включить после завершения работы процедуры: ;i'r:Lv-a:Fe ~su:ь· workslieёt:cмnge{вyvai · тa:r:g:e( · дs ' R.ani:ie> Appl i cation.EnaЬleEvents Faise · Range ( "Al") . va .lue = 100 Application.EnaЬleEvents True ;_En<J.".suь .~ · :Чператор Application. EnaЬleEvents F.a l se . не влияет на . событи~ за пределами объектной модели Exc;:el. Например, сqбытия элементов управления . ActiveX . и Диалого­ · вы)( окон U~erForm ·продолжают обеабатыва;ься. Событие Worksheet Calculate Событие Wo r ksheet_Calculate возникает при пересчете содержимого листа. Обычно это событие создается при вводе новых данных в ячейки, на которые ссылаются формулы листа. Например, при вводе прогнозируемых значений данных процедуру об­ работки события Worksheet_ Calculate можно использовать для выдачи предупреж­ дения, когда ключевые результаты выходят за пределы допустимого диапазона. На листе, показанном на рис . 5.1 , предупреждение выдается каждый раз, когда значение прибыли в ячейке N9 оказывается больше 600 или меньше 500. Следующая процедура обработки события запускается каждый раз при пересчете со­ держимого листа, проверяет содержимое ячейки N9 (которая называется FinalProfi t) и генерирует сообщения в случае выхода значения за пределы указанного диапазона. ;E>X:I '\/ate ~si.iKw6'iJ<s:heet::.:..caTёuiat:e() ~ Diin Profit As DouЫe Profi t ,= Shee.t2. Range ( "FinalProfit") . Value If Profit > 600 Then . . MsgBox "Прибыль увеличилась до " & Format ( Profi t, " #, ##0. О") E;J.s.eif PJ;:Qfi1: < .509 Then
146 Глава5 'мsgвох ·;, ri:РИбЬlл'ь · с:иизила.с: ь· до-.. &' f'orпiat (Pro f i t ;· EndIf: :_End . ?1-!..Ь,~,..•и.~" Рис. 5.1 . Контроль менЯ1ощеzося значения События диаграммы Следующие процедуры обработки событий доступны в модуле кода каждого объекта диаграммы. О Private Sub Chart_Activate() О ·private Sub Chart_BeforeDouЬleClick(ByVal ElementID As Long, ByVal Argl As Long, ByVal Arg2 As Long , Cancel As Boolean) О Private Sub Chart_BeforeRightClick(Cancel As Boolean) О Private Sub Chart_ Calculate () О Private Sub Chart_ Deactivate() О Private Sub Chart_DragOver () О Private Sub Chart_DragProt() О Private Sub Chart_MouseDown(ByVal Button As XlMouseButton, ByVal Shift As Long, ByVal х As Long, ByVal у As Long) О Private Sub Chart_ MouseMove(ByVal Button As XlMouseButton, ByVal Shift As Long, ByVal х As Long, ByVal у As Long) О Private Sub Chart_MouseUp(ByVal Button As XlMouseButton, ByVal Shift As Long, ByVal х As Long, ByVal у As Long) О Private Sub Chart_Resize () О Private Sub Chart_ Select (ByVal ElementID As XlChartitem, ByVal Argl As Long, ByVal Arg2 As Long) О Private Sub Chart_ SeriesChange (ByVal Seriesindex As Long, ByVal Pointindex As Long )
Процедуры обработки событий 147 Событие BeforeDouЫeClick Обычно при двойном щелчке на элементе диаграммы открывается диалоговое окно с параметрами форматирования элемента. Перехват события двойного щелчка с созда­ нием собственного кода позволяет сократить процедуру настройки форматирования . В следующей процедуре форматирование трех элементов диаграммы выполняется при двойном щелчке на элементе. Если выполнить двойной щелчок на легенде диаграм­ мы (рис. 5.2), легенда исчезает. 1< • > " ! "Profit Sheet2 Chartl SheetЗ Готоsо Рис. 5 . 2 . Обработка событий диаграммы Если выполнить двойной щелчок на области диаграммы (за пределами графика), ле­ генда опять становится видимой. А двойной щелчок на линии последовательности с вы­ деленными точками изменит цвет линии. Если выделена только одна точка последова­ тельности, включается или отключается метка данных возле этой точки: /'Pr.fvate~:SuБ~cEar CБe"foreDouБiecП c'i·~TБY:vaГ Бfernerit fiY A'S''tong~~ _ ~. ByVal Argl As Long, ByVal Arg2 As Long·, . Cancel As Bool_e ·an) Dirn tbeSeries As Series Select Case ElernentID Case xlLegend " мe.HasLegend = False ·Cancel =·True "f._Щ!_e_xlChartArea "~---.~-----~---- ·"'-'~'-'-'~--·-----~_,.,..,._..,.._"'""""'"'""
148 Глава5 ··~-~" М'ё' v~ iffsL:ёgencI '" ;~ ·тru~e ·~·- v - '' " ~ · · -- caricel = True ' cas e · xiseries · ··дrgl· содержит индекс последовательности · " ' 'A J:'g2 содержит » >';ндекс точек (-1 если вьщелеliа ·, ' Пьс.тi~доватеЛъностъ) : set theSeries = мe'.SeJ:'iesCollection (AJ:'gl ), Arg2. = -1 Then · · · · · · ;With theSe:r;:ies :вorder . · :tf .Colorindex ;= xlColorrn'dexAutomatic .Colorindex 1 · > Else .Colorindex ( . Colorindex Mod 5 б) + ' 1 .End If End With Else ·: . ··. With theSe7ies.Points(Arg2) . . · . HasDa:taLabel Not . HasDataLabel · End With . End If Canoel End Select ~End;·, sub ·.i. · "'---.,;.,.;,~.'~,:"'"""'',..,..;,.*'',;"~""-,,/;;;"' True С помощью параметра ElementID передается идентификатор элемента, на котором пользователь выполнил двойной щелчок. Для определения элемента можно применять встроенные константы, например xlLegend. В ·завершение каждого блока параметру Cancel присваивается значение True. Это позволяет отменить принятый по умолчанию обработчик события двойного щелчка. В таком случае окно с параметрами форматирова­ ния не выводится. Обратите внимание, как ключевое слово Ме используется в качестве ссылки на объ­ ект, связанный с модулем кода . Применение Ме вместо Chartl позволяет сделать код переносимым и подходящим для использования вместе с другими диаграммами. На са­ мом деле, можно даже отказаться от ссылки на объектМе и использовать HasLegend = . В модуле класса соответствующего объекта на свойства этого же объекта можно ссылать­ ся без квалификации. Но квалификация свойств позволяет отличать свойства объекта от переменных. Если элемент диаграммы является последовательностью, то в параметре Argl содер­ жится индекс последовательности в коллекции SeX'iesCollection. Если выделена единственная точка в последовательности, то в параметре Arg2 передается индекс точ­ ки, а если выделена вся последоват~льность, параметрАХ'g2 имеет значение 1. При выделении всей последовательности процедура обработки события использует значение 1 для установки индекса цвета границы последовательности (если применяется автоматический индекс цвета). Если автоматический индекс не используется, Процедура увеличивает индекс цвета на 1. Так как доступно только 56 цветов, перед добавлением 1 процедура применяет оператор Mod , который делит индекс цвета на 56 и возвращает ос­ таток. Эта операция влияет только на значение индекса 56. Выражение 5 6 Mod 5 6 воз­ вращает ноль, а это значит, что следующим после 56 индексом цвета будет 1. При выборе единственной точки последовательности процедура переключает со­ стояние метки данных этой точки. Если свойство HasDataLabel этой точки установлено в значение True, оператор Not превращает его в False. Если свойство HasDataLabe l ус­ тановлено в значение False, оператор Not превращает его в True .
Процедуры обработки событий 149 События книги Возможны следующие процедуры обработки событий книги. Процедуры, появившие- ся с выходом Excel 2003, выделены полужирным шрифтом. О Private Sub Workbook_ Activate () О Private Sub Workbook_Addininstall() О Private Sub Wo rkbook~AddinUninstall () 0 Private Sub WorkЬook_AfterxmlExport(ByVal Мар As XffilMap, ByVal Url As String, ByVal Result As XlxmlExportResult) 0 Private Sub WorkЬook_Afterxmlirnport(ByVal Мар As XffilMap, ByVal IsRefresh As Boolean, ByVal Result As XlxmlirnportResult) О Private Sub Workbook_Bef oreC lose (Cancel As Boolean) О Private Sub Workbook_BeforePrint(Cancel As Boolean) О Private SUЬ WorkЬook_BeforeSave (ByVal SaveA.sUI As Boolean, Cancel As Boolean) О Private SuЬ WorkЬook_BeforexrnlExport(ByVal Мар As xrnlMap, ByVal Url As String, Cancel As Boolean) 1 О Private SuЬ WorkЬook_Beforexrnlirnport (ByVal Мар As xrnlMap, ByVal Url As String, ByVal IsRefresh As Boolean, Cancel As Boolean) О Private Sub Workbook_Deactivate() О Private Sub Workbook_NewSheet(ByVal Sh As Object) О Private S ub Workbook_Open () О Private Sub Workbook_PivotTaЬleCloseConnectiьn ( ByVal Target As PivotTaЬle ) . О Private Sub Workbook_PivotTaЬleOpenConnection (ByVal Target As PivotTaЬle) О Private Sub Workbook_SheetActivate(ByVal Sh As Object) О Private SuЬ WorkЬook_SheetBeforeDouЬleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean ) О Private Sub Workbook_ SheetBeforeRightClick ( ByVal Sh As Object , ByVal Target As Range , Cancel As Boolean) О Private Sub Workbook_SheetCalculate(ByVal Sh As Object) О Private Sub Workbook_SheetChange (ByVal Sh As Target As Range) О Private Sub Workbook_SheetDeactivate(ByVal Sh As 0 Private Sub Workbook_SheetFo llowHyperl ink (ByVal ByVal Target As Hyperlink ) О Pri vate Sub Workbook_SheetPivotTaЬleUpdate(ByVal ByVal Target As PivotTaЬle) О Private Sub Workbook_SheetSelectionChange (ByVal ByVal Target As Range) О Private Sub WorkЬook_Sync(ByVal SyncEventТype As Office.MsoSyncEventТype) Object, Object ) Sh As Sh As Sh As О Private Sub Workbook_ WindowActivate(ByVal Wn As Window ) ByVal Object, Object, Object,
150 Глава 5 О Private Sub Workbook_ WindowDeactivate(ByVal Wn As Window) О Private Sub Workbook_ WindowResize(ByVal Wn As Window) Кое-какие из процедур обработки событий позволяют обрабатывать события листов и диаграмм, но на уровне книги. Разница заключается в том, что при создании такой процедуры (например, для обработки события Change) в пределах листа или диаграм­ мы, процедура срабатывает только в пределах листа. При создании процедуры обработки события на уровне книги (например, для обработки события SheetChange) процедура срабатывает на любом листе книги. Чаще всего на уровне книги используется процедура обработки события Open, в кото­ рой выполняется инициализация книги при открытии: Здесь можно настроить режим рас­ чета, указать параметры экрана, изменить структуру меню , выбрать расположение панелей инструментов или ввести данные в комбинированные списки или списки на листах. Точно так же процедура обработки события WorkЬook_BeforeClose может использо­ ваться для очистки среды перед закрытием книги. Например, эта процедура применяется для восстановления параметров экрана и содержимого меню, кроме этого, для предотвра­ щения закрытия книги. Для этого параметр Cancel должен устанавливаться в значение True. В следующей процедуре обработки событий закрытие книги разрешается только в том случае, если значение ячейки FinalProf i t находится в пределах от 500 до 600. i.Priva.fe ·sliЪ' worfьoc:J k: вёi'orec.1o s ё (canc el As · Dim Profit As Double ·· · Обратите внимание, что, если в процедуре обработки события BeforeClose пара­ метру Cancel присваивается значение True, Excel также не сможет завершить работу. Сохранение изменений Если необходимо обеспечить сохранение всех изменений при закрытии книги, но пользователь не должен получать запрос на сохранение, сохранение можно запускать в процедуре обработки события BeforeClose. Необходимость сохранения определяет­ ся значением свойства Saved объекта книги. Если в книге присутствуют несохраненные изменения, свойство устанавливается в значениеFаlsе. Priv a tё ' suь· work.:Ьook ве f ьreё1os'e'i ёanceI"'A.s 'БооЗ:еаnГ '""""7··~~~-;,:;-;··;а;;·~}:;t:Л;(Г ;. > тf Not: 'тhisworkbook. saved Then · · ' • ··· · ·· ~·· • i ThisWorkbook . Save · , .End'I.f . ~EJl.d _§:ц_f> :'°' .. ·. С другой стороны, если необходимо отказаться от сохранения изменений в книге и запре­ тить выдачу пользователю запроса в момент закрытия, можно установить свойство Saved в значение True. Это также можно сделать в процедуре обработки события BeforeClose. !J"rlV:at.'e~·su1:>·· wo.rk.ьoo:k2вef6iee1os~ {ёаnсе1~·л1г:вь01·е-а.nУ"""' ·- 7· ' ThisWorkbook. saved ·= тrue. · · · " ' · .J?.i:i9- c$,чl:J.~_." ::•• После этого Excel будет считать, что все изменения сохранены.
Процедуры обработки событий 151 Верхние и нижние колонтитулы Часто в Excel возникает необходимость печати информации в верхнем или нижнем ко­ лонтитуле страницы. Иногда эта информация извлекается из ячейки на листе или не под­ держивается доступными параметрами колонтитулов . Например , можно вывести название компании, хранящееся в ячейке на листе, или вывести полный путь к файлу книги. Полный путь и имя файла доступны как один из вариантов содержи111ого колонтиту­ лов в Excel 2003 . Но для добавления в колонтитул текста из ячейки листа потребуется использование кода. В следующей процедуре текст из ячейки А2 листа P1·ofit размещается в левой части нижнего колонтитула, после чего очищается центр нижнего колонтитула и в правой части колонтитула указывается полный путь к имени файла. Эти изменения вносятся на каждом листе и диаграмме в пределах книги : Yi'riv:at:e s1iь -wo'rkЬooК:вeб:)re-Prl.n-(( саПЕе1 ·:.Аs ' воЪiеаnГ"щ··,~·~с· · · Dim aWorksheet As Worksheet Dim FullFileName As String Dim .\:ompanyName As s "tring ComJ;JanyName = Worksheets ( "Prof i t" ) . Range ("А2 "} :V,а.~це FullFileNarne = ThisWorkbook . FullName For Each aWorksheet In ThisWorkbook"Worksheets With aWorksheet.Page Setup . ;LeftFooter = CornpanyNarne· . CenterFooter = "" . RightFoote.r = Ful l FileNarne End. With Next aWorksheet Dirn .achart As Chart For Each aChart In ThisWorkbook. Charts With aChart.Pag~Setup . I"eftFooter = CoinpanyNarne . CenterFooter = "" . RightFooter = FullFi1eN.ame ,· End With t- Next aChar·t Enq SчЬ Содержимое нижнего колонтитула можно просмотреть в режиме предварительного просмотра (рис. 5.3) · ,,_'~~~~~~~~7~~~-~-~ ~~~~~· ~~~~·~~~---1 с.." Sotw~,.. Cмctpions, hc Предеаритеnьный просмотр: страница 1 ю 1 » Рис. 5.3. Нижний колонтитул диаграммы в режиме предварительного просмотра
152 Глава 5 Резюме В этой главе были рассмотрены полезные примеры использования процедур обра­ ботки событий в ответ на действия пользователей . Речь шла о событиях книг, листов и диаграмм. Более подробно проанализированы следующие события: · О Workshe et_Cal culat e О Chart_BeforeDouЬleC l ick О Workbook_BeforeClose О Workbook_ BeforePrint Язык VBA на самом деле является языком программирования на основе событий. Следовательно_, знакомство с ними позволяет получить доступ к новой функциональности, о которой многие даже не подозревают . Дополнительную информацию можно найти в окне O bj ect Brows er (Просмотр объек­ тов) и в приложении А.
Модуnи. классов Модули классов используются в VBA для создания собственных классов. Вот несколь ­ ко примеров проблем, решение которых требует создания собственных модулей классов: О реакция на события приложения; например, можно создавать код, который будет выполняться при сохранении или печати любой книги; О реакция на события встроенных диаграмм; О создание единой процедуры обработки событий, которая будет использоваться большим количеством элементов управления ActiveX, например текстовыми по­ лями в диалоговом окне UserForm; О инкапсуляция методов Windows API для взаимодействия с операционной систе­ мой Windows; О инкапсуляция стандартных процедур VВА в удобной для переноса в другие книги форме. В этой главе будут определены ·некоторые классы, позволяющие понять, как работают модули классов. После этого изученные принципы можно использовать в более полезных примерах. Ранее уже расматривались встроенные объекты Excel, например объект Worksheet, и было показано, что часто объекты являются частью коллекции, например, Worksheets. Кроме этого, объекты имеют свойства и методы, например свойствоNаmе и метод Сору объекта Worksheet. Модуль класса позволяет создать собственную "схему" объекта, например класс Employee . В модуле класса можно определить свойства и методы, например свойство Rate, в котором записывается т.екушая заработная плата работника, и мeтoдChangeTitle, неявно затрагивающий другие фрагменты состояния объекта Employee. Кроме этого, можно создать новую коллекцию, например Employees. Модуль класса является аписа-
154 Главаб нием объектов, которые должны создаваться. С его помощью создаются экземпляры класса. Например , Mary, Jack и Anne могут быть экземплярами класса Ernployee и вхо­ дить в коллекцию Ernployees. Создание собственных объектов Рассмотрим процесс создания объекта Ernployee, описанного выше. В объекте необ­ ходимо хранить имя работника, количество рабочих часов в неделю и размер оплаты труда. Объект Ernployee можно создавать с тремя свойствами , которые будут хранить необходимые данные, и методом , рассчитывающим размер еженедельной оплаты. Для этого создается модуль класса, называемый Ernployee. Он показан в ве рхне й правой части рис . 6 .1 . YBAProje ct (Clossl.н ls) :.:::1 --е;: Мicrosoft Excel Objects ·.. 1!) Sheetl (Sheetl) : .. ~ Sheet2 (Sheet2) ~-· ·@) SheetЗ (SheetЗ) · · ~ тmworkЬook ~,. e,i моош, ' ·4 Мodule! :. 4 Мodule2 '-· 4 МоdUез ~;:. -~ C1ass Мodul~"s :Employ_ee ClassмoduJe ~~•l c;_.~ I =;~.~~. -~--~--~~~-~~- SuЬ Te:it.Employ eePay () Set. anEmployee • Ne111 Employee a nrmployee . Narne z "8111 Gateэ " anEmployee.Rat e • 4.25 anEmployl!!e . HoursPl!!r \Jeek • 40 HsgБox anEmployee.Ne.rne: ' " earns $" ' anEmp l oyee . GetGross\le ekl уРау ( ) ' " / wk" End SuЬ Opt. i on Explicit Pi:-ivat.e FN ~ .A.s Striщ; Pz::ivat.e F HoursPe rWeek l:i DouЫe ..:~: :2.Y-~-~! _L.~~~-~---!- ~ .. . P. .O~.!. ~- --- -- - -- - -- - -- - ---·----··----··-·--"·-----·--·--· РuЫ1с Function Get Gr oзэ\Jeek lyPay () A:!!I DouЫe GetGr oээWeekl yPay "' fHourэP er1ieek " fRate . . . .;.!~О....~.~-~~-~.;.о!"!..... PuЫic Prop~rty G~t N~ () J.:!!1 Strinq N~•fN~ Рис. 6. 1. Определение и тестирование класса в редакторе VВЕ В модуле класса Ernp l oyee объявляется три открытых свойства Narne, HoursPerWeek и Rate ( на рис . 6. 1 не показано ). Кроме это го , предоставляется один откр ытый метод GetGrossweeklyPay. Код в стандартном модуле ( в нижней правой части рис. 6.1) создает объектЕmрlоуее на основе схемы , описанной в модуле класса Ernpl oyee. В модуле объявляется пер емен­ ная anErnployee, имею щая тип Ernp l oyee . П одпрограмма Tes tErnp loyeePay исполь­ зует оператор Set для присваивания нов о го экзем пляра класса Ernployee переменной a nErnp l oyee. После этого подпрограмма присваивает значения трем свойствам объекта и гене­ рирует сообщение, которое выводится в окне сообщения . Для формирования сообще-
Модули классов 155 ния используется значение свойства Name объекта Employee и вызывается метод GetGrossweeklyPay. Ниже показан альтернативный вариант стандартного модуля , кода, который стоит применить, когда необходим только один экземпляр класса: f~i~ anEЧipl'oyee..As New ):mp l 6yee- • ts~b ~mploye~Pay () . anEmployee.Name = " Mary" ~· an,Employee.Rate ,;. 15 f an'Employee. HoursPerWeek 3 5 ~ MsgBox · a:nEmployee. Name & " зарабатывает '' $" ~ ~ & ' anEmployee. GetGrossWeeklyPay () & " в .. неделю" !.J?I10."?.ЧJ:{~.. ,_ _ •.;;.м •.".: . ""="."•." •••• _. ~"м.• ..• ••"." ""« . ". " В данном случае в строке объявления используется ключевое слово New. При этом объ­ ект класса Employee создается автоматически при первом же применении в коде модуля. Использование коллекций Теперь, когда создан один класс Employee, пришло время создать механизм для управления большим количеством объектов Employee . В VВА для этого предоставляется класс ·collection, использование которого показано ниже: го-n ·вхр~1· 1·су:СЕ ·~·" ,,_.. "- -.~ · м-:- ~·*Л ~ m ·Emp1oyees· As New Collection Ь «тestEmployeesCollection () anEmployee As Employee I As Long ' удалить сотрудников из коллекции or I ·= Employ_ees . Count То 1 Step -1 . ' Call Employees.Remove(I) tNoxtc . r !sJi·t . anEmploye~ New Emp1oyee 1.,a,nEmployee. Name = " Paul Kimmel" ~anEmpJoyee. Rate = 15 ; apEцtployee. HoursPerWee.k = 45 ,~.аЦ Employees.~dd(ariEmployee, anEmployee.Name) (;;t anEmpl~yee = . N 'ew Employee .anEп\ployee:Name = "Bill Gates" ,ariEmployee . Ra te = 14 [anEmployee. HoursPerWe.ek = 35. 1са1: Erilployees. Ad.(l (anEmployee, anEinp;J..oyee. Name) iMsgBox "Количество сотрудников составляет " & Employees.Count !J:1sgBox "Employees(2) .Name = " & Employees (2) .Name !MsgBox "Employees (" ":Paul .Kimmel"") . Rate . '" & E:nployees ( "Рацl Kimmel") .Rate or Each anEmployee In Employees MsgBox anEmployee.Name & " зарабатывает $" _ ' & anEmployee.GetGrossWeeklyPay() \ ext anEmployee . J~чs.Ja~ь , ,
156 Глава 6 В начале стандартного модуля переменная Employees объявляется как объект класса Collection. Процедура TestEmployeeCollection ис пользует метод Remove объекта коллекции в цикле For. . . Next для удаления существующих объектов в обратном по­ рядке, так как удаление в прямом порядке приведет к изменению верхней границы, от которой зависит цикл. Обычно этот шаг не нужен, так как сразу после создания коллек­ ции не содержат объектов. Код используется только для демонстрации метода Remove и для поддержки многократного запуска процедуры без удвоения количества объектов в коллекции. Процедура Tes·tEmployeeCollection создает первого работника, "Paul Кimmel", и использует метод Add для добавления объекта Employee в коллекцию. Первый пара­ метр метода Add содержит ссылку на объект. Второй: необязательный, параметр содер- , жит идентификатор, по которому на объект можно будет ссылаться в дальнейшем . В дан- ном случае используется свойство Name коллекции Employees . Эта процедура применя ­ ется и для добавления второго работника. Если каждому члену коллекции предоставляется ключ, ключи должны быть уникальнь1 . Если в коллекцию ,добавить объект, ключ которого совпадает с уже использующимся ключом, появится сообщение об ошибке . времени выполнен11я. · Не рекомендуется ис- ' пользовать в качестве ключа имя работника,· так - как люди могут иметь 6динаковь1е име-' на. Для создания ключа стоит приме1;1ять ' уникальные идентификаторы; напри'У'еf> номера социального · страхования {хотя практика показывает, что с то'ЧкИ зренИя бi.Зопасности такая информация является не лучшИм вь1бором уникального. ключа" , _ ПрИ л-t fJ. ч. ред.) . '". ·4 ' ' 'f. ·' .. ' '' . ..,,,, .·~. Операторы MsgBox показывают, что на коллекцию можно ссылаться так же, как на встроенные коллекции Excel. Например, коллекц'ия Employees имеет свойство Count . На членов коллекции можно ссылаться по позиции или по ключу, если объектам были предоставлены значения ключей. Коллекция в модуле класса Коллекцию можно создать и в модуле класса. Этот подход имеет свои преимущества и недостатки. Преимуществом является увеличение контроля над взаимодействием с кол­ .цекцией. При этом можно ограничить непосредственный доступ к коллекции и инкапсу­ лировать код в пределах одного модуля, что позволит сделать код более переносимым и более простым в сопровождении. Недостатком этого подхода является большая трудоем­ кость создания . Кроме этого, становятся недоступны некоторые Простые способы обра­ щения как к элементам коллекции, так и к самой коллекции. В следующем коде показано содержимое модуля клaccaEmployees : 'optiori ·· ExpliCi t '" 1 , , :Private FEmployees As New Collecti .on PuЬlic Function Add(ByVal value As Employee) : Call FEmployees.Add(value, value.Name) ;End Function PuЬlic Property Get Count () As Long Count -- ='< FEmployees .count . End Property , , . PuЬlic Property Get Ite ms() As Collection Set Ite ms = FEmployees
Модули классов 157 ,E:ilcl i'ioperi:.y ··· :Publi<:: . Property Get rtem(ByVal value As. Variant) As Employee . Set rtem = FEinployee"s (value) ;End .Property · " PuЬlic _sub .Remove(ByVal value -As Variant) · Call FEmployees. Remove {value) L~.r:is'!.. 9"ub ~"·~·= . ·=- "-"" ·'-··~ "."".....="·· - Если коллекция выделена в отдельный модуль класса, обращение к четырем методам коллекции (Add, Count, Item и Remove) из стандартного модуля оказывается невоз­ можным. В модуле класса придется создавать собственные методы и свойства, даже если модификация методов коллекции не требуется. С другой стороны, разработчик может выбирать реализуемый фрагмент функциональности, а также, что предоставлять в виде метода, а что - в виде свойства. В классе Employees функция Add, подпрограмма Remov e, свойство Get Item и свойсг· во Count реализуют большую часть функциональности коллекции. В процедуре свойстваGеt Items присутствует одна новая возможность. В то время как свойство Get Item возвращает ссьшку на один элемент коллекции; свойство Get Items возвращает ссьшку на всю коллек­ цию. Эта возможность позволяет использовать коЛлекцию в циклахFоr Each. . . Next. При этом стандартный модуль кода будет выглядеть следующим образом: ~'dP"tI'oll '<> ЁXPI"'ici t . ,~ ?~~--- ,~---,~~-~- ~"~ ~-~~",,~-,., - - - · - ' >: ,.,~-:---....,.,,., ", _" .~""°"'f\'"_ ."·:- : - <· _ · · ·-: ox · ·-· 'Dim theEmployees As New Employees . jSub тestEmployeesCollection () .Diш anEmployee As Employee Юim I As Long §' Удалить СОтрудНИКОВ ИЗ КОЛЛеКЦИИ .For. I = theEmployees. Count . То 1 Step . :-1 ~ Cal l · theEmployees. Remove (I) .Next r Set anEmployee - . New Employee ariEmployee.Name = "Paul Kimmel" anEinployee .. Rate = 15 ·a nEmployee.HoursPerWeek = 45 ~Call theEmployees·. Add ( anEmployee) . . 1set anEmployee = New Employee ~anEmployee. Name = "Bill Gates" ianErnployee.Rate· = 14 fanEmployee. HoursPerWeek = 35 ·call theEmployees.Add(anEmployee) r. 1MsgBox "Колич е ство сотрудников = " & theEmployees. Count ;MsgBox "Employees. Item ( 2 )' . Name = " & theEmployees. Item ( 2) . Name lмsgBox "Employees . I tem ( " "Paul Kimmel" ") . Ra te · & theEmployees.Item( .'~Paul Kimmel") .Rate :For Each anEmployee In theErnployees.Items MsgBox anEmployee.Name & " зарабатывает $" _ & anEmployee. GetGrossWeeklyPay () 'Next anEmployee ··. · '.~fld "S\lJ::> ""·.
158 Главаб Объектная переменная theEmployees объявлена как экземпляр класса Employees. Как и раньше, из коллекции удаляются объекты, и цикл For. . . Next добавляет в кол­ лекцию двух работников. Одним из дополнительных удобств является отсутствие не­ обходимости добавлять значение ключа при использовании метода Add коллекции Employees. Вместо разработчика этим занимается код методаАdd . Первый, второй, третий и четвертый операторы MsgBox показывают новые свой­ ства, которые необходимы для получения ссылок на коллекцию и элементы коллекции. Для получения ссылки на элемент коллекции нужно использовать свойство Item, а для по;rУчения ссылки на всю коллекцию- свойство Items. Перехват событий приложения Модуль класса можно использовать для перехвата событий приложения . Большин­ ство этих событий совпадают с событиями книги, но относятся ко всем открытым кни­ гам, а не только к книге, содержащей процедуру обработки события. Например, в книге существует событие BeforePrint, которое возникает перед· печатью любого фрагмента книги. На уровне приложения есть событие WorkbookBeforePrint, возникающее пе­ ред запуском печати в любой книге . Для получения спи<Zка доступных событий приложения необходимо добавить в про­ ект модуль класса, который может иметь любое допустимое имя. На следующем снимке экрана показан модуль класса AppEvents. После этого в начало модуля можно ввести следующее определение переменной: l.l ' I'~f::wтtББven:ts"'" iiP~~~t?P.l fc}~t.lon~~'""~~~· Вместо Арр используется любое допустимое имя объектной переменной. В коде, ссы­ лающемся . на модуль класса, это имя применяется в качестве им ени свойства класса. Ключевое слово Wi thEvents позволяет получать доступ к событиям, которые связаны с объектом приложения. Теперь Арр можно выбрать из левого раскрывающегося списка в верхней части модуля. После этого в правом раскрывающемся списке будут перечисле­ ны соответствующие события (рис . 6.2). В··\!!!f Class ModcJes · ~дWEv<rk · ·Ш ·cn;tEVe~ts ,E:?J' &'ь~..!;;~~..;~~;;:~;х;1· Private: SuЬ App_NewVor End SU:Ь Рис. 6.2 . Выбор событий класса heetBeforeDouЬ/e:CJlck
Модули классов 159 В данном случае выбирается событие WorkbookBeforePrint и расширяется проце­ дура обработки события, которая описывалась в главе, посвященной событиям. Для это­ го в модуле клaccaAppEvents используется следующий код: fi'rivaEe· silb~j\pi:)':._workbookвefq reP r int (Byi.iaY WЬ. A.s wworkьook~ ::.". c~n7e+ .As J;Joolea11J · · i ·~im . aWorksheet As wo.rksheet. f:ы.тDim'. FullFileNaш'e As String Г Pim CompanyName :As String .. ; companyName = "Software Cohceptions, FullFileNanie = .FullName · For Each aworksheet rп .Worksheets · · wi th aworksheet. Pagesetup 1·:·: : . Le.ftFooter = CompanyName I_"• • . CenterFooter = ,; " · i.· .RightFooter FullFil.eName · ~- . End With f , Next aWorksheet ~.: <E~d . with ' l~I,1.<;!_§~12:..... .. Inc" В отличие от модулей классов книг и· листов, процедуры обработки событий, добав­ ленные в собственные модули классов, не работают по умолчанию. Для этого придется создать экземпляр класса и присвоить объект Application свойству Арр созданного объекта. В стандартном модуле должен присутствовать следующий код: fi'U:ЬiTc~fheдi>J;JE:vёnis' д:s '.&ёwwA.J?'PE:vё'nfiii ··- -· ··~~ · ··~· ~uь· TrapApplicationEvents() j.. · Set theAppEvents. Арр = Application fJ?Rcl .• Si_b ·..., .~ После этого достаточно вызвать процедуру TrapApplicationEvents. В результате процедура обработки события WorkbookBeforePrint будет запускаться при каждом использовании команд Печать (Print) или Предварительный просмотр (Preview). _Про­ цедура будет запускаться до закрытия книги, содержащей процедуру обработки события. Существует возможность отключения перехвата событий приложения без завершения текущего сеанса. Любое действие, приводящее к сбросу переменных уровня модуля или открытых переменных, также приводит и к отключению обработки событий приложе­ ния, так как экземпляр класса также уничтожается. К сбросу переменных может привести редактирование кода в редакторе VBE или выполнение оператораЕnd в коде VBA. · В Excel 97 сущес~вовали редкие ошибки, приводящие к сбросу переменных. Можно · рреДn.олагать, что такие · ошибки существуют и в более · поздних версиях 'Ехсеl. Если обработка событий приложения должна работать для всех сеансов Excel, модуль класса и код стандартного модуля можно добавить в книгу Personal. xls, а процедуру TrapApplicationEvents вызывать из процедуры обработки события WorkЬook_Open. Код подпрограммы TrapApplicationEvents можно даже скопировать в процедуру WorkЬook_Open. При этом в стандартном модуле должно сохраняться объявление объект­ ной переменной theAppEvents с квалификатором доступа PuЬlic. Например, следующий код добавляется в раздел объявлений в стандартном модуле:
160 Главаб E>_i.1p~,ic ,. ~lieAppЁ;~Q;_(s~:·~.§.,}i~Jl AppEyeiitE>. · При этом в модуль ThisWorkbook можно добавить следующую процедуру обработки события: ГPiIVate SUb ''"'W"OY.kbO~O k_open: ()·~:~ ~~._.-· , Set theAppEvents : App Appl ication ~f;nq ?Yl:J. ·- ... . ~·~ ..•• Встроенные события диаграмм Если необходимо перехватывать события для встроенных в лист диаграмм, восполь­ зуйтесь способом, применяемым для перехвата событий приложения. Сначала необхо­ димо в проекте создать новый модуль класса (можно использовать тот же модуль класса, который применялся для перехвата событий приложения). В начало модуля класса необ­ ходимо вставить следующее определение: ipublЦ w~ tf}Even_t-s .:ac.P,ait" Лs .f:h-~r.f.~:~·· . · Создадим процедуру обработки события BeforeDouЬleClick, которая использова­ лась в главе 5. Модуль класса должен выглядеть следующим образом: PuЬlic WithEvents aChart As Chart . / . ;Private Sub aChart_BeforeDouЬleClick(ByVal ElementID ByVal Argl As Long, ByVal . Arg2 As Long, Canc:el As Dim theSeries As Series Select Case ElementID . Case xlLegend aChart.HasLegend = False Cancel = True Case xlChartArea . aChart.HasLegend True ·cancel = True Case xlSeries 'Argl является индексом последовательностей ' Arg2 является Индексом точек (-1 если выделена вся 'nоследователь1:1ость) Set theSeries = aChart. SeriesCollection (Argl.) If Arg2 = -1 Then · · With theSeries.Border . If .Colorindex = xlColorindexAutomatic Then .Colorindex 1 Else , Colorindex ( . co1orindex моd · .56) + i End If . End With Else With theseries.Points(Arg2) .н-;s.DataI.~bi=l = , Ncit . HasDataLabel End With End If Cancel = True EnQ. Select .End ~ub _
Модули классов 161 Этот код позволяет удалять легенду диаграммы с помощью двойного щелчка. Двой­ ной щелчок на области диаграммы приводит к появлению легенды. Если выполнить двойной щелчок на линии последовательности, она изменит цвет. Если выделить точку в последовательности и выполнить на точке двойной щелчок, возле точки появится или исчезнет метка данных. Предположим', диаграмма хранится в объекте ChartObj ect, который является един­ ственным объектом этого класса на листе Манго . При этом модуль класса называется ChartEvents. В стандартный модуль-необходимо добавить следующий код: fI>uьi:tc t:riёcliartЁvent.so/ 'li.s N'ew ·cьartЁvёni::~s '~" - ··· , > ; ' !sub Ini tia1i'ze~hart:Ev:ents () ' ·· S~t · the.ChartEvents; aChart , ~ . ThisWorkbook. Worksheets (''Манго") . ChartObjects (1) ,·c;ьart· ',J:<;f!:?, . сс•.=сс.""°"с'"'''''·" " " "··•- -• Полученная в результате диаграмма показана на рис. 6.3. Рис. 6.3. Перехват событий диаграммы После выполнения процдеры InitializeChartEvents двойной щелчок на после­ довательности, точке или легенде приводит к запуску процедуры обработки coбытияBe­ foreDouЬleClick. Коллекция элементов управления UserForm Если на форме находится несколько элементов управления одного типа, для каждого из них обычно создаются практиЧески идентичные процедуры обработки событий . На­ пример, если двойной щелчок на метке слева от поля ввода Te xtBox должен приводить
162 Главаб к очистке поля и установке на нем фокуса, потребуется создание четырех практически идентичных процедур обработки событий, по одной для каждого элемента управления, как показано на рис. 6.4 . Рис. 6.4 . Диалоговое окно с несколысими одинаковыми элемен­ тами управления Воспользовавшись модулем класса, можно создать единственную универсальную про­ цедуру обработки событий, которую можно использовать со всеми элементами управле­ ния Labe 'l (или с элементами управления, требующими обработки события). Для удоб­ ства элементы управления TextBox называются TextBoxBananas , TextBoxLyches, TextBoxangoes и TextBoxRamЬutan. Метки имеют соответствующие названия с ис­ пользованием префикса Label. Следующий код необходимо ввести в модуль класса ControlEvents: Объект Label объявляется с событиями как метка диалогового окна UserForm. Объ­ ект Form объявляется как диалоговое окно UserForm. Универсальная процедура обра­ ботки события для объекта Label называется DЫClick и использует функцию M:i,d для получения названия товара начиная с шестого символа в имени метки (после идентифи­ катора "Label ") . Имя объекта TextBox получается с помощью добавления префикса "TextBox " к названию продукта.
Модули классов 163 Структура Wi th. . . End Wi th идентифицирует объект TextBox, используя имя TextBox в качестве индекса в коллекции Coritrols диалогового окна UserForm. Свой­ ' ству Text объекта Техtвох присваивается строка нулевой длины и с помощью метода SetFocus курсор устанавливается в поле ввода. Следующий код вводится в модуль Класса диалогового oкнaUserForm: ;oj;ji:ion ::Exi:>HC:tt " · • ~,,.· , , ,·, , ' ;Dim •La:bels As .New Collection ,. ' . . ·. . ·- , " .' fPrivate . suь userForm_I~itialize ( J < Diin Control As MSForms.Control ~~; Din\ • aControlEvent As ControlEvents. ' For Each control Iд ме . .Controls If TypeOf Cohtrol Is MSForms.Label Set aControJ:Event = New . ControlEvent:;; Set aControlEvent. Label ·': ' Contro,l Set aControlEv.ent. Form . = Ме Cal:i Labels. Add (aCont.roЦ:vent) End.If , . . . Next· Control tEr;ig~; ?ЧP .~ ·"· . Labels - это новая коллекция, в которой хранятся объекты, созданные в модуле класса ControlEvents. В процедуре обработки события Ini tial i ze диалогового окна UserForm элементы управления меток связываются с экземплярами клaccaControlEvents. Цикл For Each . . . Next по очереди обрабатывает все элементы управления из диалогового окна. При обнаружении элемента управления , который является меткой (для определения типа элемента управления используется ключевое слово TypeOf) соз· да~тся новый экземпляр клaccaControlEvents и полученный экземпляр присваивается объектной переменной a:ControlEvent. Свойству Label созданного объекта присваи­ вается ссылка на элемент управления, а свойству Form - ссылка на диалоговое окно. По­ сле этого созданный объект добавляется в коллекциюLаЬеls. При загрузке в п·амять диалогового окна UserForm запускается процедура обработки события Initialize. После запуска процедура связывает метки с процедурой обработ· ки событий из модуля класса. Двойной щелчок на любой метке приводит к очистке со­ держимого поля ввода (элемент управления TextBox), которое находится справа от мет­ ки. После двойного щелчка на метке и очистки содержимого в поле ввода можно вводить новые данные . ~ Стоит обратить вниманне, что ряд.собь1тий, СВЯЗ~НН~IХ с некоч;р~;,;ди элементам11 уnрав­ ·ления', . не досту11~ы в . модуле класс·а .nри йсnоЛь.зованни операт(,ра .With '. Events. На:.. . . f1рймер, . самь1ми . полезными собьlтия~~ подей/ ввода •. на диаЛоrов'ых~ О}<Нах ui;;.erFoz::ffi яв- ; лsiют~Я BeforeUpdate, AfterUpdate, Enter и Exit. Ни одно иЗ: 'этих .событий не дос­ тупн·о в · модуле класса. Эти событиЯ можно обрабатывать только . в модуле клас<;а ; свя- занном. С .дио/1ОГОВЫМ ОКНОМ U,s er~ orm. . ' . Ссылки на классы из других проектов Если макрос необходимо использовать в другой книге , выберите пункт Toolsi:::> References (Сервис<=>Ссылки) в окне редактора VВЕ и создайте ссылку на проект VВА, связанный с другой книгой. Ссылка отображается как специальный объект в окне Project Explorer (Окно проекта) (рис. 6.5) .
164 Главаб {+; ClassSProject (C lass5.)C ls) !~> 8§. ClassбProject (d"ssб.wls) ~;~ ·@"j Мicroюft Excel OЬjects : t) S~tl (Sheet2) ' ··:iJ ThisWoekЬj:юk ;~;. r;rя Мodules · ·~-! · . ~.........,. i~i ·itl References function Pa~=iU~erforml () A:s U:5erform1 Set Pa:s:sU:serforml • Nev U:5erfarm1! End f"unctio n ! 3 I..'..L_j • Рис. 6.5. Ссьи~ка в 01СНе Project Explorer В проекте Classб. xls присутствует ссылка на проект Class5. xls. В проекте Cl ass5. x l s присутствует диалоговое окно UserForm из предыдущего примера. Ссылка позволяет запускать в стандартных модулях книги Classб. xls процедуры из стандарт­ ных модулей книги Classs ·. xls . При этом ссылка не дает возможности создавать экзем­ пляры классов или диалоговых окон UserForm из книги, на которую указывает ссылка. 'Прн с6зда~ии ссылки l;!a Другую книгу н~об~оди;,..о убедиться, что, проект VВА в6интер~­ ' суюЩей книге имее~ :у!'iИкатiь!-!ое имя: По умолL1анию лроект , называется VВ,AProj ect: ~Выберi:1.те;:~ун~т Tools~eVBf.Proj~ct ~rop~rties ·.(S:ервис':?Свойства .проекта) и · введите но~ , ~~ ....: .;;;'- ;>', k~ ;;;'. < Для обхода ограничения на использование д.иалоговых окон UserForm и классов из целевой книги в ней можно создать функцию, которая возвращает ссылку на диалоговое окно. Пример такой функции ·показан в правой нижней части последнего снимка экрана. Функция PassUserForml из книги Class5. xls возвращает новый экземпляр класса UserForml в качестве собственного значения . В книге Classб. xls переменная Form объявляется как имеющая универсальный тип Obj ect. Процедура ShoUserForm при­ сваив~ет возвращаемое значение функ9ии PassUserForml переменной Form. После этого переменную Form можно использовать для вывода диалогового окна Us erForm и получения доступа к элементам управления . При · этом диалоговое окно может быть скрыто, но не должно выгружаться из памяти .
Модули классов 165 Резюме Модули классов применяются для создания схем новых объектов. В качестве примера такой схемы в этой главе использовался класс Employee. О Функции и подпрограммы в модуле класса применялись для определения методов объекта. О Открытые переменные использовались для определения свойств объекта. О Если требуется программное управление значениями свойств, свойство можно определить с помощью процедуры Property Let. О Кроме этого, процедуры Property Get позволяют управлять доступом к значе­ ниям свойств. Для использования кода из модуля класса необходимо создать один или несколько эк­ земпляров класса. Например, можно создать объекты Paul и Bill, которые являются экземплярами класса Employee. Можно создать собств енную коллекцию, позволяющую хранить объекты в едином хранилище. В Excel VВА модули классов используются не так широко, как в отдельном языке про­ граммирования Visual Basic. Это связано с тем, что Excel и так предоставляет достаточ­ ное количество объектов, доступных для разработчиков. При этом разработчики прило­ жений для Excel могут использовать модули классов для решения таких задач: О обработка событий уровня приложения, например WorkbookBeforePrint, ко­ торое позволяет управлять печатью всех открытых книг; О обработка событий для встроенных диаграмм; О создание единственной процедуры обработки событий, которая может использо­ ваться несколькими экземплярами определенного класса, например элементами управления TextBox на диалоговом окне UserForm; О инкапсуляция сложного кода и упрощение его применения; О инкапсуляция кода для повторного использования; О дифференцирование проектов и пользователей. Дополнительная информация об инкапсуляции кодаАРI приводится в главе 16.
Создание надежного кода Надежный код можно сравнить с Суперменом и бронежилетом. Супермен неуязвим (если рядом нет криптонита) . Бронежилет также делает владельца неуязвимым, пока кто­ то не воспользуется брЬнебойными пулями (или, что интересно, композитным луком). Иногда неуязвимость рассматривается как что-то нереальное и невозможное, а иногда неуязвимость вполне возможна, но с определенными ограничениями. Существующая технология не позволяет создавать алгоритмы, которые математиче­ ски доказывают эффективность приложения, поэтому невозможно доказать, что оно со­ вершенно лишено ошибок или неуязвимо. Все считают, что Супермен сделан из стали и непобедим, а представители силовых структур просто носят бронежилеты. Разработ­ чики также применяют средства защиты при создании кода приложений. В этой главе рассматриваются методики, обеспечивающие жизнеспособность приложения и позво­ ляющие защитить его от аварийного завершения работы, удаления файлов или более нежелательных вариантов поведения. Если что-то по'йдет не так, можно будет воспользо­ ваться описанными здесь приемами диагностики и решения проблемы. Кроме этого, описанные подходы являются переносимыми и могут применяться при создании раз­ личных приложений. Обсуждение основано на проверенной десятилетиями стратегии создания защищен­ ного кода с помощью инструментов , предоставленных интерпретатором VВА. Здесь рас­ сматриваются способы обнаружения неоправдавшихся предположений и методика кон­ троля за порядком передачи управления в пределах кода, что позволяет оставлять "хлебные крошки" и проверять каждый путь, ветвление и цикл кода. В результате приме­ нения этих методик остается меньше потенциальных проблем . Если проблемы все же . возникают , разработчик может воспользоваться доступной информацией для их быстрой диагностики и решения.
168 Глава 7 Использование метода Debug.Print Объект Debug предоставляет несколько методов. Краеугольным камнем фундамента инструментов отладки и тестирования является метод Debug . Print. Еще один метод, Debug. Assert, будет рассматриваться в следующем разделе. Debug. Pr i nt - очень простой м е тод. Он принимает строку с сообщением и отправ · ляет сообщение в окно lm med iate (Проверка). Кроме этого, метод Debug. Print выпол­ няет свою задачу только при запуске кода в режиме отладки (в редакторе VВЕ), что дела· ет его идеальным инструментом для отслеживания реального текущего состояния кода, а не предполагаемого . Как в свое время сказал Рональд Рейган: "Доверяй, но проверяй". Мы, как разумные программисты, верим, что код будет выполняться в том порядке, который и.мел в виду программист, но на самом деле код всегда выполняется в том порядке, который был запи­ сан программистом . Метод Debug . Print позволяет точно узнать , как выполняется код. Создадим инструментарий отладки , воспользовавшись в качестве основы методом Debug. Print. Вызовы Debug. Print можно вставлять в любой метод или свойство, на­ пример : . i~~J2g~г:.Р1,'~КtЗ~'-ЩJj'Яnу:·маЖно ·:ii,e .·с:н.11Ма. т ь··· .:= · Более полезным использованием метода является вывод имен объекта и метода, а также текста с полезной информацией о состоянии до и после выполнения интересую­ щего оператора. Вот метод, который определен в условном листе Sheetl и использует вызов Debug. Print: [~i,i)5II"c- ··FunёEioiica.I cuiateFi.i ~ 1c6nsiii!\eaJвyvaI· ' л· В?'Vа..~ GallonsPerHoui;- As DouЬle) . As ро~Ые ·;~.<' Debug. J?rint "Воwли в . sheetl. CalculateFuE?1cons~pE?d'' ~·' .' '' •. c:i<::uiatePцelCons~med = Duration * GallonsPerHoщ (•; Debug, Print " В)>rходим 11.з Sheet1 . Cal cula teFu~l Consumped, Ca-lcuiateF~e:J.CoP:sumed _ галлонов" "' \"" Предыдущий метод вычисляет объем топлива, которое потребляется за время работы продукта, а также объем топлива, потребляемого за один час. Вызов Debug. Print ис­ пользуется для создания вывода в окне lmmediate (Проверка) , показанного на рис. 7.1 . Вошли 5 Shee:tl. Calc::ul a tefue1Con5umption · Выхо.пии И'-' Sheet 1. Ca lcula teFue 1Con5 umpt ion, re5Ult • 10. 5 галлоно5 Рис. 7.1 . Результат работы метода Debug.Print в окне Проверка ] ~ . Помните, что объект Debug работает только в редакторе VВЕ. В результате отладоч ­ ный код можно не удалять, так как пользователи все равно не узнают о его существова­ нии. Преимуществом такого подхода является наличие доступности кода при возникно­ вении любой проблемы . При этом разработчики избавляются от необходимости добав­ лять и удалять код между циклами отладки и сопровождения . Метод Debug. Print еще будет рассмотрен в разделе "Отслеживание ошибок".
Создание надежного кода 169 Использование метода Debug.Assert Еще одним методом объекта Debug является метод Assert. Этот метод высrупает в ро­ ли наемного стрелка на стороне программиста и предназначен для остановки выполнения кода в среде разработки, если поставленное методомАssеrt условие не выполняется. При создании кода программисты строят явные и неявные предположения о состоя­ нии приложения на определенных этапах. Примером явного предположения является проверка существования файла перед его открытием для чтения. Неявным предположе­ нием является неповрежденность дискового кластера, в котором хранится необходимый файл. В любом случае, программист знает о явных и неявных предположениях только при создании кода и появлении "наглой морды" неявного предположения. Если предпо­ лагается, что что -то плохое может произойти, лучше сразу нанять стрелка, который будет патрулировать окрестности. Метод Debug. Assert является лучшим стрелком, нанятым программистом на Excel VBA. При создании каждого метода желательно добавить условный код, проверяющий соот­ ветствие некоторых независимых параметров преполагаемым условиям. Например, деле­ ние на О возникать не должно. Поэтому при выполнении деления желательно убедиться, что делитель не равен О. Но так как деление на О никогда не должно происходнть, жела­ тельно проинструктировать стрелка о существовании этого предположения. Помните, что объект Debug является инструментом программиста. Метод Debug .Assert завершит ра­ боту приложения, если условие не будет выполняться, но объект создается только при за­ пуске кода в редакторе VВЕ в процессе отладки. По этой причине объект Debug никогда не станет полноценной заменой нормальным проверкам:. Он просто, с точки зр~ния програм­ миста, дополняет проверю~. В отличие от вызова методаDеЬug . Assert условие If не ос­ тановит работу приложения, если условие не выполняется. Следовательно, условный опе­ ратор I f может защитить код от взрыва, а объект Debug сообщает о возможности взрыва во время отvrадки. В комбинации эти инструменты позволят получить более мощны~ средства отладки, как показано в следующем фрагменте кода: РuБНс sub~ D:i.vl.deвyzero (iз:Yva1 Numerato~r .As ~I5oilble, "".." .., ByVal Denominator As Double) Dim result As DouЫe Debug.Assert Denominator <> О If (Denominator <> 0) Then . result = Numerator / Denomirfator ' Else .• ' . сделать что-то другое . End н Enq .S _uJ?. , ... .. ·--~";.k .... Если предположение оказывается неверным в редакторе VBE, то выполнение остано­ вится на строке Debug .Assert Denominator <> . О. Программист сразу поймет, что потребитель (программист , который воспользовался методом DivideByZero) нарушил необходимое условие и присвоил пapaмeтpyDenominator значение О (рис. 7.2) . В следующем разделе будет показано , как использовать методы Debug. Print и Debug. Assert для создания инструментария многоразового использования, чтобы получить защищенный код. Если время _на чт~ние ограничено, можно пропустить разде­ лы "Краткая история отладки на ПК" и сразу переходить к разделу "Создание многоразо­ вых инструментов на основе объекта Debug" .
170 Глава 7 Краткая история отладки на ПК История очень важна, так как позволяет охватить проблему в более широкой пер­ спективе . Инте ресно , но история микрокомпьютеров насчи'тывает не более 20 лет. (Первый компьютер IBM РС поступил в продажу в августе 1981 года. ) Таким образом, работавшие в 1981 году программисты являются живыми свидетелями сжатой истории микрокомпьютеров . -~~~~ 1..... ~~.Y.~.~~~-~~l~~I.~~---·· C?iSpki~ ir';j hl:Tol~ft ~ F<!ilse &;~·~Ac:it~ii~ ··· ·· : F~i~~···" En~c~iCu~tiO~·· rr~u~··:·· · · ~-~~~:t~~·:J~:~;·.·.·.····· Na me ~; ~1д;·~~·· ···" ~~~~~~ь У.~~~---· D1m re:sul t Л:s DouЫe Debu.g ,A:s:sert Denom1nator <> О It (Denomi nstor <> 0) Then re:s u l t • Nume re.t.or / Denomine. tor El ~e ' сде.r.ать Ч'!'О-'t'О другое End If End SuЬ Рис. 7.2 . Остано1J1Са приложения при неподтвердившемся предположении Примерно в то время Тим Патерсон (Tim Patei-son) продал собственную дисковую операционную систему Биллу Гейтсу за $25000. Впоследствии она стала называться MS-DOS . Персональный компьютер работает под управлением комбинации из дисковой операционной системы и программы BIOS (система базового ввода-вывода). Эти два компонента предоставляют базовые строительные блоки , позволяющие компьютеру ра­ ботать , а программистам - создавать программы. Программа BIOS обеспечивает работу прерываний, которые представляют собой глобальные функции, загружаемые вместе с базовой подсистемой ввода-вывода во время включения компьютера . Эти функции существуют до сих пор под покровом нескольких слоев сложного кода Windows. Прерывания имеют номера О, 1, 2, 3 и т.д. Можно предпо­ ложить, что прерывания с меньшими номерами появились раньше, а прерывания с большими номерами появились позже, вместе с появлением дополнительных возмож­ ностей. Например, прерывание DOS имеет номер Ох21 (обычно для нумераци,и преры­ ваний используются шестнадцатеричные числа; данное прерывание имеет десятичный номер 33). Учитывая предположение о первоочередном появлении прерываний с мень­ шими номерами, не удивительно, что прерывание с номером О соответствует ошибке де-
Создание надежного кода 171 ления на ноль. Деление является важной операцией для программистов, а деление на О, похоже, было значительной проблемой, если оно обрабатывается одной из самых базо· вых системных служб. Назначение прерываний 1и2 мало кого интересуе.т. Прерывание 3 оказывается более важны)\! с точки зрения текущего обсуждениЯ, так как это прерывание отладки . Оно оста· навливает выполнение программы. Скорее всего, именно это прерывание лежит в осно· ве оператора S t op в языке VВА и точек останова в редакторе VВЕ . (В более ранних вер· сиях отладочных инструментов прерывание 3 называлось "soft-ice"; то есть, вызов этого прерывания приводил к "замораживанию" программы.) Все эти базовые возможности до сих пор существуют и используются компьютером для выполнения поставленных ранее задач, хотя над этими прерываниями и создан большой объем кода. Убедиться в существовании этих возможностей можно с помощью команды debu g. ехе в приглашении командной строки. Для этого можно написать про· стой машинный код. (Будьте осторожны, так как базовые возможности обладают боль· шой мощностью.) Руководствуясь рис. 7.3, введите следующие отладочные инструкции и код ассемблера. В результате будет создана программа на языке ассемблера. (Этот пример является хоро· шим напоминанием о том, насколько более удобным инструментом является язык VВА.) ' ' CommandPrompl • debug , ,· '. »\ 11.: \!leJEJ Рис. 7.3. Ввод про граммы в отладчике d ebug. exe
172 Глава 7 Ниже по порядку приводятся инструкции и код . О Запустите программу Debug. Для этого в приглашении командной строки введите команду debug. ехе . Это очень простой отладчик и редактор, который иногда может оказаться очень мощным . О Введите nhello.com. Эта инструкция сообщает редактору debug. ехе имя фай­ ла, в который необходимо записывать вывод. О Введите alOO. Это инструкция языка ассемблера. Она сообщает редактору, что начинается ввод кода. О Введите jmp 110 . Эта команда является аналогом нашего хорошего друга - ко­ манды GO TO на языке ассемблера. О Команда dЬ "Hello, Word ! $" используется для объявления строковой пере­ менной. О Команда mov dx, 102 заносит значение 102 (шестнадцатеричное значение) в ре­ гистр DX центрального процессора. Регистры являются аналогами переменных на самом нижнем уровне. Вообще это переключатели внутри микропроцессора, кото­ рые используются миллион раз в секунду . На этом этапе в регистр DX заносится адрес текстовой строки. О Команда mov ah, 9 в данном контексте является функцией . В целом эти команды используются для подготовки вызова функции, аргументом которой является строка " Hello, Word! " (символ$ является си'мволом окончания строки), а 9 яв­ ляется номером функции. О Команда int З выполяет функцию точки останова . Код будет выполняться до команды int 3, после чего выполнение будет приостановлено, и выдано текущее состояние процессора. (Текущее состояние показано на рис. 7.3.) О Команда int 21 является прерыванием DOS. Прерывание 21 и функция 9 ис­ пользуются для вывода строк. О Вызов прерывания i:r,i.t 20 приводит к завершению работы программы. Он сооб­ щает процессору о необходимости передать управление операционной системе . О Пустая строка введена намеренно. Ввод пустой строки возвращает редактор из ре­ жима программирования в режим управления. О Команда rcx является инструкцией отладчика, позволяющей вывести и отредак­ тировать значение· регистра СХ, который используется, чтобы сообщить отладчи­ ку количество записываемых байт. О la является шестнадцатеричным ~шслом (в десятичной форме 26). Отладчик должен записать 26 байт ассемблерного кода. О Команда w является инструкцией на запись. О Команда g является аналогом клавиши <F5> в среде разработки VBA. Эта команда приводит к выполнению программы в режиме отладчика . О Команда q приводит к выходу из программы. Введите q и нажмите клавишу <Enter>. Работа утилиты debug. ехе завершится .
Создание надежного кода 173 После завершения работы утилиты будет создана программа hel lo. сот . Файл будет храниться во временном каталоге или в каталоге, который был указан в начале работы программы. Введите Hello в приглашении командной строки. Обратите внимание на выведенный текст Hello World!. После этого программа возвращает управление ин­ терпретатору командной строки . Кроме этого, обратите внимание на то, что точка оста­ нова была проигнорирована. Не кажется ли знакомым это поведение? Да, верно . Оно ха­ рактерно для объекта Debug, который создается только при отладке в редакторе VВЕ. За пределами редактора VBE вызовы методов объекта Debug игнорируются . Можно счи­ тать, что принципы отладки были показаны до самого нижнего, аппаратного, уровня. (Ниже только физические механизмы в кристалле процессора, но рассматривать их бу­ дет лишним . ) Теперь понятно , почему деление на ноль и точки останова были так важны для ранних программистов . Кроме этого, ясно, что эти возможности все еще использу­ ются в компьютере, хотя они и скрыты за более удобными средами вроде VВЕ. Создание многоразовых инструментов на основе объекта Debug Одной Из любимых авторами книг по программированию является No Bugs! Дейва Тилена (Dave Thielen), которая выпущена издательством Addison-Wesley. Книга для про­ граммистов на С была написана после успешного выхода операционной системы MS-DOS 5.0 . Хотя С является языком более низкого уровня по сравнению с VВА, большинство приемов отладки основаны на тех же принципах , поэтому данные приемы можно ис­ пользовать в VВА вместе с объектом Debug. Важно~ть этих подходов связана с тем, что они работают всегда и их работоспособность проверена временем . В этом разделе рассматривается три мощных управляемых инструмента, которые по­ зволяют систематически исправлять ошибки и быть уверенными, что обнаруженные ошибки исправлены . Если что-то пойдет не так, эти инструменты обнаружат и исправят проблему немедленно. Они называются Trace, Trap и Assert. Как компания Microsoft создала объект Debug и оператор Stop поверх базовых возможностей BIOS (как показа: но в разделе "Краткая история отладки на ПК"), так и мы создадим нашу реализацию по­ верх объекта Debug и оператора Stop. Определение последовательности выполнения Определение последовательности обеспечивается размещением строк кода, сооб­ щающих информацию о маршруте и состоянии кода в определенный момент. Эта ин­ формация может оказаться настолько полезной в процессе отладки, что многие инстру­ менты разработчика автоматически отслеживают выполнение кода, создавая стек вызо­ вов (определяя последовательность вызова методов) и показывая последовательность выполнения . Для определения последовательности выполнения в VВА может использо­ ваться метод Debug . Print, но автоматическое отслеживание порядка вызова методов при этом не поддерживается . Это придется делать вручную. Можно создать собственную версию подпрограммы Trace и описать интересующую информацию, получая одинако­ вый по форме вывод при каждом использовании этого инструмента . Вот метод Trace, реализованный в экспортируемом модуле DebugTools. vb.
174 Глава 7 optioii"Ex:PJ.Icit., ·-- ~~:-- · #const Tracing = · True #Const UseEventLog = Fa1se Private Sub DebugPrint(ByVal Source .As String, _ ByVal Messag~ As String) )If UseEventLogтhen у ' #Else Debug.Print " Источн.ик: " & Source & " Сообщени.е: '' & Иessage #Endlf Enci Sub PuЬlic .Sub Trace (ByVal Sourc.e As St·ring, 1 ByVal Message As String) :#If Tracing Then Call DebugPrint(Source, Message) '#End If , . . ..?~о su_ь В предыдущем фрагменте кода была определена константа компилятора: Tracing. Метод DebugPrint является универсальным методом, который · принимает в качестве параметров две строки. Параметры называются Source и Message. Обратите внимание на закш1ментированную часть кода, в которой константа UserEventLog управляет вы­ зовом метода Debug. Print. (К условию, зависящему от константы UserEventLog, воз­ вратимся в разделе "Запись в журнал событий" далее в этой главе . ) Последний метод, Trace, принимает те же два аргумента: Source и Message. Метод Trace проверяет значение константы отладчика . Если константа равна True, вызывается процедура DebugPrint. Можно спросить: зачем использовать константы компилятора и заворачивать вызов метода Debug. Print, если объект Debug автоматически отключается при запуске кода за пределами VВЕ? Хороший вопрос. Программирование очень похоже на выращивание лука изнутри. Программирование начинается с ядра, например базовой подсистемы ввода-вывода компьютера. Постепен­ но слои накладываются поверх существующих уровней, медленно, но уверенно добавляя сложности. (Сложность может оказаться субъективным параметром.) Эти уровни долж­ ны быть небольшими, простыми для тестирования и предоставлять необходимый уро­ вень функциональности, которая не должна быть сложной или большой по объему. При­ чиной постепенного добавления функциональности является попытка снизить слож­ ность реализации изменений и минимизация вероятности появления дополнительных дефектов . Кроме этого, простота позволяет легко оценить полезность вносимых измене­ ний . Другими словами, большие объемы кода (большие монолитные реализации) явля­ ются причиной головных болей в будущем. Однозначное поведение, ·построенное поверх более простого однозначного поведения, как ламинированное дерево, позволяет построить мощные и полезные реализации, кото­ рые сохраняют простоту на каждом уровне. Именно так выглядит хороший, полезный, поддающийся отладке и защищенный код. К сожалению, эта особенность программирова­ ния не рассматривается в институтах и университетах. (Просим извинения у тех, чье учеб­ ное заведение было исключением.) Это связано с тем, что данная отрасль все· еще молода
Создание надежного кода 175 и не все еще приняли правильное решение по этому вопросу. (Стоит обратить внимание, что большинство успешных специалистов в данной области все-таки используют ту или иную аналогию со слоями лука.) Создание многоуровневого, однозначного кода требует оп­ ределенной предварительной практики, но именно для этого написана данная книга. Помня о необходимости создания сложных систем в виде нескольких простых уров­ ней следует создать простой метод Trace. Метод принимает два строковых параметра . Кроме этого, метод предоставляет отдельную возможность включения и отключения от­ ладки. На основе поведения редактора VВЕ определение отслеживания вызовов было расширено до использования .другого хранилища. Вместо ведения журнала в окне lmmediate (Проверка) был добавлен код для записи журнала в более постоянное храни­ лище, в журнал событий. После этого необходимо научиться использовать новое поведе­ ние метода Trace. Программист должен выбрать отслеживаемые параметры приложения. Можно от­ слеживать все параметры, но это слишком утомительно. Вместо этого необходимо доба­ вить вызовы Trace в тех местах, которые особенно важны для реализации, а также в местах, где возникают ошибки. После добавления вызова Trace его можно оставить даже после исправления всех ошибок. При внесении изменений в код могут появиться новые ошибки, но отладочный код уже будет присутствовать в ключевых местах. Одним из преимуществ вызова Trace является обозначение фрагментов кода, которые интере­ совали разработчиков в прошлом. То есть, вызов Trace выступает в качестве "хлебных крошек", которые разработчики оставляют для того, чтобы вернуться обратно, если воз­ никнет необходимость. Вот метод CalculateFuelConsumed из предыдущей главы. Вы­ зовы метода DebugPrint заменены на вызовы Trace: , 'Pi.i'Бi"ic Ftinctiop caiёufateFu e iconsumed ~(ByVal f.Jurat{on-~s Ьоi..!ЬГе, ·-._-~= ":'' . ByVal Gall~nsPerHour As DouЬle) As DouI?le Call Trace.( -" Sheet1. CalculateFuelConsumped", "длительность=" & Duration & " Галлонов в час -" & ·~ GallonsPerHour) CalculateFuelConsumed = Duration * G.allonsPerHour . cai'l Trace ( "Sheetl. CalculateFuelConsumped"' . "Результат=" & 11:< CalculateFuelConsumed) · Конечным результатом являJртся одинаковые вызовы Trace и одинаковые правиль­ но отформатированные сообщения. На рис. 7.4 показано окно lmmediate (Проверка) по­ сле вызова метода CalculateFuelConsumed. lmmemate @ Источми~: Sheetl. Calculat.eFue lCon~urnption Сообwение: Duration•l . s Gal . " Источниl'i.: Sheetl. CalculateFuelCon~W'rlption Сообwение : Result•lO. 5 1 Рш:. 7.4 . Результат использования метода Trace
176 Глава 7 Получение маршрута выполнения кода Следующий метод называется перехватом. Необходимо проверять все маршруты, по которым может выполняться код - условия I f и Else, все методы и свойства, циклы Wh ile, тело которых выполняется и не выполняется. Если этого не сделать, то нельзя быть уверенным, что непроверенный маршрут не приведет к опасному поведению приложения . Идиома T rap используется для отметки веток кода, чтобы обеспечить тестом каждый закоулок кода и получить ожидаемый и необходимый результат . Идиома Trap находится уровнем выше оператора Stop и, как и метод Trace, помещается в оболочку для получе ­ ния дополнительной гибкости . .Вот код реализации идиомы Trap, который можно доба­ вить в модуль DebugTools. После этого будет показано , как создавать ловушки: ~p-p t::t'Oп ·· E: :XJ?Y:i:cit , #Const · Tr;;;_cing ; ' тrue 1#const DeJ;н.tggipg =· True !#c.ons "t UseEventLog , = False Sub .. DepugP:i;-int (ByVal Source As String, Mes5age ' A9 ; string) Theh В подпрограмме Trap используется константа Debugging и метод DebugPrint, уже применяемый ранее . Не будем еще раз описывать назначение этих элементов . Рассмот­ рим особенности метода T rap . В методе Trap используются те же два аргумента, что и в методе Trace. Это Sour ce и Message. Они нужны для идентификации сработавшей ловушки и для поиска соответ­ ствующего вызова метода T rap . При срабатывании ловушки источник срабатывания и сообщения заносятся в журнал , а работа приложения завершается (рис. 7 .5).
Создание надежного кода 177 Option Explicit #Con:it Tracinq • Тrце #Conзt Debuqqinq • True #Conэt UэetventLoq = True PuЫic SuЬ Tre.p (ByVal Source As String, ByVal Иезэаgе Аз Si:ring) #It Debugging The:n Call DebugPrint (Source, Иеззаgе ) Q §·to.e . -~~-~ОС'!~.... #End It Private SuЬ DebugPrint (ByVe.l Source Аэ String, ByVal H@!l!ISgo!! 1.э String) , :...~ ' ... ·-·- ·- .." Рис. 7.5. Останоика приложения при срабатывании ловушки После срабатывания ловушки значение параметра Source можно использовать для по­ иска и комментирования сработавшего вызова. Комментирование конкретного вызова ме­ тода Trap указывает, что данный М:аршруг выполнения кода был протестирован и можно переходить к тестироваНию других веток кода. При этом закомментированный вызов мето­ да Trap остается внугри кода на случай, если тестирование придется повторить . Напри- · мер, для проверки существования нового теста для метода CalculateFuelConsumed в этот метод можно добавить вызов метода Trap. Вот как будет выглядеть модифициро­ ванная версия метода CalculateFuelConsumed: .'Pu:Ьlic~·FuncHoii ca.' 1cuiate'FueJ.consumedTByva1 ЬUration As Doub1e ; · .:.::· ByVal GallonsPerHour As DouЬle} As DouЫe f Call тrap("Sheetl.CalculateFuelConsumed", "Tested" }. t . :. . ·Call Trace ( "Sheetl. CalculateF.ueicons1.lmed", _ . "длительность= " & Duratiori & · " Галлонов в час ~ Gailoцs.PerHour} ' - "& 1 " Calcula.teFuelConsumed - = Dur~tion * GallonsPerHour Call Trace ( "Sheetl. CalculateFuelConsumed ,; , ")?езуль.тат=" & ·~ Cali::ulateFuelCcinsumed) . :вщi Function · " "-'-'-'"·•~~-- .. , _ . ., ,;, ,;_ ,. ,. у,"....,;;;,,;,,~·. - •~':l':--"'"'"··"'"""'~.N?.•o•MoOo;~·· ·'~-"'•A'"'~~ ·"---~""'-"-~«<~."""'-9.~~-.:.,;;;.,;.~4/< .. ·..·.М;.-.д. ·~;'.М . . <;'>;: ... N•• _"~~""•V · • "1 ~.! ! После создания теста для метода CalculateFuelConsumed оператор вызова метода Trap можно закомментировать. Чистоплотные разработчики могуг не согласиться со смешиванием отладочного кода и кода, выполняющего поставленную перед приложением задачу. В таком случае лучше принять стратегию разделения между реальным и отладочным кодом. Здесь будет ис­ -пользоваться стратегия создания закрытого теневого метода с префиксом Do. Реальный код добавляется в метод с префиксом Do, а в методе с обычным именем будет находиться
178 Глава 7 отладочный код. В результате выполнение алгоритма будет происходить отдельно от функциональности бронежилета - отслеживания, перехвата и кода проверки предполо· жений. Вот исправленный вариант кода: ;Pubiic Function· caicuiateFueic6nsumed.(ByVai ·. ByVal GallonsPerHour As DouЬle) As D,ouЫe ' Call Trap ( "Sheetl. Calculat:'eFuelConsumed", " Tested") ·c all Trace { "Sheetl . CalculateFuelConsumed", " Длительность=" & Duration ' & . " . Галлонов в час - " & .~ GallonsPerHour) ' ·· · CalculateFuelConsumed - D0Calcu·1ateFuelConsurned '(Duration, .FuelConsurn,:dPerhour) Call Trace { "Sheetl. CalculateFue1C.onsumed", "Резуль тат" - " & ·~ CalculateFuelConsumed) · li ' ., , End Function · Private Function DoCalculateFuelConsumed(ByVal ByVal GallonsPerHour As DouЫeJ As Doubie · DoCalculateFuelConsumed .EJ1d,, p;unftio11.. ·--'·-"""''"' Неи'скушенный наблюдатель может решить, что дополнительный код выглядит неук· люже. Так и есть. Но тут, как и в случае с бронежилетом, стоит обеспечить максимальную, дополнительную защиту. В итоге подобная структура кода продемонстрирует профес­ сиональный подход к решению задачи. После завершения создания отладочного инстру· ментария DebugTools можно рассчитывать на формирование привычки. А сформиро· ванная привычка значительно упростит написание такого кода. Ее.Ли вам повезло рабо­ тать с программистами различного уровня, то вы можете создавать реализацию фактиче· ского поведения, а младший программист может заворачивать его в оболочку отладочного и тестового кода. Кроме этого, средства отладки могут быть интегрированы в код при появлении проблем. Проверка инвариантных условий Наконец пришло время рассмотреть метод проверки предположений . Так получи· лось, что нам нравятся полицейские, но если кого-то беспокоит аналогия~ органами ох­ раны правопорядка, помните, что программирование можно представить как инструкти­ рование компьютера и определение границ контроля над выполнением. Без открытых и закрытых методов не было бы методов защиты дан'ных. Без приемов отладки не было бы способов решения проблем. Поэтому программист, как пqлицейский на параде, ста· рается предотвращать проблемы и следить за правильной работой кода. Предположение является - обученным, одетым в бронежилет и форму, полицейским офицером . При создании кода программист делает базовые предположения о состоянии и поведениИ кода. Поведение Assert позволяет обеспечить сохранение истинности предположений. РеЗультат похож на утопию, где нет вождения в нетрезвом виде, нецен­ зурной брани и хулиганских выходок.
Создание надежного кода 179 Метод Assert стоит использовать в тех местах кода , где предположения всегда должны быть истинными. Для сохранения однородности заключите метод Assert в оболочку DebugTools. Это позволит определиться с ожиданиями и обнаружить места, где ожидания не оправдываются. Вот пример кода: ;;I>u:п1Tc':.}3iiJ:5 ~ A.ssf;rГ(13Vva1 ·те-зг.А~· . в§OI~an:· , , .• ,BYY~l . So~rce!° As String, · ByV';iJ 11essage As ~# Тf rieьuggifig. . тhen J!. ~. If (Not Test) Then . . . . ~> . Call' beJ;>μgEr.i!)t(Sour~e '/ : мessage) '·· Debug. As:Sert Fa,lse · • ·,. ЕшiIf . . . . ~ If. Метод Assert использует константу Debugging, которая определена ранее в этой главе, и метод DebugPrint . Метод Assert принимает параметр типа вoolean и еще два параметра: Source и Message. Сначала необходимо убедиться, что приложение ра­ ботает в режиме отладки. После этого проверить истинность или ложность предположе­ ний. Если предположение не оправдалось, в журнал записывается сообщение и вызыва­ ется базовый метод As s ert, который приводит к остановке работы приложения. Теперь рассмотрим проверку предположений в методе CalculateFuelConsumed. В данном случае необходимо убедиться, что параметры GallonsPerHour и Duration имеют не­ отрицательные значения. (В метод Do также добавлены условные операторы.) fJ:>u.:ь11c::·F:unёti on ""ca1ctifat~Fuefcon~umed. Cв'Yva'.l:""Du ra tioii ' A.s~ i;>ouЬ ie~~ , i ByVal Gal lonsPerHour As Douьle) As DouЫe · " ~ ' ' t 'Call Trap ( "~heetl. CalculateFuelConsUil\PЧo.n", . "Tested") ' саЦ "J;'race("Sheet.1.CalculateFuelConsuпied';>, _ · "Дл и тельность - " & Duratioh. & " · галлонов вчас-" & "Gal1onsPerHou:r:') ' i Call Assert (Duration > О, ~ "D'uration > О") "She~tl .·Calculq,teFи"elConstim~d", Cal·l Assert (Gallon,sPerHour ~ . ·~ GallbnsPerHour .> О;,) 1i" CalculateFuelConsumed :F\.ieldonsumedPerhour) DocaiculateFuelCorisumed (Duration', "' ' ,.. . . - ·, 1• . Cali • тrасе '< "Sheetl': ca·lculateFuelConsumption", '.~. C;,_l'bulat~FuelCoщ;~ed) . . . . . . ·. ; . ;'· J.. •... . . ·. .. . tEnd .function , . . . ,Pri:v:ate Function DoCalcu:LateFuelConsumed (ByVal f ByVal GallonsPerHour A.s D ouЫ~) As Douьle \j "Резул:ьтат Duration i .. · If (Duration :> · О And GallonsPerHour :> , 0) Then i ·DoCalcul'ateFuelConsUтed ·:= Duration .... GallonsPerHour 1· Еl~е;десь вьщается сообще~ие об ошибке f.· End If li ~по . Fl,l i;i,ct;io,;;;;д".___" .,,_ _, . . _ __ __ _~_.. ..._ __ ....,.. .,..,., _ _ _~~ _.._~..,.~. ...""-""""""''~·""'""'
180 Глава 7 В модифицированном примере добавлены два вызова мeтoдaAssert. Первый вы­ зов сравнивает значение параметра Du r at i on с О. Обратите внимание, что в методе · DoCalculateFuelConsumed добавлена проверка времени выполнения. В результате метод стал самодокументированным, имя описывает назначение, а известные меха­ низмы тестирования делают метод достаточно защищенным. Вызов метода Trap до­ бавлен для напоминания о необходимости тестирования . Глобальный поиск метода Trap позволяет найти незакомментированные вызовы и обнаружить непротестиро ­ ванные методы. Здесь используется два оператора Trace, которые показывают, где и в каком порядке используется это~: метод. Наконец, добавлены предположения о до­ пустимости значений параметров. Вот еще один совет перед тем , как переходить к следующей теме. Что делать, если по­ сле написания определенного фрагмента кода и добавлею;1я вызовов Trap и T r ace ока­ зывается, что ни одна из ловушек не срабатывает? Ответ предполагает сброс мертвого балласта. Другими словами, удалите ненужный код. Он просто занимает дорогое время раз­ работчиков, которые вынуждены читать на самом деле не представляющий ин;ереса код. Обратите внимани~, что последний вариант метода содержит два оператора ветвле­ ния и блок Else, содержащий только комментарий. Необходимо добавить вызов Trap в каждую ветку условного оператора, чтобы протестировать оба маршрута выполнения кода. Кроме этого, нужно рассмотреть создан~е сообщения . об ошибке. (Сообщения об ошибках будут рассматриваться в следующем разделе.) Далее показана последняя версия кода в этом разделе, в которой продемонстирован удобный способ добавления операто- " ров Trap в каждую ветку условного оператора: .P·Ubi. IC' '<)7 U ii'Ct~:l611 ~· cai : CU:fдj: ' eFUeI ·cori ·SUffi"ed v( вУVа1 ,. ь·ur:;~i"tl.O"ii....,AS..,~.DOUbГ'ё'y; .,.,··:·:-:~<ЧУ =у- ··.~~:< ByVal GallonsPerHour As DouЬle) As Doubie r. t. ' Call « Trap (. ' ' S heetl. CalculateFuelconsumption", "Tested"} Call ·тrасе ( "Sheetl. Calcula teFU:elConsurned ,; , "Длит,ельностъ - " & .Dura.t i on & . " Галлоноввчас-" & r~ GallonsPerH~uf') . · ·Call Assert (Duration · :> О, "S)J.eetl. CalculateFuelC<;)nsurned" , ·· _ "Durati6n > .· О '1 ) f Call ,, ~ssert (Ga l lonsPerHour » О, :· Sheetl. CalculateFuelConsurned ", "Ga1lon's PerHour :> ' О" ) • • · · · . · · If . (Dщ:ati~J?. > о And , GallonsPerHour > О) Then Call : тrар · ( ,;Sheet,1 . CalculateFщйConsurned", _ "Durat.iori > \ О • And Gal;LonsPerHour > Ь"} . Ca.lculateFue l Consurned = ' DoCalcu l ateFuelConsurned (Duration, Ga.l l .ons PerHour} r Else· · •· . ; call тrар ( "$heetl. CalculateFuelcorisurned", "Dчration > О And 1~ 0 GallonsPerHour > О l.s False ;, ); 1· ~n~! i:ec~ :) в.~аетЕ.:т со,sбщение 6б ОШ}'!бКе .>. -.; · .• .. са.11 Trace:( "Sheeti. Calcu\a:teFuelConsurnption ,; , "Resul t=" & ;~ c;a1<;u1ateFue1consurned} · · ~ •i "" iEr:d ' Fi:inctiori 1p;'{;;,ate FunctioI1. DoCalcu i ateFti~lConsurned(ByVal i..ЛilYY.aJ .c;,~±J9P.~R.~E1fOY:i:;.,·:~:f3 . Dq:чo±.E!l..мhl?, J::)()μpl.,e ,:
Создание надежного кода 181 Г'''>о _>; :r_:_~' ""{'·· · Юo~alcG.iate:Fue:lConsumed · Dura:tion· * Обратите внимание, что в последнем. варианте кода вместе с предположениями исполь­ зуются операторы If, а весь отладочный код расположен во внешнем методе (не имеющем префикса Do). В результате алгоритм оказывается очень ясным и полностью защищенным. Кто-то может поинтересоваться, нужно ли писать этот код для каждого метода? От­ вет: нет . После написания пары миллионов строк кода появилась уверенность в том, что однострочный метод настолько прост в тестировании и отладке, что добавлять такой объем отладочного кода к столь простому методу абсолютно излишне. На самом деле, стоит пытаться сохранить простоту кода на уровне мeтoдaDoCalculateFuelConsumed. Кроме избежания большого количества ошибок такая простота избавляет от необходи­ мости писать комментарии или отладочный код. Начинающие разработчики еще не так уверены в своих силах, а попав в трудную ситуацию, начинают сомневаться в правиль, ном выборе путей выхода из нее. В итоге сам разработчик принимает решение о доста­ точном объеме отладочного кода. Это субъективное решение: которое и делает хорошее программирование таким сложным. Вывод сообщений об ошибках Существует много хороших программистов, которые не согласны с нашими рекомен­ дациями. Это хорошо. Именно это и делает жизнь интересной и позволяет создавать но­ вые идеи. Есть одна область, в которой сотни и даже тысячи программистов не могут прийти к единому решению . Надеемся убедить читателей в нашей правоте и в ошибоч­ ности подхода других программистов. Много лет назад семантически более слабые языки, например С, возвращали коды ошибок при любом некорректном поведении. Коды ошибок представляли собой произ­ вольные целые числа (обычно отрицательные), имевшие смысл rолько в определенном контексте. В итоге был создан большой объем кода, возвращавшего определенное целое число, имевшее смысл в определенном контексте. Такой подход к программированию предполагал, что все является функцией, все реальные возвращаемые значения переда­ вались по ссылке (ByRef), а смысл кода ошибки не передавался вместе с ошибкой. Зна­ ние о смысле кода хранилось отдельно. Таким образом, если функция возвращала значе­ ние - 1 в качестве кода ошибки, потребитель кода должен был обращаться к другому ис­ точнику для получения смысла КQДа ошибки - 1. Вот переработанная версия метода DoCalculateFuelConsumed, которая возвращает код ошибки. (Такой код пи сать не ре­ комендуется.) !Prlv~te.~F'uiict:'.i.:on ca1cU:1:ayeFueiconsum-ed (iзyval бU. raЪ.i.on ~As bouЬi'e, ~· ~ Е ,вууа1 Ga:llonsPerHour As ..Double, ByRe f .Result As DouЫ~) As Integ~~ f!< .If (Duration "> О Дnd GallonsPerHour > О) Then · : Restilt = Durai:ion * Galloш§PerHour Ca1cu1ateFuelConsumed О ю'sе · · ·· caicu'lateFuelcoristнned (End1f t··· ' ~!10. f~.11~t;:i_op·-· , -1
182 Глава 7 В данной версии метода возвращаемое значение указывает на успешность завершения работы, а фактический результат работы алгоритма передается че'рез параметр. Это ус­ ложняет непосредственное использование функции, так как необходи140 объявить до­ полнительный аргумент для хранения и получения результата работы. Теперь для вызо­ ва метода CalculateFuelConsurned необходимо писать значительно больше кода. a:>rm ·· н·eS-Ul"t 'As ~- j)'QU iJle ·· : , ,.._.,.х,, ,.. v;y,., ." -." ·yy· -~, . .._·~·,с·~~ I f ( CalculateFuelCons'urned (7, 1. 5 , ' Resul t) = О) The.n ~ · да: все сраб6<rало и Re:Sult можно использовать .Else ·· ' Жаль, t~дg_I_~··· щ1ять неудача и содер жJ,1мое Result не имеет Это особенно пессимистический подход к программированию. Полезность возвра­ щаемого значения функции практически исчезает и приходится пр,ограммировать так, как будто код всегда находится на грани падения. Продолжив чтение главы . о создании защищенного кода, вы поймете, что код будет отказывать значительно реже. Вернемся к использованию возвращаемого значения функции и создадим оптимистическl\Й код, предполагая, что отказ является редкой неприятностью , а не частым гостем. Для этого можно отказаться от применения кодов ошибок и перейти к выдаче сообщений об ошиб­ ках только тогда, когда они действительно возникают. ;o.PEi 9ri ~ ЁxpII c:т t: ~·- Puы ic Function Cal culateFuelConsurned (ByVal Durati·on ;:· · ByVal , GallonsPerHour As DouЬle) . As .DouЫe · · · f ·' ! If (Dцration > О And GallonsPerHour > 0) , тhе11 CalculateFuelConsurned = Duration * Ga.llonsPerHour Eis~ . . , Cal 1 Calcula teFuelConsurnedEr ror (Duration , · End If ' End Function ) S.ub . CalculateFщйConsurnedError (ВyVal Duratiqn GallonsPerHoui As DouЫe) · String = "Shee t2 . CalculateFuelConsurned·" As String ' ·. D~scription = ''длитеЛьность {" . \~& Duration &' "} и Галлонов . в ча.с {" · . , !~& :' Gallon.sP\'!rHour & "} должны бы:rь . больше ~. . . ' ' ' ' . ' j , Call E.rr. Raise (vbObj ectError · + 1, tEnd Sub ...· · '·· !J?ublic . E;ub ' те&t (.) !Г ,,. ~ оп Error Gото ' catch , }lsgBox CalculateFue;l.Consurned(-8, ~"" Exit Sub 'catch: · · t t-'Isg:Eiox _·Err .Description ; .o:·i· UwQ .$UlJ_. .. .
Создание надежного кода 183 Функция CalculateFuelConsumed выполняет все рассчеты. Если параметры Duration и GallonsPerHour имеют некорректное значение, сообщение об ошибке . выдается через вызов вспомогательной функции CalculateFuelConsumedError. Впомогательный метод создает удобно отформатированное описание и выдает сообще­ ние об ошибке при помощи вызова метода Err. Raise и передачи необязательного кода ошибки, исходной строки, описания, имени файла справочного руководства и контекста файла справочного руководства в качестве параметров. По соглашению контекстные но­ мера ошибок добавляются в константу vbObj ectError (как nоказано ранее). Это позволя­ ет предотвратить пересечение собственных номеров ошибок и номеров ошибок языка VВА. Для использования метода CalculateFuelConsumed создается оператор перехода на метку On Error GoTo. Стоит использовать такой способ (Catch или Handle) постоянно. После этого добавляется вызов метода и оператор выхода из метода: Exi t Sub для под­ программ, Exit Function для функций или Exit Properties для свойств. Наконец, в конце с оптимизмом добавляется метка и код для обработки ошибки. В этом примере пользователь получает сообщение об ошибке, выводимое с помощью оператораМsgВох. Если кого-то интересует, почему этот подход лучше других; можно отметить, что: О функцию можно использовать, как и предполагалось-, для возврата подсчитанного результата; О не добавляется код ошибки "ничего не делать", который пессимистически исполь­ зует условный оператор для проверки правильности завершения функции. Можно предполагать, что все работает как надо; О присутствует страховочная сетка, которая перехватывает любые ошибки, а не только собственные коды ошибок. (Например, можно не проверять неравенство делителя нулю. Если будет выполнено деление на ноль, при этом используется встроенный код ошибки. При пессимистическом подходе эта ошибка прошла бы сквозь систему контроля. Оператор On Error GoTo такие ошибки не пропускает); О объект Error передает значение ошибки вместе с сообщением об ошибке. Разра­ ботчик избавля'ется от необходимости создавать смысл ошибки на основе произ­ вольного значения кода ошибки. Если один стиль лучше с одной стороны, то он лучше и в общем. Выдача сообщений об ошибках лучше возврата кодов ошибок по нескольким несубъективным критериям. .Теперь стоит рассмотреть создание обработчиков ошибок. Создание обработчиков ошибок Существует три формы оператора On Error. Это оператор перехода на произвольную строку кода On Error GoTo . Далее оператор On Error Resume Next, обеспечивающий переход на строку сразу после строки, которая привела к появлению ошибки. Кроме этого, еще существует оператор On Error GoTo О, просто сбрасывающий сообщение об ошибке. Оператор On Error GoTo Оператор On Error GoTo уже использовался вместе с меткой Catch в предыдущем разделе. Важно , чтобы метод завершал нормальную работу до метки. Иначе метка и код обработки ошибки будут выполняться даже при нормальной работе. Для завершения ра-
184 Глава 7 боты подпрограммы применяется оператор Exi t Sub. Для завершения работы функ­ ции - оператор Exi t F unction, а для завершения р аб оты свойства - оператор Exi t Property. Но что , если код обработки ошибок должен работать всегда? Такое бывает . Подобный прием называется блоком защиты ресурсов. Компьютеры используют ко­ нечное количество сущностей, которые в целом называются ресурсами . Ресурсом может быть подключение к базе данных, файлу или сетевому сокету. Если создаются экземпля­ ры таких ресурсов , то необходимо обеспечить их правильное удаление. Для этого можно воспользоваться идиомой блока защиты ресурсов . Она имеет простой принцип работы: использовать оператор On E rror GoTo сразу после создания ресурса и намеренно не добавлять оператор завершения процедуры перед со?тветствующей меткой. Таким обра­ зом, код обработки ошибок (в данном случае это код защиты ресурсов) будет выполняться вне зависимости от наличия или отсутствия ошибок. Вот как выглядит реализация идиомы для открытия файла и записи текста в открытый файл. (Не стоит использовать такой спо­ соб записи в файлы. Для этого имеет смысл применять объект F i l eSysternObj ect.) ~Pцbi..l С7' ·sцъ."' Proт-:ec"tT.ьi~S-R_e s.ourc~e-() ..,, ·" . -~ - - ;-~=r~~- -~ Open ThisWorkbook.Path . & "\dummy.txt '; For Output As #1 . On Er'ror GoTo Finally · Print #1, "Этот . файл всегда будет закрыт " ;Finally: .Close #1 If. (Err .·NumЬer <> . О) Then · MsgBox Err. Description: · Помttите, чfо в· качестве меток могут исriользоваться произвольные номера этого в операторе On Err.or GoTo строку м_етки можно заменить на число; Базовая последовательность действий блока защиты ресурсов состоит из создания ре­ сурса, добавления операто.ра On Error GoTo, попытки использования ресурса и очист­ ки (ресурса или ошибки). В этом примере открывается текстовый файл, выполняется оператор On E rror GoTo Finally, делается попы тка использов ания ресурса и, в лю­ бом случае, выполняется очистка. Обратите внимание на отсутствие оператора выхода из процедуры. Оператор On Error Re~ume Next Оператор On Error Resurne Next может использоваться для игнорирования ошибк:И и продолжения выполнения со следующего оператора. Этот способ применяется непосредственно перед оператором, который может привести к появлению ошибки (например, перед оператором, результат выполнения которого не особенно важен) . Оператор On Error Resurne Next используется р~дко, так как не часто создаются опе­ раторы, результат выполнения которых не важен. Если результат работы оператора ни­ кого не интересует, удалите его . Операторы Resurne и Resurne Next могут использоваться сами по себе. Оператор Re s urn e применяется в завершении процедуры обработки ошибки для повтора попытки выполнить оператор. Например, если добавить дополнительный блок обработки ошибок
Создание надежного кода 185 в метод P r otectThisResource на случай невозможности открыть файл из-за установлен­ ного атрибута ReadOnl y (Только чтение), то в процессе обработки ошибки можно сбро­ сить этот атрибут и вьiполнить оператор Resume для повторения попытки открыть файл. Оператор Resume Next передает управление следующему оператору после оператора, ко­ торый привел к появлению ошибки. Такой оператор используется в ситуациях, когда вы­ звавшую ошибку строку можно пропустить. В следующем методе показано, как блок защиты ресурсов можно использовать вместе с блоком обработки ошибок, а также как восстанавли­ вать работоспособность после попытки открыть защищенный от записи файл: ' Pub1:lc sub ProtectThisResource () · Dim FileName As String • FileName = ThisWorkbook.Path & "\dummy . txt" On Error GoTo Catch Open FileName. For Output As #1 On .Error GoTo Finally Print #1 , Time & " Этот файл всегда ()удет закрыт" F:i,лally: Close #1 If (Err.NumЬer <> 0) Then MsgBox Err.Descr i ption Exit Sub ' 'catch: If {Err.NumЬer = 75) Then Call SetAttr(FileName, vbNormal) Resume End If Epd ,§1::!0. •« Первый оператор On Error GoTo Catch передает управление обработчику защи­ щенных от записи файлов , позволяющему открыть файл еще раз после сброса атрибутов . Второй оператор On Error GoTo обеспечивает закрытие файла после завершения ра­ боты процедуры . Пример метода может показаться слишком сложным и стоит обратить внимание, что ошибки могут возникнуть и.в других местах. Что, если поврежден диск? Что, если недоста­ точно памяти для загрузки слишком большого файла? Что, если файл заблокирован другим приложением? Возможны любые .ошибки. Именно поэтому сложно написать стабильную программу, а также предусмотреть'все возможные варианты и все условия. Программист должен субъективно оценить возможные неприятности и попытаться обойти их. Этот про­ цесс займет некоторое время, но в итоге он все равно завершится и код будет передан поль­ зователям. Некоторые специалисты говорят, что создание программного обеспечения компьютеров является самым сложным видом деятельности. С этим нельзя не согласиться . На этом этапе уже были показаны некоторые ошибки, которые могут возникать и в про- ·• стом коде. Теперь представьте себе создание 10 или 20 миллионов строк 'защищенного кода, лежащих . в основе Windows или Windows NТ. На компанию Microsoft оказывается постоянное давЛение с целью стимулировать создание более защищенного кода Windows, но есть очень умные люди, которые наслаждаются процессом обнаружения дыр в ~in­ dows. Удивител~но то, что это происходит не слишком часто.
186 Глава 7 Оператор Оп Error GoTo О Оператор On Error GoTo О отключает обработчики ошибок в текущей процедуре. Это еще один оператор, который используется не очень часто. Но иногда он встречается. Его можно воспринимать, как выключатель обработчиков ошибок на уровне процедуры. Использование объекта Err Объект Err содержит информацию о самой последней ошибке. В объекте хранится код ошибки, источник ошибки, описание ошибки и ссылка на документ справочного ру­ ководства, если таковое существует. Объект Err является экземпляром шаблона Singleton. Это значит, что такой объект существует в единственном экземпляре в пределах приложения. Так как это экземпляр класса, он имеет сво'йства и методы. Для выдачи сообщения об ошибке можно воспользо­ ваться методом EfT . Raise, а для очистки сообщения - методом Err. Clear . Остав­ шиеся свойства (кроме одного) уже рассматривались. Они используются для инициали­ зации ошибок. Последним нерассмотренным свойством является LastDllError. Это свойство возвращает значение типа Hresul t, которое обычно возвращается из библио­ тек DLL. Это свойство необходимо использовать при вызове методов во внешних биб­ лиотеках DLL, например в библиотеках Windows API. Создание обвязки Перед тем как перейти к обсуждению журнала событий, стоит обратить внимание на то, где и когда необходимо создавать тестовый код. В данном случае используется метод обвязки (scaffolding) . Если программирование похоже на добавление рассказов в общую структуру, то создание обвязки предполагает добавление текста к каждому рассказу. Соз­ дание обвязки позволяет убедиться, что новый код является изолированным и не добав­ ляе т ошибки в уже существующий проверенный код. Например, модуль DebugTools был создан для повторного использования в других приложениях. Данный код. должен быть изолирован, но в этом не будет уверенности, по­ ка не протестирован отладочный код. Тогда необходимо добавить по одному тестовому методу для каждого открытого метода в модуле DebugTools, вызывающего код Trace, Assert и Trap. Это позволяет убедиться, что выполнение кода приводит к получению ожидаемого результата. (Было бы просто смешно, если бы отладочный код становился причиной появления ошибок.) Вот полный листинг модуля DebugTools вместе с обвяз­ кой тестового кода, выделенной полужирным шрифтом. iO,I"JHon,,,Б:*~i':(clt · ·~· :. #Con:s t <тrа~ ing ·;;; .True ;#Const Debugqing '= T:tue ;#corist ' Us,eEventLog ~ - False· #ublic; suь тrар(ву\таl "sourc;e , ':ВyVal · Me~$age :м; String) ,# I 'f Debugging Then ' ' ' / D
Создание надежного кода 187 DebugPrint(ByVal Source As String, Message As String) \#If. useE:,rentLog Then h,, ' !#ЕН~ ' .. . ~· . · ·.Debug . .Print: "Ист очник: '" & Source & " С<:юбщение " & Message f#End J;f ' i'', jEnd ,Sub . j;ub~ic Sub Assert(ByVal Test As Boolean, _ 1' Jj!yVal Source As String, ByVal Message As String) · I . /#Xf bebt;gg.ing Then ,, Xf ·(Not , Testk Then ~· · Call , DebugPrint (Source, Message) · . Debug. Assert False End if !#End If fвnd "suь iPuЬlit sJb Trace ( ByVal Source As String, _ t ByVal ' Message As String) ~ ' г ~#If Tracing Then · . Call DebugPrint (Source, Message) #End If t [End sub 'PuЬlic . Sub TraceParams (ByVal Source As String, _ . ParamArray Values () As Variant) Dim Message As String Dim ' I As Integer .For I = . LBound(Values) То UBound(Values) Me13sage = Message & " " & Values(I) Next·г " . C.all. Tra,c .e ( Source, Message) 1End $ub i#If Debugging Then f . tPu,Ьlic s~ TrapTest ( ) , Call Trap{n.Sheetl.CallTrapn, 0 Test Trap") iEnd' Su.Ь , . · Pu.Ьiic Su.Ь AssertTest() Call Assert(False, nAssertTest", "Assertion Failuren) j:End Su.Ь , . Pu.Ьlic. Su.Ь TraceTest ( ) ·call Tr.ace ( "Sheeti. TraceAssert", "Trace Test"} ;End ,Su.Ь Pu.Ьlic Su.Ь TestSuite{) • Закомментировать после завершения всех тестов TrapTest "~13se.;-5.!_est i !j
188 Глава 7 ~·;····тraceтest ~End . Sub ,#}!:nd лt~ Тестовый код доступен только при установке переменной Debugging в значение True. Метод TestSuite вызывает тестовые методы (TrapTest, AssertTest и TraceTest), которые, в свою очередь, вызывают отладочные методы, а результат вызова можно про­ наблюдать в окне lmmediate (Проверка). Построчное выполнение кода позволяет убедить­ ся в получении необходимых результатов перед передачей кода другим разработчикам. В создании обвязки нет ничего сложного. Но это необходимо делать в процессе напи­ сания кода. Тестируйте каждый уровень в процессе }')Зеличения сJiожности, а не все сразу после того, как ~аписание основного кода завершено. Создание нескольких уровней тес­ тов является настолько же важным, как и создание нескольких уровней кода . Каждый фрагмент будет базироваться на надежной основе . Запись в журнал событий Журнал событий является системным ресурсом . Он достаточно важен и ценен, чтобы быть неотъемлемой частью новой инфраструктуры .NET от компании Microsoft. (Инфраструктура .NET предназначена для использования в языках программирования Visual Basic, С#, С ++ и множестве других языков программирования.) Это настолько важный ресурс, что компания Microsoft включила его в Exception Management Applica- tion Block (ЕМАВ) и Enterp1·ise Instrumentation Framework (EIF). Дополнительная ин­ формация о ЕМАВ и EIF доступна в сети Internet. В отличие от журнала событий эти ме­ ханизмы не доступны для непосредственного использо.вания, поэтому ниже рассматри­ вается только журнал событий. Журнал событий является локальной системной службой, выступающей в роли хра­ нилища информации о состоянии приложений, безопасности и компьютере в целом. Журнал событий можно использовать в процессе диагностики, так как его содержимое сохраняется между сеансами работы приложения. Следовательно, сообщения в журнале событий не исчезнут даже в случае аварийного отказа приложения. Эта информация по­ зволит определить причину отказа. Другими словами, окно lmmediate (Проверка) - это хорошо, но журнал событий доступен всегда. Следующий код доступен в файле EventLog. bas. В коде используется шесть методов Windows API, позволяющих подключиться к журналу событий Windows и упрощающих запись сообщений об ошибках до использования единственного метода WriteEntry. В этом случае не показана вся гибкость возможностей журнала событий, но на данном этапе журнал событий будет использоваться только для записи сооб~ений об ошибках: \OPtl"o~? #Xi)Il~l't::" ,',~>:~~~:':~~ :<~;·:~ · = ~ч·i·~ ·~'''w..~- -~ ·. ~ ;: ' . , : ~ .. iPrivate const GMEM· ZEROINIT &Н40 <Initializes · ' - . ~Private• Const EVENТ~OG ERROR_ TYPE = :i · fJ?riy.~tj'! cori.st EVENТt.OG;_WARNING_TYFE = 2 lprivate Const' .EVENTCOG_INFORМATI.ON_TYPE
Создание надежного кода 189 :~· A.iias "Reporf:E,;ё;;tд;г (!Гуvа 1 нaD.cii'€ As· ·r. .«3ng, - ~ ByVal Eveni::Type As Integer, ByVal Cat.egory As Integer, !~ .ByVal EventID As Long, ByVal Userid As Any, ;~ ByVal StringCount As Integer, ByVal DataSize As Long l~ техt As • Long, RawData As Any) As Boolean Шeclare Functio.n DeregisterEventSource L:ib "advapi32 .' dl l " , (ВуV<;э.1 [~ Handle As Long) As Long :Declar~ Sub CopyMemory Lib "kernel32" Alias "RtlMoveM~mor:y" \ByVal i ~ 'Destination As Any, ByVal Source As Any, ByVa1 Leng,th As Long) · (D~clare Function GlobalAlloc Lib "kerne132" ' (ByVal Flags As tong, i~ ByVal Length As Long) As Long pe;cJ.are Function GlobalFree Lib "kernel32" (ByVal . ~ hMem As Long) As Long t J(ublic Sub WriteEntry(ByVal Message As String) Dim Handle As Long Dim EventSource As Long , Oi:J. Error GoTo Finally - нandle =; GlobalAlloc(GMEM_ ZEROINIT, Len(Message) + 1) r Call ' CopyMemory(Handle, Message, Len (MeSsage) ~ 1) ·' Event_Source .= OpenEventSource ( "vbruntime") f ' Ср,11 ReportEvent (EventSource, EVENTLOG_ERROR_TYPE , О, 1, О&, 1, О, Handle, ~) :i>in<;э.lly: ' If (Handle <> 0) Then Call Globa1Free(Handle) I .f (Event-Source <> 0) Then CloseEventSource (EventSource) :End Sub Pu:Ьlic Function OpenEventSource(ByVal Source ' Использовать локальный компьютер OpenEventSource . = RegisterEventSource(" ." , ' End Function r ' PuЬlic Sub CloseEventSource(ByVal EventSource Call DeregisterEventSource(EventSource) End Sub :sub LogEventTest-() , С<;э.11 WriteEntry( "Это тест! "J 'EJI}cl~9.ЧI:>, .·= ••····· _, " As String) As Long Source) ' As Long) После добавления модуля EventLog можно изменить значение переменной UseEventLog на True и вызывать метод Wri teEntry для записи информации об ошибках в журнал событий. Для просмотра журнала приложений воспользуйтесь утили­ той Просмотр событий (Event Viewer) (выберите команду ПускqВыполнить (StartQ Run) и введите Even t vwr . ms с). Записи в журнале будут иметь источник v brunt ime, как показано на рис. 7.6 .
190 Глава 7 18 Event Vfevl1!r - - . -- • ~f/5]~ VMware Тools Service 17:00:32 . VBRuntime 19:'18:02 VMware Tools Service 6 :26:52 VMware Tools Service Отсутствует Отсутствует Отсутствует ~~~:~:.~: .~! · -.------- .-..... j} ~J; Рис. 7.6 . ЖурЖIЛ событий. Записи об ошибках Модуль Eve ntLog. bas можно рассматривать как приманку для главы 16 . (Невозможно уместить все в одной главе, поэтому использование Windows API рассматривается более подробно в главе 16, "Программирование с помощью WindowsAPI" . ) Резюме Для того чтобы что-то сделать хорошо, необходимо просто упорядочить хаос. Для того чтобы что-то сделать хорошо и быстро, необходима практика, привычка и хороший набор инструментов. В этой главе было показано, как создавать полезные отладочные инструмен­ ты и инструменты тестирования на основе объекта Debug, оператора Stop и журнала со­ бытий Windows. Выработанная привычка создавать код с помощью таких отладочных ин­ струментов позволяет сразу получать качественный код и делать это быстро. В этой главе рассматривались методы Assert, Trace и Trap. Кроме этого, было пока­ зано, как использовать функции Windows API для записи ошибок в журнал событий . Боль­ шинство неясных моментов применения Windows API будут рассмотрены в главе 16.
Отладка и тестирование В продажу выпущены сотни книг по программированию . Интересно, но только не­ большая часть из них посвящена тестированию и отладке или содержит главы, посвя­ щенные этой теме. При этом во множестве отчетов (что подтверждается опытом) указа­ но, что больше половины времени разработчик тратит на отладку кода. Учитывая такое соотношение, должно существовать больше книг, посвященных отладке и тестированию, и не так много книг, посвященных написанию кода . Существует нескол~ко основных принципов создания защищенного кода. Первое правило заключается в том, что если код не нужно писать, его не нужно и тестировать , то есть, чем меньше, тем лучше . Второе правило в том, что большая часть времени должна уделяться "исправлению" написанного, а не "написанию " того, что потом придется ис­ правлять. Третье правило подразумевает дополнение кода инструментарием в процессе создания (создание самодиагносtирующегося кода), так как в процессе написания разра­ ботчик лучше представляет себе все предполоЖения, чем через полгода после заверше­ ния проекта . (Скорее всего, через полгода с кодом придется бороться кому-то другому, а самому разработчику- иметь дел9 с новым кодом. Звучит неплохо, но отладочный ин­ струментарий может отсутствовать и в новом коде . ) Способность искать собственные и, что важнее , чужие ошибки является одной из форм искусства, как игра на музыкальном инструменте или полеты на самолетах. Некоторые об­ ладают механическим профессионализмом, а некоторые демонстируют красоту и изяще­ ство . (Если потратить 30 часов на отладку чьего-то кода на С++, а отладка кода другого раз­ работчика займет только минуту, код второго разработчика можно считать примером кра­ соты и изящества. ) В этой главе будут показаны инструменты, позволяющие получить :ме­ ханический профессионализм в отладке и тестировании. Красота и изяществq придут толь­ ко с практикой.
192 Глава 8 Пошаговое выполнение кода Существует несколько методов тестирования. Терминология может различаться, но обычно применяются такие термины, как модульное тестирование (unit testing), тестиро­ вание белого ящика (whitebox testing), тестирование серого ящика (g1:ey Ъох testing), тести­ рование черного ящика (Ыасk Ьох testing), регрессионное тестирование (regression testing), интеграционное тестирование (integration testing), тестирование приложения (application testing) и предприятия (enterprise testing). Каждый термин имеет определенное значение. С точки зрения разработчика существует два принципа: нельзя быть уверенным в ожидае­ мом поведении кода, если не проверен каждый мар~рут выполнения, и нельзя быть уве­ ренным в ожидаемом поведении кода. Возможно, лучшим подходом является написание минимального объема кода. В большинстве ситуаций код будет вести себя ожидаемым обра­ зом, а если что-то пойдет не так, отказ не будет катастрофическим. Потребители будут не очень довольны, если приложение потеряет результаты не­ скольких часов работы, поэтому для снижения вероятности такого исхода необходимо планомерно просмотреть весь код и избавиться от как можно большей части дефектов . К сожалению, отладка и тестирование могут оказаться исключительно сложными про­ цессами. Эту сложность практически невозможно донести до начинающих разработчи­ ков. Точно так же невозможно смоделировать один из сложных сценариев в ' этой книге. Но здесь можно показать механизмы пошагового просмотра кода, а профессионализм придет со временем. Выполнение кода Роберт Фрост (Robe1·t Frost) сказал: "Разница заключается в том, что я выбрал нехожен­ ную дорогу". Это относится и к программному обеспечению . Если методично пройти по всем маршрутам кода, включая редко используемые, конечный продукт на основе этого кода будет более жизнеспособным и содержащим меньше сюрпризов для потребителя. Первым шагом на нехоженной дороге является запуск кода перед передачей потребителю. В Excel VВАдля запуска кода можно воспользоваться меню Run (Выполнить) в редак­ торе VВЕ. Кроме этого, в ' редакторе VВЕ можно нажать клавишу <F5>, после чего также начнется выполнение кода. Хорошей практикой является создание пар~ой тестовой подп·рограммы, которая не требует передачи аргументов и предназначена для вызова ме­ тода. Этот подход называется созданием обвязки. Если создать подпрограмму, вызываю­ щую каждый или, как минимум, большинство методов, их можно будет тестировать по отдельности . Этот подход позволяет значительно ускорить процесс тестирования. В сле­ дующем листинге показан метод, который может потребоваться для решения проблемы, и тестовая подпрограмма, вызывающая метод и предоставляющая удобную точку входа для механизма тестирования. r:Pr'l:"viite '·fsuь 'rest'Fah.retilieTt:ifioc?Пiiu~s(T' "'' - Deb).i.g . Print Fahreriheitrocelsius(32)
!End .. 'puьiic. Fu~ction FahrenheitToCelsius (ByVa l ;тemperatureFahrenheit As DouЬle) As DouЫe Отладка и тестирование 193 FahrenheitToCelsius (S / 9 * (TemperatureFahrenheit В этом примере используется открытая функция, выполняющая преобразование по­ казателей температуры по Фаренгейту в показатели по Цельсию. Для проверки правиль­ ности уравнения можно написать тестовый метод, который будет проверять преобразо­ вание. Зная температуру кипения и замерзания (212, 100 и 32, О соответственно), алго­ ритм преобразов ания можно проверить с помощью закрытого метода, который сравни­ вает ожидаемые результаты с известными аргументами. В данном примере FahrenheitToCelsius описывает необходимый алгоритм, aTestFahrenheitToCelsius является закрытым методом, используемым для тести­ рования независимо от остальных компонентов. Если тестовый метод успешно выпол­ нил свою функцию, в списке методов можно поставить пометку о правильно сти работы основного метода. То есть, дальнейшая проверка не требуется. Если каждый метод отме­ чен, как надежный, то приложение должно работать правильно при любых входныJ_С па­ раметрах . В реальности обвязка используется Для исключения большого к_оличества ошибок, но небольшие потенциальные ошибки могут накапливаться. и приводить к реальным ошиб­ кам, возможность появления которых никогда не тестировалась . Например, а что, если пользователь введет число, которое выходит за пределы допустимого диапазона значе­ ний типа DouЫe? В таком случае появится сообщение о неожиданной ошибке и даже протестированный код будет отказывать. Другими словами, тщательное тестирование позволяет избавиться от большинства, но не от всех ошибок. Только разработчик и потребители могут принять решение о допустимом проценте ошибок. Если программное обеспечение используется для рассчета налога на прибыль, то могут быть допустимы минимальные ошибки в 5 из 100 случаев . Если программное обеспечение определяет момент срабатывания тактового генератора, то допустимый уровень ошибок может составлять 1 из 10000000. Так как в данном случае обсуждается программирование приложений для Excel, читатели, вероятнее всего, будут подсчиты­ вать ставки налогов, а не создавать встроенное программное обеспечение для тактовых генераторов . Но в любом случае важно , чтобы разработчик и потребитель оговорили среднее время между ошибками, та~ как полное отсутствие отказов при нынешнем уровне технологии невозможно. Шаг с заходом · Команда Step lnto (Шаг с заходом) доступна в меню Debug (Отладка) редактора УБЕ. Для вызова этой команды можно воспользоваться клавишей <F8>. Команда Step lnto (Шаг с заходом) поочередно выполняет каждую строку кода. Если нажать клавишу <F8> на строке вызова метода, отладчик перейдет к данному методу. Применение этой коман­ ды требует значительных трудозатрат, но позволяет проверить каждую строку кода . При использовании этой команды разработчик видит, где и какой код будет выпол­ няться следующим. Для демонстрации применения команды откройте редактор VВЕ и на­ ведите курсор на метод TestFahrenhei tToCelsius. Нажмите клавишу <F8>. Строка
194 Глава8 кода, которая будет выполняться следующей, выделяется ярко-желтым фоном. На рис. 8.1 выделен заголовок подпрограммы. Еще раз нажмите клавишу <F8>, и _ выделение пере­ местится на строку вызова Debu g . P ri nt. Нажмите <F8> в третий раз, и отладчик пе­ рейдет к коду метода Fahrenhei tToCe l s i us и т.д. It (FahrenheitToCelsius (~2) <> О) Then Debuq . ~rint "Tes t fahrenhe:itToCe:lsi~: Неудача" DebщJ. Assert. False Еlзе Debu9 , Print "TestfahrenheitToCels i us: Успех" End It ;, ~~ff""J~'-77тj:.•'-;~-":;----,-т:~- ~- ' ,,·_ : ~г~ Рис. 8 .1 . Использование команды Шаг с заходом Шаг с обходом Комбинация клавиш <Shift+F8> вызывает команду DebugqStep Over (Отлад_каqШаг с обходом) в редакторе VВЕ. Например, если после метода Debug. Print не нужно перехо­ дить внутрь процедуры FahrenheitToCelsius, нажмите комбинацию клавиш <Shift+F8>. Метод будет вызван, но отладчик не перейдет к строкам кода этого метода. Шаг с выходом Если проверяется выполнение длинного метода или метода, . который уже считается надежным, воспользуйтесь комбинацией клавиш <Ctrl+Shift+F8> для запус!(а команды Step Out (Шаг с выходом). (Команда Step O ut (Шаг с ВЫХ<?дом) доступна в меню Debug (Отладка) в редакторе VВЕ.) Команда Step Out (Шаг с выходом) п<;>зволяет выполнить оставшийся код в процедуре и сразу выйти за пределы текущей области выдимости. ПредположИ:м, что при пошаговом выполнении метода определен · и исправлен ис­ точник ошибки . Вместо ручного выполнения оставшихся строк метода можно восполь­ зоваться комбинацией клавиш <Ctrl+Shift+F8> и выполнить метод до конца без вмеша­ тельства разработчика. Кроме этого, в любой момент можно нажать клавишу <F5> и пе­ рейти в режим нормального выполнения . Выполнить до текущей позиции Кроме шага с заходом, обходом и выходом, можно ще-!Jкнуть на любой строке кода и воспользоваться командой DebugqRun to cursor (ОтладкаqВыполнить до текущей по­ зиции) или нажать комбинацию клавиш <Ctrl+F8>. Отладчик будет выполнять код, пока не достигнет указанной строки. После этого выполнение будет приостановлено. Это подходящий прием при исправлении фрагмента кода для автоматического выполнения заведомо исправленных строк.
Отладка и тестирование 195 · Следующая инструкция Команда Debugo:>Set Next Statement (Отладкао:>Следующая инструкция) доступна . с помощью комбинаЦии клавиш <CtI"l+F9> и позволяет замкнуть строки кода в пределах одной процедуры. Еще раз обратимся к подпрограмме TestFahrenheitToCelsius. Предположим, что необходимо проверить правильность вывода передаваемого сообщения с помощью метода Debug. Print в блоке Else. Метод TestFahrenheitToCelsius мож­ но запустить с помощью клавиши <F8>. После этого щелкнуть на вызове Debug. Print в блоке Else и нажать комбинацию клавиш <Ctrl+F9>. Все предыдущие строки кода будут пропущены и отладчик выполнит код в указанной строке. 1 Эта возможность особенно полезна, так как дает шанс пропускать строки кода, кото- рые вносят критические модификации до того, как подготовка к этим модификациям полностью завершена. После выполнения кода создания и удаления обвязки можно про­ пустить модификацию критических фрагментов данных и проверить работоспособность процедуры без этой модификации. Отобразить следующую инструкцию .В процессе отладки. часто возникает необходимость в остановке кода и поиске необ­ ходимой информации, например, при отладке процедуры может потребоваться инфор­ мация о поле класса. При этом можно поте рять текущее положение отладчика. Выберите команду Debugt:::>Show Next Statement (Отладкао:>Отобразить следующую инструкцию), и редактор VВЕ автоматически перенесет курсор на строку кода инструкции, которая бу­ дет выполняться следующей. Все вместе команды: Step lnto (Шаг с заходом), Step Over (Шаг с обходом), Step Out (Шаг с выходом) , Run to Cursor (Выполнить до текущей позиции), Set Next Statement (Следующая инструкция) и Show Next Statement (Показать следующую инструкцию) по­ зволяют перемещаться по коду и избавляют от тысяч нажатий комбинаций клавиш в процессе отладки. Использование точек останова В главе 7 кратко рассматривалась история отладчиков и точек останова. В этой главе новое понимание точек останова используется для разделения и победы над проблемами. Для установки точки останова необходимо выбрать интересующую строку кода и нажать клавишу <F9> (или выбрать команду меню Debugo:>Toggle Breakpoint (Отладкаt:::>Точка останова). Точка останова обозначэ,ется красным кругом в начале строки. В процессе от­ ладки можно установить несколько десятков таких точек. Для быстрого удаления всех то­ чек останова после завершения отладки выберите команду Debugt:::>Clear All Breakpoints (Отладкаt:::>Снять все точки останова) . Эта команда также доступна в виде комбинации клавиш <Ctгl+Shift+ F9>. Теперь, когда известен механизм работы точек останова в редакторе VВЕ, их можно применять для решения поставленных задач. Для этого можно воспользоваться извест­ ным изречением Divide et impe1·a (Разделяй и властвуй). Самым быстрым способом обна­ ружения ошибки , расположение которой заранее неизвестно, особенно в незнакомом ко­ де , является установка точки останова и запуск кода. Если точка останова встретилась до появления ошибки, то ошибка расположена в коде после нее. Добавьте вторую точку ос­ танова во второй половине кода. Если вторая точка достигнута до появления ошибки; ус­ тан.овите еще одну точку останова после второй точки. Если и в этот раз ошибка не про-
196 Глава 8 явилась, добавьте точку останова после третьей точки останова. Если ошибка появилась после первой точки останова, но перед второй, добавьте точку останова между ними. Повторение этой процедуры позволит быстро найти ошибку даже в совершенно незна­ комом коде. (Этот подход основан на логарифме по основанию 2 и еще называется мето­ дом дихотомии или "Разделяй и властвуй".) Многие простые ошибки проявляются в тех местах кода, где они находятся. Такие ошибки исправляются очень просто. Ошибки, для обнаружения которых требуется дихо­ томическое размещение точек останова, моrуг занять большую часть рабочего времени программиста, но использование ;гочек останова значительно помогает в изолировании та­ ких проблем. Использование контрольных значений Утверждение "Знание - сила" хорошо подходит разработчикам программного обес­ печения . "t!ем больше профессиональных знаний и информации о текущем состоянии программного обеспечения, тем более мощными, выразительными и полезными будут решения разработчиков. Мы программируем достаточно долго, чтобы помнить создание кода в простых текстовых редакторах, запуск компиляции из командной строки и реали­ зацию стратегий отладки в манере "ловить все, что ловится". С этой точки зрения очень подходят современные интегрированные инструменты разработки, например VВЕ, ко­ торые появились относительно недавно (в течение последнего десятка лет). В меню Debug (Отладка) доступны команды Add Watch (Добавить контрольное зна­ чение), Edit Watch (Из-менить контрольное значение) и Quick Watch (Контрольное зна­ чение) (последняя команда может запускаться с помощью комбинации клавиш <Shift+F9> . Для использования контрольных значений необходимо выбрать интерес ую­ щую переменную, объект или выражение, и выполнить соответствующую команду. С дру- . гой стороны, можно выполнить команду и после этого выбрать интересующую перемен­ ную, объект или выражение. Добавление контрольного значения Команда Debugq Add Watch (ОтладкаqДобавить контрольное значение) позволяет доба­ вить переменную, объект или выражение в немодальное окно. Окно Watch (Контрольное значение) выводится при ра~оте кода в отладочном режиме. Контрольные значения в преде­ лах текущей области видимости обновляются в процессе. работы программы . Для демонстрации работы этих команд рассмотрим метод, который вызывает метод Fahrenhei tToCels"ius, передавая параметры от 1до400. Вместо ручной проверки вы­ вода после каждого преобразования можно добавить контрольное значение, показываю­ щее количество градусов по Фаренгейту (номер итерации цикла) и результат вызова функции. В следующем листинге показан используемый код: 'i??'.rvat'·E1.·: su.~,. ·75~sEwaHC:1:iТ
Отладка и тестирование · 197 Для добавления контрольного значения на основе выражения FahrenheitToCels ius ( I ) можно выделить выражение в редакторе и выбрать кoмaндyDebugc:::>Add Watch (Отладка<=:> Добавить контрольное значение). Появится диалоговое окно Add Watch (Добавить кон­ трольное значение) (рис. 8.2), в котором показано выражение (в данном случае, перемен­ ная, объект или выражение), контекст, состоящий из процедуры и модуля, и тип контроль­ ного значения. Принятый по умолчанию тип контрольного значения просто позволяет следить за текущим состоянием выражения. Кроме этого, предоставляется возможность ос­ тановки выполнения программы при изменении контрольного значения или при истинно­ сти условия на его основе. Условные контрольные значения позволяют выполнять код без остановок до выполнения определенного условия. После завершения настройки контрольного значения щелкните на кнопке ОК. После закрытия диалогового окна Add Watch (Добавить контрольное значение) откроется диа­ логовое окно Watch (Контрольные значения), в котором появится выбранное выраже­ ние. Здесь рассматриваются два контрольных значения: итератор цикла (I) и вызов ме­ тода (рис. 8 .3). При входе в метод TestWatch в области видимости появляI<пся два вы­ ражения, и окно Watch (Контрольные значения) начинает постоянно обновляться. Кроме этого, диалоговое окно Watch (Контрольные ~наЧения) предоставляет воз­ можность просмотра содержимого сложных объектов. Например, если в окно Watch (Контрольные значения) добавить объект (рис. 8.4), можно щелкнуть на символе [+] и просмотреть текущее состояние интересующего объекта. Как и другие выражения, кон­ тролируемое состояние объекта обновляется в момент изменения состоян.ия. На рис. 8.4 показана часть внутреннего состояния объекталистаShееtl. YBAProject (Debuggin В ~ Microsoft Exc el Ob}ecl . lf!j Sheetl (Sheetl) •··· 1!!!) Sheet2 (Sheet2) " " l !!!J SheetЗ (SheetЗ) ~ ThisWorkЬook PuЬlic SuЬ Run () ... ~О<:!...~!!!?..___ _____________ Pri·vet.e SuЬ Teэt.tlat.ch() Dim I As Integer forI"1То400 ~ De!:!ug :p _r1fli ' ahrenhe1 t TQCelэ 1 us tI) Next. I End S •AddVlatch" • - "" . --- . ~ Privat Debu I:f ( PuЫic rahr i;_xpression: 1- context ------- - - - -- -= 1 ~ocedure l тestW•tch 3J ~~~~~~~~--<' j i •мodtie: ISheetl 3! l_Pro;~ct: VВAProJOCt г.Watch Туре - 1 - r. Wгitch Expression r Вreak When Vo!ue Is Ifue j (° ВreakWhen Va\ue Q'lanQes с__ J Рис. 8.2. Добавление контрольного значения ок1 C«1Cel 1 jjelp 1
198 Глава 8 Private SuЬ Teзt1Jatch () Dim I Аз Inteqer ForI•lТоiOO Р~.~~9 :.~~-;n§ ·r~~f~ii~.e1·~~~c)~J~J.\!~J.~·ji Next I End SuЬ -----· ---· --· -------- -----· ·-· --· · ---·---- -- -- ·- ,·~· : Private SuЬ TeэtFahrenheit.ToC elзiuз {) Debug . Pr int fahrenheitToCe lзiuз (32) If (FahrenheitToCel~iuз ( 32) <> 0) Then Debug . Print "TeзtFahrl!:nhe itToCelзiuз: Неудача " Debug • .Аззеrt Falзe Рис. 8.3. Использование контрольных значений 66 FahrenheПoCelsUs(I) -1 3,ЗЗЗЗЗЗЗЗЗЗЗЗЗ OouЬle 6Q1 8 lnteger -{±] AppliCo1ion AppБcation/Application 1-- Autofl~er No1hing Autofilter frn Cells RengelRenge - Circul6rReference Nothing Renge Sheet1 .Test\l'Vatch Sheet1.TesfY\hrtch Sheet1 .TesNostch Sheet1 .Tesfl/Vatch Sheet1 .Te.srwвtch Sheet1 .TesNoat ch Рис. 8.4 . Просмотр состоянuя с.ложных объектов Изменение контрольного значения .: .J ,~. :: Команда DebugqEdit Watch (ОтладкаqИзменить контрольное значение) приводит к появлению диалоговщ·о окна, похожего на диалоговое окно Add W atch (Добавить кон­ трольное значение). В диалоговом окне Edit Watch (Изменить контрольное значение) предоставляется возможность изменения базовых параметров контрольного значения или удаления самого контрольного значения. Кроме этого, менять параметры или уда­ лять контрольные значения можно непосредственно в окне Watch (Контрольные значе­ ния) . После определенной практики . появляются хорошие навыки по управлению кон­ трольными значениями.
Отладка и тестирование 199 Контрольное значение Команда Debugc::>Quick Watch (Отладкас::>Контрольное значение) доступна из меню редактора VВЕ или с помощью нажатия комбинации клавиш <Shift+F9>. Диалоговое окно Quick Watch (Контрольное значение) является модальным. Для его использования вы­ делите интересующее выражение и нажмите комбинацию клавиш <Shift+F9>. Как пока­ зано на рис. 8.5, в диалоговом окне Quick Watch (Контрольное значение) отображается в~:rражение и значение выражения. Если выражение необходимо добавить в диалоговое окно Watch (Контрольные значения), щелкните на кнопкедdd (Добавить). lt::=~~EJ Concel 1 t!e\J. 1 Рис. 8.5 . Использование диалогового 01СНа Кон­ трольное значение Так как диалоговое окно Quick Watch (Контрольное значение) является модальным, во время его вывода на экран выполнение программы приостанавливается . Как и в слу­ чае с прочими модальными окнами, для доступа к другим элементам приложения (в дан­ ном случае, Excel) необходимо закрыть oкнoOu i ck Watch (Контрольное значение). Окно Локальные переменные Если случайно закрыть окно Watch (Контрольные значения), его можно открыть повтор­ но, добавив новое контрольное значение или выбрав в меню редактора VВЕ Viewc::>Watch Window (Видс::>Контрольное значение). Еще одним средством проверки значений является окно Locals (Локальные переменные). Окно Locals (Локальные переменные) очень напоми­ нает окно Add Watch (Добавить контрольное значение). Разница лишь в том, что в окне Locals (Локальные переменные) показаны не все переменные, а только переменные, которые доступны в текущей или локальной области видимости. Кроме этого, 'в окне Locals (Локаль­ ные переменные) присутствует доступная везде ссылка на объектМе (рис. 8.6). VБAProjOct.Sheetl,ТestW•tch ExDrмsion 1VtWe 1TVoe + lnteger Рис. 8.6. Исп'ользование ОЮ/.а Локаль­ ные переменные Пере~еннаil Ме. является внутренней ссылкой объект.а на самого себя. Ее мо~н~ исnоль-.. .; эовать , в качестве удобноrо . сnособа вывода окна Members (Члены). Это же окно 9ткры- 11аётся 'вручную, если нажать комбинацию клавиш . <Ctrl+npoбeл> в редакторе уве.
200 Глава8 Тестирование выражения в окне Проверка Окно lmmed iate (Проверка) представляет собой интерпретатор внуrри редактора. Для досrупа к окну выберите команду меню Viewq\mmediate (ВидqПроверка) или нажмите комбинацию клавиш <Ctгl+G>. В этом окне вводятся команды, переменные, объекты и опе­ раторы, которые выполняются немедленно. В результате программист может проверять предположения и альтернативные варианты, не создавая дополнительный код . Чаще всего окно исполь·зуется для вывода значения переменной из текущего контек­ ста, для этого применяется команда print или символ ? . После команды print можно вызвать практически любую функцию, например,? abs (-5). Результат 5 будет выведен на следующей строке в окне lmmediate (Проверю\). :f.сли память о командной строке DOS все еще сильна, в окне lmmediate (Проверка) можно ввести команду cmd и получить дос­ туп к интерпретатору командной строки. Допо"лнительная информация доступна в раз­ деле справочного руководства по редактору VBE "Immediate Window КеуЬоагd Shиtcuts". На рис. 8.7 показан результат вызова функции FahrenheitToCelsius из окна lmmediate (Проверка). В первой строке находится командарrint, после которой указан вызов функции и ее результат. Обратите внимание , что вызов функции необходимо' квалифицировать име­ нем экземпляра класса, в котором она определена. Если функция определена в модуле, квали­ фикация не требуется. Так как фyнкцияFahrenheitToCelsius определена в листе Sheetl, придется воспользоваться квалификатором Sheetl и оператором членства (. ) . lm..-!iate • ® ? Sheetl.Fahr-enheitToCel.!!ius (32) о Рис. 8. 7 . Вызов функции FahrenheitToCelsiиs из окна Проверка Источники получения информации об определениях До этого момента было продемонстрировано, как просматривать код и получать ин­ формацию о его текущем состоянии. Надежным правилом является создание тестового кода, который проверяет каждый возможный маршрут и максимальное количество вари­ антов результатов . С практической точки зрения это очень сложно и долго; по этой при­ чине повторное использование максимального объема кода является лучшим способом разработки и создания надежных решений в отведенное врем:я. Следующий фрагмент го­ ловоломки - это поиск и использование уже доступных решений. Рассмотрим возможно- . с ти р ед а кт о ра VBE, помогающие в реализации этого правила. Команда Краткие сведения Команда Quick lnfo (Краткие сведения) (<Cal+I >) приведет к появлению всплываю­ щей подсказки об элементе, который находится под курсором. Например, если навести курсор на слово Fahre nheitToCelsiu s и нажать комбинацию клавиш <Ctгl +I>, сигна­ тура метода будет показана в виде всплывающей подсказки (рис. 8.8).
~:_~ Microsoft ExceJ Objects ····llJ ·sheetl (Shecll) 11) Sheet2 (Sheet2) 1![1 SheetЗ (SheetЗ) · €) Тh;sWorl<Ьook Pr iv~te SuЬ Te~t liJatch () Dim I As Integer Forr"'1То.qoo Отладка и тестирование 201 Debug.Print Fahr~nhei_t_ T~Cel~. iuэ( _ I) _ _ ___ __ _ . Ne:.:t I Fa t1r enhertT0Celsius(ByVa/Tem.oeratureFahrenheit A.s DоиЫе) As Ьоuые ! Private Sul:i TestFahrenheitToCel~iu~ () Debug. Print Fe.hrenheitToCel:з i u~ (32) I:f (FahrenheitTaCelsiuз(32) <> 0) Then Debug.Print "TestFahrenheitToCelsiuз: Неудача" Debug. Аээеrt falэ-e ,;~,. "' .~..1.LJ Рис. 8.8 . Использование команды Краткие сведения для получения информации об элементе кода ПодсказкИ с краткими сведениями по умолчанию включаются в меню Toolsc:>Options (Сервисе:> Параметры) на вкладке Editor (Редактор) (рис. 8.9). Но новички в Excel или пользователи редактора VВЕ, в котором кто-то отключил автоматическое отображение кратких сведений, могут столкнуться со сложностям:И при получении информации об ис­ пользовании определенных возможностей Excel. (В Excel существует слишком много классов, методов, свойств, событий и полей, чтобы один человек мог запомнить инфор­ мацию, предоставляемую в подсказках Quick lnfo (Краткие сведения). Ed itor 1Editor Format 1·Gene1al J Docki1g.J Р" д,;;о Syntox Chec~ гWlrd~•'Settlngs ·---·-----l 1 Р' Q1·ag -and-Drop Text Editing ! Р" Del ault to Full Мос!.Ле \Леw 1 Р' f.rocedure Sep~r~tor t.... 1. ок Р" Дuto [ndei)t. I.ЬWiclth: г- J·. Отмена j Сnр•око ! Рис. 8. 9. ВклIОЧеllШ! подскозок с краткими сведениями
202 Глава8 Команда Сведения о параметре Команда Parameter lnfo (Сведения о параметре) предоставляет информацию об ар­ гументах выбранного метода. Для доступа к этой возможности необходимо нажать ком­ бинацию клавиш <Ctrl+Shift+I>. При доступе к Qu ick lnfo (Кратким сведениям) имя ме­ тода выводится полужирным шрифтом. При использовании возможности Parameter lnfo (Сведения о параметре) полужирным шрифтом выводятся аргументы . Кроме этого, со­ временные программные инфраструктуры уровня Micгosoft Office (например, .NET Framework, Visual Control Libraгy илиJаvаJ2ЕЕ) оказываются слишком большими для за­ поминания. Если не освоить Данные возможности редактора VВЕ, то программирование может оказаться исключительно сложным. Команда Завершить слово Команда Complete Word (Завершить слово) доступна в меню Ed it (Правка) или может вызываться с помощью комбинации клавиш <Сtгl+пробел>. Эта возможность просматри­ вает текущий элемент и пытается завершить ввод имени элемента за разработчика . На­ пример, если ввести Fahre и нажать комбинацию клавиш <Сtгl+пробел>, редактор VВЕ автоматически закончит ввод имени функции . Обычно редактор неплохо угадывает окончание вводимого слова. · Такие возможности помогают Правильно вводить имена сущностей, которые сложно ввести самостоятельно, например Fahrenhei t. Команда Список свойств/методов Команда List Properties/Methods (Список свойств/методов) выводит свойства и мето­ ды, доступные в текущем контексте. Например, если ввести имя объекта, после которого указать оператор членства, в раскрывающемся списке будут показаны свой.ства и методы этого объекта. По умолчанию эта возможность есть в диалоговом окне Toolsq0ptions (Сервисq Параметры) на вкладке Editor (Редактор) (установлi!н флажок Auto List Member). Если сбросить · этот флажок, то для вывода раскрывающегося списка свойств и методов придется нажать комбинацию клавиш <Ctrl+J>. Команда Список констант Комбцнация клавиш <Ctl"l+Shift+J> вызывает команду List Constants (Список кон­ стант) . Существуют сотни констант, которые несут большую смысловую нагрузку, чем простое числовое значение. Но запомнить даже часть этоrо .списка - непосильная задача. Поэтому в данном случае можно положиться на редактор VВЕ. Команда Закладка Закладка является именно тем, на что указывает название. При перемещении по большому проекту очень легко потеряться. Воспользуйтесь командой Editq8ookmark (ПравкаqЗакладка) дл.я установки закладок и быстрого просмотра списка существующих закладок. На присутствие закладки указывает небольшой прямоугольник со скругленны­ ми углами слева от кода в редакторе VВЕ (рис. 8.10).
: VBAProject (OeЬuQglng' ·~Microsoft Excel Objects:.' · ~sli--ti(~!) i · 11!) Sheet2 (Sheet2) · i ·· .11!) SheetЗ (SheetЗ) {) ThisWorl<Ьook Отладка и тестирование 203 Dеьщ~. Aз~ert Falзe Еlзе Debug.Print ''Te~tfahrenheitToCel ~iuз : Успех " End If Pul:ilic SuЬ Stt!ppinqThrOUQhCode () 'Step !11to 1 Step 0- .. re.r. '5t.e!:p Out ' Se: t Next Stateшe:nt Рис. 8.10. Установка за!(Ладки Команда Описания Пункт Definition (Описания) позволяет перенести фокус редактора к определению символа. Например , в тестовом приложении ·можно быстро перейти к определению ме­ тода, если навести курсор на символ и вызывать команду меню ViewqDefinition (ВидQ Описания). Кроме этого, м~жно нажать комбинацию клавиш <Shift+F 2>. В небольшом проекте эта возможность может показаться лишней, но при просмотре большой про­ граммы или чужого ко~а она может пригодиться. Команда Просмотр объектов Окно Object Browser (Просмотр объектов) доступно с помощью команды меню Viewq Qbject Browser (ВидQПросмотр объектов). Кроме это го, для доступа к окну Object Browser (Просмотр объектов) можно нажать клавишу <F2>. Это окно является централизованным источником и~формации о классах и их членах. Если добавить ссыл­ ку на внешнюю библиотеку, то классы и члены классов из этой библиотеки также будут доступны в окне Object Browser (Просмотр объектов) (рис . 8.11). На рис . 8.11 фильтр настроен на просмотр всех библиотек, ссылки на которЬrе добав­ лены в проект. В списке классов выбран класс AnswerWi zard. Открытые члены класса AnswerWizard показаны в списке справа. В нижней части окна приводится информация об отображаемом объекте и о месте, где этот объ'ект определен. Например, на рис. 8.11 показано, что AnswerWi zard является классом, который определен в библиотеке Office.
204 Глава 8 l<All Llbrorles> :::J ~_:J ~l!:iJ .!J г---........з~ 1 ~ 1 Classes i;.tJ Add l ns lJ! Adj ustments 4J, Allow EditRange i.tl AllowEd itRanges ~ f4ФРМ413 ~ An s we NoiZardFiles C!J .A.pplication ~ Areas ~ Assistant ~ AuloCorrecl ~ AutoFilte r ~ AutoReco ver @."- .J llVO<. ' Class AnswerWiza rd MemЬer of Offir:e Members of- ' Ans yverV\liza rd' !~i ~ Application ~::·:·~. ,;,~ Cl earFileList ~ Cr eator ~ Files r5f Parent '-"~ ResetFile list Рис. 8.11 . Исrwльзование окна Просмотр обоектов По умолчанию для Excel досrупны библиотеки Office, Excel, stdole, VВА и VВAPгoject . Каждая из библиотек хранится в отдельном файле и предоставляет редактору VВЕ собствен­ ные возможности. Например, библиотека stdole предоставляет доступ к механизму OLE Autoшation. Эта библиотека находится в файле С: \WINDOWS\Systern32 \stdole2 . t l b. (В файлах . tlb хранятся библиотеки типов, определяющие содержимое объектов СОМ . До­ полнительная информация о механизмах СОМ и Autoшation приводится в главе 13.) Просмотр стека вызовов Иногда можно встретить фанатика определенного языка программирования . Такие лю­ ди считают , что по-настоящему можно программировать только на некоторых языках . (Обычно этим: недугом страдают программисты на. С++ и Java.) На самом: деле ввод текста и успешная компиляция программы , решающей требуемые задачи, является программирова­ нием. При этом от.Цельные инструменты универсальны и могут использоваться для реше­ ния практически любой задачи, а некоторые инструменты могу:г применяться для решения задач только в ограниченной проблемной области. Язык С ++ используется для решения любых задач, но на его освоение может потребоваться значительное время. Язык VВА на­ м:но:го проще в изучении и при этом позволяет решать реальные задачи . Каждый язык име­ ет собственное применение и свои сильные и слабые стороны. Многие инструменты программиста обладают общими возможностями. Как сложные, так и простые языки выполняют некоторые простые операции. Каждый инструмент должен предоставлять доступ к информации о таких базовых операциях. С появлением: функций (функции были изобретены между 1960 и 1975 годами) в программах стало ис­ пользоваться ветвление, а некоторые фрагменты кода программы стали храниться в од­ ном: месте после отказа от многократного копирования одного и того же кода. В результа­ те программистам: потребовались инструменты для отслеживания такого ветвления. По­ добный инструмент имеет простой принцип действия: при вызове функции текущий ад­ рес и дополнительная информация о состоянии записываются в область памяти, называемой стеком: или стеком: вызовов . Эта область памяти используется компьютером для хранения адреса перед точкой ветвления и локальных переменных, которые созда-
Отладка и тестирование 205 ются после ветвления. Перед завершением работы функции локальные пер еменные уда­ ляются из стека и на его вершине остается адрес точки ветвления . Компьютер использует этот адрес в качестве "хлебных крошек" для · возврата и продолжения исполнения кода после точки ветвления . Для просмотра стека вызовов можно выбрать команду меню View<:::>Call Stack (Вид<:::>Стек вызовов) или нажать комбинацию клавиш <Ct гl+L>. Эта возможность из­ бавляет от угадывания реальной последовательности выполнения кода центральным процессором. На рис . 8.12 показан обратный порядок вызовов при переходе из метода TestFahrenheitToCelsius в метод FahrenheitToCelsius. Р~r;oje~c~t.M~o~du~le~.F~tлelli!tio~n~~~!!!!!!llllllllll!lllllllllllllll• 1 --~о~ -- 1 VВAProject.Sheetl.TestFahrenheitToCelsiUs ~lose 1 Рис. 8.12. ПроСJ1юmр порядка вызовов процедур Проверка инвариантных предположений В главе 7 рассматривался инструментарий, основанный на методе Assert объекта Debug, и было показано, как использовать эту возможность языка VВА. Перед заверше­ нием этой главы стоит повториться, поговорив о важности проверки предположений в качестве инструмента отладки . При создании кода разработчик должен убедить себя в правильности решения. ЕслИ: соз­ даваемый код похож на епагетти, остановитесь и обдумайте решение еще раз. Если при опи­ сании реализации другому разработчику она кажется сложной, скорее всего так и есть. Нако­ нец, при создании кода разработчик имеет некоторые предположения о состоянии приложе­ ния, входных парам:етрах и результатах. Вставьте проверку этих предположений в код при­ ложения. В процессе создания кода для каждого такого предположения добавьте вызов .метода Debug. Assert или воспользуйтесь инструментарием, который рассматривался в главе 7.' Че­ рез месяц, неделю, день или даже час эти предположения забудутся. Хорошим правилом явля­ ется составление имен методов из существительного и глагола. Имя должно описывать назна­ чение метода. При этом метод должен состоять из небольшого количества строк кода и со­ держать проверки предположений. Знаменитый Дэйв Тилен (Dave Thielen) сказал: "Про­ верьте, что мир существует!" - а уважаемый Джувал Лоуи (Juval Lowy) предложил еще одно правило: "Добавляйте оператор aAssert к каждым пяти строкам кода" . Резюме В результате одного очень дорогого исследования (уже невозможно вспомнить, о чем было это исследование) было получено следующее правило: для творческого мышления в пределах определенной профессии необходимо досконально изучить язык этой профес­ сии. Это совершенно справедливо по отношению к программированию. Разработчик должен изучить грамматические особенности языка для творческого создания решений.
206 Глава8 , При этом необходимо освоить инфраструктуру и инструменты , которые предоставляют­ ся данным ЯЗЫКОМ , Нет ничего сложного в создании простой функции или пары функций. Но создание целого решения может потребовать значительных трудозатрат. Описанные в главе 7 стратегии и в этой главе инструменты помогут изучить возможности редактора VВЕ. Кроме освоения возможностей VBE, языка Visual Basic и Инфраструктур VВА, Excel и Office, стоит обратить внимание на шаблоны проектирования и методы рефакторинга кода, Хотя эти темы выходят за пределы рассматриваемых в данной книге вопросов, они могут оказаться очень полезны при решении сложных проблем . Они не нужны при реа­ лизации простой функциональности для листов, но превращение нескольких строк VВА в произведение искусства требует совершенно другого подхода. !•
Диалоговые окна UserForm Строки, столбцы и ячейки предоставляют возможность ввода информации, однако не являются лучшим средством для решения этой задачи. Диалоговые окна UserFoгm пред­ ставляют собой основу, позволяющую со.здавать визуальные метафоры, которые помога­ ют пользователям вводить данные. Для добавления диалогового окна UserFoгm (которое будет применяться в качестве ос­ новы для визуальных метафор) можно воспользоваться командой меню ViewqUserForm (BидqUserForm). Метафора рисования поддерживается диалоговым окном (холст) и воз­ можностью перетаскивания элементов управления на пустое диалого~ое окно (рисование). Доступные элементы управления показаны на панели инструментов Toolbox (Элементы управления). Формы и добавляемые элементы управления имеют определенные методы, свойства и события, позволяющие управлять взаимодействием пользователя и кода. Внеш­ ний вид, возможности и реакции диалогового окна ограничиваются только фантазией раз­ работчика. Отображение диа.11огового окна UserForm Принцип работы приложений пакетной обработки с,11ожился исторически и заключа­ ется в получении нескольких аргументов, обработка которых приводит к определенному результату. Метафора оконного интерфейса значительно расширила возможности разра­ ботчиков, превратив линейную пакетную обработку в динамический массив оппортуни­ стических переходов с целым набором возможных результатов. То есть, оконный ин­ терфейс позволил добиться большей гибкости приложений. Для использования преимуществ оконной метафоры достаточно добавить в книгу диалоговое окно UserForm. В книгу можно добавлять любое количество диалоговых окон. Количество и порядок отображаемых диалоговых окон отражают ограничения и возможности книги как приложения Windows. Управление этими возможностями .осу-
208 Глава 9 ществляется через загрузку, отображение, сокрытие и выгрузку диалоговых oкoнUserForm в результате действий пользователя. Чтобы загрузить диалоговое окно UserForm; которое называется UserForml (имя, принятое по умолчанию), в память без отображения на экране, можно воспользоваться оператором Load: Для выгрузки диалогового окна UserForml из памяти можно воспользоваться опера­ тором UnLoad: :Unt.O:~sCQ§§r:FoiJi'I ;:'~::· ···········= ·· · · · ·· '" " ' '" Для вывода диалогового окна UserForml на экран необходимо воспользоваться ме­ тодом Show объекта UserForm: Если вывести на экран диалоговое окно, которое еще не было загружено в память, оно загрузится автоматичеС!fИ. Метод Hide позволяет скрыть диалоговое окно, не выгружая его из памяти, например: На рис. 9.1 показан пример диалогового окна UэerForm, которое будет разрабаты­ ваться на протяжении этой главы. Дэ,нное диалоговое окно предназначено для просмот­ ра и изменения значений в ячейках В2:Вб и непосредственно связано с ячейками листа, поэтому для' его настройки требуется минимальный объем кода VВА. Рис. 9.1 . Пример диалогового 01C1ta UserForm Дирtкuи" Комnь.Отерн"~й отд От.цtл лоrистики От1.tл к.;~дрое Про1-13 10ДС Т80 ~~~:~т;;;рЮоток ~
Диалоговые окна UserForm 209 На лист добавлена командная кнопка ActiveX с надписью "Показать окно". С кнопкой связана следующая процедура: Pi~.va te~~:'vsuь~·~.co:mmana.в·uEEOn~:c1 I 'c1C'(') ,}~,·c,w-~ Persona1J)ata.Show По умолчанию при вызове метода Show выводится модальное диалоговое окно. Это знач:qт, что пока диалоговое окно UserForm не будет скрыто или выгружено из памяти, оно сохранит фокус, из-за чего пользователь не сможет взаимодействовать с другими час­ тями Excel. В эrпой главе будуrп раа;.маrприваrпъся не.модалънъ~е диалоговъ~е 01Сна UserForm, позво­ ляющие полъзоваrпелю въ~полняrпъ другие зада'Чи, даже если диалоговое О'КНО ocrnaerncя на экране. Создание диалогового окна UserForm Диалоговые окна UserForm проектируются в редакторе VВЕ. На рис. 9.2 показана среда проектирования в редакторе VВЕ в процессе создания диалогового окна UserForm Личные данные. AcrobatPDFWritt::r (PDFWriter.нla) Е=·· ~ YBAProject (Userforml.нls) l7.:.. 6 .'s Мicrosoft Excet OЬjects · · · Qj Sheet! (Sreet l) · · · Qj Sheet2 (Sheet2) •· ~ SheetЗ (SheetЗ) :. iJ. ThisWorkЬook 8-;5 Forms ' ·· ti ~~rsonaЬata Per~onalD&ta. ShoY End SuЬ Рис. 9.2. Редактирование диGJ1огового О1С/Ш UserForm
210 Глава 9 Принятое по умолчанию имя диалогового окна UserForrnl было изменено на PersonalData. Для . этого нужно поменять значение первого свойства (Narne) в окне Properties (Свойства). Свойству Caption необходимо присвоить значение Личные данные. Элементы управления добавляются из панелиТооlВох (Элементы управления). В верхней части диалогового окна находятся два элемента управления TextBox, ко­ торые предназначены для ввода имени и возраста. Кроме этого, доступны два переклю­ чателя (Мужской и Женский), заключенные в элемент управления фрейма. Для создания такого фрейма сначала добавьте элемент управления Frarne, а потом - элементы управ­ ления OptionButtons. Кроме этого, в диалоговом окне PersonalData присутствует флажок CheckBox для указания семейного положения и список ListBox для выбора от­ дела. Кнопка CornrnandBut ton содержит надпись ОК. Имеет смысл использовать описательные имена элементов управления, взаимодей­ ствующих с кодом. Например, поле ввода TextBox, в которое будет вводиться имя, мож­ но назвать Narne. Если имя должно отражать класс элемента управления, в имя можно включить дополнительную информацию. Тогда поле ввода TextBox, в которое вводится имя, будет называться NarneTextBox или TextBoxNarne. Имя NarneTextBox проще чи­ тать, но вариант TextBoxNarne позволяет сортировать по классу элементы управления в окне Properties (Свойства). Главное, придерживаться одного соглашения по именованию . С точки зрения авторов этой книги возможность сортировки элементов управления по классу в окне Properties (Свойства) более важна, поэтому поле ввода называется TextBoxNarne. Для связи данных с листа с элементом управления TextBoxNarne свойст­ во ControlSource установлено в значение Sheetl ! В2. В следующей таблице показаны изменения, которые были внесены в свойства каждого элемента управления, располо­ женного в диалоговом окне PersonalData. Элемент управления TextBox TextBox OptionButton OptionButton CheckBox ListBox CommandButton Имя TextBoxName TextBoxAge OptionButtonMale OptionButtonFemale CheckBoxMarried ListBoxDepartment CommandButtonOK Свойство Contro/Source sheetl!B2 Sheetl!ВЗ Sheetl!C4 Sheetl !D4 Sheet l!B5 Назначив свойству ControlSource адрес ячейки на листе, можно связать элемент управления и ячейку. В результате формируется симметричная связь. Любое изменение ячейки оказывает влияние на элемент управления и любое изменение элемента управле­ ния меняет содержимое ячейки. Описательные названия слева от полей ввода TextBox и над списком ListBox соз­ даются с помощью элементов управления Label. Свойству Caption элементов управле­ ния Label присвоены значения Имя, Возраст и Подразделение. Свойству Caption фрейма вокруг переключателей присвоено значение Пол, а свойства Caption переклю­ чателей ВJ!}'Три фрейма имеют значения Мужской и Женский. Свойство Capt.ion флаж­ ка установлено в значение Женат/Замужем. f
ДиалоговБ1е окна UserForm 211 Переключатели внутри фрейма не могут быть связаны с ячейкой В4. Непосредствен­ ное отображение значения переключателя не имеет смысла, поэтому функция IF в ячей­ ке В4 выполняет преобразование значения True или False из ячейки С4 в строку · "Мужчина" или "Женщина". Хотя для получения необходимого результата достаточно установить значение в ячейке С4, для правильного отображения переключателей при выводе диалогового окна их необ­ ходимо связать с разными ячейками. Свойство RowSource элемента управления ListBoxDepartment установлено в значе­ ние Sheetl !All: А18. Вместо абсолютной адресации, как показано здесь, желательно на­ значать имена связанным ячейкам и использовать эти имена в cвoйcтвaxControlSource. Но в данном случае дополнительный этап создания имен ячеек был пропущен для упроще­ ·ния примера. Следующая процедура обработки события Click связана с кнопкой и находится в мо­ дуле кода диалогового окна UserForm: -!?rlva·t~ siiь ' ёommand.вuttonoк_:::cii'ck-0_, . ,,. ... - . _, , , Call Unload (Ме) Ме яв:11яется указателем на объект u .serForm, в котором хранится этот код. Указатель Ме может использоваться в любом модуле класса для ссылки на объект данного класса. Если элементы управления должны быть доступны из кода VВА позднее, то для сокрытия диалогового окна, не выгружая его из памяти, необходимо использовать метод Hide. Ес­ ли uрименить метод Unload, диалоговое окно выгружается из памяти и значения эле­ ментов управления становятся недоступны . Примеры использования метода Hide пока­ заны ниже . Щелчок на кнопке [х] в верхнем правом углу диалогового окна UserForm также поз­ воляет закрыть диалоговое окно. При этом оно выгружается из памяти. Непосредственный доступ к элементам управления диалогового окна Связы~ание элементов управления диалогового окна с ячейками' не всегда является луч­ шим. решением. Большая гибкость достигается через непосредственный доступ _ 1<. эле­ ментам упра11ления диалогового окна UserForm. На рис. 9·.З показана модифицированная версия предыдущего примера. На экран выводнтся такое же · ДJ.fалоrовое окно, но да.н­ ные сохрi~няюiся в другой форме. Пол хранится в внде однобуквенного кода (М 1111'1 F). Название -подразделения (Department) хранится в виде двухбуквенноrо кода, как по!(аза.: но на рис. 9.3. В диалоговое окно была добавлена кнопка Отмена (Cancel) . Щелчок на ней позволяет отменить все изменения, которые были внесены пользователем. При этом автоматиче­ ское сохранение значений на листе не выполняется. Теперь в модуле кода диалогового окна PersonalData находится следующий код . ;option· E:x pllcit 1РuЬЦс Ca,n_celled As Bool~,e=at..n,""'"...,_._....,,,...,_ _... . .. .. . .. .. . ."". . . . . . . . .. . . . . . . . . ." .. ._" _,. .. ."-=•_, _._. .. ,,. _.. .. ,___. .
212 Глава 9 Private Sub Coппna:ndButtonCancel_Click() Cancelled = True Мe.Hide :End Sub ' private Sub CoппnandButtonOK_Click() Cancelled = Fal se · Me.Hide !§:ng _Su:Ь ,~ ,_ Рис. 9.3 . Модифицированная версия диалогового . 01сна UserForm Открытая переменная Cancelled используется для определения щелчка на кнопке Отмена (Cancel) . При щелчке на кнопке ОК переменной Cancelled присваивается зна­ чение False. При щелчке на кнопке Отмена (Cancel) переменной Cancelled присваи­ вается значение True. Щелчок на любой из кнопок приводит к сокрытию диалогового окна PersonalData без выгрузки из памяти. Следующая процедура также была добавле­ на в модуль кода диалогового окна Persona l Dat a . r Prlv~te, ··su:ь " userF'orin_r~·:ctia:ЧzeJj ~ Dirn Departmenti3. As \zaridnt •· i Departme nts , ;,, vв,д. . Array ( ,; дирекци . ·: комп!JЮтерный отдеЛ". , ':__ ', ' "Отд ел· лоrистики", "ОтдеЛ кадров" , · _ . "1IрояЗводств6 " ; .· _ ··: ~'Иi=iркетинг". , ·· ' - w"'Отдел ·р·азрабQТОК" . "отдел продаЖ" > ,;< ->( _ '),. :.-,':'/·'--:,.•~_',,. _, __ • ··:·· ---- .. _.•\:
i· .ьs ·11 ·., 11 HR '!., 11·мр;11 ; 11мк•1'; t'RD •' , l'SL '1') , DimData(8, 2)'As String DimI As Integer F·orI=ОТоТ Data( I , 0 ) Departments( I ) Next I For.I =О.То7 Data(I, 1) DepartmentCodes(I) Next ListBoxDepartment.List Data Диалоговые окна UserForm 213 Процедура обработки события UserForm_I nitiali z e запускается при загрузке диалогового окна в память. Это событие не возникает при сокрытии и повторном ото­ бражении диалогового окна. В данном случае процедура обработки события используется для наполнения списка Подразделен и е двумя столбцами данных. Первый столбед со­ держит имя отдела,. а второй - двухбуквенный код отдела. Depa r t ments и De part me ntCodes являются массивами и наполняются значениями стандартным способом. Для этого используется функция Array. Функция VВА. Arra y позволяет создать массив с индексацией начиная с О . Массив Data является динамиче­ ским массивом, а оператор Dim используется для установки размера массива Data в соот~ ветствии с размером массивов Departments и DepartmentCodes. В цикле For . . . Next коды и названия отделов занося тся в массив Data, кото ры й используется для инициализации списка. При желании список названий и кодов отделов можно хранить на листе и устанавливать свойство RowSource списка равным диапазону листа. Такое решение было показано в предыдущем примере в этой главе . При использовании списка ListBox с несколькими столбцами необходимо указать, ка­ кой столбец будет отображаться в связанной ячейке и возвращаться в качестве значения свойства Value. Это так называемый связанный столбец. Свойство BoundColumn списка ListBox (Подразделение) установлено в значение 1. Возможные значения свойства начи­ наются с 1, поэтому связанным считается столбец с_ кодами отделов . Так как в списке суще­ ствует два столбца с данными, свойство ColumnCou nt установлено в значение 2. Из-за произвольной ширины списка в примере виден только один столбец. Для указа­ ния ширины каждого столбца списка можно воспользоваться списком значений, разде­ ленных точкой с запятой. Например, для сокрытия первого столбца и установки ширины второго столбца в 80 пикселей свойство ColumnWidth необходимо установить в значе­ ние 0;80. В данной реализации отображается полное имя и скрываются коды отделов, поэтому свойство Co l umnW idth установлено в значение 93;0. Следующий код находится в модуле кода листа Sheet1 : Е optl.on. Б:xpHC:it. !2: ) : Private S ub CommandButtonl_Click() 4: Dim RangeData As Range :? :, Dim D~_ta А.~ Varia_p.~
214 '6~ ;7: ,8: :9: '10: 11: )2: •1:4: '15: ' 16: :17: )8: ' 19.: Глава 9 Set RangeData = Range("Database") .Rows(2) ·Data = RangeData.Value , PersonalData.TextBoxName Data(l, - 1) Pe~sonalData.TextBoxAge = . Data(l, 2) Case нр11 PersonalData.OptionButtonFernale-. value Case t1M 11 PersonalData .OptionButtonМa1e = True' End Select · True 20: Personalbata.Checkвoxмarried.Value · Dat.a(l, 4J ;'21: '' . . .< ;22: · Persona.lData. Show ;23: If (Not Pers6na1Data. Cancelled) Thep ,24: Data (1, 1) PersonalData. TextBoxNaroe , :25: Data(l; 2) = PersonalData.тextBoxAge :26: ;27: i:28: 29: 30: 31: ' 32: ,33: •34: .,,. ' 35-, ;36: ;37: ' select · case тrue Case PersonalData . OptiopBut_tonFemale. Value Data(l, 3) = "F" , .. ,,_ .· Case Persona,lData. OptionButtбnмale ' . value : · Data(l, ·3)' = "М" Erid Select . Data (1, . 4). - P,e;so,nalData'. cьeckBoxмa~ried.Value. Data( 1, 5) Person:a1Data . ListBpxDepartment . .тех't RangeData. Value .,;, Ьа ta · · · '\" 'Бnd·:i:f ' ;з8: 39: 6'a.l1 Unlo«э.d(P,elfsori~lData\ 149.' : __ E .q(l_ _ .,S\lP..... '·"·······~-,,;.,"../ •.•... ~....... " . Номера строк добавлены из-за большой длины листинга. При вводе этого кода в ре - дакторе VВЕ номера строк вводить не нужно. _ В строке 4 объявляется дИ:апазон, а в строке 5 - переменная типа Variant . В строке 7 считывается диапазон Database и выделяется строка 2 этого диапазона. Значение диа­ пазона присваивается переменной Data типа Variant. Фактически, значения с . листа Sheetl были скопированы в локальный массив. В строках 10 и 11 выполняется копиро­ вание имени и возраста в соответствующие элементы управления диалогового окна. Оператор Select Case в строках с 13 по 18 .проверяет, принадлежат ли данные мужчи­ не или женщине, и устанавливает соответствующий переключатель на диалоговом окне. Достаточно Изменить значение одного переключателя, так как использование фрейма позволяет рассматривать переключат.ели как группу. При этом в группе может быть уста­ новлен то.;.~ько один переключатель. В строке 20·флажок устанавливается в соответствии с семейным статусом. К моменту выполнения оператора из строки 22 все данные уже были скопированы в диалоговое окно PersonalData, и оператор в строке 22 выводит диалоговое окно на экран. Если пользователь щелкнет на кнопке ОК, условие в строке 23 запускает копиро­ вание значений с диал9г9вого окна PersonalData в поля листа. Наконец, диалоговое окно выгружается из ~;rамяти. После разделения листа и диалогового окна пользователь получает возможность отмены внесенных изменений.
Диалоговые окна UserForm 215 Отключение кнопкиЗакрыть Одной из проблем показанного выше кода является возможность щелчка на кнопке Закрыть (Close) (кнопка [х) в верхнем правом углу диалогового окна) . При этом проце­ дура обработки событий не завершает работу и копирует изменения на лист. Это связано - с тем, что по умолчанию переменная Cancelled имеет значение False. Обычно щелчок на кнопке [х] приводит к выгрузке формы, а значит, неудачным попыткам кода получить доступ к элементам управления диалогового окна. В следующем примере используется процедура обработки события QueryClose. Она позволяет защитить диалоговое окно от закрытия " когда пользователь щелкает на кнопке [х). Процедуру обработки события QueryClose можно применить для определения ис­ точника команды на закрытие и для отмены данного события при необходимости. До­ бавление следующего кода в модуль кода диалогового окна PersonalData позволяет от­ ключить кнопку Закрыть (Close) . [i'J:Tvate "siJЪ - ·userF'orffi_QilerYёi ose (ёanc~eY-ii:s-~:filteger . _· -:с 10"S емоае ! · Ifi closeMode = " vbFormControlM_enu Theh · · caricel = True Веер , · Событие QueryC_lose возникает в четырех случаях. Причину его возникновения можно определить через сравнение параметра CloseMode со следующими встроенными константами: Константа Значение Причина возникновения события VbFormcontrolMenu О Пользователь щелкнул на кнопке [х] в менiо управления VbFormCode VbAppWindows VbAppTaskManager 2 3 Для выгрузки диалогового окна из памяти использован вызов Unload Завершение операционной системы Windows Приложение закрывается средствами Диспетчера задач Windows (W in dows Task Manager) · Поддержка списка данных Разработанный код можно расширить без дополнительных усилий для поддержки списка данных. Но в последнем примере использован другой подход . В этот раз весь код встроен в диалоговое окно PersonalData. В модуле кода листа хранится только код ко­ мандной кнопки, щелчок на которой приводит к отображению диалогового окна. Код ~нопки будет выглядеть следующим образом: tPr ivafe%'suьcoffimari'dвU-Etoni_cй ck:TY . "? " ' ·PersorialDati;J.. Show :~Р.-9, ...-.е~Р~--.; ~.: .. -~-~~h1~..,1'.->.4<~ .. ;: r__ ___ ~"" ,, ..• ~:.. ..ц. .-~--~-·-- Нам1I0го проще х-ршнитъ даннъtе в обычнай СУБД, например MU:rosoft Access. Но если перед пршwжени.ем не спwят особые требования, даннъ11J мож1W х-ранитъ на листе.
216 Глава 9 ЕсЛи необходимо управлять бо.Л,ее чем одной строкой данных, потребуетGя механизм добавления новых строк, удаления сущес твующих и перемещения по строкам. При этом в диалоговое окно Per~onalData придется добавить дополнительные элементы управ­ ления, показанные на рис. 9.4 . Были добавлены четыре кнопки, а список заменен на комбинированный. Кнопка Предыдущая запись используется для перемещения к предыдущей строке на листе . Кнопка Следующая запись применяется для перемещения к следующей строке на листе . Кнопка Новая запись необ ходима для добавления строк на лист, а кнопка Удалить запись - для удаления строк с листа. Элемент управления СоmЬоВох используется для демонстрации альтернативного способа выбора элементов списка. ........." ...." .•... .....:.. ..•" ........... .. ····-·,;·м1)~.•1!i§~t?..<§~§tt;i. Готово .~>;;J~ •N ...,," • '" Рис. 9.4. Дополнительные элементы управления в диалоговом окне Ниже рассматривается код диалогового окна PersonalData. Важно обратить вни­ мание, что в начале модуля этого кода объявлены следующие переменные уровня модуля: G:я.т~ ~a.Rang'eba fa:~·:As: .Ra:ng.e P~iJ113PёJ.;~9' ~J1:9 ,J!ёJ.;r:;i_ёJ.Чt... •. , _, Эти переменные используются так Же, как и в предыдущем примере. При этом можно менять ссылку на строку. Объектная перемен,ная RangeData всегда указывает на текущую строку с данными в ди'апазоне Database. Имя Database присвоено диапазону A l:Ell. Переменная Data всегда хранит значения диапазона RangeData в 'виде массива VВА. Код процедуры обработки событий командной кнопки из предыдущего примера был преобразован в две вспомогательные процедуры, которые хранятся в модуле кода диало­ гового окна PersonalData. J:PriV:&t:~e "'sиь r.;c;a.c1-Rёcoic1 л· ; ,,. ' 0С:коriирОВ<f!ТЬ значения ИЗ Rang~Data На ' листе Data ·· = '- :В.aпgeDёita .. Value . · · _ , ''t ''':"' · ' Присвоить масс;ив значений элементаМ' управлени!'! Personal .. Te,~t-~o:x:N.ame,,_ V_21Чe Data (],, 1)
Select Cas~ Data(l, 3) Case 11F 11 . OptionButtonFemale . Value True Case _11 М 11 OptionButtonMale.Value True . End Select CheckBoxMarried.Value = Data(l, 4) ComЬoBoxDepartment.Value = Data(l, 5) :Pri va te Sub SaveRecord ( ) Диалоговые окна UserForm 217 ' Скопировать значения из элементов управления Personal ' в массив Data Data( l, 1) TextBoxName.Value Data (1<. , 2) = TextBoxAge. Value Select Case True Case OptionButtonFemale.Value Data(1, 3) = ".F" Case OptionButtonMale.Value Data(l, 31 = "м" End Select Data(l, 4) Data(l, 5) CheckBoxМarried . Value ComboBoxDepartment.Value ' Присвоить значения из ' в диапазоне Database ; RangeData.Value = Data J;i:.io. ?_1:!0~ . ... .м.. ' массива Data текущей записи Так как этот код хранится в модуле кода диалогового окна PersonalData, ссылки на PersonalData при обращении к элементам управления необязательны. Только процедуры Load.Record и SaveRecord связаны со структурой данных и с эле­ ментами управления. Пока список данных называется Database, ни один фрагмент кода диалогового окна PersonalData не потребует внесения изменений при добавлении или удалении полей в набор данных . Кроме этого, данный код можно использовать вместе с другим набором данных. При этом достаточно будет перепроектировать элементы управ­ ления диалогового окна и модифицировать подпрограммы Load.Record и SaveRecord. Главным элементом навигац"ии в окне Pe r sonalData является полоса . прокрутки, которая называется Navigator: Она используется другими кнопками для смены записи. Кроме того, полоса прокрутки доступна пользователю непосредственно. СвойствоVаluе элемента управления Navigator соответствует номеру строки в диапазоне Da tabase. ' P"riva t.e ·· s uь Navigator_ cl:iange 1У • ., ' ' При изменении значения полосы про.крутки сохранить ' текущую запись и загрузить ' запись, номер которой соответствует текущему ' значению nолосы прокрутки Call SaveRecord Set RangeData = Range("Database") .Rows(Navigator.Value) Call LoadRecord Er..id Si,;)?.
218 Глава 9 Если пользователь меняет значение свойства Navigator. Value (или значение свойства меняется в результате работы процедуры обработки события), то возникает со­ бытие Change, и текущая запись из диалогового окна PersonalData сохраняется на листе. При этом переменная RangeData переопределяется и указывает на строку диапа­ зона Da.tabase, которая соответствует новому значению свойства Navigator. Value. После этого новiя строка загружается в диалоговое окно PersonalData. В этот раз в процедуру обработки события UserForm_Initialize внесены измене­ ния. В данном случае процедура устанавливает правильное начальное значение перемен­ ной sbNavigator: iPr1V:aEe~suJ?'useriiarт:ш:гt:гa:1т-z:eтг"_,,_.,_....,.7·~·~. · · ''Ус.тq,.навливает списо'К значении Department . ' · ·И ' загружает перву:р 'iзап:Ись из диапаз'она DataJщse , DiщDepartmen'tcode ..As va,riant ' · . Dim ' Depa~tmentЦ.st О ., As String Dim I ." As Integer · bepaтtm~nt;.Code ircR~.'' - :.•,ps", 11HR" j l'MFi' .;. ,.._,м:к·' \, '~~D"i , ~ ".Sμ"' '~NA") ReDim 'Depar~mentLi.st (0 .. То . UBoш;d(DepartmentCode)) Загрузить 11ервуiо запись из диапаэон'а "11 инициализировать дО'лосу Wi th' Range ( "Database!") , · set· RangeData ·= .•: !Zows (2 J · ··· ci:i;Ll LoadRecora""'' { ·. ' . . Naviga,tor. Value· Navigator.Max = ! End With .. fE:nc'J.,.s.11ь """"' ""·"°···· " После инициализации свойства CornЬoBoxDepartrnent. List код инициализирует пере­ менную RangeData, чтобы она указывала на вторую строку в диапазоне Database. Вторая строка диапазона содержит первую строку данных сразу после названий полей, которые рас­ положены в первой строке. Данные из второй строки диапазона загружаются в диалоговое ок­ но PersonalData. После этого свойство Value объекта Navigator устанавливается рав­ ным двум, а свойство Мах объекта Navigator- равным количеству строк в диапазоне Database. Перемещение бегунка полосы прокрутки позволяет получать доступ ко всем стро­ кам диапазона Database, начиная со второй строки. Процедура обработки события Click для кнопки Следующая запись (Next Record) выглядит следующ~м образом:
Диалоговые окна U serF orm 219 ;p:r:tvaE~~ sи'JJ ~comп)anaвu. t:t0п2 :.ciicJC{T -- ". · ·· ·· " ·· ~ ·Wi t .h Ran'ge ( "Da tabase" ) . . :;: 'J:f Range,Data.Row < ; .Rows( .Rows.Count) .Row Th.en 'Загрузить следующую запись, если эт9 не ·последняя защ1сь :~avigator. Value = Navigator. Value + 1 / •Обратите . вниманИе: установка свойства Navigator.V:alue •к запуску пр6цедурЬI · обработки события .Change '· End.I{ . . t~~g;~~~~~.t.~:. '"~ ~-~;~.'~'·'·"'* ,i,;~,·~· - - --·-"·'~····-·~"· ~ . ... "." .. "-'-*···~· .. .~ "'-~·'·~ ,,,~..___ : ... .. ,.. ""' -»f Условный опер'атор If сравнивает текущий номер строки в диапазоне Database с номером последней строки диапазона. Эта проверка позволяет защитить пользователя от перехода за пределы диапазона . Если перемещение еще возможно, значение объекта Navigator увеличивается на единицу. Это изменение Приводит к появлению события Change для объекта Navigator. При этом в соответствующей строке диапазона сохра­ няются текущие данные из диалогового окна, сбрасывается значение переменной RangeData и в диалоговое окно загружаются данные из следующей строки. Код обработки события для кнопки Предыдущая запись (Pievious Recoid) выглядит так же, как И код кнопки Следующая запись (Next Recoгd) . (Здесь для разнообразия по­ казан код процедуры без использования оператора Wi th.) )i'fivate · suЬ ё ornmanciвuftoni~clici<{ )' ".. . Г If RangeData.Row > Range("Database") .Rows(2) .Row Then t· 'Загруsить предЬiдущую запись, если это не первая запись. Navigator.Value = Navigator.Value - 1 " Обратите · внимание: установка свойства Navigator.Value .' · приводит к запуску процедуры обработки события Change ~. End If ~Е..щl;,.§.н!?. ~=-. Эта проверка позволяет защитить пользователя от перехода выше второй строки диапа­ зона Database. Условный оператор If, сравнивающий номер текущей строки с границами диапазона, мог быть реализован с помощью свойств Va lue, Мах и Min полосы прокрутки Navigator, но здесь реализован метод определения номера последней строки именован­ ного диапазона. Иногда этот прием оказывается очень полезной. Проверки в данном случае обязательны. Если установить значение свойства Navigator. Value больше значения свойства Мах или меньше значения свойства Min диапазона, приложение выдаст сообще­ ние об ошибке времени выполнения. Ниже показан код обработки события для кнопки Удалить запись (Delete Recoid) . Цfiri vate'lf"stiБ coiiiiitand.вiiП'On(_clickЛ ,". _ __ _ _ - !.... ' · Удаляет 1'екущую запись в PersonalData /!'·~ r'f Range("Database'' ) .Rows.Count ,= 2 Then. ~.· . , Не удалять, если осталась только одна запись ' MsgBox "Удаление всех записей невозможно", vbCrit ical &. Exit Sub r E.).seif R·angeData.Row = Range( 11 Database 1') .Rows(2) .Row Then .' Если т.екУIЦей является первая запись, переместиться ' на qдну зап Ись ниже и удалить первую запись 'сместив нижние строки для заполнения. пустоты Set RangeData = RangeData.Offset(l) Rari.geData.Offset(-1) .Delete shift:=xlUp Call LoadRecord Else ,i ' Если запись не первая, перед удалением перейти на следующую запись N~_yig:e. ~o:;:.,~_lц...,e_ = J::!avig:ator ".V<1.J1:!.~ - ~ " м"".~•.
220 Глава 9 'Обратите внИМание: ·установка·· значения sbNavlgator.\iaiue приводи~ 'к запуску процедуры обработки события Change RangeData.Offset(l) .Delete -shift:=xlUp End If. Navigator.Max = Navigator.Max :., 1 Е!1§_, ?u}) ."м .•; .• " ·•··"'·"····"· ·=·• ·=• '· • • На эту процедуру возложены следующие задачи: О процедура завершает выполнение при попытке удаления последней записи в диа· пазоне Database; О при попытке удаления первой записи полю RangeDa ta присваивается ссылка на вторую запись. Значение свойства Navigator :Value не сбрасывается, так как по­ сле удаления строки 1строка2 превращается в строку 1. ПpoцeдypaLoadRecord вы· зывается для загрузки данных из строки RangeData в диалоговое окно UserForm; О при удалении не первой записи значение cвoйcтвaNavigator. Value уменьшается на единицу. При этом в диалоговое окно UserFoгш загружается <;ледующая запись; О в завершение процедуры счетчик количества строк в диапазоне Database, кото­ рый хранится в свойстве Naviga tor. Мах, уменьшается на единицу. Ниже показан код процедуры обработки события для_ кнопки Новая запись (New Recoгd). :.I>r:i. va: t:€гsиь~ coЛuiiandвtit:t:oiiз::J:I}:'ck'CГ ..· 1 ' Добав11ть новую запись в ; конец базы данных Dim RowCount As Integer 1 • м Wi th 1 Range ("Database") Добавить стрс)ку; в . базу Rowcoun t .= . Rows :count .+ .Resize(RowCou:nt).Naroe · ; "Database" Navigator.Max· = iRowc9urtt · Navigat6:t. vaiue = iRowCount , ., · ' Обратите .• вн1!1Мание : •· · · ' приводит к запуску End Witfi ' •.. УстаНОВКёl / Э!iё\Чеf!И OptionButto11Male.Va . . t1 • >· ·• ... cьeckвoxмarried :: ·_False , CheckвoxDepart;:ment. va1U:e 1End Sub В этой процедуре обработки события переменной RowCount присваивается значе­ ние, на единицу превышающее количество строк в диапазоне Database. После этого гене­ рируется ссылка на диапазон с большим количеством строк, чем в диапазоне Databas_e, и имя Database присваивается новому диапазону. После этого значение переменной RowCount присваивается свойству Value и свойству Мах объекта Navigator. При этом новая пустая строка становится текущей и в диалоговое окно PersonalData загружают­ ся пустые значения. При этом некоторые элементы управления диалогового окна полу­ чают принятые по умолчанию значения. Осталось рассмотреть код обработки событий для кнопок ОК и Отмена (Cancel).
Диалоговые окна UserForm 221 .. )3u1::Г :Private sць coffima:ndвuttorio~:._c1ick ( canCelled = Fa1s~ · Обе процедуры выгружают диалоговое окно PersonalData из памяти. При этом Щелчок на кнопке ОК приводит к сохран.ению изменений из диалогового окна UserForm в текущую строку диапазона. Немодальные диалоговые окна UserForm В Excel 2000, Excel 2002 и Excel 2003 предоставляется возможность вывода немо­ дальных диалоговых окон UserForm. Модальные диалоговые окна UserForm, которые рассматривались до этого, не поддерживали переключение фокуса, пока диалоговое окно отображается на экране. При этом, если не скрыть или не выгрузить диалоговое окно из памяти, нельзя было активизировать листы, меню или панели инструментов. Если в процедуре для вывода диалогового окна используется вызов метода Show, пока диало­ говое окно не будет скрыто или выгружено из памяти, операторы после вызова метода Show выполняться не будут: Немодальные диалоговые окна UserForm позволяют активизировать листы, меню и панели инструментов. Немодальное диалоговое окно остается на переднем плане , по.ка не будет скрыто или выгружено из п амяти. Если в процедуре для вывода диалогового ок­ на используется метод Show, операторы после вызова метода Show будут выполняться немедленно после вызова метода. Диалоговое окно PersonalData из предыдущего примера также можно вывести в качестве немодального диалогового окна. Для этого дос­ таточно внести следующее изменение в код: Priv ate sub Comma ndButtoni _ ciJ_ck: () • Call .PersonalData (vbModeless) J:nd sub ~ ,,~ Iipи отображении немодального диалогового окна UserForm можно выполнять дру­ гие задачи. Поддерживается даже копирование данных между полями ввода в диалого­ вом окне и ячейками листа. , Важно отметить, что в последнем примере лист не связывается с диалоговым окном. Данные копируются из листа по требованию. То есть, если вывести немодальное диало­ говое окно PersonalData и изменить данные на листе, то это изменение не будет авто­ матически отражено в диалоговом окне. В данном случае потребуется создание механиз­ ма уведомления диалогового окна UserForm о модификации данных на листе. Сможете придумать способ обновления диалогового окна UserForm в случае изменения данных на листе? (Вот подсказка: обратите внимание на событиеСhаngе объекта Worksheet.) Резюме В этой главе рассматривалось, как создавать и использовать модальные и немодаль­ ные диалоговые окна. На примерах было продемонстрировано, как ссылаться на данные в диапазонах листа или копировать данные из диапазонов . Несколько обработчиков со-
222 Глава 9 бытий применялись для добавления и удаления данных с листа электронной таблицы, что позволило использовать лист в качестве базы данных. · В любом случае, электронная таблица хорошо подходит для управления данными и числами в ячейках, но намного слабее справляется с обязанностями базы данных. Сложность заключается в том, что технологии баз данных значительно ' развились за по­ следние десять лет и теперь поддерживают проверку действительности, ограничения, сложные отношения, индексацию, возможности поиска и другие возможности . Если от приложения действительно требуется управление данными, стоит обратить внимание на базу данных Miciosoft Access. Существуют и другие поставщики баз данных, но язык VBA, который изучается в контексте Excel, работает и в Access. Кроме этого, Excel и Access могут взаимодействовать друг с другом средствами языка VВА. В связи с этим рекомендуется использовать Access для управления нечисловыми данными и Excel - для обработки чисел. При необходимости можно создать диалоговые окна и управлять именами и числами в Excel, но база данных Access намного лучше справляется с такими задачами . Однако в обработке чисел никому не превзойти Excel . Красота Miciosoft Office заключается в мощности и завершенности каждого отдельно­ го компонента. Кроме этого, любой компонент может общаться с-другими компонентами с помощью общего языка, VВА. Если воспринимать Excel, как мощный механизм обра­ ботки числовых данных и большой компонент, то его можно использовать для создания изолированных решений с применением диалоговых окон или в качестве мощного мате­ матического механизма для интегрированных решений уровня предприятия.
' Добавление элем·ентов управления Как было показано в главе 1, на листы Excel добавляются элементы управления двух ти­ пов. Можно использовать элементы управления ActiveX, которые доступны на панели ин­ струментов Элементы управления (Control Toolbox), или же элементы управления, дос­ тупные на панели инструментов Формы (Fo1·ms). Панель инструментов Формы (Fшms) бьта представлена в Excel 5 и Excel 95. Предоставленные на этой панели элементы управ­ ления предназначены для диалоговых листов, используемых в этих версиях Excel. Кроме того, такие элементы управления могут быть интегрированы в лист или диаграмму. После выхода Excel 97 вместо диалоговых листов можно применять диалоговые окна UserForm. В диалоговых окнах UserForm используются элементы управления ActiveX. Панели инструментов В Excel все еще поддерживаются диалоговые листы и элементы управления на панели инструментов Формы (Forms) (рис. 10.1). При этом элементы управления с панели Формы (Forms) обладают некоторыми преимуществами по сравнению с элементами управления ActiveX. Рис. 10.1. Панели иж:трументов Фо[Jмы и Элемен­ тыуnрШJЛенuя
224 Глава 10 Элементы управления с панели Формы (Forms) намного проще элементов управления . ActiveX. Кроме этого, в диаграммы можно встраивать только элементы управления с па­ нели Формы (Forms). Каждый из этих элементов реагирует только на одно событие. В большинстве случаев это событие Click. Исключением является поле ввода, которое реагирует на собьiтие Change. Если элемент управления и процедуры обработки событий необходимо определить не вручную, а в коде VВА, проще использовать элементы управления с панели Формы (Forms). Они обладают значительным преимуществом перед элементами управления Ac- tiveX, а именно: предоставляют возможнос ть размещения процедуры обработки события в стандартном модуле, поддерживают использование любого действительного имени процедурьr VВА и обеспечивают возможность создания процедуры в процессе написания кода приложения еще до создания элементов управления . Элемент управления можно создавать программно, как только в нем возникает необхо­ димость. При этом имя процедуры обработки события присваивается свойству OnAction элемента управления. Одну и ту же процедуру обработки события можно назначать не­ скольким элементам управления. С другой стороны, процедуры обработки событий эле­ ментов управления ActiveX должны храниться в модуле класса листа или диалогового окна UserForm, в которые они встроены. В этом случае имя процедуры обработки события должно состоять из имени элемента управления и имени события. Например, процедура обработки события Click элемента управления Option:Вuttonl определяется так: :~ub o:Qti.qnвy,f:t(:,n);c1}gJ<(J:: ., :'.,. ,...н,,;, При попытке создания процедуры обработки события до создания элемента управле­ ния ActiveX и попытке сослаться на элемент управления в .коде процедуры выдаются со­ общения об ошибках компиляции. В результате процедуры обработки событий придется создавать программно, а это далеко не тривиальная задача, как будет показано дальше. Кроме этого, в главе 14 приведен пример программного добавления процедуры обработ­ ки события к элементу управления в диалоговом oкнeUserForrn. С другой стороны, процедура обработки события д.Ля элемента управления с панели Формы (Forms) может иметь любое имя и для определения ссылки на вызвавший эле­ мент управления может использовать свойство Caller oбъeктaApplication. Как будет показано далее в этой главе, имя элемента управления не обязательно должно присутст­ вовать в имени процедуры обработки события или в ссылках на элемент управления. Элементы управления ActiveX На рис. 10.2 показано четыре типа встроенных в лист элементов управления ActiveX (книга Controls·. xls доступна для скачивания на -Сайте http : //www . wrox. сот). В данном случае реализованы следующие элементы управления: полоса прокрутки в ячейках C3:F3 устанавливает значение в ячейке В3, кнопки счетчика в ячейке С4 позво­ ляют увеличить процент роста в ячейке В4, установка флажка в ячейке В5 позволяет уве­ личить ставку налога в ячейке Вlб с 30% до 33%, а переключате..1Iь в столбце 1 позволяет изменить стоимость в ячейке В15. Кроме этого, переключатель дает возможность изме­ нить минимальное и максимальное значение полосы прокрутки.
Добавление элементов управления 225 _____ !>,______ :_ !!____ _!___g_____i__g _____l ____~___L_i::__L_Q___[ _ _ _ _ti____l_ _ __! ___i___J__~ 1. Amalgamated Fгult lnc. ··Планир ощик прибыли 'J -~ h 1 3 ! продажи за январь 1 4 ! Продажи Рост/Месяц 1 ...5._jУвеличенный нал ог? 6.1 7·1 ~ jПродажи iо ! цена 11 iПрибыль до налога ·1 ·2·1 Налог iЗ ! чистая прибыль 14 15 Фактор цены '"i'iП Ставка налоrа 17 1 30 ООО ...1J 1.00% _< ~i..2:...J г Янв Фев 21 764 21 982 12 405 12 530 9 359 9452 2 808 2 836 6 551 6 617 57% 30% Мар Anp Май 22201 22423 22 648 12655 12 781 12 909 9546 9642 9 739 2 864 2 893 2 922 6683 6749 6817 Рис. 1О.2. Использоваиие элементов управления ActiveX Июн Июл 22 874 23 103 13 038 13 169 9 836 9 934 2 951 2 980 6 885 6 954 r Мэ.нго· r личи r.~?i~~ьjJ \Р~ан Авг Сен 23 334 23 567 13 300 13433 10 034 10 134 3010 3040 7 024 7 094 ~. it:/6 Элемент управления ActiveX может быть связан с ячейкой на листе. Для этого исполь­ зуется свойство LinkedCell. В результате в ячейке всегда буд ет отображаться значение свойства Value об'J;>екта элемента управления . Ни один из элементов управления на рис. 10.2 не связан с ячейкой на листе, хотя полосу ч.rюкрутки можно было бы связать с ячейкой, так как значение этой полос.ы выводится в яч ейке В3 . Для обновления содер­ жимого ячеек в каждом элементе управления применяется процедура обработки собы­ тия. Такой подход позволяет добиться большей гибкости , чем при использовании про­ стой связи с ячейкой. При этом экономится ячейка листа. Полоса прокрутки Для вывода значения свойства Value в ячейке В3 полоса прокрутки использует про­ цедуры обработки событий Change и Scroll . Максимальное и минимальное значения полосы прокрутки устанавливаются с помощью переключателей (которые будут рассмат­ риваться ниже ) : ' i?r.ivate suь - scro1iвar1_ёh.ange ( j } Range ( "ВЗ") . Value · ScrolЦ3arl. Value :вnd suь l. \P;rivate Sub ScrollBarl_Scroll () · Scrol'lBarl_ Change ~F;pq S1:Ф. -· .. Процедура обработки события Change выполняется при изменении значения полосы прокрутки. Для этого нужно щелкнуть выше или ниже бегунка полосы прокрутки ( если используется горизонтальная полоса прокрутки, можно щелкать слева или справа) или перетащить ,его . Но сразу после использования переключателя возникает небольшая ошибка. Перетаскивание бегунка не приводит к появлению события Change при первой
226 Глава 10 попытке. Лишь использование процедуры обработки события Scroll приведет поведе­ ние полосы прокрутки в норму. Событие Scroll поддерживает постоянное обновление значения полосы прокрутки. • При этом можно наблюдать текущее значение при перетаскивании бегунка полосы про­ крутки. Использование процедуры обработки события Scroll на большом листе элек­ тронной таблицы с автоматическим пересчетом оказывается нецелесообразным, если приводит к частому пересчету большого количества ячеек. В показанной выше реализации обработка события Scroll выполняется через про­ цедуру обработки события Change (процедура обработки события Change вызывалась как обычный метод). В результате получится сходящийся код - одинаковое поведение описывается одними и теми же строками кода. Существует реализация, которая оказыва­ ется ,еще лучше. В ней поведение описывается в именованном методе и при обработке события вызывается этот метод. Такая реализация делает код более простым для чтения и понимания: i'ii.vat'e '..SЦь' ·scroITвari:.cH'гl:iige () :~· ..,.. .. . . Ca11 , SetRangeValue (Range ( "ВЗ "), •· ScrollBarl. End. Sub ·.' · ·. .. Private Sub. scr:ol1Bar1.: _scr.o .ll () ·Call Se.tRangeValue:.<Range("ВЗ"), :Бnd·• Sub ". <· Такой код связан с определенными накладными расходами за счет опосредованного вызова подпрограммы SetRangeValue, но в результате код становится более ясным, а изменение в подпрограмме SetRangeValue отражено во всех фрагментах кода, где ис­ пользуется эта подпрограмма. Важно помнить, что причиной создания этого кода явля­ ется попытка снижения стоимости владения, а не стоимости с точки зрения циклов цен­ трального процессора. Счетчик Элемент управления SpinButton применяет событ~я SpinDown и SpinUp для умень­ шения или увеличения значения ячейки В4. Для реализации поведения этого элемента управления используется прием, который применялся в конце предыдущего раздела: . ·· ,· здесь •. Иt:п"оЛЬ Эуётс;f''Ло,дПР'оГi)аЩ.1а"' .Sei:::Ra.ngevafue~J,e3 ':ripeдЬiдyЩёГ'o ,:·:· . ' " ·разделы ... ," ".",.· ·•...·:,··•" '. .•·.. ··,, ... ... . · ·Private J:?roperty ' Get: SpiriRangi{( ) ' .~~;·.,, · · set · sp:inRa.nge . =. Rarige{"B4 ;, End P:r-operty ' ·· i .·· :-. - . i. " (' . - .. ... ; ~Priva,t,e · Sub SpinBU:ttonl<.:..SpinUp () · ' <::ан · SetRaщr~vaHi.e ( spinRange , ;~ 'spinRahge:· v a:lue + а6Ь 5) J • .End Sup .,; :. ~ ,,",, ....."""·"'''"'""
Добавление элементов управления 227 Доступное только для чтения свойство SpinRange используется для того, чтобы заста­ вить методы, работающие с элементом управления SpinButton, обращаться к одному и тому же диапазону. События SpinUp и SpinDown реализованы через повторное использование метода SetRangeValue из предыдущего раздела . Функции Wo rksheetFunction.Max и WorksheetFunction. Min применяются для увеличения и уменьшения значения диапазо­ на на 0.0005 . Функция Мах ограничивает значение снизу на уровне О, а функцияМin ограни­ чивает значение сверху на уровне 1. Флажок Свойство CheckBox. va\ue будет равно True, если флажок устано~лен, и False, ес ­ ли флажок сброшен. В следующей процедуре обработки события Click реализовано пе­ реключение значения ячейки Вlб с 33% при установленом флажке на 30% при сброшен­ ном флажке: _ !, --, . ,..-•·-·.' •••- ' • •,,". •- .,,_~·- • .. , "'но · ~·'О<>'--' •• ~· ·-~· ,,. . ..,.,..,,,~ ••ц _.... ,.,.!"'"'" ;Private · Sub ' CheckBo:x'l~Click () If CheckBoxl. Value Then. Range ( "Вlб") . Vaiue .О. 33 Else · · _ Range ( "Вlб") . Value О. 3 End If ;E_np_ SU:l?c_ . • Существует более интересная реализация . Опытные программисты на языке С могут создать следующий код. Однако создания такого кода стоит избегать, так как он может скрыть смысл алгоритма, но все же стоит научиться понимать данный код. PX--i y~t e' sU:ь":'ctie ckiзoX.i.J::ii ci<:TГ"'"'" • ~- •· i'. ' ин ·тересная реализация ;.~ •• "B9:l1.9~ ( "J?-19'') ·. У?-).Ч~• .,;; ~J'::r::rc_э.y: (О .:.з.,.. Q . . , 3 3) . (АЬ_s (CheckBoxl. Va_l~e)) . "' Как создать самодокументированную версию первой процедуры обработки события Click? (Подсказка: создайте именованный метод , который описывает происходящее, то есть, переключает значение диапазонаRаngе ( "Вlб") .) Переключатель Событие Click является общим для многих элементов уп раления. Элемент управле­ ния OptionButton использует событие Click точно так же, как элемент управления CheckBox. Это событие возникает в результате нажатия и отпускания левой кнопки мы­ ши (или нажатия клавиши пробела? если фокус установлен на переключатель). В данном случае каждая процедура обработки события OptionButton. Click вызывает метод SetOption. Любая процедура обработки события OptionButton. Click реализована так же, как для элемента yпpaвлeнияOptionButtonl : ,J:>rivat.e suь ·ьi5t:i6riiзu~t:oii. 't:._cHck.П Call SetOptions() ·Еч?- .5-:ti:P. "'· ," .... .:. Обработка всех переключателей выirолняется в следующей процедуре. Эта процедура хранится в модуле класса листа Profi t, в котором расположены процедуры обработки событий OptionButton. Click: Private su:Ь setbptions ()
228 Глава 10 ) case' Ьi?tioЬ.вU:tEorii :va1i.ie Call setcostFactor\0.63) Call . SetScrollMinМax(50000, Ca,se OptionButton2 . .Value· CalLSetCostFattor(0 . 74) Call SetScro11MinМax(25000, case Opti6nвutton3.Value ·· Call SetCo'st.Fa.ctor(0.57) . . Call SetScrollMinMc;ix(lOOOO, case OptionButt;on4. value · Call SetCostFactor(0.65) Call SetScrollMiriMax(15000, ''E:nd Select п, ~- j'' i' IPrivate Property Get CostFactorRang,e() ~ .. Set CostFactorRange = Range ( " Bl 5 ") 'En~ ··. Property t' 150000) 75000) 30000) 30000) ;Pri.vate· Su,b . SetCщ;tFa,ctor (ByVal CostFactor As DouЫe) . Call Set;RangeValue (.CostFactorRange, C.ostFactor) !End Sub · {' fPrivate . Sub SetScrollMinMax(ByVal Min As Long, ByVal мах As .Long) 1- S<:E611Barl . Min = Min 1' ,, scrol lBarl .мах =мах i>_ .· ScrOl lBarl ,. :Y·a)~u.e._ = '-- Мах !!?P.sl;...$up~,· ,~ ... ~ ..м. "·'": .. ~ ' ,:".' :_ :_ , ( (Процедура SetRangeValue была позаимствована из предыдущих разделов.) Струк- тура Select Case применяется не обычным образом. Обычно ссылка на переменную используется в первой строке Select Case, а значения для сравнения указываются в строках Case. В данном случае в строке Select Case используется значение True, а ссылка на свойство Va l ue переключателей указываются в строках Case. Эта структура хорошо подходит для обработки набора переключателей, только один из к9торых может иметь значение True. На показанном выше листе только один переключатель имеет значение 'rrue, так как все переключатели объединены в группу. При добавлении переключателей на лист зна­ чение свойства GroupName устанавливается равным имени листа- Profit. Если необ­ ходимо создать : два набора независимых переключателей, переключателям из каждой группы придется назначить разное значение cвoйcтвaGroupName . . / Элементы управления с панели Формы (Forms) На рис. 10.3 показан элемент управления панели инструментов Формы (Forms), кото­ рый используется для выбора имени продукта в столбце D . Элемент управления появля­ ется при двойном щелчке на любой ячейке в этом столбце. При выборе продукта его имя вводится в ячейку, которая находится "под" элементом управления. При этом цена про­ дукта вводится в столбец F в той же строке, и элемент управления исчезает.
Добавление элементов управленця 229 Рис. 10.З. Элемент управления с панели Формы Если навести курсор на кнопку панели Формы (Fщms), позволяющую создать элемент управления, в появившейся экранной - подсказке элемент управления будет описан как комбинированный список (СоmЬоВох). В объектной модели Excel этот элемент управле­ ния называется раскрывающимся списком (DropDown). ;,·09"!>~кт DropDown . явл~ется ск~ыть1м членом Ъбъектной -~одели Exc~I 9j'. ~ боле'е . позд- ~· ннх 'версиj! . В сгiравочном руко-водстве отсутствуЮт с;татьИ об этом э/1ементе управf~ен'1я ·' ; и информация о нем не выводится в о~не Object Browser ' (Просмотр обЪектов) ; Дnя .. отображения информс:щии об о6ъекте DropDowri в окне ,Object .Browser (Просмот~ обЪ- ~ :. е~то.~>) · щелю1ите правой кнопкой мыши: в . окне Object Browser (Пр~смоф oб;i:-ik;oв) ~ вь16ерите пункт Show Hidden . Members (Отобразить скрь1тые комriоненты) ':fЗ к9нт~ к;: ' стногь ~_ меню. ЗначитеЛьный . об~,ем ' информации <:>б . элементах уnра'влениЯ ;, формы (Forms} мо~но получить через Запись · макросов · и использование окна. Qb}ect : вrowser•. (Просмотр объектов}, о.днако Дпя получения· nолной доку ментациИ необх9ди'м 'досТ'(П к . • Exc_el 5 .или Excel 95. '·· • ' Элемент управления раскрывающегося списка создается процедурой, которая вызы­ вается из процедуры обработки события BeforeDouЬleClick на листе SheetData. Лист имеет программное имя Sheet2. o:ption ·ExpliCJ. t F'rivate' Sub Wofksheet:_BeforeDouЬleClick(ByVal _ Target Cancel As Boolean) · If (I-sColμnщSelected(Target, са11 · AddDropDown(Target) Cancel True .End If ,)?nd ,Sub , "D")). Then
230 Глава 10 Private Fu:o.ctio~ 'rscolumnSelected(ByVal T arget · ByVal ColumnNan:e ·As- String). As Boolean · IsColumnSelect~d (Intersect (Target, E.gd _f.u,cti9ц , - ·=·· Процедура обработки событи~ проверяет, чтобы значение параметра Tar g e t (опи­ сывающего ячейку, в которой выполнен двойной щелчок) соответствовало столбцу D. Если это так, вызывается процедура AddDropDown. Значение Tar get передается в каче­ стве параметра, а событие двойного щелчка отменяется. Следующие две процедуры расположены в стандартном модуле: bption ::-Ex]Jii"ci"t · PuЬlic sub AddDropDown(Targei: Dim Contrpl As DropDown · Dim Pro'ducts As Variant DimI As Integ<?r forr·= · L Bound(Products) То UBound(Products) · / Call Control.Additem(Products(I)) · Next .End su.ь" " Private Sub. EnterProd;uci:Information( ), · .Dim Prices As Variant Prices = · Array(15 , J,2.5, 20, lB) •. ·1 . " •. With SalesData.DropI)owns(Application.Caller) ' . TopLeftCell.Va1ue = .List( ;Listlndex) i ;TopLeftCell.Offset(O, 2) .vai'Ue · ' Prices ( .Listindex + LBound(Prices) }· . Delete , End With . :_E .gd= p\1J2.. ~ ·..• --. Процедура AddDropDown не объявлена как закрытая, так как ее нельзя будет вызывать из объекта SalesData. Это может стать проблемой, если пользователям нельзя просмат­ ривать процедуру в диалоговом окне Сервисq Макросq Макросы (TooJsqМасгоq Maaos), но так как этот метод принимает аргумент, в этом диалоговом окне он не отображается. Кроме того, подпрограмму AddDropDown . можно разместить в модуле SalesData или в стандартном модуле. Подпрограмма будет работать в любом случае. Для: создания раскрывающегося списка в пoдпpoгpaммeAddDropDown используется метод 1 Add коллекции DropDowns. Элемент управления выравнивается в соответствии с элементом управления, на который указывает параметр Target. В результате выравнивания раскры­ вающийся список получает те же значения свойств Left, Тор, Width и Height, что и соот­ ветствующая ячейка. В подпрограмме AddDropDown свойству DropDown. OnAction при­ сваивается указатель на подпрограмму EnterProduct i nforma tion. Это значит, что под-
Добавление элементов управления 231 программа EnterProductinformation будет запускаться при выборе элемента управления из раскрывающегося списка. Для добавления элементов из диапазона Products в раскры­ вающийся список в цикле For. . . Next используется метод Additem. Подпрограмма EnterProductinformation объявлена с квалификатором доступа Private. Это защищает ее от доступа через диалоговое окно СервисqМакросqМакросы (ToolsQMaпoQMacгos). Хотя подпрограмма является закрытой, она доступна для раскры­ вающегося списка. Подпрограмму EnterProductinformation можно разместить в моду­ ле SalesData, но свойству OnAction раскрывающегося списка придется присваивать зна­ чение SalesData. EnterProductinformation. Подпрограмма EnterProductinforrnation загружает цены соответствующих про­ дуктов в массив Prices. По'сле этого вызов Application . Caller используется для по­ лучения имени элемента управления раскрывающегося списка, который вызвал событие . OnAction. Это имя применяется в качестве индекса коллекции DropDowns при получе­ нии ссылки на объект DropDown в модуле SalesData. Для получения индекса выбран­ ного элемента раскрывающегося списка в конструкции Wi th. . . End Wi th в подпро­ грамме EnterProdinforrnation используется свойство Listindex. Непосредственный доступ к имени выбранного в раскрывающемся списке DropDown объекта невозможен. Это поведение отличается от поведения объекта СоmЬоВох, кото­ рый возвращает имя выбранного пункта в качестве значения свойства Val ue. Свойство Value раскрывающегося списка имеет то же значение , что и свойство Listindex, и со ­ держит номер позиции выбранного пункта списка. Для получения имени выбранного элемента раскрывающегося списка необходимо воспользоваться значением свойства Listindex в качестве индек~ а свойства List (индексация свойства начинается с 1) . Свойство List возвращает массив всех элементов списка . Свойство TopLeftCell объекта DropDown возвращает ссылку на объект Range, ко ­ торый находится под верхним левым углом объекта DropDown. Подпрограмма Enter- Prodinforrnation присваивает выбранный элемент списка свойству Value данного объекта Range. После этого цена продукта сохраняется в объекте Range, расположенном на два столбца вправо от объекта Range, указанного в свойстве TopLeftCel l . Кроме этого в подпрограмме EnterProdinforrnation в качестве индекса для масси­ ва Prices используется свойство Listindex раскрывающегося списка. В данном случае проблема заключается в индексации раскрывающегося списка начиная с 1, в то время как список функции Array зависит от оператора Option Base в начале модуля. Оператор LBound(Prices) -1 используется для уменьшения значения Listindex на единицу, если применяется оператор Option Base О, и для уменьшения на О , если используется оператор Opti-on Base 1. · Следующий код применяется для обеспечения индексации начиная с О при использо­ вании оператора Option Base 1 в Excel 97 и более поздних версиях: ~I>i iC~§:~ ~ ~A:л~r-a:f r~ ![; : :t::2 : s_; . 2о ".:I»J :· Этот прием не работает в Excel 5 и Excel 95, так как приведенный код зависит от опе- ­ ратора Option Base. ·- '
232 Глава 10 Динамические элементы управления • 1 Act1veX Как было показано ранее, элементы управления ActiveX сложнее в программирова­ нии, чем элементы управления с панели инструментов Формы (Foгms). В. то же время, элементы управления ActiveX предоставляют больше возможностей, а значит :и;х изуче­ ние имеет определенный смысл. Ниже будет показано, как создать комбинированный список, который ведет себя как комбинированный список из предыдущего примера. Для того чтобы пример немного отличался, воспользуемся событием BeforeRightClick для включения комбинированного списка в столбце D на листе SalesData. -Prlvai:. ~ c6i1.st: conl:rolName zl.s strinQ- :: ·0·•coffiЬo" 1Private Sub Worksheet_; __BeforeRightClick( _ '-EyVal/ 'Гarget As Range, Cancel. As Boolean) Ole As OLEObject : Coptrol As MSForms.ComЬoBox ,Line As Long , CodeModule As Object :·D ·: } Theh Exit,Sub .. От:ключ>:~т~.· о(Sно.вление э~рана 'при добавлении · элемента :..., !\.J;JP,fication. ~creenUpdating = False создания Ole = ~e.'OLitObjects (Qon trolNaпi~} Ole >Is . Nothing =False Tben · Gото Flnisь .· · End If f спи.сок в активную ' ячей:ку f, ·Set ·~i=s~т:~~~~~~~~~~ ~~~~o~:. i ":,' Link: =False , ~ . f _:.,(· ·. · .· .D .•i.~playAsTcon: =False, Le~t: '=ActiveCe~l -Left, '~Тор: =Ac tiveCell. Тор, _ - · ·• >Widtb: =Active~~ll . Width., Height: =ActiveCell. Height)
' .УбедИ'rЬСЯ, , ЧТО' ОКНО Application. VisiЫe Application.VisiЫe 'Finish: Can·cel True Добавление элементов управления 233 Excel активно False тrue Applicatiqn . ScreenOpdating = True ·En(j . S,ll}? Сначала нео~ходимо убедиться, что событие возникло в столбце D. Кроме этого, нужно быть уверенным в отсутствии еще одного комбинированного списка на листе . Су· ществование такого комбинированного списка означает, что пользователь создал список, но еще не выбрал один из элементов. Проверка такой ситуации не требовалась в преды· дущем примере, так как комбинированные ~писки были независимы, хотя и использова· ли одну и ту же процедуру обработки события OnAction. Элементы управления AёtiveX не могут одновременно применять процедуру обработки события Click, поэтому необ· ходимо обеспечить уникальность комбинированного списка на листе. Элемент управления ActiveX будет называться СоmЬо. Самым быстрым способом опре· деления существования элемента управления с именем СоmЬо является создание ссы1:аю· щейся на него объектной переменной. Если попытка завершается неудачно, элемент управ· ления не существует. Для защиты макроса от остановки и выдачи сообщения об ошибке в случае отсутствия элемента управления используется код обработки ошибки . Перед за­ вершением подпрограм:мы можно было бы вывести сообщение с описанием, но это не яв· ляется основным назначением этоrо примера. Установка параметра Cancel в значение True подавляет появление контекстного меню при щелчке правой кнопкой мыши. Если все проходит нормально, новый комбинированный список появляется в актив· ной ячейке . Стоит- обратить внимание, что объект ActiveX не добавля;ется непосред· ственно на лист. Объект хранится в объекте OLEObj ect точно так же, как встроенная диаграмма - в объекте ChartObj ect (дополнительная информация о встроенных диа· граммах приводится в главе 24). Возвращаемое значение методаАdd коллекции OLEOb- j ects присваивается переменной Ole. Это сделано для того, чтобы упростить обраще· ние к объекту OLEObj ее t в дальнейшем . Для упрощения идентификации свойству Name объекта Ole присваивается строковое значение " СоmЬо " . После этого создается объектная переменная Control, которая ссылается на объект СоmЬоВох, содержащийся в объекте Ole. Объект OLEOb j ect возвращается свойством Obj ect объекта Ole. В следующей строке кода объекту СоmЬоВох присваивается имя "СоmЬо". В Excel 2000, Excel 2002 и Excel 2003 эта операция необязательна . При при· своении имени объекту OLEObj ect оно автоматически присваивается встроенному объ· екту. Такое поведение недоступно в Excel 97, поэтому имя должно присваиваться явно . Далее создается процедура обработки события Click для комбинированного спи ска. Процедуру обработки события нельзя создать заранее. Если объект ActiveX, на который ссылается процедура , не существует, при компиляции будут выданы сообщения об ошиб­ ке . Методика программного создания процедур обработки событий подробно рассматри· вается в главе 14. Переменной CodeModule присваивается ссылка на модуль класса листа, а метод CreateEventProc из модуля кода используетс я для ввода первой и по сл едней строки процедуры обработки события ComЬo_C li ck с пустой строкой между ними . Метод воз· '
234 Глава 10 вращает номер первой строки процедуры, который присваивается переменной Line. Метод ReplaceLine заменяет пустую вторую строку процедуры вызовом подпрограм­ мы, называемой ProcessComЬoClick. Эта процедура показана ниже. Код процедуры ProcessComЬoClick уже существует в модуле кода листа." К сожалению, при добавлении кода в модуль кода, как сделано в этом случае, выпол­ няется активизация модуля кода и пользователь может остаться один на один перед эк­ раном, полным исходного кода. Если свойство VisiЫe приложения Ехсе! сначала уста­ новить в значение False, а потом - в значение True, то при завершении процедуры ок­ но Ехсе! станет видимым . Хотя обновление экрана было . отключено в начале процедуры , экран может мерцать. Существует возможность пода~ления такого мерцания. Для этого необходимо воспользоваться вызовами Windows API (дополнительная информация об использовании Windows API приводится в главе 16). Процедура обработки события Click, созданная показанным ранее кодом, выглядит след):'ющим образом: i'rivaf.e' · su :ь-comБo=.c1 i c k <) ·· ProcessComЬoClick E~d."§~);? , _ При выборе элемента комбинированного списка вызывается процедура обработки со­ бытия Click, которая , в свою очередь , вызывает процедуру ProcessComЬoC l ick. Про­ цеДура ProcessComЬoClick хранится в модуле кода листа и содержит следующий код: :Privat es"uь " i'ro'cesscomЬociick: () Dim Line As Long. Dim CodeHodule As ' Object ·. ' Ввести выбранное зн,аЧенЙе With. OLEObjects(Contro,lName) . TopLeftCell.Value .Object.Value . Delete ·· - · 'EndWith . Line Call ,;;n{:! J3uj)_•. ,_".• Комбинированный список хранится в виде . объекта в об.ъекте OLEObj ее t, называемом Combo. В показанном выше коде выбранное значение из комбинированного списка копиру­ ется в ячейку под списком. После этого объектОLЕОЬj ect и его содержимое удаляются. Потом код удаляе~ процедуру обработки события. Переменной CodeModule при­ сваивается ссылка на модуль кода листа. Метод ProcStartLine возвращает номер пус­ той строки перед процедурой обработки события ComЬo_Click. Метод Delete удаляет четыре строки, включая одну пустую. Несложно заметить, что динамическое создание элементов управления ActiveX требу­ ет определенных трудозатрат. Если дополнительная функциональность элементов управления ActiveX не требуется, проще использовать элементы управления с панели ин­ струментов Формы (Forms) .
Добавление элементов управления 235 ~лементы управления, встроенные в диаграмму На рис. 10.4 Показана диаграмма, на которой расположена кнопка для удаления или до­ бавления последовательности значений прибыли. Последовательность значений основана на значениях Планировщик прибыли'на листе Profit. Элемент управления Button доступен на панели инструментов Формы (Foгms). Этот элемент управления является частью кол­ лекции But toris (элементы управления ActiveX нельзя использовать на диаграммах). 2~ ООО 1 20000 10 ООО " • • -''i GJ!i!!Ц Pra~J __§~l~Q~~-°-- roтo&o Рис. 1О.4. Диаграмма с возмож:постью добавлен.и.я и удалеиия рядов Свойству OnAction объекта Butto n присваивается ссылка на следующий код: (sU:i:)вutton.1.:::.c11 c:JC-o · ·With Ac~iveChart .. . . . If .SeriesCollection. Count .. = 3 Then .SeriesColl ~ctio n(l) .Delete ' Else . · ·. . ·. ,With . SeriesCollectiori.NewSeries . . .Name = . Sheetl.Range( "Al3") . Values = Sheetl .Range( "ВlЗ : МlЗ") .x values = Sheetl . Range("Бl2:М12") .PlotOrder = 1 End With. .End If End 'With :,Eq9,_ ~и)?,.,, ..~
236 Глава 10 Если свойству SeriesCollection. Count присвоить значение 3, первый ряд удаля­ ется. В противном случае добавляется новый ряд, который связывается с соответствую­ щими диапазонами значений прибыли, отображаемыми после значений налогов. Новый ряд добавляется последним и должен отображаться за существующими рядами. Для ото­ бражения нового ряда перед существующими свойству PlotOrder присваивается соот­ ветствующее значение . Резюме В этой главе были рассмотрены отличия между .встроенными в лист элементами управления ActiveX и элементами управления Формы (Fиms), встроенными в листы и листы диаграмм. Кроме этого, было показано, как использовать эти элементы управле­ ния, а также - полосы прокрутки, счетчики, флажки и переключатели. Элементы управ­ ления примен~лись для запуска макросов, предоставляющих доступ ко всей мощи VВА. Кроме · этого, элементы управ~ения не связываются с конкретными ячейками . \
1 Доступ к данным с ПОМОЩЬJО ADO Компания Mici-osoft выбрала технологию ActiveX Data Object, или ADO, для обеспечения клиент-серверного доступа к данным между любыми потребителями (клиентами) и источниками (серверами или поставщиками) данных. В Excel поддерживаются и другие технологии доступа к данным, например DAO или ODBC. Но в данной главе эти техноло­ гии не рассматриваются, так как компания Micгosoft предполагает, что их полностью вы­ теснит интерфейс ADO. Предположения компании Micгosoft почти оправдались. Обсуждение ADO может потребовать значительного объема книги (если не целую книгу) . На самом деле издательство Wгох уже выпустило несколько отличных книг, по­ священных ис~ользованию ADO. Среди них мо~но выделить ADO 2. 6 Prograrnrner's &fer- ence fISBN 1 -861004-63-х) и Profess ·ional ADO 2.5 Prograrnrning (ISBN 1-861002-75 -0) . В этой главе рассматривается небольшое подмножество возможностей технологии ADO и описы­ ваются ситуации, которые часто возникают при программировании приложений для Excel. Дополнительная информация об ADO доступна в одной из упомянутых ранее книг. Как отдельная универсальная технология ~оступа к данным, интерфейс ADO быстро развивался в течение последних нескольких лет. Развитие технологии происходило намно­ го быстрее, чем развитие использующих технологию приложений. На· момент написания настоящей книги широко применяются несколько версий технологии ADO. Это версии 2.1, 2.5, 2.6 и 2.7 . В этой главе рассматривается версия ADO 2.7 . Она предоставляется вместе с последними версиями Windows и Office. Если ни одно из этих приложений не используется ·и библиотека ADO 2.7 не установлена, ее можно загрузить с сайта Micгosoft Univeгsal Data Access, который доступен.по aдpecyhttp://www. mi_crosoft. com/data.
238 Глава 11 Введение в структурированный язык запросов Обсуждение доступа к данным невозможно .без рассмотрения SQL. SQL - это язык за­ просов, используемый для общения со всеми распространенными базами данных. Язык SQL основан на стандартах, в которых существует столько же вариантов, сколько суще­ ствует производителей баз данных. В этой главе рассматриваются конструкции, по воз­ можности совместимые со стандартом SQL-92. Но при рассмотрении доступа к данным с применением Micгosoft SQL Sегvег будет использоваться вариант языка SQL, который называется Tгansact SQL или Т-SQL. В этой главе приводится краткое описание базового синтаксиса SQL. Обзор ю:" в коем случае не является полным, но его будет достаточно для понимания основных концеп­ ций, которые используются в этой главе. Дополнительная информация с примерами применения языка SQL доступна в книге Beginning SQL Pтograrmning (ISBN 1-861001-80 -0) издательства Wгох Pгess. Ниже перечислены четыре команды SQL, используемые чаще всего. Кроме этого, указана пара команд, применяемых не так часто, но являющихся достаточно, :мощными, чтобы указать их здесь. Вот эти команды: О SELECT - используется для получения данных из источника; О INSERT - используется для добавления записей в источник; О UPDATE - используется для модификации существующих записей в источнике; О DELETE -: используется для удаления записей из источника; О CREATE TABLE- используется для создания новой таблицы; О DROP TABLE - используется для удаления существующей таблицы. Термины записъ (recoтd) и поле (field) часто применяются при описании данных. Ис­ точник данных будет рассматриваться в этой главе и может восприниматься в виде дву­ мерной таблицы . Запись соответствует строке таблицы, а поле представляет столбец таблицы. Пересечение записи и поля представляют собой з·нд'Чение (value). Резулъrпирую­ щее множество (тesultset) описывает возвращаемое множество данных, полученное в ре­ зультате выполнения оператора SELECT. Можно обратиfь внимание, что клю~евые сrуо.ва SOL, наnример SELECT ~ UPDATE, : yкa~ зь1в!!ются в · верхнем · реrистре. Это:',расnростр~нен~ая •nрактика ·nрограмм'1рования .; 11~ ' яЗьiке · ~ОL: П~и · nросмотре _сложных операторов SQL исnоrьз9вание верхнеrо ' ре~истра для,_заnиси. ключевых слов позволяет отличать их от операндов . .Фрагменты оп7раторов " SQL'.назь1ваются nредiiожениями. Во всех операторах SQL .некоrорые nреДnоЖения .ЯВ7: ляЮтся • обязательными, .а некоторые:...;,_ необяЗательными :·лри огiисаниИ сi1нтаксИса orie- paтqpoв ·SQL нi:щq~заТе~ьнь1е преДiюЖе~Ия 'И· ключевые слова закл~чаюi:сЯ в'~:кваДратные' скобки. . !,. .. :: .. ' . . ' //~ {,; Для демонстрации примеров кода SQL будет использоваться таблица Cus tomers из демонстрационной- базы данных Micгosoft Northwood (рис. 11.1). База данных North- wood устанавливается вместе с пакетом Micгosoft Access или при установке Mici·osoft SQL Se1-ve1· (обычно этот файл называется NWind. mdЬ или Northwood. mdЬ).
Доступ к данным с помощью ADO 239 Оператор SELECT Оператор SELECT я вля ется самым р аспространенным оператором язык а SQL, позво : ляющим извлекать данные из источник а. Базовый синтаксис оператора SELECT выгля­ дит следующим образом : ·.~?~~;:е::т .._ё::r(J;r~еЧ\, __ё~С>Л беU.2 !Alfre d Futt erk iste !Maria An ders .J.Т.ОР.ГО.0~'.~. n е.е.д_С:!~.~~·т.е. _ ...·................ ~= =т;;:~эf;~ji11o·I~1re(jatio~Y Ъ"ё1Э-doiJ;;:~э};;;j ;iia Jэлацелеч .......................... .. ... ... . .. . ... .... ... ... . ......... .1.~.l]-~.o.r:i.i~..~O!.l?.~O ..Т.~ч~.~-~?.. .. .. J~r:i,O.i:!.~~ -~.~!~.1:1 .0..... .i.~~~д.~!)-~Ч.. ........ .. .. ... . .. .. .. . ... .. . ... .. 'Aroundthe Horn .:Тhoma s Har dy .. ! То рговый nредста в1пело . ... ... I.~- ~ ~!.1:! .!].0.~. -~~~ .о.~:~- ~Р. .. " .l.~-~~-~~~.!.r:i.~.--~-~-~.9.!.~.r:i.O..l~.~-~-~:~:.~!P.?..!~P. ..~.~-~~?.o:.~ . . ... . .. ... .. .. ... . ..... ...... ..... ... ..~. B la ue r See Delik ate ssen .... l.t].~.ПIJ.~."M.9..0.~..".. i.Т.О.Р.Г..О.~.~-~1~.-~Р..~д.~:Т.?..~.!:1!~~-~ .J.~.1.0.d~.1. P.~.~~-.-~.t..~.1.~ ·· ·· ·- .. .. ·· · · · · ·· · .. . .. . . .. . .. . . .. . . . : f..r~-~ ~~Ч~.~...9..~~-~-~-~~- .и~~-~~.д~.~Р.. ..~.0-~~.Р..~~!.~.~Е· .. ~ . ~ .о. ~ ! .~ .О...~.О.!!1.~~.~.~..Р.~.~-Р..~.~~О.~.~-- .. . .. . . .... :..~.~ -~- ~-~ ...?..о.~.~-~Е·-·· .. . ..j!?.!.!.~.д.~!.!.~Ч..... ,Bon.арр' . . .... iLaurence LeЬihan .. ;В~аделец ... ; Bottom·Do llar Markets ........................ JE 1izab~iЪ Lin co ln _ ; Бухгалтер .. .......................... , в:~..Bevв.rages ............ ........... ......... ...................._.\/i~t.oria..1'-•.tiv<o~.h ....;Iорговь.1.й...nР•.д.~т.а.в~т.е~.' ·-·--··---- -· . J. g_~ -~! ~~ . fo. ~. i O .~_s_ P.?~~-.! !~ ~ ?!. . _ .. .--·-·-~-i:'~t~!E!o_.§.~~P.~.on__+~!!-~! !!О...~Р..од~>!5.~!1. --· ·-· .... ... . ... .. .. . .. .. ".. . . .. . ".. . .. ""... ".. . . . .. . .. . . .. . .~ ..g.~-~-~-~.~ ~~~.~-~~-~.~.!. Mo ct ezuma ............. !.F..~.~-~ !.~-~.0".9..~.~-~.9 "...... .~. ~~ -~ -~ .4 ~.~Р" r:i.O ...~ ~.Р.~~!.~.~.!. ~= З.n~;~,-@ш ~ [fjmJ~ ~; 14 ___, ~3 Рис. 11.1 . Таблица Customers В показанной на рис . 11 . 1 таблице содержится столбец, который называетсяСоmраnу Name . Для выбора имен всех потребителей можно написать следующий оператор: Предложение SELECT сообщает источнику данных о столбцах , которые необходимо извлечь. Предложение FROM сообщает источнику данных имя таблицы , хранящей инте­ ресующие записи. Пример можно расширить и выбрать не только имя компании, но и имя контактного лица. Для этого можно воспользоваться следующим запросом: L.$"]tв·cf"<;omi? anX.'Nдiiie ~ S:§iiБic t'Na1.i\e_· f.~!)м cU:st°-mE}rs '' ~· ~.".~ Оператор сообщает источнику данных о том, что необходимо получить все значения полей CompanyName и ContactName из таблицы Customers . Оператор SELECT пре­ доставляет коротк~й вариант записи запроса для получения всех полей из указанной таб­ лицы. Для этого в операторе SELECT необходимо указать один символ * : l§:?~.i~т~::xR9ti.~t.\is t_<?~E}f~з ... В результате выполнения этого оператора SQL будут предоставлены все поля и все записи из таблицы Customers . Обычно не рекомендуется использовать символ* в опе ­ раторах SELECT, так как код становится уязвим по отношению к изменениям имен или порядка полей. Кроме этого, обработка такого запроса может потребовать слишком мно­ го ресурсов при наличии таблиц большого объема, так как в~звращаются все записи, даже те, которые клиенту не нужны. Но иногда возникают ситуации , когда такая возможность может оказаться полезной . Предположим, что необходимо просмотреть список стран , в которых есть как мини­ мум один потребитель . Выполнение следующего запроса позволит получйть по одной за­ писи для каждого потребителя в таблице.
240 Глава 11 В результате этого запроса будет присутствовать много дублированных имен стран . Необязательное ключевое слово DISTINCT позволяет получить в результате запроса только уникальные значения : '$J?LES::t:щ·$:т±J'4's::т.~{;91.J.ri1:ry,:FJ:\()M ·cuiэ.t.omers· Ключевое слово DISTINCT может не поддерживаться некоторыми производителями баз данных. Точный синтаксис и ключевые слова конкретной реализации языка SQL дос­ тупны в документацди, которую предоставляет каждый производитель баз данных. Если необходимо _ создать код SQL, переносимый на большинство реализаций, воспользуйтесь предложением GROUP ВУ, входящим в стандарт ANSI ?QL и выполняющим ту же роль, что и ключевое слово DISTINCT в реализации Access. Ключевое слово GROUP ВУ позво­ ляет добиться, чтобы каждое значение столбца из предложения GROUP ВУ присутс тво ­ вало в результате· только · один раз. Поведение предыдущего оператора можно реализо­ вать с помощью следующего оператора, совместимого со стандартомАNSI SQL: :s~tШ~т J:ioui1~5. :~~()м~.~us_t_oшe.r ~ .--c;F:ouP, в:X ,ёа<lР.t:J:-l-:: ."· · ·· Если необходимо только просмотреть список потребителей, находящихся в Велико­ британии (UK), можно воспользоваться оператором WНERE, который позволяет ограни­ чить множество результатов: ·sЕi..Бст· compa·nyName"'; ·"c6iit:a.C:tN-ame .~ <FROM Customers .\1!Ш.RЕ; .~21:\rlt.fY.":' ·.:PI<.:•• ". ·-·· ·· ""'·~'' ...:. ." •. . Обратите внимание, что строка uк должна быть заключена в одинарные кавычки . Это касается и дат. Числовые выражения в кавычки заключать не нужно. Наконец, предположим, что необходимо отсортировать список потребителей из Ве­ ликобритании по значению поля CompanyName. Для этого можно воспользоваться пред­ ложением ORDER ВУ: sБL:Ест . ёoinpanyName ; · ·ca·n tact:Name . 1FRPM ·customers ' ·wнERE" Country = ·uк : .РВ1?1?.~J>.Х~.s::ящ:р~1)1х~аД1..§ ~.. ··= . ·~ ._. . По умолчанию при использовании предложения ORDER -ВУ выполняется сортировка по возрастанию. Если вместо этого поля необходимо отсортировать по убыванию, можно воспользоваться ·!iеобязательным квалификатором DESC . Его необходимо указать сразу после имени столбца, порядок сортировки которого нужно изменить . Оператор INSERT Оператор INSERT позволяет добавлять в таблицу новые записи . Базовый синтаксис оператора INSERT выглядит следующим образом: fi:~~1]~:~~~1;·:л.;~;~~~;~1a~:~~~~;:~;::~п~·~~~:~::~,::~~J~.~:'>:....~.,,,,..w.",,_,.h""""··"""" Оператор INSERT очень прост в применении. Нужно указать имя таблицы и столб­ цов, в которые необходимо вставить данные . Кроме этого, предоставить вставляемые значения. Предоставляемые значения указываются в предложенииVАLUЕS . Необходимо указать значение для каждого столбца, имя которого находится в предложении INSERT.
Доступ к данным с помощью ADO 241 Значения должны предоставляться в том же порядке, в котором перечислены имена столбцов. Вот пример вставки новой записи в тaблицycustomers: . i:NsfR'J:Г' i:i:.Jтo ciistomers ·· (cus t"omerJ:r:i:'"'ё.ompariyName; contacE'Na!ne; ·e:·auiitry) )/}'1 .I ,Q:Ei? , (,'}ШСр ' ,, '·Ne.1,<1 .Go!!lpal}y' с' ' .9>int=.:t:.J'~91Т\€! :., :p.J;A"J Обратите внимание, что как и в случае с предложением WНERE в операторе SELECT, .все строковые значения в предложении VALUES заключаются в одинарные кавычки. Это правило действует для всех операторов языка SQL. Если значения предоставляются для каждого поля в таблице и перечислены в том же порядке, что и поля, предложение с перечислением полей можно опустить: INSERТ I NTO ' customers'" .' VALUES ( · ' ALFKJ', 'Alfreds Futterkiste ', ;мaria Anders', 'Sales ·· Rep·reseпta,tive • , J •obereStr. 57°, 'Berlin', 'Hesseri', '12209', 'Germany•, '030...:0Q7432l.', 1~QЗQ:-;9Q7.§5_1'5.:_) ~. " ... Оператор UPDATE Оператор UPDATE позволяет модифицировать значения одного или более полей су­ ществующей записи или записей таблицы . Базовый синтаксис оператора UPDATE выгля­ дит следующим образом: UРDАтЕ·~?·имя_ .та блйцщ ·~· ·- ", .. " ""·· -:z· ~-~ ·~". ц--'-"""t ." ,~ .S ET столбецl "' значениеl, столбец2 знач~;:ние2 ' ~ [, столбец_п = значение_п] . [.\:Jl:I}~;I3-~ •. ФИ:!7.Ь трыJ.. .._ .• Хотя предложение WНERE оператора UPDATE является необязательным, его необхо­ димо указь~вать, кроме тех случаев, когда точно известно, что оно не потребуется . Вы­ полнение оператора UPDATE без предложения WНERE приведет к модификации указан­ ных полей всех записей в указанной. таблице. Например, если выполнить следующий оператор: •UPDATE Customёr's'''' ~S?T Соu11ч·у ' =_ 'ЧSА. то в каждой записи таблицы Customers значение поля Country будет установлено равс ным "USA". Существуют ситуации, когда возможность массовой модификации записей может оказаться полезной, но она же может оказаться и опасной, так как нельзя отменить обновление, запущенное по ошибке. Следовательно, при разработке запросов лучше соз­ дать резервную копию базы данных и экспериментировать на специально созданном на­ боре данных , что позволит восстановить. базу данных из резервной копии в случае по­ вреждения в результате выполнения неправильного запроса. Чаще всего оператор UPDATE используется для модификации значения в конкретной записи, на которую указывает предложение WНERE. Перед рассмотрением примера стоит обсудить один очень важный аспект прdектирования баз данных: первичнъ~й кл:юч (primary key). Первичный ключ представляет собой столбец или группу столбцов, уникально идентифицирующих каждую запись в таблице. В базе дaнныxCustomers в качестве пер­ вичного ключа используется столбец CustomerID. В каждой записи таблицы Сustоm­ еrs ,присутствует уникальное значение поля CustomerID. Другими словами, конкретное значение поля CustomerI D присутствует только в одной записи клиента в таблице .
242 Глава 11 Предположим, что для клиента "A.гound the Ногn" изменилось имя контактного лица. Значение поля Cus tomerID для этого клиента равно "AROUT " . Для изменения записи для этого клиента можно воспользоваться следующим операторомUРDАТЕ: UPDATE Customers SET ContactName = 'Новое название' ·Wlf~E5<:;)Js t<iiтi_ei~p~;.~ ::0ARQQ.°r.~.':.· .· . . . .. " ' . ·• -'•м ···- ···· ··'" ···· -"'· •·~· "'•· ""' '""' ""· "···· ··-=· .м•- м.·". --.·, "' · " ' "'·• ·= · ''"'."'°'"'~' · Так как в оператор добавлен предикат WН ERE , который основан на первичном ключе и обеспечивает уникальность записи, то будет обновлена только одна запись - запись клиента "AI·ound the Нош". Оператор DELETE позволяет удалять из таблицы· одну или несколько записей . Базо­ вый синтаксис оператора DELETE выглядит следующим образом: p"ELE"'rE 'FRoм -Имя_та вл1щы ,_ (.WHE~E·. фи_.f!_Ь!f:'Р) _ Как и в случае с оператором UPDATE, предложение WНERE является необязательным . Отказ от использования этого предложения в строке оператора DELETE может показать­ ся еще более опасным, так как применение оператора DELETE без предложения WHERE приведет к удалению каждой записи в указанной таблице. Если- не планируется удалять все строки, лучше всегда добавлять предложение WНERE в операторы DELETE. И в дан­ ном случае стоит отметить, что разработку запросов имеет смысл: выполнять на специ­ ально созданном наборе'данных. Например, при работе с базой данных Access достаточ­ но сделать копию файла . mdЬ и работать с ней. Предположим, что по какой-то причине в таблицу Customers внесена запись с полем CustomerID, равным "BONAP " (возможно, это поставщик, а не клиент). Для удаления этой записи из таблицы Customers можно воспользоваться следующим оператором DELETE: :DEE-ETFi'":i'Rbм 'cusfo.mers,_"':.~-"'-".. JШ:E.:EJ? ~.Qu;;;.torr1~i.IR .. ,,; . 'BQNAI', '.. ~.. --~----- Так как в предложении WНERE используется значение основного ключа записи, удаля­ ется только одна запись. Оператор CREATE TABLE Оператор CREATE TABLE применяется для создания новых таблиц в существующей базе данных. Хотя этот оператор, скорее всего, будет использоваться намного реже, чем операторы SELECT, UPDATE, INSERT и DELEТ-E, с его возможностями стоит познако­ мнться. Оператор CREATE TABLE можно применять для предоставления потребителям возможности создавать собственные таблицы после передачи готового решения . Кроме этого, оператор CREATE TABLE может использоваться для создания резервн~rх таблиц или для репликаЦии существующей таблицы в новую. Оператор CREATE TABLE имеет Помните, что обычно в таблицах Присутствует несколько важных элементов. Одним из них является первичный ключ, вторым - сущность, которую иногда называют внеш­ ним ключом. Внешний ключ содержит уникальное значение, используемое в качестве индекса в другой таблице. Например, предположим, что необходимо расширить таблицу Employees в базе данных Northwood, не меняя содержимое таблицы. Для этого можно
Доступ к данным с помощью ADO 243 создать новую таблицу с собственным первичным ключом и ·уникальным столбцом EmployeeID, который логически связан со столбцом Emploeeys. EmployeeID. Нако­ нец, можно добавить дополнительную информацию, например, адрес электронной поч­ ты. Такой запрос будет выглядеть следующим образом: CREATE TABLE ' Emp1oyeec611 ta.t::tJ:iiformat i o:ri. C"' . ' ' ' . : ( Employeecon tactrnforma'tionID . \ . EmployeeID Int UNIQUE . !~ Eijiai]. ,, T§?CJ)" ~ :.~•"='" . '" После выполнения этого запроса в базе данных Northwood будет получена таблица EmployeeContactinformation с первичным ключом EmployeeContactinforma- tionID, уникальным (без повторений) столбцом EmployeeID, представляющим логи­ ческое отношение между новой таблицей и таблицей Employees, и дополнительным полем Email, используемым для хранения адреса электронной почты сотрудника. Очевидно, что можно модифицировать таблицу Employees и добавить . соответ­ ствующее поле, но такое решение не всегда явля~тся желательным. Например, если база данных предоставляется внешним источником, такое изменение может привести к на­ рушению работы существующих приложений. Оператор DROP TABLE Первыми программистами были математики. Математики предпочитают использо­ вать симметричную терминологию . Таким образом, если существует оператор CREATE TABLE, очевидно, должен существовать и оператор для удаления таблиц. Оператор уда­ ления таблицы (целой таблицы, а не всех строк в таблице) выглядит следующим образом: J?В.9~... т~вйГ.!'!Е&~-~лдщг~ ."": · - ~ · _ , '""' ·-""'"""'·'"""'''"'ьш~''"' Предположим, что таблица EmployeeContactinformation создавалась в качестве временного решения. Тогда следующий оператор позволяет удалить эту таблицу: l?й.ill'~)i"~_i3,tc?. 'i<;riii?).'O:y~~S?o!iI~~пfl·to..:iJлE~Ion~:'!i~~zr:..::·z:2':L:.:~::::ш:;~;~~·;rJ;~i~~:w~~:ш~i;;;1 Обзор технологии ADO ADO является универсальной технологией доступа к данным от компании Micгosoft. Под универсальностью подразумевается проектирование ADO для предоставления дос­ тупа к любому вообразимому источнику данных. Это может быть база данных SQL Server, база данных Windows 2000 Active Diгectory, текстовый файл на локальном жестком диске и даже продукт не от компании Micгosoft , например база данных Огасlе. Ко всем этим ис­ точникам данных можно получить доступ с помощью интерфейсов ADO. Большой объем информации об ADO доступен в разделе ADO на сайте Miaosoft Universal Data Access по aдpecyhttp://www.microsoft.com/data/ado/. Интерфейс ADO не пытается обратиться непосредственно к источнику данных. Вме­ сто 1этоrо ADO является потребителем данных, получаемых через технологию более низ­ кого уровня, которая называется OLE DВ. Доступ к OLE DB непосредственно из VBA не\ возможен, поэтому для этих целей используется технология ADO. ADO получает данные от поставщиков OLE DB (OLE DB p1·oviders). Большинство поставщиков OLE DB пред­ назначены для работы с единственным источником данных. Каждый поставщик предна­ значен для предоставления общего интерфейса к любому содержимому источника дан-
- 244 Глава 11 ных. Одним из основных преимуществ ADO является использ.ование одного независимо­ го от источника данных набора команд. Это позволяе т не изучать новые технологии или методы пr,и доступе к разным источникам данных . Кроме этого, компания M i cгosoft предоставляет поставщика OLE DB для интерфt;.йса ODBC. Этот универсальный поставщик позволяет AJ10 получать доступ к любому источ­ нику данных, который поддерживает использование интерфейса ODBC, даже если для этого источника не существует специализированного поставщика данных OLE DB . Объектная модель ADO состоит из пяти объектов верхнего уровня, каждый из кото­ рых можно создавать независимо от остальных. В этой главе рассматриваются объекты Connection, Command и Recordset. Кроме э т ого, ADO предоставляет объект Record (не путайте его с объектом Recordset) и объект Strearn. Эти объекты достаточно редко используются в приложениях Excel, поэтому интересующиеся читатели могут обратиться к источникам, перечисленным в начале этой главы. Кроме пяти объектов верхнего уровня, АПО предоставляет четыре коллекции и объ­ екты, которые входят в эти коллекции (например , коллекция Errors содержит объекты Error). Научитесь использовать несколько классов и можете считать, что знаете ADO. Объектная модель ADO показана на рис. 11.2 . Parameter PrФer:tv PropertY Field .> 1• stream . 1 Рис. 11.2 . Фрагмент обr,ектной модели ADO В следующих трех разделах рассматривается каждый используемый в этой главе объ­ ект верхнего уровня из объектной модели ADO. В этих разделах предоставляется общая информация, необходимая для эффективного применения ADO. Конкретные примеры использования ADO для реше1!ия задач доступа к данным средствами Excel VBA рассмат­ риваются в следующих разделах. Не стоит воспринимать эту главу, 'как подробный справочник по ADO. Здесь рассмат­ риваются только те компоненты, которые буду,т использоваться в этой главе, или компо­ ненты, на которые стоит обратить внимание. Часто ADO предоставляет возможность ус­ тановки параметра несколькими способами, например в качестве свойства объекта или в качестве аргумента метода. В таком случае будет рассматриваться метод, демонстри­ руемый в разделе с примерами. Объект Connection Объект Con nect i o n используется для создания конвейера между приложением и ис­ :гочником данных, к которому получает доступ приложение. Как и другие объекты ADO верхнего уровня, объект Con nect i on предоставляет исключительную гибкость. В неко­ торых случаях доста:гочно использовать только этот объект. Простые команды могут вы­ полняться непосредственно через объект Conn e cti o n . Иногда вообще можно обойтись
Доступ к данным с помощью ADO 245 без создания объекта Connection. Объекты Command и Recordset могут создават~ не ­ обходимый объект Connection автоматически . Создание и удаление подключения к источнику данных может потребовать опреде­ ленных затрат времени. Если в процессе работы приложения иланируется выполнять не­ сколько операторов SQL, стоит создать глобальную объектную переменную Connection и использовать ее для выполнения каждого запроса. Это позволит воспользоваться воз­ можностями пула под-клЮ"~ений (connection pooling). Пул подключений предоставляется технологией ADO. Эта возможность позволяет сохранять и повторно использовать подключение к источнику данных, не требуя созда­ ния нов·ого подключения для каждого запроса (многократное создание запросов потре­ бовало бы значительных ресурсов). Подключение может повторно применяться даже для разных запросов. Достаточно, чтобы были одинаковы строки подключения. Такая ситуация характерна для приложений Ехсе!, поэтому можно пореко11ендовать восполь- зоваться этой возможностью. 11 Свойства объекта Connection В этом разделе рассматриваются важные свойства oбъeктaConnect i on. Свойство ConnectionString Свойство ConnectionString применяется для предоставления интерфейсу ADO и используемому поставщику OLE DB необходимой ' для подключения к источнику дан­ ных информации. Строка подключения состоит из последовательности аргументов, раз­ деленных точкой с запятой. Аргументы имеют форму" имя = значение; " . В этой главе из аргументов ADO будет использоваться только аргумент Provider. Все остальные аргументы строки подключения относятся к конкретному поставщику OLE DB. Интерфейс ADO передает эти аргументы непосредственно -поставщику. Аргу­ мент Provider содержит имя поставщика OLE DB, который дол'жен использоваться ин­ терфейсом ADO. В следующем пример'е кода показана строка подключения к базе данных Northwind с помощью поставщикаJеt OLE DB: : ;.·:P:rovicier ;;мiёrosof't:~Jet :-О"Е'БDiГ4 .о; ьa·i:a:·· sc;:u:rce ;;ё, \'f'rograi!l · J?I1ёs\мicros"GIE QJ~:Ц: §.\Qff1:f E:l.t \§1\МP,~;:§ ~_l·±oE1::P"!.irio , I!l(i]:); J".eE §J_5-1::_o;cS~(.:_U r,t1::x~ 1Ч~() ';' Rа) 13.~: ,;, ·· " '·• • .. ·. Единственным аргументом интерфейса ADO является аргумент Provider. Все ос­ тальные аргументы передаются непосредственно поставщику SQL Server OLE DB . Если используется другой поставщик, аргументы также будут отличаться . В этом можно убе­ диться при подключении к другим источникам данных в разделе примеров . Аргумент Provider в строке подключения ·можно не указывать. Если не указать поставщика , ин­ терфейс ADO по умолчанию будет использовать поставщика OLE DB ODBC. Кого -то может удивить сложность строки подключения. Как можно запомнить слож­ ную строку текста, особенно если аргументы зависят от используемого поставщика OLE DB? Именно для этого покупаются такие книги, как эта. Вместо того чтобы запоминать особенности каждого поставщика OLE DB, восполь­ зуйтесь методикой для создания собственной строки подключения. Поставщик OLE DB реализован в б:Иблиотеке оlеdЬЗ2. dll. Эта динамически подключаемая библиотека предоставляет утилиту с графическим интерфейсом, в которой есть диалоговое окно Data Link Properties (Свойства подключения к данным) (рис. 11.3). Если создать пустой текстовый файл и изменить его расширение с . txt на . udl , то двойной щелчок на фай­ ле приведет к открытию диалогового окна Data Link Properties (Свойства подключения
246 Глава 11 к данным), так как расширение . udl связано с основными службами поставщика OLE DB . . Одна из этих служб используется для определения подключения к поставщикам данных . Диалоговое окно Data Link Properties (Свойства подключения к данным) является мастером. Активизируйте первую вкладку Поставщик (Pгovide1·), выберите поставщика и щелкните на кнопке Далее (Next). Следующая вкладка называется Подключение (Connection). Содержимое этой вкладки меняется в зависимости от 1 выбора на первой вкладке (каждый поставщик предоставляет различные параметры). В данном случае вы­ берите поставщика Microsoft Jet 4.0 OLE DB Provider, MS Access OLE DB . На вкладке Подключение (Connection) достаточно найти и выбр ать фaйлNorthwind.mdb, и рабо­ ту мастера можно считать законченной. После щелчка на кнопке ОК диалоговое окно за­ крывается и в файл . udl записывается строка подкЛючен ия . Откройте файл . udl с по­ мощью редактора Блокнот (Note pad) и скопир уйте строку подключения . ·на р:Ис. 11 .4 по- - казано содержимое файла . udl , открытого в редакторе Блокнот (Notepad). Интерес представляет последняя строка текста ; первые две содержат комментарий. Вот код, который можно использовать для инициализации объекта подключения ADO и присвоения строки подключения свойству ConnectionString объекта подключения . (Не забудьте воспользоваться командой меню СервисqСсылки (ToolsqReferences) в ре­ дакторе VВЕ для добавления ссылки на библиотеку Micгosoft Activ eX Data Objects 2 .7 Libшy (ADO) .) . :const~-м-connec~t1 on st·rtng?AS' Strf ng"~. ~-~ .,'Т",·-~~~п~--;-"'· 1' "Provider=Microsoft.. Jet.OLEDB.. 4.Q;" . + _ · "Data Source=C: \Program Files \ Microsoft " + _ 1 • "Office\OFFICEll \ SAМPLБS\No r thwind.mdb ; Persis,t rDim' Connection· As ADODB ..Connection . . · ·;· . . 'Set Cqrinect i op = New ADODB.Connect ion 1<::o~r:ie.1=.~:i:.on,\:.()nnes:~J()r:i.$..tr:i,ng_ :;,. .. <:: orщ§ c Ц_o_r;i? t.:;.::i,~g '""' '' ' ·~ Посrавщи1<. даннь~ J nс:С~~ючение f ~~_лн~:rrельно.f Все 1 " Выбериrе подкл ючаеtv1ые данные: . Mic1osol1 ISAМ 1 . 1 DLE DB P1ovide1 1:tt;mtt1•mt••'•'*i•':1:.ww Microsoft OLE DB Provider Fo1Dala Mining Services: Microrolt OLE 08 Pro vider lor lndexing Service Microsolt OLE 08 P1ovider for lnternel PuЫishing Microso ft OLE 0 8 Provider for ОО ВС Dri ve1s Microsoft OLE DB P1ovide1 for OlAP Se1vice s Microsoft OLE ОВ P1o vide1for OlAP Se1vices 8.0 Microsoft OLE 08 P1o vide1 101 01acle Micro soll OLEDB P1ovide1101 SQL Serve1 Micros oll OLEDB Simple Pro vider MSDalaShape OLE DB P1ovide1fOf Mic1o soft Directory Se1vices J ilanee >> 1: Рис. 11 .З. Выбар поставщика OLE DB
Доступ к данным с помощью ADO 247 - connection -Б11шшот ~аt1л рРавка ~-~~".".~.~.. "·~.~~~~··'··················-·-····· .. [oledb] ·---~ ; Everything af'ter 'this line is an OLE DB 1n1н Provi der =Microsoft. Jet. OLE:DB. 4 . О; oata source=C: Рис. 11. 4. Страка rwдключения к базе дан1«>рс Первый оператор определяет константную переменную, инициализированную стро· кой подключения, которая скопирована из файла . udl. Второй оператор объявляет объект подключения. После этого объект подключенщ1 инициализируется и свойству ConnectionString' присваивается строка подключения . Свойство Connection Тimeout Практически во всех классах существует несколько членов. 'Класс Connection пре· доставляет свойство ConnectionTirneout и определяет период, в ' течение которого ADO будет ожидать установки подключения перед выдачей сообщения об ошибке. По умолчанию этот период составляет 15 секунд. Изменение значения этого свойства требу· ется редко, так как подключение или устанавливается, или нет. Ниже приводится код для модификации значения cвoйcтвaConnectionTirneout . :co.nriic't:[on :·ёonne_c tiO.ifт~щE?lJЧ.t' ;;;.:I9~:~~~·::z:=и1:ZiiZИ::~:;;::2~Jl·:&:r:~u:TTZ~~~!~:ft'i~J;:dй;@;J;~~rfu'!~±~ Свойство State Свойство State позволяет определить текущее состояние подключения. Подключе· ние может быть установлено или разорвано в процессе подключения или выполнения команды. Значение свойства представляет собой битовую маску, в которой содержится одна или несколько констант Obj ectStateEnurn, определе нных в библиотеке ADO: О AdStateClosed- подключение разорвано; О AdStateOpen - подключение установлено ; · О AdStateConnec'ting - подключение устанавливается; О AdS.tateExecuting- подключение выполняет команду. При попытке разорвать уже разорванное подключение или открыть уже открытое бу­ дет выдано сообщение об ошибке. Для предотвращения такой ситуации можно прове· рить состояние объекта Connection перед использованием: Гtt~c~Ii.:nf.9f19ii. stat~ ~~ '.bo5.:§!_c·E·$fi:.E~tJ:iц!L;ad§t~at.;.e§pen}:"'тJ:?'ii1:9.o;J~?.fiI!1.G1<5~~ На первый взгляд код, пытающийся ус.тановить уже установленное подключение, может показаться смешным , но попытки установить подключение могут оказаться неудачными или подключение может быть полем другого класса и другой код может попытаться устано­ вить или разорвать существующее подключение. Для предотвращения такой ситуации все· гда проверяйте состояние подключения перед вызовом методов Op e n или Close. Методы объекта Connection Методы определяют поведение объектов. Объект Connection предоставляет под· ключение к поставщику. Не сложно представить, что подключения могут быть установ· лены или разорваны, но библиотека ADO предоставляет дополнительные методы, кото· рые могут оказаться полезными . /
248 Глава 11 Метод Ореп Метод Open позволяет установить подключение к поставщику (так называемому ис­ точнику данных; поставщик является более общепринятым термином). Этот метод при­ нимает несколько необязательных параметров . Если предварительно инициализировать свойство ConnectionString, то метод Open можно вызывать без параметров. Если свойство Connect i onString не инициализировано, строку подключения, идентифика­ тор пользователя, пароль и дополнительный аргумент Options можно передавать в ка­ честве параметра метода. Все эти параметры рассматриваются ниже. В следующем при­ мере показано, как инициализировать объект, устанавливать подключение и прqверять состояние подключения: «::ons t ·connectl<m sYr:Lng ·д:Гs t.i irig · ~ ·:_ " Provider=Microsoft . Jet.OLEDB:4.0;" + . " Data Source=C: \bs Program Files\qs Microsoft " + . "Office\bs OFFICEl l \bs SAMPLES\bs Northwind . mdb;Pe:i;:sist ;~ Securi ty Info=False " ~- Dim Connection As ADODB.Connection .set Connection = New ADODB.Connection . - - c on ne ction.ConnectionString = ConnectionString :Connection .Open . .· · :I:'f:.Sg:В():X:__c,on11~e9Цo!1.· Stat:~" о: . ·оьj ectsta,teEntim . (id.?tateOpen Выше упоминался дополнительный аргумент метода Options . Аргумент Options по­ зволяет сделать установленное подключение асинхро-н:н.ъrм. (asynclironous ). То есть, объект Connection можно заставить сразу вернуть управление и устанавливать подключение в фо­ новом режиме одновременно с работой другого кода. Для этого аргументОрtiоns необходи­ мо установить в значение adAsyncConnect из перечислимого типа ConpectOptionEnum. Следующий фрагмент кода позволяет установить асинхронное подключение: oJ?j~'cJpn. 0p en _ pp(i<:J-n~=.5'.a,91\syц<::c?I:lrie'c~.~-~::: ·.: ,. -- .•." ·.: .. "•.. · Такая во.зможность может оказаться полезной для инициализации подключения в на­ чале работы кода. Пока подключение будет устанавливаться в фоновом режиме, осталь­ ной код может выполнять другие задачи . Метод Execute М етод Execute выполняет команду, текст которой пр едо ставляется в качестве зна­ чения аргумента ComrnandText. Метод Execute использует следующий синтаксис для запроса на выполнение операции (запрос не должен возвращать результируюiцее множе- · ство, например, DELETE, INSERT или UPDATE; SELECT к таким запросам не относится): ·ё.c)"riiiec_t:~or,.,._g~~Eici~~-:9o1ill!ia,ri<fт~xt: ,~· щ~ё.f>bl.sA,tf_e~-~-~siJ: · \()ption,s J . Для запроса на получение данных возвращаемое значение метода Ехесutе . присваи­ вается объекту Recordset: ~set c· R~ёo:i:aset · ;··-c:on~n~ct:ion:i~ЬiecU.t'e'tcoтma.n:a:т'E;!xt. > :: i·, ·' ... ~).·.; . ·":•~.~с. ,(.-~<, <{_i,; "~-0~-~А"""·~·' . Jg·e-q_q_r9-sA~·f.~.9.~-~qJ _, ·__ ,_ Jqp ~t '?.n~S"] ) Аргумент CommandText может содержать любую строку команды, воспринимаемую по­ ставщиком OLE DB в качестве оператора SQL. Необязательный аргумент RecordsAf- fected содержит возвращаемое значение, позволяющее определить количество записей, затронутых выполнением команды. Это значение можно сравнить с ожидаемым количест­ вом записей, что позволит обнаружить поте'нциальные ошибки в тексте команды.
Доступ к данным с помощью ADO 249 Аргумент Options является важным элементом оптимизации эффективности рабо­ ты команды. Таким образом, стоит всегда использовать этот аргумент, хотя формально он и является необязательным. Аргумент Options позволяет передавать поставщику OLE DB два информационных сообщения: поставщик получает информацию о типе ко­ манды, которая передается в качестве значения аргумента CommandText, а также полу- . чает рекомендацию по выполнению содержимого apгyмeнтaCommandT ext. Для выполнения команды из аргумента CommandText поставщик OLE DB должен знать тип выполняемой команды . Если не указать тип, поставщи'к определит его само­ стоятельно. При этом выполнение запросq замедлится. Этого замедления можно избе­ жать, если указать тип команды в CommandText с помощью одного из следующих пара­ метров CommandTypeEnum: О AdCmdText - значение аргумента CommandText является простой строкой SQL; О AdCmdTaЬle - аргумент CommandText содержит имя таблицы. При этом постав ­ щику отправляется сгенерированный оператор SQL, который можно расшифро­ вать как "SELECT * FROM имя_таблиц,ъ~ " ; О AdCmdStoredProc - аргумент CommandText содержит имя хранимой процедуры (хранимые процедуры будут рассматриваться в разделе, посвященном SQL Sегvег); О AdCmdTaЬleDireet - аргумент CommandText содержит имя таблицы . В отличие от AdCmdTaЬle, в этом случае не генерируется оператор SQL и содержимое таб­ лицы возвращается более эффективно. Если поставщик поддерживает этот пара­ метр, стаит использовать именно его . Поставщику можно передать конкретные инструкции по исполнению , указав одну или несколько констант Execut eOpt i onEnum: О AdAsyncExecute - от поставщика требуется асинхронное исполнение команды. Код при.irожения получает управление немедленно после отправки команды; О AdExecuteNoRecords - поставщику запрещается создание объекта Recordset . Библиотека ADO всегда создает объект Recordset в результате выполнения ко­ манды (даже если команда CommandT ext не подразумевает возврата массива строк). Этот параметр стоит использовать для экономии на накладных _ расходах при создании ненужного объекта Rec.ordset, когда запрос н~ предполагает воз­ врата строк с данными. Значения CommandTypeEnum . и ExecuteOptionEnum являются битовыми масками, которые комбинируются в аргументе Options с помощью логического оператора ИЛИ. Например , для выполнения простой текстовой команды SQL :IJ возврата объекта Re - cordset можно воспользоваться следующим кодом: Consi:. Connect:Lonstring A.s ·str:Lng = _ · "Provider =Microsoft.Jet.OLEDB.4.0;" + _ "Data Sourc~ = C:\Program Files\Microsoft " + "Office\OFFICEf.l\SAМPLES\Northwind.mdb;Persist Security Info=False" ;Dim Connection As ADODB. Connection Set Connection = New ADODB.Connection Connection . ConnectionString = ConnectionString ,connec tion . Open ;:p§bl1g ,_Print Connection. State Obj ectStateJ:riur!). adStateOpen
250 Глава 11 Const SQL As Stiing ,. 0 "SELECT * FROM Cust·omers' WHERE ё.ountry \' 'Dim.. Recordset; As Recordset pim RowsA.ffected А9 Long· · . . :set Recordset : = Connection. E:;.cecute ( SQL, · RowsAffected, ]langTYJ?§1'Ilt111l~ @<;:JI191:5!~.t)~ ... ~-~. . .... · w,•··-"··· Этот код основан на нашем примере. Вместо оператора MsgBo:;.c используется вызов метода Debug. Print, так как появление диалогового окна не дол~но прерывать работу кода, но интерес представляет информация о текущем состоянии приложения. После вызова метода Debug. Print определяется оператор SQL, переменная Records~t и пе­ ременная для хранения длинного целого числа, в которой будет храниться кол_ичество полученны~ строк. (Если количество возвращаемых строк не интересует, аргумент RowsAffected можно опустить и вместо него ввести дополнительную запятую, как по­ казано ниже.) \:S~·::F;~.9.0:~4K~t:§::JIO'illi~EШЛr~: ~)(_ёёut:.~(~{Q~_7:7sШ:Пi9:f.el<:t;') Метод Close После завершения работы с поставщиком необходимо разорвать подключение. Суще­ ствует конечное количество дескрипторов для подключения к базе данных, поэтому если не разрывать ненужные подключения, рано или поздно не удастся установить новое под­ ключение к базе данных из других приложений . Метод Close не требует передачи аргу­ ментов. Комбинация из проверки текущего состояния подключения и вызова метода Close может выглядеть следующим образом: , i:;i~~-!~r~:~~~I!:!~;~:~[~°,~~ёa·fsta~~Бnu~:.~dstat ·eop.en}·-т ·еп··---~~······ ,..."- . .~, События объекта Connection и асинхронное программирование Синхронность означает, что .операции выполняются одна за другой. Асинхронность означает, что операции выполняются в любом порядке. Мощность асинхронного про­ граммирования заключается в возможности осуществлять фоновые операции одновре­ менно с операциями, которые выполняются на переднем плане. Например, если запрос требует некоторого времени для выполнения, во время его реализации пользователь мо­ жет выполнять другие задачи. Обычно асинхронный вызов сразу возвращает управление. Возврат управления из асинхронного вызова не означает, что обработка вызова завершена. На самом деле обра­ ботка выполняется в фоновом потоке (современные центральные процессоры и опера­ ционные системы Windows поддерживают одновременную работу нескольких потоков; это позволяет в одно и то же время слушать музыку в Windows Media Playe1·, набирать текст в Word и отправлять запрос к базе данных Access), а код, отправивший запрос, про­ должает работать на переднем плане. Существует множество способов уведомления о за­ вершении работы фонового потока. В Excel поддерживается один из таких способов - события. Если связать событие с подключением, фоновый процесс может создать собы­ тие после установки подключения, и основной код сможет продолжить работу. При пра­ вильном использовании асинхронное поведение и события позволяют увеличить произ-
Доступ к данным с помощью ADO 251 водительность быстродействия. В результате уменьшаются видимые задержки и увели­ чивается скорость реакции приложения. Для связи события с объектом Connection необходимо воспользоваться оператором Wi thEvents в модуле класса при объявлении объекта подключения. После применения оператора Wi thEvents для выбора объекта подключения и доступных событий можно ис­ пользовать раскрывающиеся списки Object· (Объект) и Procedure (Процедура). Разработ­ чику предоставляется несколько событий , включая BeginTransComplete, Commit- TransComplete, ConnectComplete, Disconnect, ExecuteComplete, InfoMessage', RollbackTransComplete, WillConnect и WillExecute. Для реакции на завершение работы асинхронной команды необходимо реализовать обработку события Execute - Complete. Следующий пример является переработкой уже показанного кода. В этой вер­ сии продемонстрированы асинхронная обработка запроса SQL и наполнение диапазона данными из объекта Recordset: ii'T- ·qp- tT O ii "~ EXPil C l~t =--···~~··, - ..;--~~-;о-~~-~ ."._,,.,. -"~·="-·--·~··-~·-,-.,~,:··о< .".~"·· · - .2. : Pri_vate Wi thEve!,1ts AsyncConnection ~: . f4: ,PilЫic stiь Asynccon;ectionToDatab~s~ () [s:. •.6;_ )8: "9: r10: · r11; 12: ~13 :' ;14:" ~15: llб: f:p,,и r1 .в: ;19: \ib: •2.1: 22: !23: '24: . c6nst _conne _ cti'onstring As St~ing = _: , . "Provider=Microsoft. Je.t . OLEDB. 4. О; "' + "Data Source=C: \Program File's\Microsof.t "+ "Office\OFFICEll\SAМPLES\Northwind.mdb;" + "Persist S.ecurity In:fo=FaTse" , i., ~ Set · AsyncConnection · = New ADODB. coiшection · AsyncConnection . Connectionstring ·· AsyncConnection. Open Сощ; _i: SQL_ As String = ConnectionString "S ELE CT * FROM Customers WHERE Country = 'USA'" Call · AsyncConn:ection.Execute(SQL, , CommandTypeEnum.adCmdText Or ' Exe.cuteOptionEnum. adAsyncExecute) Debug : Print "Запускается до завершения обработки ~25: End Si.l},? :26: Г'f...7: Priva'te Sub - AsyncCoщt'ection_Exe<;:uteComplete ( (28( , , ByVal : Recor.dsAffect~d - As ·Long, _ ,2,9-: ByVa1 pError As ADODB.Err6r, · - fЗО: ., adStati.ls As ADODB. EventStatusEnum, 'ji! " БyVal pCommand As ADODB. Command, _ tЗ2: ' ' ,' вyva'l pRecordset As ADODB . Recordset, '33: By_yal -pConnection As ADODБ.Connection) i·3.· 4. i. _ :: ; Debug. Pr-int "Qu,ery Jini shed" :35: f3E) ; 137: . If . (adStatus ·;,, EventStatusEnum.adStatu~OK) Then fЗ-8 /' Call Sheetl. Rari.ge ( "Al") . CopyFromRecordse,t (pRecordset) \:39: ' End If . . - ':~~-- If (pcionnection.State ObjectStateEnum.adStateOpen) Then {42 pCorшection. Close t43: End If [4J.:. Й:~9 }~uf!~" .. --~·~-·~··""""'=·
252 Глава 11 Номера строк были добавлены для упрощения ориентации в листинге . При вводе ко­ да в редакторе VBE номера строк не нужны. Асинхронные методы используются в двух операторах, а остальной код практически не отличается от предыдущего варианта . Во второй строке объявляется оператор Wi thEvents, который позволяет генерировать процедуры обработки событий, в частности, метод AsyncConnect i on_Execute - Complete. Асинхронный вызов метода Execute означает, что объект Recordset не пе­ редается в качестве возвращаемого значения и обработка результата работы метода выпол­ няется в про'цедуре обработки события ExecuteComwete. Добавление ExecuteOption - Enum. adAsyncExecute в строке 21 делает вызов метода Execute асинхронным. Вызов метода Debug. Print в строке 23 добавлен для демонстрации выполнения кода до завер ­ шения обработки запроса. Событие ExecuteComplete создается после завершения работы асинхронного метода Execute. Арг}rменты события ExecuteComp l ete позволяют определить, для какого подключения и команды создано событие. В данном примере проверяется завершение обработки запроса (строка 37). Если обработка запроса завершена, содержимое объекта · Recordset копируется на лист в ячейку Al. В строке 41 проверяется состояние подклю­ чения. Если подключение установлено, оно разрывается . Вызов метода Debug . Print в строке 23 можно заменить на другой код, который д9ЛЖен работать после вызова метода Execute . Например, при удалении таблицы опе­ рация удаления может выполняться в фоновом режиме, а пользователь при этом про­ должать работу с приложением , практически не замечая снижения производительности. Применение -асинхронной обработки требует определенного внимания. Например, попытка разорвать подключение, используемое для фоновой обработки запроса, приве­ дет к появлению сообщения об ошибке. К асинхронному программированию необходимо немного привыкнуть , но в результате такой прием позволяет добиться повышения про­ изводительности . Коллекции объекта Connection Объект Connection предоставляет две коллекции: Error s и P r ope rt ies . Коллекцtiя Errors В коллекции Errors содержится набор объектов Error. Каждый объе .кт представля­ ет ошибки, специфичные для разных поставщиков OLE DB (ошибки времени выполне­ ния генерируются библиотекой ADO). В коллекции Er rors могут храниться ошибки, предупреж;;~;ения и сообщения (например, такие сообщения могут генерироваться опера­ тором PRINT языка Т-SQL), а также в не.й может содержаться полезная информация для решения проблем в работе кода ADO. Следующий код позволяет вывести содержимое коллекции Er:tors в окно lmmediate (Проверка) . ibЪi\TБ.}As ' Б~ror '· · "' ···::·-· '" ot For Each Е In pC9nne.ction.Errors ' . bebug.Print E.Value "с, ~ J':J~~J;.=J "·~-.. ,, ·. Коллекция Properties В коллекции Pr.opert i es хранятся специфичные для поставщиков расширенные свойства объекта Connect i on. Некоторые поставщики предоставляют важные парамет­ ры, о которых стоит знать разработчику. Расширенные свойства не рассматриваются в этой главе . Дополнительная информация о расширенных свойствах доступна в указан­ ных выше справочных руководствах по библиотеке ADO.
Доступ к данным с помощью ADO 253 Объект Recordset . · Как опер атор SELECT является самым распространенным оператором языка SQL, так и объект Recordset является самым часто используемым объектом библиотеки ADO. Объект Recordset выступает в роли контейнер а для записей и полей, которые возвра­ щаются в результате выполнения оператора SELECT источником данных. Свойства объекта Recordset Изучение любого класса подразумевает изучение свойств, описывающих состояние класса, методов, которые описывают поведение класса, и событий, определяющих си­ туации, на которые может реагировать Класс. Начнем изучение класса Recordset со свойства Ас t i veConnect i on. Свойство ActiveConnection Перед использованием объекта Recordset свойству Ac tiveConnect ion можно присвоить существующий объект Connection или строку подключения, которая будет применяться для подключения к базе данных. Если присвоить строку подключения , объ­ ект Recordset создаст объект Connec.tion автоматически . После открытия объекта Records et свойство Act:lveConnect i on возвращает ссылку на обЪект Connection, который используется объектом Recordset . Следую щий фрагмент кода пр исв аивает объект Connection свойству ActiveCon- nection: se·t Re c ordset ~Лct1veciлi~ecti6n ·= coririect1:6n В этом фрагменте свойству ActiveConnection присваивается строка подключения, что приводит к неявному созданию объекта подключения: R.eёordset .'Act.lvёёoii.nect:lon .= '' Provider-;;мl cr6 s6ft: Jet : ОLЁDв. 4 . а·; "-+=:_ "Data Source=C:\Program Files\Microsoft " + _ "Office\OFFICEll\SAMPLES\Northwind.mdb ;" + _ ,~ "~ersAst:: ~~cч;-ity :I:r:!(o =F.alse 1' Свойства BOF и EOF Эти свойства указывают, находится ли указатель объекта Recordset перед первой записью в наборе записей (recordset) (BOF или начало файла) ·или послj': последней записи в наборе записей (EOF Или конец файла). Если набор записей является пустым множе­ ством, и BOF и EOF будут равны True. В следующем фрагменте кода показано использо­ вание этих свойств для определение наличия данных в наборе записей: ·i f: · (Recordset. Eo:F; дrid. :Recordset . вo:F'i · · тlien · · Debug.Print "Нет данных" End If Обратите внимание на разницу между пустым и закрытым наборами запис ей. Если в результате запроса не возвращаются данные, библи9тека ADO пр едос тавит пол ностью действительный объект Recordset, но не содержащий данных. Таким образом, даже ее-­ ли в результате выполнения запроса возвращается объект Recordset, стоит использо­ вать вариант показанного кода для проверки наличия данных в этом объекте . Кроме этого, объект Recordset предоставляет свойство RecordCount, но это свой­ ство поддерживается не всеми поставщиками . Например, при использовании поставщи­ ка Microsoft J et 4 .0 OLE DB свойство Recordset . RecordCount всегда возвращает зна­ чение $ - $1 . Лучше всего использовать код, который не зависит от наличия данных
254 Глава 11 в объекте Recordset , например Worksheet. CopyFromRecordset, применять свойст­ ва BOF и EOF или оператор For Each (оператор For Each обрабатывает только те за­ писи, которые существуют в oбъeктeRecordset) . Свойство Filter Свойство Filter позволяет фильтровать содержимое открытого набора записей. В результате фильтрации будут видимы только те записи, которые соответствуют крите­ рию фильтрации. Данное свойство выполняет функцию дополнительного предиката WHERE над набором записей. Невидимые записи не удаляются и не меняются, но они становятся недоступны для операций над набором записей . Этому свойству можно при­ своить строку, в которой описывается условие выбо.ра записей , или одну из констант FilterGroupEnum. Можно установить несколько фильтров. В таком случае будут доступны только те запи­ си, которые удовлетворяют всем условиям фильтров. Для удаления фильтров из набора за­ писей установите свойство F i lter равным пустой строке или константе adFilterNone. В следующем фрагменте кода демонстрируется фильтрация набора записей для отображе­ ния регионов, названия которых содержат подстроку "OR", например , "Ol'egon": Для установки дополнительных фильтров можно воспользоваться логическими опе­ раторами AND, OR или NOT: ~?ёco~~~:~_t:~кп:.~i"'.7,,;,.::в:~§I2n~~~-::-Ф_~;:~iill!S:.<t:rIY .:~:Z:Poff~J~na:~1~"':..,::<AC:~...:,:::ш~1;:п:;;;;g,:~:iп:iii'~ Свойство State Свойство Recordset . State имеет тот же набор возможных значений, что и свойст­ во Connection. State. (Дополнительная информация доступна в разделе "Свойство State" ранее в этой главе.) Методы объекта Recordset Классы могут быть большими и сложными, как класс Recordset. Но знание основ­ ных свойств и методов, а также понимание основных принципов их ·применения позво­ ляет сразу эффективно использовать этот класс и изучать дополнительные возможности по ~ере необходимости. В этом разделе рассматривается пять часто используемых мето­ дов класса Recordset. , Метод Ореп Метод Open извлекает данные и делает их доступными для кода . Метод Open имеет следующий синтаксис: Аргумент Source описывает ис точник данных, он также может быть оператором SQL, объектом Comrnand, именем таблицы, указателем URL, вызовом хранимой проце­ дуры или сохраненным в файле набором записей . Обычно испол.ьзуется оператор SQL. Аргумент ActiveConnection может содержать строку подключения или объект Connection, который идентифицирует применяемое n:одключение . Если в качестве значения аргумента ActiveConnection используется строка подключения, объект Connection создается автоматически. Аргумент Cur sorType описывает тип курсора, который используется при открытии набора записей. Тип курсора указывается с помо-
Доступ к данным с помощью ADO 255 щью одного из значений CursorTypeEnum. В этой главе демонстрируется применение двух (adOpenForwardOnly и adOpenStatic) из четырех (adOpenForwardOnly, adOpenStatic, adOpenkeyset и adOpenDynami~) типов курсора. Знакомство с ос­ тальными типами курсора остается читателю в качестве .самостоятельного упражнения. Значение adOpenForwardOnly означает, что набор записей может просматриваться только в одном направлении, с начала в конец. Открытие набора записей с использова­ нием adOpenForwardOnly является самым быстрым , но наименее гибким методом пе­ ремещения по набору записей. Кроме этого, однонаправленньiй набор данных поддер­ живает только чтение. Тип курсора adOpenStatic используется для отключенных на­ боров данных. Применение курсора adOpenStatic поддерживает произвольное пере­ мещение и модификацию. Если тип курсора не указывать, По умолчанию используется adOpenForwardOnly. Аргумент LockType указывает тип блокировю~, которую поставщик применяет по отношению к источнику данных при создании набора записей. Существует пять типов блокировки: adLockBatchOptimistic, adLockOptimistic, adLockPessimistic, adLockReadOnly и adLockUnspecified. Далее в этой главе будут использоваться ad- LockReadOnly и adLockBatchOptimistic. Блокировка adLockBatchOptimistic применяется вместе с отключенными наборами ·записей , в которых обновление записей выполняется в пакетном режиме. Блокировка adLockOptimistic: блокирует запи си при вызове метода Update. При этом делается предположение, что никто не модифи­ цировал записи с момента загрузки и до момента обновления. Блокировка adLockPes- simistic блокирует . запис:И сразу после начала модификации. Блокировка adLock- ReadOnly означает, что набор записей не может использоваться для модификации запи­ сей. Такая блокировка применяется только вместе с однонаправленными наборами запи- - сей. Блокировка adLockUnspecified означает неопределенную стратегию блокировки . Изучение механизмов блокировки, не рассмотренных в примерах данной главы, остается в качестве самостоятельного упражнения для читателей. Аргумент Options совпадает с аргументом Options метода Execute объекта Con- nection, который рассматривался ранее в этой главе . Этот аргумент используется для отправки поставщику указаний по интерпретации содер_жимого аргументаSоurсе. Метод Close Метод Close закрывает объект Recordset. При этом выделенная для хранения на­ бора записей память не освобождается. Для· ее освобождения необходимо присвоить объектной переменной Recordset значение Nothing. Так как язык VВА пытается быть дружественным к разработчику, объект удаляется из памяти, как только выходит за пре­ делы области видимости. Например, если определить набор записей в методе, набор за­ писей будет удален из памяти после завершения работы метода. С другой стороны, в не­ которых языках необходимо явное освобождение памяти, выделенной для хранения объектов, поэтому лучше сформировать привычку присваивания объектным перемен­ ным значения Nothing (явного освобождения памяти ) . 1 Методы перемещения курсора При первом открытии набора записей указателъ на текущую запись (current record pointer) указывает на первую запись в наборе. Для перемещения по записям используется метод Move. Для этого метод перем ещает текущий указатель на запись объекта Recordset·. Ниже показаны базовые методы перемещения , доступные разработчику.
256 Глава 11 О MoveFirst - перемещает указатель на первую запись набора. О MovePrevious - перемещает указатель на предыдущую запись. О MoveNext - перемещает указатель на следующую запись. О MoveLast - перемещает указатель на цоследнею запись набора. В следующем примере показано перемещение между запис:Ями набора записей: . J? иь1·1с · suь R:e c.ord.~ef:NavTgation( J·~--~· ·-~- •:.Info,,,False" Diin' Recoidset As Recordset ~0 s ·et Recordset = New R.ecordset . cail Recordset. Open (SQL, C<;н:i.n,ectionstring) . ' : .. . Record~e't. MoveFi:i;-~:t Обратите особое внимание на использование методаМоvеNехt внутри цикла While. Неправильная запись такой конструкции является распространенной оШ:ибкой, которая ведет к появлению бесконечного цикла. Если . необходимо изменить порядок записей в наборе, можно воспользоваться пред­ ложением ORDER ВУ. Использование предложения ORDER ВУ CompanyName DESC по­ зволит получить отсортированные в порядке убывания данные. Кроме этого, в качестве т.ипа курсора можно указать константу adOpenDynamic, переместиться на последнюю запись и перемещаться обратно в сторону первой записи. Модифицированный вариант кода показан ниже: Publi c" suБ, Recordse~Nii vfgati.' on() Con~t SQL ;дs Stririg 7 ·.,_ ,iг . "SELECT , *>}"ROM Cust<f>rners ~· ~""
Доступ к данным с помощью ADO 257 r;>eьu:a: Prlilt: · R .ecordset : l"ieids С" cciffipari.yName ;; 1 Recordset.MovePrevious , Wend ' ·· · ,~!1<::1 $,μ]J ,• Метод NextRecordset Некоторые поставщики поддерживают команды, которые возвращают неско.irько наборов записей. Метод NextRecordset используется для переключения между этими наборами. Вызов данного метода приводит к удалению текущего набора записей из объ­ екта Recordset и загрузке нового набора записей, Текущий указатель устанавливается на первую запись в новом наборе записей, Если в момент вызова мeтoдaNextRecordset дру­ гих наборов записей не осталось, объекту Recordset присваивается значение Nothing, События объекта Recordset Для перехвата событий объекта Recordset в модуле класса необходимо определить объектную переменную с помощью оператора Wi thEvents Recordset. Перехват со­ бытий необходим при асинхронном применении объекта Recordset, так как события используются для уведомления кода о завершении асинхронного выполнения задачи. Асинхронное поведение требует механизма уведомления о завершении . Часто вместе с асинхронными операциями используются события и механизмы блокирования. Как и в случае с объектом Connection, разработчика должны интересовать события, возни­ кающие при использовании асинхронных методов набора записей: FetchComplete и FetchProgress. Применение этих событий с помощью оператора Wi thEvents иге­ нерация процедур обработки событий средствами редактора VВЕ уже рассматривались ранее . Изучение асинхронного поведения объекта Recordset остается читателям в ка­ честве самостоятельного упражнения. Коллекции объекта Recordset В заключение рассмотрения объекта Recordset стоит уделить внимание объектам, которые отслеживаются объектом Recordset - это коллекции Fields и Properties. Коллекция есть коллекция. Если умеешь использовать одну коллекцию, то умеешь ис­ пользовать и все. Коллекции различаются хранимыми объектами. Таким образом, ос­ новное внимание будет уделяться классам объектов, которые хранятся в коллекциях Fields и Properties . Коллекция Fields В коллекции Fields хранятс~ таблицы , представления и наборы записей. Объект Field является пересечением строки и столбца в источнике данных. КоллекцияFiеlds содержит все поля набора записей, ссылаясь на каждую строку по очереди. В коллекции Fields хранятся объекты класса Field, которые в основном используются для хране­ ния значения единственного пересечения строки и столбца. Обычно интерес вызывает значение поля , но иногда возникает необходимость в информации об имени, типе, раз­ мере, индексе или ограничениях поля. В следующем примере показано , как отображать состояние поля. Эта информация дает представление о значениях записей и полей: :1'i:iЬlic su.ь 'besc:tiЬe.A.R.ow (Т " Const SQL As String = _ ,"S,Е;:ы:с::т * ,l'~9M Cust()JП§ГS"
258 Глава 11 ~·:;. <;\<.~,. ·-"~~,,. •.,.. .., ... ••• • . . Corist . connectionstri'I1 'g As String = _ " Provide:r:=Microsoft : Jet;.OLEDB.4 .0;" + J'Data Source'ёC: \Program Files\M:i;crosoft •." + "Office\OFFICE11 \SAMPLES\Nort:Цwind._ mdb; Persi,st " InJo=Fals.e" ·Recordset. MoveFirst F~eld AsField Debug.Print Debug.Print · .Debug. Print: , ,Debug , Pririt . Debug . Print );J~xt · ·· ' В первой половине метода инициализируется и заполняется объект Recordset . Цикл For Each перебирает каждый столбец в наборе записей и выдает информацию о каждом поле в окне lmmediate (Проверка). Обычно желательно иметь представление обо всех аспектах изучаемой среды, но, скорее всего, из конкретных свойств поля придется использовать только имя, индекс и значение. Однако остальные свойства поля могут оказаться полезными на других уров­ нях. Самой распространенной причиной чтения атрибутов поля является создание ди­ намических приложений . Например, информация об имени , типе, размере и значении поля теоретическ:И позволяет на лету создавать графический пользовательский интер­ фейс. В языке VBA эта возможность реализована не в полной мере, но в таких средах, как Delphi и Visual Basic .NET предоставляются необходимые средства для динамического создания пользовательского интерфейса. Коллекция Properties В коллекции Properties хранятся специфичные для поставщиков и расширенные свойства объекта Recordset . Некоторые поставщики предоставляют расширенные свой­ ства, о которых разработчику стоит знать. Расширенных свойств еще больше, чем произ­ водителей баз данных . Важно обратить внимание, что свойства имеют форму пар "имя­ значение"; таким образом, используется одИ:наковый механизм чтения расширенных свойств . Коллекция Properties поддерживает индексацию по имени и номеру . Объект Command Объект Cornrnand является объектно-ориентированным представлением инструкций для поставщика. Одним из первых языков программирования (кроме RoшBasic в моло­ дости), с которым автору пришлось работать, был Databus. С созданием кода Databus его познакомил Майк Грур (Mike Gгое1·). Databus является структурным языком, напоми­ нающим COBOL. Язык зависит от .состояния и поведения, но не поддерживает сущности
Доступ к данным с помощью ADO 259 со связанным поведением. К сожалению, состояние и поведение не в полной мере отра­ жают реальный мир, так как в реальном мире состояние и пов'едение связываются с оп­ ределенными сущностями. Например, все люди дышат, но только некоторые являются пилотами . С точки зрения проектирования, все люди способны к обучению, а выбранные области обучения представляют состояние (или знания) каждого конкретного человека. В результате эволюционного развития многие сущности в программировании приня­ ли форму классов. Это относится и к командам SQL. Строка, в которой содержится ко­ манда SQL, является простой строкой, которая может содержать любое другое значение. Но строка внутри объекта Command должна содержать действительный оператор SQL (а проверка этой действительности является одним из аспектов поведения объекта) . В этом разделе объект Command рассматривается более подробно. Свойства объекта Command В программировании все субъективно. Одной из любимых аналогий автора является представление кота в книге Гради Буча (Gгady Booch) . С точки зрения ветеринара кот имеет определенный набор генов и характеристик и состоит из опреде_ленных биологи­ ческих атрибутов. С точки зрения любящей котов бабушки он является мурчащим дру­ гом. (С точки зрения брата автора коты явля1{)тся отличными мишенями для тренировки с духовым ружьем . Шутка!) Таким образом, с точки зрения программиста состояние и поведение кота (как и любого другого класса) рассматривается с позиции предметной области, для которой .создается решение . Для ветеринара подходит характеристика кота с биологической точки зрения. Для продавцов домашних животных достаточно будет указать цвет, характер, пол, размер и пройденные медицинские процедуры. (Если реше­ ние создается для брата, то придется указывать скорость, скрытность и успешность в охоте. Опять шутка!) Возвращаясь к классу Command, также можно отметить опреде­ ленное развитие. Двадцать лет назад все источники данных пр едставляли собой моно­ литные плоские текстовые файлы. Десять лет назад появилось упоминание логических • отношений. В настоящий момент в концепцию источника данных входит все, включая файлы XML. Следовательно, в данный момент объект Command может содержать имена . . таблиц, запросы SQL и имена хранимых процедур . Ниже рассматриваются состояния и возможности объекта Command, которые доступны в настоящий момент. Свойство ActiveConnection Свойство ActiveConnection, уже рассматриваемое ранее, указывает на объект под­ ключения, созданный явно или неявно с помощью строки подключения. (Использование свойства Act i veConnect i on дем_о'нстрируется в примерах кода ранее в этой главе.) Свойство CommandText Содержимое свойства CommandText (строковое значение ) используется поставщи­ ком данных для определения множества информации, которая будет предоставляться в составе набора данных. Свойство CommandType Свойство CommandТype содержит подсказку для поставщика, помогающую правильно интерпретировать содержимого свойства CommandText. Если в свойстве CommandText передается имя хранимой процедуры, свойство Co~andType должно иметь значение CommandTypeEnum. adStoredProcedure. Если в свойстве CommandText передается имя файла с набором записей, свойство CommandType должно быть установлено
260 Глава 11 в значение CommandTypeEnum. adCmdFile. Дополнительная информация доступна в справочном руководстве в разделах, посвященных свойствам Command. CommandText и Command. CommandType. Методы объекта Command Объект Command предоставляет только три метода. (Помните, что классы оценива­ ются с точки зрения простоты использования, полезности и эффективности . Если класс предоставляет только три метода, это .не значит , что класс не важен или бесполезен.) Ниже рассматривается применение мeтoдoвCreateParameter, Cancel и Execute. Метод CreateParameter Э.тот метод используется для самостоятельного создания объектов Parameter, кото­ рые могут быть добавлены в коллекцию Command. Parameters . Метод CreateParame- ter имеет следующий синтаксис: fieд.'t;P-a:гa.шэt.'ёiП.Naiтie As -strll'l9-J 7 _ ; I'ziype As pa~aTypeEnum = adEmpty] 1 . _ 1'/JDi:r;ectic>дAs ·Paran1eterDirectionEnum adParaminput], iJ:.;J§i_Z:~EЬ"~i:',1pQ_LQ~G~1'~J 1 [.Yal,ueJ) 4A~f? PaJ:" ainet'°'r · Name - это имя аргумента, которое можно использовать для обращения к объекту Parameter в коллекции Parameters объекта Command. При работе с SQL Sегvег имя объекта Parameter должно совпадать с именем параметра хранимой процедуры, кото­ рому соответствует этот объект . Параметр Туре описывает тип данных параметра . Этот параметр может принимать значения, описанные в перечислимом типе DataTypeEnum. Каждое значение соответ ­ ствует типу, который можно передавать в хранимую процедуру. Дополнительная инфор­ мация о возможных значениях параметра приводится в справочном руководстве в разде­ ле, посвященном типу DataTypeEnum. Параметр Direction может иметь одно из значений типа ParameterDirectionEnum. Значение этого аргумента определяет предназначение параметра: параметр мож.ет ис­ пользоваться для передачи данных входного аргумента, получения данных выходного аргумента или для получения возвращаемого значения хранимой процедуры. Имена кон­ стант, которые можно присваивать этому аргументу, говорят сами за себя: adParaminput, adParaminputOutput, adParamOutput и adParamReturnValue. Аргумент Size используется для указания размера значения в байтах. Арtумент Value содержит значение аргумента, передаваемого в команду . В следующем прИмере показано применение метода CreateParameter совместно с методом Append коллекции Parameters для создания объекта Parameter и добавле­ ния его в коллекцию Parameters с помощью единственной строки кода . Далее в примере выполняется подключение к серверу SQL Seгve1·, который хранит базу данных Northwind, и вызывается хранимая процедура Sales Ьу Year:
Доступ к данным с помощью ADO 261 то; ,.,., s4t coiтUiiand. = New ё:ommand. 11: ;12': ' :в: f1 4: 115: i16, : ;17 : :18 : 19: ' 20: f21: :22: ' 23: ,24: :25, 26: \~ : 27: 28: , 29: j~' ' 30: 31: i32: 33: :З4: 035: 36: 37: >38 : Cqinmand. Ас t i veConnect ,ion = Connect ionString co!nmand,. Comma ndText "[Sales Ьу Year]" , Coinmand.CommandType = CommandTypeEnum.adCmdStoredProc Dim, BeginningDate As ADODB . Parameter , Dim EndingDate As ADODB:Parameter Dim ·.StartDate As, Date ~taitDate ~ #1/ 1 / 1995# Dim EndDate As Date EndDate = #1/1/2004# Set BeginningDate = Command. CreateParameter ( " @Beg'inning_Date " , DataTypeEnшn. adDate, ParamE;!terDirectionEnurn. adParaminpi:it, StartDate) , · ,. Set EndingDate Command.CreateParameter("@Ending_Date", -' DataТypeEnum.adDate, EndDate) Cal1 Command . Parameters.Appeild('BeginningDate) Call Command.ParametEO>rs.Append(EndingDate) Dim Recordset As ADODB ,.Recordse,t . Set Recordset = Command.Execute Call Sheetl . Range("Al") .CopyFromRecordset(Recordset) :~ ,9 :J~:.nij , S,ф Новая строка подключения определяется в строках с 3 по 6. В строках 9 и 10 определяется и инициализируется объект Command. В строке 12 объект Command связывается со строкой подключения. При этом объект Command самостоятельно создает объект Connection. С друтой стороны, можно создать объект Connect i on и присвоить его свойству Ac tiveCon- nection. В строке 13 указывается имя хранимой процедуры, а в строке 14 свойство Com- mandТype устанавливается в значение CommandТypeEnum . adCmdStoredProc. На основе этого значения объект Command принимает решение об интерпретации содержимого свой­ ства CommandText. В строках 16 и 17 определяются два парам:етра, которые передаются хра­ нимой процедуре Sales Ьу Year. В строках с 19 по 32 определяются и инициализируются два значения, используемые для инициализации параметров. Обычно такой подробный код не требуется, но он проще в отладке и легче для понимания. , В строках 25, 26, 28 и 29 метод Command . CreateParameter применяется для ини­ циализации каждого параметра. Имена параметров можно получить из хранимой проце­ дуры. Тип парам:етра определяется точно так же. Так как два параметра используются в качестве аргументов, параметры инициализируются с помощью значения Parameter - 'DirectionEnum . adParaminput и фактического значения параметра. Наконец, объек­ ты параметров добавляются в коллекцию Parameters объекта Command (строки 31 и 32), запускается выполнение команды (строка 35) и копия полученного набора данных копируется на лист.
262 Глава 11 Метод Ехесиtе Этот метод выполняет текст команды, который предоставлен в качестве значения свойства CommandText объекта Command . Следующий синтаксис метода Execute ис­ пользуется для запросов на выполнение операции (запросов, которые не приводят к воз­ врату набора данных): ;e;aц_::,-~§Rii!i8,p._д., ~X.~c·u~te_ ( {B-~gid§A;{f~qt~d] J [ Paraniefe} ,S) , jj)I,5.t;J~ sJГ;: Для запроса на возврат данных применяется следующий синтаксис: ;s et:"Re C: or d.set ~· c ommanд.. Exe cute '(ГRecordsAf.fectedi , '\оР.t.:З:о,!:.1~Р . . " ".·~ .. Аргументы RecordsAffected и Options аналогичны соответствующим аргументам метода Execute объекта Connection. Этот метод описывался в разделе "Методы объ­ екта Connection" ранее в этой главе. При выполнении оператора SQL, требующего пере­ дачи большего количества параметров, аргументу Parameters можно присвоить массив значений, по одному значению для каждого обязательного параметра._ (Пример передачи массива параметров приводился в конце предыдущего раздела.) Коллекции объекта Command В примере использования метода CreateParameter были показаны все составляю­ щие, необходимые для запуска команды. В конце обсуждения рассмотрим . коллекции Parameters и Properties. Коллекция Parameters Коллекция Parameters содержит все объекты Parameter, связанные с объектом Command. Параметры используются для передачи аргументов оператору SQL и храни­ мым процедурам, а также для получения вывода и возвращаемых значений хранимых процедур. Коллекция Properties Коллекция Properties содержит специфичные для поставщика или расширенные свойства объекта Command. Некоторые производители предоставляют важные настрой­ ки, о которых стоит знать разработчикам. Дополнительная информация о специфичных для поставщика свойствах доступна в справочном руководстве. Использование ADO в приложениях Microsoft Excel В этом разделе вся информация будет сведена воедино. Таким образом, речь пойдет об одновременном использовании показанных ранее принципов программирования в Excel и методов работы с библиотекой ADO и языком SQL. Приложения Excel часто применяются для работы с данными, которые хранятся во внешних источниках. Чаще всего в качестве источника данных выступает база данных Access или SQL Server, но су­ ществуют приложения, получающие доступ к данным из текстового файла и даже из книг Excel. Далее будет показано, что библиотека ADO значительно упрощает получение дан­ ных из разных источников.
Доступ к данным с помощью ADO 263 Для запуска примеров кода, выберите пункт ToolsqReferences (Сервис~::::>Ссылки) в редакторе VВЕ·. Откроется диалоговое окно References (Ссылки). Прокрутите список и найдите запись Microsoft ActiveX Data Objects 2 .7 Library. Установите флажок напротив этой запис.и (как показано на рис. 11.5) и щелкните на кнопке ОК. 6vail~Ыe Ref~rences: ~ Visual Basic Fo r Applications [.;.;Mcrosoft Excel 11. О Object LiЬr агу · \;г~ OLE Automation ~~ Мicrosoft Office 11.О O~ect L}t;J (yj!;:!§'ft$ii·!!ФЭl•NoKSФ.: lйfMk С IAS Helper СОМ Component 1.0 Туре Lihrary [) IAS RADIUS Protocol 1.0 Туре Library С дctive DS Туре libr ary С Active Setup Control Lbrагу С ActiveMovie control type liЬrary ГJ ASFCoop 1.о Туре library Гj ATL 2.0 Type librar; C Ыockdriver 1.0 Туре library ~~%':~_.n ~~~;'~·r·~~~~<~"'~~··;~:~~i ~- Priority Г M<rosoft ActiveX Data ebject s 2 .7 liЬiar; ········-·······-··-······- ок Cancel a_rowse .. " ttelp ! Location: C:\Pr09ram Files\Common Files\System\ado\m~dolS.dП ! lanQUage: Standard ! ....................................... ' 1 1 ·1 Рис. 11.5 . Подключение библuотеки Microsoft ActiveX Data Objects 2. 7 Library Обратите внимание, что в системе может существовать несколько версий библио­ теки АDО . Использование библиотеки ADO вместе с Microsoft Access Остаток этой главы посвящен примерам использования баз данных Microsoft Access и MiCI·osoft SQL Serveг. Сначала рассмотрим применение баз данных Access, после ?его - Micгosoft SQL Se1ver. (Важно помнить, что библиотека ADO поддерживает использова­ ние любого источника данных, а примеры в этой главе выбраны из-за доступности соот­ ветствующих баз данных.) Подключение к Microsoft Access Для подключения к базам данных Micгosoft Access библиотека ADO использует постав­ щик OLE DB для Microsoft Jet (Jei- это механизм управления базами данных, применяе­ мый в Access). В данном случае используется поставщик версии 4.0. Для подключения к базе данных Micгosoft Access достаточно указать поставщика ADO в · строке подклю чения и спе­ цифичные для поставщика параметры. Ранее в этой главе было показано, как создавать строку подключения с помощью _диалогового окна Data Link Properties. Стоит немного подробнее рассмотреть составляющие строки подключения к базе данных Access: О Provider=Microsoft. Jet. OLEDB. 4 . О - обязательный компонент строки под­ ключения, описывающий поставщика OLE DB, который будет использоваться для установки подключения;
264 Глава 11 О Data Source= [п олный путь и имя файла базы данных Access] - обяза­ тельный компонент строки подключения, который указывает путь к файлу базы данных; О Моdе=режИм - необязательный компонент строки . подключения, описывающий допустимые операции над источником данных. Доступные типы подключения пе­ речислены в типе ConnectModeEnum. :Iаще всего используются следующие зна­ чения параметра: О adМodeShareDenyNone - после открытия базы данных другим пользователям предоставляется полный общий доступ; О adМodeShareDenyWr i te - после открытия базы данных другим пользовате­ лям предоставляется доступ только для чтения; О adМodeShareExc 1 us i ve - база данных открывается в однопользовательском режиме. Другим пользователям подключение к базе данных не предоставляется; О User ID= имя_п ользователя - необязательный компонент строки подключе­ ния, используемый для аутентификации пользователя. Если для подключения к базе данных требуется имя пользователя и оно не указано в качестве значения этого аргумента, подключение к базе данных не устанавливается; О Password=пapoль - необязательный компонент строки подключения. Этот ар­ гумент используется в паре с User ID для аутентификации запроса на подключе­ ние. Если база данных защищена паролем, этот аргумент является обязательным . В следующем примере показана строка подключения , в которой применяются все ар­ гументы, описанные выше : iP\iЫi c '"tГonst:Гcan.n.ёc:tr5ilsEiing.·: л:s ·- ~;:й::riщ;r'~ -:__ · ·• · · r с.. · · ~·. PJ;oyider=Microsoft ; Jet. OLEDB. 4. О;" & . · "Da ta Soiirce=C: \~il es\Northwind.ЩdЬ; " & "' "Mode=Share Exc1usive ·" & ,· "Use:i:- ID=Adrnin · '." & · ~­ =·:'!'.c:t§swoз;_~Psi.~q~Q.;:g~ -""""'· Обратите внимание, что при инициализации объекта Connection с помощью полной строки подключения, для указания значения Mode используются удобочитае­ мые значения . Например, при определении полной строки подключения для аргумен­ та Mode можно применять строку Share Exclusive. Но если и нициализировать свойство Connection. Mode из кода, то придется использовать эквивалентное значе ­ ние Connec tModeEnum. adМodeShareExc 1 us i ve. Самым надежным методом созда­ ния строки подключения для любого поставщика является применение диалогового окна Data Link Properties. Получение данных из базы данных Microsoft Access с помощью простого запроса В следующей процедуре показано получение данных из базы данных Microsoft Access с помощью простого текстового запроса. Полученные данные копируются на лист Excel. .рμ~; ~~\~--~ --~p.;~~~~~~~~~8lif1' ~:·· ':"i . . . ···;.···> · " . . . onnectio.nString As Stririg :Piovii:ler=мicro·soft . Jet. OLEDB. 4 . О; \' , + P2-~i..9.0.Jt..;..S§~"\P.!:'9.~F<tl!i . fj.)§.~.~t-f~s;ro~яKt~ :· . t , _ _,;_,, "·
Доступ к данным с помощью ADO 265 11'&· •.\ ИниЦl,;ал~~ация объекта Records.et и отправка 's et Recordset = New ADODB. Recordset · . cail Recordset.Open(SQL, CorinectionString, _ CursorТypeEnum. adOpenForwardOnly , · _: L,ockTypeEnum.adLockReadOnly, CommandTypeEnщn.adCЩdтe . с ' УдостоверИтся, что записи получены tf . Not Recordset.EOF Then ' Копирование Полученных зацисей на . ли ·ст · ., . Call Sheetl :Range ( "А'2"). CopyFromRecordset (Recordset.) Добавить заголовки with Sheetl.Range("Al :в1 :· ) . . Value = Array·( "Название компа 'нии", конт,·актного лица" ) .Font.Bold = True End.. With ·, '> Установить . ширину сто.Лбца в соответст~ии с Sheetl. UsedR;;_nge. EntireCoJumn. A~toJ?3. t · Else . · Call MsgBox( "Ошибка: не " лолучен·о ·· ни одной записи.':, End If . •' .; ;у !· · ~: Удалить обЪект Recordset, есл1'1 он еще существует ~~- . ReI:or~~eecto_rc~s0e8~. State And Obj ectStateEnum. adStateopen) ~>.·. Set Recordset = Nothirig f~nd · sиь· .. +•. "·•"'·''··'"·~·,,._, ,,,,_w~.;д ,>.; '>:>'·'"""~" "" ·" " "' "" "' "' В данном случае из библиотеки ADO применяется только объект Recordset . Как было показано в начале раздела, посвященного библиотеке ADO, все объекты верхнего уровня могут создаваться и испо.irьзоваться независимо. Если в процессе работы прило­ жения планируется выполнять не.сколько запросов, стоит создать отдельный . общедос­ ·тупный объект Connection. Это позволит использовать возможность библ1;1отеки ADO создавать пул подключений. Синтаксис метода Recordset . Open оптимизирован для получения максимальной производительности. Поставщику сообщается тип команды, которая передается в аргу­ менте Source (adCrndText, простой текстовый запрос), и используется однонаправлен­ ный курсор, предназначенный только для чтения. Значение свойства CursorLocation не указывается. Часто такой курсор называют брандсбойтом (fireliose), так как это самый быстрый способ получения данных из базы данных. Модификации в интересующий лист не вносятся до успешного получения данных из базы данных. В таком· случае не придется отменять изменения, если обработка запроса
266 Глава 11 завершится неудачно. После получения данных метод CopyFromRecordset позволяет переместить данные из объекта Recordset на лист электронной таблицы. В конце про ­ цедуры выполняется форматирование заголовков столбцов и удаление oбъeктaRecordset . Получение данных из Microsoft Access с помощью хранимого запроса База данных Microsoft Access поддерживает создание и сохранение запросов SQL в ба­ зе данных . Сохраненные запросы позволяют получать данные так же, как и при исполь­ зовании простых текстовых запросов . В следующей процедуре показано применение за­ проса, сохраненного в базе данных Access : 'Public· su.ь save<16i.ler:Y< г- • i.. ' ·Dim Fi~l~ А~ A~OD~ : Field . Dirn Recordset As ADODB. Records·e ·t Dim Offset As Long , · Co.nst ConnectionString As ,String_. = "Provider=Microsoft . .Jet. OLEDB. 4 . О;" + "Data Sour·ce=C :_\Program Files\Micrqsoft· _ ". ,;Offii::'e\OFFICE11 \SAMPLES\Nor'thwind ~ rnclJ:;'; . : ~Persist Secl1ri ty Info=False" ' D- ;'11 ' 1 ошибка : не _: ; .Удаhенй~ объекта Rec6rdset ' Reco'rdset. Close :'- • . Set Recoj:"dset = Nothiri.g" · Обратите внимание на различия между вызовом Recordset. Open, который исполь· зуется в этой процедуре, и вызовом с применением простого текстового за11роса. В этом случае, вместо предоставления строки с оператором SQL, указывается имя сохраненного запроса, который должен использоваться для получения данных. Кроме этого, постав·
Доступ к данным с помощью ADO 267 щику сообщается тип запроса (табличный запрос). Поставщик Jet OLE DB считает со­ храненные запросы и запросы всего содержимого таблиц базы данных одинаковь~ми . Так как оператор SQL создавался другими разработчиками, имена получаемых полей заранее неизвестны. Также неизвестно количество получаемых полей. Таким образом, для создания правильного набора заголовков для столбцов на листе необходимо про­ смотреть коллекцию Fields объекта Recordset и получить эту информацию динами­ чески. Для этого объект Recor dset должен оставаться открытым, поэтому поля на листе добавляются до удаления oбъeктaRecordset. Вставка, обновление и удаление записей в базе данных Microsoft Access с помощью простого текстового запроса SQL 1 Для выполнения текстовых запросов INSERT, UPDATE и DELETE используется одина- ковый подготовительный код. Таким образом, добавление, обновление и удаление запи­ си будет показано в пределах одной процедуры. Обычно так не делается, но данную уни­ версальную процедуру можно превратить в специализированную простым удалением не­ нужного раздела. В этом случае будет использоваться таблица Shippers из базы даннь1х Northwind. Оригинальное содержимое таблицы показано на рис . 11.6 . Перед модификацией . этой таблицы стоит обратить внимание на два момента. Во-первых" заголовки таблицы не­ .много отличаются от имен полей, которые используются в запросах SQL. Это связано с тем, что в базе данных Access с каждым полем таблицы связано свойство Caption. Зна­ чение свойства Caption отображается вместо имени поля. При этом в запросах SQL не­ обходимо использовать имена полей. Во-вторых, обратите внимание , что в последней строке столбца Shipper ID содержится значение " (Auto NwnЬer) ". На самом деле это не значение, а признак того, что значения в столбце Shipper ID генерируются ав­ томатически механизмом управления базой данныхJеt. Этот столбец представляет собой основной ключ таблицы Shipper, и поле AutoNwnЬer является распространенным ме­ тодом генерации уникального значения основного ключа. Как будет показано в следую­ щем примере, изменение значения. в поле AutoNwnЬer невозможно. Если необходимо запомнить ссылку на вставленную в таблицу новую запись, придется извлечь из таблицы значение поля AutoNwnЬer, которое было присвоено этой записи. Такая операция пока­ зана в следующем примере : Рис. 11. 6. Автоматически генерируемый первичный К111оч ~i :' i?uЫ:Ге . siiJ:5 tiieickE:rror 'Бyvai RecordsAffected As ·tong : ·_ у2: ByVal Expected As Long, ByVal Description As. String) !З: !4; If RecordsAffected <> . Expected Then · ·-~-: . c._ a _l.l Raise_Error \De~cr~J?,Ч.Ol.l)
268 Глава 11 ·;б :. 7· ia; i9: !10 i ll: 'i2: (ByVai 'пescription As stting) ·. .·· (vbObjectError ;1- 1024! , · Descriptioh) ~·~co~~sAtfе~Ееа is Recoblset:. As' ADODB . ;: -~<, ;;.... ,,, ('·:' ~' ' :, .. Re~ords~t .koF Then . Cali .RaiseError ("Ошибка 'If.. \ '., .. ... ~;-, ' Coпunahd As . ~~А ' Di m ·Rec61',dsAffected ..As Lori'g .. c;otnщaтid ~ Coпun<:indтext coffimandText ;:: ... /·.~:'\>(!!,.
Доступ к данным с помощью ADO 269 ,64': ' 6.'5: ~.66: ' 67: 68: 169': )О: '71: · ь1т · саmrr iаП:ё И;ех Г дs string . CommaridText = "UPDATE , Shippers ' SET Ph one= ' (206) ' "WHERE ShipperID=" & CStr' (Key) .. -~ Descr:iption As String = _ '•Ошибка выпоЛнения оnератора UPDATE." Р2: ExecuteCommand(Comrriarid, Comm<tndText, 17.3: ,, 17'4 : End Sub ;75':• 76: ..PuЬlic Sub DeleteRecord(ByVal · ~ ByVal Кеу As Long) \. Command As ' 77: :78: ~79: ..~ " :80: 81: 82: 83: 84:' , 35: Dim CommandText As ' S<tring CommandText = "DELETE FROM ' Shippers WHERE & CStr(Кеу) & "; " Const Descriptioп As String = . : _ _ "ОWибка выполнения оператора DELETE." Call ExecuteCommand(Command:, Command~e~t, 86: End Sub , 87: . 88: Private Property Get ConnectionString () As String :89: ConnectionString . = _ . 90':• "Provider=Microsoft , Jet.OLEDB .4 .0;" .+ _ •91.: "Data Source=C: \Program Files\Microsoft " + ' 92: ' "Of.fice\OFFICEll \SAМPLES\Northwind. mdb; Persist \ ~rnfci = False" :93: . 94: j;;nd Property ,95: ' 96: ' 9i: · PuЬlic Sub InsertUpdateDelete () · D im Command As ADODB.Coinmapd ' Dim Кеу As Long Оп Error GoTo ErrorHaridler ; 98: ,99: ;100: :101; >102; fl03: t104 i1 os !106: \107: i1p8; ,1 09: ,110: ;111,: .112: 1113: ill4: '115: '116:· !:1,17 :, Set Command = New ADODB.Command Coinmand.Activeconnection = ConnectionStri ng Call InsertRecord(\=ommand) . Кеу = GetPrimaryKey(Command) Call UpdateRecord(Commarid, Кеу) Call DeleteRecord(Coп\mand, Ке~) · вrrorExit: Set Command Exit Sub :118: ErrorHandler: Nothing •119: Call MsgBox (Err .Description, 120·: Resume ErrorExit J2~=~. ~riCi. e\l}? ___ . _ ~ •.. _. ··-·-~ ". vbCritical)
270 Глава 11 Существует много методов декомпозиции решения. Предпочтительней использовать небольшие самодокументированные простые для понимания методы, которые просто отлаживать и можно применять повторно. Этот стиль демонстрируется в показанном выше листинге. Некоторые программисты (и авторы этой книги) могут создавать боль­ шие методы с большим количеством комментариев, но такие монолитные методы обыч­ но все равно выполняют определенную задачу. В данном примере проблема разбита на такие составляющие: CheckError (проверка ошибок), RaiseError (выдача сообщений об ошибках), GetPrimaryKey (получение основного ключа), ExecuteCommand (выпол­ нение команды), InsertRecord (вставка записи), UpdateRecord (обновление записи), DeleteRecord (удаление записи) и InsertUpdateDeiete. Процедуры CheckError и RaiseError используются для проверки количества из­ мененных записей и выдачи сообщения об ошибке, если количество записей не совпада­ ет с прогнозируемым. Процедуры GetPrimaryKey, InsertRecord, UpdateRecord и DeleteRecord используют процедуру ExecuteCommand для отправки запроса к базе данных и проверки результата. Процедура GetPrimaryKey вызывается сразу после ко­ манды INSERT (строки 107 и 108) и отправляет базе данных запрос SELECT<=::>IDENTITY. В результате этого запроса выдается основной ключ, сгенерированный при выполнении последнего запроса INSERT. В процедурах UpdateRecord и DeleteRecord демонстри­ руется использование основного ключа для поиска конкретных записей. Наконец, в ме­ тоде InsertUpdateDelete выполняются различные запросы. В этом методе демонст­ рируется важность повторного применения и обработки ошибок (строки с 114 по 121). . '' ' . ' ''<~ '$ Обратите в'ни'мание, что запрос t::;iIDENTITY работает только в базах даннь1х Access,' ко- торые сохранены в формате Access , 2000' или более поздней версии. В Access 97 такие заnрqсы _не· поддерживаtОтся,.. Использование ADO вместе с Microsoft SQL Server В пред:ыдущем разделе рассматривалось выполнение базовых запросов средствами библиотеки ADO. Так как библиотс!ка ADO проектировалась для предоставления общего интерфейса для различных источников данных, базовые операции для Access ничем не отличаются от базовых операций для SQL Sегvег. Следовательно, после краткого описа­ ния важных отличий применения ADO вместе с SQL Serve1·, в этом разделе рассматри­ ваются более важные темы, включая хранимые процедуры, множественные наборы за­ писей и отключенные наборы записей. Использование SQL Serve1· подробно не рассмат­ ривается, так как этот вопрос выходит за пределы тематики данной книги . Для получе­ ния дополнительной информации об использовании SQL Seгver стоит обратиться к одной из лучших книг: Professional SQL Server 2000 Роберта Виера (Robert Vieira) от из­ дательства Wrox (ISBN 1-861004-48-6). Подключение к Microsoft SQL Server Для подключения к базе данных Micгosoft SQL Sегvег в строке подключения ADO достаточно указать поставщика OLE DB для SQL Se1ver и все необходимые параметры поставщика. Ниже приводится список часто используемых аргументов строки подклю­ чения, которые могут потребоваться при подключении к базе данных SQL Sегvег.
Доступ к данным с помощью ADO 271 0 Provider= SQLOLEDB. О Data. 2Sоurсе=имя_сервера - ее.Ли это SQL Seгver 7.0, то в качестве имени сервера указывается NetBIOS-имя компьютера, на котором установлен SQL Serveг. После появления SQL Seгver 2000 появилась возможность установки нескольких серверов на одном компьютере. В этом случае имя сервера будет выглядеть, как Имя NetBIOS\Имя SQL Serveг. Если SQL Server· ус тановлен на том же компьюте ­ ре, на котором установлено приложение электронной таблицы, можно использос вать имя localhost . О Initial Саtаlоg=имя_базы_данных - в отличие от Access один экземпляр сервера SQL Sегvег может хранить несколько баз данных. Этот аргумент описыва­ ет имя базы данных, к которой необходимо подключиться. О User ID = имя _пользователя - это имя используется при аутентификации на сервере SQL Sегvег. О Password=пap oль .- используется при аутентиф1икации на сервере SQL Sегvег. О NetworkLibrary=netlib- по умолчанию поставщик OLE DB для SQL Serveг попытается подключиться к SQL Servel" с помощью сетевого проrrижола и.менованнъ.tх 'Конвейеjюв (narned pipes network protocol). Этот протокол необходим для получения доступа к внутренним механизмам безопасности операционной системы Windows (эти механизмы рассматриваются да.лее) . Но иноl"да бывают ситуации, когда име­ нованные конвейеры не работают. Такая проблема возникает при доступе к SQL Sегvег с компьютера под управлением операционной системы Windows 9х, а также при доступе к серверу по сети Inteгnet. В таком случае предпочтение отдается про­ токолу ТСР/IP. Предпочтительный протокол может быть указан на каждом ком­ пьютере. Для этого следует воспользоваться утилитой SQL Seгver Netwoгk Utility или аргументом строки подключения NetwoгkLibгary для указания имени сетевой библиотеки ТСР / IP, которая называется dЬrnssocn. О IntegratedSecuri ty=SSPI - этот аргумент строки подключени:~ указывает не­ обходимость использования встроенных механизмов безопасности операционной системы Windows. Встроенные механизмы безопасности применяются вместо ме­ ханизмов аутентификации SQL Sегvег. При .использовании этого аргумента, аргу­ менты UserID и Password игнорируются . Замечание об использовании механизмов безопасности SQL Server Существует три механизма безопасности, поддерживаемых SQL Sегvег: встроенная аутентификация SQL SeгveI, механизмы безопасности операционной системы Windows и смешанный режим. Механизм аутентификации SQL Seгver требует добавления отдель­ ных записей пользователей в SQL Sегvег, также каждый пользователь перед подключени­ ем должен на.звать имя и ввести пароль. Такой механизм обеспечения безопасности чаще всего используется· для предоставле­ ния доступа к SQL Sегvег из-за пределов локальной сети. При применении интегриро- ' ванных механизмов безопасности операционной системы Windows программное обеспе­ чение SQL Serveг использует те же имена и пароли, что и для регистрации пользователей в сети Windows. Смешанный режим поддерживает применение любого метода аутенти­ фикации.
272 Глава 11 Ниже показан пример строки подключения, в которой присутствуют базовые элемен· ты. Помните, диалоговое окно Data Link Proper1ies поддерживает создание строки под­ ключения не только к SQL Sегvег, но и к множеству других поставщиков. ;const comiectlonstriilg A:s ~·str'lng = _ "Provid"'r=SQLOLEDB.1; Integrated Security=SSPI; '' + _ ._ " Pe ~ si s t Security Info=Fa1se; Ini t i al Cata1og;NorthwindCS; ·" .+ "Datд source=LAPS,OO;Wo:r::k'stat_ion ID =L}\PSQO;" .. Хранимые процедуры Microsoft SQL Server Синтаксис простых текстовых запросов к SQL Se~el' не отличается от синтаксиса за· просов к Access. Отличается только · строка подключения . Так как текстовые запросы уже рассматривались, обратим внимание на вызов хранимых процедур, которые находятся в базе данных SQL Sегvег. Хранимые процедуры являются доступными по имени предварительно откомпили­ рованными операторами SQL. Они очень напоминают процедуры VBA, так как храни­ мые процедуры поддерживают передачу аргументов и возврат значений. Ниже приво· дится пример простой · хранимой процедуры, которая может использоваться для выпол· нения запросов к таблице Orders и представлению Order Subtotal: ~лr;т:ЕR ·:ргосёд.ur е- а:ьа.t БШi>IоУ:её .. sа.·1е,5-ъу counfr:Y Г @вёgTiining.::.ьa.Eё' · · • 1-~ datetime, @Ending_ Date datetime AS SELECT Employees,.Country, ·. . '~ Employees . L .as ·tName, · ' · ' Em,Plbyees .FirstName, . Or.ders. ShippedDate, Orders .or·d e rID, .. "Order Subtotals" . $ubtota1 AS SaleAmount FROM Employees · ~ INNER JOIN (Orders INNER JOIN "Order.' Subtota1s" · · 1 ON Orders.OrderID = " ' Orcier . Subtotals'".OrderID) · ON. Employees.EmployeerD ·= Orders.EmployeeID WНERE 1~,. Orders. ShippedDate · L ... J3@!.YJ.§..~!1~ .@B,eg ipn:i_pg_Qa,t:~'f~.~I}c1 . ~Ep_c!Jrig_Da,t:. e ...•~- _ Эта хранимая проЦедура принимает два apгyмeнтa:@Beginning_Date и @Ending_ Date. Она возвращает набор записей, в котором хранятся значения полей, перечисленных в пред· ложении SELECT . Возвращаются значения записей, входящих в таблицу Orders и представ· ление Order subtotals, значение поля ShippedDate которых попадает в период от Beginning_Date до Ending_Date. Библиотека ADO предоставляет простой способ вызова хранимых процедур через 1 объект Connection. Она рассматривает все хранимые процедуры в текущей базе данных в качестве динамических методов объекта Connection. Хранимую процедуру можно вы­ зывать как и любой другой метод объекта Connection. Параметры хранимой процедуры допускается передавать как аргументы метода объекта. Если хранимая процедура возвра· щает набор записей, в качестве последнего необязательного аргумента можно передать ссылку на объект Recordset. Этот метод больше подходит для одноразовых процедур, так как для многократного вызова этот способ является не самым эффективным. Преимуществом этого способа яв· ляется простота программирования. В следующем примере показан вызов показанной выше хранимой процедуры в качестве метода oбъeктaConnection: su.п .::вx~cuif~;sEO'fё'dt>ro'C:Asмe:t::Ъ9dП •<·-~ ;:. , :~::'' • ,", ,.· ;' .. ·>:~t').;;,'.fi->-'. · .- ' _ ,_ -, ·~·~·. ' Corщection , As ADO.DB . Connectioh Recordse t A.s ' AЬooв:Recordset · . "/ ~- '
Доступ к данным с помощью ADO 273 ' - _· con'st ·~вnпeCt:ГoЪst:r:L'r!g ''As::se:цrig. -;,; ·:_ '."'~j:;·;,· ·· "Provider=SQLOLEDB. l ;,Integrated securj~~~,ssP}; ••.• + . · PeriЗist' security ·,:tnfo~Fa1se ;.J:ni tiai cat;,~log=Northwincic.s ;-" · + Data · source,,,LAPВOO;Worksta\:iori' IDc;;L'APSOO; "' · · " ·~" • .", ~~.·;·; ; .~,,:" ' ,~-, ~·--{," ,·on , E:rror Go'J:9·, c;J-~anup;_;:: __ . . ~-/> · " . : Set connection "' New 'АDощз. connectic:ш ,'/ s 'et R.ecordset ·, = :New ' ADODB ,·Recordset ·.А i.- Dim · Start:D'at.e As ' Date; '. StartDate ,. ,;, ',#1/J. /1995# ·+ ,. En~Date :О #1 11 / 200.4# . . .. _,." Connection.Employee_Sales.:-:_by_CoЦntry < startDate ; ' EndDate, Reco~dset ' ·· ' , ~J~\,·Y . , Sheetl.UseClRange.~ntiгeColu.Ji.f~i.itbrif{~ ;· ' . . . . '.т ,_, "· .; C1eanup: . . .. .. .· < . . : :_rf · (Err. NuпlЬer <> О) тhen ' D'ebug ~ ~r±nt в:tr ; Description •J: f (Connect ion. State· = · . opj .~ctS~ateE:num . adStateOpen) : \~, Then .Connection. Close : ·-.~;<. ">'· ·k -~> 1if (Recordset. State ;= ., obj._e~'tstateEш;un. adState.oJ;>.en) · ~ / Pl'l .en Recordset . Cldse " ·· ·. · · . ,· .; ~r:.44.. eor) _ В этой процедуре вызывается хранимая процедура Employee_Sales_ by_ Country. Зна­ чения #1/1/1995# и #1/1/2004# передаются в качестве арrументов @Beginning_ Date и@Ending_Date. В результате вызова хранимой процедуры возвращается массив записей о продажах, сделанных сотрудниками с 1995 по 2004 год. Обратите внимание, что объект Connection необходимо _ создать до наполнения динамических методов , а объект Record- set инициализировать до передачи его в качестве арrумента хранимой процедуры. Самым эффективным способом работы с многократно вызываемыми хранимыми процедурами является подготовка глобального объекта Command, представляющего хра­ нимые процедуры для остального кода. Объект Connection будет храниться внутри свойства ActiveConnection объекта Command. Хранимая процедура будет храниться в свойстве CommandText · объекта Command, а аргументы хранимой процедуры переда­ ются в виде членов коллекции Pa:i;:-ameters объекта Command. После создания объекта Command его можно вызывать несколько раз, не опасаясь на­ кладных расходов, возникающих при выполнении описанных выше операций. Например, создадим простую хранимую процедуру для вставки записей в таблицу Shippers: ALTER""~RQCi~~ьt.JRE·::·Inswe,rt·sь1pper~s~·v '/~-v ~ ·r -- ='~":~~,"",., . . , '@CompanyName rvarchar (40), @Phone · nv:archar(24) ;,дs ::tNSERT INTP Shippers HCompanyName, Phone) ;VALUES (@CompanyName, @Phone) :RETURN @@IDENТITY
274 Глава 11 rсR.Е:А.тБ :PR:ocEbuR:]Гirise:i:-t:shlpper s · @c6inpany:Name · nvar c11arT46) ;··· · ~~ , @:еЦsте ,nve1J:::c;h?:r(}_4)_ , A§ ~!'J_§ER'I' I NTQ spipp§.~s . ~· ·~ = « ,:. . . .... Не сложно заметить, что описанная хранимая процедура принимает два аргумента @CompanyName и @Phone, которые используются для вставки значений в соответствую ­ щие поля таблицы Shippers. В примере работы с базой данных Access было показано, что в таблице Shi ppers три поля. В хранимой процедуре первое поле, Shi pperID , не обрабатывается . Это связано с тем, что как и в таблице Shippers в базе данных Access Nor t hwind, поле Shi ppe rID в базе данных SQL Serveг Northwind заполняется автоматически. Но­ вое значение поля генерируется при каждой операции вставки записи. Кроме этого, ис­ пользуется похожий способ извлечения автоматически сгенерированного значения. Для этого применяется системная функция SQL Sегvег @@IDENT I TY. Но в данном случае для получения значения поля ShipperID дополнительный вызов не требуется, так как зна­ чение сгенерированного поля возвращается в результате работы хранимой процедуры . Для демонстрации реалистичного приложения в следующем примере используются глобальные объекты Connection и Command, процедуры для создания и удаления под­ ключения, процедура для подготовки объекта Command к использованию, а также проце­ дура, применяющая объект Command: 1o:Pt.'i6n Ехрli'ёй:· & 1. . . {PuЬlic Corrirnand As ADODB : commarid · /Pubiic Corinection As ADODB. Connection . ~- .. !Pri vate Sub Creat eConnection () · ·Set . Connection = ;New ADODB ~Connection 1: Call Corine·ction.Open(ConnectionString) jEnd Sub . . ' fPri;~te Sub ~~stroy~bnцection () .. .. . Q If. .· (Connection .Bt.ate ,Obj ectStateEnUin.. adSt:ate.Ope11) · . Connection. Close · " · · '· · •· tEndIf . f• ' . ' t1'rivate :uь Pi-ep_a~_ecornп\~~?,?!Jj .ec;t() . 11. " ,. - ., ' :'' ' ',1 .. .. ·:' ·.;с' . > '> ·; ~ set Cornmand = , }Jew ADODB ~ command · . _. ·..... . .. •• f '"'Set Corori\and.ActiveConnection ::0 Connect'ioiJ. }, .• c'orrirnand. CommapdText. . " •· ;rrisi=rtshipp~rs Г , Commahd.CommandType .. = .: adCmdStoredProc ',· . ' '{ . . ' са.11 · command .. Pararoe.ters.Apperid( _ . Corrirnand : createPar ameter ( '' .@RETURN_::VALUE" ~· . DataTypeEnum ~adi nteger, .' Paramet.erDirectionEnum. adParamReturriVai ue ' · О) ) ', .~ . i}. ·:\";• "~ ., - . ·- ·--· '' ...·· .. ''j; -··-{' '·.:<< . . Call · Comm;nd. P<~xameter§. Append ( ·:.. .. ' ·. . ... . ., , '(":ommand. CreateParameter (" @CompanyNaine" , ' DataТypeEnum. adVarvyChar, i..... •. . ~.. ~R<1,rёЩI§1:,.§r,12 ,i !:'..§ <;:t:i.2!1 Er.:iч!iJ., a!J.R!=l;: сз.111:I !11;:"1 t ,' ·.. 1ЩJ • '" · , _, .~:"-" -"'·· ,__ ",,,j;" , .
Доступ к данным с помощью ADO 275 ;_. ~··· O!l Erro.r ' GoTo ErrprHandler < , :1гcreateconnection ; '!"rej::>areCommandObj .ее t ;.Comm~nd. Par~meters ( "@CompanyName"} . V.;,lчe = " Air ~. Commana.Parameters("@Phone") . Valu.e =· ·: (206) . 555 cai1 .· comma nd ; Execute (RecordsAffected, ' , , Execut.eOptionEnum': adExecu teNoRecords) . If (RecordsAffe&ted <> ..•1') Then , · Call ' Err.Raise(vbObjE!ctError + 1024, , Descriptio,il: ="Ошибка использования объекта · Comпiand . "'') ~·.End If Кеу , = Command . Parameters("@RETURN_ VALUE "} .Value Debug.Print "Значени е ключа новой записи: " · & CStr(key} !ErrorExi t : ,! t Set Command = Nothing t De.stroyConnection j E_xit Sub ;ErrorHandler: · Cali MsgBox(Бrr.Description, Resu!ne ErrorEx it l!::_rJ..0, §.~b ~·· ··' . ,,___ ~~- vbCri tical} ' ' В обычном приложении объекты Connection и Coпunand не создаются и не удаляют­ ся в процедуре UseCoпunandObj ect . Эти объекты предназначены для' многократного использования , по этому должны создаваться в начале работы приложения и удаляться перед завершением работы приложения . При создании и использовании коллекции Parameters объекта Command не забы­ ва.йте, что первый параметр всегда резервируется для возвращаемого значения хранимой процедуры , даже если она не имеет возвращаемого значения. Несмотря на то что в этом примере возвращаемое значение сгенерированного поля ShipperID не используется , в реальных приложениях это значение играет очень важ­ ную роль. Поля CompanyName и Phone предназначены для человека . Механизм управле­ ния базой данных идентифицирует поле именно по значению основного ключа. Напри­ мер, в базе данных Northwind поле ShipperID является обязательным для новых запи­ сей в таблице Orders . Таким образом, при добавлении заказа для нового поставщика по­ требуется новое значение поля ShipperID.
276 Глава 11 Несколько наборов записей Поставщик SQL Seгver OLE DB поддерживает выполнение операторов SQL, которые возвращают несколько наборов записей . Эта возможность может показаться очень полез­ ной при заполнении нескольких элементов управления диалогового окна на основе ин­ формации из базы данных. Все операторы поиска SELECT можно объединить в един­ ственной хранимой процедуре. После этого перебирать наборы записей и вносить зна­ чения из каждо го набора в соответствующие элементы управления диалогового окна . Например, при создании поль:Зовательского интерфейса для ввода информации в таблицу Orders потребуется информация из нескольких связанных таблиц, включая таблицы Customers и Shi ppers (см . рис . 11.7) . · Создадим сокращенный пример хранимой процедуры для возврата цнформации из этих двух таблиц . Результат работьi хранимой процедуры можно использовать для за­ полнения раскрывающихся списков в диалоговом oкнeUse r Fo rm: [CREATE ; PROCEDURE ".GetL6oki.ipi;:alues\ ;AS . Обратите внимание, что в показанной выше хранимой процедуре используется два оператора SELECT. При вызове хранимой процедуры через интерфейс ADO эти опера­ торы применяются для заполнения двух отдельных наборов записей. Ниже показано, как результат вызова хранимой процедуры Ge tLooku pVa l ues используется в процедуре об­ работки события aUserForm_I ni tia liz e для заполнения раскрывающихся списков ·. в диалоговом окне .
Доступ к данным с помощью ADO 277 Customers Shippers Close ··1 Рш:. 11. 7 . Эле.менты уnрСUJЛения, содер­ жащие результат запроса к базе данных Стоит отметить, что для использования этого метода необходимо заранее знать о ко­ личестве и порядке наборов записей, которые возвращаются в результате вызова храни­ мой процедуры. Кроме этого, здесь не обрабатываются значения основного ключа, свя­ занные с описаниями таблицы поиска . В реальном приложении значения этих ключей пришлось бы сохранить (предпочтительным методом хранения можно считать объект Collection), что позволило бы извлекать значение основного ключа, соответствующее выбранному пользователем элементу раскрывающегося списка. Отключенные наборы записей В разделе "Получение данных из базы данных MicIOsoft Access с помощью простого запроса" было показано, что подключение и отключение от базы данных должно выпол­ няться как можно быстрее. Но объект Recordse1t достаточно полезен, чтобы хранить его длительное время, не блокируя доступ к базе данных для других пользователей. Для решения этой проблемы можно воспользоваться возможностью библиотеки ADO, кото­ рая называется оm'КЛ'l()'Ц,ен:нъ~й набор записей (disconnected recordset). Отключенный набор записей рЬализован в виде открытого объекта Recordset ~ ра­ зорванным подключением к источнику данных. В результате получается полностью функциональный объект Recordset, использование которого не требует блокировки ба­ зы данных. Отключенные наборы записей могут оставаться открытыми столько, сколько
278 Глава 11 требуется. Такие объекты синхронизируются с источником данных и даже сохраняются на диске для последующего извлечения. Некоторые из возможностей отключенного на­ бора записей демонстрируются в следующем примере. Предположим, что для пользователей необходимо реализовать во_зможность просмотра любой выбранной группы клиентов. Запрос к базе данных при каждом изменении критерия является крайне неэффективным подходом. Более подходящее р'ешение - это запрос пол­ ного набора клиентов из базы данных и хранение этого набора в отключенном наборе запи­ сей. После этого можно воспользоваться свойством Filter объекта Recordset для быст­ рого извлечения запрошенного множества клиентов. В следующем примере показаны все компоненты, необходимые для создания отключенного. набора записей: ~oI>:f.Ton' :Exp1:LciT "" ·· v ~ ~" ,~ -~ ·· ) 1Private · const Connec.tionString As S_tring = ( "Provider=SQLOLEDB.l;Integrated Security=SSP'I;" + ,; Persist Securi ty Info=False; Initial Catalog=NorthwindCS; " + "Data Source=LAP800;Workstation ID=LAP800;. " . · · · fPuЬlic Connection A·s ADODB. Connection . 1 PuЬlic Recordset. As ADODB.Recordset :PuЫic Sub CreateDisconnectedRecordset () Dim SQL As ·string SQL - " S EL EC T CustornerID, CornpanyNarne, ContactNμrne, ·" FRO M Custorners" set connection = New ADODB.Connection · Connection. ConnectionString- Connecti;onString Connection.Open Set Recordset = NevJ ADODB. Recordset . . Recordset ·: CursorLocation = Cursor.LocatioriEnum. adUseClient•. Recordset·. CursorType = CursorTypeEnurn. adOpenSta ~ic · ".· : Recordset : LockType· = LockTypeEnurn.adLockBatchOptimisti~ ~ Са11· Recordset. Open (SQL, Connection, , , · ·· · t~ Co!lirnandTypeEnurn. adCrndText:J Set R~ё:ordset. Acti-veconnection - Nothing ._ Р Call.. Sheet4 .Range ( "Al") : CopyFrornRecc)rdset (Re.ё:brdset)- 1. » ' ПЬдк,пюченИе ю;~.мереино остается ; о~ -к~ытым ·•· ~~,~я.~ ?мo:kS..,.w..~, "·:~,;.. ..;:>~,~~i<.,.,~~-~,-~_,'; .~ :.· -~-~..:.-»'. "." _,"~~ " ;.x ..tf1. -- :.. ,. Обратите внимание, что объектная переменная типа Recordset объявлена глобаль­ ной. Если объявить переменную на уровне процедуры, интерпретатор VВА автоматиче­ ски удалит переменную после завершения процедуры. В таком случае переменная ока­ жется недоступной. Существует шесть обязательных операций, которые необходимо выполнить для соз­ дания отключенного набора записей. Несколько операций можно скомбинировать в одну в момент вызова объекта Recordset. Open. Это решение более эффективно, но, для простоты, в данном случае эти операции разделены.
Доступ к данным с помощью ADO 279 О Для начала необходимо создать пустой oбъeктRecordset . О Расположение курсора необходимо установить на стороне клиента. Так как набор записей будет отключен от сервера, управление курсором на сервере будет недо­ ступно . Обратите внимание, что этот параметр необходимо установить до откры­ тия набора записей. Изменение расположения курсора после открытия набора за­ писей невозможно. О Механизм управления курсором на стороне клиента, предоставляемый библиоте­ кой ADO, поддерживает только один тип курсора - статический. Поэтому свойст­ во CursorType необходимо установить в соответствующее значение. О В библиотеке ADO существует специальный тип блокировки, предназначенный для отключенных наборов записей. Такая блокировка называется Batch Optimistic. Она позволяет подключать отi<люченный набор записей к базе данных и обновлять содержимое базы данных содержимым записей, модифицированных, пока набор за­ писей был отключен. Эта операция выходит за пределы рассматриваемых в данной .главе вопросов, поэтому просто обратите внимание, что для создания отключенного набора записей необходимо использовать блокировкуваtсh Optimistic. О Следующим этапом является открытие набора записей. В этом примере использу­ ется простой текстовый запрос SQL. Это необязательно, так как отключенный на­ бор записей можно создавать на основе любого источника данных , позволяющего создать стандартный набор записей. Существует несколько возможностей , кото­ рые отсутствуют в механизме управления курсором на стороне клиента, например , он не поддерживает несколько наборов записей одновременно. О Завершающим этапом является отключение набора записей от источника данных. Для этого объекту Connection внутри объекта Recordset присваивается значе­ ние Nothing . В разделе "Свойства объекта Recшdset" ранее в Этой главе . было по­ казано, что связанный с объектом Recordset объект Connection доступен через свойство Recordset. Act i veConnection. Установка этого свойства в значение Nothing разрывает подключение между набором записей и источником данных. Что можно делать с созданным отключенным набором данных? Ответ: практически все операции, которые поддерживаются объектом Recordset. Предположим, что поль­ зователю необходим отсортированный в алфавитном порядке список клиентов, живу­ щих в Германии . Для этого можно написать следующий код: 7i?uЪ1Iё suь F'iii::erbisconnec t eфzecordset ( J Call Sheet4.Range("A:P") .Clear Recordset.Filter = "Country = 'Gerrnany'" Recordset. Sort. = "CornpanyNarne" · . . Call Sheet4. Range ( "Al" ) . CopyFrornRecordset (Recordset) ' ];f::nd,.. Slil;> Если приходится работать в многопользовательской среде, данные в отключенном наборе данных устаревают в -результате вставки, обновления и удаления записей другими пользовате­ лями. Для решения этой проблемы можно отправить повторный запрос на обновление со­ держимого объекта Recordset. Как показано в следующем примере, для этого достаточно повторно подключиться к источнику данных, вызвать метод Recordset. Requery и отклю­ читься от источника данных:
280 Глава 11 Использование библиотеки ADO для доступа к нестандартным источникам данных В этом разделе описывается использование ADO для доступа к данным из двух распро­ страненных нестандартных источников (эти источники данных нельзя назвать базами дан­ ных в строгом смысле) - книги Ехсе! и текстовые файлы. Хотя смысл такого решения мо­ жет показаться неочевидным, библиотека ADO часто оказывается лучшим инструментом для извлечения данных из книг и текстовых файлов, так как позволяет отказаться от дли­ тельной процедуры открытия этих файлов в Ехсе!. Кроме этого, использование ADO по­ зволяет применять всю мощь SQL для выполнения необходимых операций. Запрос к книгам Microsoft Excel При использовании ADO для доступа к книгам Ехсе! применяется тот же поставщик OLE DB, который использовался ранее в этой главе для получения данных из базы дан­ ных Micгosoft Access. Кроме Access, этот поставщик поддерживает большинство источ­ ников данных ISAМ (ISAM data souгces) (эти источники данных используют табличный формат на основе строк и столбцов). Чаще всего этот поставщик применяется для полу­ чения данных из закрытых книг Ехсе!. В данном сдучае будет использоваться книга Sales. xls, показанная на рис. 11.8. Эта книга, как и остальные примеры, доступна для загрузки на сайте Wгох. Рис. 11.8 . Книга с примером базы данных
Доступ к данным с помощью ADO 281 При применении ADO для доступа к данным в книгах Excel, книга используется в ка­ честве базы данных, а листы и именованные диапазоны - в качестве таблиц . Сравним строку Подключения к базе данных Access со строкой подключения к книге Excel: Строка подключения к базе данных Access: ;~.PI_\ov1Cief;мrc:rosott : Jet·~ otFiьв : 4 , о; "у &···!_· ··:;:77'1· . !i:\~c:\;I:,;:;;; •• "' ',,:;._,_ ~'J)a,t;. .a, , 63_0,\l.:r::~ . e.=Q,: \ F:i,les.~1'J'<?Et::hv;::i,ч9.- Il)@J. · : Строка подключения к книге Ехсе!: ··· I<ler;;иrcr()§oft:.'Jet. oLEDв. 4;·о г·: : sг?:~·"' ·- : · .,-. " Data Source =C:\File.s\Sales.xls;" & .~."· ,.~.·· . '~J'::)(,_t:.e..Ii<:le..f(.R:r:.()p~r.Ч e.s,;;~i<=:i=±" ?~,,..Q ;:::•• .• :~•.........• . Обратите внимание, что используется один и тот же поставщик. Вместо полного пути к базе данных Access применен полный путь к книге Excel. (В данном случае используют­ ся не настоящие имена файлов и пути. Замените путь и имя файла в соответствии с ре­ альным расположением базы данных на компьютере.) . Единственным отличием пр.и применении поставщика OLE DB Micгosoft Jet для подключения к другим источникам данных является необходимость указания имени источника данных в ар гументе Extended P r operties. При подключении к Excel 97 и более поздней версии параметр Ex t ended Propert i es устанавливается в значение Excel 8 .0. Для запроса данных с листа Exce l можно воспользоваться простым текстовым запро­ сом SQL для получения данных из обычной базы данных, но при подключении к книге Excel формат имени таблицы отличается . Интересующую таблицу в книге Ехсе! можно указать одним из четырех способов: 1. Имя листа. При указании имени листа в качестве имени таблицы в операторе SQL после имени листа необходимо добавить символ $ и заключить имя в квадратные ка­ вычки. Например, [Sheetl$] является допустимым именем таблицы при обраще­ нии к листу. Если имя листа содержит пробелы или неалфавитно-цифровые симво­ лы, его необходимо заключить в одинарные кавычки, например, [ 'Му Sheet$ ' ] . 2. Имя диапазона на уровж листа. Имя диапазона на уровне листа можно использовать в качестве имени таблицы в запросе SQL. Для этого достаточно перед именем диапа­ зона указать имя листа, в котором находится этот диапазон, используя соглашения по форматированию, описанные выше, например, [Sheetl$SheetLevelName]. 3. Адрес 'КОН'Кретного диапазона. В качестве имени таблицы в запросе SQL можно ис­ пользовать адрес конкретного диапазона на интересующем листе. Синтаксис этого метода идентичен синтаксису имени диапазона на уровне листа, например, [Sheet1$Al: Е20]. 4. Имя диапазона на уровне книги. В запросе SQL в качестве имени таблицы можно ис­ пользовать имя диапазона на уровне книги. В этом случае специальное форматиро­ вание не требуется. Имя используется без дополнительных квадратных кавычек. Хотя в данной книге Ехсе! содержится один лист, в ней может содержаться любое ко­ личество листов и именованных диапазонов. Главное, знать, к какому листу или диапазо­ -ну обращаться в запросе. В следующей процедуре показано использование всех четырех методов обращения к таблицам: (opi:Jon Expll c :Гt : PuЬlic Sub QueryWorksheet () '\ :,, __ .:...;,.,~,_·..-
282 Глава 11 "' bI1;p R.ec6rd.set дs AЬobв~Recorcfset Dim ConrxectionString As String Connect:ionString = _ · · "Provider=Microsof_t , Jet. OLEDB. 4 . о; " & :· "Data · Sourc.e=" & Th.isWorkЬook :Path & "\Sales. xls; " & , ":Extenc1ed ,. Propert'iёs=Exc ,el 8. О;" Dim SQL. As String , ~ · Запрос ;:на основе имени листа . · SQL = ''SEL.Ecт ' * -FROM [Sales$J" ' Запрос на основе имени , дИаr!азона уровня . листа. · !_., SQL = "SELECT * FROM : [Saleз:$MyRange]" . ' Запрос на ()Снове ' конкретн·ог.о именИ ' диаr.Iа$ОНа. ' SQL ,;, : "SELECT * <FROM · [ sales$Al: Е14 J" · · заПрос на основе имен!tr диапазона уровня книги SQL .. ,;, :''_SELECT * FROM )3ookLevelName", . New .ADODB. Rec·ordset On : Error GoTo Cleanup "' ·>с '·. ; cail Recordset. Open ( SQL, ConriectionString' !·. . . . :CursorTypeEnum. ad0pel,1Forward()nly, · ~LockTypeEnurri. adLo~kReac10nly, .... :с< .. · :commandTypeEnum. adcmdтext) ( call Sheetl. Ran_ge ( ."Al" !c1eanup: 1 -Debug; P:tint Tf (Recordset.State Recordset.Close End If QbjectSt<;tteEnum.adStateOpen) Then Set Recordset =. Nothiцg End Sub . По умолчанию поставщик OLE DB для MiciosoftJet предполагает, что первая строка указанной в запросе SQL таблицы содержит имена полей для данных. Если это так, . то можно использовать более сложные запросы SQL с предложениямиWНЕRЕ и ORDER ВУ. Если в первой строке таблицы данных не содержатся имена полей, поставщику необхо­ димо об этом сообщить или первая строка с данными будет потеряна. Для этого необхо­ димо установить дополнительный iripaмeтp HDR=No, который передается в составе аргу­ мента Extended Properties в строке подключения: ~ "i?rЪ viaёx= ;мkroso:ft : ·Jet: : or:Ebв.4 ~··ь;" '& "':.:.'·~ , . f "Data · sourc'E\=" · & ThisWor.kbook.Path & "\Sale's.xls; ~.·: Ex!=~nc:I~d" )?r;operJ:: ies':" .'.' Excel 8. 9; НЩ=Nо, " " ; " Обратите ·внимание , что при передаче нескольких параметров в сос:гаве аргумента Extended Properties, всю строку аргумента необходимо заключить в двойные ка­ вычки, а отдельные параметры - разделять точкой с запятой. Если в таблице с данными отсутствует строка с заголовками полей, поставщик поддерживает только простые запро­ сы SELECT.
Доступ к данным с помощью ADO 283 Вставка и обновление записей в книгах Microsoft Excel . Библиотека ADO позволяет не тоJ1ько извлекать данные из книги Excel, но и встав ­ лять и обновлять существующие записи так, как и при использовании других источников данных. Стоит отметить, что удаление записей не поддерживается. Обновление записей хотя и возможно, но связано с определенными сложностями, так как в таблицах данных на основе электронных таблиц Ехсе! отсутствуют сущности, которые можно использо­ вать в качестве первичного ключа для уникальной идентификации конкретных записей. Таким образом, в предложении WHERE необходимо указать значения достаточного коли­ чества полей, чтобы идентифицировать интересующую запись для обновления с помо­ щью оператора SQL. Если критериям в предложении WНERE соответствует более одной записи, будут обновлены все соответствующие записи. Вставка записей происходит намного проще. Достаточно создать запрос SQL, в кото­ ром указаны значения каждого поля, и отправить запрос поставщику. Обратите внима­ ние, что для выполнения запросов на действие в таблице с данными должна присутство­ вать строка с названиями полей. В следующем примере показано, как вставлять новую за­ пись в таблицу на листе: ri>ЦЫic '. sUБ ' woiкsh.eetin.Sёrt: ( ,,, Connection As ADODB.Connection Connectionstr.ing As ·string Connect.ionString = _ " Provider7Microsoft.Jet.OLEDB:4.0;" & " Data Source=" & ThisWorkЬook.Path & "\Sales.x1s;" & ' ! Extended Properties =Excel 8. О; " SQL As String ''INSERT INTO [Sales$] " & _ "VALUES ( 'VA', 'Оп .Line', 'Computers', 'Mid', 30')" Connec.tion. Open (ConnectionString) Connecti6n.Execute(SQL, , _ ConunandTypeEnum.adCmdText Or ExecuteOptionEnum.adExecuteNoRecords Connection.Close Set . Connectiori Nothing ;~!14"ечJ:>~=· " .•.. . . . . ·~"· ··-·· _ . Запросы для текстовых файлов Последней в этой главе рассматривается метод доступа к данным в текстовых файлах средствами библиотеки ADO . Необходимость получать доступ к этим данным возникает на­ много реже, чем необходимость доступа к другим рассмотренным источникам данных, но при обработке исключительно большого текстового файла (например, дампа базы данных мейн­ фрейма) библиотека J\DO может значительно упростить решение задачи. Библиотека ADO не только поддерживает загрузку большого объема данных в Excel, но и позволяет использовать возможности SQL для ограничения объема набора записей, если текстовый файл оказывается слишком большим, чтобы непосредственно открывать его в Excel. Для обсуждения доступа к данным в текстовых файлах будет использоваться тексто­ вый файл, в котором значения разделяются запятьrми. Файл называется Sales . csv. Его
284 Глава 11 совпадает с содержимым файла Sales. xls, который использовался в предыдущих приме­ рах работы с Excel. Для доступа к данным в текстовых файлах также используется поставщик OLE DB для MicrosoftJet, но в этом случае применяется другая структура строки подключения. В сле­ дующем примере показано, как должна выглядеть строка подключения для доступа к дан­ ным в текстовом файле. i '·.ProvTderffм:i.cro.sofi: . .JeE-.otн:ьв .4.о; "'" & . _ · · · . "Da.ta source=C: \Files\;" & ,, j ;:_E:~J;:§!.A<:l&4- .P:i::oP_e.fHe.s:::;r.~~t "- ,_ -·· •....". . Обратите внимание, что в случае работы с текстовыми файлами в качестве значения аргумента Data Source указывается имя каталога, в котором хранится интересующий текстовый файл. Имя файла в значении аргумента указывать не нужно. И в этот раз ин­ формация о формате передается поставщику через аргумент Extended Properties. В данном случае аргумент устанавливается в значение "Text". Отправка запроса к текстовому файлу ничем не отличается от запроса к книге Excel. Ос­ новным отличием является формат именования таблицы в запросе SQL. В запросах к тексто­ вым файлам в качестве имени таблицы используется имя файла, что позволяет работать с несколькими текстовыми файлами в одном каталоге, не меняя строки подключения. Как и в случае с книгами Excel, если в первой строке текстового файла не хранятся на­ звания полей, то при достуi:rе к файлу поддерживаются только простые запросы SELECT. Кроме этого, в таком случае в аргумент Extended Properties необходимо добавить па­ раметр HDR=No, иначе первая строка с данными окажется недоступна . В данном примере в первой строке файла хранятся названия полей. Предполагается, что для ограничения ко­ личества загружаемых в Excel данных, в запрос добавляется ограничение в виде предложе­ ния WНERE. Реализация такого поведения показана в следующей процедуре: :.pU:БiTC:' iЩp " qu'e'ryTexEFiieЛY'- ":''"~~ .. ·.· , . " . Dilyi ·:Record~e.t< дs ADODB ; Recorc1:5e t ,С; D.im ·connectionString As Stririg 5onnections,trirщ =; _ ·· •.: J. ". . · ''Provider=MicrosoJ;t.Jet .OLEDK 4\ О; !' ·-/ ~·Dёl,ta source:± "•• & Thisw().rkJ::юok .Ра th & " " ;, " :i ''Exterйied Properties.=тext; " . ;!· · c9nst .SQL . As. Str~ng '= ..., - .· . ,.. ·:1 , ''SELEC:I: ·* FROM Sa;Le,* .csv, WHERE Тур~=' A:r.;~' ;~ . cse,t Recordse,t , = New : ADODB : Recordset '· · 11 ,. Reco:t;-dset~0pen:(SQJ:,, Connec;tioцstring, Cursoi';TypeEnurn. adoPenForwaic10цly ; • -' -' .· :ackTypeEnum . adLockReadOnly, CpmmandT~eEnum. adCщd:I'ext) call в.ffeetl / Range ( ~:Ai ·~) . со · ·E'ioinRecSx;c1set (RecordsetT · '> Rec6r.~s~§'.9199e · :)' .•. · · · · . "set{Reco.rc1set · :',··щothing •·· ~.~,л~sмP.~lz~.;~--~-~-:,; -~j:~i~,/ ': ' ", __ Резюме На этом обсуждение доступа к данным средствами библиотеки ADO завершается. Ог­ раниченный объем книги позволил только поверхностно ознакомиться с различными возможностями. Если доступ к данным является или может оказаться заметной частью разрабатываемого приложения, стоит обратиться к дополнительным источникам ин­ формации, упоминавшимся в этой главе.
Создание и использование надстроек Надстройка (add-in) является фрагментом кода, который можно повторно использо­ вать в Excel. Надстройка может быть реализована на языке Visual Basic 6 или в виде кни­ ги Ехсе!, в которой хранится повторно используемый код. Например, имеет смысл по­ вторно применить модули DebugTools и EventLog из книги Bulletproof. xls, кото­ рая рассматривалась в главе 7. В результате книгу Bulletproof. xls можно добавить в список надстроек и сделать ее недоступной для других книг. В этой главе будет показа­ но, как превратить книгу в надстройку и сделать ее доступной для других книг. В качестве надстроек могут выступать откомпилированные внешние приложения, хо­ тя это и не обязательно. При этом , начиная с Office 2000 Developer Edition, поддержива­ ется компиляция книг . Дополнительная информация об использовании откомпилиро­ ванных надстроек приводится в главе 13 . В этой главе в к.ачестве надстройки используется книга Bulletproof . xls. Здесь бу­ дет показано, как скрывать подробности реализации кода надстройки для предотвраще­ ния его случайного изменения.
286 Глава 12 Сокрытие кода Книги· являются интеллектуальной собственностью. Книги, которые используются в качестве надстроек, представляют интеллектуальную собственность, которую можно передавать или продавать другим разработчикам. При этом не обязательно предостав­ лять другим разработчикам информацию о подробностях реализации решения. Хотя не­ возможно скрыть факт сушествования надстройки, так ка_к ее название отображается в окне Project Explorer (Окно проекта), однако надстройку можно защитить от просмот­ ра, модификации и копирования кода. Для сокрытия :подробностей реализации интеллектуальной собственности исходный код можно защитить паролем. Для демонстрации книга Bulletproof. xls скопирована в папку с примерами для главы 12 и открыта в редакторе VBE. Для защиты исходного ко­ да паролем (рис . 12.1) в редакторе VВЕ выберите СервисqVВА Project (Too!sqVВA Pгoject), активизируйте вкладку Protection ·(Защита) и установите флажок Lock project for viewing (Защитить проект от просмотра). Введите пароль в соответствующее поле. Для доступа к исходному коду книги введите в качестве пароля cлoвopassword. Gerre1a( Protection .) Р, Lock project for y_iewinQ , APassword to view project properties . ---· 1.···••*•• ОК Отмена ] ' Cnpae~a Рис. 12.1 . Защита кода от просмотра После ввода и подтверждения пароля щелкните на кнопке ОК и сохраните файл. Для проверки эффективности пароля закройте файл и откройте его повторно. На рис. 12.2 показано, что ветка VBA Project в окне Project Explorer (Окно проекта) свернута и ее не­ возможно развернуть без ввода правильного пароля. Защита паролем является настолько надежной, насколько надежным является сам пароль и защищающий его механизм. Па­ роли в Ехсе! не останавливают только самых настойчивых взломщиков.
Создание и использование надстроек 287 Aiph.Ь.tic jC•t09orlzed ., Рис. 12.2 . Скрытый проект VВА Преобразование книги в надстройку Для преобразования книги в надстройку необходимо переключиться · в представлеiнйе ''элек:тр<:>нной таблицы и сохранить книгу с расширением .xla. ' Выберите меню Файле:> Сохранить как (Filec::>Save As) и в качестве п1па файла выберите . Microsoft Office Excel :Add-in (*.xla) (рис. 12.3). При этом изменится расширение и надстройка будет сохранена в каталоге С: \Docшnent and settings\<имя_noльзoвaтeля>\Application Data\ .Mic~osoft.\Add-ins.Измeнeниe расширения с .xls на .xla не является об.язатеriь­ ным, но ' это полезное соглашение, позволяющее потребителям различать файлы ' книг , и фай~ы ~адс,троек. Альтернативным методом создания надстроек является установка свойства IsAddin объекта Thisworkbook в значение True. Для этого можно воспользоваться окном Properties (Свойства) в редакторе .VВЕ (рис. 12.4). (Если перед этим книга была защище­ на паролем, для изменения свойств книги придется ввести пароль.) Недостатком второго подхода является сохранение расширения файла . xls, хотя книга все равно превращается в надстройку. Для изменения расширения всегда можно воспользоваться Проводником Windows (Windows Exploгei-).
288 Глава 12 г·······:о 1 ::::д ... 1 l:.w 1 Мои после.анн~ Асжуненты !@ ! Рабоч1й стол "-"' r!:/ - дсжументы QJМой коmьютер ~ Мое сетеsое окружение i 1 ;!) Добавить/"'""'*'ТЬ адреса FTP [ - . j Имя файла: ·····~~~~~~::·.::-::::.:.:.:.:7::.:.:·:..·:.:.:·:.::::;·:.:. .:: ·: ..:::::.:: ..== : .: .:.= = = -= = : ::: .. ·::•.::.1'~~ Тип Фа~nа: f.~~~~~-~~-~~---~-~-~-~-~.-~~-~·i·~-~---~-~~-~-~".~--~~~"~~---~-~-----~-------~ ...................~~t:1 Рис. 12.3 . Сохранение ~спиzи в качестве надстройки VBAProject (Bulletproor.нls) ~1 ~ Мicrosoft Excel Objects ' ··i!J Sheet l (Sheetl) \ 11!) Sheet 2 (Sheet2) г ·i!J SheetЗ (SheetЗ) .·-~ тNoworJ<ЬOok f:fl···fii Мodules Рис. 12.4 . Превращение ~спиzи в надстройку с помощью свойства IsAddin ; ·········· ······ ···· ····· ·· ·· ·· ·· ·j Сохранить J Отмена j
Создание и использование надстроек 289 За крытие надстройки Если книга была преобразована в надстройку с помощью установки свойства IsAddin с последующим сохранением или надстройка была загружена с помощью команды ФайлqОткрыть (FileqOpen), очевидного способа закрытия книги не существует, так как пункт Закрыть (Close) в меню Файл (File) отключен. Для обхода отключенного пункта в меню Файл (File) можно ввести следующую команду в окне lmmediate (Проверка) в ре­ дакторе VBE. 'M4'EIЧ~U:kьooJC~ ( ".Л4<i: IIiI;>U: П e}~:I:> ro<)f :x.fs ") ::.cYo se :.: Надстройки не индексируются в коллекции Workbooks и не учитываются в значении свойства Count коллекции Workbooks. · Существует еще ОДИН метод закрыть надстройку. Для этого необходимо щелкнуть на имени недавно открытого файла в меню Файл (File), удерживая клавишу <Shift>. Может · быть выдано сообщение о перезаписи копии в памяти (в зависимости от наличия изме­ нений) и невозможности открыть надстройку для редактирования (атавизм последних версий) . Щелкните на кнопке ОК , и надстройка будет удалена из памяти. И зменение кода Иногда необходимо модифицировать код VВА, создававшийся для стандартной кни­ ги , чтобы подготовить его к использованию в надстройке . Это особенно справедливо, если приходится ссылаться на данные из надстройки . Большинство программистов пи­ шут код , предполагающий, ~по книга и лист являются активными. Но ни один из компо­ нентов надстройки не может быть активным , поэтому код должен явно ссылаться на кни­ гу и лист надстройки. Предположим, что в надстройке содержится следующий код, рас­ считанный для работы с активной книгой : wi t:н·. R'ange t>• ба t:·a.ь:as е "") •' i. y'i Set Data = .Rows ' (2) · •·• · Cq.11 LoadRecc; rd Navigator.Value ;;о 2 , . Na,yigator.Max = · .Rows.Coщi.t : 1.f!E:,\'! :WJJ;}i 1;,,,,;, ""'"m~.~: ..~-·-·······•·· ,...... .;_~ ..:. .h,; .•, ." ,. Этот код работает только в том случае, если диапазон Database находится в актив­ ной книге . В коде надстройки необходимо указать имя интересующих книги и листа. В дан­ ном случае для этого используется оператор Wi th: "W11::bl!worJ<Ь'ooJ<IП';worfБOok~ хГs ,/ ) .' sile"ets :-.v.~:<-м••~М".·~<.•.·.•·:с••• ,;'\"···~ '·· ,,_ .._...•" ' .<' ·- . >«>•"-· ·.•,,_, ..·..~ ..,.._.,,__ .•.•-~~-'··· ... /-.·.'>· - ·· >.••.• •••, -·h··' Для ссылки на книгу , содержащую код , лучше использовать свойство ThisWorkbook объекта Application. Это свойство возвращает ссылку на книгу, содержащую выпол­ няющийся код . Такая конструкция делает код значительно более гибким: t'I.f!:h .f1i~~~W'9:~1Ф<J.2J<", ФE~~t.s C: 'D?'f;a'' i•.• . В: ang e ("pa.t_aoa.i:;e, j) ~-· Кроме э.того , можно использовать имя объекта листа, которое отображается в окне Project Explorer (Окно проекта) . ,wJ,If~ 2$fie_et :( ~.ang(,T :~ Ьа tёiba ~e.:J.:~ "=,
290 Глава 12 Если необходимо проигнорировать имя листа и позволить диапазону Databas e су­ ществовать на любом листе, можно воспользоваться следующей конструкцией: MЛ;fi ' ):til~:W,6r kь66J<>l'Jarn~_з ·c: 1J aI~~a§~ :!E. ·~.~ ferS,.т_?Rp_J}ge . Сохранение изменений Еще одной потенциальной проблемой, связанной с хранящими данные надстройка­ ми, является отсутствие автоматического сохранения изменений при завершении сеанса Excel. В частности, в данном примере допускаются изменения диапазона данных, кото­ рый называется Database. Для сохранения изменений в надстройке добавьте следую ­ щий оператор в процедуру обработки событияВеfо r еСlоs е или Auto_C l ose. .f f' No t:' ·.!fii :;;workЬ&ok .·sa:vec1 _т_h.~n- тfi1s tf§kJ:й)):J,6k : ~д:'f.Ei'{,:\ Установка надстройки Надстройку можно открыть из меню Фа йл (File), как было показано раньше. Но для . получения большего контроля над надстройкой ее можно установить с помощью коман ­ ды Серви с qНа дстр о йки (ToolsqAdd-Ins ). В результате выполнения этой команды от­ крывается диалоговое окно, показанное на рис . 12.5 . Ао(туnные надстрсйкн: .~-~·[;;•allkl-_lv-вiд~~~--..1,;:"'•1· 1~._··•::::о:к:":"···::·;:я · j \.._~От-ме_н•_._.,J !1 Об;ор... 1 ~ !.~в~?~ат~а~~s:'·.~ . J Мастер подстановок Ма стер суммированf1Я Пакет анал ю а Пересче т в евро Поиск Решения Помощник по Интернету ~ Eulletproof " : 1 1 j• Рис. 12.5. Список надстроек, доступ­ ных для установки
Создание и использование надстроек 291 Установите флажок напротив надстройки Bulletproof в списке доступных надстроек . Если надстройка отсутствует в списке, щелкните на кнопке Обзор (Bгowse) для поиска интересующей надстройки. Дружественное название и описание предоставляются в свойствах книги. Если книга уже преобразоl)ана в надстройку, установите свойство IsAddin в значение False, чтобы сделать книгу видJмой в Excel, и воспользуйтесь командой Файлq Свойства (FiJeq Pюpeгties) для отображения следующего диалогового окна, показанного на рис. 12.6 . В поля Название (Title) и Комментарий (Comment) вносится информация, отобра­ жаемая в диалоговом окне Надстройки (Add-ins). После внесения необходимой инфор­ мации можно установить свойство IsAddin в значение True и сохранить файл. После того как надстройка появилась в диалоговом окне Сервис<=>Надстройки (ToolsqAdd-Ins), ее можно устанавливать и удалять, устанавливая и сбрасывая 1флажок возле названия надстройки . После установки надстройка загружается в память и стано­ вится видна в окне редактора VВЕ. Кроме этого, установленная надстройка загружается при последующих запусках Excel. е_у коsодитель: ~чрежден11е: [pynna: ~лючевые слова: гиперссылк11: ---·----·-·-·-··-·-·-··--·-···---·-----···-·1 nt.!ins tools for assertin9 1 tracingJ J pin91 and logginq to the EventLOQ] О ~.03дать рнсунок для ~едвар11теnьного просмотра ОК j j Отмен• Рис. 12.6 . Информация о надстройке Событие установки надстройки Существует два специальных события, которые возникают при установке и удалении надстройки. Следующий код, расположенный в модуле ThisWorkbook, выводит на эк­ ран диалоговое окно при каждой установке надстройки: i?r-J .v ate sи~ :-work:Ьook~A.ctd:Liirii iit aiЛY ' "'- _ >Tnsta:L1userForm. Show .. ,."<~-, д :д Другим событием является AddinUnistall. Его можно использовать для отображе­ ния диалогового окна при удалении надстройкиВullеtрrооf .
292 Глава 12 Удаление надстройки из списка надстроек Одним из методов удаления надстройки является удаление файла из каталога С: \Document and settings \< имя_польз оват еля> \Application Data \ Microsoft \Add- ins с помощью Проводника Windows (Windows Explorer) до откры­ тия Excel. Альтернативн~rм методом является переименование файла надстройки до от­ крытия Excel. При запуске Excel после удаления или переименования выбранной ранее надстройки отображается показанное на рис. 12.7 диалоговое окно. ·' . [·:·i'\·. ~ ·. Не удалось нойти 'Y:\source\076i556606\source \Excel 2003 VВд Code\Chapter 12\Bulletproof.xk'. _Проверьте 3а4ание имеНи и местоnоложежя файла. , При попытке открь1тня.файла с нспольэованием списка. недавно иrnоль3ованных файлсв· нэ меню ·Ф~л· убедитесь, что файл не был nере11меноеан, перемещен t:1J'J1 удален. r- ок -1 Рис. 12. 7. Сообщение Excel после удаления или пере­ именования надстройки Выберите команду Сервисq Надстройки (TooJsqAdd-ins) и щелкните на флажке напротив названия надстройки. При этом отображается диалоговое окно, показанное на рис. 12.8 . ,·; ") ф НадсТроt1ка 'Y:\source\0764556606\source\Excel 2003 VBA Code\Chapter 12\Bulletproof.x!s' не найдена, Удалить из спнска? г- д~ш·i 1 Н~т Рис. 12.8. Запрос на удаление надстройки из списка Щелкните на кнопке Да (Yes), и надстройка буДет удалена из списка уста~овленных. Резюме Пре.образование книги в надстройку позволяет распространять код среди других разра­ ботчиков, скрывая подробности реализации . в результате потребителям (включая самого разработчика) ·приходится использовать надстройку через открытые методы и свойства, не обращая внимание на подробности реализации. Это позволяет сконцентрироваться на проблеме и использовании существующего решения. При создании надстройки необходимо модифицировать код, который ссылается на конкретные книги и предоставляет команды меню, элементы управления или кнопки па­ нелей инструментов, предоставляющих доступ к макросам. Удаление ссылок на конкрет­ ные' книги и листы было показано в этой главе. Связывание макросов с командами и кнопками панелей инструментов будет рассмотрено в главе 26.
Надстройки Automation и надстро·.йки СОМ Вместе с выходом пакета приложений Office 2000 компания Micгosoft представила новую концепцию создания надстроек для всех приложений Office. Вместо создания над­ строек для конкретных приложений (файлы . xla для Excel, файлы . dot для Woi-d, файлы . mde для Access) с помощью Visual Basic, С++ или Office .Developeг Edition можно создавать библиотеки DLL, используемые в любом μриложении Office. Так как эти биб­ лиотеки DLL соответствуют требованиям компонентной 'объектной модели Micгosoft, они известны как надстройки СОМ. Во второй половине этой главы рассматривается создание и реализация собственных надстроек СОМ . · Надстройки СОМ обладают значительным недостатком. Содержащиеся в них . функ­ ции невозможно использовать непосредственно на листе. В Excel 2002 и Ехсе! 2003 ком­ пания Micгosoft расширила концепцию и упростила механизм реалиЗаЦиИ надстроек СОМ, что ·позволило использовать подпрограммы надстроек в качестве функций на лис­ те. Такие надстройки назьrваются надстройкамиАutоmаtiоn. Надстройки Automation Надстройки Automation являются библиотеками СОМ DLL (ActiveX DLL). В библиоте­ ках хранятся поддерживающие создание экземпЛяров классы и открытые функции. Как при работе с другими объектами, для вызова методов необходимо создать экземпляр класса. При этом используется немного более сложный синтаксис опосредованного вызова метода. Вместо именования объекта, метода и передачи параметра, информация передается через метод CallByName. Как минимум, необходимо создать объект СОМ и вызвать метод CallByName, передав в качестве аргументов объект СОМ, имя функции и параметры функции. В следующем примере показаны необходимые компоненты вызова:
.294 Глава 13 1 ·Diin о · As Object Set о . = CreateObject·( "идентИфик~ тор_объе'кта "J . Call CallByName (о, "имя:_функции", , VbMethod, парам~трl, . nараметр2, · ,.·., . ;- параце, тр_:п) ' '" '.. , :...'.·..•~, · В этой главе будет рассмотрено несколько практических примеров, которые позволят получить необходимый опыт использования данного приема. Для того чтобы объект СОМ стал объектом Autoшation, его необходимо создавать с определенными параметрами и он должен предоставлять как минимум один открытый метод . Для реализации некоторых примеров из этой главы необходима копия Visual Basic 6 (или VB.NET, Delphi, С++ или другой инструмент для создания изолированных испол­ нимых файлов Autoшation), но для использования объектов Autoшation дополнитель­ ные инструменты не нужны. Даже если изучение Visual Basic 6 или создание надстроек Autoшation не вызывает у вас интереса, все же просмотрите эту главу для понимания принципов создания расширений Excel. Если нет возможности создавать объекты Autoшation, можно воспользоваться суще­ ствующим приложением Autoшation , на.пример Excel, Woгd, Powe1·Point и SouгceSafe . Создание простой надстройки Для разработчика VВА-приложений в Excel самым простым способом создания. над­ стройки Autoшation является использование Visual Basic 6. К сожалению, такие надстройки невозможно создавать с помощью Office Developeг Edition, так как в этом приложении не поддерживается создание классов PuЬlic-CreataЫe. (Параметр PuЬlic-CreataЫe описывает способ создания экземпляра класса. Объекты Automation создаются в соответ­ ствии со специальными правилами, а эти параметры заставляют компилятор добавлять необходимую информацию.) В этом примере с помощью Visual Basic 6 создается простая надстройка Automation. Для того чтобы основное внимание уделялось процессу, а не ал­ горитму, в данном случае определяется метод, возвращающий массив последовательных чисел. (Для компиляции этого примера потребуется Visual Basic 6, но существующий опыт в VBA позволит понять смысл кода . ) Для компиляции примера запустите Visual Basic 6 и создайте новый проект ActiveX DLL. Переименуйте проект в MyAddin и в окне Project (Проект) переименуйте класс в Simple . Установите свойство класса Instancing в значение 5 - MultiUse. Это значе­ ние принято по умолчанию для проектов ActiveX DLL. Установка этого свойства позво­ лит Excel создавать экземпляры класса Simple и вызывать методы объекта. В Visual Basic 6 класс определяется в модуле класса. В качестве примера модуля класса VВА можно привести модуль листа: ,,. ·. - -~ . .·-·- ;;.<! ' fDim resu1t As Va r iarit -~~р;\,_ЦI !.~i;ц~t. (It.~JП.S), ~)
[DiiiГ i'' As t6iicj -''~''Г' у ГF.or I =1 .то Items 7 ' result{I( Start + I . Sequehce resu~ t · fEn_dJчnc_!:io!l . Надстройки Automation и надстройки СОМ 295 1• step Определение функции с квалификатором PuЬlic позволяет сделать ее доступной для Excel. В результате функцию можно будет вызывать из листа. Сохраните проект и вос­ пользуйтесь командой редактора Visual Basic 6 Файл9Компилировать MyAddin .dll (File9Make MyAddin.dll) для создания библиотеки DLL. Результатом выполнения этой команды является надстройка Automatio11. Регистрация надстроек Automation в Excel Перед использованием функции Sequence на листе Ехсе! необходимо сообщить Excel о существовании библиотеки DLL. Компания Microsoft расширила парадигму надстроек и включила в нее надстройки Automatio11. При этом применение надстроек Automatio11 очень напомин~ет использование стандартных надстроек Excel . xla. Основным отли­ чием является применение идентификатора класса ProgID вместо имени файла для идентификации надстроек Automatio11. Идентификатор класса состоит. из имени проекта Visual Basic, точки и имени класса. В этом примере в качестве идентификатора ProgID класса Simple используется MyAddin. Simple. Регистрация через пользовательский интерфейс Excel Для использования надстройки в редакторе VВЕ необходимо создать ссылку на над­ стройку, экземпляр класса и вызвать интересующие методы надстройки. Откройте редак­ тор VВЕ и выберите пункт Tools9References (Сервисt;>Ссылки). Найдите интересую ­ щую надстройч в списке AvailaЫe References (Доступные ссылки). После обнаружения надстройки MyAddin установите флажок напротив названия надстройки. Щелкните на кнопке ОК. Вот необходимая последовательность действий: О загрузите Excel; О нажмите комбинацию клавиш <Alt+Fl l> для переключения в редактор VВЕ; О выберите пункт Tools9References (Сервисt;>Ссылки). Откроется диалоговое окно References (Ссылки); О найдите надстройкуМуАdd:\.n в списке AvailaЫe References (Доступные ссылки); О установите флажок и щелкните на кнопке ОК . После добавления ссылки на надстройку содержимое надстройки можно просматри­ вать в окне Object Browser (Просмотр объектов). (Для доступа к окну Object Browser (Просмотр объектов) можно нажать клавишу <F2> или применить кoмaндyView90bject Browser (Вид9Просмотр объектов).) Теперь можно воспользоваться кодом из примера в начале этой главы ·и использовать возможности надстройки. Создание ссылки на надстройку из кода VBA Если на надстройку нужно сослаться из кода, ссылч можно создавать так же, как соз­ дают,ея ссылки на надстройки . xla. Для. программного добавления надстройки Automa- tio11 можно воспользоваться следующим кодом:
296 Глава 13 TilГ'Inst.aJ.i:Au t.omat.Ian:Aд:ёi:Гii п··w, ::;···~ _. ... Addr.ii's.Add . Fileщ1me: = ;'MyA.ddin. simple" · · ddrns .( :•мyAdd:iщ':simple"). InstaJ.led = тrue. ~~.§J,i,J;t,;.,,:;.::::';::.~..~"'·""';""'"· ~:о.~•. : :;.. .~: . . . . " Добавление надстройки посредством редактирование системного реестра Если код предназначен для распространения, изучите разделы и записи системного реестра, необходимые для ручной установки надстройки . Помните, что модификация системного реестра может вызвать нежелательные последствия, поэтому необходимо полное тестирование вносимых изменений (перед внесением изменений создайте копию системного реестра с помощью функции Export). Надстройка модифицирует пару разделов системного реестра. Модифицируемые разделы и записи системного реестра рассматриваются ниже: О запустите редактор системного реестра. Для этого выберите команду Пускq Выполнить (Sta1·tqRun) и введите regedit или regedt32; О перейдите в раздел системного реестра HKEY_CURRENT_USER\Sof t ware\ Microsoft\Office\11.0\Excel\Options; , О создайте запись строкового типа Open. Для этого щелкните правой кнопкой мыши и выберите пункт СоздатьqСтр оковый параметр (NewqString Value), после чего введите имя Open и значение/А "MyAddin.Simple". На рис. 13.1 показан примерный вариант содержимого реестра после внесения изменения. При следующем открытии Excel надстройка Automation MyAddin появится в списке доступ­ ных надстроек, который открывается по команде СервисqНадстройки (ToolsqAddins) (рис. 13 .2) . ~1:1Л ~ ~114 ,\1)6p1"1Qe т:\§~ ~ €З Recent Files :···GJ SecU'ity i. @J sPel Che<ke< ; ··iЗJ User[nfo $·ei Outk>ok ~ ·tE:f Word ~ -са е.о il@] 9.0 k·СЗ Ac cess il fZJ Common iJ..Q] Ехсе1 ii rfrJ Outlook ~ С!! Powe•Pont ~ ![) Word tJ OpenFind95 tJ Outlook Express ~ PCHei!lt h DPlus! З Protected storaoe System Providef i:J RAS PhoneЬook З RegEdt:З2 D RTC :1:J SAPI l ttyer j]Sd>edUe+ ??J Scrt.rlCh fJ Seмch Assist<Yt ~ Shмed ~ Shared Tools .............................................,. ~A-~_!~;,;.;;_i_,_~~-·-·ALA~--- --~м-·-·- ~......._.....,,.,,,._,.,;,.,-·----.~~.;;.<~ REG_SZ (3Н.!Чеже не nр11С8Оено) REG_DWORD ОхОООООООО {О) REG_BINARV REG_DWORD REG_SZ REG_DWORD REG_DWORD REG_SZ REG_DWORD REG_BINARY REG_DWORD REG_DWORD REG_DWORD REG_SZ REG_SZ REG_DWORD REG_BINARY REG_SZ REG_DWORD REG_DWORD REG_SZ к~ oooom m oooooo oooooo ~oorooooo~ . ОхОООСО:ХЮ (О) Ar~Cyr, 1 0 Ох000004 19 ( 1049) 0 <00000002 (2) 7, 5 ,1,1 ,359,0 , 15,3<15,59, 12 Ох00000008 (В) 000000 00 000000 00 000000000000000000~ .. 0х00000157 (313) ОхООООСО:К (1) 0<00000001 ( 1) 221,27 , 558, 12 1 - 1, - 1, 29 1, 186,1,291,- 1 ,585, 186,О ОхОООIХКХН (1) O<OOOЩJSS (65) ОхООООО ! бf (367) 2005,2, 21 ,20,21 ,5 7, 2 ОхОООООООО(О) OxQOOIJOOOO (О) /А MyAddin .Simple Рис. 13.1 . Добавление параметра в системный реестр
Надстройки Automation и надстройки СОМ 297 · ,lloc: rynныe надстроf«и: · nal sis ToolPak - VBA··--71 (. __ __ о_к__ .. ··"j Мастер подстановок , Мастер суммирования 1 Пакет аналнэа ;о Пересчет в евро iO По11ск реwеннR io Помощник по Интернету .1 ._ I~ · ~0т~"~·"-·"-,-~· .."' !.J· 1 - Об!ор.". 1 Рис. 13.2. Установка надстрой!СU Если надстройка должна быть доступна в диалоговом окне Надстройки (Addins), но не должна быть установлена, создайте раздел системного peecтpaHKEY_CURRENT_USER\ Softwar e\Microsoft\Office\11. 0\Excel \Addin Manager и добавьте в этот раз­ дел запись MyAddin _Simple. Это изменен~:rе позволит добавить в список доступных надстроек MyAddin, но при следующем запуске Excel надстройка не будет установлена (предполагается, что этот раздел не существовал раньше). После внесения изменений системный реестр будет выглядеть следующим образом (рис. 13.3). ~n [р.!lек~ ~ !:1'~ 'nр.!!еК.а : ·5 ~~~ ····-··--~if-~f~=;~~~:IJi:~~ :..::.=.:~:::;~§~:,;:;_;;;=~:~:::.::=="-~~.с:::·: : CJ Noteood !. l!!:!Му~~ RfG_sz 00 -eJ Nt:Ь«kup 8 b0ffice S eJ 11.О · $ 0Access t-E CJ Common S EJ Excel ' ; ·'1:i Add·f'I М&n.eger !· (С.) Options ~ ·e:J Recert Files :. ~ Securil:y ~ ·@:J Spel Che<ker ~- ff!J Userlnfo ~ @) OUtlook ~ CJ Word $ [)8.0 !ED 9.o ~-~ ~::., J~} C,j E::ccel fЬ: .eJ Outlook. ~) CJ Powen>ort \Б ·СJ Word @··О OpenFnd95 L~ EtJ OJtlook Express tkeJ PCНeolth ' ~~ CJ P~s! Рис. 13.3. Результат модификации системного реестра
298 Глава 13 Использование надстроек Automation После добавления надстройки Automation код в надстройке можно воспринимать как класс. При этом поддерживается создание экземпляров класса и использование методов и свойств класса. Методы класса можно вызывать с листа Excel или из кода VВА. Вызов функции из листа Excel В предыдущем разделе надстройка была установлена . В этом разделе метод Sequence будет вызываться с листа и выводить последовательность значений - по одному значе­ нию в каждой ячейке. Предположим, что необходимо получить последовательность от 10 до 18. Последовательность будет состоять из пяти целых чисел начиная с 10 с шагом 2. Функцию Sequence можно использовать для заполнения пяти ячеек. Для этого необхо­ димо выделить пять ячеек и ввести формулу =Sequence { 5, 10, 2). После ввода форму­ лы нужно нажать комбинацию клавиш <Ct1·l+Shift+Enteг> и формула будет скопирована · в каждую ячейку массива. После нажатия этой комбинации клавиш лист будет выглядеть, как показано на рис. 13.4 . Обратите внимание, что если имя функции в надстройке Automation вступает в кон­ фликт со встроенной функцией Excel или функцией из надстройки . xla, Excel выбирает функцию в порядке приоритета. При этом наибольшим приоритетом обладает встроен­ ная функция Excel, после которой следует функция из надстройки . xla. Функции из надстроек Automat-ion обладают наименьшим приоритетом. Если возникает неожиданное поведение, вспомните о сушествовании приоритета. Если Excel должна использовать функцию из конкретной надстройки, введитё полно­ стью квалифицированное имя функции, содержащее имя приложения Automation, имя класса и имя метода, например =MyAddin. Simple. Sequence ( 5, 10·, 2). После нажа­ тия клавиши <Enteг> Excel удалит имя надстройки Automation и имя класса, но эта ин­ формация все равно будет использоваться для выбора функции . 7 8 ............., .. .. .J . ..".. .. . ..... .f.. . " ;;~:;' ;>i~~~~If~;д~i~7Ji,,i;:; ~ - ·-- -·· · - .·- HJ,:"9'i~ЩJJZE:'"'~~1 "Правк~ · :.c;,t!~~=iP""';, .;{ , "..:\,·: - · __ " ., .' ".1 Рис. 13.4 . Результат работы функции Seqиence В качестве упражнения можете написать надстройку, которая возвращает последова­ тельный список дней, недель и месяцев или создает простой календарь _для указанного месяца или года .
Надстройки Automation и надстройки СОМ 299 Вызов надстройки из кода VBA Язык Visual Basic fог Application предоставляет значительную гибкость . Воспользо­ вавшись командой меню ToolsqReferences (СервисqСсылки) можно ссылаться на над­ стройку в редакторе VBE и в коде VВА. Если функцию Sequence необ~одимо вызывать из процедуры обработки события Click для объекта CommandButton, добавьте кнопку. на лист и в процедуре обработки события Click объявите и создайте экземпляр класса MyAddin. Simple. После этого можете вызвать процедуру Sequence. Такое решение показано в следующем листинге: f.J?i'iva.t!e "'-suь·'commandвutton1_click. ( > f .'' TTpe.i(lJOЛ~Гae'rC~, ЧТО В Меню • ~' : Tool~9References. (Cepвиc<=>ccы.riкИ) добавлена ·· ~-- . ' ссЬщка на надстройку Autornation M.yAddin . ~ . · Dim" о As ' M.yA<;ldin. sirnpl'e · f' set О =.. New .MyAddin ..simple .. • f;'- Acti,,:,eceH.R.esize(l, 5) = o.seque;f!ce(.S, iEnd, ·;sub_ . Если точно известно, что надстройка установлена, используйте экземпляр, созданный Ехсе!. Можно реализовать альтернативную версию метода CommandButtonl_Click, в которой применяется мeтoдApplication. Evaluate: [i=ir i '{'at'e ' ·5ць0•commandвu йori.i;c:i fi:ik.( >. · ;/' ActiveCell.Resiz.e(l, 5) ;= · ' · . f .. '· ', . Application. Evaluate ( ;,Ay~ddin._ Sirnple. se'quence (5, 10 , 2) ") i:E.!lёi ~:Sμp_ ,," .. . ·'"··'""" .-."".-."." ,. ," ... ··"···-· "•~. При использовании метода Appl icat ion . Evaluate полный идентификат.ор ProgID применяется только при конфликте имен со встроенными функциями пли функциями из надстроек . xla. Если известно, что используются уникальные имена функций" MOJKFIO не указывать имя надстройки Automation и имя класса, как показано ниже: 2\,i?vй:::~ii.oil.~~"-.~±З:iii:e( ::м§;Ь.dфЪ., sJ.mJ?;i,e. : $~ciUft=n,ceJ 5, io,' 2, t ") ..J Введение в интерфейс IDTExtensibllity2 До этого момента использовалась простая надстройка, так как она не зависит от дру­ гих классов и серверов· Automation. (Сервер Automation является приложением Automa- tion. Термин "сервер" применяется для обозначения приложений, предоставляющих ус­ луги. Ехсе! можно также считать сервером Automation, так как ее услугами пользуются другие приложения.) Но с росто'м реillений растет сложность реализации. Это особенно справедливо, если сервер Automation требует обратной связи от Ехсе! . Например, если необходимо. получить информацию о контексте от вызывающего приложения, надстрой­ ка Automation должна знать о существовании Ехсе !, а Ехсе! должна знать о существова­ нии надстройки . В этом разделе рассматриваются свойства Application.Caller и Applica- tion. Volatile, а также реализация интерфейса IDTExtensiЬility2, обеспечиваю­ щего двухстороннюю связь между надстройкой Automation и Ехсе!. Для использования в надстройке Automation объекта Application из Ехсе! ссылку на этот объект необходимо получить и сохранить в закрытой переменной внутри класса надстройки. Для этого в классе надстройки реализуется конкретный интерфейс.
300 Глава 13 С точки зрения синтаксиса интерфейс является объявлением без определений. На­ пример, в объявлении интерфейса присутствует заголовок метода, . но не указывается реализация. Интерфейс выступает в роли контракта, портала или грани. В реальном ми­ ре в качестве понятного всем примера можно привести интерs!Jейс громкости. ·Если в. ин­ терфейсе Громкость объявлено два метода Больше и Меньше, любой класс, в котором реализован интерфейс Громкость, будет предоставлять определения методов Больше и Меньше, хотя каждая реализация будет отличаться от других. Например, телевизор, проигрыватель МР3 и стереоприемник (а также дети у счастливых родителей) могут со­ держать реализацию интерфейса Громкость. В программном обеспечении реализация интерфейса определяет программный кон­ тракт. Если класс реализует конкретный интерфейс, он'реализует и все компоненты этого интерфейса. Пример громкости можно расширить до реализации интерфейса Громкость в каждом устройстве и создания универсального пульта дистанционного управления, который запрашивает у устройств интерфейс Громкость. В этом случае можно управлять громкостью любого устройства. В Excel встроена проверка конкретного интерфейса . При загрузке надстройки в Excel у нее запрашивается реализация интерфейса IDTExtensibility2 . Если в надстройке реализован этот интерфейс, Excel может вызывать метод OnConnection, так как метод OnConnection является частью интерфейса IDTExtensiЬility2. Метод OnConnec- tion позволяет Excel передавать надстройке ссылку на себя. Такая ссылка на объект Ex- cel позволяет организовать двусторонний обмен данными. Excel может взаимодейство­ вать с надстройкой через открытые методы, а надстройка может взаимодействовать с конкретным экземпляром Excel через полученную ссылку на объект Excel. Для двунаправленного обмена данными ссылку на Excel , которая передается в над­ стройку через метод OnConnection, мо~но присвоить переменной. На самом деле ин­ терфейс J;DTE:X:tensiЬility2 предоставляет пять методов, каждый из которых должен быть реализован для удовлетворения контракта IDTExtensiЬility2. Хотя код для ка­ ждого _ из пяти методов необязательно предоставлять, как минимум придется создать пус­ той метод-заглушку. В данном случае необходимо выполнить следующие задачи: О создайте проект ActiveX DLL в Visual Basic б ; О добавьте ссылку на библиотеку Microsoft Excel; О реализуйте интерфейс IDTExtens iЬi lity2; .О объявите закрытую переменную Excel .Application, в которой будет храниться ссылка на объект Excel, передаваемая через мeтoдOnConnection; О реализуйте следующие четыре необходимых метода интерфейса IDTExtensi- Ьi l i t у2. Методы должны выполнять необходимые операции. Например, метод OnDisconnection может присваивать ссылке на Excel знaчeниeNothing. Рассмотрим каждый этап более подробно. Сначала необходимо создать библиотеку ActiveX DLL. Этот этап будет реализован в виде расширения предыдущего примера, MyAddin. После этого к существующему проекту нужно добавить новый класс (файл . cls) . Назовите файл Complex.cls. В файле нового класса будет реализован интер­ фейс IDTExtensiЬility2.
Надстройки Automation и надстройки СОМ 301 После этого в Visual Basic 6 необходимо добавить ссылку на библиотеку Excel. Кроме этого, нужно добавить ссылку на библиотеку 'Мiс!"оsоft Addin Designeг . Вторая ссылка ука­ зывает на интерфейс I DTExtens iЬi l i ty2. В качестве дополнительной операции в Visual Basic 6 необходимо добавить двоичную совместимость (Ьinary compatibility). Это позволит новой библиотеке ActiveX DLL заме­ нить предыдущую библиотеку DLL и записи в системном реестре вместо создания новых записей при каждом новом запуске. Для установки двоичной совместимости выберите команду Проект~Свойства MyAddin (Pгoject~My Addin Properties), активизируйте вкладку Компоненты (Component) и выберите переключатель Двоичная совместимость (Binaгy CompatiЬility) (рис. 13 .5 ). Рис. 13.5. В1<.11ючение двоичной совместимости версий После открытия диалогового окна Проект~Ссылки. (Project~Refeгences), добавления библиотек Micгosoft Addin Designeг и Micгosoft Excel 11.0 Objёct Libi-a1y и включения двоичной совместимости можно начинать реализацию нового класса. Ниже приводится полный лисТИJIГ и соответствующие пояснения к коду: 1J:mi?iemer1E s -Yбт.Exiёns:fЪЦ.:i.i::Y2 ~ . FPri~~te . Excel As Excel . Application I?rivate Sub IDTExtensiЬility2_onconnection(ByVal _ ._, ,APP~ication As ob'ject/ - . . г ' t Byva·l ConriectMode As AddinDesignerObj ects. ext_Connec.tMod4'! , . ~ • "·ByVal Addininst , As Object, custorn() As Variant) · ;1с f \ . ~ ' Set E~cel = l\.pplica: tion ' End Sl.ib
302 Глава 13 p'riva'te '" su:Ь iJ5тЁ:xtei5.'siblЦty2:.__oiibiscorinection ( ByVal RemoveMode As AddinDesignerObjects.ext_DisconnectMode, custom(') As Variant) , , Set Excel = Noth~ng, :End Sub , ' Priva te Sub IDTExtensiЫ 1i\ y2::.._oμiddinsUpda te ( c::us tom () ' Реализация намеренно опущена ' , ,End 'Sub · Pri va te Sub, rDтEx't ens i!:?i l 'i ty2_oriв~ginShutdown (cust,om (·) ' Реализация намеренно опущена ' ,End Sub, As Priva te 'Sub IDTE x't,ensiЬi lity2_onstartupcornplete ( e;ustom ( )' As ' , Реализация .. намеренно .опущена , . ·End s11ь , •., ," ".. ,~.,.'~••. ,_ · """"',,,;,,""",, i" ..-··· · ·~~·-· ,••~·-- ,, ,_,,", В этом листинге предоставляется базовая реализация интерфейса IDТExtensiЬili ty2, В первом операторе листинга указывается реализуемый интерфейс (IDTExtens iЬi- 1 i ty2) . Редактор Visual Basic 6 помогает разработчику и генерирует пустые определения объявленных в интерфейсе методов . Во втором операторе объявляется переменная, в которой будет храниться ссылка на Excel. В первом методе OnConnection ссылка на экземпляр Excel копируется в эту переменную. Во втором методе OnDisconnection пе­ ременной присваивается значение Nothing, чтобы экземпляр Excel нельзя было исполь­ зовать после завершения работы. Оставшиеся три метода интерфейса намеренно оставлены пустыми. Контракт интер­ фейса требует создания методов-заглушек для каждого метода, объявленного в интерфейсе . Кроме этого, можно добавить все необходимые методы, включая реализации других ин­ терфейсов . Достаточно помнить, что в данном случае создавший объект Complex экземп­ ляр Excel будет видеть только интерфейс IDTExtensiЬility2 . Все остальные интерфей­ сы будут невидимы для Excel, но могут использоваться для поддержки поведения интер­ фейса или предоставления нового поведения. В данном случае стоит обратить внимание на существование надежного экземпляра · приложения Excel. При этом надстройка может опрашивать Excel для более эффектив­ ного взаимодействия. В качестве эксперимента добавьте в метод OnConnection код, ко­ торый будет запрашивать информацию об экземпляре Excel и возвращать некоторые данные . (Объектная модель Excel остается одинаковой при программировании "изнутри", из Excel, и "снаружи", из Visual Basic 6.) Далее еlце будет рассмотрено более практическое применение интерфейса IDTExtens iЬi 1 i ty2. Надстройка Complex - генерация уникального случайного числа Теперь, когда получена ссылка на объект Excel Application, ее можно использо­ вать для реализации более сложной функции. Показанная в следующем фрагменте кода функция Complex. GetNumЬers возвращает случайный набор уникальных целых чисел из определенного диапазона. В этом методе объект ExcelApplication вызывается дву­ мя разными способами. О Функция Complex . GetNumЬers использует свойство Application.Caller для определения диапазона ячеек, в котором расположен вызов функции. Эта инфор­ мация позволяет определить размер и форму создаваемого массива.
Надстройки Automation и надстройки СОМ .303 О Функция Complex. GetNumЬers использует вызов Application. Volatile для сброса генератора случайных чисел при каждом пересчете листа Excel. Функция GetNumЬers создает массив, соответствующий размерности выделенного диапазона.. В каждый элемент массива вставляются уникальные случайные числа. После этого массив сортируется по значению элемента в порядке возрастания. Значения масси­ ва используются для заполнения выделенных ячеек листа . Кроме этого, функция GetNumЬers принимает необязательный параметр Items, по­ зволяющий вызывать функцию как из ячейки листа , так и из кода VBA. Если предоста­ вить параметр Items, функция возвращает двумерный массив (l,n) уникальнь~х целых чисел . Если параметр Items не указывать, то для определения размерности массива функция воспользуется вызовом Application. Caller. Вот реализация генератора случайных чисел в Visual Basic 6: ! fiuЬl<J, 9 :F:uri'cEiori· GetNuinЬers (вyvai · мi~ As~ Long, I?YVal мах As t.o ri\JJ ~ t~ As Variant · ' . , Dim -aRange As , Rang'e '·Dim Values (.) As DouЫe Dim Couni: As . Long ·pim I AS Long Dim · Value As · Loщi · •- Dim Rows As 'LoJ;tg Cols ·As Long "' .. •,· ;
304 Глава 13 ~1;·. :«i . ' !Private. Functicш ValidateRange ( ByVa1 · Min л·s Long, 1,( .. ВуVа1Мах As Long, ByVal Count As Long) As Boolean t· ' Н'евозможно сгенерировать запрошенное количество СЛуУайньuс , ~·• чИс;ел ,' ·,если ,количество возможных вариантов меньше . • .''/коли:чества . запр 0шенных чисел DE!Ьug :лssert мrn > = о · ,:pe,b)lg~ ,i\.s~ert мах > Min Deb~g/\ssert мах - Min > Count = Мах .:. Min > Count Мiц,1То2) ·\: :, . первое -из111~ренИе м~ссива заполнЯется возможными ·~ ~•. от" ,nin до max включительно. ' ·, В,тррое измерение заполняется ..случайными числами. · · !. . Эти : числа будут испоЛьзоваться . ·' Д:ля создания · массива · чисел '
Надстройки Automation и надстройки СОМ 305 Изменение порядка случайных чисел Метод GetNurnЬers возвращает двумерный массив чисел . В первой размерности со­ держатся все числа из диапазона от Mi n до Мах. Во второй размерности содержатся слу­ чайные числа от О до 1. Первая размерность отсортирована, а вторая имеет случайный порядок чисел. (Для генерации случайных чисел можно использовать функцию Rnd, но при небольшом Диапазоне могут возникать повторения. Данный метод генерации позво ­ ляет добиться от~утствия повторений . ) Для изменения порядка уникальных чисел в диа­ пазоне от Mi n до Мах можно отсортировать случайные числа во второй размерности мас­ сива. Таким образом, для изменения цорядка чисел в первой размерности необходимо отсортировать вторую размерность. В подпрограмме ScrarnЬle реализован алгоритм пузырьковой сортировки, сравни­ вающий каждый элемент со всеми другими элементами и переносящий большие элемен­ ты в конец массива. Так как пузырьковая сортировка сравнивает каждый элемент со все­ ми другими элементами, в процессе сортировки выполняется n':'n или n2 сравнений. Это значит, что для относительно небольших значений n, например для n = lOOO, приходится выполнять большое количество сравнений. Тысяча элементов массива потребует 1000000 сравнений. По этой причине алгоритм пузырьковой сортировки используется достаточно редко . С другой стороны, современные персональные компьютеры обладают высокой производительностью и даже при использовании пузырьковой сортировки в со­ стоянии очень быстро отсортировать от 10000 до 100000 элементов. В данном случае это достаточю;:> быстро. (В качестве эксперимента выделите все ячейки на листе и введите GetNurnЬers (1, 10000000) . После этого нажм1пе <Ctrl+Shift+Enter>. Сортировка 10000000 элементов займет некоторое время.) Если требуется быстрая сортировка большого набора данных, воспользуйтесь алго­ ритмами Selection Sort и QuickSort . Каждый из них хорошо подходит для сорти­ ровки определенного типа входных данных. Например, алгоритм QuickSort не намно ­ го быстрее SelectionSort или пузырьковой сортировки на массивах среднего размера. На относительно отсортированных , массивахQuiсkSоrt может работать еще медленнее. Вот реализация алгоритмов ScrarnЬle/Sort и метода Swap: ·- riva Ee'· sиъ ·· s7rтmь1-e ·(вY:R.eI'-va1ue:s ·'As 'vaiii:irit) o/"'; .,.,, .,,,,"".'V • < здесь можно использова.ть простой . алгоритм ) п::тзЬiрьковой - сортировки •, так как он хорошо · 1 . справляетсf!: с массивами в · ioooo Эл.ементов. ' для 'сорт.Ировки массивов больше Го размера ' воспользуйтесь ал'Горитмами·, Selection Sort:' и I As i;..ong · J As Long LBouJ;id(Values) то 1JBound{Values J = I '< + 1 То uвound(Va1ues) · I f (Values{I, 2J ').. Values{J, C'all Swap (Values, I, J) ·
306 Глава 13 NextJ Next,I ·End Sub Private suь . swap(ByRef Valuris ·~ вуу,ат As Long) Templ теmр2 Values (I, 1), Valμes{I,. .2) Values.(I, 1) ; Valuei:; (I , 2) Values(J, 1) ' va:Lues (J, 2) J;End Si,ib = yalues(J, 1) =. Values'(a ; 2) Templ ~- Tefi1p2 После внесения вс=ех изменений необходимо сохранить и перекомпилировать биб­ лиотеку MyAddin. dl 1 в Visu al Basic 6. Для этого воспользуйтесь командой Файл~::::>Откомпилировать (Fi!e i::::>Make) . Ее:ли одновременно открыты Visual Basic 6 и Ex- cel и в результате выбора этой команды выдается сообщение "В доступе отказано'', за­ кройте Excel, откомпилируйте надстройку и откройте ее в Excel повторно. Надстройка Cornplex используется так же, как и показанная выше простая функция Sequence. Единственное различие заключается в том, что Excel необходимо r:ообщить о необходимости загрузить MyAddin. Cornplex. Для этого выберите команду Сервис~:::> Надстройки~::::> Надстройки Automation (Toolsi::::>Addinsi::::>Automation Addins) и надстройку из списка. При вводе формулы массива лист будет выглядеть следующим образом (рис. 13 .6): Рис. 13.6. Результат работы надстрой~си Сотрlех Как показано в этом примере, не стоит выделять весь лист 'для проверки работоспо­ собности кода, так как при этом будет создан _ массив из более 16 миллионов случайных чисел . С таким объемом массива алгоритм пузырьковой сортировки просто не справится. В качеств е альтернативы здесь приведена реализация сортировки с помощью алгоритма Quic kSort. В данном случае для ре ализации алгоритма используется методSwар:
Надстройки Automation и надстройки СОМ 307 iPrivate·.· su.:ь ·6U:lcfsort."Cв:iil<5I v _aiu.e·s· л~·· var±al_1t:, ~_= · . 1 O);\tipnalByVal Left As . Long, Optional ByVal ~1:ght '. Алгоритм; , использующий метод дихртоМии, который хорошо ' . сгiрав.i~яется с большИми не отсЬр.тированными массивами. Dim I As Long Dim J As Long Dim К As- Long Dim Iteml .As Variant Dim · Item2 As Variant ~:' Error GoTo Catch IsMissing(Left) or Left = о Then IsMissing{Right) or Right О Left = R~ght ' Получить Элемент меiду Left It'em.1 = Values ( (Left + Right) . . ~ +' ' ·.,{. ' Рассмотреть этот фрагмент массива DoWhi:j.eI <J Do While Valцes(r, 2) < Iteml And I "< I=I+1 Loop Do While Valцes(J, 2) > It:eml And J > J=J-1 Loop ·rfI<Jт·hen Call• Swap(Va1ues, I, End If IfI'<=JThen I=I+1 J=J-1 If ' Рекурсивная обработка левого nодмассива If J > Left Then Call .QuickSor-t (Values, Left, ' • Рекурсивная обработ·ка пра.вого подмассива Н ± < Right Then Call Quickso:i;-t(Values, I, E:X:it Sub :catch:. ' Ml:!gBox Er:r. Description; · v:ЬCri tical fEnd sub i !Private ~ ' ~ Sub swap(ByRef Values As Vari:ant, ByVal J ~s Long) Dim Te rnp1 As Dou:Ьl e N.щд'~J?.2 А_е Dou:ЬJ...§....
308 Глава 13 1) 2)' 1) Values (J, Н / 2). Values(J, :n 1)' Templ 2) Temp2 ,.:§чd~i?.u'l:J... i. -= . - ··"·,.~.. Если это интересно, выводите содержимое рассматриваемого массива на каждом этапе. При' этом !'южно пронаблюдать, как массив рекурсивно разбивается на фрагменты и обме­ ниваются пограничньiе значения. В результате получается отсортированный массив. Надстройки СОМ Хотя надстройки Automation позволяют создавать собственные функции листа, над­ стройки СОМ дают возможность расширять пользовательский интерфейс Excel и всех других приложений Office. Надстройки СОМ обладают рядом преимушеств по сравне­ нию с обычными надстройками . xla: О надстройки СОМ загружаются быстрее ! чем надстройки. xla; О надстройки СОМ не отображаются в окне Project Explorer (Окно проекта) в ре­ дакторе VBE; О надстройки СОМ не могут быть модифицированы пользователями, так как явля­ ются откомпилированными двоичными файлами; О надстройки СОМ не связаны непосредственно с Excel , а надстройки . xla могут использоваться только в Excel. Надстройки СОМ применимы в любом приложе­ . нии Office . Продолжение обзора интерфейса IDTExtensibllity2 В предыдушем разделе было рассмотрено использование интерфейса IDTExtensiЬi­ lity2 , в котором методы OnConnection и OnDisconnection применялись для получе­ ния ссылки на объект приложения Excel. Оставшиеся методы интерфейса могут использо­ ваться надстройками СОМ для реагирования на конкретные события в процессе работы Excel. В следующей таблице рассматриваются все методы интерфейса IDТExtens iЬi 1 i ty2: Метод OnConnection Вызывается При загрузке надстройки СОМ в Excel Типичное применение Сохранение ссылки на приложение Excel, добавление пунктов меню в пане­ ли инструментов Excel и настройка про- цедур обработки событий onstartupComplete После завер~ения загруз- Отображение начального диалогового ки всех надстроек окна (как в Access и PowerPoiпt) или для и файлов в Excel изменения поведения в зависимости от присутствия других надстроек "
Метод OnAddinsUpdate OnBeginShutdown / OnDisconnection Надстройки Automation и надстройки СОМ 309 Вызывается Типичное применение При загрузке или выгрузке Если надстройка СОМ зависит от над- других надстроек СОМ стройки других надстроек, эта надстрой- В начале процесса завер­ шения работы Excel При выгрузке надстройки СОМ в результате коман- ка может выгрузить себя самостоятель­ - но Остановка процесса завершения работы Excel в некоторых ситуациях или вызов процедур очистки перед завершением работы Сохранение параметров . Если надстрой­ ка выгружается ПQ команде пользовате- ды пользователя или в ре- ля, удалить элементы на панелях инст- зультате завершения ра- рументов, созданные в процессе под- боты Excel " ключения Как было показано ранее, реализация интерфейса требует предоставления реализа­ ции каждого метода интерфейса, даже если она является заглушкой. Регистрация надстройки СОМ в Excel Для уведомления Excel о существовании надстройки Automation необходимо выбрать команду Сервисq Надстройкиq Надстройки Automation (Toolsc:Q Addins~Automation Addins). В результате использования открывшегося диалогового окна в системный ре­ естр записывается соответствующая информация. Для регистрации в Excel надстройки СОМ в системном реестре необходимо создать соответствующие записи и разделы. При запуске Excel содержимое этих разделов используется для обнаружения доступных над­ строек СОМ. Значения записей в разделах определяют отображение надстроек СОМ в списке надстроек и необходимость загрузки надстроек. Информация о надстройках СОМ для Excel хранится в следующих разделах системного реестра: О надстройки, зарегистрированные для текущего пользователя: HKEY_CURRENТ_USER\ Software\Microsoft \Off ice\Excel\Addins \AddinProgID; О надстройки, зарегистрированные для всех пользователей: HKEY_ USERS\. DEFAULT\ Software\Microsoft \Off ice \ Excel\Addins \AddinProgID; ' О надстройки, зарегистрированные для компьютера: HKEY_LOCAL_МACHINE\ Software\Microsoft\Office\Excel\Addins\AddinProgID. В каждый раздел добавляются следующие записи: Имя Тип FriendlyNarne String Description String LoadBehavior Nurnber Применение Имя в списке надстроек СОМ Описание в диалоговом окне надстроек СОМ При выгрузке, загрузке при запуске или загрузке по требо ­ ванию
310 Глава 13 Имя Тип SatelliteDllName NumЬer CommandLineSafe String Применение Имя библиотеки ресурсов DLL, в которой содержатся ло­ кализованные имена и описания . При ис п ользовании та­ кой библиотеки имя и описание буду:r указываться в виде #Num, где Num это номер идентификатора ресурса в биб­ лиотеке ресурсов. Этот прием используется для локали­ зации большинства надстроек 'Office Определяет возможность вызова надстройки из пригла­ шения интерпретатора командной строки. Эта запись не имеет значения для библиотек СОМ После правильной регистрации надстройка СОМ станет доступна в диалоговом окне Ехсе! ·Надстройки СОМ (СОМ Addins). В этом окне можно загружать и выгружать над­ стройки СОМ как обычные. К сожалению, команда для отображения этого диалогового окна отсутствует в стандартных меню Ехсе!. Для получения доступа к этому диалоговому окну необходимо модифицировать панели инструментов. О Щелкните правой кнопкой мыши на панели инструментов Excel и выберите пункт Настройка (Customize). · О Щелкните на пункте меню Сервис (Tools) для просмотра списка подменю. О В диалоговом окне Настройка (Cшtomize) активизируйте вкладку Команды (Commands), выберите пункт Сервис (Tools) в списке слева и прокрутите правый список, пока не обнаружите пункт Надстройки СОМ (СОМ Ad.dins) (рис. 13.7). О Перетащите пункт Надстройки СОМ (СОМ Addins) из правого списка в панель инструментов Сервис (Tools) под пунктом меню Надстройки (Addins) . О Закройте диалоговое окно Настройка (Customize). ~~крыть Рис. 13. 7. Добавление пуюапа меню в меню Сервис (Tools)
Надстройки Automation и надстройки СОМ 311 Конструктор надстроек СОМ Компания Microsoft предоставляет класс Designer, который можно использовать для упрощения созд~ния и регистрации надстроек СОМ. В классе Des igner реализован интерфейс IDTExtensibility2 . Методы класса Designer вызываются через события, поэтому предоставление методов -заглушек не требуется. Для использования класса Designer достаточно реаJiизовать процедуры обработки интересующих событий . Класс Designer предоставляет графический интерфейс, упрощающий ввод значений в записи системного реестра. При компиляции класса Designer выполняется автоматическое добавление кода (точки входа DllRegisterServer), который добавляет все необходи­ мые разделы системного реестра. (По умолчанию разделы записываются только для те­ кущего пользователя HKEY_CURRENT _USER .) Для регистрации сервера достаточно запус­ тить команду regsvr32 application. dll, где вместо application . dll необходи­ мо указать путь и имя файла библиотеки СОМ. Пакет Office Developei- Edition позволяет создавать и компилировать надстройки СОМ в VBE, а не в Visual Basic 6. (Для с'Оздания надстройки в редакторе VBE из Developer Edition выберите команду Файлс::>Создатьс::> Проект надстройки (Newc::>Pгojectc::>Addin Pгoject) . ) В этом примере создается надстройка СОМ, предоставляющая мастера для ввода функ­ ции GetNшnЬers из надстройки Automation, созданной в предыдущем разделе. Для созда­ ния библиотеки MyAddin. dl l в данном случае также будет исrюльзоваться Visual Basic. Addin Display Ыаmе Addin .Qescriptio'n Disp lays а wizard dialog forthe GetNumbers Automation Addin fundion. documented in the Excel 2003 VBA Programmer's Reference. Agplication MicrosoftExce l . . . ,"_.,.,_, vо:'г >< ApplicaЦon )!ersio~ Рис. 13.8. Свойства надстройки
312 Глава 13 Откройте проект MyAddin в Visual Basic . Добавьте в проект новый класс надстройки. Для этого выберите Проектс>Добавить класс надстройки (Pгojectc>Ad.d Addin Class) . (Если эта команда недоступна, выберите kоманду Проектс>Компонентыс>Конструкторы (Projectc>Componentsc>Designeгs) и установите флажок напр_отив пункта Класс надстройки (Addin Class)). После этого будет добавлен класс Des igner, который называ­ ется AddinDesignerl . В окне Свойства (Properties) измените имя класса на COМAddin и установите свойство PuЬlic в значение True (не обращайте внимание на предупреж­ дения). Заполните поля в окне Конструктор (Designeг), как показано на рис. 13.8. Подключение к Excel Выберите команду COMAddin в окне Project Explorer (Окно проекта) в Visual Basic 6. Щелкните правой кнопкой мыши на конструкторе COMAddln , созданном в предыдущем разделе. После этого реализуйте процедуры обработки событий OnConnection и On- Disconnection, выбрав Addinlnstance из раскрывающегося списка Object (Объект) и процедуры OnConnection и OnDisconnection из раскрывающегося списка Procedure (Процедура). Добавьте оператор WithEvents , в котором объявляется переменная типа Excel .Application. Другими словами, здесь сохраняется ссылка на вызывающее при­ ложение Excel, которая передается через процедуру обработки события - OnConnection: .(i?~:i.·va.t'ЪTw:i.ШБ:VеЬЬ., Бх С:е_~·· л~ +'Ёх с~ i : дi;Ji;JiT~~E i ~~""'' " "'" -" ," · ~"':: ·· j;':i 9et Ехсе1 ;; Applic~tion . ;• MsgBpx "Под·кл!Qчен", vЫri_formation ;End Sub ' ' Private j . i%. f: · Set Extel = Nothing .. ;• , !1sgBox '.'Отк.люче н ", ·:vь:r;'rifor~ation t. tEp_2, Sup Сохраните проект и создайте библиотеку DLL с надстройкой, выбрав команду Файле> Откомпилировать MyAddin.dll (Fi!ec>Make MyAddin.dll). После этого запустите Excel 2003. (Обратите внимание, что после открытия Excel повторная компиляция надстройки ока­ жется невозможна, так как на надстройку будет ссылаться Excel.) Посде открытия Excel и подключения надстройки появится окно с сообщением "Подключен". В процессе за­ вершения работы Excel будет выдано сообщение "Отключен" . Эти сообщения также вы ­ даются при выборе команды меню Сервисе> Надстройки СОМ (Too!sc>COM Addins), до­ бавленной ранее, и при установке или сбросе флажка GetNumЬers в ~писке доступных надстроек (рис. 13 .9) .
Надстройки Automation и надстройки СОМ 313 Список: !:!.адстроек: -~------ ' ок "") 1 l :.::I GotNurr.Ь.Э.s \'iiZard '------------------------~------~d J _ ~алнт~ r..iecтo: C:\DocLrrents and Settings\Lesct>nsky Oleg\Application Data\Microsoft\Add!ns\ Поведение при 3дrруже: Загружать при запуске · Рис. 13.9 . Устано11Ка надстройки СОМ - Обраб отка событий Ехсе/ Модуль кода Designer является модулем класса. Это значит, что с помощью оператора WithEvents можно определить переменную, позволяющую создавать процедуры обработ­ ки событий класса. В показанном ранее коде выполнялось подключение к событиям объек­ та Excel Application, · что позволяло надстройке СОМ реагировать на открытие и закры­ тие надстроек пользователями , изменение данных в ячейках и на другие события Excel. Дополнительная информация об этих событиях была приведена в главе 12. Добавление элементов управления и 17анелей инструментов После получения ссылки на объект Excel Application собственные пане.Ли инстру­ ментов и элементы управления можно добавлять так же, как будет показано в главе 26. Единственная разница заключается в обработке щелчка на кнопке. При добавлении эле­ мента управления CommandBarButton из Excel свойству OnAction присваивается имя процедуры, которая запускается при щелчке на кнопке. При добавлении элемента управления CommandВarButton из-за пределов Excel (из надстройки СОМ) свойству OnAction объекта кнопки присваивается указатель на над­ стройку СОМ (в результате Excel будет знать, что за обработку щелчка на кнопке отвечает надстройка СОМ). После этого привязка к событию Click объекта кнопки осуществляется через переменную, объявленную с помощью оператора Wi thEvents в коде надстройки. Вот последовательность событий и вызовов, возникающих при щелчке на кнопке: О пользователь щелкает на кнопке; О Excel проверяет значение свойства OnAction объекта кнопки и считывает значе­ ние свойства Progid надстройки СОМ; О Excel проверяет, загрузилq.сь ли надстройка . Если нет, надстройка загружается и запускается процедура обработки coбытияOnConnection; О в процедуре обработки события OnConnection в коде на; t l' тройки с помощью ключевого слова WithEvents объявляется переменная, которой присваивается ссылка на кнопку; О Excel запускает процедуру обработки событияСliсk для кнопки; О в надстройке-выполняется процедура обработки события'. Из приведенной выше последовательности событий следует, что существует два ва­ рианта загрузки надстроек, а именно: О загру31(,а по требова'//,UЮ (demand-loaded). Excel загружает надстройку при первой ре­ гистрации. В панели меню добавляются пункты меню надстройки с установкой свойства OnAction. При закрытии Excel эти пункты меню сохраняются . При еле-
314 Глава 13 дующей загрузке Excel надстройка загружается только при щелчке на пункте меню. Если доступ к надстройке осуществляется только через меню, то этот метод более предпочтителен. Для включения загрузки надстройки по требованию необходимо выбрать команду Load on demand (Загрузка по требовани19) в раскрывающемсЯ: списке Load Behavior в окне Addin Designer; О загруЗ'Ка при запуске (stmtup). Надстройка загружается при каждом запуске Excel. Обычно такая надстройка добавляет пункты меню при каждом запуске Excel и уда­ ляет при каждом завершении работы Excel. Если надстройка должна реагировать на события объекта Application, этот метод загрузки предпочтительней . Такое поведение надстройки определяется пунктом ~tartup (Загрузка при запуске) в рас­ крывающемся ~писке Load Behavior в окне Addin Designer. В следующем примере будут добавлены два пункта меню, отображающие диалоговые окна мастера для поддержки ввода формул надстроек Automation. Для использования объектов CommandBarButton потребуется ссылка на объектную библиотеку Office. Для этого щелкните на пункте ProjectQReferences (ПроектQСсылки) и установите флажок напротив Microsoft Office 11 .0 Object Library. Модифицируйте объявления в коде надстройки СОМ. Добавьте объявление пере­ менных CommandBarButton и String. При этом будут объявлены переменные уровня класса, которые будут использоваться для хранения ссылки на объект Excel Applica- tion и подключения к событиям oбъeктaCommandBarButton: f'PrIvaTe wJ: tБEveh.ts-~-E:xce Гдs=Excel·:-дppiica-tГon""-~"-· "·"::'"7"= -..,,~.~-··-" ~-,· ·~"'•' 1 Priva~e WithEve.n~s !1eni.Щutton As OЦice.CommandBarButton · ,с2ш:;;t:Д~§§.Jt11''!Я h§°"'~j:~}.:}lg ~:....::My~<;'!.cti!J:!~Q:.::.:. ..• ."'"ш ;.""'~·-· • "" _ ~ При подключении к событиям объекта CommandBarButton с помощью ключевого слова Wi thEvents переменная MenuButton связывается · со свойством Tag объекта кнопки, на которую ссы~ается переменная. Все кнопки с одинаковым значением свойства Tag будут запускать процедуру обработки события Click. При этом событие Click для всех кнопок с одинаковым значением свойства Tag можно перехватить с помощью единственной переменной WithEvents. Для того чтобы различать кнопки, в методе OnConnection каж­ дой кнопке присваивается уникальное значение свойства Parameter. Ниже показаны модифицированные методы OnConnection и OnDisconnection: iI>riva:ы··зu.ь . XaёJTn:i:ns t.an'Ce.::oncoriiiёcHo:Fi (в.Yva:г~Лi;i:Pi'icat.Io'n" A'S "'oЬ:Г~cE ;"·7·~· '. ·вyval ConnectMode As AddinDesignerOb)ects.. ext~connect.Mode, _ • · ByVal A.ddininst As Object·, custom() As variant) " Set Excel = Application · ' · · MsgBox "Conhected"., vbinformat:i,_on ' calJ. TnsertT09~вutton(AЦdininst) ,End Sub Sub Insert;Too1Button(Byva1 тoolbar As co!Т\пiandвar Button As Commp.ndBarButton . .. . Set. 'Toolbar =., Excel. CommandBars ( "Worksheet Меы.u · 1, . Findcc\ntrol \ID: =ЗоОО 7 ) . coпimandвar · 'on· Erroi . R~,s. u!!I~ ..Next · G'> 1' ,· " хе .Set "J?.11t\cщ .< 'I' qq i ]:)i'i l:'., (:oil,tr():), s t': ~ e CJ.1,\ eP.l: E.! Wi z q ,r: q:' ). ..
Надстройки Automation и надстройки СОМ 315 " i:f ' (вtiйori ' is Not:.hiniJ) тhen ~ .·· ;, r.);,"' ,.· ... ~et . Button = To.o l b,ar.Controis,Add(msoCon~rolBut:ton; :~·; " sequenceWi :iard.'' ) . " " ... Bчtton.Caption ; "Sequence Wizard'' Button . S·ty1e = rrisoBU:t tonCaption · Biltton . Tag = AddinTag · Вut.i:on'.OnAct i on = " !<" & Addininst.Progid If • set ' вutton. = Nothing .I ·f (Bu tton ·· Is Nothing) 'rhen . ,· о/ •••. • .· set:. Butt.on = ToolBar.Controls '. Add(ni~oContio.lButtщ\., " GetNфЬerswizard" .) · " . · Button . Caption "GetNumbers · Wizard" '- ·. Button. Style = msoButtonCaption · · Button.Tag = .msAddinTag , Button . OnAction ''!< " & Addininst .' Prp,gid '· .; .<.i!~ ··' Обратите внимание, что значение свойства OnAction должно иметь специальный формат, иначе Excel не воспримет значение в качестве ссылки на надстройку СОМ. Ссылка должна выглядеть как " ! <ProgID> ", Ниже показан пример типичной надстройки с загрузкой по требованию . Пункт'ы ме­ ню данной надстройки удаляются, только если пользователь выгружает надстройку в диалоговом окне Н адстройки СОМ (СОМ Addin). Метод выгрузки определяется по значению свойства RemoveMode. Пункты меню загружаемых при запуске надстроек уда­ ляются при выгрузке надстройки: ii'riva(e -sufГ Лd.d.iriYiistaric'ё.:_orib:lsconnection Г_ .... i , ByVa l RenioveMode As AddinDesignerObjects.ext_ DisconnectMode, ' custoщ() As Variant) As CommandBarControl · • ' Удали~ь кнопки, если Excel закрывается пользователем If RemoveMode ·= ex·t _dm_UserClosed Then · . For Басh Control - In Excel.CommandBars.FindControls(Tag:=AddinTag) Control. Delete, . ·Next ·' .End If , Set MenuButton Nothing Set .Excel . =. Nothing M~gBox " Отключен", vbinfprmation · В процедуре обработки события Click объекта MenuButton проверяется значение свой­ ства Parameter той 'кнопки, на которой щелкнул пользователь. После этого выводится диа­ логовое окно, связанное с данной кнопкой. На этом этапе к проекту достаточно добавить два пустых диалоговых окна, назвать их SequenceWi zardForm и GetNumЬersWi zardForm: i~rivat:.e suь · м'enU:ВuE't:.on_click < _ . ~ .· .·.' ByVal Ctrl As Office .. CommandBarButton, Ca ncelDefault As Boolean) ! \;;.ZJ<.t.и,;" ,.;}
316 Глава 13 'тУ:Рео:Е ШБхсе:С. sei:ёction ''I's' Range 'тhёn "'~:.~ ;;=- o;elect Case Ctrl. Paraineter ... Else Case "SequenceWizard" · . Sequericewiza~dForm.show vbModal Case ·"GetNumbersWizard" GetNurriЬersWizardF6rm.Show End Se1ect ·мsgBox "Не выбран диапазон ячеек. " , "Мает.ер Excel 2003!' · End Гf fE:.~o ~~о ~ -~- "~- .. Сохраните проект-и воспользуйтесь командой Файлс:>Компилировать MyAddin.dll (Filec:> Make MyAddin.dll) для создания библиотеки DLL. При этом для Excel будут добавлены за­ писи системного реестра. Запустите Excel 2003 и выберите команду Cepвиcc:>Sequence Wizard (Too!sc:>Sequence Wizard). После этого будет показано диалоговое окно мастера. Использование надстройки СОМ из кода VBA Разработчик надстройки СОМ можеr предоставить программный доступ к надстрой- ке из кода VВА (к сожалению, так бывает не часто). Это может потребоваться для: О предоставления функциональности надстройки коду сторонних разработчиков; О предоставления механизма для управления и модификации надстройки. Для предоставления механизма управления надстройкой из кода VВА свойствуОЬj ect эк­ земпляра надстройки необходимо присвоить ссылку на класс надстройки СОМ (или отдель­ ный класс в предеЛах надстройки). После этого необходимая функциональность предоставля­ ется через свойства и методы, объявленные с квалификатором PuЬlic. В данном примере предоставляется еще один способ использования функций Sequence и GetNumЬers. Добавьте следующую строку кода в конец подпрограммы Addininstance_OnCon- ection для предоставЛения ссылки на класс надстройки через свойствоОЬj ect: cJ>.dc{i]\Irie.t J:!ьj!~S:.( -':".i~м~::/..: После этого добавьте следующий код в конец модуля класса Designer. Этот код соз­ дает и возвращает новые экземпляры классов Simple и Complex: :J?u:ь1Ic~h'opeR'Y.'"'Ciet" sп11ъ1·ео:Б:J есе\> ; Set SimpleObject .: h N_ew S.i!flple End Property :Pu.Ыic Prope'rty · G~t ' · Set ComplexObject t?h9i I?.ropert: · =·
Надстройки Automation и надстройки СОМ 317 Главной особенностью этого подхода является применение того же экземпляра класса надстройки, что и в Excel. Это позволяет манипулировать, опрашивать и управлять над­ стройкой из кода VВА. В случае более сложных надстроек СОМ этот же метод может ис­ пользоваться для предоставления доступа к полной объектной модели для управ.irения надстройкой . Связывание с несколькими приложениями Office В начале этой главы отмечалось, что одним из главных преимушеств надстроек СОМ по сравнению с надстройками . xla является возможность использования одной библио­ теки DLL в нескольких Приложениях Office. Для этого достаточно добавить класс над­ стройки Designer в каtкдое интересующее приложение. Добавление класса Designer для Excel было показано ранее в этой главе. Конечно, особенности каждого при.Ложения придется обрабатывать отдельно . В следующем простом примере функция Sequence будет предоставлена через над­ стройки СОМ в Access и использована д~я заполнения списка в дна.Логовом окне. Начните с добавления в проект нового класса над(:тройки. В окне Сво йства (Propeгties) измените имя класса нaAccessAddin, устано~ите свойство PuЬlic в значе­ ние True (не обращайте внимание на предупреждения). Внесите информацию в диало­ говое окно Designer, как показано на рис . 13.10. · Addin Display Ь!аmе jEx cel 20ЮSeque ~ce ., Addin Qes cription " Exposes the Addin to MS-Access Application jMicrosoft Acc:ss Application ]{ersion j мicrosoftAccess 11 .О lnitia l !.,oad Behavior jstмup Рис. 13. 10. Настройка свойств надстройки
318 Глава 13 Выберите команду Вид9Код (View9Code) и скопируйте следующий код в модуль ко­ да Designer: !i5rivaT~~uЬAacrrnrnst1:'nce-:onc6nnectforГ(вY:vai""A'PPiicai:~i6n д's оБJ e'ct:;=.!. ~ ByVal . Connec,tMode As AddinDesigдerObj ects . .ext:...ConnectMode, , t• ByVai Addininst AS . object, custom() As . Variant) '·: .. ~. , Addininst.object = Ме · t·,' ''' " ' tEnd ·SUb" t.' i . . . ' . ыi·с P!ioperty Get SimpleObj ect ci . '.Set Simp1eObject = New . Simple .. .§!!:J::Y,,...""'"'"',"""""""'"'"""""'''""'"'"·" Сохраните проект. и воспользуйтесь командой Файл90ткомпилировать MyAddin.dll (File9MyAddin.dll) для компиляции библиотеки DLL. Запустите Access 2003 и создайте пустую базу данных. Создайте новое диалоговое окно, добавьте в него элемент управле­ ния списка и скопируЙ:те следующий код в .модуль кода диалогового окна: roP·t~o:n.:'}s<:iJп~.:тt:············ ·······.г············ f.Option Compa:i;;e J)a,ta:Pase ~·•·. ' . riva: Сохраните диалоговое окно и запустите код для демонстрации работы надстройки СОМ (рис. 13_. 1 1). Рис. 13.11 . Эле.мент управления списка, заполненный в результате работы над­ стройки СОМ
Надстройки Automation и надстройки СОМ 319 Резюме Вместе с Excel 2003 компания Micгosoft предоставила несколько способов использо ­ вания надстроек, написанных на Visual Basic или любом другом языке, поддерживающем создание библиотек СОМ DLL. О Надстройки Automation позволяют добавлять новые функции, которые будут дос­ тупны на листах и в процедурах VBA. О Надстройки СОМ позволяют добавлять новые пункты меню и поддерживают об­ работку событий Excel. Кроме этого, такие надстройки можно использовать в не­ скольких приложениях Office и в редакторе VBE. О Над стройки СОМ обеспечивают программный доступ к поведению надстройки, например поддерживают включение и отключение операций или использование функций надстройки . О Надстройки Automation и СОМ обычно обеспечивают большую производите.Ль­ ность, чем надстройки VВА. В главе 27 будет рассмотрен третий способ расширения функциональности Excel че­ рез библиотеки Acti»eX DLL - смарт -теги.
--- Настройка редакт~ра VBE В списке библиотек в диалоговом окне To oJsqReferences (СервисqСсылки) редак­ тора VВЕ присутствует объектная библиотека Micгosoft Visual Basic fи Applications Ex- tensibility 5.3 . Свойства, методы и события объектов из этой библиотеки позволяют: О программно создавать, удалять и модифицировать код, диалоговые окна UserForm .и ссылки на собственные и чужие книги; О программировать редактор VВЕ для создания надстроек, помогающих при разра' ботке и автоматизирующих многие задачи программирования. С выходом Office 2000 объекту CommandBarButton было добавлено событие Cli ck, используемое для обработки щелчков на кнопках, добавленных в панели инструм_ентов редактора VВЕ. Таким образом, подобная надстройка не будет работать в Excel 97, хотя . код управления редактором VBE и его объектами остается актуальным. Единственное отличие Excel 2002 от Excel 2000 связано с механизмом обеспечения безопасности. Показанные в этой главе методы используются макровирусами для моди­ фикации кода целевого файла, чтр приводит к инфицированию, для предотвращения которого компания Micгosoft позволила отключать доступ к проектам книг. Доступ за­ прещен по умо.т.iчанию, поэтому код из этой главы работать не будет . Для предоставления доступа к проектам установите флажок Доверенный доступ к проекту Visual Basic (Trust Access to Visual Basic Pгoject) в окне Сервис q Макрос qБе зопасность q Доверенные ИСТОЧНИКИ (ToolsqMacгosqSecuгityqTгusted Sources). В этой главе рассматривается создание кода для автоматизации работы редактора VВЕ, которое будет продемонстрировано на примере разработки инструментария VВЕ, позволяющего ускорить разработку приложений. После этого, для демонстрации про­ граммной модификации кода, диалоговых окон UserForm и ссылок, в инструментарий будет добавлено несколько утилит . Для сохранения простоты большая часть кода в этой главе не содержит обработки ошибок.
322 Глава 14 Идентификация объектов редактора VBE Все составляющие редактор VВЕ объекты, свойства и методы хранятся в собственной объектной библиотеке. Перед их использованием в проекте придется создать ссылку на данную библиотеку. Для этого нужно открыть редактор VВЕ, в~rбрать меню Toolsq References (СервисqСсылки), установить флажок напротив Mic1·osoft Visual Basic for AppЦcations Extensibility 5.3 library, как показано на рис. 14. l, и щелкнуть на кнопкеОК. Объект VBE Norereш:,;s -· VВA Pr oje ct - - . . . - •- - . tв) 8,vailaЫe References: ~ Visual Basic For Applications ~i. :? Mcrosoft Excel 11.О Object LiЬrary ;;: : :11 {~} OLE Aut omation Б?.1 Мicrosoft Office 11.О QМ_ect Libra.!Y ..:_ · [~; :;:ИфWiNoЩ!ФШЩt;fM!@iMЩt!ШфttltU С IAS Helper СОМ Component 1.0 Туре LiЬrary .. !J [J IAS RADIUS Protocol 1.0 Туре l ibrary С Active DS Туре LiЬrary Prior~y С Active Setup Control Lbrary :~+· . [::J ActiveMovie control type liЬrary _ _ ['j дSFCrop 1.0 Туре Library [J дТL 2.0 Туре Library С Ыockdriver 1.0 Туре Library "· ~ii9:0:;;;o,1i:::~l!ri..~2~1: .- i?J:'tiJJ _ок 1 'c•ncel · 1· ~owse". ·1 t!elp, ···-M icrosoft Visuд/ Вasic for Appkaticins EXte("!sibl~ty 5.3 .······ А··· ·· ·"····· ······:::···· ·· ··· ·· ····,····-::··~ ······· :1, Loc~tion: .. C:\PrOQrom Rlo•\Commoo File•\Micro.•oft Share~VBд\VBдб\1/1 1 . L•ni/.Ja9e: 'St~~~'~. ··' · :· , •... •• Рис. 14.1. Добавление ссылки на объектную библиоте- 1<)' редактора VВЕ ' Объект верхнего уровня в объектной модели редактора называется VВЕ. Этот объект является свойством объекта Excel Application. Таким образом, для с9зда:ния объектной переменной, которая ссылается на объект VВЕ, можно воспользоваться следующим кодом: ·t~~~:;~I~~~~:if~~~~~~~;,-~- Объект VBProject Этот объект является контейнером для всех . "программных" компонентов книги, включая дИ:алоговые окна UserForrn, стандартные модули, модули классов и код каждого листа и книги . Для доступа к объектам VВProj ect можно просмотре ть коллекцию VВProj ects или воспользоваться свойствомVВРrоj ect объекта книги. Для поиска объекта VВProj ect, соответствующего книге Bookl. xls, воспользуй­ тесь следующим кодом: ~-~~:~~~~~:;;;~;:~~:~~~~:!f~];~~,~~~l,·;,~::~~P;;~.;c~~:, При создании надстройки для среды разработки VB может потребоваться информа­ ция о выделенном в данный момент проекте в Project Explorer (Окне проекта). Для этого воспользуйтесь cвoйcтвoмActiveVВProject объекта VВЕ:
Настро,йка редактора VВЕ 323 ~~~;.-.·~;.~т:;~ ·;s~~~if:~~i~k.~~-~~~ic~i~;~~~.:~J.е,;,1::,",·~~-··~.:.. Обратите внимание, что свойство ActiveVBProject указывает на проект, который редактируется в редакторе VВЕ. Это свойство никак не связано со свойством Active- Workbook, которое предос;:тавляется Excel. На самом деле, с выходом Office 2000 Devel- opeг Edition появилась возможность создавать изолированные проекты VB, не Являю­ щиеся частью книги Excel. Объект VBComponent В модели расширения функциональности диалоговые окна UserForm, стандартные модули, модули классов и модули кода листов и книг представлены объектом VBCompo- nent. Каждый объект VВComponent соответствует одному из компонентов нижнего уровня в Project Explorer (Окне проекта). Для получения доступа к конкретному объекту VВComponent можно воспользоваться коллекцией VВComponents объекта VBProj ect. Таким образом, следующий код применяетс я для поиска объекта VВComponent, который представляет диалоговое окно UserForml в книге Bookl. xls: ::Oim ·coinp'orient As 'VBiPE ':'VB.Compo nenf: 1 '\ '" " . ' •.,, ••,. jset : t:мponent = . ' ·. .. . . .·. . ··. . . ' 11:>~ ..vvor ~bP<:J. te J:'. 13'?.0.Js:~ , _ J:C1e. ~~) , Y.В_!'.f'?j е_с; 1::, _.y_в~cч_rip_Qpent s .( "U s.§!.rJ?ormJ :',) . Имя объекта VBComponent, в котором хранится код книги, листа или диаграммы, доступно через свойство CodeName соответствующеrо объекта Excel (книги, листа или диаграммы). Таким образом, следующий код можно использовать для доступа к объекту VВComponent с кодом книги (код в этом объекте может реагировать на события книги): (ьrт· CO'ffiporie n t ,·д5· 'VВJ:i:н!:·:vвc om:Porient . [sE!ti c9_mponent = Workbook~ ( "Вookl : xls") ,.VВProject 1 NBComporient~ ( · _ К·< Workbooks("Bookl;xls") .CodeName) ·. i~~Я!3Р~. c2I!1!?'?Чerit.: !:I~I!1.~•."~., ···""·· : •. Для конкретного листа можно применять следующий код: Обратите внимание, что в окне проекта в качестве имени соответствующего книге объекта VВComponent используется ThisWorkbook. Не поддавайтесь соблазну приме­ нить это имя в собственном коде. Если пользователь выберет другой язык интерфейса Office, имя будет другим. Кроме этого, пользователь может изменить имя в редакторе VВЕ. По этой причине не применяйте следующий код: iJJim component · л~s--VEIDE. VBComporieiit Q' . ".. .,_ ., ' ' \.wi. th w0rkЬooks (."Вооk1. xls") ~, · Set component' = · . VВProj ect. vвcomponents ( "ThisworkЬook '' j J~~lfg <( .W:i~J;. .h ~:...: .~;м~~ .~ • "~·*"." ..х".._...; ....-ь.м;,-.. При разработке надстроек для VВЕ может потребоваться информация об объекте VВComponent, который редактируется пользователем · (выделенном в окне проекта). Ссылка на этот объект доступна в качестве значения свойства SelectedVВComponent объекта редактора VВЕ:
324 Глава 14 'bim component дБ vвш·Е:. vвcomponent • ?it~..9~9ffiP.9Il.<?!1J~ :О•• ~PP!i99tJ9I1. YJ3~ ..S~l_~ct.edYВ,CoП\POI1ent . . Каждый объект VВComponent предоставляет коллекцию Properties, содержимое ' которой примерно соответствует списку в окне Properties (Свойства) при выборе компо­ нента в окне Project Explorer (Окно проекта). Одним из свойств явл.яется свойство Name, использование которого показано в следующем коде: Puь}:i.'c' sиь sЪ.owNames о · ·,•. With Application. VBE . Selectecivвcomponent ~-· ·• . Debug. Print . Name & " & • Properties ( "Name") . End' .With . . 'J?);i~; .sчJ:>. . Для большинства ооъектов VВComponent текст свойств . Name и . Properties ( "Name") совпадает. Но в случае объектов VВComponent, которые хранят код книг, листов и диа­ грамм, свойство . Properties ( "Name") возвращает имя объекта Excel (листа, книги или диаграммы). Эту особенность можно использовать для поиска объектов Excel, соответст­ вующих редактируемым элементам в VВЕ или книге Excel, на которую указывает свойство ActiveVВProj ect. Соответствующий код показан далее в этой главе. Объект CodeModule Весь код VВА для объекта VВComponent хранится в объекте CodeModule. Этот объ­ ект позволяет программно читать, добавлять, модифицировать и удалять строки кода. Для каждого объекта VВComponent существует только один объект CodeModule. Каж­ дый тип VВComponent хранит объект CodeModule, но в следующих версиях это может меняться. Например, может быть создан инструмент для проектирования, выполнения и отладки запросов SQL, например Micгosoft Queгy , не содержащий собственного кода. Объект CodePane Данный объект предоставляет доступ к пользовательскому представлению содержи­ мого CodeModule. Через этот объект можно идентифицировать такие элементы, как ви­ димая на экране часть CodeModule и последний выделенный текст. Для идентификации редактируемого в Данный момент объекта CodePane можно воспользоваться свойством ActiveCodePane редактора VВЕ: iD:i.m~ ·ё()de.Pane'' A. s · VВIDE. 'cOCiei'ane- ·w -"W-f"""'' • - . . :$et cpdePane = Application. VBE . Activeco.dePane J1SЯ.~9~~-ode!?_iiI_lEi.:.T9pJ<iI1.~.. ~-· ··'',_,_,:, . Например, в результате работы предыдущего кода выделяется верхняя видимая стро­ ка из панели кода. Если прокрутить экран, верхней видимой строкой может оказаться 34-я строка модуля. Объект Designer Некоторые объекты VВComponent (например, диалоговые окна UserForm) предос­ тамяют разработчику как код, так и графическое представление. Доступ к коду обеспе­ чивается объектами CodeModule и . CodePane. Объект Designer предоставляет дос­ туп к графическому представлению объекта. В стандартных версиях Office диалоговые окна UserForm являются единственным компонентами с у~равляемым графическим
Настройка редактора VВЕ 325 представлением. Но в Developeг Edition предоставляется еще целый ряд объектов (например, Data Connection Designeг) с графическим представлением. Это объекты так­ же доступны через объект Des igner. В оставшейся части главы в основном будут использоваться перечисленные объекты, на основе которых будет создаваться надстройка VВЕ Toolkit. Начинаем В O:ffice 2003 разница между надстройкой книги и надстройкой СОМ невелика. И для ко­ да, и для UserForm предоставляется одинаковый уровень защиты (с сокрытием проекта от просмотра) . Основными преимуществ~ надстроек СОМ с точки зрения хранения инстру­ ментария является возможность сокрытия источника инструментария в пользовательском интерфейсе Ехсе!. Кроме этого, надстройки СОМ можно загружать через диалоговое окно Сервисс>Надстройки (Too!sc>Addins) (хотя активизация каждой надстройки немного замед­ ляет процесс загрузки Ехсе!). В этой главе термин "надстройка" используется для обозначения контейнера, содержащего инструментарий, который будет применяться в Ехсе! или VВЕ. На самом деле в процессе разработки надстройки файл имеет формат стандартной книги. В формат надстройки он будет преобразован только в конце процесса разработки. Вот базовая структура надстройки : О базовый модуль перехватывает открытие и закрытие надстройки; О специальный код добавляет пункты меню при открытии и удаляет пункты меню при закрытии; О модуль класса обрабатывает события Cl ick для пунктов меню; О наконец, основной код выполняет операции, связанные с пунктами меню. Для начала откройте новую книгу и удалите все листы, кроме Sheetl. Нажмите комби­ нацию клавиш <Alt+ Fl 1> для переключения в редактор VВЕ. Найдите книгу в окне Project Explorer (Окно проекта). Выберите VВProj ect. В окне Properties (Свойства) измените имя проекта на VВETools. Добавьте в проект новый модуль и назовите его Comrnon. Введите в мо­ дуль следующий код. Этот код будет запускаться при каждом открытии и закрытии книги. ; бp.ti0-n:· E:x:Plicit:- · щ • Option Compare техt Pub1ic .Const AddinID As String = "V BEToo1s" \PuЬlic Const Ti tle As String. = "VBE , Tools" i,Sub Auto.: _bpen () SetUpMenus · ,End Sub :sub Auto:__Close ( ) l~nd ~~~j'_:~Menus . Пр оц ед ур ы Auto_Open и Auto_ Close вьrзывают другие подпрограммы (эти под­ программы рассматриваются в следующем разделе), которые будут добавлять и удалять меню и пункты меню в редакторе VВЕ. Кроме Этого, опреде;;.яется глобальная константа, уникально идентифицирующая меню надстройки. Еще одна константа используется в ка­ честве стандартного заголовка надстройки в окнах сообщений.
326 Глава 14 Добавление пунктов меню в редакторе VBE В редакторе VВЕ используется тот же код панелей меню, что и в остальных компо­ нентах пакета Office, поэтому процедура добавления собственных пунктов меню в редак­ тор VВЕ практически ничем не отличается от примеров, которые будут показаны в главе 26. Но есть одно отличие, заключающееся в способе вызова подпрограммы при щелчке на пункте меню. При добавлении пунктов меню в Excel свойству OnAction объекта Corn- rnandBarButton присваивается имя запускаемой подпрограммы. В редакторе VBE объ­ екты CornrnandBarButton также обладают· свойством OnAction, но значение этого свойства игнорируется. Вместо этого комu:ания Microsoft добавила в объект CornrnandBarButton событие Click (и событие Change в объект CornrnandBarCornЬoBox). Для использования этих событий необходимо создать модуль класса, в котором с помощью ключевого слова Wi thEvents объявлена объектная переменная подходящего типа. Для того чтобы пере­ менную можно было использовать для обработки событий пунктов меню, добавьте в про­ ект модуль класса, назовите его CornrnandBarEventsClass и добавьте следующую реали­ зацию процедуры обработки coбытияCornrnandBarEvents_Click: ''Privi\te- wr tliEveni::s· co~an.~q.вa:r·E:veiits ·д,s~::cёmmand'вarвuПon iPrivatё Sub CoпunandВarEvents_Ciick (ByVal · CancelDe'fault As Boolean) · Оп Error Resume Next ' > Appiication. Run Ctrl. OI).Action ~ CancelDefault . = True t.~n9..• .§~]::>___, ,.• _, """· · · ·-· ·· .~ --- - "' Обратите особое вннмание на: - О объект CornrnandBarEvents, который используется для получения события Click от пунктов меню; О событие Click, создаваемое объектом CornrnandBarButtonEvents (это един­ ственное событие, которое предоставляется этим объектом); О объект Ctrl. (пункт меню или кнопка на панели инструментов), который переда- ется вместе с событием Click; · О код, запускающий подпрограмму, указанную в качестве значения свойстваОnАсtiоn. Этот код позволяет эмулировать поведение Excel при добавлении собственных пунк- тов меню. Вот пример кода, который объявляет ссылку на класс CornrnandBarEventsClass. После создания этого класса обработчик события AЬoutMe связывается с открытой пе­ ременной CornrnandBarEvents. 11я т:·E:venfs ·дs: · c·ьПunand.вar·:Ev-ёritscI~.s·.s , ..,.,:" ;puЫic.' Sub AddMenuO. .•./ . Dim AddiriBar As ·commandBar . Dim Button А$ CommandBO:rButton , -:;;.·: - -- :>' ,, --Х..· ...~ • -"/ . ry.''(· -- , вutton . caJt.i6:n ,;, ·; о м:У Addiri "· .J2~J;:t:on.,__тs.f;l · ·~~~ds±Jn "···-·""" "- -"""'"" '
·, ь se·t Events . CommandBarEvents tEnd t Sub ' Sub. AboutMe () . MsgBox "О себе" \J;ing ,Syb _ : Настройка редактора VВЕ 327 1 Для использования этого класса его необходимо связать с каждым добавленным объ- ектом CommandBarButton. Для этого воспользуйтесь показанным выше кодом, который можно добавить в новый стандартный модуль. При связывании обработчика события с объектом CommandBarButton обработчик события (переменная CommandBarEvents в классе CommandBarEventsClass) на самом деле связывается со свойством Tag объек­ та пункта меню. :oi)ti oiГ Ёхрf:ГсП: ·~"·~·· · ·Dim Events As · commandBarEventsClass AddМenu2() Dim Addini3ar As CommandBar . Dim Button As CommandBarButton · Set AddinBar = . Application.VВE.CommandBars.FindControl(ID:=30038) .CommandBar Set Button = AddinBar~Controls.Add(msoControlBut, ton) в'utton.Caption = " О Му Addin" Button.Tag = "MyAddin" Button .OnAction = "AboutMe" se.t Events = New · CommandBarEventsClass Set Eyepts.CommandBarEvents = Button . Set. Button = AddinBar.Controls;Add(msoControlButton) Button.Caption = "И о Му Addin" Button : тag = "MyAddin " BU.tton.OfiAction "AboutMeToo'" •Sub AЬoutMe () · MsgBo* "Обо· мне " , 'End suЪ J;.. ~•• ". fsub · Abou tм~тоо ( ) ., _. i) ,iij(, ..-;;~ ..~i Как показано в этом примере, с добавлением кнопки все кнопки с одинаковым значе­ нием свойств; Tag будут создавать событие Click в пределах одного экземпляра класса CommandBarEventsClass. Щелчки на обоих кнопках обрабатываются единственным объектом Events. Обратит е внимание, что предыдущий код не является частью над­ стройки Инструментария VВЕ, поэтому модуль стоит удалить.
328 Глава 14 Создаttие меню на основе таблиц Профессиональные разработчики приложений Excel редко добавляют собственные пункты меню по одному. Большинство разработчиков используют для этих целей таблич­ ный подход, при котором в таблицу заносится вся информация о пуНктах меню и подпро­ грамма генерирует их на основе этой информации. Ниже показано использование данного приема. Подход на основе таблиц предоставляет несколько преимуществ: О один и тот же код создания меню может использоваться в различных проектах; О намного проще добавить строки в таблицу, чем модифицировать код; О структуру мен~:> проще определить по содержИмому таблицы, чем по эквивалент­ ному коду . Сначала необходимо создать таблицу, :в которой будет храниться информация о ме­ ню. В Excel переименуйте лист вМеnuТаЫе и введите данные, показанные на рис. 14.2 . Рис. 14.2 . Описание структуры меню На листе MenuTaЬle присутствуют следующие столбцы: Столбец Название Описание А Арр / VBE "Арр" для добавления пунктов меню в Excel или "VBE" для до­ бавления пунктов меню в редактор VBE В CommaпdBar Имя панели инструм~нтов верхнего уровня, в которую будет до- бавлено меню . Далее показан список действительных имен и компонентов редактора VBE, которые можно указывать в этом столбце С Sub Control ID Идентификатор встроенного всплывающего меню, в которое до- бавляются пункты меню. Например, 30002 является идентифика­ тором меню Файл (File) О Туре Тип добавляемого элемента управления: 1 - нормальная. кноп­ ка, 10 - всплывающее меню и т.д . Значение этого поля соответ­ ствует значениям типов ms oContr ol, перечисленным в окне Object Browser (Просмотр объектов) - Е Captioп Текст пункта меню F Position Положение добавляемого пункта меню на панели инструментов. Оставьте это поле пустым для добавления пункта в конец панели инструментов G Begin Group True или False для указания разделителя перед пунктом м~н10
Столбец Название Н Builtln ID J к L Procedure FacelD ToolTip Popup1 - n Настройка редактора VВЕ 329 Описание При добавлении пункта во встроенное меню в этом поле указы­ вается идентификатор меню. Для пунктов собственных меню ис- пользуется идентификатор 1 ' Имя процедуры, которая вызывается при щелчке на пункте меню Идентификатор встроенной пиктограммы, используемой для обо­ значения пункта меню . Кроме этого, в качестве ·значения этого поля можно указывать имя изображения на листе, которое будет использоваться в качестве п и ктограммы на кнопке . На кнопке Создать (New) используется п и ктограмма с идентиф икатором 18 Текст всплывающей подс казки При добавлении собственны х всплывающих меню в этом поле ука­ зывается название меню, в которое будут добавляться собствен­ ные пункты. Использование этого параметра показано далее в· этой главе . Можно создавать всплывающие меню любой глубины вло­ женности . Для этого достаточно добавить столбец и код автомати­ чески обработает увеличение размерности исходных данных В следующей таблице представлены имена каждой панели инструментов верхнего уровня редактора VВЕ (эти имена можно использовать в столбце В таблнцы меню). Об­ ратите внимание , что Ex cel распознает эти имена вне зависимости от языка пользова­ тельского интерфейса Office ( за редкими исключениями, н апример, пр и использовании меню на голландском языке; в этом случае будет выдано сообщение об ошибке времени выполнения). Но к добавляемым пунктам это не относится. Единственным независимым от. языка способом поиска конкретного пункта меню является использование номера идентификатора. Подпрограмма для перечисления идентификаторов пунктов встроен­ ных меню рассматривается в главе 26. Имя Menu Ваг Standard Edit Debug UserForm MSForms MSForms Control Описание Стандартное меню VBE Стандартная панель инструментов VBE Панель инструментов редактирования, на которой содержатся по­ лезные инструменты редактирова ни я кода Панель отладочных инструмен тов Панель инструментов Us erForm, на которой содержатся и нструмен­ ты для редактирования диалого в ых окон Всплыв аю щее ме ню для ди ало говых окон User Form (отображается при щелчке пра во й кнопкой мыши н а фоне ди алогового окна UserForm) Всплывающее меню для нормального элемента управления на диа­ логовом о кне UserForm MSForms Control Group Всплывающее меню, которое ото бра жается при щелчке правой кноп ­ кой мыши на группе эле менто в упр авления в диалоговом окне Us erForm
330 Глава 14 Имя Описание MSForms МРС Всплывающее меню для элемента управления Mul tipage MSForms Palette Всплывающее меню, отображающееся при щелчке правой кнопкой мыши в окне Coпtrol Toolbox MSForms DragDrop Всп л ывающее меню, которое отображается при перетаскивании эле­ мента управления между вкладками. диалогового окна Coпtrol Toolbox или на диалоговое окно UserForm с помощью правой кнопки мыши Code Wiпdow Всплываю_щее меню для окна кода Code Wiпdow (Break) · Всплывающее меню для окна кода в режиме Break (отладка) Watch Wiпdow Всплывающее меню для окна Watch lmmediate Wiпdow Всплывающее меню для окна lmmed iate Locals Wiпdow Всплывающее меню для окна Locals Project Wiпdow Всплывающее меню для· окна Project Explorer Project Explorer (Break) Всплывающее меню для окна Project Explorer в режиме Break Object Browser Всплывающее меню для окна Object Browser Property Browser Всплывающее меню .для окна Properties Docked Wiпdow Всплывающее меню, которое отображается при щелчке правой кноп­ кой мыши на заголовке присоединенного окна Project Wiпdow lпsert Docum eпt Toggle Toolbox Toolbox Group Task Рапе Clipboard Eпvelope System Опliпе Meetiпg Всплывающее меню, позволяющее добавить в книгу новое диалого­ вое окно UserForm, модуль или класс Всплывающее меню, позволяющее со хранять книгу, импортировать файл или за пускать печать документа Всплывающее меню, позв?ляющее переключать состояние закладки или точки останова Всплывающее меню, позволяющее добавлять вкладку в окно инстру­ ментов, присоединять и отсоединять окно, а также скрывать окно ин­ струментов Всплывающее меню, предоставляющее возможность добавления , удаления и переименования вкладок в окнах инструментов, а также перемещения окон инструментов вверх и вниз Всплывающее меню для панели инструментов Всплывающее меню для буфера обмена Всплывающее меню для конверта Всплывающее системное меню, в котором предоставляется возмож­ ность сворачивания, разворачивания, перемещения, закрытия и из­ менения размера окна Всплывающее меню для интерактивного взаимодействия пользователей
Настройка редактора VВЕ 331 Так как на этот лист придется неоднократно ссылаться из кода, желательно присвоить ему подходящее имя, например MenuTaЬle . Для этого найдите и выделите лист в окне Project Explorer (Окно проекта) в редакторе VВЕ . Скорее всего, лист называется Sheetl (MenuTaЬle) . Измените имя листа в окне Properties (Свойства). Пос-!!е этого в окне Project Explorer (Окно проекта) лист будет называться MenuTaЬle (MenuTaЬle). Пе­ реименование позволяет ссылаться на л:Ист как на объект, что делает следующие две строки кода эквивалентными: !iJeЬug·.~PHnt. тh.iswork'Ьook: wo:!::кs~heets ("Меnuтаьiе ·'Y':'Jram~П ~ :l)_tj!bu9. ,:.,Print ме,чuтаы,е.J:i}э.те • .·. .. . . . '··-·~··.· Ниже показан код для создания меню из таблицы. Этот код необходимо скопировать в модуль SetupCommandBars. В начале модуля объявляется несколько констант, соответствующих столбцам в таб­ лице меню. Эти константы будут использоваться в пределах всего кода. При изменении структуры меню достаточно будет перенумеровать константы, что избавит от поиска по всему коду. :opHo n Бxь)ilcit - foption eornpaie Text ·, . rcorist TABLE_APP_VBE =;1 fconst - ТТАА. BBLLEE_-. ·cc- OoNММANTROLD_BAIRD_NAME . As . Jnteger = · -2 Юonst As · Integer ·= з·· :const -TABLE _ CONTROL _ TYPE As Integer =' ·.4 . ,Const TA"ВLE_CONTROL_CAPTION As I nteger =-· s 1Const TABLE_CONTROL_POSITION As Integer = 6 , const TABLE_CONTROL.:_GROUP AsInteg.er =.7i 1con~t т,AБLE_CONTROL_BUILTIN As Integer 8 , ' :c:i11st TABLE~CONTROL_PROC As Integer =·_9 .co n st TABLE~CONTROL~FACEID As Integer ~ 10 Cons .t TABLE_CONTROL _TOOLTIP " As Inte.ger·• = 11 J,Const ' тABЬE_POPUP_START As Integer = · 12 ft;Ji_щ 'Eyents J l.s . CoJ!1I!la.~dBar,gveflts~.1AiJiS. ·""""'"""''"""'"""" Как было показано выше, событие Click для всех панелей может направляться на единственный экземпляр обработчика событий. Для этого все объекты долж_ны иметь одно и то же значение свойства Tag. μ>ti:Ьiic ' sutГ:setupмenU.sTг;· · · ~-­ j · Dirn a!'-ange As Range · . 1 • Pim i terns As ComrnandBars Dim ltern As ComrnandBar . Dim .. control As ComrnandвarControl Dirn builtI·nid As Integer Pirn "column As Integer · · Dirn. data As Variant . Goto catch ' · RernoveMenus - ·
332 Глава 14 Подпрограмма для фактической настройки меню вызывается из процедуры Auto_Open: 11{ data(J .; ''-тABLE:APP:VвБ) ' ;;; ""WБ·" тheri · •W<"''' --~"" W"' . Set i tems App1icatiori. VВЕ. CommandBars ?Else · : set ' items ?J!:nd " If · ' f .... ~Set item ' ; " ,items:item(,data(1, TABLE_COMМANЬBAR_NAМE)) , Ц 1 item ·Is NOthing Then : Set item = items.. Add (name : ·=data ( 1, TABLE_COММANDBAR_NAМE) , temporai-:,r': =True) · · ;End If ·, Одна процедура может использоваться для добавления пунктов в меню Excel и VBE. Единственным отличием является выбор коллекции CornmandBars из Excel или коллек­ ции C9rnmandBars из VВЕ: :rf ?:N6t IsEmpty{da ta' (i' , .. TABLE _CONTROL- -ID) ) Then Set · item .= item.FindControl(ID:. =data(1, TABLE_CONТROL_TD)' Recui-sive: =True ). . tomma.ndBar \ :вnd If о ·,,,, . • "... •.>.\ •" . ' •.••.• •.··· ·····< .. ;~or column .=. TABLE _ POPUP _ START ·то UBouшJ(data; , 2) V 1f ·Not IsEmpty(data(l, . coluinn)) 'Гhen ;··' Set item = . item.coll't 'rols ("data(l, column)) .Comma-ndBцr End 1f . . :N,ext · bцilt'Inid data(l, TABLE _ CONTROL_BUILTIN) . .~ ;j:f bui1tinid = Ь (i:t: i'sEmpi:Y: (data ( 1; }::ABLE_CO,NTROL.c _POSITION) ) Or {" data (1, TABLE- -CONTROL_POSITION) ' > i tem. ContJ;"ols . Count . ... . • ··· ··•"';·. . ·; ·! - .., - ' 1··· Set, contr61" ~ '. item. Contr;{ s. Add (Туре: =:data ( 1, · ~ TABLE_CQNTROL_TYPE); ,, _ ·• ' · ID:~bui:J;trrird / , teinporary:=т:r;ueJ :'Eise .· ,. . .f..... •'• · Set c9ntrol;. = .i .t:em. Controls . Add (Туре: =:data ( 1 > ~~ ' TABLE_:CO,NTROL~TYPE) . . .. , ,.. ID; =builtinid,· temporary: ='True, ., befor.e .: =data (1, ;~ тABLE..:.coNTROL_POSI'ЦON)) :End ,.If .. . . . . ' ;~- {> -" . • [ё"on:trol ..CaptiC)n ·b/ da ta ( 1, TA,BLE,!,:CONTROL_CAPTIOtJ) ' q6ritr<;>1. BeginGrotip = da.ta ( 1, . TA BLE _: _CONT,ROL_GR,OUP) iq~ht;r9l , ')'<:j9lt;~pj:'3~25J:>c';Jj:.d.a!=.<:tJt, ' TAB,LE,_CQR':r:RЩ,~!Q9J:,TIP) Если элемент управления необходимо добавить во встроенное всплывающее меню, можно воспользоваться рекурсивным поиском в коллекции CornmandBars. Например, если необходимо добавить пункт в меню FormatqMake same size, идентификатор меню Make same size (32790) можно указать в столбце SubControlID таблицы: '~f .. 9Р) sEmp~y ,(da~·iц1 ·;< 'тl\:"BLE~dbNTROt-:J;iЛёБ:tbJ'T ;'Тhen' ., • . " '. < IsNo.iпie:tic (data'( 1 ;, . T AB LE,,.:.CONTROL_::FACEID)J ;, Then • • се,Т~" = ;;.at~(. , T~~LE"?~(~~RQ~~F~CEID[' , . :, $!;19'1?<?!>.\9i'JajJ ,; , ,TA,J3I,"E_;;,qp,N'Ji'R0f...;):A.S:Eip)J . CopyPictμr'e ·· ·
' End coritioi.I>astet'ace ' If fc ontrol.Tag = AddinID Настройка редактора VВЕ _333 ;control.OnAction = "'" & ThisWorkbook.name . & " ; А: datap. , TA_l3L~_CON:ГR9L_PR Qf) Можно использовать стандартную пиктограмму Office (указав числовое значение FaceID) или воспользоваться собственной пиктограммой. Для применения собственной пиктограммы в столбце FaceID в таблице меню укажите имя объекта Picture. Изобра­ жение должно иметь размеры 32 х 32 для маленькой пиктограммы и 64х 64 для большой пиктограммы: н Ъui.ftinfd ,; · г Alld data (i , ·~тABLE_APP::::.\fвE) 0 ~';;"'"'t•YJ3 If Events Is Nothing Then •·. · Set Events = New ComrnandBarEventsClass Set Events.ComrnandBarEvents = control ·, End If f End tEnd If ;Next iExit Sub ~Catch: If : мsgBox Err. Description t~!:i5l ..?чJ:?"' . (Если выдается сообщение об ошибке "Программный доступ к проекту Visual Basic не является доверенным", выберите в Excel пункт Сервисс::>Параметрыс::>Безопасность (Toolsc::>Optionsc::>Security), активизируйте вкладку Надежные издатели (Tгusted Pub- lisheп) и установите флажок Доверять доступ к Visual Basic Project (Trusted access to Visual Basic Projects).) Этот код создает обработчик событий меню. Обработчик создается один раз, так как он обрабатывает событи.Я Cl ick для всех кнопок. При закрытии надстройки необходимо запустить код, удаляющий пункты из меню ре­ дактора VВЕ. Некоторые разработчики используют вызов CommandBars. Reset, но в ре­ зультате будут удалены все модификации, а не только модификации, связанные с этой над­ стройкой. Более правильным явЛяется удаление только собственных пунктов меню и пане- 1лей. Для этого потребуются две подпрограммы. Первая удаляет пункты меню из конкрет­ ной коллекции CommandВars, выполняя поиск по значению свойства Tag: i:Pr:tva-t .e · sliь · R"emove-мenusF'roin:Вars (вY'va'Гi.teШs As "ёommariC@ars'Y"T;,···m"' · 1 · :Dim control As ComrnandВarControl . · · •·' •·. On Error Resul:ne Next · • Set control· = items.FindControl(Tag:=AddinID) , . . . ' .Do Unt.il control Is Nothing · control.Delete • ( Set control items ·. FindControl (Tag: =AddinID) [ Loop ·.~I);d J;uь
334 Глава 14 Вторая подпрограмма вызывает первую для удаления пунктов меню из панелей Excel и VВЕ. Кроме этого, вторая подпрограмма удаляет созданные панели и обработчики со­ бытий уровня модуля: ip'iJ.bfic Sub· Remo veMёnu s () - .. ·. Dim aCommandBar As CommandВar Dim aRange As Range Di~ name Ks String .Resumё Next · RemoveMenusFroroBars(Application.CommandBars) RemoveMenusFromBars(Application.VBE .CommandBars) Each aRange In .. MenuTaЬle. Cells ( 1 ). . Curre~tR~gion. Rows . ', , . ·.. I f aRange. row . > ·1 .·Then name = aRange.Cells(l, TABLE_COММANDBAR_NAМE) 1 Set acomrnandвar =·Nothing . . . If aRange.Cells(l, TABLE_APP~VEE) = "VВЕ" Then ~et aCommandBar Application.VВE.CommaridBars(name) Else · · acommandВar Not aCorщnandBar Is Nothing Then If Not aCommandBar.Builtrn .Then If aCommandBar.Controls.Count '~ . aC.omrnaцdBar. Delete End If End If End If N.ext Set Events !i;:ri4 ,?Ч.Р. ,.::с • - Nothing О Then На данный момент создан полный шаблон, который можно использовать в качестве основы для любой надстройки Excel и VВЕ (или · в качестве стандартной книги , позво­ ляющей модифицировать структуру меню). Добавим следующую процедуру и проверим работу надстройки. Соз~айте новый мо­ дуль MenuFi le и скопируйте в него следующий код. Дополнительные, связанные с фай­ лами, подпрограммы будут добавлены позднее: :РuЬНс suь FileNeWWorkЬQ9k -J · On Error Resumё Next Application. Workbooks .Add. Метод FileNewWorkbook просто создает пустую книгу и обновляет содержимое окна VВЕ. Обратите внимание, что при добавлении или удалении книг из кода окно VВЕ Project Explorer не всегда обновляется корректно . Самым простым способом обновления содержимого окна VВЕ является сокрытие и повторное отображение. Сначала убедитесь в правильной компиляции надстройки. Для этого выбери'I:е команду Debugc:>Compile (Отладка~::> Компиляция). Если в процессе компиляции были обнаруже-
Настройка редактора VВЕ 335 ны ошибки, сравните код с показанными выше листингами. Для запуска надстройки вы­ берите пункт Тools<=> Macros (Сервис<=> Макрос), выделите подпрограмму Auto_ Open и щелк­ ните на кнопке Run (Выполнить). В результате правильного выполнения кода в меню File (Файл) будет добавлен новый пункт и на панель инструментов VВЕ слева от пиктограммы Save (Сохранить) будет добавлена пиктограмма New (Создать) (рис. 14.3 и рис. 14.4). 1 [) ~ewWorkbook Q,j ~ave VBE.xls Ctrl+S , __________________ J ]mport File... · J;.xport File... ~ Bemove MenuFile... ~ P.rint... ---- . Qlose and Return to Microsoft Excel Ctrl+M Ctrl+E Ctrl+P Alt+Q ------·------------- Рис. 14.З. Новый пункт .меню Standard Рис. 14.4 . Новая юwпка При щелчке на кнопке в Excel создается новая книга и в окно Project Explorer (Окно Проекта) добавляется новый объект VВProj ect. Поздравляем, вы успешно модифици­ ровали VВЕ! Вывод встроенных диалоговых окон, диалоговых окон UserForm и окон сообщений В пакете Office 2003 предоставляется воз!-1ожность сохранения книги из VВЕ, но ра­ нее была добавлена возможность создания новой книги . Для полного набора файловых операций необходимо добавить подпрограммы для открытия и закрытия книг. Добавле­ ние списка последних открывавшихся книг остается читателю в качестве самостоятель­ ного упражнения. К завершению этой главы в VВЕ будет добавлена следующая ф)rнкциональность: . О создание новой книги; О открытие существующей книги; d сохранение книги (Эта возможность встроена в редактор VВЕ); О закрытие книги; О вывод диало"гового окна Properties (Свойства) со свойствами книги. Для подпрограммы Open добавляется один пункт в меню File (Файл) и одна кнопка на панель инструментов . Для подпрограммы Close добавляется еще один пункт в меню File (Файл) и во всплывающее меню Project Explorer (Окно проекта). В результате, щелкнув правой кнопкой мыши на окне Project Explorer (Окно проекта), можно будет закрыть объектVВРrоj e ct. На рис. 14.5 показаны необходимые дополнения к таблице меню .
336 Глава 14 ·} i~~~-E--~~~~uтB~a;·~-~-~-~1~·u·~--c~.~~~-·TYP..~1j~-~~~~~orkboOk ~P~-~itio~.~.e9in_~r_o~p_B~\!ti~ 1~~-1~;~~~~ok +~-~~-eщj~~eo~~i-~·r.e·w.-~rkbO~~~~P.!!P.1 .~--~1 .,.~..iYBE . Standard ..." . .~ 1 l~e~'!Yc1k~o.ok : 3 ·· 1e:crea\eanewwo1kbook _(.~.; G --~---1~-~ ·мёnu Ва~ . -..: ."_: · .- . . . .·.· -~ ~- .. . . . . .. .1ч~.9.P.~.i:i.~.~-~-~.o~-~--- ..? ·... ..1? i9P~i:i !.~!.~~·о.~.~-- · ·· - 5 NBE ········ "Si 3fid 3;d· 1:&..Open ~/orkbook 4 2З ;Ор~n а workb9ok , ·. . .~. .ДVВЕ ·Me"nUёа·, .. . .. D i:J2· )~Clos.e .&Workbook З. ;c19se _ihe ~rkbo9k co_ntaining the _а 7 jV8E .. . :.~-~~J.~.~.!..~~.d.o~. 1·Close t..Workbook . . .. . . ... . . 9.!.~. ~-~- !h.e _ ~~-~-~О~. ~~"-~ ~!.i:i.~~9..!~.~. .!! . ··в···1\13_Е:. . ._ме.n.~ Ва1 . i . · · · · · ······.·.~г. ····.J::;;;.~I;:~.-~-~~;-~_;.~~~-~. ·~.:~~~·ч···--. ~;~Р:~::: · i(~=YP1·~\~"~j_;;ej~~!?!'y. ···········~·~~U ~ Готоео Рис. 14.5 . Модифицированшzя таблица для создания интересующих пунктов меню Обратите внимание, что пункт меню C lose (Закрыть) не имеет стандартной пикто­ граммы, поэтому столбец FacelD не содержит значения. Так как позиция пункта меню не указана, он добавляется в конец всплывающего меню окна Project Explorer (Окно проекта). Для правильной эмуляции функциональности Excel необходимо проверить состоя­ ние клавиши <Shift> в момент щелчка на пункте меню. Если в момент щелчка она удер ­ живается, необходимо отключить обработку всех событий. Удерживание клавиши <Shift> при открытой книге приводит к удалению подпрограммы (дополнительную ин­ формацию можно найти в статье Micгosoft Knowledge Base Ql75223 по адресу h ttp: / /support . microsoft. com / support/kЬ/art i cles/Ql 75/ 2 / 23 . asp), но в Excel 2003 эта проблема уже решена. Лучшее, что можно сделать, это добавить клавишу <Ctrl> для достижения того же эффекта. Добавьте следующее объявление в начало моду­ ля Cornmon: Private' beclare ·Function- detAsyncKeystate i:.iЬ "usёrз2·;; ­ J::>:.."J:I3YY~:LJv:к""y;_h§~ Lgrig1 •.!}§ ....I .n t""ge.i:: ," '· Это объявление сообщает VВА о функции, доступной в Windows API. Дополнитель­ ная информация о вызове методов Windows API приводится в главе 16. Добавьте сле­ дующую функцию в конец модуля Cornmon: f'PuБ'ITc""f'unction bёt:sБTrfctriЛ1 t:л · д;, · iriteier ~ -Dim К:еуs As · Integer t const VK'SHIFT As Long = &Нlо k 'cons t vк::::соы'ГRОL ·As Lon:g = &нi1 i Const •VК_:_ALT ·А:~ Long = &Hi2 ~> ,• ' Проверить состояние клавиш <Ctrl> ; <Shift> и <Alt> R • . If GetAsyncKeyState(VK_SHIFT) <> о Then Keys Keys + 1 '! f GetAsyncKeyState(VK_CONТROL) <> о . Then Keys = Keys + If GetAsyncKeyS~ate(VK_ALT) <> о Then Кеу:;; = кеуs + 4 ,.. (;eJ:ShiftCtrlAl~ - , = кеуs ;E_rid.,..f\ч1ct:19P , ·,,,,;,,;)" · В подпрограмме Open используется метод Excel GetOpenFilename: который позволя­ ет найти имя файла и открыть файл. Если пользователь удерживает клавишу <Ctгl>, собы­ тия приложения будуг отключены, поэТО!d)' пользователь может открыть книгу, не запуская код в открывающейся книге или в собственной подпрограмме Excel WorkЬook_Open. Если пользователь не у.l(ерживает клавишу <Ctrl>, то делается попытка запустить все подпро­ граммы Auto_Open в предела:с книги:
Настройка редактора VВЕ 337 ,J?UЬHc=s:uъ "F'Ile6i:>eriвooкTГ t , Dim FileName As Variant ~ Dim IsControl KeyPressed As .Boolean о; Dim aWorkbook As WorkЬook Qn Error GoTo. Catch · 1 IsControlKeyPressed = (GetShi,ftCtrl Alt . And Appl i cation.VisiЫe = False FileName = Application . GetOpenFi l enarne Appl~ca.tion.Vis i ble = True Not (FileName = False) Then If' IsControlKeyPressed Then , Application.EnaЬleEvents = False Set aWorkbook ,; , Workbooks.Open(FileNai:ne: =FileName, UpdateLinks : = O, AddToMru:=True) Application.EnableEvent:з = True Else · · Set aWorkbook = Workbooks . Open(FileName:=FileName, . 'AddToMru : =True) , aWorkbook.Rup.AutoMacros xlAutoOpen End If EndIf Application.VBE.MainWi ndow.VisiЫe Appl i cation.VBE.MainWindow.VisiЫe <. Exit Sub :catch: ' · Application . VisiЫe = False • 'мsgBox Err, .Description, vbCri tica1 , Application. VisiЫe = True '1'д9" §tib Fa:lse True При каждом использовании диалого в ого окна , которое должно отображаться в преде­ лах окна Excel (включая встроенные диалоговые окна, диалоговые окна UserF orm и да­ же диалоговые окна функций MsgBox и InputBox) , Excel автоматически переключает собственное окно на отображение диалогового окна, Но при разработке приложений для редактора VВЕ диалоговое окно должно отображаться внутри окна VВЕ, а не в окне Excel. Самый простой способ получения такого эффекта - это сокрытие окна Excel перед ото ­ бражением собственного диалогового окна. б?u:ЬЬ.С· Function ·лc ti v e:Proj eci:.вook ( J A.s · · Dim proj ect ' As VBIDE .' vвProject Di.m component As VВIDE. VBComponent Dim name ·As Strin_g On Error GoTo Finally Application.VВE.ActiveVBProject . pro j ect.Protectiori = vbext_pp~locked T}fen name ;: ., project. F~leName If . InStrRev (name, "\") <> О Then name = Mi d(name, InStrRev(name, . " \:') + l) If IsWorkЬook(name) Then Set ActiveProjectBook = Workp9oks(nam~)
338 Глава 14 :ЕхП Funёtion · End If Ea.ch component In proj ect. VВComponents Гf component.Type = vbext_ct_Document Then name = component. Properties ( "Name") If IsWorkbook(name) Then If ·Workbooks(name) .VBProject Is project Then Set ActiveProjectBook = Workbooks(name) Exit Function End If End If End If Next .End If ~ [fFinally: . · Application. Visible = False MsgBox " .Книга · не найдена", vbExclamation Application.v'isiЫe = True 1J ; Подпрограмма Close оказывается следующим препятствием. Во всплывающее меню окна Project Explorer (Окно проекта) добавляется пункт Close Workbook (Закрыть кни­ гу), поэтому нужно определить, на каком пункте VBProject щелкнул пользователь. Свой­ ство ActiveVВProj ect редактора VВЕ содержит' интересующую информацию , но необ­ ходимо перейти от объекта VB Proj ect к книге , в которой содержится данный объект. Этот метод рассматривался в разделе "Идентификация объектов VВЕ в коде" в начале этой главы. Код этого метода показан ниже. Добавьте следующий код в модуль Common вместе с подпрограммойАutо_Ореn и завершающей функцией. Подпрограммы Auto_ Close, которые будут использоваться далее: ;Pu:ьr1e:~ F'U:ncfToii""rsworkьo6k:~(вyvaГБ6"oк "As ~ . . · On Eiror GoTo· Саtch . IsWorkbook ·:: Workbooks (Ьооk) .name · <> Exi t Function · Обратите внимание, что перед отображением сообщения об ошибке окно Excel скры­ вается и "открывается" после этого. Следующая процедура сравнивает результат с име­ нем книги: ~Ри~1~f~s~:~~-~~~ъ~:в~~~~ra-;;· Ч±m _isCtrlKeyJ?iess As . Boolean aWorkЬook ,= ·;д.cti veProj ectBo~k a\19 rkbt;>ok .Is Nbthing Then E x it t,:r:J~~YfE~8-!L~:;-~\(~tp.fi~1!:9J::i;_:l,~&.l.:11Bsl~21~ :':,,".i "",JC~;.....,..~•..."..w..~•""'w•"""""·""""'"""''"'"
, 'i$ctr1кe;Press тhen Application.EnaЫeEvents ,: aWorkbook.Close . Application .' EnaЬleEvents , ;;; E1se , , · ,, , ,, ,aWorkbook. RцnAutoMacros aworkbook.Close lf ' su1::> . , '[catch: .. , •Applic::ation. VisiЫe False 11sgBox Err.Description, vbCritical ~ ,, Application. VisiЫe = True. [J;;rl,O,} ~],l1:J ,,, , ·" "' ·""' ,~,,, ~h." ,"-..~·•-' ••. ~ .ы , ,' - ', ~ ..с.,•"= Настройка редактора VВЕ 339 Теперь, когда можно получить доступ к книге, соответствующей активному объекту VВProj ect, воспользуйтесь подпрограммой Close , которая добавляется в модуль MenuFi l e: ri?uь1rё -- siiь~ F1I1 ёвооkРТо"РБТГ~ -~--~ ·~~ .·~-& '":·-·~; k· . Dim aWorkЬookAs Workbook Р , . ' Dirn IsAddin As Boolean · Dim Isvisible As Boolean On . Error: Resume Next Set aWorkЬook = ActiveProjectBook If aWorkJ;Jook Is Nothing Then Exit Sub Application.VisiЫe = False .IsAddin = aWorkbook. IsAddin aWorkЬook.Is~ddin = False IsvisiЫe = aworkЬook. Windows ( 1) . VisiЫe 1: aWorkbook. Windows (1) . VisiЫe = True ' Application. Dialogs (xlDialogProperties). Show ~· ·" aWorkЬook. Windows (1) . VisiЫe IsVisiЫe • aWorkbook. IsAddin = IsAddin . · · {' , Application. VisiЫe = True @119~?..ll)?, , ,,- >-~-"'-"" Осталось определить еще один инструмент, связанный с книгой. Он будет использо­ ваться для отображения диалогового окна Свойства файла (File Properties) для книги активного проекта Visual Basic. Одним из основных применений свойств книги является предоставление информации в дналоговом окне Сервисс:::>Надстройки (Toolso::>Addins). В списке показан заголовок надстройки из диалогового окна Свойства (Propei-ties). Опи­ сание для выделенной надстройки извлекается из поЛяКомментарий (Comments). Для этого можно воспользоваться встроенным диалоговым окном Свойства (Properties) из Ехсе!, но при этом сложно определить, для какой книги отображать свойства - использу­ ется активная книга~ Следовательно, любая надстройка должна быть временно преобразо­ вана в нормальную книгу и отображаться, если книга скрыта. После отображения диалого­ вого окна Свойства (Properties) книгу необходимо преобразовать обратно в надстройку. Для проверки созданной надстройки запустите подпрограмму Auto_Open с помощью команды Сервисо::>Макросы (Toolso::>Macros). В результате выполнения подпрограммы будут созданы все интересующие пункты меню. После этого убедитесь, что все пункты работают правильно.
340 Глава 14 Обратите внимание, что попь1тка закрыть надстройку с помощью соответствующего 11ункта меню может привести к зависанию компьютера. Работа с кодом До этого момента рассматривались верхние уровни объектной модели Excel и среды разработки VВЕ (работа велась в пределах объектов VВProj ect и WorkЬook) для добавле­ ния типичных операций с файлами в среде Visual Basic. На данный момент появилась воз­ можность создания новых КН!fГ (а значит и проектов Vi.sual Basic), открытия существующих книг , изменения свойЕтв книг, а также сохранения и закрытия книг из интерфейса VВЕ. В этом разделе будут рассмотрены нижние уровни объектной модели VВЕ, а также ра­ бота с пользовательским кодом. В данном случае ограничимся определением редакти­ руемой строки (и даже определением выделенного символа в пределах эт~й строки), а также получением информации о процедуре, модуле и проекте, в которых хранится эта строка кода. Добавление и модификация кода будут рассматриваться в следующем разде­ ле вместе с созданием диалоговых окон UserForrn, добавлением кнопок и кода для обра­ ботки событий кнопок. Для демонстрации определения редактируемого кода щелчок правой кнопкой мыши позволит получить доступ к подпрограмме выдачи сообщения . Отдельные кнопки позво­ лят выводить текущий выделенный код, название текущей процедуры, модуля или про­ екта. Для начала добавьте в таблицу меню дополнительные строки (рис. 14.6 ). Рис. 14.6. Новые строки таблицы меню Обратите внимание, что собственное всплывающее меню добавляется во всплываю­ щее меню Code· Window (тип 10 соответствует собственному всплывающему меню), по­ сле чего в меню добавляются четыре пункта. Каждый пункт имеет собственный иденти­ фикатор пиктограммы. Результат показан на рис. 14.7. Код четырех подпрограмм будет храниться в собственном модуле, поэтому в проект необходимо добавить модуль MenuCode. К сожалению , объектная модель VВЕ не предоставляет метод Print ни для одного объекта. Существует три варианта реализации печати по щелчку правой кнопкой мыши. О Вывести диалоговое окно Печать (Print) редактора VВЕ и управлять им через функцию SendKeys.
Настройка редактора VВЕ 341 О Скопировать код в диапазон листа и распечатать диапазон. О Скопировать код в собственный экземпляр Word, выполнить форматирование для выделения ключевых слов Ехсеl ,и распечатать код средствами текстового процес­ сора Woгd. ·· ··· ·· ··1 1 .' i o n Ge:tA~yncKe:y: f--. . , -Pr-int______•... , 1 AJ ~elected Text ~1 l ist Propertie!i(Мet!:!ods :1"1frocedure _ Ei ~ Ll1t Constants :{Jtj ~ule •. ~~ Qcicklrio ~i .Proje<:t ~i Parameter Info ~t"J Comp!ete ~ord ~ Iooole ~~1 Qbject Browser () • le:e.n String 1 . ш ~ ~~~~;:::_____ ~::::ok. VBProjec 1Last Po5=it,cr: <Not known> " ~- . Description ~ t!Юе Рис. 14.7 . Всплывающее меню, создавае.мое в результате ра­ боты собственноzо кода Для сохранения простоты лучше реализовать первый вариант. Основная проблема заключается в механизме выбора переключателя Selected Text (Выде.Ленный текст), Module (Модуль), Проект. (Pгoject) средствами функции SendKeys. Особенно если учи­ тывать, что переключатель Выделенный текст (Selected Text) доступен только при на­ личии выделенного текста. Для решения этой проблемы необходимо определить, выделен ли текст, после чего отправить соответствующее количество нажатий клавиши <вниз> .для выбора переклю­ чателей Модуль (Module) или Проект (P1·o]ect). Есл'и есть уверенность, что пользователи всегда работают с интерфейсом на английском языке, можно было бы отправить нажатия комбинаций клавиш <Alt+M> или <Alt+J> - отправка нажатия клавиши <вниз> работает с любым языком интерфейса. Код для выбора переключателя Выделенный текст (Selected Text) является самым простым. В данном случае необходимо определить, существует ли выделение текста, и отправить некоторые нажатия клавиш в диалоговое окно Печать (Print). Option Explici t PuЬl"ic sub caae':Prinfsёl( J Dim StartLine As Long Dim StartColumn As Long Dim EndLine As Long Dim EndC9lμmn А~.. Long ,
342 Глава 14 '-'-~~··· ,.,,, . _ , ....•~ ····=·.• · A:pplication.VBE.ActivecodePane.GetSelection StartLine, · startcolumn, EndLine, EndColumn ·,If StartLine <> EpdLine Or StartColumn <> EndColuпm Then Application. SendKeys "{ENTER}" Applica.tion. VBE '. CoпunandBars. FindConi:rol (ID: =4). Execute . End If· . . . 'End,..91l!:?. "':. •.• ... '" •. .·, " Обратите внимание на следующие моменты: О для :идентификации редакпrруемого модуля используется свойство ActiveCodePane редактора VВЕ; О в метод GetSelection переменные передаются по ссылке и там им присваивают­ ся значения. После вызова метода GetSelection переменные содержат номера первой и последней строки и первого и последнего столбца выделенного текста; О в буфер клавиатуры отправляется нажатие клавиши <Entei->. После этого отобра­ жается диалоговое окно Печать (Pгint) редактора VВЕ. Для этого непосредственно выбирается меню Файл9Печать (File9Pгint) (ID=4). Метод непосредственного в:Ь1бора пунктов меню в комбинации с методом RunМenu рассматривается в главе 17. МетоД RunМenu показан ниже. По умолчанию (при выделении текста) в диалого­ вом окне Печать (P1·int) редактора VВЕ выделен переключатель Выделенный текст (Selected Text). В таком случае изменение параметров окна не требуется: PuЬ!icГsuЬ cociё'l?rint:мocf(Г • Dim StartLine As . Long . l Dim StartColumn As Long oim EndLine As Lorig · Dim EndColumd Af> Long . ApplicatioI)..VBE .ActivecodePane .GetSelection ' st.a:rtLine, StartColumn, EndLine, EndColuпm · · StartLine <> ' EndLine or ' Star\::Column <> EndColumil Application;SendKeys "{DOWN}{ENTER}" Else · · . Appf:i,ca tion. SendKeys " {'ENTER} " End If (PuЫ·ic Sub C~dePrin.tJ.>roj() t StartLine As.. Long . StartColumn ·As Long Endtine As t.ong EndColumn As LoЪg \ AP,plicati6n; V!'JE. cotnmandВars. Findcontrol ( ID t~ns!:. §.~~).)"~-~...~~ -~;~!!...~=- 't. , } ~ ·-< ··:~.--~~.:.:i... ~ _, ~·- .
Настройка редактора VВЕ 343 Для печати текущего модуля и проекта можно использовать очень похожий код. Единственным отличием является необходимость проверки, выделил ли пользователь текст (если это так, в диалоговом окне Печать (PI"int) будет выбран переключатель Выделенный ·текст (Selected Text), и отправить необходимое количество нажатий кла­ виши <вниз> для выбора подходящего переключателя. Обе подпрограммы можно доба­ вить в модуль MenuCode: Код для печати текущей процедуры будет выглядеть .более сложным, так как в окне Печать (P1·int) отсутствует переключатель Текущая процедура (CшI"ent PI"ocedшe) . Придется выполнить следующие операции : О идентифицировать :q сохранить текущее выделение; О идентифицировать процедуру (или строки объявления), содержащую текущее вы- деление; О расширить выделение до полного текста процедуры (или всех строк объявления); О отобразить диалоговое окно Печать (Pi·int) для печати выделенного текста; О восстановить начальное выделение. Выполнение этой последовательности операций на некоторых компьютерах иногда приводит к интересной проблеме - последнее действие по восстановлению выделения выполняется еще до отображения диалогового окна Печать (Pгint) . Одной из причин та-
344 Глава 14 кого поведения является асинхронная печать. Самое простое решение - это добавление оператора DoEvents непосредственно после оператора отображения диалогового окна Печать (Pгint). Это позволит подпрограмме печати выполнить поставленную перед ней задачу. Кроме этого, операционной системе передается управление для обработки собы- тий, находящихся в очереди . · Обратите внимание, что метод ProcOfLine принимает в качестве параметра первую строку, присваивает значение переменной ProcedureType для идентификации типа процедуры (SuЬ, Function, Property Let, Property Get или Property Set) и воз­ врашает имя процедуры. Тип и имя процедуры используются для поиска начала процедуры (с использованием значения ProcStartLine) и количества строк в ней (ProcCountLines ). После этого строки процедуры выделяются и отправляются на печать. Работа с диалоговыми окнами UserForm Показанные здесь примеры кода использовались для расширения возможностей VВЕ и предоставления дополнительных инструментов разработчику. В этом разделе основное внимание уделяется программному созданию и управлению диалоговыми oкнaмиUserForrn, а также добавлению элементов управления и управляющих процедур в модуль кода диалогово­ го окна UserForrn. Хотя в показанных здесь примерах расширяется функциональность \твЕ, этот же код и приемы могут применяться для пользовательских приложений, включая: О добавление диалоговых окон UserForm в созданные приложением книги; О изменение размера диалоговых окон UserForrn и элементов управления, а также перемещение элементов управления для максимального использования доступно­ го экранного пространства; О добавление кода для обработки событий созданных приложением диалоговых окон UserForm; О изменение элементов управления на существующих диалоговых окнах UserForm в ответ на пользовательский ввод; О создание диалоговых окон UserForm в процессе работы приложения по мере не­ обходимости (например, когда количество и тип элементов управления на диало­ говом окне UserForm значительно отличаются друг от друга в зависимости от природы отображаемых данных). Показанная выше методика реализована в виде кода для добавления диалогового окна UserForm в активный проект. В окне присутствуют стандартные кнопки ОК и Отмена (Cancel). Кроме этого, существуют подпрограммы для обработки событий Click для кнопок и события QueryClose для диалогового окна UserForm. Размер диалогового ок­ на UserForm установлен на уровне 2/3 ширины и высоты окна 'Excel. Положение кно­ пок ОК и Отмена (Cancel) меняется в соответствии с размерами диалогового окна. В показанном здесь примере используется сложный способ получения интересующего резул~тата. Данный пример, в основном, имеет образовательную, а не практическую ценность . Более простым способом было бы создание диалогового окна вручную с сохра­ нением его на диске в файле . frm. Следующий код позволяет импортировать диалоговое окно из файла (не вводите этот код):
Настройка редактора VВЕ 345 15Im 'com'PJ3П"ent "'A.s ":VВcomi5oiieiiC. .. .. . . ·s et ' cornpon~nt ·=)ч5plicat i on.VBE.A ctiveVBProject . ..· . ,\l:§C::9rni?2цe11t;:~ s , ~!!1POi·;!:_ J.':!':!:vfor_I11,,. tblll.'!J.• ·-~ , .. Диалоговое окно легко можно будет включить в другой проект. Единственным пре­ имуществом создания окна с помощью кода является изменение размера и положения в со­ ответствии с разрешением и размером пользовательского экрана. Начните с добавления еще одной строки в таблицу меню (рис. 14.8). ···~ .......... ·t·t ''''' '' ' ''' i. .. .....)~ .. .. ... . ··..i. )~ ~-~-~ ~~i-~-~~-~~-· .·. · ....~=.. ... :.............1:.Gc;ideF:' rin!P1_0J . . .Standard : 1 2: 1:FormNewUse1F i·;~~~:.•~:~:\~~J~~;.:.:.:::~::::...:,:,.;;;:.::.:~::.~<:~:l.:::~;:.:.::.::.:_:_::::.:..:_::;:__~_;~:.....;:y..::..:_:_,___~.,..i~·;;=>··:;i;·~~:-::::;...~;~iz::J·:::= Готоео Рис. 14.8. Запись в таблице меню длл создания диалогового оюtа Посzле добавления строк в таблицу меню на панели Стандартная (Standard) появится следующийэлементуправления (рис. 14.9). · . : 1· ~:::::F~m ~ Module ~ (;lass Мodule }k1. erccedш е .. . Рис.14.9. Модифицироваюшя птшль инструментов Стан· дартная (StanШird) Добавьте новый модуль MenuForm и скопируйте в него следующий код: :oi)Eion"' .E:X.P:L:l.C'П '"' ,Option Compare Text ;!?rivate Declare Function LockWindowUpdate Lib "usei:-з2 " с~ (B:tY~J J:i~_(J,З:,,,()(;,l< • !l::l?,_, ;i::.9!1Q.) '" ~~s , ~ОI1Я . _ ,~~·-· "··=- • . =ilд .• " Значение свойства Application . ScreenUpdating не влияет на редактор VВЕ. В результате работьl FormNewUserform можно наблюдать изменение размера диалого­ вого окна и добавление элементов управления. Для фиксации окна VВЕ в начале проце­ дуры и освобождения в конце можно воспользоваться простым вызовом Windows API. Дополнительная информация об использовании этой и других функций Windows API приводИ:тся в главе 16:
346 Глава 14 ;ru.ьi:i.c "si..iБ' FЬ'firii'.fёwus'efF'ё:>:i::mTJ . 1 .Dim co.mponent As ,VВIDE. VBComponent '· Dim DesignForm .As UserForrri . ·· Line· ~ As Long. 1 · .;.:. • вh.tton . As corrirhandBarвu t ton Popup As coffimanciвarPopup ,·. . _ _,_" ·-., . ·1 .· . . ,'. _,.• В рекомендациях по проектированию интерфейса компания MicI"osoft советует раз­ мещать кнопки не ближе, чем 6 пунктов (1пункт - 1 /72 дюйма) друг от друга и от края диалоговогq окна. Jp;'i '.:Eg_Щ:,_Q9J:8.,.~l;!;h ·.. • Это самая сложная подпрограмма в пределах всей надстройки, поэтому в нее будет добавлен код для обработки ошибок. Похожий код обработки ошибок должен присутст­ вовать в каждой подпрограмме: r~~q~~w~Bfi§~U~S!i?-~t~ ~Pii!J~:~1:J.9&YБ~:.й<:iJ.~}[J;ngq}:,i~!:\.~i;1 ;. - . .·{ .. Для фиксации окна редактора VВЕ используется вызов Windows API. Обратите вни­ мание, что Hwnd является скрытым свойством объекта MainWindow. Для отображения скрытых свойств объекта откройте окно Object Browser (Просмотр объектов), щелкните на окне правой кнопкой мыши и щелкните на пункте Show Hidden Members (Отображать скрытые компоненты). 1set" com:f>O'П'ё!'lt"",,; A.pp-1TEaГion:vвE: ~ :Act IV'evвf>roiec·t-:-vвcomponents.Acla( ' · vbext_ct_}1SForm}, ·. ; · · ''·· ; · - ,,. .. <com:i;'юneht. Pr.operties'( " idth") · .~ Application. UsaЫ. eWidth *' 2 / 3 fs;ol)ipO!l;~nt', Prop~:ч:JJ~,s~( . ЯJ:it.;:'E'':' ~Appl?,c.~J:4S>Jl. :us~l.~Jje.i,я)l.t" *"2,"J.vc.~'-"'"'"'''"'' Объект VВComponent (в коде обозначается как component) предоставляет основу (фон) диалогового окна UserForm, коллекцию Properties и объект CodeModule. При добавлеf!ИИ в проект нового диалогового окна UserForm в качестве результата возвра­ щается объект VВComponent, содержащий диалоговое окно. Коллекция Properties объекта VBComponent может использоваться для изменения размера окна (рис. 14.10) и других свойств, например цвета, шрифта и надписей на фоне. . Рш:. 14.1 О. Изменение размеров диалогового 01СНа
Настройка редактора VВЕ 347 , . Caption = "cancel" . Cancel = True· .Height. = 18 .Width-'= 54 W~Ф"... _",. Объект Designer объекта VВComponent предоставляет доступ к содержимому диа­ логового окна UserForm и отвечает за область внутри границ диалогового окна и под строкой заголовка. Следующий код добавляет два элемента управлен:Ия в пустое диалого­ вое окно UserForm. Это кнопки ОК и Отмена (Cancel). Для определения имени элемен­ та управления (в данном случае это Forms.CommandButton.l) можно добавить эле­ мент управления из окна Элементы управления (Conaol Тоо!Ьох) и просмотреть ре­ зультат функции =EMB ED. rwrth~ёonEroE:( "oквU:t'ton 1·-г · ·-·,·;·~-·····у··· ~ ; тор = DesignForm. InsideHeig.ht . Height - Gap ~ .· ·:Left = DesignForm. Ins.ideWidth - . Width. 2 - Gap*2 ,End With . ~With . Coni:rols ( "CancelBut ton " ) . Тор =· DesignForm. Ins ideHeight - .Left ~ · DesignerForm.InsideWidth 'Бnd With [Ео9 J:'~AJJ:l __ ,, $ ··'· · _ .Height - Gap - .Width - Gap ., ч Данную методику можно расширить на добавление списков, меток, флажков и других элементов управления. С этого момента можно работать с существующим диалоговым окном UserForm, менять его разме р и положени е, а также размер и положение элемен­ тов управления для максимального использования доступного разрешения экрана. Пре­ дыдущий код просто перемещает кнопки ОК и Отмена (Cancel) в нижний правый угол диалогового окна без изменения его размера. Этот прием используется для перемещения и изменения размера всех элеменТ<?В управления UsеrF оrm. Теперь, когда кнопки диалогового окна UserForm расположены в интересующих по­ зициях, в модуль кода д~алогового окна UserForm можно добавить код, который будет обрабатывать события кнопок и диалогового окна. В э;-ом примере код добавляется из строковых констант. В другой ситуации код может храниться в отдельном текстовом файле и импортироваться в модуль UserForm: · ~.Кild.f~omstring "sji.ь Oквui:ton:.:.cЦck ( В данном случае добавляется код для обработки события Click для кнопок ОК и Отмена (Cancel). Для создания подпрограммы может использоваться следующий код: ,w:tth ё6mi56nerit. c'ocleмod.U.1e - (·Line=· . CreateEventProc ( "Click", "OKButton") . InsertLines Line , "'Ст а ндартный обработ ч ик кнопки ОК" k.• - ,R,§plas: ~Цne . ~i.ne. :+- . . 2, " _I!\POJS Tr ue" . & vbCrLf _& _ " M~ .Hide"
348 Глава 14 У"'····,.; . A ddFrornString vbCrLf & "'Стандартный обработ,,,:ик кнопки Отмена" & vbCrLf d "Private Sub CancelButton_ Cli.ck ()" & . vbCrLf & " inЬOK = False & vbCrLf & " Me.Hide" & vbCrLf & "End Sub:~ Но если используется подпрограмма CreateEventProc , все параметры Процедуры заполняются автоматически . Оба способа отличаются незначительно. Обратите внима­ ние, что процедура CreateEventProc добавляет строку 'Private Sub ... ' , строку ' End Sub' и пробел между ними. Не вводите этот фрагмент кода в надстройку . i? i i va te s i.iь 6i<Вu'Eiori::._ciiC:k: о .~nd Sub Подпрограмма CreateEventProc возвращ ает количес;:тво строк модуля, в который была вставлена строка ' Private Sub'. Это количество используется для вставки стро­ ки комментария и замены пустой строки кодом: · t:tiщ = . cI :- ea fe БV:ent: i?Гo c( ~' Quer yclose;•; ·"userForm" г .Inse.rtLines Line; ";Стандартный обработчик события Close," . InsertLines Line, . " ' ']'jосnринимать · как · обработчик кнопки Отмена" . ReplaceLine Line + 2.: "· CancelButton_Click.'; . CodePane . Window.Close End With . . LockWindowiJpdate О& .Exit Sub · .· · Код обработки события QueryClose для диалогового окна UserForrn выглядит как обработчик кнопки Отмена (Cancel), поэтому код обработчика просто вызывает подпро­ грамму CancelButton_Click: :ca.t:eii ~ LockWinqowUpdate . O& Application.VisiЫe . ёё · False .·. MsgBox Err.Description, vbExclamatio:ri Application. yisiЫe ~ True 'End Sub. · • Стандартный обработчик ошибок отключает блокировку окна, выводит сообщение об ошибке и закрывает окно. Такая обработка ошибок должна присутствовать во всех под­ прогр аммах надстройки . На этом создание надстройки можно считать завершенным. Переключитесь обратно в Excel и сохраните книгу как надстройку (надстройка находится в конце списка доступ­ ных типов файлов) с расширением . xla. После этого воспользуйтесь командой СервисqНадстройки (ToolsqAddins) для установки надстройки. Работа со ссылками Одним из значительных улучшений в последней версии VBA является возможность объявления ссылки на внешнюю объектную библиотеку (с использованием диалогового окна ToolsqReferences (СервисqСсылки)). После этого определенные в библиотеке
Настройка редактора VВЕ 349 объекты можно применять как встроенные объекты Excel. Например, в этой главе ис­ пользуются объекты библиотеки VBA Extensibility. Для такого подхода существует термин "раннее связывание". Это значит, что внешняя объектная библиотека связывается с приложением .на этапе проектирования. Раннее свя­ зывание предоставляет ряд преимушеств: о код работает значительно быстрее, так как связи между библиотеками проверены и откомпилированы; О оператор New может использоваться для создания ссылок на внешние объекты; О можно применять все константы, определенные в объектной библиотеке, а зна­ чит, есть возможность не использовать "магические числа" в собственном коде; О при разработке приложения Excel выводит подсказки Auto List Members, Auto Quick lnfo и Auto Data T ips в процессе разработки приложения. Более подробно эта тема рассматривается в главе 16. Но у раннего связывания есть небольшой недостаток. При попытке запуска приложе­ ния на компьютере, где не установлена объектная библиотека, на этапе компиляции бу­ дет выдана ошибка, которую невозможно перехватить стандартными методами обработ­ ки ошибок - обычно в результате перехвата в качестве ошибочной идентифицируется вполне нормальная строка. Excel выдаст сообщение об ошибке при запуске кода из моду­ ля, который содержит: О не определенную переменную (если в начале модуля не указан оператор Option Explicit); О объявление типа определено в отсутствующей объектной библиотеке; о константа определена в отсутствующей объектной библиотеке; О вызов подпрограммы, объекта, метода или свойства, определенных в отсутствую­ щей объектной библиотеке. Коллекция References объекта VВЕ предоставляет метод проверки правильности ссылок приложения , а также проверки наличия всех необходимых объектных библиотек и правильности версий библиотек. Проверяющий код должен быть добавлен в подпро­ грамму Auto_ Open, а содержащий подпрограмму Auto_Open модуль не должен содер­ жать код, в котором используются внешние объектные библиотеки. Если в приложении присутствует некорректная ссылка, код вообще не будет работать и подпрограмма оста­ новит выполнение после отображ~ния списка некорректных ссылок. Вот типичный код подпрограммы Aut o_Open: 1i>uьiic=·s\l.ь 'Auto_open ( J · · Dim о As Object ' · Dim IsBroken As Boolean t·"· Dii:n Description As . String For Басh о Iri_ThisWorkbook.VВProject . References if o.IsBroken Then Оп Error Resume Next Description :,, · "<Not known>" Descriptiori · = o.Description On Error GoTo О ·
350 Глава 14 -··-имя ? : •г'"'БГbesёrrJ?.ti:On: ··s;:-v-ьcГ:Lfш & '":::: Путь: " ' & о, Ful·lPath & ~bCrLf & : "Пожалуйста riереустан:овите файл. ·• Резюме Объектная библиотека Miciosoft Visua1 Basic fol' Applications Extensibility 5.3 предо­ ставляет богатый набор объектов, свойств, методов и событий для управления самим ре­ дактором VВЕ. Использование этих объектов позволяет разработчикам создавать. над­ стройки для упрощения собственной деятельности. Многие приложения конечных пользователей также могут применять эти объекты для управления модулями кода, диалоговыми окнами UserFoпn и ссылками, что способ­ ствует повышению гибкости и эффективности.
Взаимодействие с другими приложениями Office Все приложения Office (Excel, Word, PoweгPoint, Outlook, Access , PuЫisher , Soшce­ Safe и FrontPage) используют один и тот же язык VВА. Поняв синтаксис этого языка в Exce l , его ' можно применять во всех других приложениях . Различия ме.жду пр~ложе­ ниями заключаются в объектной модели . Одной из приятных особенностей языка VВА является возможность предоставления объ­ ектов одного приложени.Я другим приложениям. При этом взаимодействие приложений можно программировать из любого приложения. Например, для работы с объектами Wo1·d из Exce l необходимо установить подключение к Word. После этого можно использовать объектьr текстового процессора, как при программировании на VВА в самом приложении Wщ·d . В этой главе рассматриваются различные способы создания связей и показаны не­ сколько при~rеров программирования других приложений Miпosoft . Во всех случаях код написан на языке Exce l VBA, но код может быть модифицирован для использования в любом из приложений Office . Кроме того, такой код можно применять для приложе ­ ний, поддерживающих язык VВА за пределами Office. Это могут быть другие продук ты компании Microsoft, например Visual Basic и SQL Sегvег. Кроме этого, растет список про­ дуктов сторонних разработчиков, поддерживающих подобное программирование . В конце этой главы будут рассмотрены макровирусы. В этой главе ~rn подробного описания объектов, методов и свойств других приложений Office, для 1шторъ~х написаны при.меръ~. В даином случае интерес вызывает толъко ус­ тановка подклwчеиия 'К приложениям, а не изучеиие их объектной модели. Объектнъ~е модели этих приложений рассматриваются в других книгах издателъства Wrox из се­ рии Office 2000, например: Wo1·d 2000 VВА Pгogгammeг's Refe1·ence Данкана Маккен-
352 Глава 15 зи (Duncan MacKe;izie) (ISBN: 1-861002 -55 -6) и Outlook 2000 VBA Progra mmer ' s Reference Дуэй1iа ГиффоjJда (Dwayne Gifford) (ISBN: 1-861002-53-Х) . Кроме этого, из­ дателъсrпво Wrox Press опубли'Ковало подроб1iое ру'Ководсrпво для 1iа'Чи1iающих по про­ граммированию на Access VВА, вместе с 'КоrпоjJым поставляется 'Компа-кrп-диС'К: Beginning Access 2000 VBA Роба Смита (Rob Srnit!i) и Дейва Сассмта (Dave Sиssrnan) (ISBN: 0-7645-4383-0). Установка подключения После установки подключения к приложению Office объекты приложения предостав­ ляются для автома~:_изации через библиотеку типов . Существует два способа установки такого подклю<'rения : позд1iее связыва1iие (late binding) и ранее связывание (early binding). В любом случае подключение устанавливается через создание объектной переменной, ссылающейся на интер е сующее приложение или конкретный объект в пределах инте ре­ сующего приложения . После этого свойства и методы интересующего объекта можно ис­ пользовать через объектную переменную. При позднем связывании объект, ссылающийся на приложение O ffice, создается пе­ ред созданием ссылки на библиотеку типов приложения Office. В ранних версиях при ­ ложений Office позднее связывание было обязательным и сейчас оно продолжает ис­ пользоваться , так как обладает определенными преимуществами по сравнению с ранним связыванием. Одним из преимуществ является возможность создания кода, определяю­ щего наличие или отсутствие необходимой библиотеки типов на компьютере, а также создающего связи с разными версиями приложений в зависимости от принятых решений в процессе выполнения кода . Недостаток позднего связывания - недоступность библиотеки типов интересующего приложения в процессе написания кода. Таким образом , отсутствует справочная инфор­ мация о приложении, недоступны встроенные константы приложения , а ссылки на ин­ тересующее приложение не всегда действительны в процессе компиляции, так как их правильность невозможно проверить. Связи Полностью проверяются только в процессе выполнения кода , а это требует определенных затрат времени, при этом на этапе про ­ верки могут возникнуть ошибки , которые приведут к аварийному завершению работы приложения. Раннее связывание поддерживается всеми версиями приложений Office начиная с Of- fice 97. Использующий раннее связывание код работает быстрее , чем код на основе позд­ него связывания, так как библиотека типов интересующего приложения доступна в про­ цессе написания кода. Таким образом , проверка синтаксиса и типов, а также связывание с библиотекой выполняются еще до запуска кода. При использовании раннего связывания код писать намного проще, так как в окне Object Browser (Просмотр объектов) вИ:дны объекты, методы и свойства интересующего приложения, а в окне кода будут отображаться автоматические подсказки, например спи­ сок свойств и методов после ввода ссылки на объект . Кроме этого, при раннем связыва­ нии можно пользоваться встроеf!НЫМИ константами интересующего приложения. Позднее связывание . Следующий код создает запись в календаре Outlook. В данном случае используется позднее связывание:
Взаимодействие с другими приложениями Office 353 ~РuЬП с'.' sU.J':Гмakliot.i.t.16okд:PP.olnEment: CJ ··· · Dim Outlook As Obj ect · · Dim Appointmept As Qbject <:;onst Item = f;· ·1, Set Out10ok .= Cr ea te Qbj ec t( J ' O~tlook.Ap t/~, ,"_" Зe :t(, Appoilltrri~дt · ~ · Outl'бok. vCreateitern(:tt .€ ' >~> -~>. ~,_-:.:}· <> . ."::.~>_:": > ~:, ·;~ ;{". -~ '. '' , -. ' ,._:_~ . ":(:' ApJ?Ointment ;Subj ect ' Appoiritment. $tart = ·~ Times'erial -( 9; JO / ·о) · /., , ~':'у .·_·; ~.·. °'.,·~ / ' :: '.::;',А '',' ' , . • -~~ AJ?pointment.End. = DateSerial(2003, 12, .~ тi!neseri'ai (i1, з о:, о J •· . . . : f; ;, Appoi'ntment, RemindeГPlaysoU:nd' = 'i'rue AJ?J?bintment.save '·" · Outlook~Quit SetOutiOok . =Nothing ;End Sub .., ··.•· ••.•· . . • ." ••• ,·,,~: ••.;, ,"«, . .<.-.~' -'·-'·:·:~*"'''~';_:;,·; ·~-- •~•·: :>. :;с-,0:•,-·,А '( . .::<~ ~:"-,~'-.~-""'~.W.1-: ... В основе метода программного управления другим приложением лежит создание объ­ ектной переменной, которая ссылается на интересующее приложение. В этом случае для удобства объектная переменная называется Outlook. После этого переменная Out l ook используется для обращения к объектам в объектной модели внешнего приложения (как объ.ект Application в Excel). В данном случае метод Createltem объекта Outlook Application используется для создания oбъeктaAppointmentitem. Так как встроенные константы Outlook недоступны при позднем связывании, при­ дется определить собственные константы, например Appointmentitem, или переда­ вать в качестве параметров их значения. Обратите внимание, что время было определе­ но через функции DateSerial и TimeSerial, что позволяет избежать проблем, свя­ занных с интернационализацией приложений. Дополнительная информация приводит­ ся в главе 17. Объявлением объектов Outlook и Appointment объектами универсального типа Obj ect разработчик заставляет интерпретатор VВА использовать позднее связывание. Интерпретатор VВА не может построить все связи с Outlook, пока не завершится выпол- нение функции CreateObject. ~ Аргумент функции CreateObj ect определяет имя приложения и класс создаваемого объекта. Outlook- это имя приложения, aApp l ication- класс. Многие приложения дают возможность создавать объекты на разных уровнях объектной модели. Например, Ехсе! позволяет создавать объекты Worksheet и Chart из других приложений. Для это­ го в качестве аргумента функции Cr.ea teObj ect необходимо указать Excel. Worksheet или Excel . Chart. Желательно закрывать внешнее приложение после завершения интересующих опе ­ раций и присваивать объектной переменной значение Nothing. При этом освобождает­ ся память, выделенная для связи и приложения . Если запустить этот макрос, в Excel вообще ничего не произойдет. Но если запустить Out- look, то в календаре можно обнаружить добавленную запись о встрече 31 декабря (рис. 5.1).
354 Глава 15 12з'4567 89tO11121311 15161718192021 22232125262728 29 30!31 ~~@*~' nв~....~.nсв 12з1 567691011 12131115161718 19 20 2122zз2125 26212029зоз1 r lf.'-м..,-=--:.:.··....,,.::: -·-=-:::··:.:-i;..:!:-~--'·-C:.C:=-'41 300 ' ··400i 500 1 ····"5 '< 00 _;•:.. Рис. 15.1 . Новая запись в календаре Раннее связывание Если необходимо использовать раннее связывание, в проекте VВА потребуется соз­ дать ссылку на библиотеку типов внешнего прИложения. Для этого в редакторе VВЕ вы­ берите пункт Toolsr=>References (Сервисс:>Ссылки) . Откроется диалоговое окно, пока­ занное на рис . 15.2 . Avaif~ble References: !~l Visual Basic For дpplications l;;;;ir"licrosoft Excel 11 . О Object UЬ..ory Ri OLE Automation (~] Мicrosoft Office 11 .О О~~ t~J!Sitffit!fuileffiil#Slll1C)Ji?f П IAS Helper СОМ Component 1.0 Туре Ll:>rary С IAS RADJUS Protocol 1.0 Туре Library [J Active DS Туре Library [! Active Setup Control LiЬrary С ActiveMovie control type liЬrary [) ASFCC<lp 1.0 Туре Library [J АТL 2.0 Т~·ре liЬrory Г! Ыockdriver 1.0 Туре Library .:$~1~i~,~~~~~~~~~I~#~~- ок' ·~~i Cancel .~';J Priority ~" · ·tl~lp , ·~ ГMkrosoft Outlook 11 . О OЬject LiЬrary ... -~---. --__,. 1 Location:. C:\P(Q\lram F~es\Microsoft Office\OFFICE11\MSOUTL.QLB 1· - Lang.Jage: Standa\d · : ~·--~---,-·------------ Рис. 15.2 . Создание ссылок на обr,ектные библиотеки
Взаимодействие с другими приложениями Office 355 Для создания ссылки нужно установить флажок напротив названия объектной биб­ лиотеки. После этого можно· объявлять объектные переменные интересующего типа. Например, можно объявить переменную Entry типа AddressEntry: ;Diщ Бi;ltr:x~"Д:~ ~Cfdr~ш~~n.t~ .~- ~. .. , • ~""~.···.:: ",·-· Интерпретатор VВА просмотрит библиотеки типов (сверху вниз по списку ссылок) и найдет ссылки на типы объектов. Если один и тот же тип объекта доступен в несколь­ ких библиотеках, будет использоваться перВЬ!Й найденный объект. Для изменения по­ рядка просмотра объектов можно выделить библиотеку и щелкнуть на кнопках приори­ тета для изменения порядка просмотра. Но полагаться на приоритет не обязательно . Объект можно квалифициро~ать через имя основного объекта библиотеки . Например, ' вместо использования AddressEntry можно указать Outlook . AddressEntry. , В следующем примере применяется раннее связывание. Код перечисляет имена записей в папке контактов Outlook. Имена записываются в столбец А активного листа. Удостоверь­ тесь, что перед запуском этого кода создана ссылка на объектную библиотеку Outlook: :Public suь ' Dispia'youtlookConi:actNames () " Dim Outlook As Outlook.Application Dim NameSpace As Outlook.NameSpace Diщ ДddressList А$ l}ddressList Dim Entry ·As AddressEntry Dim I 'As Long · ;a'n E~ror GoTo Finally Set Outlook = New Outlook.Application Set, NameSpace = Outlook.GetNamespace.{"~PI") Set AddressList = NameSpace.AddressLists("Contacts") For Each Entry In AddressList-AddressEntries I·= Т+1 . Cells(I , 1).Value Ent:r;y.Name Next ., · *'Finally: Outlook.Quit Set Oiitlook ,EJ:ld , Sub . ,. ·~· Nothing ... При попытке программного доступа к адресам электронной почты Outlook выдает предупреждение. Пользователь может разрешить или отменить операцию. Та~ .как в Office ХР используется улучшенная антивирусная заЩит-а, ~юбая Попыiка .npo- · rраммноrо . доступа к адресам электронной почты приведет. к':!lыводу со96Щения с пре- . дупреждением. · При каждой попытке программной отправк1;1 .сообЩеt-!/./Я электронной ·почт1:!1 . вь~дается е,ще одно. предупреждение. Если необходимо отклкiчить такие преду- преждения,, обратитесь к системному администратору. · · ' ·• В данном случае объектная переменная Outlook при объявлении получает тип Out - look. Application. Другие операторы Dim объявляют объектные переменные других необходимых типов: Если одно и то же имя объекта присутствует в нескольких объект­ ных библиотеках, перед ним можно указать имя приложения и не зависеть от приоритета библиотек типов. Такой подход продемонстрирован на примере объекта Out- look. NarneSpace. Для создания нового экземпляра прилож е ния Outlook в строке при­ сваивания ссылки Out l ook . Арр l i са t i on переменной Out l ook используется ключевое словоNеw.
356 Глава 15 Объявление переменных определенного типа заставляет интерпретатор VВА исполь­ зовать раннее связывание. Для создания объектной переменной Outlook _можно вос­ пользоваться функцией CreateObj ect, а не ключевым словом New, и это никак не по­ влияет на раннее связывание, но ключевое словоNеw работает более эффективно. Открытие документа в Word ' Если необходимо открыть файл, созданный в другом приложении Office, можно вос- пользоваться функцией GetObj ect для непосредственного открытия файла. С другой стороны, можно создать экземпляр приложения и открыть файл в этом приложении. Другое применения функции GetObj ect будет рассмотрено немного ниже. • дr[;~·;.;;чальноrо зАакомсrва . с '. объектной мсщелью Word ' можно восrюл~~о~11ться меха~ .. нИзмом за·пи.си макросов 11 полуЧ i1ть список об'ъектов, свойств и методов, Которь1е по- ,}ребу~тся Дпя nрОГf?аммного _ в?1Гi9лнения поставленной перед Word з<~дачи. '' ' Следующий код копирует диапазон из Excel в буфер обмена. После этого создается новый экземпляр приложения Woi-d, открывается существующий документ Word и диа­ пазон копируется в конец документа. Так как в коде используется ранняя привязка, удо­ стоверьтесь, что ссылка на объектную библиотеку Wo1·d создана. iE>μьцC" stil:Гc6i3Y.cfia.it.тowori:iDocuлientcopyтaь1eтow6.idD6ёU:m'en:t. <( J" D_im_ Word As · Word.Application · . (Х;:\-. '"· •' .•. .. . ' . isworJ::book' . ~ he ~j :s ( ,;~~Ые") . Range ( "Al: Вб") . Сору Word.Application .;:' ~ . DocuiJtents. bpen Fileьame: ="С:\ temp \chart. doc" • ; Selection . 'E.ndК.ey Uni.t: =wdStory ord.Selection.TypeParagraph l • Word~Selection.PasteSpecial(Link:=False, · . . DataType:=wdPasteOLEObject, _ · lacemetit: ='wd+nLine, DisplayAsicon: =False) ' ,..,. '. /с"':!-'У' . ..:. / ,• -ц~ Wor.d' . .A i::ti veDocument. Save · ' ' :~· '~ (Удостоверьтесь, что вместо пути с:\ ternp\chart. doc указано реальное расщ)Ло­ жение файла документа Woгd.) Ключевое слово New создает новый экземцляр приложе­ ния Woi-d, даже если приложение уже открыто. Метод Open коллекции Docurnents по­ зволяе т открыть существующий файл. После этого код переходит в конец документа, до­ бавляет пустой абзац и вставляет диапазон из буфера обмена. В итоге документ сохраня­ ется и новый экземпляр Woi-d закрывается.
Взаимодействие с другими приложениями Office 357 Доступ к активному документу Word Предположим, что в Excel создана новая таблица . При этом запущено приложение Woгd и в нем открыт документ, в который необходимо вставить созданную таблицу. Сле­ дующий код позволяет скопировать таблицу из Excel в активный документ Woгd. В этом примере используется ранняя привязка: (Рu:Ь1 ic ·su:ь .c:opyт;З:1й'ecriartт6opёnworciDoc·uтent ( · :pim Word . As Word.f>.pplication · set ·word = GetObject (, · "Word.Applicati~n") · wo'rd. selection.. EndKey Uni t : =wdS tor.y , · •· , t· -о _, • • • ' • , ~~:~d.Selection. тweParagraph · ·wprd °' 9:=1ection. Paste/ ·· , Set' Word = >Nothing t~P~.. ~S.VP~. :;:~. ·--:~~---~-" . Функция GetObject принимает два необязательных аргумента. В качестве значения первого аргумента передается имя открываемого файла. В качестве второго аргумента пре­ доставляется имя запускаемого приложения. Если не указать первый аргумент, ·функция GetOb"j ect предположит, что необходимо получить доступ к существующему экземпляру приложения. Если в качестве значения первого аргумента указать строку нулевой длины, функция GetObj ect предположит , что необходимо создать новый экземпляр Woгd . В предыдущем примере показано, ~ак использовать функцию GetObj ect без первого аргумента для обращения к текущему экземпляру Woгd, который расположен в памяти. Но если в памяти нет ни одного экземпляра Woгd, вызов функцииGеtОЬjесt без перво­ го параметра приводит к появлению ошибки времени выполнения. Создание нового документа Word Предположим, что необходимо воспользоваться существующим экземпляром Woгd или, если его не существует, создать новый экземпляр. В любом случае необходимо от­ крыть новый документ и вставить в него таблицу. Эту задачу выполняет следующий код. И в этом случае используется ранняя привязка: fPU.Бl:iё.,,...Su:iJ'cop:fТableт6ЛiiY.worc'iri6cument ( i·· ~·· Dim. Word A:s Word.Applicati"on · ·· t ' . ; :тhisworkbook. ShЁiets ( "т'аые") ..Range ('1 А1: Вб") • f. On "Err.6r .Reslline Next .• "· .. · ' попытаться " открЫтЬ существующt:~й . экземn .. Set Word = GetObj ect (, "Word. Application ' l;' . .. ' . ' . ' 'открьiть.. нов.ый э~земпляр, если " экземпляров не найдено if . Word Is Nothing Then Set Word = GetObject("'' ; "· ori· Error ·GoTo . о .. )yo.rg., ROS:Y-Plents , A9,g ·= ··'
358 Глава 15 wo:ra:vЗ"siЬre ; "тrue - ' ~ · """"·· -· Word.Selection.EndKey Пnit:='wdStory . Word. Selection. TypeParagraph -. , word. Selection. Paste Set Word = Nothing ,}';щ1, Sчl;J" ~":" ,", .. ., .""." "!" ,__ Если в памяти отсутствуют экзе·мпляры Wo1·d, применение функции GetObj ect без первого аргумента приводит к ошибке времени выполнения. После этого код вызывает функцию GetObj ect с нулевой строкой в качестве первого аргумента. При этом будет создан новый экземпляр Wшd, в котором будет открыт новый документ. Кроме этого, код делает видимым новый экземпляр Woгd, в то вре"мя как в предыдуших примерах все операции выполнялirсь в фоновом режиме без отображения диалогового окна Woгd. В конце процедуры объектная переменная Woгd освобождается, но окно Woгd остается на экране и позволяет просматривать результат работы кода. В;заимодействие с Access через библиотеку DAO Если необходимо скопировать данные из Access в Excel, можно создать ссылку на объ­ ектную библиотеку Access и воспользоваться объектной моделью Access. Кроме этого, можно воспользоваться библиотекой ADO (ActiveX Data Object), которая является наи­ более актуальным интерфейсом от компании Miпosoft для доступа к реляционным базам данных и другим источникам данных. Примеры использования этих интерфейсов рас­ сматривались в главе 11. Существует еще один метод эффективного доступа к данным в базах данных Access - библиотека DAO (Data Access Objects). В пакете Office 97 доступна только библиотека DAO, так как библиотека ADO была выпущена после Office 97. Библиотеку ADO можно использовать и в Excel 97, но мощный метод CopyFrornRecordset, который применя­ ется в следующем примере, в Excel 97 для наборов записей ADO не поддерживается. Ни­ же показано, как использовать библиотеку DAO. На рис. 15.3 показана таблица Access, которая называется Sales и хранится в файле FruitSales. mdЬ. " · До код 240 450 : ~~~;о "_ _1_~----- -~:о : Бананы 17. 850 ......... : Rб~~~~ ···· 100 ..... 5: .... ЩJ ' FL :Аrава ... SQO. ia: 5000 . i i\lj 'ГР.ейnфР.у_т,_,."", ". " """.""." ". . 030 0: 1§ 450 ТNJ ! Оливки :ЗО~ __15..... .... 4 .?0 о.о'.о Рис. 15.3 . Данные из таблицыАссеss Следующий код использует библиотеку DAO для создания набора записей на основе таблицы Sales. В данном случае применяется раннее связывание, поэтому необходимо создать ссылку на объектную библиотеку DAO:
Взаимодействие с другими приложениями Office 359 r:pu.JSJ:ic . sU.Б :' G'et.safesbat~viabA:o о D'lm ,DAO ' As DAO ..Ш3-Engin.e . bim 's~'les Аf!з 1.DAO. Dq.tabase .: Dim~ SalesRecordset As . DAO .Recordset ·. Dim r.A.s . Integer ' ..·,. ·, . ,··· Dim WorksP,eet ' лs·: Worksheet Dim ..Count As In.teger Set DAO =· New DAO.DBEngine - , ·set'- Sales = DAO. OpenDatal5ase (ThisWorkЬook. Ра th ,:rruitS}J.Ie$ .mdЬ") . . .· · . :"• · Set SalesRecordset = Sales. OpenRecordset ( "Sales-" )• Set Worksheet ;, Worksheets.Add · ' 1, Count · = SalesRecordset ·. Fields. Count FOI',I =оТоCount, - 1 · · ' Worksheet. Cells (1, Т + 1) . Value Sa1esRecordset. Fields ( I) . Name · ·- Next . , 'worksheet. Range ( ,; А2") . CopyFromRecordset Woxksheet.Columns("B". ) .NumЬerForrnat = "mmm dd, уууу" With Worksheet. Range ( "Al") . Resize (1., Count) . 'Font. вold = TI'ue . EntireColumn.AutoFit End ' With . Nothing, Set SalesRecordset Set Sq.les = Nothing Set DAO = NOthing ;E,n.,<;1_,~ц:О. ~ /~ ,'· ,, ' Код открывает файл базы данных Access, создает J:Iaбop записей на основе таблицы Sales и присваивает ссылку на набор записей переменной SalesRecordset. В книгу Excel добавляется новый лист, а имена полей из набора записей SalesRecordset зано­ сятся в первую строку нового листа . Для копирования записей из набора SalesRecord- set в диапазон. листа начиная с ячейки А2 код Использует метод CopyFromRecordset объекта Range. Метод CopyFromRecordset предоставляет быстрый способ копирова­ ния данных (по сравнению с циклической процедурой, которая копирует каждую запись по отдельности). ВзаимодействИе Access, Excel и Outlook В качестве последнего примера интеграции приложений Office показано извлечение данных из Access , построение диаграм:мы в Excel и отправка диаграммы по электронной почте средствами Outlook. Код организован в четыре процедуры. Первая процедура явля­ ется подпрогра.11,1мой и называется Emai lChart . Она настраивает рабочие параметры и вы­ зывает остальные три процедуры. Обратите внимание, что в этом коде используется раннее связывание и необходимо создать ссылки на объектные библи?теки DAO и Outlook: ;Public · suь Emaiich.ari!. () Dim SQL As String Dim Range As Excel.Range Dim FileName As String Dim Recipient As String i S_Q~ ...." SELE:CT Prod~c t, Surn (Reyenue) "
360 Глава 15 r-~)i ''sQL0 SQL & :,• . pROM saie's" ·~· ~- . f' SQL = SQL & "WНERE Date>=#l/1/2004# and Date<#l/1/2005#" k SQL.= SQL & " GROUP ВУ Product;" FiieName = ThisWorkbook.Path + "\Chart.xls" Re.cipient "q,~lge@leschinsky.in. ua" Set iRange GetSalesData(SQL) • Ch.artData Range·, . FileName ,, " :· Call· SendEmail (Recipient, FileName) \~p(j:_§_u}:~ ·-" ..... •·····.. ., Для хранения строки с запросом SQL используется переменная SQL. Язык запросов SQL более подробно рассматривался в главе 11. В данном случае в запросе SQL сказано, что из таблицы Sales необходимо извлечь уникальные имена продуктов и сумму прибы· ли для каждого продукта для всех дат в пределах 2000 года. В переменной FileName ука­ зывается путь и имя файла , которые будут использоваться дл.я хранения книги с диа­ граммой. В переменной Recipient хранится адрес электронной почты, на который не­ обходимо отправить диаграмму. После этого код вызывает функцию GetSalesData. В качестве параметра в функцию передается запрос SQL. В результате работы функции возвращается . ссылка на диапазон, содержащий извлеченные данные. Ссылка присваивается переменной Range. После это­ го вызывается подпрограмма ChartData. Диапазон с данными передается в подпро­ грамму в качестве параметра. Также в подпрограмму передаются путь и имя файла с кни· гой диаграммы-.~Наконец, вызывается подпрограмма SendEMail, в которую передается адрес электронной почты получателя и расположение ·книги с диаграммой, присоеди- няемой к сообщению . ' {i>I-!ЬIIC' .Fi:inwc'Efoil'.d~ts aiesbata (в.Уvа1 sdt A:;;г. string) лs Ехсе1'. Range !у. ,,;?;;. DiJ!1 DAO ..As DAO. PBEngine F·• ,у Diin , Sales l\,s DAO. Database ~'" · цi'm SalesRecordset As DAO. Recordset г Set. DAO = New DA.O . DBEngine Sales = ШЮ. OpenDatabase (·Thiswo.r;}<book. path + '' \Frui tsales. mdb") SalesRecordset . Cμrrent:Region · set scilesRecordset - Nothing \'/ set' Sales =. Nothing ':ц,,. ~~t, DAo ._,; ,:Nothing . ;gnO,,;;!'i,ЧЛ9.;1;i9Р. ~ .,;,;;,;~_.;;.;,,",/" Функция GetSalesData напоминает подпрограмму GetSalesDataViaDAO, которая была показана ранее. Вместо извлечения всей таблицы Sales в данном случае использу­ ется более избирательный запрос SQL. Подпрограмма очищает лист Data и копирует выделенные данные начиная с ячейки Al. Имена полей на лист не копируются . Копиру· .
Взаимодействие с другими приложениями Office 361 ются только имена продуктов и общая прибыль. Свойство CurrentRegion используется для получения ссылки на все извлеченные данные. Ссылка возвращается в качестве зна­ чения функции. 'J?U:Ьilc su:Ь' 'ёh'ar-triata (ByVal Range As Range, . wi th workbooks. Add · Wi~h .Charts.Add With .SeriesCollection.NewSeries · .X Values = Range . Columns(l) .Valu . Values = Range. Colurr(ns (2). Va;J..ue End With . . .'HasLegend = False .HasTitle = True .C hartTitle.Text = "доход за 2000" End With . • Application.DisplayAlerts False . SaveAs FileName ' Application. DisplayAlert's True .C lose End With .~d§~b Аргументы подпрограммы ChartData определяют диапазон с исходными данными и каталог для создаваемого файла. Подпрограмма создает новую книгу и добавляет в нее лист диаграммы. В диаграмме создается новая последовательность значений и значения из диапазона данных - присваиваются осям графика. Свойство DisplayAlerts устанав­ ливается в значение False для предотвращения предупреждений , если перезаписать су­ ществующий файл с тем же именем .- Когда вирус не является вирусом? Авторы этой.книги вспоминают, что созданная ими без злого умысла версия подпро­ граммы SendEmail при проверке средствами Noгton AntiViгus была идентифицирована как вирус. На самом деле, код был идентифицирован как вирус X97.0utlookW01·m .Gen, что отн'яло у них несколько часов рабочего времени. После закрытия Excel и сохранения проделанной работы Noгton AntiViгus сообщил, что в книге обнаружен вирус и проблема Исправлена. Антивирусный пакет удалил все модули книги. При этом пришлось отклюС чить возможность AutoPгotect в антивирусе и начинать работу с самого начала. Вот код, который привел к появлению проблемы: ;t>uьi'ic ' sЦЪ sёnd.Ёriiali (ByVal R.ecipient A.s . '~ .ByVal Attachment . As String) · · Dim OutlooR As Outlook~Application Dim NameSpace As Outlook . NameSpace Dim :М:ailitem As Outlook.Mailitem Outlook = New Outlook.Application Set Mai1Item = Outlook.Createitem(olMailitem) . with Mailitetn . Subject = "Диаграмма дохода за 2004" ' .Recipients.Add Recipient :воdу =- "Книга с присоединенной '. Attachments.Add Attachment
362 Глава 15 Set Mailitem Nothing Set Outlook = Nothing End Sub После ряда проб и ошибок был создан следующий код, который не идентифицируется как вирус. Код избегает идентификации как со ссылкой на объектную библиотеку Out- look, так и без нее . Так как в коде используется- позднее связывание, ссылка на объектную библиотеку Outlook не требуется. (Pub1ic' Sub SendEmaii2" (:i3yval ' ReCipi.ёrit' As str:Cng ;'°· - ~ ByVal Att.achment As String) Dim Outlook As Object Diin NameSpace As Object Dim Mailitem As object . Set Outlook = CreateObject("Outlook . Application") Set Mailitem = Outlook.Createitem(O) • Wi-th Mailitem . Subject = "диаграмм·а дохода за 2004 год" .Recipients.Add Recipient . Body = "Книга с присоединенной диаграммой" . Attachments.Add Attachment .Send . End With End Sub Подпрограмма SendEmail принимает адрес электронной почты и имя файла в каче­ стве параметров. Если конфигурация Outlook требует предварительной регистрации, придется удалить символ комментария в начале строки получения ссылки нaNameSpace и предоставить имя и пароль. Новое сообщение электронной почты создается· с помо­ щью метода Createitem. После этого указыв ается текст темы письма и присоединяе­ мый файл. Метод Send позволяет отправить сообщение электронной почты. При выполнении этого кода в Office ХР потребуется ответить на запросы трех диало­ ~овых окон. В первых двух выдается предупреждение о попытке доступа к Outlook, по­ том во втором диалоговом окне устанавливается пятисекундн~ задержка и выдается предупреждение-об отправке сообщения электронной почты. Эта методика очень полез­ flа как для легальной деятельности, так и для написания вирусов . · Хотя Office 2003 обеспечивает стойкую защиту против вирусов на основе электрон­ ной почты, самые ранние версии Office оказываются более уязвимы. Компания Mic1·osoft предоставляет исправления для ранних версий Outlook, но они могут полностью отклю­ чить возможность программного создания сообщений электронной почты средствами Outlook. Очень сложно дать разрешение на программное создание сообщений электрон­ ной почты и при этом запретить вирусам делать то же самое . Лучшим решением является установка последней версии антивирусного программного обеспечения. Резюме Чтобы автоматизировать использование объектов другого приложения, необходимо создать объектную переменную , которая ссылается на интересующее приложение или объект интересующего приложения. Для создания связи между VВА и объекта.м:и другого приложения можно использовать раннее или позднее . связывание. Раннее связывание требует создания ссылки на библиотеку типов интересующего приложения. При этом
Взаимодействие с другими приложениями Office 363 объектные переменные, ссылающиеся на объекты приложеIJ:ИЯ, должны объявляться с использованием правильного типа. Если объявить объектную переменную с использова­ нием универсального типа Obj ect, интерпретатор VВА будет применять позднее связы­ вание. При раннем связывании генерируется более быстрый код, чем при использовании позднего связывания. Кроме этого , информация об объектах интересующего приложе­ ния доступна в окне Object Browser (Просмотр объектов), а при наборе кода автоматиче­ ски выводятся всплывающие подсказки. Кроме того, в процессе ввода кода выполняется проверка синтаксиса и типов, а значит, в процессе выполнения будет выдаваться меньше ошибок, чем при позднем связывании, когда все эти проверки не могут быть выполнены до начала работы кода. При использовании позднего связывания для создания ссылок объектных перемен­ ных на целевое приложение применяются функции CreateObject и GetObject. Эти ' же функции мо_жно использовать при раннем связывании, но ключевое слово New рабо­ тает более эффективно. Одна'!Со если необходимо проверить открытый экземпляр друго­ го приложения на этапе выполнения, функцию GetObj ect можно использовать и вме­ сте с ранним связыванием. Показанные в этой главе методики позволяют создавать мощные приложения, кото­ рые хорошо интегрируются в уникальные возможности различных продуктов. Пользова­ тель остается в знакомой среде, например в Excel, а код работает с несколь~ми продук­ тами, предоставляющими свои объещъr через библиотеки типов. Стоит помнить, что создатели вирусов могут использовать показанную здесь инфор­ мацию для нападения на незащищенные системы. Удостоверьтесь в адекватной защите собственных систем.
':
Программирование с помощью Windows API \ Язык Visual Basic for Applications является языком высокого уровня и предоставляет бо­ гатый , но в то же время простой набор функциональности для управления пакетом Office, а . 1 также другими приложениями. При этом разработчик защищен от программирования опе- рационной системы Windows, которым приходится заниматься разработчикам на С++. Цена этой защиты - невозможность контроля над мцогими компонентами платформы Windows. Например , функция Application. International используется для чтения большинства региональных параметров Windows, а Application. UsaЬleWidtЪ и Application . UsaЬleHeight позволяют определить размеры экрана. Вся связанная с Windows информация доступна в виде свойств объекта Application. Эти свойства пе­ речислены в приложени;и А. Платформа Windows предоставляет большой объем низкоуровневой функционально­ сти, которая обычно не доступна из VВА. Эта функциональность по~воляет определять сис­ темные цвета, создавать временные файлы и т.д. Ограниченное подмножество функцио- . нальности предоставляется в VВА, например, дается возможность создания и использова­ ния подключен:Ия к сети Internet. В частности, с помощью вызова WorkЬooks . Open "<URL>" можно открыть страницу в сети Internet, но сохранение страницы на диске не­ возможно. Кроме этого, существует ряд объектных библиотек, доступных на компьютере Windows для предос.:гавления высокоуровневого доступа к функциональности Windows для приложений VВА. Например, существуют библиотеки Windows Scripting Runtime и Internet Transfer Control. Но иногда возникают ситуации, в результате которых необходимо выйти за пределы VВА и объектных биб.irиотек и Погрузиться в файлы с низкоуровневыми процедурами, предоставляемыми и используемыми Windows. Операционная система Windows состоит
366 Глава 16 1 из большого количества отдельных файлов, большинство из которых являются библио­ теками DLL и содержат ограниченный набор связанных друг с другом функций. Функции из библиотек DLL могут использоваться операционной системой Windows и другими библиотеками DLL. Непосредственный запуск библиотек DLL невозможен. Все эти файлы известны как программный интерфейс приложений Windows (Windows API). Вот наиболее часто используемые файлы из состава Windows API: Файл USER32 . DLL KERNEL32.DLL GDI32 . DLL SHELL32.DLL COMDLG32.DLL ADVAPI32.DLL MPR.DLL и NETAPI32 .DLL WININET.DLL WINMM.DLL WINSPOOL . DRV Группы функций Функции пользовательского интерфейса (управление окнами, клавиатурой и буфером обмена) Файловые и системные функции (например, для управления программами) Графические и экранные функции Функции оболочки Windows (на при мер, обработка пиктограмм и запуск nрограмм) Стандартные функции диалоговых окон Windows Функции системного реестра и подсистемы NT Security Сетевые функции Функции работы с сетью lnternet Функции мультимедиа Функции печати В этой главе рассматривается использование функций из этих файлов в приложениях VВА и предоставляется несколько полезных примеров. Все функции Windows API докумен­ тированы в Platfo1-m SDK библиотеки MSDN Libraгy по aдpecyhttp: / /msdn.microsoft . com/library/ default . asp. Информацию по этому адресу можно рассматривать как ин­ терактивное справочное руководство по Windows API. Анатомия вызова программного интерфейса приложений Перед использованием процедур , входящих в библиотеку Windows DLL, интерпрета­ тору VВА необходимо сообщить расположение библиотеки, параметры процедур и типы возвращаемых значений. Для этого применяется оператор Declare, который описан в справочном руководстве VВА следующим образом: "tР"U:ьЛ.'о ГPrivateJ D"ecic:!"re '"suЬ "' tш:Я: LIЬ "щ.и;_бИбЛио.те1сЙ'Г(.Аiiаs'".; · ( "имя_псев,до,..има "] r.([ список.:.._аргументов] ) ] . . ' . .• ' : [PuЬlic 1 P-!="ivate] . Declare Furiction name Lib 1'имя_библиотеки" [Aliai> [, ··~_пc~щ:relif-1.1'1?.:;J ~.~{JJ C[lj;fq()К.::....9PГ.Кk!E?:'i:Z::<?.B]):1• . J .l\,§.~TJ1ПJ . ..~• Справочное руководство VВА содержит хорошее описание синтаксиса этих операто­ ров, но в нем нет ни одного примера вызова метода API. Следующее объявление исполь­ зуется для обнаружения каталога Windows ТЕМР :'
Программирование с помощью Windows API 367 ii'rivate 1Jeёlare ' 'Furictlon ·cetтempPath .. LШ ·"keiiieГ.32-;,·· :. · 1 ·., :·. Alias "GetтempPathA" .( ~ . ·. ... . .· >".,. , ' '" ByVal nBuf'ferLength As. ' Long, _ " · J,. "" .J3Y:Y?-1 .Jp)3uJ}'::~ч· ~ Ае, e.tringJ.. .Ai.3 . ~o!Jg~-• :.;.:с.: Предыдущее объявление сообщает интерпретатору VBA, что: О функция вызывается из кода как GetTempPath; О процедура API находится в библиотеке kerne13 2 . dl l; О в данном случае используется мeтoдGetTempPathA (имя чувствительно к регистру); О функция GetTempPath принимает два параметра типов Long и String (дополнительная информация о типах приводится далее); О функция GetTempPath возвращает значение типаLоng. Объявления большинства распространенных функций API доступны в файле win32api. txt, предоставляемом в составе Office ХР Develope1· Edition и в любой более новой версии Visual Basic. Кроме этого, предоставляется небольшой аплет API Viewer, который поддерживает поиск объявлений . На момент написания книги этот текстовый файл был доступен на странице "Free Stuff' раздела Office Developer на сайте компании Microsoft по адресу http://www. microsoft . com / officedev / o-free. htm или непо­ средственно в разделе ht tp : / /www.microsoft . com/ downloads (выполните поиск по ключевому cлoвywin32api. ехе). Интерпретация объявлений в стиле С Библиотека MSDN является лучшим источником информации о функциях в библио­ теке Windows API, но в основном эта информация ориентирована на программистов С и С++. В библиотеке предоставляются объявления функций в стиле С. В фaйлewin32api. txt приводятся объявления большинства основных функций Windows в стиле VВА, но это т список не обновлялся некоторое время и поэтому не содержит части новых функций из библиотек Windows DLL (например, функций OLE из библиотек olepro32. dll и функций работы с сетью Inte1·net из библиотеки Wininet. dll). Обычно можно преобразовать объявления в стиле С в объявления VВА. Declare. Для этого используется показанный ниже метод. В библиотеке MSDN показано следующее объявление функции GetTeinpPath (по а~­ ресу http ://msdn .microsoft . com / library/default.asp?url=/library/en-us/ fileio/base/gettemppath. asp): 'Ьi4oR.6 Gёtтem:Pi?atБ( ""'""~ ":'," ·• =· ·· ·:·-· . . .. • PWORD nBufferLength, // размер буфера· в сиМВолах : " LPTSTR lpBuffer · ; / указа тещ, на буфер с иМе:Нец: . Это объявление :можно воспринимать следующим образом: '<Б~ра!f!аемЬiй тйП> <·ймЯ функцИИ> С: Ь .· " «ТИП ". ~анных параметра> <Имя параметра>, · <Тип данных · параметра>.-. <ИМя параметра:>, ;11· ..""". ~""" "-·~ ·~--
368 Глава 16 Преобразование объявления в стиле С в оператор VВА Declare позволяет получить следующий результат (ключевые слова DWORD и LPTSTR преобразовываются в типы дан­ ных VВА): iБeciare F\lnc i:. ion ' имя_·функции LiЬ"'"· йМЯ:::бИ8.ЛИоте.Кй" ' Ai i a s . -"Getтё mp Pa'thA" . ' Cl?YYab, j1J?uJfe:;::Leng~J::i.: А,:;; ..J:?WCЩp" _!3Y:\la;L . lp}3uffer.. }\s. .LJ?S~R) А~ DWORD.. На платформе Windows существует два набора символов. Набор символов ANSI был стандартом в течение многих лет и использует один байт для описания одного символа, что в любой момент обеспечивает доступность 255 символов. Для предоставления одно­ временного доступа к . большему диапазону символов (например при использовании · дальневосточных алфавитов) был создан набор симво.irов Unicode. В этом наборе для ка- ждого символа выдел.Яется Два байта, что позволяет одновременно иметь доступ к 65535 символам. Для предоставления одной и той же функциональности для обоих наборов символов в cocтaвe.Windows API предлагается две версии каждой функции, работающей со строка- , ми. Функции для набора символов Al"\!SI имеют суффикс А, а функции для набора симво­ лов Unicode - суффикс W. Интерпретатор VВА всегда использует строки ANSI, поэтому тут все время будут применяться функции с суффиксом А - в данном случае GetTemp- PathA. Кроме этого, объявления в стиле С используют другие имена для обозначения типов данных (их тоже придется преобразовать). В следующей таблице показаны наибо­ лее распространенные типы данных (хотя этот список не полный): Тип данных в С Объявление в стиле VBA БООL БyVal <Имя> As Long БУТЕ БyVal < Имя> As Буtе БУТЕ * БyRef <Имя> As Бу t е Char БyVa l <Имя> As Буtе Char_ huge * БyVal <Имя> As String Char FAR * БyVal <Имя> As String 1 Char NEAR * БyVal <Имя> As String DWORD БyVa l < Имя> As Long HANDLE БyVa l <Имя> As Long НБI ТМАР БyVa l <ИМЯ> As Long HБRUSH БyVal <Имя> As Long HCURSOR БyVal < ИМЯ> As Long HDC БyVa l <ИМЯ> As Long HFONT ByVal <Имя> As Long НICON ByVal <Имя> As Long HINSTANCE ByVal <Имя> As Long HLOCAL ByVal <Имя> As Long HMENU БyVal < Имя> As Long
Тип данных в С HMETAFILE HMODULE HPALETTE HPEN HRGN HTASK HWND Int int FAR * LARGE_INTEGER LONG LPARAM LPCSTR LPCTSTR LPSTR LPTSTR LPVOID LRESULT UINT UINT FAR * WORD WPARAМ Программирование с помощью Windows API 369 Объявление в стиле VBA ByVal <Имя> As Long ByVal <Имя> As Long ByVal <Имя> As Long ByVal <Имя> As Long ByVal <Имя> As Long ByVal <Имя> As Long ByVal <Имя> As Long ByVal < Имя> As Long ByRef <Имя> As Long ByVal <Имя> As Currency ByVal <Имя> As Long ByVal <Имя > As Long ByVal < Имя> As String ByVal <Имя> As String r ByVal <Имя> As String ByVal <Имя> As String ByRef <Имя> As Any ByVal < Имя> As Long ByVal <Имя> As Integer ByRef <Имя> As Integer ByVal <Имя> As Integer ByVal <ИМЯ > As Integer Другой Возможно, определенный пользователем тип, который придется опре­ делить самостоятельно Некоторые определения API в библиотеке MSDN содержат иден:гификаторы IN и OUT. Если тип VВА показан в таблице "ByVal <Имя> As Long ' , то д ля пар аметр ов OUT он . должен быть изменен на ' ByRe f ... ' . Обратите внимание, что в функции API строки всегда передаются по значению (ByVa l) . Это связано с тем, что интерпретатор VВА использует собственный механизм хранения строк, который не поддерживается библиотеками DLL для языка С. При пере­ дач.е строк по значению интерпретатор VBA выполняет преобразование собственной структуры хранения-в структуру, понятную библиотеке DLL. У~итывая это, после преобразования и удаления ненужных префиксов получается следующее объявление: ipJ:-i vab~· riec lare FunCt::Гьn ' C:et">:Гem:P I?atli ' t i :f>' "ИМя~_ _}5иблйотf.=кrР , Alias · "Ge tTe mpPathA" (ByVa l nBufferLe ngth As Long, · · 13yvaJ.. )Зi,r:ff~:i;. .~.s_. ~i_:: r~_pg) ..i:,~_ . ~o~g---='-'· "~ -" '-'
370 Глава 16 Однако в объявлении не содержится информация о библиотеке DLL, в которой хра­ нится интересующая функция. В нижней части страницы MSDN в разделе "Требования" содержится строка: ~и!>iа~~,~· ~~ --~<~ч1~J~?,П1?: ::~- ..'~::.-" " ( Это говорит о том, что функция хранится в файле kernel32. dll. Финальное объ- явление будет выглядеть следующим образом: !'Privi'ife -Declar€ГFuncti6·n-·detтёmpPath · Lib :iferiie 1з2 :"ci1T·; ~·--·,.. Alias · "Get',ГempPathA" (ByVal nBufferLength As Long, _ ByY~!.•)3ЧKf~I; l.\8- ; §t;;:,ir:ig) ::A~." L..9119 -·- -······ "',,,.' Полученное объявление функции практически идентично объявлению из файла win32api. txt . Этот файл стоит использовать в качестве основного справочного руко­ водства по объявлениям всех функций API. :внимание: использовани~ неnр~вИльного объявления -фун;кци~ ·мо;ет .nр~вести к~авар~й­ ному завершениlQ работы Excel. При разраб<пке с' nрИменением вь1зовов API как можно · чаще сохраняйте nроД~ланнуЮ работу.' · ·· -· · Константы, структуры, обработчики и классы Большинство функций API имеют аргументы, принимающие ограниченное количе­ ство предопределенных значений. Например, для получения информации о возможно­ стях операционной системы можно воспользоваться фyнкциeйGetSysternМetrics: . гоёеlаr е '1'unc ti'cin~det.'s'YS"teinМёtrlcs';·r:,I)J"''· ~гu~s er.32'" '""""""'~"-ь;·~ f3y'{aJ=_IQQ._~,,_л?.""L..9д.gJ ..~J1s . · Lgpg ""'-~ _:,2 Обратите внимание, что в файле win32api. txt функция GetSysternМe t rics по­ казана с применением ключевого словаАl ias: i~f1~f:~~~~~~~~~~-~-~I~~~:~~~;I~~~~~;;·:~·::~;;~;;~~#~5зon..g -· Ключевое слово Alias не понадоб:Ится в том случае, если имя функции совпадает с псев­ донимом, поэтому оно автоматически удаляется при копировании функции в модуль кода. Значение аргумента Index сообщает функции об интересующей метрике . Аргументу I ndex присваивается одна из предопределенных констант. Соответствующие константы показаны в документации MSDN, но чаще всего значения констант не показываются. К счастью, в файле win32api. txt содержится большинство необходимых констант. Для функции GetSysternМetrics существует около 80 констант, включая SM_CXSCREEN и SM_CYSCREEN, которые позволяют получить размеры экрана: 1 i:>rivatё~-e:0пsг ·sм:::.ёxsC::rй!:E::N дs t ong · ;- • оР•• ·•п··. ,~ fpr:i\;a.i:~· Const ·sм_CYSCREEN дs' Long , =, . 1 . /'" .• :> ·- -'' .,!·-~-- _,• •·. ·:, ~ О>.· , • • 1:r:: , , ;: ' ·< :->о, ~''. {.PubHc Sub Showscieenpimensiqns () ' DlJit Х As Long · · · ;:Dim У·As Long·
Программирование с помощью Windows API 371 '" ·· :х "~ dei:.'systёffiМёErTcs (sм_::-cxsёR'БilliT' ·~·No·,,,-·'"1'-'~1"·•<У.15Е>"7-~·"'1·п••' ·7лкпr=;:"""'~-"-·г·=-·::с;Г' у = GetS~sternмetrics (SM_CYSCREEN) .. Многие функции Windows API передают информацию с помощью структур (structures). Это термин языка С, который соответствует определенному пользователем типу (Usei-- Defined Туре - UDT) . Например, функция GetWindowRect применяется для получения размера экрана: 'bёc.iare functlon ·G'efw:triC!owkёct trь·· ;•usёrЗ2'· ( · ByVal · hWпd As Long, _ · • ~ ";вyJ5§J . J:P.g~t_ . A,§, ,)~\ectJ•. Ь.~ ,1Qpg,_= .• Параметр l pRect является структурой RECT, которая заполняется функцией Get- WindowRect и ~одер жит информацию о размерах окна. В библиотеке . МSDN показано следующее определение структуры RECT: 't:YPeCie:Ё ·-s-t:r:·i1c t.-t.a:iJR."Ecт:·, г .,..,- .•". - LoNG left; LONG •top; LONG right; LONG bottorn; . } . RJ?t;;T_; ,~.,:. ,,,;"~. ~"·'_,,.,,,_,.,_,,,_"_"'''"""'''··-·•"•"·'',,,.'~"~ Это объявление может быть преобразовано в определенный пользователем тип VBA с использованием того же преобразования типов данных, которое было показано в преды­ дущем разделе: ,РНva:t:e ··тY:Pe '.Rec t Left As Long ;· Тор Aro Long >. Right As Long , f Bottorn As Long :~I1сЗ... Т:а:>~ .-~ ~ - В файле win32api. txt предоставляютс.Я определения пользовательских типов дан­ ных для большинства распространенных структур. Первый параметр функции GetWindowRect показан как ' hwnd ' и представляет де­ скриптор окна. Дескриптор просто является указателем на область памяти, в которой со­ держится информация об интересующем объекте (в этом случае, окно). Операционная система Windows динамически выделяет дескрипторы и вероятность их повторения в различных сеансах крайне мала. ·следовательно, номер дескриптора невозможно непо­ средственно использовать в коде и поэтому необходимо применять функции API, воз­ вращающие необходимый дескриптор. Например, для получения размеров окна Excel необходимо получить дескриптор окна Excel. Этот д~скриптор предоставляет функция API FindWindow. r., ВызОв лРI дЛ~ поисКа окна , i.Priva'te Dec1are Function F·indWindow Lib "user3.2" · Alias "FindWindowA • (ByVal ClassName As ·string, . By,V a tyindqwNёl..11!§"}\s · t i g L.-.As_ Long: · . ... :,..'-~-""""'""""'-""""' Эта функция просматривает все открытые окна, пока не найдет окно с указанными именем класса и заголовком. В Excel 2002 свойство hWnd было добавлено в объект Application, поэтому д_ля этих _целей функцию FindWindow можно больше не приме-
372 Глава 16 . нять. В настоящей главе во всех п риме рах исп ользуется функция FindWind ow, что по· зволяет сохранить совместимость с предыдущими версиями Excel. Приложения Windows поддерживают множество различных типов окон, начиная от окна приложения Excel и заканчивая окнами диалоговых листов, диалоговых 6кoнUser­ Form, окон списков или кнопок. Каждый тип окна имеет уникальный идентификатор, называемый 1U/дССОМ (class ) . Вот распространенные имена классов в Excel: Окно Основное окно Excel Лист Excel Имя класса XLМAIN EXCEL7 Диалоговое окно UserForm ThunderDFrame (в Excel 2003, Excel 2002 и Excel 2000) ThunderRT б DFr ame (в Excel 2003, Excel 2002 и Exc el 2000 пр и запуске в качестве надстро й ки СОМ Addin) Диалоговый лист Excel Строка состоян ия Exc el ThunderXFrame (в Exce l 97) bosa_sdm_ xl9 (в Exce l 2002 и Exc el 2000) bosa_ sdm_ xlB (в Exce l 97) bosa_ sdm_ x l (в Excel 5 и Excel 95) EXCEL4 Функция FindWindow ищет окно по имени класса и тексту заголовка . Обратите внимание, что имена классов для некоторых стандартных элементов меня· ются с каждой новой версией Excel. Таким образом, код должен проверять текущую вер· сию для выбора соответствующего имени класса: ГSerёCt=:' ~ase vaГ(ApP'l lca'"t~i~ori '. ver·s"loii. )~''"' ....~~- Case :'r:s > = 11 ' использовать имена классов, Excel 2 003 Case Is >= 9 :использовать · имена классов Excel 2000/2002 CaseIs>=В ' Использовать имена классов Excel 97 ca:Se E1se 'исполь ,зовать имена классов Excel 5/95 · t:_~,nq SgJ.~f:t_-,".; _,;•-; ...<.,,::и-•--.N --~..,.,~:...... • ~ь-:2." ~ '""' · _ ..,. ~J.М.-i"J<;,J; .• т.;.:,., Это приводит к проблеме совместимости сверху вниз. Было бы неплохо писать код с определенной степенью уверенности, что он будет работать и в последующих версиях Excel , но заранее неизве~тно, какие имена классов будут использоваться в следующих версиях. К счастью, пока имена классов не менялись с момента выхода Exce l 2000. Учитывая все вышеизложенное, можно воспользоваться следующим кодом для опре· деления расположения и размера основного окна Excel (в пикселях): :J?r:L,V aYe '.b ecYar e ' :Funi::.t J:on FTriawirid9>'Г'trь ·;;u:se·:r~2·• ::· "-·~ Alias " FindWindowA " (ByVal C1assName As String , : ByVal.· Wi n dowName As S tring) As L ong · · .Decl are Function GetWind owRect L i b " use r32" ( _ "' ByVal hWnd .As Long , _ . /. · Rect As Rect ) ·As Long_ Pr:Lvate Type ' Rect ,Left As Long Тор As Long ;. ,Rig l).t As r,,oцg
вottom A:s . i .aiig iEnd Туре ~- Программирование с помощью Windows API 373 Pub1ic Sub ShowExcelWindowSize () 1 Dim · hWnd As· Long, aRect As Rect \.",,. . . r. . hWnd = FindWindow( "XLМAIN", Application.Caption) · · Call GetWindowRect ( hWnd, aRect} · c all PrintRect(aRect} ~End Su)? tPrivat~ Sub· PrintRett (ByRe{ aRect As f. · Call MsgBox( "Окно Excel имеет следующие z·, vbCrLf & '1 Левая: · •• & aRect..L.~ft & ~J?~O:: !?.tз.ь:. vbCrLf & " Правая: " & aRect.Right & _ vbCrLf & " Верхняя: " & aRect:Top & · vbCrLf> & " Нижняя: ' " & aRect. Bottom & vbCrLf & " Ширина: " & (aRect.Right .- - aRect ..Left} vbCrLf & " 'высота· : ,; · & (aRec:t.Bot):.om - . a~ect.Top)'} Измените размеры окна Excel, чтобы оно занимало часть экрана, и запустите подпро­ грамму ShowExcelWindowSize. Появится диалоговое окно, в котором показаны грани­ цы и размеры окна Excel . Разверните окно Excel во весь экран и выполните проц едуру еще раз - верхняя и левая границы могут оказаться отрицательными. Это связано с тем, что функция GetWindowRect возвращает размер окна Excel по внешним границам окна. При разворачивании окна во весь экран границы оказываются за пределами видимой об- ласти, но остаются частью окна. Что делать, если что-то пошло не так? Одним из недостатков использования функций Windows API является идентифика­ ция причины ошибки. Если по какой-либо причине вызов API завершился неудачно, он . должен возвратить какой-то признак неудачного завершения (обычно нулевое значение функции) и зарегистрировать ошибку в операционной системе Windows. После этого средствами функции VВА Err. Las tDLLError можно извлечь код ошибки и воспользо­ ваться функцией FormatMessage из Windows API для получения текста с описанием ошибки. !J5r 1vate Co nst ' FbRМAт..::мE:ssAGI{}'ROM.::SYSTEIГXs Lon<T ~ ' &Н1ob07'~~·" "., .,. .. ~, ' Private .beclare Function FindWindow . Lib Alias "FindWindowA" (ByVal СlаssИмя , ByVal WindowИмя As String} As Long rDeclare Fцnction GetWindowRect Lib ;'user32" ('. ~ · · ByVal hWnd As .Long, _ . Rect.. As Rect} As Long tt: ;.~ ~· ., 1Private Dec lare Function FormatMessage Lib· " kernel32 " { Alias "FormatMessageA'' (ByVal dwFlags "As . Long, _ ByVal Source -As Long, ByVal Messageid .As Lohg, _ ~yVal Languageid As Long, ByVal Buffer As · String, ByVal Si ze As Long, ByVal Arguments As Long} As Long ~· :Private ТуРе Rect > •Left As Long Тор As Long . ,Right As Long
374 Глава 16 ,.· ·'\'·~ вottbm y ·As LO'ng End -Type rPrivate Sub PrintRect(ByRef aRect As Rect) Call MsgBox ( "Границы И размеры : " & vbCrLf & " Левая: " & aRect. Left & vbCrLf & " Правая: " & aRect.Right & vbCrLf & " Верхняя : " & aRect.Тор & _ vbCrLf & Нижняя: " & aRect.B.o _ttom & · vbCrLf & " Ширина: " & (aRect.Right - aRect.Lef t) v bCrLf & "Высота: " · & (aRect.Bottoin - aRect.Top)) . 1End Sub ' . Sub ShowExcelWindowSize() Dim . hWndAs Long Dim aRect As Rect hWnd =· FindWindow( ;,XLМAIN", Application.Caption) ·If hWnd = О Then . Call MsgBox(LastDLLErrText(Err .LastDllError)) Else call GetwindowRect (hWnd, aRect) Call PrintRect(aRect) End If End .Sub . ;Function LastDLLErrText(ByVal Kcror!==ode As L9ng) . As Dim .Buffer As String * 25? Dim Result As Long : .,. ' ~ . Result = . FormatMes sage (FORМAT_MESSAGE_FROM_SYSTEM, О& , О, Buffer, 255, 0) LastDLLErrтext = Left (Buf fer , Result ): Полный код этого примера находится в модуле Modu l eЗ в книге Ex amples. xls, доступной на сайте Wгох по aдpecyhttp://www. wrox. com . К сожалению, в разных версиях Windows функция Err. LastDllError инициализи­ руется различными значениями. Например, если в предыдущем примере в вызове функ­ ции FindWindow изменить имя класса на XLМAINTEST, можно предположить, что в ре­ зультате возникнет ошибка " Невозможно найти окно " ( "UnaЫe to find window" ). Именно такое сообщение появится в операционной системе Windows NT 4.0 . Но в опе­ рационной системе Windows 98 информация об ошибке не предоставляется и возвраща­ ется стандартное сообщение " Операция успешно завершена " ("The operation com- pleted successfully"). В большинстве_ случаев информация об ошибке предоставляется, как будет показ~но в следующей главе. Сокрытие вызовов API в модулях классов Если в приложении приходится использовать большое количество вызовов API, код может очень быстро потерять стройную структуру . Большинство разработчиков предпо­ читают скрывать вызовы API в модулях классов . Такое решение предоставляет ряд пре­ имуществ, а именно :
Программирование с помощью Windows API 375 О объявления и вызовы API скрываются от основного кода приложения; О модуль класса может выполнять операции по инициализации и очистке, улучшая стабильность приложения; О большинство вызовов API принимают большое количество параметров . Некото­ рые из этих параметров имеют одинаковое значение при всех вызовах функции. Модуль класса может предоставлять доступ только к тем параметрам, которые должны меняться приложением; О модули классов могут храниться в виде текстовых файлов или в Code Libгю:ian (при использовании Office Developeг). Модуль класса предоставляет выделеннь!Й набор функциональности, который может использоваться в будуших приложениях: ' В следующем примере показан код модуля класса для работы с временными файлами. Пред оставляется сЛ:едующая функциональность : О создание временных файлов в принятом по умолчанию временном каталоге Win- dows (ТЕМР); О создание временного файла в указанном пользователем каталоге; О получение пути и имени временного файла; О получение текста ошибок, которые могли произойти при создании ~ременного файла; О удаление временного файла. Создайте модуль класса, который называется TernpFile. Скопируйте в модуль сле­ дующий код (этот класс также доступен в книге Exarnples. xls, которую можно загру­ зить на сайте издательства Wгох по aдpecyhttp://www. wrox. corn). roptiorl' .E: X'i:)й c :Гt;;'':C~"-"'' JГ Private f.· · Alias ByVaJ: ByVal !Private Decl~re Funct:.ion GetTempFileName t ~~~~~:~ ;:~~т,~:~~~~1~~~еА" (- .. ~' ByV9-i · Prefi.xString As String; ' i-,' . ByVal Uniqu·e As Long, ._ . ByVal ~ TernpFil~arne As String) '. >;' ' .. · ;} , ~Privci.t,e, 'rieclare Functi,on FormatMessage · AJ ias "FprinatMessageA" ( ByVal Flags As Long, _ ByVal :Source As Long, ' _ · вyva1 - мessagerd As . Lpng, ,..,,, , By~al . Languageid As Long, · ByVal Buffer As String, _ §yVal Size As Long, _ . ByVal Arguments As Long) As ' Long . . . :const FORМAT_MESSAGE_FROM_SYSTEM t Рtщ , 'r~!}l:e_R_ath~-~E!. Str:j,_n_g .
376 Глава 16 Dim TempFile As . String Ъim ErrorMessage As String ;пJm .тi(J.yμp~ As . В<;юlеар. Одним из преимуществ использования модуля класса является возможность выпол­ нения операций на этапе инициализации. В данном случае на этаnе инициализации оп­ ределяется расположение каталога ТЕМР. Если пользователь не указал собственный ката­ лог, временные файлы создаются в каталогеТЕМР. II'rlvat."e' stitГ cias'Б:_rnitiaiizfi< >-:, · Dim Buf fer As String * 255 ' Dim ·Resul t ,As Long , Result = GetTempPath(255, Buffer) LastDLLErrText ( Err, . LastDllError) · Эта подпрограмма создает временный файл и возвращает его имя (включая путь). В самом простом случае для создания временного файла достаточно вызвать этот метод: ~0цы :Гс F'tinct:Ion· . ~rea't.ёFi Iё о ·· лiГs t.r·111g . r : Dim Buffer As string * 255 · Dim Res.ul t As Long Result = GetTempFileNaпie(TempPath, О, Buffer) if R.esult; = о Then ErrorMessage = Last.DLLErrText (Err. LastDllError) Els'e . · . </· ' · ' · ' TempFile = . . Left(Ijuffer, IriStr(l, Buffer, Chr(O)) - 1) ErrorMessage = "ОК" TidyUp = 'J'rue CreateFЦe тempFi1e If ,. . . ' Модуль класса может предоставлять набор свойств, которые позволяют вызывающей подпрограмме получать и модифицировать параметры создания временных файлов. На­ пример, вызывающей программе позволено выбрать каталог для создания временного файла. Это поведени . можно расширить, сделав свойство доступным только для чтения после создания временного файла. Тогда при попытке модификации свойства будет вы­ даваться сообщение об ошибке . Использование процедур Property в модулях классов рассматривалось в главе 6. :i>ubllс j:>J;:ope.rty"' G~t: · J?afh ( г·As ·st.ring ··· fi\ )ath = LeJ;t (TempPath ,' Leп(TempPath) - 1') · ;End P:i;-?perty с'-:.,·...,«' rPi.iblic ··Property>'; 'i. ."et Path (ByVal TempPath = NeWPath , · · ~·· > J:'f ·Right(TeщpPath, 1) <> "\ '' !,... · · .· TempPath ., ; TempPath & <"· -"'+' End: If '>f' ' . . Ч',;цс1-, Р.ЕС>Р~~t;у.,,, .... :: . ·~.
Программирование с помощью Windows API 377 Кроме этого, вызывающей подпрограмме предоставляется возможность чтения име­ ни и полного имени (включающего путь) временного файла. ;"]~i1blic -Р1?6р.е!:.1:.у Get Nд.me· (T·-· дs ··-·s· Er-iЬ.g· '··-~··ж--·-· ~, ; Nam .e · = Mid(TempFile, Len(TempPath) + 1) i.End Pr;operty · · · ! : puЫic Property Get FullName () As String FullName = TempFile :1';1,1c1 _ .PJ:"OP~J:"_ty .. , . Также подпрограмме предоставляется возможность чтения сообщений об ошибках: i!>ti:Ьliё Propeit.'{ Get ErrorтextO - дs "sfiln·,;г · --- · · ErrorText = ErrorMessage Erid.. J?rppцty . . • Вызывающей программе предоставляется возможность удаления временных файлов после завершения работы: J?ubllc · sиъ beiete '( J Оп Error Resume кill тernpFile TidyUp · = False \Eri_cJ. , Sub Next По умолчанию созданные временные файлы удаляются при удалении экземпляра класса. При этом вызывающее приложение может потребовать другого поведения, по­ этому стоит предоставить параметры, управляющие ·этим поведением: ; :Рu:Ь1Тс" Propert:Y det· тid'{ul)Fi.les( Г A.'iГвooie an "!;' :· --~·-··· = · 1 TidyUpFiles = TidyUp 1End Property ' PuЬlic Property Let TidyUpFil es(ByVal IsNew As Boolean) , TidyUp = IsNew i J?.n.<l. ?.:i;:.op~r.ty;_ . В коде обработки события Terminate выполняется удаление временных файлов, ес ­ ли вызывающий код не потребовал обратного. Этот код выполняется при уничтожении ' экземпляра класса. Если экземпляр объявлялся внутри подпрограммы, он будет уничто- жен при выходе объектной переменной из области видимости в момент завершения ра­ боты подпрограммы. Если экземпляр объявлен на уровне модуля, этот код будет вызы­ ваться при закрытии книги: P'i;lvate .s·и:ь· ciass_тerrnina t.e{Г ' '"-~ - If TidyUp Then Delete -J;;p.d_,_$~1;>- ·'" -'·•. -····- ·~· ····· .~=···· '""· ··· - Для извлечения· текста ошибки Windows API используется та же функция, которая • была показана в предыдущем разделе. :i>rivate 'Ftiiiction tast.J5i:L:Ei:rтexi:(вyval E:rioi'.c6Cie д5 ··ca·ng) дs st:г:Ln.g: Dim Buffer А~ String *255 Dim Result As Long Result = FormatMessage(FORМAT_MESSAGE_FROM_SYSTEM, О&, ErrorCode, О, Buffer, 255 , Q) LastDLLErrText EncJ. . Fuщ:::ti.on. Left(Buffer, Result)
378 Глава 16 После того как модуль класса включен в проект, вызывающая процедура может нич~­ го не знать о функциях Windows API: :Ptiь1icsuЬ''тestтeffii:>:PiieЛ .'"' - ., .",,,,.. · ·Pim ·Obj e'ct As New TempFile Н oьject.CreateFile = "" Th~n .· ,\Call . MsgBox ("При создании временного файла прои.зоШла ·~оШИбкаi " & vbcr.L .f & obTempF.ile'. ErrorTextJ Elfзe· ;· · · · · · •· : Cail MsgBox ( "с'оздан временньrй файл " & Obj ect. FullName End~ if . . ~.•, -1=. Zt- .>I:< В Windows ХР (и If других версиях Windows) будет получе1{ следующий результат: Создан временный файл C:\WINDOWS\TEMP\5024.TMP • Обратите внимание, что временный файл создан во время работы функцииСrеаtе- Filе. После завершения процедуры переменная Obj ect выходит за · пределы области видимости и уничтожается интерпретатором VВА. Удаление файла обеспечивается про­ цедурой обработки события Terminate - вызывающая процедура может ничего не знать о подпрограммах удаления временных файлов. Если подпрограмму CreateFile вызывать несколько раз, будет удален только последний временный файл . Для каждого временного файла необходимо создавать новый экземпляр класса. Для провоцирования сообщения об ршибке в подпрограмме TestTempFile можно ук~зать несуществующий каталог для создания временного файла: ;РuьГГс , suЬ;"°тeS"ti'empFiieT) Dim Object As New >:rempFile Obje_ct. Path = "С: \NoSuc~Path" . · . .· If Ob]ect.Cre~teFiie· =; "" Then·. _Са1 l MsgBox ( "В процессе со:Здания·· временного ф'айЛа " & _ Chr, (10) & Object.ErrqrText & . Chr(lO) ·& " : произошла ошибка ") Else · · Call MsgBox ( " Создан временный файл " & Obj ec·t . FullName) ~ EndIf ,]";nd __S\lb В этот раз выдается осмысленное сообщение об ошибке (рис. 16.1). ,,. _. ________ ---~~ -,,. - N ···- Л- ~- - ~ Ml~ro~ftJ~!!.~~·A-v:, н •• ·"'• -··"· •~ В rтюцессе соэдания временного фаН.па nРQ11эошл~ ошибка: Не6ерно 3адано имя папки. Рш:. 16.1 . Сообщение, кОторое выдсrеrrи:я при muuбire во время создания времен:ноzо фаii.ла Примеры классов В этом разделе рассматриваются некоторые распространенные вызовы API. Обратите внимание, что в каждом случае определения функций и констант должны указываться в разделе De clarations в начале модуля.
Программирование с помощью Windows API 379 Класс таймера высокого разрешения При тестировании кода может потребоваться измерение времени выполнения раз­ личных подпрограмм. Обычно такое измерение требуется для определения узких мест в производительности. Интерпретатор VВА предоставляет две функции, которые могут использоваться в качестве таймера: О функция Now возвращает т~кущее вре ~ я и имеет разрешающую способность в 1 се­ кунду; О функция Tirner возвращает количество миллисекунд с последней полуночи и име­ ет разрешающую способность примерно в 1О миллисекунд . Ни одна из этих функций не является достаточно чувствительной для _того, чтобы измерять скорость работы подпрограмм VBA, если подпрограмма не запускается не­ сколько раз подряд. Большинство современных компьЮтеров оборудованы таймером высокого разреше­ ния, которьrй обновляется тысячи раз в секунду и доступен через вызов API. Эти вызовы можно реализовать в модуле класса, что позволит другим подпрограммам получать дос­ туп к таймеру высокого разрешения. Модуль класса HighResTimer ro:Pt.Ic>rгБx-p 1-:-rc:1т:-· · -- - ~-. . iPrivate Declare Function QueryFrequency Lib "kernel32" ,,. Aliai;; "QueryPerformanceFreqЦency" ( · ByRef Frequency As Currency) Ар Long ~~ .. J,·· ' • iPrivate Declare Function Qu.eryCounter 'Lib "kernel32" '-, Alias "QueryPerformanceCounter" · ( _ . 1"h .-~ ~~YB.~t:..~~:;:: ~.o~:rill~Ч19§.~Q}JЦ._~.!:-:,~ :.,}~~-;:~"~c,y_} . /:::? , L01:19 Обратите внимание, что в файле win32api. txt эти определения показаны с ис­ пользованием типа данных LARGE_INTEGER , а в предыдущем примере применялся тип Currency. Тип LARGE_INTEGER является 64-разрядным типом данных, который обычно состоит из двух чисел типа long. Тип данных Currency в интерпретаторе VBA также использует 64 двоичных разряда, поэтому его можно применять вместо типа LARGE_INTEGER . Отличием является масштабирование типа данных Currency вниз с коэффициентом 10000 и возможность стандартных арифметиче_ских операций над пе­ ременными типа Currency. !DI_m,·; rvFrequ\mёy ··As ~CU"!··reП:Cy .,,. . " --.~"··~-~ .,~. ~·т--""~-~ Dim Overhead As Currency 'Dim Started As Currency · lJ?:i.ЧL.9.~0J?!?_E?_g_;дs_ S:JJ.Ц~P.,E:t - ~- ' - " = " .~ - . ·- _, - ). Некоторое время необходимо для завершения работы вызова API. Для получения точных результатов. эту задержку стоит учитывать. Эту задержку и частоту таймера мож­ но определить в процедуре обработки события Ini t ial i ze. :Pr:lvaEe-sU:J:3~ciass::rnltlaHze {J . Dim Countl As Currency bim Count2 As Currency
380 ,, ;: End Глава 16 · ёа. п · Queryёounter (coU.nt:l) Call QueryCounter(Count2) Overhead = Count2 Countl Sub iPublic - s~ь Startтimer () · · Query Couriter Started End Sub , . PuЬlic sub StopTimer () t QueryCounter Stopped 1End Sub t ' Public Proper.ty 'Get Elapsed() ·As DouЫe Dim' Timer As Gurr.eпcy I .f Stopped = О Then 'QueryCounter Timer Else Timer = Stoppe·d Щnd If ' If Frequency > .а· Then. Elapsed. = (Timer · - Started - Overhead) / ~ End If ,Еjш:1 i:r cii?5':r "J:y о&& : .~.•.• ~ •• При подсчете прошедшего времени значение таймера и частоты кратно 10000. ПрИ делении значений получается результат в секундах. Класс таймера высокого разрешени.я может использоваться следующим образом: ·su.t> тёs'f нighResтime r ( J. Dim I As Long Dim Object As New Object.StartTimer ForI =JТо10000 Next I dbject.Stopтimer Debug.Print "10000 )~_Пd~eu}JJ>~~~-;,.;$ »!~·- Замораживание диалогового окна UserForm При работе с диалоговыми окнами UserForm содержимое экрана может изменяться при каждой модификации элементов управления в диалоговом окне, например, при добав­ лении элемента в список ListBo<e или включении/отключении элементов управления'. Значение свойства Application. ScreenUpdating не оказывает влияния на диалоговые окна UserForm. Класс FreezeForm предоставляет полезный эквивалент этого свойства. Модуль класса FreezeForm opt.:L on: E:xp't:lclt: . t' ' ~r:iv~te Declare Function FindWindow Li.Ь "user32" •• > A,.+_;i,?-_/?,..·:.i:Ь~<i;1-Jir,1_dP.w,A: . С ~ '· J. •• • , ./ , ·="·"'•&;·
Программирование с помощью Windows API 381 в.Уvа1 с:LаssИмя A:s str:Lng ; · _ ByVal WindowИмя As String) As Long \ I ,:: . -. . lprivate Declare Function LockWindowUpdate Lib · "user32" f ByVal hw.ndLock As Long) As Long ,! . .. .· ' PuЬlic Sub Freeze (Form As UserForm) Dim hWnd As Long · If Val.(Application. Version) >= 9 Then hWnd , = FindWindow( "ThunderDFrame;,, Else hWnd = FindWindow("ThunderXFrame", End If. 1End If hWnd > О Then LockWindow~pdate hWnd Sub JPuЬlic Sub UnFreeze () LockWindowUpdate О End -Sub ' Pri vate Sub Class_Terminate () UnFreeze :Enq _Sμl;? ~ж•~ .". (_ Для демонстрации создайте новое диалоговое окно UserForm и добавьте список и кнопку. Добавьте следующий код проце;nтры обработки события Click для кнопки: Фrivate ' Sub coffiman dButtoni_:cl.:Lck() Dim I As Integer ForI=1То1000 ListBox·l .Additem ''Item " & I DoEvents Next I ~!10 . Sub.. \ Строка DoEvents заставляет перерисовываться диалогов~е окно UserForm для де­ монстрации проблемы . В более сложных подпрограммах диалоговые окна UserForm пе ­ рерисовываются без применения DoEvents. Для предотвращения перерисовки окна можно модифицировать подпрограмму для использования класса FreezeForm. : P'rlvatё " stiБ c6Шma:nctвi.itf.onCcПc:k! Г -· ··- ·~ ' Dim Freezer As New FreezeForm . Freezer.Freeze Ме Dim I As Integer ForI=1То1000 ListBoxl.Additem "Item " & I DoEvents Next I ~?I1cJ. .§.1:11:> Это намного проще, чем включать несколько вызовов API в каждую функцию . Проце ­ дура обработки события Terminate позволяет обеспечить размораживание диалогового окна UserForm при выходе объектной переменной Freezer из области видимости. Та­ кой .способ замораживания диалогового окна UserForm может привести к значительному увеличению производительности. Например, при использовани:И не замороженного диалогового окна зiполнение элемента управления ListBox занимает 3,5 секунды. При замораживании диалогового окна эта процедура занимает 1,2 секунды. Данное преиму- \
382 Глава 16 щество необходимо рассматривать с точки зрения взаимодействия с пользователем, так как он при этом может решить , что компьютер завис, если в течение некоторого времени ничего не происходит. Для информирования пользователя о текущем состоянии 'можно воспользоваться свойствомАррliсаtiоn. StatusBar. Класс информации о системе Классическим примером использования модулей классов и вызовов API является предоставление информации о среде Windows , которая недоступна интерпр е татору VВА. Следующие свойства - типичные компоненты класса Sys Inf о. ; ' 09рати~е ~~и~а1:111е, Что, 6б~~вл~~И~ч<сiнстант "'~ ф;нк~iий API в эт~х'лроцедурах должн~1 ,6ЫТ';> у1;<азаНЫ В ' НаЧале ,1rO<!J,Y,f1,Я'; КЛасса.- Дriя ЯСНОСТИ ЭТИ объявл~НИЯ вме,сте _~р::~ответ,ству,ющ11м,и процер,.урам~. -- Получение разрешения экрана (в пикселях) · о"Р tlьп·-Ехрй'СI Е ,, =:- Получение глубины цвета (в битах) ~Private Decla're - Func _tion :petDeviceCap1'1 < :ВyVal hDC As Long' - -,, J;JyVal Index As -Long} . As,_ Long
Программирование с помощью Windows API 383 Получение ширины пикселя в координатах диалогового окна UserForm Private Declare Function GetDC Lib "uвer32; ( _ ByVal hwnd Ав Long) Ав Long Private Declare Function GetDeviceCapв Lib "Gdi32" ( _ ByVal hDC Ав Long, _ ByVal Index Ав Long) Ав Long Private Declare Function ReleaвeDC Lib "uвer32" ( _ ByVal hwnd Ав Long, _ ByVal hDC Ав Long) Ав Long Private Conвt LOGPIXELSX = 88 PuЬlic Property Get PointвPerPixel() Ав DouЫe Dim hDC Ав Long hDC = GetDC(O) ' Пункт равен 1/72 дюйма, и LOGPIXELSX возвращает ' количество пикселей на логический дюйм, поэтому ' разделите это значение ' для получения ширины пикселя в координатах диалогового ' окна UвerForm PointвPerPixel = 72 ! GetDeviceCapв(hDC, LOGPIXELSX) Call ReleaвeDC(O, hDC) End Property Получение регистрационного идентификатора пользователя rt>rivate''bё~Ia:re:· :FU:П.C:f±Бi). .ceTuse;г:Name~ ЫБ -"-ad.vapiз 2. ёiй;;· ,: _" . t Alias "GetUserNameA" ( , _ ·· · · · ByVal Buffer 'As String, _ B;YRef Size As Long) As Long ,,) , [PuЫic Property Get uв~rName () Ав String . ' Dim .Buffer As String * 255 ·. Dim Result лs Long Dim Length As Lorig Length .. =; 255 Result = GetUserName(Buffer ~ . Length) .. If · Length > О Then ·userName Left (Buffer, l;n<i,.l'"E\?t':§!EtY •• , =· Получение имени компьютера :J?r i v a t e ' b e claie 'iiun ё.ti ёn' бetc omputerN'a\iie "".LiЪ .. "kerneI з2 : : . Alias "Getc6mputerNaineA" ( - ByVal ' вuffer As String, Size As Long) As Long ;Piiblic Pr~perty Get ComputerName () · As String Dim Buffer As String * ' 255 Dim Result As Long Di111 ' Length As Long
384 Глава 16 Result ., GetcomputerName (Buffer, LengtЪ) If Length > О Then CoinputerName = Left(Buffer, Length) .ЕЕ~ . Pr,opert,y . · · 1 Эта подпрограмма может быть протестирована с помощью следующей подпрограммы (в стандартном модуле): :f>иЬнc · s:ц1г тestsysfnfoТJ ···~ •·· Dim Object As. New Sysinfo Debug.Print "Высота экрана " & Object.ScreenHei ght Debug.Print "ШИрина экрана " & .Object . ScreenWidth Debug.Pr i nt "Глубина цвета " &· Object.ColourDepth Pebug. Print •;' один пиксель = " & Obj ect. PointsPerPixel ~~· & ,, , пунктов" Debug. Pri nt ·: Имя пользов<J,теля " .·:.& Obj~ct.UserName Debug. Print· " Имя компьютера = " & · oьj ,ect. ComptiterName t.:g;_p -0 _ ., ~,~1;? :,__;_;-,;,,~ ;;,_~·..-.,) ~-J:,,"W;_:,:;.,k,~->-« ,;;':: °"' ·:. >-~·'f'>f·:,-_,·,_,,,__~_ .. .:>: ""''·· - ' , ~ -;J!., _ _ .- " м;<"_, ,.--А. Модификация стилей диалоговых окон UserForm Диалоговые окна UserForm в Excel не предоставляют встроенного механизма моди­ фикации внешнего вида . Единственным выбором является простое всплывающее диало­ говое окно с заголовком и кнопкой Х для закрытия. ·Правда, предоставляется возмож­ ность выбора между модальным и немодальным диалоговым окном. Вызовы API позволяют модифицировать диалоговое окно UserForm для получения любой комбинации следующих свойств: О переключение модальности диалогового окна , пока оно отображается на экране; О включение возможности изменения размера диалогового окна; О отображение и.Ли сокрытие заголовка и названия диалогового окна; О отображение небольшого заголовка, как на плавающих панелях инструментов; О отображение собственной пиктограммы; О отображение пиктограммы в элементе панели задач; О удаление кнопки [Х] , закрывающей диалоговое окно; О добавление стандартных кнопок для разворачивания и сворачивания диалогового окна . Пример книги, в которой анализируется использование этих свойств, можно полу­ чить на сайте h t tp: / /www. wr ox . com . Ниже показаны ключевые элементы этого кода. Свойства окон Внешний вид и поведение окон управляется свойствами стилей (style) и расширен:нъtх стилей (extended style). Эти стили являются значениями типа Lo n g, в которых каждый бит управляет определенным аспектом внешнего вида окна . Внешний · вид окна можно изме­ нить следующим образо'м : О использовать функцию F indWindow для получения дескриптора диалогового окна \ User For m;
Программирование с помощью Windows API 385 О прочитать стиль с_ помощью функции GetWindowLong; О переключить один или несколько битов стиля; О заставить окно использовать модифицированный стиль с помощью функции Set - WindowLong; О воспользуйтесь функцией ShowWindow для перерисовки содержимого окна . Ниже показаны основные константы для каждого бита базового стиля окна: ~.-. ,.~б.i:Иiii;" ;:Ц.rtЯ · добавЛенИЯ-~ЗаГоЛов кiэ: ·. окна '· ,.. ""'""-· : Private Const WS_CAPTION As .Loщi = &НСООООО r~ стиль дюi добавления системного · меню · · . fP,riV!lt~ Const w;:; _ sYsMENU As Long ' = &НВОО . 00 k<.~ ' '~· :;_·" .·' _. ,, ~','' Стил ~: для добр.влени~ фреЙма · riереме~ного 'р<'iзм~ра ' ' P:Civate Const WS.:_THICKFRAМE As Long = &Н40О00 {• С::тиль для добавления кнопкИ сворачивания диалогов'ого r· • ркна в ' заголовок .. ... . ~J?,_riva~e con.st WS~MINIМIZEBOX As Ъong' = &н20009 k,/ '·· . . ;' '· .·,, !' стиль . для Добавления кнопки разворачивания диалодового '· '/ ;ов:на .в . заголовок ,.. . Private Const , WS_МAXIMIZEBOX " As Long = &HlOOOO L' Сбрасывается для ртображения пиктограммЬl в панели )Private ·const V>/S_ POPUP As Long = &НВОООО. 000 (i , , Сбрасывается для отобра:Жения пиктограммы в панели tRJ:.:iY~~-f;= ···c::oч§!::•.. YJ§_YI.eI.!?~~---As ;J" .oriя . •~- ~ l :J l.Q Q QQ. Q .oQ ~ . · ·· - Boт некоторые расширенные стили окна: ~· i"., ·э~.rtемеtгты·упр·ав~леН'~Я,~v:~РИ~·:с~:.ор~чив .ании··,~ акна~~ffl~~)~VХ --~·~:--v·· ~~··~~-,'1*,. ~~:v·т.~-;~г··~~ч ' Private Const WS_EX.c_DLGMODALF~ME '. As Long . = &Нl . t·:. "<' ~::.'.: >~;·:·>?. .. . . f• Окно приложения: отображаетс;Я в · п.i!нели за.дач !Pri va te Cons t WS_EX_APPWINr;юw ::As д;ong т .. · f;(:l409.0 О ';H~i Обратите внимание, что это только подмножество возможных стилей окна. Дополнитель­ ная информация доступна в документации MSDN по стилям окон (http: //msdn . mi crosoft. com/library/psdk/winui/windows_2v90 .htm) и в файле win32api . txt. Т~е в этих источниках отображаю-rся значения стилей. В следующем -примере показанные выше процедуры используются для удаления кнопки закрытия диалогового окна UserForm. Этот пример доступен в файле NoCloseButton. xls, который предоставляется на сайте издательства Wrox. fi3.Hvate c«5nst -ws ' cлPтroN- As r;0п·g: · = &;нсьа·О"Оа !Private Const WS_SYSMENU As .Long = &НВОООО i Private Const WS_THICKFRAМE As Long = &H40QOO tPrivate Const WS~MINTMIZEBOX As Long = &Н20000 •Private Const WS_МAXIMIZEBOX As Long = &HlOOOO i Private Const WS_POPUP . As Long = &НВООООООО ;Private Const WS_VISIBLE As Long = &НlООООООО :Private Const WS_EX_DLGMODALFRAМE As Long = &Hl ;Private Const WS_EX _APPWINDOW As Long = &Н40000 \;R_.J:::j. va~~ ,Con~ t;._ .W 9 . ~_ E : ;CTQ()L _\rV.INDOW }\s Т,.ong = @8.Q . .
386 Глава 16 . Tf Val (Applic,;:i.tion. yer~ion) >= 9 Then · hWnd - FindWindoiJJ ( '' Tli.~ride'rDFrame '' , · Else · · · (EpQ hWnd End I·f 'style = На рис. 16 .2 показан результат работы кода. Класс FormChanger UserForm1 - ~ Рис. 16.2. Диалоговое 01СН0 UserForm без 1СНопки закрытия 01СНа Как было показано ранее в этой главе, вызовы API намного проще использовать через модуль класса. Класс FormChanger доступен в файле FormFun. xls на сайте издатель­ ства Wrox по адресу http: / /www.wrox.com/. В этом классе предыдущий фрагмент ко­ да повторяется для всех битов стиля окна, которые обсуждались в· предыдущем разделе. Все биты предоставляются в качестве следующих свойств класса:
О Modal О SizeaЬle О ShowCaption О SmallCaption О Showicon Программирование с помощью Windows API 387 О IconPath (для отображения собственной пиктограммы) О ShowCloseBtn О ShowMaximizeBtn О ShowMinimizeBtn О ShowSysMenu О ShowTaskBaricon Для использования этого класса в собственном диалоговом окне скопируйте весь мо­ дуль класса в свой проект и вызовите его из процедуры обработки события Activate, как показано в следующем примере. Этот пример доступен в книге ToolbarForm. xls на , caйтehttp: //www.wrox.com. ,i'Гivat ~"' sU:ь~·ьзerFor:m_::_лct1vatёT i ~~- '", \ biin Object .дs FormChanger ' ,set Obj ect =:New Formchangёr · Object'.SmallCaptiьn = True · • Obj ect. sizеаЫе = True , 1,· Set "Obj.ec t. For~ = ' Ме ;·~Р"9 ·.§ы.,?:~~*',,.~·: .. -...~ , ."~ ·, ;; Диалоговые окна UserForm переменного размера С выходом Office ХР компания ' Microsoft предоставила возможность изменения раз ­ мера диалоговых окон Открыть файл (File Open) и Сохранить как (Save As) : Окна запо­ минают положение на экране и размер между сеансами, что значительно увеличивает удобство использования этих окон. Применение показанных в предыдущем разделе вы­ зовов API и модуля классов для сокрытия низкоуровневой реализации позволяет пре­ доставить пользователям те же удобства при работе с диалоговыми окнами . UserForm. Одной из интересных особенностей объекта UserForm является наличие события Resi ze в то время, как у окна отсутствует свойство, показывающее ·возможность измене­ ния размера. Теоретически событие Resize никогда не возникает. Как было показано в предыдущем примере, можно предоставить собственное свойство SizeaЫe . Для этого достаточно установить флажок WS_THICKFRAМE. При этом процедура обработки собы­ тия UserForm_Resize вызывается каждый раз, когда пользователь меняет размер диа­ логового окна (при перемещении окна на экране это событие не возникает). В ответ на возникновение этогQ события можно изменить размер и/или положение элементов управления диалогового .окна для максимального использования нового размера. Существует два подхода к изменению размера и/или положения элементов управле­ ния: абсолютный и относительный.
388 Глава 16 Абсолютные изменения При абсолютном подходе можно создать код, который .будет менять размер. и поло­ жение всех элементов управления диалогового окна относительно новых размеров окна и друт друта. Рассмотрим простое диалоговое окно, на котором присутствует элемент управления Li stBox и кнопкаОК (рис. 16.3). 1г· ."' ] Рис. 16.3 . Диалоговое о~сно, поддержи­ вающее изменение размера Ниже показан код для изменения размера и перемещения двух элементов управления -с использованием абсолютного подхода: L~J;Iyat:e: 'sиь=u~ve~~4rm:'Rё$I.zeЛ ·~ ····:,.,. .., ~ ~··.·;:.Co'nst Gap'' = -.,fii' ., . > pn Error Re~щne Next . · . CommandButton1 . Le·ft = (Ме. InsideWidth - CornmandButtonl. Width) \;>Con1mandButto1;1J \ TOp0 " ме. InsideHeig-pt - Gap - · · o~Э:ri:aвutton:l.Й ~ igbt . . · J:,is,tBoxl . w:ldtlJ, .: =· t -re . InsideWidt:Ъ Ga p * 4 . L1i;;tl;!oxl.Heighty'7' coпunandButtonl.Top - Gap * 2 L~p.qAA~~~Ч:.O:~~;;~·.... ;i , ' ;,с_:-;· , :·...;.и_;.._,.._,~. .А••~А. Этот код работает, но имеет ряд серьезных недостатков . О Для ка.ждого элемента управления, который меняет положение или размер , необ­ ходи~ю писать отдельный код. Для больших и сложных диалоговых окон эта зада­ ча может стать утомительной. Пример такого кода показан в книгeFormFun. x ls . О Размер и положение элементов управления часто зависят от размера и положения друтих элементов управления (например, высота списка ListBox зависит от верхней границы кнопки ОК). О При модификации формы через добавление или перемещение элементов управ­ ления соответствующие изменения придется вносить в код изменения размера . Например, для добавления кнопки Отмена (Cancel) рядом с кнопкой ОК придется добавить код перемещения кнопки Отмена (Cancel) и модифицировать код пере­ мещения кнопки ОК. О Не существует возможности повторного использования кода.
Программирование с помощью Windows API 389 Относительные изменения При относительном подходе к каждому элементу управления добавляется информа­ ция о возможном изменении размера и положения в зависимости от изменения размера и положения диалогового окна UserForm. В том же диалоговом окне два элемента управления поддерживают следующие относительные изменения: О кнопка ОК перемещается вниз на расстояние, равное изменению высоты диалого­ вого окна (это позволяет кнопке ОК оставаться в нижней части диалогового окна); О кнопка ОК перемещается в стороны на расстояние, равное половине изменения ширины диалогового окна (это позволяет кнопке ОК оставаться посредине диало­ гового окна); О высота и ширина списка увеличиваются так же, как и ширина и высота диалогово­ го окна. Эти операторы можно закодировать в одной строке, указывающей долю изменения каждого из свойств элемента управления (Тор, Left, Height и Width). Свойство Tag является удобным местом для хранения такой информации. Это позволяет описывать поведение на этапе проектирования. Если в качестве названий свойств использовать Т, L, Ни W, а в качестве процента. изменения - десятичное число (если изменение составля­ ет 100%, число не указывается), следующие значения свойства Tag можно использовать для описания поведения простого диалогового окна: Tag=HW Tag=HL0.5 При возникновении события UserForm_Resize код рассчитывает изменение высо­ ты и ширины диалогового окна и перебирает все элементы управления, меняя значения Тор , Left, Height и Width, указанные в сво;йстве Tag элемента управления. Выпол­ няющий эту операцию класс CFormRes i zer показан ниже. Этот подход обладает несколькими преимуществами: О поведение каждого элемента управления при изменении размеров диалогового окна определяется на этапе проектирования, когда диалоговое окно можно про­ сматривать одновременно со свойствами элемента управления; О изменение размера и положения каждого элемента управления описывается неза- . , висимо от других элементов управления; О элементы управления можно добавлять, перемещать и удалять без модификации ко­ да изменения размера или из.менений в поведении других элементов управления; О код изменения размеров использует одинаковый подход ко всем элементам управ­ ления; О каждое диалоговое окно UserForm применяет один и тот же код изменения раз­ мера, котор:Ьrй может быть реализован в виде отдельного модуля класса. Класс FormResizer Реализация обработчика изменений размера в виде отдельного модуля класса позво­ ляет обрабатывать любое диалоговое окно UserForm. Для этого в коде диалогового окна достаточно добавить шесть строк для создания и вызова экземпляра класса. Кроме этого, в свойстве Tag каждог~ элемента управления необходимо описать поведение при изме­ нении размера диалогового окна.
390 Глава 16 Класс FormResizer предоставляет следующую функциональность: О ' разрешает изменен~е размера диалогового окна; О устанавливает начальные положение и размер диалогового окна, если диалоговое окно уже отображалось на экране; О меняет размер и положение всех элементов управления диалогового окна в соот­ в'етствии со значением свойства Tag; О сохраняет размер и положение диалогового окна в системном реестре (эта инфор­ мация будет использоваться при следующем отображении диалог?вого окна); О позволяет вызывающему коду передавать имя раздела системного реестра, в кото­ ром будут сохраняться параметры диалогового окна; О запрещает изменение размера диалогового окна, если ни один из элементов управ­ ления не настроен на реагирование в этих изменениях; О останавливает изменение размера, если один из элементов управления достиг ле­ вого или верхнего края диалогового окна, или при изменении размеров элемента управления до О. Ниже показан код класса FormResizer. Смы сл каждого раздела п ередается в коммен­ тариях. Код класса доступен для загрузки на сайте http : / /www. wrox . сот (файл н азы­ вается FormResizer. xls): r.. '/ ). .. ' .. ."· " Pri:va.te beclare' F1;щ.ction , GetWindowLong Lib Alias·u ·:GetWindowLopgA;, ( .:_. ·· вуvа1 hWnd лs ' Long, _ .· . ByVali'Index AS, L~:mg) As ' L<;:mg ,,
Программирование с помощью Windows API 391 (··,>.~ ...,,,...гх~'1'~· .. ,. ... , .. 't>ublic E'roperty·' Get' Re;is~ryKey ( ).· As \; ;· RegistryKey <= Regi9tryKeyField ~~~~. Propej;ty" · jJ?ilb1ic .Pri;Jperty .Get Form () As . Object ;'· Set Fdrm = FormField ' End PrqpertY, · Form(Value As StringSizes As String Dim ·: Sizes As Variant · Dim : Style As Lpng · Set \•·orihField = Value · !f Val (Application.Version) < 9 Then · · · 'Excel 9·7 · , ·F OfJ!\Handle ·= findWind.ow ( "Thuч.derXF,rame :•, " .El:se . . . . . , " ' ' Более новые версии '· ЕХ:сеl, включая Excel 2003 . . . F.orm.Handle = FindWindow( "ThunderDFrame", FormField.Captiщ1) : En.cIIf · · · Style = . GetWii:idowLong(PormНandle, GWL....;STYLE) Style. = Style Or WS_THICKFRAМE cд:l·l SetWindowLong (FormHandle, GWL_STYЦ:, Style) , ,' ··~ StringSizes = GetSetting (RegistryKey, " Fo.rms -" , FormFi.eld.Имя, width '= FormField. widtЬ Height = FormField , Height StringSizes <> ': " , Then Sizes = Split(StringSizes, "; ") ReDim :Preserve i. sizes (О То з) · FormF'iel'd.Top . =' Val(Sizes (О)) FormField. Left ~ \va.:l (s:Lzes( i )) Fo.rmField. Height ·:,, ,· yal(Si,zes' (2)j . Fo~Field.Width = Val (sizes (ЗJ )' · •· FormField. s .tartUpPo$i tion =' О · End If ... . ~; End Property r, ·.. ·· · PuЫic Sub F:O,rmResize () ;/; Dim WidthAdjustment As DouЫe .· ·Dim HeightAdjustmeni: As .Doubie ' Dim SomeWidthChange As Boolean Dim·, soineнeightChange .As Boolean Dim Tag . As· String · ·'tJitn · size As string Dim Control As MSForins. Cont.rol . . i, . , If Resizing Then . Exit Sub · Resizing = True ' On Error Gо,ть FinaJ,ly HeightAdjustment = Form.Height - .: .,WJ .9t:J::iAdjus.til!e_Ilt , = FOZ::Il!.: !!idtJ'J.. -
392 Глава 16 Each Co~trol In Form.Controls таg = UCase(Control"Tag) If InStr(l, Tag, "Т", vbBinaryCompare) Then If Control . .Top + HeightAdjustment *ResizeFactor(Tag, . ';Т") Thep · ,1 Form.Height = Height . End·If SomeHeightChange If True If InStr(l, Tag, "L " , vbBinaryCompare) Then Then If Cbl}trol.Left + WidthAdjus.tment *ResizeFactor(Tag, "L ") Form.wid.th = width End If SomeWidthChange True If . ' Tag, · " Н" , vbBinaryCompare) If Contrql.He,ight + HeightAdjustment о. Then Fo.rm . Height Height End If SomeHeightChange True If . If InStr(l, Tag, "W" , vbBinaryCompare) · Then Гf Control .. Width + WidthAdjustment * ResizeFactor (Tag, О Then Form. Width - Width . End 0 If ' s o m eWidthChange True If SomeHeightChange • тЬ:enForm.нeight Hei_ght SomeWidth~hange Theri Form " Width = Width ..·· . .: . нeight Width Tag, "L " , vbBiшiryCompare) Theii· ' " Left + 'wicJ,thAdjustment * Res:LzeFactor (Tag, ' -~""-~...;,.,~%•-No"~""' "'~ ······-- '~""~···'·~ '. ,. :,
Программирование с помощью Windows API 393 r··~·.· =·· IfinStr(l, . Height i~ Resi zeFactor (Tag , "н") • ·EndIf If InStr (1, та9' : "Н", vьвiflar:Yc·ampare) т:hen .Height + HeightA_Q,just~ent • Tag, "W" , vbBinaryCompare ) J'hen .' .Width .Width + WidthAdjustment , *Resiz.eFactor(Tag, ;, , ; ·,\... ' . . End If End With иехt Width = Form.Width Height = Form.Height ~ · With -Form Call SaveSetting (RegistryKey, "Forms", . Имя, s'tr(.Тор) . !~ .& Str( .Left) & ";" & Str 0 ( . Height) & ";" & Str( .Width)) . ' End With . , ' Finally: · Resizing False Sub Privat;e Function ResizeFactor(ByVal Tag As .String, ;~ ·ByVal Change As String) Dim I As Integer Dim D As DouЫe .I = InStr ( 1, Tag, Change, vbBinaryCompare) IfI >·О.Then. D = Val(Mid$('rag,, I + 1)) IfD=ОTheJ1,jy~1 >• :End н . .. · ResizeFactor D ,; ;ng .~uвcti_op. • _ Использование класса FormResizer Ниже показан код, который позволяет использовать класс FormResizer в модуле ко­ да диалогового окна UserForm: ,b.ini- ResГzer ·лs ForinResi ~er · . · ··· • · !Private Sub UserForm_Initialize () ;. Set Resizer = New FormResizer Resizer.RegistryKey = "Excel и VBA Справо1.J.ник . iiр6граммиста" Set· Resizer.Form = Ме '·J ·,:;. ;E:nd Sub r· Private Sub btnOK_ Click() Unload Ме ' End Sub
394 Глава 16 .Private : Sub ' u serF''orrn__:QueryClose(Cancei ''As 'rnteger r ' cioseMode As ..:i:nteger') .,. • Resizer. ForrnResize · · )~nd . sμь .., ·- ..., ." При использовании этого подхода в собственных диалоговых окнах UserForm стоит обратить внимание на несколько моментов: О изменение размера осуществляется через изменение значения свойств Тор, Left, Height и Width элементов управления в ответ на изменение размера диалогового окна UserForm; О информация для управления изменением размера элементов управления устанав­ ливается в свойстве Tag. Для этого использую'l'ся символы Т, L, Ни/или W, после которых указывается множитель изменения (если изменение не составляет 100%); О множитель изменения должен иметь формат США (в качестве десятичного разде­ лителя должна использоваться точка); О если ни один из элементов управления не содержит Т или Н в значении свойства Tag, диалоговое окно не будет поддерживать изменени.е вертикального размера; О. если ни один из элементов управления не содержит L или W в значении свойства Tag, диалоговое окно не будет поддерживать изменение горизонтального размера; О минимальный размер диалогового окна определяется первым элементом управле­ ния, который достит верхнего или левого края диалогового окна или получил раз­ мер О по вертикали или горизонтали; О предыдущая особенность может использоваться для задания минимального разме­ ра диалогового окна с помощью скрытой метки со значением свойства Tag, рав­ ным "HW". Размер метки показывает, насколько может быть у меньшен,о диалого­ вое окно. Если указать нулевой начальный размер метки, диалоговое окно будет поддерживать только увеличение . Другие примеры ' Вызовы API не обязательно помещать в модули классов, хотя это и очень удобно. В этом разделе рассматривается несколько примеров использования вызовов API в пре­ делах стандартных модулей. Изменение пиктограммы Excel При разработке приложения , которое перехватывает управление над всем интерфей­ сом Excel, можно воспользоваться следующим кодом для предоставления новой пикто­ граммы Excel: ;De'c1are~\Function ·F'iriciwinciow I.rь ·; :!.Iise·r:з·2 ;•;. ;· Alias "Fi'ndWindowA" ( ..:': >·· ...... ' ВyVal ClassNarne .As Str±ng, _: '! . - · ~ ., ~- вy:v.a.l . w:1.:ndowNarne As · Striщ{J .As ·-Long .beclare Funotio~ · · · Al ias · •: Exi:racticonA" .· ( · ·вyVal Insta'nce As Long ; - ; _ '- ·· вyVal ExeFileNarne As < stririg j ''· БуVа].. IconI'ndex лs · Long) As . Long . ~~· .·• · . . _:'~ . ;):.;.':>•,.щ"'.,._;. _ ·_·; _ _,"~ , -.~''"·*' ' · ··· · '""""i("·'· · ~y;.j~,V>. ..
Программирование с помощью Windows API 395 ;Ь:е~т~·~е· FuiiC, ti9n ·sendМ~s g;aiie' !; ,1.: · АЦаs · "$eridMessageA" ( _ ' · ·,:; 'вyValf'hWnd ·As Long;. .....:. ' ByVai . -Мessage ,As • 'Long; ByVal. wParain As Int.eger, ' вyVa,l lEarain As ' Lorig) ; As ' ~'< ' '' :,: :· н.,.' ... , kc:;oщ;t ,WМ_S}~;TICON ' = &Н:80 ~>~~ , .;~---;~:,.у,!> . +~. - ,.. ,· ~4~_., i:Puьli·c sub ' SetExcel.Icon' (ByVal ' ·, . Ьi:Щ А:. л·з,~L,ong · ·· · · 'дНn' liwnci As · Long , Dim hrcon,As Lon.g · означает нек6ррект'ный источник оиктограммы · hicon' » 1 Then · ., " ' Код . Уста н·авлив~е'т · большу~Ь (З2х32) • > и !>1ален~кую ,;(16х16) Щ'fJ\СТОграNo4ЬI Call SendMeqsage (h'Wnd, WМ_SETICON, .. Call SendМessage(hW.nd, WМ_SETIC::ON, 'Бrid If ·~. . .E.nd Sub· • ~, . 'cPu:Ьlic .Sub TestExcelicon () ~' ;· . ca+l. setExcelicon(Thisw'orkbook.Pi=ith ~~~~.9.:-..:....е.:Ч~~~~;;>f~. t.?J - . : . , "" .~....,i".~~~л.. ,_,..,м.;;" ·"""" · "' .. ··""" ~.. -·~"·-~ k~ .;;/. :h~........с~...: . . . Воспроизведение файла .wav Excel не предоставляет встроенных методов воспроизведения ЗВ)'I<а. Ниже рассмат­ ривается простой вь1зов API для воспроизведения файлов . wav. Аргумент Flags позво­ ляет включить асинхронное и циклическое воспроизведение звука, хотя в этом примере используется значение О, приводящее к однократному синхронному воспроизведению ЗВ)'I<ОВОГО файла: illeC':L&re-в-u::r:ic-eiёn"~snCi-P1a:Ys·0u:11eз: ~йг "';г"n:mт'гa.11::1. 1·, ~tt:~ .-~~G~~:~~~~~~~rl~g~· ~ . ~, iз:Yv'ai F1ags As . Lorig) 'As. L.ong . · .;с , . isub . Play,Wav (ByVa1 WavJ;ileName As .Str'irig) .. ' Call sndPlaysou'nd(WavFileName, О) . . jEnd ' SUb . , 1)~"\ ' ;Sub TestWav ( )- .. .. .. ;. f .. Сэ,11 I>layWav{ThisWor.kpook. Path + ~.gpg,,_",§Y.l?~:m~. ~"'f»~ .~;_,.~T"~- .;~.~~- •~ 1! " ,..,_ _ ,,х"А Резюме Определенные в составе Windows API функции предоставляют полезные и мощные расширения к инструментарию разработчика VВА . В файле win32api. txt содержатся определения VВА для большинства основных функций. Определения остальных функ­ ций могут быть получены на основе версий в стиле С, показанных в библиотеке MSDN.
396 Глава 16 Модули классов позволяют пользователю скрывать определения вызовов API и пре­ доставлять только простые фрагменты функциональности, которые легко повторно ис­ пользовать в приложениях VВА. В этой главе было рассмотрено несколько примеров классов и подпрограмм . Этого достаточно, чтобы начать использ<?вание функций Win- dows API в собственных прилоЖениях. Показанные примеры позволяют: О создавать файл в каталоге ТЕМР; О создавать таймер высокого разреШ:ения; О блокировать обновление диалогового окна UserForm; О получать информацию о системе; О модифицировать вн~шний вид диалогового oкнaUserForm; О создавать диалоговые окна UserForm переменного размера с минимальным объемом кода в модуле диалоговог,о окна; О менять пиктограмму Excel; О воспроизводить файл. wav. /
7. j Проблемы интернационализации Если предполагается, что приложение будет использоваться в других языковых средах, оно должно применять региональные параметры в каждой поддерживаемой языковой вер­ сии Windows с любым языком пользовательского интерфейса Excel. Любые ошибки в приложении, связанные с проблемами · интернационализации, не проявляются на компьютере разработчика, если специально не проверять их существо­ вание. Но клиенты обнаруживают эти ошибки практически немедленно. Комбинация региональных параметров и языка пользовательского интерфейса Excel называется "локалью" пользователя. В этой главе показано, как создавать приложения VВА, не зависящие от текущих региональных параметров и языка интерфейса. Для этого будут проанализированы возможности Excel·, касающиеся интернационализации, и вы ­ делены области Excel, где поддержка интернационализации отсутствует или является ог­ раниченной. В большинстве случаев для каждого ограничения суiцествует обходное ре­ шение, но некоторые ограничения настолько сложны, что самым лучшим решением яв­ ляется отказ от использования соответствующей возможности. Рассмотренные в этой главе правила должны быть включены в стандарты кодирова­ ния и использоваться всеми разработчиками в компании . Независимый от локализации код намного проще создавать с самого начала; адаптация существующего кода к различ ­ ным наборам региональных параметров может оказаться слишком сложной.
398 Глава 17 Изменение региональных параметров Windows и языка пользовательского интерфейса Office ХР В этой главе потенциальные ошибки будут демонстрироваться на примере следующих трех наборов региональных стандартов: Параметр США Великобритания Разделитель целой и д-робной части Разделитель разрядов Формат даты мм/дд/гг гг дд/мм/гггг Разделите ль даты Пример числа: 1234.56 1,234.56 1,234.56 Пример даты: 10 февраля 2004 года 02/10/2004 10/02/2004 Язык Windows и Excel Английский Английский Текстовое представление значения True True True Региональные параметры меняются в ди;uюговом окне Региональные параметры (Regional Settings) (в Windows ХР это диалоговое окно называется Язык и региональные стандарты (Regional and Language Options)), дqступном из Панели управления (Cont1·ol Panel). Язык пользовательского интерфейса Office ХР меняется в программе Языковые параметры Microsoft Office, которая предоставляется вместе с языковыми пакетами Of- fice ХР. К сожалению, для изменения языка операционной системы придется заново ус­ тановить ее на компьютер. · так~е. прогр~м;,л~1 ~Иf)~уализации ~омhь.ютера, ~ак Co~n-ectix Virtual РС ~ли VMW.a;~, зв0Ляют; устан9вить ' тестовую коп.ию 6перацИонноi1 : системы С , " нальными пара,.._\етрами, . не затрагИвая основнуЮ .·1<оnиtсi. , { '·" ,,,.. ' _, - ,, При тестировании приложения желательно использовать выдуманные региональные параметры, наhример: # - в качестве разделителя разрядов, ! - в качестве разделителя целой и дробной части и ГМД - в качестве формата даты. При этом очень легко опреде­ лить, применяет ли приложение установленные региональные параметры или встрdен­ ные принятые по умолчанию. Для полноты проверки стоит воспользоваться другой язы­ ковой версией операционной системы Windows. Обработка региональных параметров и языка интерфейса Windows В этом разделе рассматривается создание приложений, работающих с различными_ региональными параметрами и языковыми версиями Windows. Возможность такой рабо­ ты является абсолютным минимальным требованием к созданию приложений.
Проблемы интернационализации 399 Идентификация региональных параметров пользователя и языковой версии Windows Вся необходимая информация о региональных параметрах и языковой версии опера­ ционной системы доступна ;:ерез свойство Application. International. В справоч­ ном руководстве перечислены все доступные значения, хотя в реальных приложениях используется только часть параметров. Чаще всего применяются: О Xl CountryCode - языковая версия Excel (или активного языка интерфейса Office); О XlCountrySetting - текущее расположение из региональных параметров Windows; О XlDateOrder - один из форматов даты. Обратите внимание, что не существует константы, определяющей установленную языковую версию Windows (но при необходимости эту информацию можно получить че ­ рез вызов функции Windows API). Функции преобразования VBA с точки зрения интернационализации В интерактивном справочном руководстве рассматривается использование функций преобразования VВА для перехода от одного типа данных к другому. В этом разделе речь идет ·о применен:Ии явного и неявного преобразования типов, а также влиянии регио­ нальных параметров на такое преобразование . Неявное преобразование Неявное преобразование является наиболее распространенной формой преобразова­ ния. При этом интерпретатор VВА вынужден выполнять преобразование данных в наи­ более подходящий формат. Вот типичный пример кода, в котором используется неявное преобразование: {E>йЬlic -sиs·-:r!ПI?iiёIЪcc{riversTon(Г:Г"W'YVJ'Yi ;.• '; ;: D;Lm.. MyDate As Date ·. · ··-,. й ··"' h. ·. -c:мyt:Jate = DateValue ( "Jan · 1 , :2004 »' '' Ca·ll Msg'вox ("Это пер,ВЬIЙ день эт L:§Ы.Е!:_~\l);;Гс':~._~"""' =-i;. _,;,__;,· . При преобразовании числа в строку в Office ХР интерпретатор VВА воспользуется региональными параметрами для. создания правильно отформат:Ированной да,ты, числа или текст'\ "True" или "False", соответствующего языку в региональных параметрах . Та­ кой подход оказывается оправданным, если строка должна выдаваться с использованием принятого в данной местност:И форматирования. Но если код предполагает, чт·о в ре­ зультате преобразования будет получена строка, формат которой применяется в США, работа кода завершится неудачно. Разработчик, Использующий региональные стандарты США, не заметит ра.зницы. Но эта разница станет сразу заметной для клиента. При создании кода для нескольких версий Excel неявное преобразование типов при­ водит к еще большему количеству проблем. В предыдущих версиях использовались фор­ маты чисел, соответствовавшие языку Ехсе!, который применялся на этапе выполнения кода (эта информация спрятана глубоко в объектной библиотеке Ехсе!). Такой формат может отличаться от форматов, принятых в США, и от локальных форматов. Кроме это-
400 Глава 17 го, изменение региональных параметров Windows не оказывало никакого влияния на ис­ пользуемый формат. Внимательно следите за типами данных, которые возвращаются , и используются в функциях Excel и VВА. Например, функция Application. Get"OpenFilename воз­ вращает тип Variant, содержащий значение False типа Boolean, если пользователь щелкает на кнопке Отмена (Cancel), или строку с названием выделенного файла. Если сохранить этот результат в строковой переменной (тип String), значение False типа Boolean будет преобразовано в строку в соответствии с региональными параметрами Windows. При этом конечный результат преобразования, скорее всего ,- не будет равен строке "False", с которой сравнивается возвращаемое значение функции. Для избежания этих проблем найдите типы возвращаемого значения и параметров функции в окне Object Browser (Просмотр объектов) и откажитесь от неявного преобра­ зования через использование совпадающих типов или выполняйте явное преобразqва­ ние в тип переменной. Следование этим рекомендациям предоставляет (как минимум) три решения для использования функцииАррliсаtiоn. GetOpenFilename. Типичный код, l)Оторый может быть запущен в Норвегии: m1·т f':tiё:Naпie дs str:tng -· ,., · · " ·- •-· FileName · = APP1icatioh. GetOpehFilename () · f i:ileName = "Fali>e " Then · ;;"" !1,,,,,~,,.;, ,: . о: ~.х'!:::.о::="".~"·:~~'·"· ,~"-..м""'";"'»Ю:с~=- Если пользователь щелкает на кнопке Отмена (Cancel), функция GetOpenFilename возвращает значение False типа Boolean. На основе региональных параметров Win- dows приложение Excel выполняет преобразование значения в строку и присваивает ре­ зультат преобразования переменной. В Норвегии переменная будет содержать строку "Usann". Это значение не совпадает со строкой "Fa lse", поэтому приложение решает , что предоставлено действительное имя файла, и рано или поздно аварийно завершит работу. Решение 1: , 'JSTm'Fl1eNamё лs' vari~aпt-- . FileName!; = ' fфplication.GetOpenFileName() If FileNdme ""'False Then ' Сравнение значений ' одного Решение 2: Решение 3: ' · соотЕ}етствуiощу~р региональным ' с'r:андартам СJМ, ' Получили значение Boolean / значит "• -, поль·зователь щелкнул . . ' на кнопке Отмена , (Cancel ):
Проблемы интернационализации 401 Обратите внимание, что в каждом из трех случаев ключевым моментом является со­ поставление типа возвращаемого значения функции GetOpenFileNarne (тип Variant) с типом собственной переменной. Если в функцию GetOpenFileNarne передается аргу­ мент MultiSelect: =True, необходимо использовать последнее решение. Это связано с тем, что переменная FileNarne будет содержать массив имен файлов или значение False типа Boolean. Попытка сравнения массива со значением False или преобразо­ вания массива в строку приведет к ошибке времени выполнения. Строки с датами При создании кода на языке VВА даты можно записывать в формате #О 1/О1/2 О О 4 #. Очевидно, что эта строка соответствует 1 января 2004 года. Но что означает строка #02/01/2004#? Это 2 января или 1 февраля? На самом деле это 1 февраля 2004 года. Связано это с тем , что код VВА использует региональные стандарты CillA вне зависимо­ сти от региональных парам:етров. В результате приходится применять форматирование строк дат , принятое в США. Если ввести дату в другом формате (#гггг-мм-дд#)·, Excel выполнит автоматическое преобразование в формат #мм/ дд/ гггг# . Но что если британец или норвежец введет дату в локальном формате (а это обязатель­ но произойдет, когда сроки сдачи работы станут ближе)? Если ввести строку даты в приня­ том в Норвегии формате #02. 01 . 2004#, будет выдано сообщение о синтаксической ошибке, которое, как минимум, подскажет о внесенной ошибке. Но если ввести дату, соот­ ветствующую региональным стандартам Великобритании (дд/мм/гггг), все станет еще ин­ тереснее. Интерпретатор VВА распознает дату и не выдаст сообщения об ошибке, но "обратит внимание", что день и месяц перепутаны местами; интерпретатор автоматически поменяет их. Поэтому ввод дат с 1О января 2004 по 15.января 2004 дает такие результаты: ·;~--· Введенная строка Выводимая строка Реальный смысл 10/1/2004 10/1/2004 1 октября 2004 года 11/1/2004 11/1/2004 1 ноября 2004 года 12/1/2004 12/1/2004 1 декабря 2004 года 13/1/2004 13/1/2004 13 января 2004 года 14/1/2004 14/1/2004 14 января 2004 года 15/1/2004 15/1/2004 15 январЯ 2004 года Если такие строки равномерно распределены по всему коду, ошибка останется неза­ метной. Намного проще отказаться от использования строк с датами и перейти к использован:ию функций VВА DateSerial (Year, Month, Day) или DateValue (DateString), где строка DateString является однозначным определением даты, например, "Jan 1, 2 О 04 ". Обе функции возвращают соответствующее число типаDаtе . Функции lsNumeric и lsDate Эти функции проверя19т, можно ли преобразовать строку в число или дату в соответ­ ствии с региональными параметрами и языком интерфейса Windows. Всегда используйте эти функции перед преобразованием строки в другой тип . данных. Функции IsBoolean
402 Глава 17 не существует. Кроме этого, не существует функций, проверяющих форматирование числа или даты в соответствии с форматами США. Обратите внимание, что функция IsNumeric не распознает символ% в конце числа, а I sDate - Н3;звания дней недели. Функция CStr Обычно эта функция используется интерпретатором VВА для неявного преобразова­ ния типов данных . Функция выполняет преобразование типа Variant в тип S tr ing в соответствии с региональными параметрами Windows . При преобразовании типаDаtе используется формат "ShortDate", определенный в региональных параметрах Win- dows. Обратите внимание, . что при преобразовании значений типа Boolean получается текст "True" или "False" на английском языке. Результат такого преобразования не зависит от региональных параметров Windows . Сравните это поведение с неявным пре ­ образованием типа Boolean, при котором функция Msg_Box " I ат " & True выдает значение True на языке, указанном в региональных параметрах Windows (при использо ­ вании норвежских региональных параметров в результате вызова функции будет выдано сообщение "I am Sann " ) . Функции СDЫ, CSng, CLng, Clnt, CByte, CCur и CDec Каждая из этих функций выполняет преобразование строкового представления числа в соответствующий тип данных (кроме этого, функции поддерживают преобразование различных типов числовых данных). Строка должна быть отформатирована в соответ­ ствии с региональными параметрами Windows. Эти функции не распознают строки с да­ тами и символы%. Функции CDate и DateValue Эти функции выполняют преобразование строк в тип Date (кроме этого, функция CDate поддерживает преобразование других типов даты в тип Date). Строка должна быть отформатирована в соответствии с региональными параметрами Windows, а для на­ званий месяцев должен использоваться текущий язык интерфейса Windows. Имена дней недели не распознаются (если передать имя дня недели в качестве параметра, выдается сообщение об ошибке Туре Mismatch). Если в строке не указан год, используется теку­ щий год. Функция CBool Функция CJ?ool выполняет преобразование строки (или числа) в значение типаВоо lеаn. В отличие от остальных функций преобразования Сххх, в данном случае строка должна со­ держать слова на английском языке "True " или " Fa l s e ". Функция Format Эта функция выполняет преобразование числа или даты в строку. Формат указывает­ ся в качестве аргумента функции. В описании формата должны применяться только сим­ волы, используемые в США (m, d, s и т . д.), но в результате работы функции выдается строка , отформатированная в соответствии с региональными п<!!раметрами Windows (с правильными десятичными разделителями, разделителями тысяч и дат), а также на языке интерфейса Windows (для названий дней недели и месяцев). Например, в резуль­ тате работы следующего кода ~ региональными параметрами США выдается строка
Проблемы интернац·ионализации 403 "Friday 01/01/2004 " . При выполнении этого кода с региональными параметрами Норвегии выдается строка "Fredag 01. 01. 2004 " . МБQ-]:3Ь?С' Если строку с форматом числа не указывать, функция Forrna t поведет себя точно так же, как функция CStr (несмотря на то что в интерактивном справочном руководстве ука­ зано, что в этом случае функция ведет себя как функция Str), включая странную обра­ ботку значений Boolean, в результате которой вызов Forrnat (True) всегда выдает строку "True". Обратите внимание, что порядок компонентов даты не соответствует ре­ гиональным параметрам Windows, поэтому код должен определить используемый поря­ док компонентов даты перед созданием строки формата. Функции FormatCurrency, FormatDateTime, FormatNumber и FormatPercent Эти функции впервые появились в Excel 2000 и предоставляют ту же функциональ­ ность, что и функция Forrnat. Вместо строки формата функции принимают арГJ'1"1енты, определяющие конкретный формат. Значения аргументов соответствуют стандартным вариантам в диалоговом окне Excel, доступном по команде ФорматqЯчейкис>Числовой (FormatqCellsc> Numbers). Функция Format соответствует переключателю Дополни­ тельный (Custom) . С точки зрения интернационализации эти функции демонстрируют та­ кое же поведение, что и функция Forrnat, которая рассматривалась в предыдущем разделе. Функция Str Эта функция выполняет преобразование числа, даты или значения типа Boolean в строку, отформатированную в соответствии с регионiльными стандартами CIIIA. Ре­ зультат работы функции не зависит от региональных параметров Windows, языка поль­ зовательского интерфейса Windows или языковой версии Office. При преобразовании положительного числа слева добавляется пробел. При преобразовании десятичной дро­ би начальный ноль не добавляется. Следующая функц_ия является расширением функции Str. .B ее задачи входит добавление нуля и удаление начального пробела . Функция NumberToStri~g Эта функция, как и предыдущая, выполняет преобразование числа, даты или значе­ ния типа Boolean в строку, отформатированную в соответствии с региональными стан­ дартами США, но предоставляет дополнительный параметр, который может использо­ ваться для получения строки с помощью функции Excel DATE . Обычно эта функция ис­ пользуется при_составлении строк для свойства. Forrnula. tji:emp·~ :A~,----~t.X-'lt;tg, , >, . . ·:;,: ".>:-- ;-. , _:: -i ,,,__ __ _ --• ,,:,_. , , >~·-=' TypeNaineJValue) String" Т,hen Exit Furiction с,у Righ't(тypeName(Valu~}, ' 2) ::. . " ( ) " ~ Th~n ·Exit : Function' ... ,, . ' . . . , - ., ." . ' t.- . .,; ' -~; . If. :]isMissing (UseDateF'unction} UseDateFunction Temp = '' DATE('' Day(Value} & "} " . ·.
404 Глава 17 ЁisЕГ . - -~-··- ~· тетр = Triт(Str(Value) J If Left (Тетр, 1) = "." Then Тетр "0" & Тетр · If Left(.тeтp, 2) = " ." Then Тетр = " .0" & Mid(Temp, 2) End If End If NuтberToSt:ri ng iш_nd fuчc.t~o.n ,~~-··· Переменная Value имеет тип Variant и содержит преобразовываемое число, кото­ , рое может быть: О числом, которое необходимо преобразовать в строку с использованием региональ­ ных стандартов США; О датой, которую необходимо преобраЗовать в строку в формате мм/дд/гггг; О значением типа Boolean, которое необходимо преобразовать в строки "True " или "False". Переменная UseDateFunction имеет тип Boolean и включает или отключает обра­ ботку дат. При установке этой переменной в значение False функция NumЬerToString возвращает строку даты в формате мм/дд/гггг. При установке этой переменной в значе­ ние True функция NumЬerT oStr i ng возвращает дату как DATE ( гггг, мм, дд) . Функция Val Эта функция наиболее часто используется для преобразования строк в числовые зна­ чения. На самом деле она выполняет преобразование только строк, соответствующих ре­ гиональным стандартам США. Все остальные функции преобразования строк в числовые значения пытаются преобразовать в число всю строку. При невозможности такого пре­ образования функции выдают сообщение об ошибке . Но функция Val просматривает значение переменной слева направо, пока не найдет символ, который не может быть проинтерпретирован как часть числа. Многие символы, которые часто· встречаются при записи чисел, например символ $ или запятая, могут помешать преобразованию строки в число . Функция Val не поддерживает преобразование строк даты, соответствующих региональным стандартам США. · Кроме этого, функция Va l является единственной функцие й VBA, принимающей в качестве аргумента только один тип данных. В то время как другие функции принима­ ют тип данных Var i ant, функция Val поддерживает работу только со строками. Это значит, что любое переданное в функцию Val значение сначала преобразовывается в строку (выполняется неявное преобразование, а значит, зависящее от региональных параметров Windows и языка пользовательского интерфейса Windows) , после чего вы­ полняется преобразование с учетом регйональных стандартов США. Исnбл.~зq.вание функцн~ V~l fможет nрнвестн к нежелательн1>1м побочным эффектам (такЖ~ .нзвестным, как оu.iнбкИ), которые очень сложно обнаруж~ть, так"как код может_, npeкp.il<;нo работать на крмпьютере разработчика и отказывать. на другом компьютере с нн\:;1мJ-1 'региональным~ параметрами .Windows. ' " ·. . . N, '· ·,}' •· /{ ·· ··'····· "> _, ··;ц В данном случае переменная myDat e име ет тип Date и значение "10 ф е вр ал я 2 004 года " . Переменная myDouЫ e имеет тип данных DouЫ e и содержит значе­ ние 1.234.
Проблемы интернационализации 405 Выражение США Val(myDate) 2 Val(myDЬl) 1.234 Val(True) О (=False) Val ( "SomeText" ) о Val("6 Му St. ") 6 Функция Application.Evaluate Великобритания 10 1.234 о (=False) о 6 Норвегия 10.02 (или 10.2) 1 О (=False) о 6 Хотя обычно эта функция не используется для преобразования типов, тем не менее это единственный способ преобр азования строки даты , соответствующей региональным стандартам США, в число типа Date. Следующие функции представляют собой оболоч­ ки , которые используют этот метод oбъeк:aApplication. Функция /sDateUS Встроенная функция IsDate проверяет строку на соответствие региональным стан­ дартам Windows. Эта функция позволяет определить, содержит ли строка дату, отформа­ тированную в соответствии с региональными стандартами США. !1'}-!ьЦё -FuncETon .' isI5atёUs'{ в-YvaT'aь·a: 1:.e; ;-лs st:rlng}' лs -вoo ie,ii n - · m IsDateUS = Not IsError С _ . . . . · .. ~- ..· . Application.Evaluate("DATEVALUE("" ~'!51,J:J:ш;cti:_gц_ """"" Если переменная aDate содержит дату в формате, принятом в США, то функц:Ия IsDateUS возвращает значение True; в противном случае функция возвращает значение False. Функция DateVa/ueUS Функция VВА DateValue выполняет пре образование строки даты, соответствующей региональным параметрам Windows, в значение типа Date. А функция DateValueUS выполняет преобразование строки даты , соответствующей региональным стандартам США, в значение типа Date. Если строка имеет другой формат , функция возвращает значение Error, которое определяется функцией IsError. i'PU:БJTc~:ffur'\c t.Tc5"ri~·ьaEeviiiueiЛГ(вyvai a:Date- :д's" stiingт~лs ·var -r:anE· -- , , -- . .- ,•. . ,, --=· ·· · i .·. ·; DateValueUS = Application. Evaluate ( "DATEVALUE(:• " " & aDate & "" ") .") •· ' ·· ~ ~~O.s\_- Fц~,_,~t~~·gn~ ' ~, ,+>m. н i •.:: '·~-· • .~ -~~~~~~." .~-~ ы:-~. · , ," ·* ,~ Переменная- аDаtе содержит строку даты, отформатированную в соответствии с ре­ гиональными стандартами США. Функция DateValueUS возвращает значение типа Date и · принимает строку типа Variant. Взаимодействие с Excel VВА и Excel являются двумя различными программами с совершенно разным воспи­ танием. VВА говорит на американском английском . Excel тоже говорит на американском английском . Но кроме этого , Excel может говорить на других языках пользователей, если установлены соответствующие параметры Windows и языковые пакеты Office. С другой стороны , VВА очень мало знает о параметрах Windows и еще меньше о языковых пакетах
406 Глава 17 Office. Следовательно, можно создать нагромождение кода, которое зас-i-авит VВА гово­ рить с Excel на языке пользователя, или можно просто позволить VВА и Ехсе! общаться на американском английском. Рекомендуем остановиться на последнем варианте. К сожалению, большинство новых возможностей Ехсе ! не обладает многоязыковой поддержкой. Некоторые поддерживают только американский англмйский, а есть такие, которые по.zщерживают только язык пользователЯ. Первые возможности можно исполь­ зовать при полном понимании их ограничений. Вторые лучше не применять вообще. Все эти возможности рассматриваются далее в этой главе. Отправка данных в Excel Самым лучшим методом загрузки чисел, дат, бинарных значений и строк в ячейки Ex- cel является использование родного формата. Следовательно, показанньrй ниже код бу­ дет работать одинаково вне зависимости от региональных стандартов: :рu:Ы:Lё su.ь - seПd.тaExc.ei Dim aDate As Date Dim NumЬer As DouЫe Dim Bool As Boo1ean Dil}l Str As String aDate = DateSerial(2004, 2 , В) Number = 1234. 567 · Bool = T:r:ue . s .tr = "Здравствуй мир" Range ( "Al") .~ Value aDate · Range("А2") .Value NumЬer ·Range("АЗ") .Value Bool . ' Range ( "А4") . Value Str J;:E.<:'l. 5 .:1±1:> '""'"'·· .. .• "". . ~.... .. ~ - ..." ....• Между VВА и Ехсе! есть промежуточный слой . При передаче переменной через этот слой от VВА в Ехсе! , Excel пытается интерпретировать значение переменной в соответ­ ствии с собственными правилами. Если типы данных VВА и Excel взаимно совместимы, переменная проходит через пограничный слой без изменений. Проблемы начинаются в тот момент, когда из-за Excel или по собственной инициати­ ве числа, даты или бинарные значения передаются в виде строк. В такой ситуации суще­ ствует простое решение: всегда перед передачей значения в Ехсе! выполняйте явное преобразование строковых данных в тип данных, который должен храниться в Ехсе]. Excel может потребовать строкового представления данных в следующих ситуациях: О создание формулы для ячейки, ряда на диаграмме, условного форматирования илИ вычисляемого поля сводноi;i: таблицы; О указание формулы RefersTo для определенного имени ; О указание критерия AutoFil ter; О передача формулы в функцию ExecuteExcel4Macro; О передача формата числа для ячейки, стиля, оси диаграммы или поля сводной таб­ лицы; О установка формата числа для функцииVВАFоrmаt .
Проблемы интернационализации 407 В этих случаях необходимо убедиться, что VВА отправляет в Excel строки, отформа­ тированные в соответствии с региональными стандартами CIIIA (нужно использовать английский язык и региональные параметры США). Если строка создается в процессе работы кода, стоит, внимательно преобразовать все переменные в строки в соответствии с региональными стандартами CIIIA. Например: : 1.>ць11г : sиБ ··-s·et:Liiii:Гt: '(вyVaГr:i~mit: .Аэ · JSouЬieJ ., ''-"f'-"'ТГ ';;у··• ActiveCe11 .Formula = . "=IF(Al<" & Limit & " ;1"0}'! . iEnd ·sub · ·.· . ' '> i ... .., .";,,.; . . . ~''"''~"';;<' t?...>•• • ,':н"<~; :;.,,,,_·. ;.; • ,.,_,,,,,;..,,,,,,,,,.;,,,~ .- " :, , Формула ячейки устанавливается на основе параметра, который предоставляется дру­ гой подпрограммой. Обратите внимание, что формула создается в процессе работы кода и при создании строки используются региональные параметры США и английский язык (ключевое слово IF и запятая в качестве разделителя списка). При использовании этого кода с различными значениями Limi t с разными региональными стандартами будут по­ лучены следующие результаты: Значение Limit 100 100.23 США Работает Работает Великобритания Работает Работает Норвегия Работает Ошибка времени выполнения 1004 При использовании региональных параметров Норвегии код аварийно завершает ра­ боту при любом не целом значении Limi t. Это связано с тем, что выполняется неявное преобразование числового значения переменной в строковое и результат преобразова­ ния зависит от региональных параметров Windows. В результате преобразования в Excel передается следующая строка: c~trJл1~ 1qь.,2~,.x;9y~· . ~ .. _~-.· ·· Так как в функцию передается четыре параметра, формула не работает. Если изме­ нить код следующим образом: ;:PuЫ'i ёxsuь :se'ti..Iffiн:: (вyval ·r,з:.тit ~Лs fiouble) ' ''"'· --. · ··-. •0• 7 -·"~""'. ' ActiveCell.Formula = '' .=IF(Al<" & Str .(Limit) & ",1,О. ):' . i~п.д~"'-·§:!:'!-.1?."''". · -~<-ц.J "". ";. , . ;;: ., " .i/...KR:·~.,..._,,,...;~.>«.;o.,,_,,~~~- -"~·"'"~- ,;, , •. . ., .; .. .. , , ,.-w ., .д., -~"'-·._" , .м~ .i<.. -. . . ::>< ><.v-_.._,,,,W...,JW~",,,,'"'"'"°'"""'="'"''·'~-.;; формула будет работать правильно, так как вызов Str выполнит явное преобразование строки в соответствии с регионалJ?ными стандартами США. · Если выполнить ту же подпрограмму по отношению к значению типа Date вместо DouЫe, появится еще одна проблема. Передаваемый в Excel текст (например, для даты 13 февраля 2004 года) будет выглядеть следующим образом: zJ:.E(J\J;iQ~iJз/~.Q .Q4.:, JJ OJ ~ .. ~ Хотя это действительная формула, Excel воспримет дату в качестве последовательно­ сти делений, поэтому формула будет преобразована в ~~~:f~~.д~!Q~~q_9~~QQ)}~~- 1~.. Q} ~---=~:.n~- '•'-'"'/, .~,.~- ~- ~' •,.• Скорее всего, такое условие никогда не будет истинным. Для обхода этой проблемы необходимо преобразовать тип Da~e в тип DouЫe, после чего преобразовать значение в строку:
408 Глава 17 ;J?i.1БHc" sliБ ''sёiba 't:ёtiпlii .(вyva1 Limit лs ьа.t.ёJ _." ~". · Activёcell.Formula = " = IF(Al< " & Str(CDЬl(Limit)) & ",1,0)" ;End. Sч._J?.~. , ... ~ ~. . . В результате функция будет работать правильно, хотя станет сложнее для восприятия: =:I)'(_А1<3·6~·з.5, 1"'," О) r -. - •• -· Для сохранения простоты восприятия даты необходимо преобразовывать в вызовы функции Excel DATE, например: · ~rt-:-(А.1~ь:д..,тi{( 200~ :2:~1:з) ,)'::"9Т Кроме этого, можно воспользоваться функцией NumЬerToString, котораЯ рассмат­ ривалась ранее в этой главе. При этом параметр UseDateFunction должен быть уста­ новлен в значение True: "fiU.БГ.fC:'" si.lЪ 'sёtba tёC:lm:l. t (ByVal 't:lmit' Ai3 " ЬаУёГ ~ .. . .. ~· .". , · ActiveCell.Formul a = ~·=IF(Al<" & NшnЬerToString(Limit, ~ & ,, ,1,0')" . !ко.о_~~:о.. ·." ." ..."." .. .... Если вызвать последний вариант подпрограммы SetLimi t и передать в качестве значения параметра 100.23, можно заметить, что программа Excel выполнила преобразо­ вание строки, соответствующей региональным стандартам США, в строку на локальном языке, соответствующую текущим региональным параметрам . Например, в Норвегии этот результат будет выглядеть следующим образом: ~l{vi[\д<100 ,_2 З;,J,JoГ ··-··· - · ··:·:--~--· Это преобразование также относится к форматам чисел. При каждой установке фор­ мата числа средствами VBA в Excel передается строка формата с использованием симво­ лов, принятых в США (например, 'd' для дня, 'm' для месяца и 'у' для года). После применения строки формата к ячейке, стилю или оси диаграммы или использования в функции F ormat Excel выполняет преобразование этих символов в локальные версии. Например, в результате работы следующего кода в норвежской версии Windows (при вы­ зове команды ФорматqЯче йкиqЧисловой (FoгmatqCellsqNumbeг)) будет получена строка dd/mm/ eeee: Способность Excel выполнять преобразование строк из региональных стандартов США на локальные языки и в региональные форматы позволяет создавать приложения, не зависящие от региональных параметров. Достаточно создавать код с использованием региональных стандартов США и выполнять явное преобразование переменных в соот­ ветствующие региональным стандартам США строки перед передачей их в Excel. Чтение данных Из Excel При чтении значения ячейки с помощью свойства Value возвращаемый Excel тип данных зависит от комбинации значения и форматирования ячейки. Например, число 3,000 может передаваться в VВА как тип DouЫe, тип Currency или тип Date (18 марта 1908 года). Единственная проблема, связанная с интернационализацией, возникает при присвоении значения ячейки непосредственно строковой переменной - в таком случае выполняется неявное преобразование и результат может отличаться от ожидаемого (особенно, если ячейка содержит значение типаВооlеаn).
Проблемы интернационализациИ 409 Как и в случае с отправкой данных в Excel, при чтении данных выполняется преобра­ зование между региональными стандартами. Это значит, что свойства . Formula и .NwnЬerFormat возвращаются на английском языке с использованием форматирова­ ния чисел и дат, принятого в США, вне зависимости от языка пользовательского интер­ фейса или региональных параметров операционной системы. Хотя в большинстве прилож~ний проще работать с формулами и форматами США, иногда возникает необходимость получить именно то представление, которое видит пользова,тель (с учетом выбранного языка интерфейса и региональных параметров). Для этого можно воспользоваться версиями свойств xxxLocal, которые возвращают (и ин­ терпретируют) строки в соответствии с пользовательскими параметрами. Обычно эти свойства применяются для отображения формулы или формата числа в диалоговом окне ;;serForm. Эти версии свойств рассматриваются в следующем разделе. Правила работы с Excel Ниже перечислены основные принципы обхода проблем, связанных с интернацио­ нализацией листов и кода VВА. О По возможности передавайте значения в Ехсе! с использованием стандартного форматирования (не выполняйте преобразование дат, чисел и бинарных значе­ ний в строковые значения без особой необходимости). Если строковые значения представляют другие типы данных, самостоятельно выполните преобразование до передачи значения в Excel. О При преобразовании чисел и дат в строки для передачи в Excel (например, при создании критерия для функции AutoFilter или строк . Formula), всегда вы­ полняйте явное преобразование данных в строки, отформатированные в соответ­ ствии с региональными стандартами США. Для этого можно воспользоваться вы­ зовом Trim(Str(MyNwnЬer)) или функцией NwnЬerToString, которая рас­ сматривалась ранее. После этого Excel выполнит корректное преобразование в ло­ кальн;ый формат чисел/ дат. О Избегайте использования в коде строкового представления дат (например, #1/3 /2004#). Лучше воспользуйтесь функцией VВА DateSerial или функцией Ехсе! DATE, возвращающими однозначный результат. О По возможности вместо строкового используйте числовое представление даты. Числа намного реже становятся причиной неоднозначности (хотя использование чисел не дает полной гаран_тии). О При автQматической генерации формул, которые будут сохранены в ячейках (с ис­ пользо:ванием свойства . Formula), создавайте строку на основе английских . на­ званий функций. · Ехсе ! выполнит автоматическое преобразование имен функций в соответствии с языком пользовательского интерфейса Office. О При установке формата числа или при вызове функции Forma t применяйте симво­ лы форматир_ования, принятые в США, нaпpимepActiveCell .NwnЬerFormat = "dd mmm уууу " . Excel выполнит преобразование в локализованный формат числа. О При чтении информации с листа с использованием свойств . Formula, . NwnЬer­ Format и так далее Ехсе! будет возвращать английские названия функций и коды форматирования, принятые в США. Возвращаемые значения не зависят от языка пользовательского интерфейса Excel.
410 Глава 17 Взаимодействие с пользователями Золотым правилом вывода данных для пользователей или получения данных от поль­ зователей является соблюдение региональных параметров Windows и применение языка пользовательского интерфейса Office. От пользователей нельзя требовать ввода чисел, дат, формул и строк форматирования, соответствующих региональным стандартам США, только потому что это упрощает разработку приложений. Размер бумаги Наибольшее раздражение у пользователя вызывает отказ принтера работать с разме­ ром бумаги, который .применяется в существующих ш'аблонах приложения. Если шабло­ ны используются для создания отчетов, всегда меняйте размер бумаги на размер, приня­ тый пользователем по умолчанию. Для определения этого параметра можно создать но­ вую книгу и извлечь размер бумаги из объекта PageSetup. В Ехсе! 2002 было добавлено свойство Application.MapPaperSize, которое по­ зволяет автоматически переключаться между стандартными размерами бумаги, приня­ тыми в различных странах (например, размер Letter в США эквивалентен А4 в Велико­ британии). Если свойство Application . MapPaperSize установлено в значение True, Ехсе! автоматически будет следить за используемым размером бумаги . .Вывод данных Ехсе! хорошо справляется с отображением листов в соответствии с региональными параметрами и языком пользовательского интерфейса. Но при выводе данных через диалоговые окна UserForm или диалоговые листы форматирование приходится выпол­ нять самостоятельно. Как было показано ранее ; по умолчанию преобразование чисел и дат в строки в Ехсе! выполняется в соответствии с региональными параметрами Windows . Это значит, что можно написать следующий код и при этом быть уверенным, что Ехсе! выведет инфор­ мацию в правильном формате. Но с неявным преобразованием типов (в показанном фрагменте кода выполняется неявное преобразование числа с плавающей точкой в строковое значение) связано две проблемы. О Для преобразования дат применяется принятый по умолчанию формат" ShortDate", в котором для представления года не выделяется четыре цифры и отсутствует пред­ ставление времени. Для вывода года с помощью четырех цифр и информации о вре­ мени можно воспользоваться функцией FormatDate, показанной далее в этой главе. Но в диалоговых окнах UserForm можно воспользоваться более однозначным фор­ матом, например форматом "ммм дд, гггг", который применяется на протяжении этой книги. О В версиях Ехсе! до Ехсе! 97 региональные параметры Windo~s не влияли на выбор форматирования. При создании приложений для более старых версий Ехсе! на правильное поведение рассчитывать нельзя.
Проблемы интернационализации 411 В этом случае существует простое решение - воспользуйтесь функцией Format. Эта функция заставляет VВА выполнять преобразование числа в отформатированную в со­ ответствии с региональными стандартами строку. Кроме этого, функцияFоrmаt работа­ ет во всех версиях Excel, начиная с Excel 5.0 . ij'ejcti3_9.~Чw§r~ тe?_<:t· ;. format<з .J4iS.9J. Интерпретация данных Скорее всего, пользователи будут вводить даты и числа в соответствии с регионаJ!ь­ ными параметрами , а код должен выполнять соответствующие проверки и, возможно, выдавать осмысленные сообщения об ошибка.х . Это значит, что придется ис пользовать функции преобразования Сххх, а также функции проверки IsNumeric и IsDate. К сожалению, эти функции обладают собственными недостатками (например неспо­ собностью распознавать символ% в конце числа), требующими обхо)IНЫХ решений. Про­ стым решением является использование показанных в конце этой главы функций Win- ToNum и WinToDate. Эти функции выполняют проверку действительности и преобразо­ вание, а также выдают соответствующие сообщения об ошибках . Код проверки ввода для диалогового окна UserForm обычно вызывается из процедуры обработки события , Click для кнопки ОК. Код может быть реализован следующим образом: :firlvate-si:ifГc-omП\andBu ti:onOк_cl ick() . , Dim result As DouЬle r~~ . и If WinToNum(TextBoxNumЬer.Text, result, True) Then Sheetl.Range("Al'') .Value = result Else . · ·.f· . TextBoxNuinьer. SetFocus Exit Sub .-Бnd,If ме:нidе tв..ц51 S.~f?. _... ._ ... Свойства xxxLocal :.~ J До этого момента было сказано, что с Excel придется взаимодействовать с использо­ ванием английских названий функций и форматов , принятых в CIIIA. Ниже приводится альтернативная ситуация, при которой код взаимодействует с пользователем на языке пользователя. Для этого применяются соответствующие региональные стандарты. Воз­ никает вопрос: как приложение· может считать введенные пользователем данные (формат числа Или формулу) и передавать их непосредственно Excel или отображать формулу в окне сообщения на языке пользователя? Компания Micгosoft осознала подобное требование и предоставила локализованные версии большинства необходимых функций. Функции имеют те же имена, что и их экви­ валенты в CIIIA. При это м в конец имени функции добавляется суффикс "Local" (например; FormulaLocal, NwnЬerFormatLocal и т .д.) . При использовании этих функций Excel не выполняет автоматическое преобразование форматов и языков. Счи­ тываемый и записываемый текст ничем не отличается от того, который видит пользова­ тель. Практически все функции, которые возвращают строки или принимают строковые аргументы, имеют локальные эквиваленты . В следующей таблице перечислены все функции и объекты, к которым они применяются.
412 Глава 17 Применяется к Эти версии функций при- Эти версии функций принимают Преобразование строк/чисел Преобразование строк/чисел Имя , Стиль, Ко­ мандная панель Диапазон , Ряд на диаграмме 1диапазон, Ряд на диаграмме Диапазон , Стиль, Метка данных на диаграмме, Метка осей на диаграмме нимают и возвращают строки на английском языке, соответствую­ щие региональным стан­ дартам США Str Val . Name .Formula . FormulaRlCl . NumberFormat Диапазон . Address Диапазон . Ad dressRlCl Определенное имя . Refersтo · ·' Определенное имя . Re fersToR lCl Оп,ределенное имя . Category и возвращают строки на языке поль­ зовательского интерфейса Office (или Windows}, отформатированные в со­ ответствии с лоиальными регио~ нальными rуараметрами CStr СDЫ ИТ.Д. . NameLocal . FormulaLocal . . Fo rmulaRlClLocal . NumberFormatLocal . AddressLocal . Ad dressRlClLocal . RefersToLocal . RefersToRlClLocal . CategoryLocal Правила работы с пользователями О При преобразовании числа или даты в текстовую строку для последующего ото­ бражения пользователям или присвоения свойствам . Caption и . Text элемен­ тов управления, выполняйте явное преобразование чисел и дат в соответствии с региональными параметрами Windows. Для этого можно воспользоваться функ­ циями Forrnat или CStr. О При преобразовании дат в строки Excel не меняет порядок компонентов даты, по­ этому вызов функции Forrnat (MyDate, "дд /мм/гг гг") всегда будет выдавать дату в порядке ДМГ (хотя при этом будет использоваться правильный разделитель даты) . Воспользуйтесь вызовом Application. International (xlDat e Order) для определения правильного порядка даты. Этот вызов применяется в функции ForrnatDate, показанной в конце этой главы. Кроме этого, можно воспользовать­ ся одним из стандартных форматов даты, например ShortDate. О По возможности используйте форматы даты, не зависящие от региональных па­ раметров , например Forrnat (MyDate, "ммм дд , гггг "). В этом случае Excel будет выводить имена месяцев в соответствии с языком региональных параметров Windows.
Проблемы интернационализации 413 О При интерпретации введенных пользователем строки даты или строки числа вос­ пользуйтесь функциями CDa t e и СDЫ, позволяющими преобразовывать строку в дату или число. Для разбора строки эти функции используют региональные па­ раметры Windows. Обратите внимание, что функция СDЫ не распознает символ% в конце числа. О Всегда проверяйте допустимость введенных пользователем дат и чисел до попыт­ ки преобразования. Пример проверки приводится в функциях WinToNum и Wi n- ToDate, показанных далее в этой главе. О При выводе информации об объектах Excel используйте свойства xxxLoca l (если такие свойства существуют). Это позволит получить данные на языке пользовате­ ля с сохранением форматирования. О Если свойствам объектов Excel присваиваются введенные пользователем значе­ ния, применяйте свойства xxxLocal . (Предполагается, что пользователь вводит значения на своем родном языке в принятом в данной местности формате). Возможности интернационализации в Excel 2003 ' В Excel 2003 в диалоговое окно СервисqПараметры (ToolsqOptions) была добавлена вкладка Международные (Inteшational). В этой вкладке пользователь может указать символы, которые Excel должна применять в качестве десятичных разделителей и разделителей тысяч, переопределяя региональные параметры Windows. Для изменения и получения значений этих параметров можно воспользоваться свойствами Application. ThousandSeparator, Application . DecimalSeparator и Application. UseSystemSeparators. Эти свойства позволяют распечатывать, сохранять (в текстовом формате) или публи­ ковать книги с использованием локального формата чисел. При этом можно изменить значения этих свойств, сохранить (в текстовом формате) или опубликовать книгу для другой страны и" восстановить начальные значения параметров . К сожалению , компания Miпosoft не предоставила возможности переопределения других региональных пара­ метров Windows - например, порядка компонентов даты, разделителя компонентов даты или представления отрицательных чисел. Одной из проблем в работе параметров Международные (International) является не­ _ восприимчивость строк форматирования чисел в вызовах функции листа =ТЕХТ, поэто­ му после изменения параметра (в результате работы кода или Ч;ерез пользовательский интерфейс) все ячейки с функцией =ТЕХТ получат неправильный формат чис_ел. Реше­ ние этой пробЛемы рассматривается далее в этой главе. Добавление параметров Международн ые (International) отрицательно сказалось и на разработчиках. Проблема заключается в том, что хотя эти параметры оказывают влияние на все свойства Excel xxxLocal и функции (включая Application. International), они полностью игнорируются интерпретатором VВА. Вот несколько примеров, которые позволяют понять глубину проблемы: О функция VВА Format, которая используется практически при каждом выводе числа для пользователя, игнорирует значения этих параметров, а значит отобра­ жаемый текст будет отформатирован в соответствии с региональными параметра-
414 Глава 17 ми Windows, а не в соответствии с установленными параметрами Международные (International}; О если пользователь вводит числа в Диалоговое окно UserForrn и элемент управления InputBox с применением переопределенных разделителей, введенные числа небу­ дут восприниматься такими функциями преобразования, как IsNumeric и СDЫ. В результате будет выдаваться сообщение об oшибкeTypeMismatch. Единственный способ обойти эту проблему - самостоятельное переключение между региональными параметрами Windows и переопределенными разделителями перед вы­ водом чисел для пользователя и непосредственно после получения чисел от пользовате­ ля. Для этого можно воспользоваться следующими функциями: :1:\1ь1:iс F'uriCПon"'ifiRsтob.ve'riidё(Вyva1 ·Number J;.s· ~st.:Т'ing) A.s st. ring ··~·· ~·· · Dim WRs As String Dim J>housand :As String · . Dim aDeci.mal As String 'Diт XLThousand Ав String · Dim XLDecimal ' дs String 'val (Application.N'ersion) >= 10 Then I f . Not Дpplicatioч. UseSys temSepar.a,tors тhen ·W RS = Format(lOOO, "#,##0.00") Thousand = Mid(WRS, 2, 1) aDecimal = Mid(WRS, б ,' 1) XLThousand =' A p p l ication ..ThousandsSeparator " XLDeciinal = Application. aDecimalSeparator NumЬer Replace(Number, Thousand, vbTab) , '· Number - Replace (Number, a ·Decimal, XLDecimal) · NuШь.er Replace'(Number; vbTab, XLThousand) ... End I.f . . «J;:ni;'i .I f . ~ . . · :v.msтooverr.ide =· Number -~t1? . f.μЦq):;i.ffi ·''" Функция WRSToOverride выполняет преобразование между форматами чисел, при­ нятыми в реrиональных параметрах Windows и Excel. Она возвращает строку, отформа­ тированную в соответствии с переопределенными разделителями в Excel. Переменная NumЬer содержит строковое представление числа, отформатированное в соответствии с региональными параметрами Windows. ;F>ЧБ1iЕ'"FЧПёt:10-п ~over~Taётo-wRstв:YVar»ыu.mьer l(s7st::s:'.rJ:1g.) : As Diw · :WRS As String' . Dim . l:ffiSThousand As String Ьiт \'ЩSDe'cimal As String • Piip XLThousanp As,. String J. piщ . XLDeciщal лs ' string , W' ,';'.~" .• . ~ ·;· "' i '·:'" " '.. ~'' .•. . ; _"· . ;- <' ~- - , ,. >. ~J<~;Hyal(Ap:plicatio'h.version) >= 10 'I'hen . ·· I f . Not. Дpplicc;ttion. UseSystemsepa rators тhen · WRS = Format$(1000; •:#,##0.00") ,WRSThousand = ., Mid$. (WRS, ;•2' _1) \,щ.sDetima-1 ·= Jifid$ (WRS, 6, 1) • . XLThou·saiid = Applica.tion. ThousandsSeparatЪr .X L Decimal' :;,, · Applica'tion. DedimalSepaiator ·· .. " NumЬer ' = Repl ace (NumЬer, XLThousand, vbTab) . ';~% .A\d.~e-~ ~':. .•:&E;iP. J,ltc;:~Л':JЧI!!P~r, '' JS..J;...Q~c)Jrta)-, _ WRSDe_~Jrn,a:JJ....
Проблемы интернационализации 415 '"""""''"" ~::'·:··... "'ifii.iliiЬe .r "~"'·:R-eI:>I:a.Cё ·<NumЬei·~,--vьтa.ь,~ тsrБ.ousanc1T . End I.f . 1 .•. End .If -. .. ~:.~•:~:,: ove;r.i:'·i.de;~oWRS = NurnЬer ~.:':./1/··... > f,;,~' ' ' ' -,"' < t~Ъ~.J:"Ч.~_c_t~on :~~ ..-.~~-· ... ,. .. . ~ .~. ·... ...~. , *,.,, Функция OverrideToWRS выполняет преобразование между форматами региональ­ ных параметров Windows и Excel. Она возвращает строку, отформатированную в соот­ ветствии с региональными параметрами Windows. Переменная NumЬer содержит стро­ ковое представление числа, отформатированное с использованием переопределенных разделителей Excel. Последняя проблема возникает при взаимодействии с пользователем, так как для это­ го необходимо применять знакомые пользователю форматы чисел. После добавления возможности переопределения региональных параметров Windows в Excel предоставля­ ется третий набор разделителей, 'с которыми придется работать пользователю и разра­ ботчикам. При этом разработчик полностью зависит от того, запомнил ли пользователь текущий переопределенный разделитель, а это могут быть не те разделители, которые пользователь привык видеть (определенные в региональных параметрах Windows). Рекомендуется, чтобы приложение проверяло значение свойства Application. UseSystemSeparators и сравнивало это свойство со значением True. Пользователю должно выдаваться сообщение с предложением отключить переопределенные разделители и установить эти параметры с помощью Панели управления (Control Panel). (IJ: ::дppl:CC:a.t.тon: :"·u se Sys't'emsei5a'I'afar·iг тпеп ···-· "··~,,..,,.."... f •: MsgBo ~ , ''Устанавл ивай!l'е форматирование ' чисел ;,~ через ,пане.ль управления " f ·· Application. UseSystemSeparat,ors Fa.lse t.:§P..O,~~-..!"~...~. ~"'"""' '~li"""'°m.·~ :~-~~мA. ~----~. . . . . . ..м.1.~h;,, . . ".: "' ""··' ' ""' -"'4' «~А.. =~».~.i:-~-''"- 1:.._.,ц ......;....~v;:»."-d«.h. Возможности, не следующие общим правилам . Фу нк ци и xxxLocal , которые рассматривались в предыдущем разделе, были добавле­ ны в Excel в процессе переноса функций XLM в VBA с выходом Excel 5.0 . Такие функции существуют для большинства распространенных функций, которые будут использоваться разработчиком. Но в процессе оригинального преобразования были упу:iцены несколько возможностей . Кроме этого, с тех пор в Excel некоторые возможности были добавлены совершенно без учета вопросов интернационализации. в данном ра:щеле приводятся советы по выходу из лабиринта неоднородности, плохого проектирования и упущений, скрытых среди возможностей Excel 2003. В этой таблице по­ казаны методы, свойства и функции Excel, которые чувствительны к региональным пара­ метрам пользователя, но их поведение не соответствует описанным ранее правилам. Применяется к Открытие текстового файла Сохранение текстового файла Приложение Версия США OpenText SaveAs . ShowDa taForm Локализованная версия OpenText SaveAs .S howDataForm
416 Глава 17 Применяется к Лист/Диапазон Вычисляемые поля и элементы сводной диаграммы Условные форматы Таблицы запросов (WеЬ-за п росы) Функции ЛИСТОВ Диапазон Диапазон Диапазон Диапазон Приложение Приложение Приложение Версия США .Formula .Value . FormыlaArray .AutoFilter .Evaluate .ConvertFormula .ExecuteExcel4Macro Локализованная версия .Paste/.PasteSpecial .Formula .Refresh = ТЕХТ . AutoFilter .A dvancedFilter К счастью, для большинства этих проблем существуют решения. Но есть несколько возможностей, которых стоит полностью избегать. Использование функции OpenText Функция VВА WorkЬooks. OpenText является аналогом открытия текстового файла в Excel с помощью команды Файлс>Открыть (Filec>Open) . Функция открывает текстовый файл, разбирает его на числа, даты, бинарные значения и строки и сохраняет результат в ячейках листа. Более подробно эта функция рассматривается в других разделах книги. В данном случае интерес вызывает метод, с помощью которого Excel выполняет разбор файла с данными (а также изменения в этом методе с выходом нескольких последних версий). В Excel 5, если текстовый файл открывался через пользовательский интерфейс, он разби­ рался в соответствии с региональными параметрами Windows. Если файл открывался в ре­ зультате работы кода, он разбирался в соответствии с региональными стандартами США. В Excel 97 это поведение изменилось и региональные параметры стали использоваться как в пользовательском интерфейсе, так и в процессе работы кода. К сожалению, .это означало от­ сутствие гарантий правильного открытия текстового файла, отформатированного в соответ­ ствии с региональными стандартами США. С выходом Excel 5 представилась возможность описания порядка компонентов даты для каждого столбца в отдельности. Эта возможность хорошо подходит для работы с чисдовым представлением дат (например, 01 / 02/2004). В Excel 2000 в мастере Text '1mport Wizard была предоставлена кнопка Дополнительно (Advanced) и связанные с этой кнопкой параметры De cima lSe parat or и ThousandsSepa- rator метода OpenText. Эти параметры позволяют указать разделители, которые Excel будет использовать для идентификации чисел. Неприятно то, что точно так же нельзя указывать общий порядок компонентов даты. 'i:'U.ЪH C:~' suь · openтext"т es t. (j _,,, __ 1 •. t""'""''J)Jl!.1"J'Jl:e~_?.m~, Щ; •.$ t;:~nя:.c.,~~·"·"··'· '"'''"··"".'"'="""'-'~"""-~~~.=
Проблемы интернационализации 417 С выходом Excel 2000 компания Mici·osoft решила проблемы форматирования чисел, а с выходом Excel 2002 были решены проблемы с названиями месяцев и дней. Кроме это­ го, были предоставлены более простые альтернативы определения локалИзованных форматов и форматов США для дат, чисел и других данных. До выхода Excel 2003 метод OpenText распознав~ названия месяцев и дней только в соответствии с региональными параметрами Windows. При этом для всех дат, порядок компонентов которых отличался от МДГ, требовалось указывать порядок компонентов даты. В Excel 2002 у метода OpenText появился параметр Local, который позволяет со­ общать методу, что импортируемый текстовый файл отформатирован в соответствии с региональными стандартами США или в соответствии с текущими региональными па­ раметрами Windows: О если параметр Local установлен в значение True, Excel распознает числа, даты и названия месяцев и дней в соответствии с региональными параметрами Windows (и переопределенными десятичными разделителями и разделителями тысяч, если они установлены); О если параметр Local установлен в значение False, Excel распознает числа, даты и названия месяцев и дней в соотве'тствии с региональными стандартами США. В любом случае дополнительные параметры DecimalSeparator, ThousandsSepa- rator и Fieldinfo могут использоваться для дальнейшего уточнения спецификации (и переопределения принятых по умолчанию значений пара~етраLосаl). Функция SaveAs Функция VВА Workbook. SaveAs является эквивалентом сохранения текстового файла в Excel с помощью команды Файлс>Сохранить как (Filec>Save As) и выбора тек­ стового формата. Во всех версиях Excel до Excel 2002 в результате вызова этой функции создавался тек­ стовый файл, отформатированный в соответствии с региональными стандартами США. Метод SaveAs принимает тот же параметр Local, что и метод OpenText, который рассматривался ранее. Использование этого параметра позволяет при необходимости получить локализованную версию файла. Обратите внимание, что если в ячейке сохра­ нить дату в локаЛизованном формате (.такой формат числа начинается с указателя регио­ нального кода, например, [ $-814] для Норвегии), это форматирование буд~;г сохране­ но в текстовом файле, даже если файл соответствует региональным стандартам США. fP\J.ь11c~-- ·suь~~ save·тe,xt1i,.,~ - -~··- ·t'~· ·Р'·· ·~ ". ,..,.. ,._: -~- ~-- ~-- ···· ~ Dim FileName As String FileName = Thi-sWorkbook.Pai:h & "\Data.txt" Call Act.iveWorkbook. SaveAs (FileName, xlText, local: =True) fEnf! . ?ч.!?~. . ,_,_ ,, . ... . .... ill ••,
• 418 Глава 17 Подпрограмма ShowDataForm Использование метода Act i veSheet . ShowDataForrn может подвести разработчика · к одной из самых опасных проблем, связанных с интернационализацией. Подпрограмма ShowDataForrn является эквивалентом команды Данныеqформа_ (Dataqfo1·m). В ре­ зультате вызова этого метода отображается стандартное диалоговое окно, в котором пользователь может вводить или менять данные в списке Excel или в базе данных. При вызове этой подпрограммы из меню выводимые даты и числа отформатированы и ин­ терпретируются в соответствии с региональными параметрами Windows. Такое поведе­ ние полностью соответствует правилам взаимодейсТВJ:!Я с пользователями, описанным ранее в этой главе. При вызове метода ActiveSheet. ShowDataForrn даты и числа отображаются в диалоговом окне с использованием региональных стандартов США, а интерпретируют­ ся в соответствии с региональными параметрами Windows. Таким образом, если дата 10 февраля 2004 года отображается на листе в порядке дд/мм/гггг в виде 10/ 02/2004, Excel покажет эту дату в формате 2/10/2004. После изменения даты на 11 февраля 2004 года (2/11 / 2004) Excel сохранит дату как 2 ноября 2004 года. Точно так же при ис­ пользовании норвежских форматов чисел число 1-разделитель целой и др.обной части- 234 будет показано в виде 1.234. После изменения этого числа на 1.235 Excel сохранит 1235 - число, в тысячу раз большее . К счастью, если приходится работать с Excel 97 и более поздними версиями, для этой проблемы существует решение . Вместо использования метода ShowDataForrn можно выделить первую ячейку диапазона и вызвать пункт менюДанныеqформа (DataqfOl"m) самостоятельно . ,-i>Цьiic stiЬ s!:lowF'ormTГ'--~· ·- - · ·" -- . ActiveSheet. Range ( "Al ") . Seli=ct .·' 860 идентификатор объекта CoriunandBarControl ·. " • пункта меню ДанныеqФорма RunMenu 860 . · · ~~дсl SuJ::J.~ "' . . .• ...·~- ,.._ Показанная ниже подпрограмма RunМenu вызывает интересующий пункт меню так же, как при щелчке мышью. В данном случае диалогово~ окно ведет себя правильно . Подпрограмма RunMenu Подпрограмма RunМenu вызывает пункт меню, эмулиру.я щелчок мышью. Для этого в подпрограмму необходимо передать идентификатор CommandBar. Control (напри­ мер ; идентификатор пункта менюДанныеqформа (Dataqfoгm) равен 860). г•. ····· . ····· .. ····-·-· · -· -- ····· ···· . . ..... ··"·-· ·-·· ,Pup].ic Sub . RunM~·ш11 (ByVa,1. Мe.nuid_ As Long·} Dim . Gioritrol , As cbmmandВarButton on Error Resume Next With Application.CommandBars.Add . Controls.Add(ID:=Menuid) .Execute . Delete · · · End With ~End S_tJb ._ ·'-··=·~ Параметр Menuid содержит идентификатор пункта меню, который необходимо за­ пустить.
Проблемы интернационализации 419 Вставка текста При вставке текста в Excel из других приложений текст разбирается в соответствии с региЬнальными параметрами Windows. Способа сообщить Excel информацию о форма­ те чисел и дат, а также о языке вставляемого текста не существует. Единственным реше­ нием является использование объекта Da taObj ect для получения текста из буфера об­ мена, самостоятельный разбор текста средствами VBA и запись результата разбора на лист . В следующем примере предполагается, что в буфере обмена содержится число, от­ форматированное в соответствии с региональными стандартами США. suЬ ParsePastedNurnЬer() Dim obj · As DataObject , Set obj = New DataObject · obj . GetFromCЦpboard Dim text As String ActiveCell . Value \)?11<:1 . $мЬ "" _ , Val(obj.GetText) Вычисляемые поля и элементы сводной таблицы, а также формулы условного форматирования Свойство . Formula диапазона или последовательности на диаграмме принимает и возвращает строки формул на английском языке с использованием форматов чисел , принятых в США. Существует эквивалентное свойство . FormulaLocal, возвращающее и принимающее строки формул в том виде , в котором они отображаются на экране (на языке пользовательского интерфейса Office и с использованием форматов чисел, оп­ ределенных в региональных параметрах Windows). Вычисляемые поля и элементы сводной таблицы, а также элементы условного форма­ тирования тоже предоставляют свойство . Formula, но для этих объектов оно принимает и возвращает строки формул в том виде , в котором они отображаются пользователю . Дру­ гими словами , это свойство ведет себя точно так же, как свойство . FormulaLocal объекта Range. Это значит , что для установки формулы в одном из этих объектов придется созда­ вать формулу на языке пользовательского интерфейса Office в соответствии с региональ­ ными параметрами Windows . Решением этой проблемы является использование собственных свойств . Formula и . FormulaLocal ячейки для преобразования форматов, как показано в следующей функции ConvertFormulaLocale. Функция ConvertFormulaLoca/e Эта функция выполняет преобразование строки формулы между региональными стандартами США и локальными языками и форматами: 1I'iiБ1:lc ' 'F'1.lnct:lori cбnvertF<irmulaLocale < .:_ · ' ByVal Formula As String, ByVal USToLocal As Boolean) As String On Error GoTo Catch ·. With ThisWorkbook. Worksheets (1). . Range ( "IUl,") . I f USToLocal Then · .Formula = Formula ConvertFormulaLocale = .FormuiaLocal Else . FO'rmulaLocal = Formula ConvertFormu·laLocale = . Formula End If
420 Глава 17 - -· :ci'eai-co·n .tenEs End With [catch: .Erj,d]l,! -nc;:tJo_i;i . Параметр Forrnula содержит текст формулы для преобразования. Для преобразова­ ния из региональных стандартов CIIIA в локализованные форматы параметр USToLocal должен быть установлен в значение True. При обратном преобразован ии п араметр US- ToLocal должен быть установлен в значение False. WеЬ-запросы Хотя концепция WеЬ-запросов выглядит привлекательно, ее реализация совершенно не считается с вопросами интернационализации. При разборе текста WеЬ-страницы в Excel все числа и даты интерпретируются в соответствии с текущими региональными параметрами Windo\VS. Это значит, что при открытии европейской WеЬ-страницы в CIIIA или при открытии WеЬ-страницы из CIIIA в Европе, числа и дать{ будут интер ­ претироваться неправильно . Например, если на WеЬ-странице содержится текст l . l , на компьютере с норвежскими региональными параметрами этот текст будет проинтерпре­ тирован как l января. Свойство WebD i saЬleRecognition объекта QueryTaЬle может использоваться для отключения интерпретации чисел как дат. Если формат вывода WеЬ-страницы из­ вестен заранее, для обеспечения правильной интерпретации текста можно воспользо­ ваться переопределенными раздел ителями. В многонациональных приложениях следует соблюдать осторожность при использо­ вании WеЬ-запросов. Определенную степень безопасности может обеспечить следующий подход : О установить cвoйcтвoApplication . UseSystemSeparators в значение Fa l se; О установить свойства Applicat i on. DecirnalSeparator и Application. Tho - usandsSeparator в значения, соответствующие разделителям на WеЬ-странице; О выполнить запрос, установив свойство WebDisaЬleRecognition в значение True; 1 О установить свойства Application . DecirnalSeparator, Application . Tho- u sandsSe parator и Application. UseSysternSeparators в оригинальные · значения. Использование функции листа ТЕХТ Функция листа ТЕХТ вьшолняет преобразование - числа в строку в соответствии с указан­ ным форматом. В строке формата используются символы форматирования, определенные в региональных параметрах Windows (или в переопределении параметров интернационали­ зации в Excel}. Таким образом, в результате вызова =TEXT(NOW(), "dd/rnm/yyyy " ) в нор­ вежской версии Windows будет получена строка "01 / 02 /уууу", так как в этой версии в качестве символа года Excel распознает только символ ' е ' . При открытии файла на другой платформе Excel не выполняет преобразования симво­ лов форматирования чисел. Решением этой проблемы я!!ляется создание определенного имени, которое будет считывать формат числа из определенной ячейки. После этого такое
Проблемы интернационализации 421 определение будет использоваться в функции ТЕХТ. Например, если в ячейке Al использу­ ется формат даты, который применяется в пределах остальной части листа, выберите Вставкас>Имяс>Присвоить (lnsertc>Namec:>Define) и определите имя следующим образом: 'Niime: · :BE3fers Jp: _ . · DateFormat 7(}ET.CE;LL(7,$A$1} После этого в любом месте листа можно · будет использовать вызовы вида = ТЕХТ (Now () , DateFormat). Функция GET. CELL является макрофункцией Excel 4. Excel допускает применение этой функции с определенными именами, но не в ячейках листа. Этот вызов эквивалентен вызову функции листа =CELL, но является более мощ­ ным. В данном примере параметр 7 заставляет функцию GET. CELL возвращать строку формата числа, которая используе,тся в указанной ячейке. Ооратите внимание, ':ПО в предыдущих версиях Excel .некоторь·1е пользователи стаЛк1·111ались , <>общим~ ошибкамЙ Защиты nри копировани\'1 · ЯЧt;!еi< с фор.ма~ом DateFormat в. A~Y.rf!~ ;. · листы ~·книг11. " ·., · /·• Фук'К1JUU XLM дтсу.мrттированъ~ в файле XLМACRB . HLP, 'Котаръtй доступен на сайте 'Ко.мпании Microsoft по адj1есу http: //support .microsoft. com /s upport/kЫ articles/Ql43/4!66.asp Свойства Range.Value и Range.FormulaArray Эти свойства объекта Range нарушают установленные правила в том п~нимании, что не предоставляют локализованные эквиваленты. Свойства принимают и возвращают стро­ ки в формате, соответствующем региональным стандартам CIIIA. Для преобразования формул можно воспользоваться показанной выше фyнкциeйConvertFormulaLocale. Метод Range.AutoFilter Метод AutoFilter объекта Range имеет очень интересное поведение . Он принима­ ет строки, которые используются в качестве критерия фильтрации, поэтому разработчик должен быть знаком с поведением этого метода при обработке строк. Строка критериев состоит из оператора(=,>,<,>= и т.д.), после которого указывается значение. Если опе­ ратор не указан, предполагается , что используется оператор'= ' . Главной проблемой при использовании огератора ' =' является выполнение текстово­ го сравнения, в то время как при использовании других операторов выполняется сравнение значений. Это приводит к проблема.м: при попытке найти точные. совпадения дат и чисел. Применяя оператор • ,:, ' , Excel выполняет сравнение с текстом, который отображается на экране, то есть, сравнивает критерий с отформатированным числом . Так как отображае­ мый текст меняется при переходе на другую локализованную версию Windows, создание критерия для точного совпадения на любой локализованной версии Windows невозможно . Сущ<';ствует решение, позволяющее обойти эту проблему. При использовании любого другого критерия фильтрации Excel выполняет правильное пр еобразование и интерпре­ тирует строку критерия в соответствии с региональными стандартами CIIIA. Таким обра­ зом , критерий поиска ">=02 / 01/ 2004" позволит найти все даты после 1 февраля 2004 года и будет работать во всех локализованных версиях Windows . Эта особенность позво ­ ляет находить точную дату с использованием двух кpитepиeвAutoFilter . Показанный ни)!}е код находит точное соответствие дате 1 февраля 2004 года и работает во всех лока­ лизованных версиях Windows: Rang:e( "Al :D.? 0.9..~ ) .~i.it()Fii.ter :2/ ,; >;0·21 .ci1i2 6_6·Г· :. x],A.p(l , · "< = 0 2_/ 0 Г/.29.Qi;·~:·.-~"'· :•. ~
422 'Глава 17 Метод Range.AdvancedFilter Метод AdvancedF ilter соблюдает правила, но иногда следование правилам может оказаться нежелательным . Критерий фильтрации вводится в диапазон критерия на листе . Как и в методе AutoF ilter, в строке критерия указывается оператор- и значение. Обрати­ те внимание , что при исtrользовании оператора ' =' метод AdvancedFilter выполняет корректное сравнение и в этом отношении отличается от мeтoдaAutoFi 1 ter. Так как строка критерия используется только в пределах Ехсе!, она должна быть от­ форматирована в со с7тветствии с текушими региональными параметрами Windo\vs . В ре­ зультате при сравнении чисел и дат 'возникает проблема. В США критерию поиска рас­ ширенного фильтра " >1 . 2 3 4" соответствуют все числа больше 1, 234. Но в Норвегии этому же критерию будут соответствовать числа больше 1234. В США критерию поиска ">02 / 03 /2 004" будут соответствовать даты после 3 февраля. А в Европе этому же кри­ терию соответствуют даты после 2 марта . Единственное решение - создание строки критерия средствами VВА перед вызовом метода AdvancedFilter • или использование вычисляемой строки критерия, которая создается с помощью метода =ТЕХТ, как было показано ранее. Вместо критерия " >=02 / 03 /2 004" для поиска дат после 3 февраля 2004 года можно воспользоваться сле­ дующей формулой: ' = ,, -~ ,;; ,;, &j:Бxj (ЬА_тЕ: 1.2 _9Q4·,·2 -;-j): :J:?a'fe_Foijp~f) ' ·-:~." --~--:· В данном случае DateFormat является определенным именем, возвращающим ло ­ кальный формат даты . Если дата представляет собой целое число (не содержит компо­ нент времени), можно воспользоваться строкой критерия " > = З 6194 " . Пользователю ос­ тается догадаться, что 36194 означает дату 3 февраля 2004 года. Использование функций Application.Evaluate, Application.ConvertFormula и Application.ExecuteExcel4Macro Эти функции следуют установленным правилам и принимают строки, отформатиро ­ ванные в соответствии с региональными стандартами США. Но эти строки не предо­ ставляют локализованных эквивалентов. Для передач.и формулы, которую пользователь ввел в диалоговом окне UserForm (или преобразования формулы между относительны­ ми и абсолютными ссылками на диапазоны ячеек), методам Applicat i on. Evaluate и Application. Conver tFormula придется преобразовать ее в соответствии с регио­ нальными стандартами США. ФункцияАррli с аtiоn. ExecuteExc e l 4Macro позволяет выполня ть функции в стиле XLM. Одним из самых распространенных применений этой функции является вызов функции XLM PAG E. SETU P, которая работает намного быстрее соответствую щ его эквива­ лента из VBA. Эта функция принимает большое количеств0 параметров, включая строки, числа и бинарные значения. Не забудьте выполнить явное пр'еобразование всех параметров в соответствии с региональными стандартами США и сопротивляйтесь соблазну сократить объем кода за счет отказа от вызова функции Str для каждо го параметра . Обработка языковых параметров Office ХР Одним из основных преимушеств версий после Office 2000 является использование одного набора исполнимых файлов со сменными языковыми модулями (до этого исполь­ зовались разные языковые вер сии бинарных пакетов с собственными ошибками). Это
Проблемы интернационализации 423 позволило пользователю самостоятельно выбирать язык пользовательского интерфейса, файлов справочного руководства и других компонентов пакета. На самом деле, если один компьютер поддерживает работу нескольких пользователей, каждый пользователь может выбрать собственньiй Jiзык пользовательского интерфейса Office. Разработчики приложений Excel должны уважать выбор пользователя и стараться предоставить пользовательский интерфейс, который максимально соответствует вы­ бранному пользователем языку. Откуда извлекается текст? Существует три фактора, которые вместе определяют текст, выводимый в пользова­ тельском интерфейсе Office. Хранилище региональных параметров Расположение региональных пара.м:етров указывается на первой вкладке (Региональные параметры (Regional Options)) в окне Панели управления (Contгol Panel) Язык и регио­ нальные параметры (Regional and Language Options) . В региональных параметрах опреде­ ляются: О имена дней и месяцев, отображаемые в ячейках Excel при использовании длинных форматов файлов; О имена дней и месяцев, которые возвращаются в результате вызова функции VВА Format; О имена месяцев, которые распознаются при использовании функции VВА CDate или при непосредственном вводе дат в Excel; О имена месяцев, распознаваемые мастером импорта текста и методом OpenText (при установке параметра Local в значение True); О символы форматов чисел, используемые в функции листа=ТЕХТ; О текст, полученный в результате неявного преобразования значения типаВооlеаn в строковое значение , например" I am " & True. Языковые параметры пользовательского интерфейса Office Язык пользовательского интерфейса Office устанавливается с щ>мощью утилиты ПускqЛрограммыq Инструменты Microsoft OfficeqЯзыковые параметры Microsoft Office 2003 (StaнqProgгam FilesqMicI"osoft Office Too[sqMicгosoft Office 2003 Language Set- tings), которая устанавливается вместе с Office. Кроме этого , в этой утилите определяются: О текст, отображаемый в меню и диалоговых окнах Excel; О текст стандартных кнопок в окнах сообщений Ехсе!; О текст встроенных функций листов Excel; О текст значений типа Boolean, отображаемый в ячейках Excel; О текст значений типа Boolean, распознаваемый мастером импорта текста, мето­ дом VВА OpenText и пользовательским интерфейсом Excel; О принятые по умолчанию имена листов в новой книге; О локализованные имена панелей меню.
424 Глава 17 Языковая версия Windows Языковая версия 'Nindows определяет: О текст стандартных кнопок в функции VВА MsgBox (при и'спользовании констант vbMsgBoxStyles). Таким образом, текст кнопок на встроен-ных сообщениях Ex- cel соответствует языку пользовательского интерфейса Office, а текст кнопок в созданных разработчиком сообщениях соответствует языку Windows. Обратите внимание, что единственным способом определения текущего языка пользова­ тельского интерфейса Windows является применение вызова Windows API. Существуют некоторые элементы Office ХР, которые полностью ориентированы на английский язык (США) и не меняются вместе с изменением языка Windows, региональ­ ных параметров или языка пользовательского интерфейса Office, например: О текст в результате явного преобразования значений типа Boolean в строковые зна­ чения, то есть, вызовы Str (True), CStr (True) и Format (True j всегда воз­ вращают значение "True". Следовательно, единственным способом преобразова­ ния значений типа Boolean в строковые значения, отображаемые в Excel, являет­ ся ввод этого значения в ячейку и чтение значения ячейки через свойство . FormulaLocal; О текст значения типа Boolean, который распозн ается функцией CBool. Идентификация языковых параметров пользовательского интерфейса Office Первым этапом по созданию многоязыкового приложения является идентификация пользовательских параметров. Для идентификации языка, выбранного в региональных па­ раметрах · Windows можно воспользоваться вызовом Application. International (xlCountrySetting) . В результате вызова этого метода возвращается число, кото­ рое примерно соответствует коду региона в телефонной системе. Например, код 1 соответствует США, код 44 - Великобритании, а 47 - Норвегии . Вызов Applica- tion. J:nternational (xlCountryCode) · можно использовать для получения язы­ ка пользовательского интерфейса. Коды языков определяются по такой же схеме . Этот метод хорошо работал в предыдущих версиях Excel , которые существовали примерно ,цля 30 языков. _, Начиная с Office 2000 все немного изменилось . Выделением языковой конфигуrации в отдельный пакет компания Micгosoft относительно просто обеспечилq. поддержку на­ много бо.[!ьшего количества ~зыков . в окне Object Browser (Просмотр объектов) найдите константу msoLanguageID, определенную в объектной библиотеке Office и обратите внимание на перечисление 180 языков и диалектов . Следующее значение используется для точного определения языка пользовательского интерфейса Offic.e . После этого можно принять решение о возможности отображения приложения на этом языке, похожем языке или на языке , принятом по умолчанию (как показано в следующем фрагменте кода):
Проблемы интернационализации 425 Создание многоязыковых приложений При разработке многоязыкового приложения приходится находить компромисс с уче­ том нескольких факторов: ' О времени и стоимости разработки приложения; О времени и стоимости перевода приложения; О времени и стоимости тестирования переведенного приложения; О увеличения продаж за счет переведенной версии; О повышенной простоты использования, а значит, снижения стоимости поДдержки ; О требования многоязыковой поддержки; О необходимости выбора между созданием языковой версии приложения или ис­ пользованием встраиваемых языковых пакетов. Кроме этого, необходимо принять решение об объемах перевода и наборе. поддержи­ ваемых языков, а именно: О ничего не переводить; О переводить только упаковку и рекламную документацию; О проектиров ать код для работы в многоязыковой среде; О переводить пользовательский интерфейс (меню, диалоговые окна, экраны и со- общения}; О переводить файлы справочного руководства, примеры и учебники; О настраивать приложение для работы в конкретном регионе; О поддерживать только языки с направлением письма слева направо; О поддерживать ~зыки с направлением письма справа налево; О поддерживать языки с двухбайтовыми наборами символов, например японский. Решение о полноте перевода зависит от пользователей , бюджета и доступности пере­ водчиков. Рекомендуемый подход Скорее всего, создание приложения Excel , поддерживающего все 180 языков Office, не оправдано в экономическом смысле, но вот создание приложения, поддерживающего ·несколько расцространенных язьiков может стать разумным вложением средств. Конеч­ но, окончательное решение зависит от пользователей и от предпочти1:ельности под­ держки нового языка. Предложенный здесь подход позволяет создавать приложения, поддерживающие не­ сколько языков и предоставляющие пользователю возможность переключения между ус­ тановленными языками или на язык пользовательского интерфейса · Office. Разработка · приложений ведется на английском языке, после чего выполняется перевод на один или два яз:Ьrка в зависимости от целевой аудитории. Перевод на другие языки целесообразен только в случае гарантированного спроса или в случае, если перевод является обязатель­ ным требованием.
426 Глава 17 Как хранятся строковые ресурсы При создании многоязыко.вых приложений в код нельзя вставлять текстовые строки, которые будут .Е\Ыдаваться пользователю. Эти строки должны извлекаться из строковых ре­ сурсов. Самой простой формой строковых ресурсов является таблица на листе. Текстовым элементам необходимо присвоить уникальные идентификаторы и сохранить их на листе; по одному идентификатору на строку и по одному столбцу для каждого поддерживаемого языка. После этого можно найти интересующий идентификатор и вернуть строку из столб­ ца соответствующего языка. Для этого можно воспользоваться фующиейVLООКUР. Это же придется проделать для всех пунктов меню, содержимого лис:rов и элементов управления UserForm. Ниже показан простой пример кода, в котором предполагается существование листа Language, содержащего таблицу поиска Translation. Кроме это­ го предполагается, что существует открытая переменная, идентифицирующая столбец, из которого необходимо читать текст. Обычно такая переменная устанавливается в спе­ циальном окне с параметрами . Обратите внимание, что нижеприведенный код не обеспечивает максимальной про­ изводителыюсти и рассматривается только в качестве примера. Более быстрая (и более сложная) подпрограмма считывала бы весь столбец с идентификаторами и текст вы­ бранного языка в два простых массива VBA и работала бы с этими данными до выбора другого языка (при.этом соответствующий столбец также считывался бы в массив) . PuЫlc' Languagecolumn дs rnteger PuЬlic Sub Test2 () , LanguageColurnn = 2 Call MsgBox(GetText(lOOl)) End Sub · Pubiic Function Getтext (ByVal Textid As I,ong) As String . Dim Test As \Tariant . Sta,tic Laпgua.geTaЬle As Range If La.nguage'ГaЫe Is Not11ing Then: . Set LanguageTaЫ е = .ThisWorkbook. Worksheets ( "Language") . Range ( ".Translation") End J;f If LanguageColumn < 2 Then LanguageColumn 2 Test = Application.VLookup(Textid, LanguageTable, LanguageColurnn) If . Not IsError(Test) Then GetText = Test , ;End Func:tie>.n . ... ·'i Многие сообщения создаются на этапе выполнения. Например, может существовать код, проверяющий вхождение числа в определенный диапазон значений: ,Ыm мes sage '" J..s . str;ing .... · M?ssage = _ · ."Число должно быть больше , Чем '' · & cstr (Min) "И меньше, чем " . & CStr(-Max) . & "." If Value <= Min Or Value >~ Мах Then Call MsgBox(Message) End Ц Это значит, что на листе ресурсов придется хранить две текстовые строки с разными идентификаторами, что неэффективно и усложняет перевод . В данном случае, при ис­ пользовании одного варианта перевода строки, максимальное значение всегда будет на-
Проблемы интернационализации 427 ходиться в конце приложения, что допустимо не во всех языках. Более правильный под­ ход предполагает хранение комбинированной строки с символами шаблонов для двух чисел. Шаблоны можно заменять числами на этапе выполнения (для Этого можно вос­ ·пользоваться функцией ReplaceHolders, показанной в конце главы): штт · ме:ssа.g:ё· As sfГing · }fessage .;= ~ · · '·' · .-'~Число доJiжно быть боЛьше %0 и меньше %1. " :..:;, /' " " , ' - . " iif .V,a1 .ue.· < =, Min Or Value >= Мах Then Call . MsgBox (-ReplaceHolders (Message, CSti (Мin) ' ~ ,J;:l),clJ f •н·.•,. -~ " .<•. , Переводчик (который не всегда понимает смысл программы) может правильно соз­ дать предложение, вставив значения в соответствующие позиции. Работа в многоязыковой среде Обратите внимание на несколько полезных советов по работе в многоязыковой среде. Оставляйте свободное место В большинстве языков слова состоят из большего количества символов, чем в англий­ ском языке. При проектировании диалоговых окон UserForm и листов необходимо ос­ тавлять достаточное количество места для размещения неанглийского текста на элемен­ тах управления и в ячейках. Хорошим правилом считается создание элементов управле­ ния, которые в 1.5 раза больше соответствующего английского текста. Использование объектов Excel Имена создаваемых объектов Excel часто зависят от языка пользов ател ьского интер­ фейса Office. Например, при создании пустой книги с помощью метода Workbooks. Add книга не всегда будет называться "BookN", а первый лист не всегда будет называться "Sheet1". Если применить немецкую версию пользовательского интерфейса, книга и лист будут называться "MappeN" и ."Tabellel" 1соответственно. Вместо обращения к объектам по имени создайте ссылку на объект и проинициализируйте ее в момент создания. Соз­ данную ссылку на объект можно будет использовать в любом месте кода: 'Diin"-.:;.w6ikЬook' 1s wo rJ<ьoak ·· : ·: :....,, · · Фim ' aworksheet As ,Worksl1eet \ !set aWdrkbook = Workbooks.Add 1~g.t.д"w91Jss_h.§~ t , .= .Wtl:J .J19;r;-k§..hee_ .t;..s.J f ). Работа с элементами управления CommandBarControl также усложняется. Напри­ мер, в меню Сервис (Tools) можно добавить собственный пункт меню, а в англоязычной среде написать следующий код: :J?'uJ3Hc7·su.ь A.Cicrne11oвtit.fon (> · Dim Tools ' As ' CommandBarPopup Dim Control-As CommandвarButton Set Toois = Appl.ication. CommandBars '( "Worksheet Menu ваr"} - . Controls ( "Too1s") Set Control = Tools.Cщn:mandBar.Controls.Add(msoControlButton} Control.Caption = "Hello" ~ . Control. OnAction = "Hello" ;_в;_р.g: ~р.Ь .."""- > • • • ~
428 Глава 17 Если используется отличный от английского язык пользовательского интерфейса, этот код не сработает. Хотя . Excel распознает английские названия панелей меню, анг­ лийские названия элементов управления не распознаются. В этом примере не распЬзна­ ется раскрывающееся меню Сервис (Tools) . Правильным решение!>f будет применение идентификатора элементов управления CommandBar. CoJJ,trol. Для поиска элементов управления можно использовать метод FindControl. Всплывающее меню Сервис (Tools) имеет идентификатор 30007 . Sub AddHelloButton2() Dim Tools As CommandBarPopup Dim Control As CommandBarButton Set Tools = Application.CommandBars("Worksheet Menu Bar") _ .FindControl(ID:=З 0007) Set Control = Tools.ComrnandBar.Controls.Add(msoControlButton) Control.Caption = "Hello" Control.OnAction = "Hello" End Sub При определенных наборах региональных параметров в некоторых объектных биб­ лиотеках существует еще одна пробл ема, связанная с именами панелей меню (например с панелями меню в голландской версии редактора VВЕ). В этих локализованных версиях ошибочно локализованы имена панелей меню (все панел~ меню должны иметь имена на английском языке). Единственным надежным методом работы с панелями меню являет­ ся откаЗ от использования имен в коде. Вместо этого необходимо применять функцию FindControl. Этот подход оказывается немного сложнее, так как один и тот же элемент управления может встречаться на разных панелях, а функция FindControl не всегда возвращает интересующий элемент управления. Большинство разработчиков используют английские имена панелей меню. ~' --,:; ,,,- :_~ ' ..-' -· - ~-- - - ::<-1 •-; ·, :·{·__ - ' ·, -- .:-, ('" --' _., ~,.' ~'~". -;<, .- _,,~:'·.у.· . , B > ГJJaB~.',26 ~будет приведе1:1а г)Ьдпрограмма, KOTS'PCIЯ , вывод11;r спИС:о~ вё~х пане11ей '1 Э11~: ,, , ментов , управr~ения,, а · такж7, 1-1х имена и . ид~t4тнфй.каторы~Ян Карел Питерсе , (Jan "Kcire[ ,, Pi.eierse )·созд~Л ~t1Иry .с .большим J<ОЛИЧ~СТВОМ Переводов :r\aнerieй.' :Этот Ф<i!ЙЛ н~3'~1ва ' , xl!1E(nuFuhD,i.s;:t . ид9стУnен · по.~ адресу ht'tp :' / ;Noл/w .'вмs'L'tct ;· i~/МVP. · :: ;'{ '' .-,._;-~-,- ")/•;, _ _ .<;,_j(·. ~- ..- '";·"-, ~. . .·,_5 1._ _,.,.: ;'< ,>,._ -·~___ '_ - ~ .-• :. _, ,, ' ·'i ~:> Использование функциИ SendKeys В большинстве случаев использования функции SendKeys стоит избегать. Чаще все­ го она применяется для отправки нажатий клавиш компонентам Excel для активизации меню или перемещения по диалоговому окну. Функция использует комбинации клавиш пунктов меню и элементов управления в диалоговых окнах таким же образом, как поль­ зователь может применять комбинации <Аlt+клавиша> для управления Excel с клавиату­ ры. Скорее всего, в локализованной версии Excel будут использоваться другие комбинации клавиш, а значит результат применения стандартных комбинаций в функции SendКeys предсказать невозможно. Например, вызов SendKeys "%DB "· в англоязычной версии Excel приведет к откры­ тию диалогового окна Итоги (Subtotals). В версии Excel с немецким языком пользова­ тельского интерфейса этот вызов приведет к завершению работы Excel. Вместо приме­ нения SendKeys для выбора пунктов меню можно воспользоваться подпрограммой Runмenu, показанной ранее в этой главе. В этой подпрограмме меню выбирается на ос­ нове идентификатора объекта CommandBarControl.
Проблемы интернационализации 429 Правила разработки многоязыковых приложений О На раннем этапе анализа приложения выберите интересующий уровень много­ языковой подцержки и обеспечивайте этот уровень в процессе разработки. О Не включайте в код текстовые строки. Всегда извлекайте строки из таблицы. О Никогда не создавайте предложение путем составления отдельных текстовых строк, так как на другом языке предложение может иметь иной порядок слов. Вме­ сто этого используйте символы шаблонов и подстаВf!ЯЙте конкретные значения на этапе выполнения. О При создании диалоговых окон UserForm делайте элементы управления больше, чем необходимо для английского текста; в большинстве языков слова длиннее, чем в английском. О Не пытайтесь угадать имя, которое будет присвоено объектам Excel при создании. Например, при создании книги первый лист не всегда будет называться "Sheetl". О Не ссылайтесь на элементы управления по названию . Хотя на сами панели можно ссылаться по имени на английском языке, для обращения к пунктам меню необхо­ дима ссылка по идентификатору (для встроенных пунктов) или по значению свой­ ств~ Tag (для собственных пунктов меню). О Не используйте функцию SendTags. Полезные функции Кроме уже· показанных дополнительных функций, например RunМenu и IsDateUS, Hl;IЖe приводятся еще те дополнительные функции, которые оказываются полезными при разработке многоязыковых приложений. Обратите внимание, что код совместим со всеми версиями Excel, от 5.0 до 2003, а значит не использует более новых конструкций VВА (например, объявление типа необязательных параметров). Реал~зация функции WinToNum Функция WinToNum определяет, . является ли строка числом, отформатированным в со­ отв етствии с региональными параметрами Windows . Если это так, с:rрока преобразовы­ вается в значение типа DouЫe. Для индикации результата преобраз.ования функция возвращает значение True или False. Кроме этого, она может выводить сообщение об ошибке. Эту функцию стоит использовать в качестве вспомогательной при проверке чи­ сел, введенных пользователем. Ее применение показано в предыдущем разделе "Взаимо­ действие с пол~зователями". Обратите внимание, что если пользователь переопределил разделитель целой и дроб­ ной части и разделитель разрядов, которые указываются в региональных параметрах Win- dows, строка должна быть преобразована с помощью функции OverrideToWRS и только после этог'о передаваться функции WinToNum_. Prl.vafe Sub sho w(ByVaT message 'лs~ ~H:.rlng)"·:·~ Const mask As String = _ ~·Это сообщение не распознается как " & message & ." в соответствии с региональными параметрами Windows" Call MsgBox(mask, vbOKOnly ) End Sub
430 Глава 17 Publ ic Furict:l.ori" winтo.Ni.u'ii (ВуvаГ winstr:l.ng A.s .st:i:ing, ' ByRef resultAs DouЬle, Optional ByVal ShowMessage As Boolean) As lean Dim Fraction As DouЫe winstring, ; Trlm(winstring) Fraction = 1 ' If ' TsMiss,ing (ShowMessage)' Then ShowMessage I t' winString " " Then winstrihg = "О", IC. winString = "" Then winString = "0 " If InStr(l, winString, "%") >О Theil Fraction = ' Fraction / 100 ' True winString Application.Substitute(winString, "%" , End ,If Tf IsNumeric(winString) Then ' r 'esul t = СDЫ (winString) * Fraction WinToNum = . True Else .If ShowMessage Then Call Show( "numЬer") resuit = О · ' WinToNum False End ' rf' En.d. F],!J'lCJ:ipp В переменной WinString содержится строка для преобразования, а в переменной Resul t - преобразованное число. Если строка не является числом или пустая, перемен­ ная Result устанавливается в нулевое значение . Параметр ShowMessage является не­ обязательным. Для вывода сообщения об ошибке установите его в значение True (или вообще fie устанавливайте). Для отключения сообщения об ошибке установите параметр в значение False. Реализация функции WinToDate Функция _ WinToDa te предоставляет функциональность, подобную функционально­ сти WinToNum, но выполняет преобразование дат, а не чисел: )uь1ic i?U.nctio n winтoDate (вyva Гw:l.nstrTng· A.s 81::.ring, ;_ _ · ..,.,. ~- .~ ByRef result As · DouЫe, Optional·. ByVal ShowMessage As Boolean) As Boolean . If IsMissing(ShowMessage) Then ShowMessage winStriri.g . = " " Then . result = О . WinToDate = True Elseif IsDate(winStriilg) Then result = CDЬl(CDate(winString)) WinToDate = True . Else ..· · If ShowMessage Then Са11! Show( "dat.e") result=О · · WinToDate = · False End .If . True
Проблемы интернационализации 431 Аргумент WinString содержит строку дл$! 11реобразования. В аргум"ент Resul t зано­ сится преобразованное число. Если строка не является датой или является пустой стро­ кой, аргумент Resul t устанавливается в нулевое значение. Аргумент ShowMessage яв­ ляется необязательным. Для вывода сообщения об ошибке этот аnгумент должен быть установлен в значение True (или должен отсутствовать). Для подавления вывода сооб­ щения установите этот аргумент в значение False. Реализация функции FormatDate Эта функция выполняет форматирование даты в соответствии с региональными па­ раметрами Windows. Для указания года используются четыре цифры. Кроме этого, пре­ доставляется возможность добавления строки времени: )Я.!ЬЛ_c-' F'unc.tl.oii ~ 'Formatr:5ate(в:Yvai ar:5ate -л-$ .Date, · :. ._ -"~~-·-' · Optional ByVal IncludeTime As Boolean) . As String _ ' , Dirn b~t~Stiing As ,' Str_ing · ' '\. '"· ', ! , Ц IsMissing(IncludeTime) Then . IncludeTime = False · Select , Case Appl .ic,ation. International (xl~ateOrder) case о aDate = Format$ (aDate, "m rn/dd/yyyy") _ Case1 Date Case 2 . · Date End Seiect Format$ (aDate, " dd/mrn/yyyy") Format$ (aDate, " YY-YY/mrn/dd") .<Н IncludeTime Then DateString Format$ (aDate, " h h:mrn:ss") FormatDate = DateString aDate :J?.n9•. :<':Чч~t::1оч _"~., _ ,_,, -._ __ -~"'-~- ··- - _ , &11lt& > ./.•• Аргумент aDate содержит численное представление даты, а IncludeTime является необязательным аргументом, который можно установить в значение True, что позволит добавить к результату строку времени . Реализация функции ReplaceHolders Функция ReplaceHolders выполняет подстановку символов шаблонов. Значения для подстанов15и предоставляютс:Я в качестве аргументов: 1.PliЫi.c ' 'Fi:цJ.'ёtiЪn R.ei:>1aceНolders-<вY.var stг · дs stiing~----~ · ParamArray Args () A:s Variant) As · String · :Dim :i: As In.teger For r = · uвound(Repiace) то LBound(Replace) Step 1 Str = .Wo;r:ksheetFunction.Substitute(Str, "%" &· l , Replace ( I - LBound (Args) ) ) · Next • Replaceнo·lders = Str Аргумент Str содержит текст, в котором выполняется замещение шаблонов. Массив Replace содержит список заменяемых шаблонов.
432 Глава 17 Резюме В Excel можно создавать приложения , которые будут работать в любой версии Excel и на любом из 180 языков пользовательского интерфейса , хотя создание таких приложе­ ний не всегда оправдано экономически. Если количество пользователей приложения ограничено и есть возможность прину­ дительно назначить , язык пользовательского интерфейса и региональных параметров Windows, приложение можно создавать, не задумываясь о вопросах интернационализа­ ции. Даже в этой ситуации стоит выработать привычку создавать код, -независимый от региональных параметров. Требование независимос::ти от региональных параметров должно фигурировать в документах по анализу и проектированию, а также по стандартам написания кода. Намного проще и дешевле сразу написать код, независимый от регио­ нальных параметров, чем перерабатывать существующее приложение. Приложение, как минимум, должно работать вне зависимости от региональных парамет· ров Windows, языка пользовательского интерфейса Windows или языка пользовательского интерфейса Office, даже если с помощью команды СервисqПараметрыqМеждународные (Too[sqOptionsqInternational) бьти установлены собственные разделители ·тысяч и сотен. Следующие возможности Excel не следуют правилам и должны использоваться с осо­ бой осторожностью: О функция OpenText; О использование метода SaveAs для сохран.ения текстового файла; • О метод ShowDataForm; О вставка текста из других приложений; О все формы свойства .Formula; О <range>. Va lue; О <диапазон>. FormulaArray; О <диапазон>. AutoFil ter; О <диапазон> .AdvancedFilter; О функция листа =ТЕХТ ; О Application. Evaluate; О Application. ConvertFormula; О Application. ExecuteExcel4Macro; О WеЬ-зацросы . Кроме этого, существуют некоторые возможности Ехсе!, которых стоит избегать лю­ бой ценой: О функция SendKeys; О использование значений True и False в импортируемых текстовых файлах. При создании многоязыковых решений стоит тестировать реализацию на каждом поддерживаемом языке. "' /
Книги · и ЛИСТЬI В этой главе речь пойдет о программном управлении книгами и листами. Здесь будут рассмотрены важные фундаментальные процедуры, которые помогают . эффективно управлять двумя базовыми объектами Exce l. В частности, будут рассматриваться коллек­ ции книг и листов, а также код, необходимый для сохранения и перезаписи этих объек­ тов в процессе изменения состояния . Использование коллекции Workbooks Коллекция Workbooks является свойством объекта Application. Через эту коллек­ цию можно получить доступ ко всем открытым книгам каждого из экземпляров Excel. Как и все коллекции, коллекция Workbooks проектировалась в качестве хранилища для объ­ ектов Workbook. Кроме этого , как и во всех коллекциях, в ней поддерживается добавле­ ние и удаление элементов. Рассмотрим некоторые программные операции, которые под­ держиваются коллекцией Workbooks и объектами Workbook. Как подсказыв<J:ет название, колле"кция является просто хранилищем набора объектов . Разные коллекции практически ничем не отличаются друг от друга: объекты добавляют­ ся , подсчитываются и удаляются. Различаются типы объектов , хранящихся в пределах коллекции, и именно объекты предоставляют интересующую функциональность. Таким образом, все показанные ниже методики на самом деле являются операциями над объек­ тами Workbook. Создание книги Базовая идея в основе хорошей объектной модели подразумевает предоставлени.е од­ нородных и · интуитивных возможностей. Например, если есть набор сущностей , то вполне понятно, что должна быть возможность Добавления сущностей в этот набор . На
434 Глава 18 самом деле, интуитивно понятно, что все коллекции должны поддерживать одинаковое поведение . Простым методом добавления книги в приложение является вызов метода Add коллекции Application . Wo r kbooks: Вызов метода Workbooks. Add добавляет новый экземпляр класса Workbook в. эк­ земпляр приложения Excel и делает эту книгу активной . Кроме этого, объявляется объ­ ект Workbook и результат работы метода Add присваивае.тся переменной типа Work- book. В итоге переменная выступает в роли удобной ссылки на новый объектWо rkЬооk. Сохранение активной кнИги Одной из ожидаемых операций над книгой является сохранение . Книгу можно запи­ сать в файл, предположив, что недавно добавленная книга является активной. Кроме этого, можно воспользоваться объектной переменной, которой присваивается результат работы метода Workbooks. Add. Ниже показаны операторы добавления книги и сохра­ нения активной книги в файле: 'A .pplitation. woikьooks :.Add. · ~<::.a.!l . App_l~c:aЧe>n.Act ivewo_r}<.l:юo,I} . ~p,yeЛi>J "J em.p ,,xl s") ·= .~ . В результате работы этого кода создается новый объектWоrkЬооk. Ссылка на создан­ ный объект не сохраняется . Вместо этого для взаимодействия с объектом используется свойство Application . ActiveWorkbook. Еще одним подходом является обращение к коллекции для получения конкретного экземпляра класса Workbook или сохранение ссылки на созданный объект. Любая из этих ссылок может использоваться в вызове ме­ тода SaveAs. Ниже показана реализация каждого из подходов: tг Сохр'а'нение ко'пйи: iюлуЧённой ПО 'номе'ру 'Из коЛЛекЦиИ workbook's ,Application. Workbooks :Add . . ,Call Application.ActiveWorkbook. SaveAs ( "templ .x1s") 1Applicati'on . Workbooks ( "templ ,xls") . Sav~As ("сору ' of templ .xls") 1 Использо.вание сохра.ненной ссьmки н.а добавленный объект · Dim W As WorkЬook . . 1 :set W = Application.Workbooks.Add iS:.a.l .l . ~-~.§pV§!\:9 ( " tщnp2 . Х}§ ' ') ..... ""'"'. В первом примере показано, как создавать новую книгу и сохранять ее, получая ссыл­ ку через свойство ActiveWorkbook. После этого ссылка на книгу извлекается из коллек­ ции по имени книги и с помощью полученной ссылки создается резервная копия . Во вто­ ром примере показано, как сохранять ссылку на соЗданный экземпляр класса Workbook и вызывать метод SaveAs этого экземпляра . Обе операции приводят к одному и тому же результату. Важно обратить внимание, что существует различие между операциями над объектом коллекции Workbooks и отдельным объектом Workbook. Можно заметить, что постоянно используется метод Add коллекции Workb.ooks и метод SaveAs отдельного объекта Workbook. Следовательно, можно сказать, что коллекция поддерживает метод Add и обращение к элементам коллекции, а объект Workbook поддерживает пов едение SaveAs . Это касается всех объектов: если известен класс объекта, на который с~ылается код, можно определить доступное поведение этих рбъектов . · · Активизация книги ( Более правильным способом создания .ссылки на новую книгу является использование возвращаемого значения метода Add для создания объектной переменной. При этом Проще обрЩаться к созданным книгам и отслеживать временные книги без их сохранения ~а диске. ·
.su.ь - Ы.ewworkЬooks't)"'···-.· Dim Workbookl As . workЬook bim Workbook2 As ' W6rkbook Set Workbookl = Workbooks.Add Set Workbook2 = Workbooks.Add w Wor·kbooki. Ас tivate · :!"n<i .~:цJ:?••.: .; ...• .,, .;__ _ ,___ , _, "~-~;,. Книги и листы 435 Метод.Аdd позво:~яет указывать шаблон для создания новой книги. В качестве шаблона не обязательно использовать файл шаблона с расширением . xlt. Это_ может быть и обыч­ ная книга с расширением . xls. Следующий код создает новую, не сохраненную книгу, ко­ торая называется SalesDataX, где Х- это последовательное число, увеличивающееся при создании книг на основе этого шаблона так же, как Ехсе! создает книги, которые называют­ ся Книгаl, Книга2 и т.д. при создании книги через пользовательский интерфейс. ,?et.. w(:н-k!JooJ<1 = . • w91' .J:< Ь.99J s § ~,ЖM: ~:.Г~!11P1?.i .€?.:_о:~:· f:i \P.~~t~X§.~i:§~P<=!..t.~;4~." Для_ добавления существующего файла книги в коллекцию WorkЬooks можно вос­ пользоваться методом Open. Возвращаемое значение метода Qpen можно применить для создания объектной переменной и обращения к книге в дальнейшем. :s.~·t-_w6"fkьgoki . :.; _- - w6r. ]<Ь Q,'§... k§.' bpen CF'__:jJ_ell.~me г;; "с: \ ba,_t:aSbl§:s6a t aT : ~is ;'Г""'- .z:· ..~ Получение имени файла из полного пути При работе с книгами средствами VВА часто приходится указывать путь и имя файла. Не­ которые задачи требуют указания только пути, например, при указании принятого по умолча­ нию каталога. Некоторые зада~ш: требуют только имени файла, например, при активизации открытой книги . Для выполнения отдельных задач требуется и то и другое, например при от­ крытии существующего файла книги, который находится за пределами текущего каталога. После открытия книги можно получить путь, полный путь и имя файла или только имя файла. Например, следующий код отображает имя файла SalesDatal. xls в окне сообщения: 'sёt: workьooki .;,worki::ю61<S:-6P'en (F':CПftJaffie ;",;«ё', \D a ta\saTes .Da t:al -:XI S"i l~sg-B_O:J:< w_o:i;:);<Q().()~l '~Ci.!!1.§,.,A. -~- -- ·-· • -~-ц--·'""''- - ~~--- Свойство WorkЬookl . Path возвращает значение "С: \Data", а свойство Work- bookl. FullName возвращает значение "С: \Data \SalesDatal. xls " . Но если при наличии полного пУти к книге необходимо определить, открыта ли книга в данный момент, из полного пути· придется извлечь имя файла для получения зн;ачения свойства Name объекта WorkЬook. Следующая функция GetFileName возвращает имя файла SalesDatal .xls, извлеченное из полного пути С: \Data\SalesDatal . xls: >P.U:ncйon 'бetF':l'I. eName(вyvaY !?afh As ' Dim r As Integer For I = Len(Path) То 1 Step -1 If Mid(Path, Т, 1) = ·Application.PathSeparator Or Mid(Path, I, 1.) = 11 · " Then Exit For I) t . GetFileName Right ( Path, Len ( Path) ,_Е_ф i:J:l~C\:,i()D ~"••-"-"и~~·
436 Глава 18 Для правильной работы функции GetFileNarne на платформах Matintosh и Windows символ-разделитель компонентов пути извлекается из свойств а PathSeparator объекта Application. (Явная проверка наличия двоеточия добавлена для обработки путей вида с: autoexec. bat, которые вполне допускаются в операционной системе Windows . ) На платформе Macintosh это свойство возвращает значение : , а на платформе Windows - значение \ . Функция Len возвращает количество символов в значении свойства Path, а цикл For . . . Next выполняет обратный перебор от последнего символа в значении Path, пока не найдет символ -р а"зделитель . После обнаружения символа-разделит еля цикл For. . . Next завершает свою работу . Значение счетчика I соответс'I:вует положению символа-разделителя . Если последний не обнаружен, по завершении цикла For . .. Next счетчик будет иметь значение О. При нормальном· заверш~нии цикла ·For : : .. Next переменная счеiтЧика не будет'' равна значению nараметра ·цикла Stop. Зна~енне счеiтчика будет н'а единицу больше. · Функция Right используется для извлеч ~ ния символов спр ава от разделителя в стро ­ ке Path. Если разделитель не обнар ужен , возвращаются все символы из строки Path. После получения имени файла книги можно воспользоваться функцией IsWork book - Open и определить, присутствует ли интересующая книга в коллекцииWоrkЬооks . J:>i.iЬ:l.IC F' u nc:t.·ian · r sworkБ6oko]) en-(в :fva:l. w6Г k ь ookNa m e ·· д.5 : 5 t.r ing) ~~As :Boolean · . . ' On Error Resume Next. IsWorkbookOpen = WorkЬooks(WorkbookName) Is Nothing = :En.c'l . f.'~no1:iop ··- ~- ~... ". ·-······-~- ·· В показанном выше коде функция IsWorkbookOpen пытается присвоить объектной переменной ссылку на книгу. После этого проверяется успешность попытки. Альтерна­ тивным способом получения этого результата является поиск в коллекции Workbooks имени объекта Workbook, которое передается в качестве аргумента. В предыдущем: примере оператор On Error Resume Next защищает от ошибок вре­ мени выполнения, если книга не открывается . Если интересующий документ найден, функция IsWorkЬookOpen возвращает значение True. Если не определить возвращаемое значение функции типа Boolean, функция будет возвращать значение False . Другими словами, если книга с интересующим именем не найдена , возвращается значение False. В следующем коде используются показанные выше опр еделенные пользователем функции GetFi l eNarne и IsWorkbookOpen. Подпрограмма ActivateWorkbook акти­ визирует файл книги, путь к которому присвоен переменнойFilеNаmе . ;t11ьп e:~-:su.ь · :д.ct:i:vatёwor k.Ъo6JZ CГ"" .. f•· "Dim FullName As String Dim FileNameAs String Dim Workbook1 As Workbook · FullName ·F i leNaine "С: \Ternp\Book1 .x1s" GetFileName{ ".Book1 .,_xls" ). i IsWorkЬ9okOpen(FileName) Then Set . Workbookl· = Workbooks (F;i.1eName) .. W()rkbookl ;Activate · · Else ;'· ·· ··· " Set Workbooks . Open (Fi 1 eName: =Ful lName) ~= End I__f.~ ·J;:rid §ч.1?: . •
Книги и листы 437 Для извлечения имени файла книги в подпрограмме ActivateWorkbook использу­ ется функция GetFi l eName. Полное имя хранится в переменной FulIName. Имя книги присваивается переменной FileName. После этого функция IsWorkbookOpen прове­ ряет, открыта ли книга Bookl. xls в данный момент. Если файл открыт, ссылка на объ­ ект Workbook присваивается объектной переменной Workbookl и книга активизирует­ ся. Если файл не открыт, подпрограмма открывает файл и присваивает возвращаемое значение м.етода Open объектной переменной Open. После открытия книги она автома­ тически с~:_ановится активной. Обратите внимание, что в показанном выше коде де.лается предположение, что файл книги существует в указанном каталоге. Если файл отсутствует, работа кода завершится ошибкой. В разделе "Перезапись существующей книги" приводится ' пример функции FileExists, которую можно использовать для проверки существования файла. Файлы в том же каталоге Распространенным подходом является разделение приложения на несколько книг и хранение связанных книг в одном и том же каталоге. В этом же каталоге · хранится книга с кодом управления приложением. В таком случае имя общего каталога можно использо· вать в коде для открытия связанных книг. Но если жестко вписать имя каталога в код, то при изменении имени каталога или копировании файлов в другой каталог на том же компьютере или на другом могут возникнуть проблемы. В таком случае придется моди­ фицировать путь к каталогу в 1'6де макросов. Для избежания проблем с поддержкой можн.о воспользоваться ссылкой ThisWork- book. Path. ThisWorkbook содержит ссылку на книгу, содержащую код. Вне зависимо· сти от того, где расположена книга, свойство Path объекта ThisWorkbook возвращает путь к каталогу со связанными файлами. Использование этого свойства показано в сле­ дующем коде: PuЫ'i.c si.iь дct.ivateworkbook2() "' D:i,m Path, As String Dim F:ileName As string Dim FullNameAs String Diш Workbookl As Workbook ' · . FileName = · "·Bookl. xls" ~"- If т.SworkЬookopen' CFileName) тhen · Set: 'w6rkbookl = Workbooks (FileName) , workbookl .Actiyate ",Else .. ·· ·' · Path =· тhiswoi'kьook. Path FullName = Path & "\" & FileName , End 'End su.ь ·-~., ,.с?-: ··' ''-~.• -~•. · WorkЬ6okl = . workbooks.Open(FileName:=FullName) Перезапись существующей книги При сохранении книги с помощью метода SaveAs с использованием конкретного имени файла есть вероятность, что имя уже существует на диске. Если файл существует, пользователь получает сообщение с предупреждением и должен принять решение о пе­ резаписи существующего файла. При необходимости можно отключить предупреждение и установить программный контроль над процессом сохранения.
438 Глава 18 Если существующий файл необходимо перезаписывать при каждом сохранении, от­ ключите предупреждение с помощью следующего кода: 'РU.ЬПс ' sU.ь ' saveAsтest() ~v ' Dim Workbookl As WorkЬook " Set Workbookl = Workbooks.Add Application. DisplayAlerts = Fals,e ,Work bookl. SaveAs FileName: =Th i sWorkbook. Path & " \ temp. xls" Application.DisplayAlerts = True End sчJ2, , _ Если необходимо проверить существование файла и выполнить альтернативную опе­ рацию, можно воспользоваться функцией Dir, Если эта проверка должf!а выполняться достаточно часто, можно применять следующую фyнкциюFileExists: :F1l:(lction f'i1eE:x'ists '(вyva1 FileName A.'s st:r:ing) Лs Fi1eExists = Len(Dir(FileName)) >О ,i,;:ng,, F1J,!1C!:cio,n _ "~~'- '. , Функция Dir сравнивает аргумент со списком существующих файлов. На платфор ме Windows функция Dir может использоваться с символами шаблонов, например "* .xls". Если функция обнаруживает соответствующие шаблону файлы, возвращается первое совпадение. Вызов функции без аргументов позволяет получить последующие совпаде­ ния, В данном случае необходимо получить точное совпадение. Если такой файл суще­ ствует, функция вернет значение, совпадающее со значением аргумента. Если такого файла нет, функция вернет строку нулевой длины. В следующем примере показано, как использовать функцию FileExists для поиска конкретного имени файла и выполне­ ния альтернативной последовательности действий . \:>U:blic $u:Ь тe stForf'i:Гe(J Dim FileName ,As , String FileName = ThisWorkbook.Path & "\t~mp.xls" If FileExists(FileName) Then MsgBox FileName ' & " существует" Else MsgBox FileName ' & " не суЩеству,ет" End ,If Альтернативная последовательность действий зависит от конкретной ситуации. Од­ ним из вариантов является запрос у пользователя другого имени файла. Еще одним ре­ шением является создание нового irмени файла с помощью добавления последовательно­ сти цифр к существующему имени. Пример такого решения показан ниже: !P'uЫlё ''si:iБ ' createNex.fFI1eN'aiiieП~·- . Dim WbrkЬookl As WorkЬook Dim I As Integer ;., Dim FileName As · String Set Workbookl \~" \Temp::iйs" ) ",:(='о r'=I+1 Workbooks.Add(Template:=ThisWorkЬook.Path ,FileName" = ThisWor kЬ6ok.Path ~,o,9p,,W,Ьil e~ .J:',il§!E;X,i?t:S. (FiJ_E;!~am~).
Книги и листы 439 , Y'?rktJookl. saveA,~ Fi'leName: =F.ileNasne 'End; Е;-1-:11?, .•·• . . .. , , .:, .:. = __" В этом примере при существовании сгенерированного имени файла на каждой итера­ ции цикла Do. . . Loop значение счетчика I увеличивается на единицу. Когда счетчик I достигнет значения, не соответствующего существующему файлу, выполнение цикла за­ вершится и файл сохранится с новым именем. Сохранение изменений Книгу можно закрыть с помощью методаСlоsе объекта Workbook. ·,~c~i;: iYi:.vi:O'r:-kJ3.90JS~~~],]?'~§:: ~,;, ::: ,'; .;;,;,·,;w,~>·•-~м·····'"···" ··,, '" " " " " '>""' """"'"""'" ·• - ·•=· . , ", ,"" , ·' ·--"Cii"'" ··/.:я·.:&t::JJ.':Л:.+....i~:'C\i;;;,.:.-·: Если в книгу вносились изменения, пользователь получит запрос на их сохранение до закрытия книги. Существует несколько способов отключения этого запроса. Их приме­ нение зависит от необходимости сохранять внесенные изменения. Один из параметров методаСlоsе позволяет автоматически сохранять изменения. тs·uь·'":' с ~osei;{ O r·~~oo"kY { y~ · ~У~;: " "" ">"""'~~· u·· ~e> "'No"> · -~ : , , . . •---~~~-·~·<"•Pr;-: . . ~-,-·:-v'Y<:''"'ry' . ~ · Diщ Workbookl As workЬook ., Set workbookl =ё Workbo;ks: Open ( Fi leName: =ThisWorkЬo'ok. Ра th. ; ~"\Temp.xls") .. Range ( ;,А1"), Value = Forma:t (Date, "ddd Range("A1") .EntireColuinn . ' AutoFit · wCi·rkbookl. Clqse · Savechanges: =Tr~e 'Epd ~Sub Если изменения не должны сохраняться, установите аргумент SaveChanges метода Close в значение False. Иногда возникает необходимость оставить измененную книгу открытой для просмот ­ ра, не сохранять внесенные изменения и не получать запросов на сохранение при закры­ тии книги. Для этого можно установить свойство Saved объекта книги в значение True . В результате Excel посчитает, что книга не содержит изменений, которые необходимо сохранить. Перед использованием следующей строки кода необходимо удостовериться, что это действительно то, что нужно: ::Т\9t:Т.У~wо,rkь~о9К,~ё!У::е.о:7.'тi_ц~..=.~:..:· ..=-""' Коллекция Sheets Внутри объекта WorkЬook хранится коллекция Sheets, в которую могут входить как объ­ екты Wo rksheet, так и объекты Chart. Для совместимости со старыми версиями Excel кол­ лекция поддерживает хранение таких объектов, как DialogSheets, Excel4MacroSheets и Excel4InternationalMacroSheets. В Excel 5 и Excel 95 модули также хранились в кол- лекции Sheets, но с вьrходом Excel 97 они переместились в редактор VВЕ. · Модули нз книг, . созданны)( в Excel 5 или Excel 95, в более nозДннх версиях Ex.cel счита­ ются членами скрытой коллекции Modules. · ,D.nя управления модулями моЖно nродо~:~­ жать использование кода, созданного для более ранних версий.
440 Глава 18 / Объекты Worksheet и объекты Chart принадлежат собственным коллекциям Work- sheets и Charts соответственно. В коллекцию Charts входят только листы диаграмм. Другими словами, встроенные в листы диаграммы не являются членами · коллекции Charts . Встроенные в листы диаграммы хранятся в объектах ChartObj ect, которые вхо­ дят в коллекцию ChartObj ects. Дополнительная информация приводится в главе 24. , Листы К листу можно обращаться по имени или по порядковому номеру в коллекциях Sheets или Worksheets. Если известно имя листа, то его можно использовать для вы­ бора листа из коллекции Worksheets. Если необходимо обработать все элементы кол­ лекции Worksheets, например в цикле For ... Next, на каждый лист можно ссылаться по порядковому номеру . Порядковый номер листа в коллекции Worksheets может отличаться от порядково­ го номера листа в коллекции Sheets. В пределах книги на лист Sheetl можно ссылаться с помощью следующих конструкций: 'A.ct.i.vew6r kь6'6:k:. sьeets ( ~ sheёt1") · Activeworkbook.Worksheets("Sheetl") ,ActiveWorkbook.Sheets(2) ;~ct iY~W.C>.:r:kJ?oo.~ :W.<?Lk§.1:1.~~t:: ~.J.~)-=-·-·-~·=·~~- ,, ~-- . . ~· :,..;"~ .• »: '. , Свойство Index объекта Worksheet скрывает в себе ловушку . Свойство Index объ­ екта Worksheet содержит номер листа в коллекции Sheets, а не в коллекции Work- sheets. Следующий код перебирает все листы в коллекции и выводит имя и номер лис­ та (рис. 18.1). Sh eet2 иМ еет значение своНства lndex равное 2 Рис. 18.1. Имя и номер листа в коллекции ~"'РЦЬI { С~ ~ SUБ~WO :i~-SБ.eёtfiiCi"~·x··cy ... ···vw···c=="~~"Y--fr· DimI As _Integer For I = 1 . · То ThisWorkЬook .' worksheets . Co~nt МsgBox ThisWorkbOok.Workshe'ets(I) .Name & '" имеет значение свойства Index · равно.е l~тhiswьr'kЬoьk': worksheets (I) .rnd~x : Next r · ·· : ~~p~g ,; '§HOi:,.",~-,J~.i;,.~~~-~-~~д~.:.:hiA .hс.ш,~,~· ~~~:~:.~---~'"·~·:',~---~'~ ,_;·:::Ck.h~. .-,_~_;,.:, ,~~>~>~-":с.<--~/~<~~ По возможности избегайте использования свойства Index объекта Worksheet, так как в результате получается сложный для понимания код. В следующем примере показа­ но, как нужно использовать значение свойства Index объекта Worksheet в качестве но­ мера в коллекции Sheets (а не в коллекции Worksheets) . Эта подпрограмма добавляет пустой лист диаграммы слева от каждого листа в активной книге. p0u.ь1:tё: "sU:Ь':1n:з-eп ёьai:-Esвeiorёworks1:iee·ts ' '". Dim Worksheetl .As Worksheet .<> . .."., .· ' ,~::~;;<:·;,o. ..,. . .. . ~,,,,,,.,.,,;, , .. ,.,.,_ _ -j; ;.,,,.: ti _ ~:j. .; )t; :.- -; ;.~ ~: . ".".·~ -~·-'-"-··"'·-·;.;;
Книги и листы 441 Г'"' For . 'Ea·e:ь ·warksfieet1 rn ·worksheets ' J· Charts.Add ~efore: = Sheets(Worksheetl.Index) Next Worksheetl ' Eng_, $,llb , В большинстве случаев применения свойства Index можно избежать. Показанный выше код можно переписать следующим образом: ' Public Su!:i InsertChartsJ3eforeWorksheets2 О Di m Worksheet As Worksheet · For Each Worksheet In Worksheets Charts.Add Before: =Worksheet Next Worksheetl i~Ч<i. S,llb. - --- .J Странно, но Excel не позволяет добавлять нову16 диаграмму после последнего листа, хотя перемещение существующей диаграммы после последнего листа поддерживается. Если необходимо добавить лист диаграммы после каждого листа, можно воспользоваться следующим кодом: Гi'U.J31J. ё'·sиь insertcbartsд.й·e·r:workshee.tsл· ··~ Dim Worksheetl As Worksheet Dim Chartl As Chart For Each Worksheetl In Worksheets Set Chartl = Charts.Add Chartl.Move After: =Worksheet1 . Next Worksheetl , (:>ub .-~·"' •. Более подробно листы диаграмм рассматриваются в главе 23. Методы Сору и Move Эти методы объекта Worksheet позволяют копировать или перемещать один или не· сколько листов в результате одной операции . Оба метода принимают два необязательных параметра, описывающих пункт назначения операций . Пункт назначения может нахо· диться до или после указанного листа. Если не указывать ни один из этих параметров, лист будет скопирован или перемещен в новую книгу. Методы Сору и Move не возвращают значение или ссылку, поэтому для создания объ· ектной переменной, которая ссылается на перемещенный илц скопированный лист, при­ дется воспользоваться другими методиками. Обычно это не проблема, так как первый лист, полученный в результате работы метода Сору, или первый лист, полученный в результате перемещения грхапы листов, становится активным сразу после завершения операции. Предположим, есть книга (рис . 18.2), в которую необходимо добавить еще один лист для февраля (и еще листы для последующих месяцев). Числа в строках 3 и 4 являются входными данными. В строке 5 содержатся расчеты разности значений из строк 3 и 4. При копировании листа может потребоваться удаление данных с сохранением заголов- ков и формул. . 1 В результате работы следующего кода создается новый лист с ежемесячными данны­ ми. Новый лист вставляется в книгу после последнего месяца. Код копирует первый лист, удаляет числовые данные, сохраняя заголовки и формулы. После этого лист пере· именовывается в соответствии с текущим месяцем и годом .
442 Глава 18 С·D ~~~~~~~~-- +- ······ .. 1 ..... ·· ······ ··.·· ·-········· -·· -: ··-············ ·· ·····: ·-·· i Яблоки ' Манго ; Бананы ! Личи з ! nр~Изв~дство Г 907 ! 9s6T ·· ······· 9~7 1 951 1 4 JПрОД~И ш ···ш·шlп . 9~7!!... 947 1 92215 111 ' · .. 917 1 5 ~~ ~ 6 ! j !..... .... J 7-" ...·····т ... ... ...... . :J..... ... " • • : ~\~.!:!~.lQ.Q;1.Г.•. Готово Рис. 18.2 . Книга, в которую необходимо добавить лист РuЬПс -suь :Newмьrii;Ji. п " · , Ьiщ l'l<? rksheeч . .As worksheet Dim FirstDate As Date Dim FirstMonth As Integer Dim FirstYe~r А~ Integer ' Скопировать первый лист и получить ссылку ' на новый лист Work.sheets(l) .Сору After:=Worksheets(Worksheets.Count) Set · Worksheetl = vyo rksheets(W6rksheets .Count) ' .. Считать данные с листа · FirstDate = DateValue(Worksheets(l) .Name) FirstMontt1' = Month(FirstDate) " · · . t: · J .FirstYe<J.i ''= Year (FirstDate) ·· ВьiЧИслИ'ть следующую да_ту · и сформировать 1 ' строку · дл·я имени нового листа Worksheetl .Name = Format(DateSerial(FirstYear, FirstMonth + Worksheets . Count - 1, 1), "mmm уууу") ' ,<: "!. А, ' •/, ' Удалить старое содержимое из нового листа On Error Resume Next W6rksheetl . Cells.Specia1Cells( _ xlCellTypeConstants , 1) .ClearContents ,EnC\ . $1,!b _,, .... -····· ··"'' Результат работы кода показан на рис . 18.3 . Метод NewMonth создает новый лист и устанавливает на него 'ссылку . После этого считывается и разбирается имя первого листа, на основе которого создаетс_я имя сле­ дующего листа (дата в имени листа увеличивается на один месяц) . И наконец, в новом листе удаляются старые данные с сохранением заголовков И формул . Метод Dat eSerial используется для расчета следующей даты, а метод Format по­ зволяет получить строку даты в формате "ммм гг гг". В результате дата будет состоять из трех символов названия месяца и четырех цифр года. И наконец, с помощью метода SpecialCells очищаются ячейки, содержащие цифровые данные . Метод Special- Cells более подробно рассматривается в главе 19.
2i Яблоки ' манго :Бананы 3 iПроизводство [ 4 ! Продажи ' ' s .. L::O! 6 7 ,,~,"; -•t i\:~fii~2-99i~Ф..~~ ~90.~/ Готово j Oi Рис. 18.3. Ориrональный лист и его копия Группирование листов Книги и листы 443 Для ручного группирования листов в книге щелкните на вкладке листа и, удерживая клавиши <Shift> или <Ctгl>, щелкните на другом листе. Клавиша <Shift> позволяет сгруп­ пировать все листы между выбранными. Клавиша <Ctгl> позволяет добавить в группу только выбранные листы. Кроме этого, листы можно группировать средствами кода VВА. Для этого применяется !'1етод Select коллекции Worksheets в комбинации с функцией Array. Следующий код позволяет сгруппировать первый и второй листы. В результате работы кода первый лист становится акти~ным: ;woiksheets(Array (i, :2JJ .seiect ~Wo:z::.k?J.:t~el,s_ ( J i,~_,fl.;: tiv~ t ~ , .• ". ' ' Кроме этого, для создания группы можно воспользоваться методом Select объекта Worksheet. Первый лист выделяется oбЫYJHЬli\<I способом. Остальные листы добавляются в группу вызовом метода Select с пара.м:етром Replace, уЕТановленным в значение False: (PUБ_:t"iC~SUЬ ь·rouPSheet..S,( )·v · ·* ·1'·· ·v·" · Dim Narrfes(l То 3) As String · Dim I As Integer Names (1) "Янв· 2002" Names(2) "Ф ев 2002" Names '(З) "Мар 2002" Worksheets(Names(l)) .Select F;orI=2То3 -· Worksheets (Names ( I) ) . Select Replace: =False Next r Показанная выше методика особенно пол езна, если имена листов предоставлены пользователем, например, через список с поддержкой множественного выделения. - Qдним иЗ преИмуществ ручного группирования· листов является распростране1:1ие вставки данных и · изменений форматирования активноi-о листа на остальные листы в группе, При группировании листов средствами УВА внесенные · изменения сохраняются только на ак­ тивном · листе. ·Если. необходимо внести одинаковые изменения на все листы в группе, _воспользуйтесь циклом For ... Next. ·
444 Глава 18 1 Следующий код вносит значение 100 в ячейку Al листов с номерами 1, 2 и 3. Кроме этого, содержимое ячейки выделяется полужирным шрифтом . . i:> uы i'c ·silь F'ormatGroup ( J ,. • ' Diro AllSheets As Sheets Dim Worksheetl As Workshe.et Set AllSheets = Worksheets(Array(l , 2, 3)) " :Por Each Worksheetl Tn AllSheets Worksheetl . .Range("Al") ' .Value = 100 Worksheetl. Range.( "Al ") . Font. Bold True Next Worksheetl lE;r,id~ Si,i)::J Объект Window Для получения списка сгруппированных листов можно воспользоваться свойством Sel ectedSheets объекта Window. Можно подумать, что свойство SelectedSheets должно быть свойством объекта Workbook, но это не так . Это связано с возможностью открытия одной книги в нескольких окнах (рис. 18.4). Готово Рис. 18. 4. Одна книга, открытая в нескольких окнах Существует множество ·общих свойств книг и листов, которые на самом деле являются свойствами объекта Window. Например, ActiveCell, DisplayFormulas, IЭisplay­ Gridlines, DisplayHeadings и Selection являются свойствами объекта Window. Полный список свойств этого объекта можно найти в приложении А. Следующий код определяет выделенные ячейки активного листа, выделяет их крас­ ным цветом и устанавливает красный цвет шрифта в соответствующих д:Иапазонах дру­ гих листов группы. :.PuЫic suь~· ForrnatSelectedGro'up 0 " .,,.,-~- t D~rn Sheet As oьj' eci: · · . . i Dim Address As String
,. - · · Foi: Each sheet :fn ActJ. vёwindow. sёlectedShe ei:.s"-··=·­ T f ТypeName(Sheet) = "Workshee t" Then Sheet.Range(Address) : Font . Color End If Next Sheet J?rн:'I 5-u.Ь,, , _-~ vbRed Книги и листы 445 Адрес выделенного диапазона на активном листе сохраняется в строковой переменноij: Address . Существует возможность активизации только выделенных листов и применения форматир_ования красным цветом только в выделенных ячейках. Режим группирования обеспечивает выделение одних и тех же ячеек на всех листах в группе . Но активизация лис­ та - медленный процесс. Сохранение адреса выделения в строковой переменной позволяет формировать ссылки на один и тот же диапазон в разных листах с помощью свойства Range других листов . Адрес хранится в строке вида" $В$2: $Е$2, $А$3: $А$4" и не обяза­ тельно должен соответствовать единственному непрерывному диапазону. Подпрограмма ForrnatSelectedGroup поддерживает включение в группу листов диаграмм и листов других типов. Перед применением форматирования подпрограмма проверяет значение свойства TypeNarne, которое должно быть равно "Worksheet " . Если объектная переменная Sheet должна ссылаться на листы различных типов, ее не­ обходимо ·объявить, к~к имеющую униве"рсальный тип Object. В объектной . модели Ex- cel существует коллекция Sheets, но не существует объекта Sheet. ' ~- Синхронизация листов При перемещении от одного листа к другому активизируемый лист имеет конфигура­ цию, которую- он имел в момент последнего использования. Верхняя левая ячейка, выде­ ленный диапазон и активная ячейка будут такими же, какими они были во время послед­ него обращения к листу ( если лист не входит в группу). Если лист входит в группу, выде­ ление и актив~'з:ая ячейка синхронизируются на всех листах в пределах группы. Но поло­ жение верхней левой ячейки не синхронизируется даже в пределах группы, поэтому при активизации листа существует вероятность, что активная ячейка и выделенный диапазон могут оказаться за пределами области видимости. Для полной синхронизации листов даже за пределами группы следующий код необ­ ходимо добавить в модуль книгиThisWorkbook. ~c5;J'fion' 'Exi:)1icII·-·· --- ···-- -- -~--~· ·w"-=· -$··-~ ;Diin OldSheet As Obje~t :Private Sub WGrkbook_SheetDeactivate(ByVal Sht As Object) : ' Если деактивизирован лист · ' сохранить ссьmку на лист в переменной OldSheet If TypeName(Sht) = "Worksheet" Then Set OldSheet Sht 'End Sub ' 'iprivate Sub Workbook_ SheetActivate(ByVal Newsheet As Ob ject ) Dim CurrentColumn As Long Dim CurrentRow As Long Dim Curr.entCell As String Dim CurrentSelection As String On Error GoTo Finally .. Jf ,()ld.$h ee,_t; __ Ii;;. NotJ:1i,ng Tl,leP, ,Exit ?ЧР ,~
446 Глава 18 1г;·,, :·r ·t~тY:PeN-affieTNewsh:ee6 Г <.;;··••worJ<sEeёt." ·ть~ ' Applic:ation ; screenUpdating = False Application.EnaЫeEvents = False , ' 01dShe,et.Activate ' ПолуЧИть старую конфигурацию листа :;)> CurrentColumn = KctiveWindow. Scrol1Column , CЦrrentR.ow = ActiveWindow.ScrollRow , Currentselection = Selection.Address Curr~ritCell = Activecell.Address , ;-~.х.,. . _, ; NewS.heet .Activate ' Уста.новиrь новую конфигурацию " ActiveaWindow.ScrollColumn ~ CurrentCblumn ~·, . ActiveW±ndow. Scrolli;tow ,;, CurrentRow ~;2 1 / Rarige (CurrentSelection). Se1ёct R''" "' Range ( currentCell) .'Acti.vate fFinally: . · · · ~·· · Application:'Enab~eEvents = True ·, i.~~g=_§цOм..-=~':i~-·..""i".~:No-.-"~~>:J.ь._ · ~-..~-~:..-..-'(:1._,:..;._,_"_,,;_--μ_ Оператор Dirn OldSheet .as Obj ect должен находиться в начале модуля в области объявлений . При этом OldSheet будет переменной уровня модуля и будет сохранять значение, пока книга открыта . Кроме этого, доступ к переменной получат две процедуры обработки событий. Процедура обработки события Workbook_ SheetDeactivate ис­ пользуется для сохранения ссылки на любой деактивизирующийся лист. Событие деак­ тивизации возникает после активизации другого листа, поэтому сохранять свойства ак­ тивного листа поздно. Параметр процедуры Sht ссылается на деактивизированный лист . Значение этого параметра присваивается переменнойОldShееt. Процедура обработки события WorkЬook_SheetActi vate вызывается после процедуры обработки события Deactivate. Оператор On Error GoTo Finally обеспечивает пере­ ход на метку Finally: в случае ошибки без выдачи сообщений об ошибке. После метки включается обработка событий (на всякий случай, если обработка событий была отключена). Первый оператор If проверяет существование определения переменной OldSheet. Если такое определение существует, лист был деактивизирован в течение текущего сеанса. Второй оператор If проверяет, является ли активизированный лист листом электронной таблицы. Если любое из условий не выполняется, процедура завершает свою работу. Эти проверки обеспечивают возможность активизации и деактивизации листов других типов. После этого для минимизации мерцания отключается обновление экрана. Полностью отключить мерцание невозможно, так как новый лист уже активизирован и пользователь заметит фрагмент конфигурации перед изменением. После этого для предотвращения цепной реакции отключается обработка событий . Для получения необходимых данных процедура должна реактивизировать деактивизированный лист, поэтому в обычных ус­ ловиях это привело бы к повторному запуску двух процедур обработки событий. После реактивизации старого листа сохраюi:ются свойства ScrollRow (строка в верх­ ней части экрана) и ScrollColшnn (столбец в левой части экрана), а также адреса теку­ щего выделения и активная ячейка. Далее реактивизируется новый лист и его конфигу­ рация устанавливается в соответствии с конфигурацией старого листа. Так как перед меткой Finally: отсутствует оператор Exi t Sub, последний оператор всегда включает обработку событий.
Книги и листы 447 Резюме В этой главе рассматривалось множество приемов обработки юiиг и листов средства· ми кода VВА. Было показано, как: О создавать новые книги и открывать существующие книги; О обрабатывать сохранение файлов книг и перезапись существующих файлов; О пер~мещать и копировать листы, а .также взаимодействовать с режимом группиро· вания. Кроме этого, было показано, что доступ к некоторым возможностям книг и листов осуще­ ствляется через объект Window . Также был рассмотрен метод синхронизации листов через процедуры обработки событий книг. Более подробно эта тема рассматривалась в главе 5. В этой главе были продемонстрированы несколько вспомогательных макросов, по· зволяющих проверять, открыта ли книга, извлекать имя файла из полного пути к книге, а также проверять существование файла книги.
,
Использование диапазонов 1 Вероятно, чаще всего в коде VВА используется объект Range. Объект Range применяется для представления единственной ячейки, прямоугольного блока ячеек или объединения нескольких пря'моугольных блоков (несмежных диапазоно в). Объект Range хранится внутри объекта Worksheet. Объектная модель _Excel не поддерживает трехмерные объекты Range, существующие на нескольких листа..х . Все ячейки из конкретного объекта Range должны находиться на одном и том же листе. Если возникла необходимость в работе с трехмерными диапазона­ ми, объекты Range в пределах каждого листа придется обрабатывать отдельно . В этой главе рассматриваются наиболее полезные свойства и методы объектаRаngе. Методы Activate и Select Эти методы могут вызвать определенную путаницу, так как иногда складывается впе­ чатление, что меЖду ними нет разницы. Для понимания того, что разница все же суще­ ствует, сначала придется разобраться в различиях межДу свойствами ActiveCell и Selection oбъeктaApplication (рис. 19.1). Свойство s'election ссылается на диапазон B3:El0. Свойство ActiveCell ссылается на ячейку С5 . В эту ячейку будут вставлят~ся вводимые пользователем данные. Свойство ActiveCell всегда ссылается на одну ячейку. Свойство Selection может ссылаться на единственную ячейку или на диапазон ячеек. АктИвная ячейка обычно находится в верхнем левом углу выделения, но может быть любой ячейкой в пределах вьщеленного диапазона (см. рис. 19.1). Положение активной ячейки в выделенном диапазоне можно изменить вручную с помощью клавиш <ТаЬ>, <Enteг>, <Shift+Tab> и <Shift+Ente1·>.
450 Глава 19 Для получения описанной ранее комбинации выделения и активной ячейки можно воспользоваться следующим кодом: : Puьfi ё. sиь · seiectNoC!Activate ( J · • Range("B3:El0") .Select . Range("C5'') .Activate : ~n,g_ SμJJ~.-·.~ ~- ···· - Рис. 19.1. Различие межi!у свойствами ActiveCell и Selection При попытке активизации ячейки за пределами выделения текущее выделение изме­ нится и будет совпадать с активной ячейкой . Еще одним источником неоднозначности является возможность передачи нескольких ячеек при вызове метода Activate. Поведение Excel определяется расположением верхней левой ячейки активизируемого диапазона. Если верхняя левая ячейка находится в пределах текущего выделения, оно не меняется и верхняя левая ячейка становится ак­ тивной. Следующий код повторяет показанньrй ранее пример : 'i:>ubl:Cc' suЬ s e ieci:And.Ac'tivaEe2 ( '"'''''"''"'= ·····="--···'"='·~"''""''"'''"'"•'щ' \ Range("B3:El0") .Select Range ( "С5: Zl·OO "с) .Activate :J?n.9:. • .? .'+P- _"'' . . ... .·'·· ..... . . :." Если верхняя левая ячейка активизируемого диапазона выходит за пределы текущего . вы­ деления, активизируемый диапазон становится текущим выделением , как показано в следую­ щем примере: .' i:>uБiic '~ sub'. se'! ec.t'AciAc.EivaEeз ·( J •• • •• ~·"·"" ,,,, . · ·• ·- ··• •• ~ Raдge ("ВЗ: EiO") . Select i. ' Range("A2:C5") .Activate t· . ~.~9. .".$,JJ;'O .t·.......~.•.)~ .~ ....., .,. .д-. . ... .. ... . , · .. fi . •. • ·"'-"' » .•..i't.;>;; ..• ~ .,;,МJ. :t;t """-'""·~· -~h..... -.-"',.x.z,;;"''-~··""-""· В данном случае мeтoдActivate имеет больший приоритет, чем метdд Select, и диа­ пазон А2:С5 становится текущим выделением. .Для миними;аци ~ ош И бок не рекоменду~тся использовать метод Activa te · длЯ· вь1деле­ " ниЯ Диапсрона ячеек. Привычка применять ., метод !'с t i vate вместо метода Select .может привести .к неожИданнь1м результатам, если· верхняя l}евая· ячейка ·~кт11внзируемо.- . . го диа пазо! iа нах одит ся в пределах текущего 13ыделения. v.
Использование диапазонов 451 Свойство Range Свойство Range объекта Application можно использовать для получения ссылки на объект Range из активного листа. Следующий код возвращает ссылку на объект Range, со­ держащий ячейку В2 с активного листа: APJ?-~'~c~fci.\:>11,::t<;a.ri~eT"в.2,~:.) · Обратите внимание, что приведенные примеры невозможно проверить в том виде, в котором они приводятся здесь. Но если ссылаться на диапазон с активного листа, эти при­ меры можно тестировать в окне lmmediate (Проверка) в редакторе VВЕ следующим образом: ·ьi:>ii~.ь.с~~~9Ч~J3а,ПЯ~т··~~ "у:.§e;i. ~~J· •.. Важно обратить внимание, что при отсутствии активного листа электронной таблицы использование показанной выше ссылки приведет к появлению сообщения об ошибке. Обычно такая ситуация возникает, когда активным является лист диаграммы. Так как свойство Range объекта Application является членом коллекции <globals>, ссылку на oбъeкт Application можно опустить: Можно ссылаться на объекты Range, которые сложне~ одной ячейки. В следуЮщем примере приводится ссылка на единый блок ячеек на активном листе: ~~~fig~~(Jt~~r·:~p)~~Q::·;j~~~",~-"·~-~,:~·:~>·x:v~Y«X::.~~~~ ~~~--~ .. Этот код ссылается на несмежные диапазоны ячеек: :3}l!:i~&EiJ:t-I:Л~§2.~~~ g1~0 .:·ц : J?J.Q : )_": . Кроме этого, свойство Range принимает два аргумента, описывающие диагонально противоположные углы диапазона. Это альтернативная возможность сослаться на диапа­ зон Аl :D 10. :R~i!-9eJ:лг·; ".bio? )~-~ Свойство Range принимает в качестве параметров имена диапазонов. Если опреде­ лить диапазон ячеек с именем Sa,lesData, то это имя можно использовать в качестве ар­ гумента. J~:ii19e.. c:~0cJ..§§Diэ- 1,:а_:~).~,':..,,.. В качеств е аргумента можно передавать как объ екты, так и строки, что обеспечивает значин;льную гибкость ссылок. Например, может потребоваться создание ссылки на все ячейки столбца А от ячейки Al до ячейки с имeнeмLastCell . ~-iliigE! J :;_t~J~:;X~~g e(" J:'la,§t.K~eд· " tY :.. · · Сокращенные ссылки на диапазоны Для создания ссылки на диапазон ссылку вида Al или имя диапазона можно заклю­ чить в квадратные скобки , которые являются сокращенной записью вызова метода Evaluate объекта ~pplication. Эта запись эквивалентна использованию единствен­ ного строкового аргумента своЦства Range, но этот вариант короче : [В2] .. - " .." '' [·Al :DlO] .. [Al:A10,Cl:C10,El:E10] L? aJf?.spa, ,ta, l. , _
452 Глава 19 Такая форма записи часто оказывается пощ:зной для создания абсолютных ссылок на диапазоны. Однако эта форма записи не предоставляет гибкости , характерной для свой­ ства Range, так как не поддерживаются аргументы в виде строк и ссылок на объекты. Диапазоны на неактивных листах Если необходимо эффективно обрабатывать несколько листов, важно иметь возмож­ ность ссылаться на диапазоны, не активизируя листы. Переключение между листами - сложный процесс . Требующий переключения код оказывается более трудным, чем необ­ ходимо на самом деле. Переключение между листами средствами кода не имеет смысла и часто делает решения более сложными для пониман_ия и отладки. - Все показанные ранее примеры относятся к активному листу, так как ссылки не ква­ лифицированы ссылкой на лист. Если необходимо · сослаться на диапазон за пределами активного листа, воспользуйтесь свойством Range интересующего объекта Worksheet: ~~§l:Jsfth~~t:-~,1_ ·· sh'ee.tJ:), . Range ( "c~q ·~) . _ .• Если интересующий диапазон и лист находятся в неактивной книге, придется допол­ нительно квалифицировать ссылку на объектRаngе: J.Jo~fki?<?<l~~J; §~i-~s,",;<i,s ") .·w()rk:~li@ei:~· c·;$11e.e .t:1 "I: F:ariqe_(':cio."J·. ·. Если свойство Range приходится использовать в качестве аргумента другого свойства Range, необходимо соблюдать осторожность. Предположим, необходимо получить сум­ му значений из диапазона Al :AlO на листе Sheetl, когда активным является лист Sheet2. Может возникнуть соблазн воспользоваться следующим кодом (использование этого кода приводит к появлению ошибки времени выполнени,я): MsgBox ··warksheetFunct ion . suro ( Sheets ( "Sheetl") . Range (Range ( '' Al" J , _ ~ -~> Rangt:.C'J\10;') )J · Проблема заключается в том , что ссылки Range ( "Al") и Range ( "Al О") относятся к активному листу Sheet2. Для нормальной работы кода придется использовать полно ­ стью квалифицированные ссылки: ·w orksh\=etF'unci:lon.surn (sheё't::S ( "srieeп ···) :R.ange ( _ · Sheets ( "Sheetl") . Range ( "Al '' ) , . . Sf 1§ ~ \:§ ( "Sh,t:e,1:1 :'J ., _Ri'J.ll.ge (_;; AlQ") J) При создании ссылок на несколько экзе.r-·шляров одного значения код можно сокра­ тить с помощью конструкции Wi th. . . End Wi th. (w:).th srieets( "_shee·t.1") t· MsgBox . WotksheetFunction. Suro ( .Range ( .Range ( "Al "), ;р:цd, .i'/ith 'c.« .· . "' ;. . . . . . . Свойство Range объекта Range Обычно свойство Range испольjуется в качестве свойства объекта Worksheet. Но можно применять свойство Range объекта Range. В таком случае свойство Range будет возвращать ссылку относительно объекта Rapge. Следующий код возвращает ссылку на ячейкуD4: :в.a.n.geJ2;-cJ:·т:: .RaПQ-.:~c•в2 ·• )
Использование диапазонов 453 Если представить виртуальный лист, верхняя ' левая ячейка которого расположена в ячейке С3, то ячейка В2 виртуального листа будет на одну строку ниже и один столбец правее, что соответствует ячейке D4 реального листа, Такой прием "диапазон в диапазоне" используется в коде, генерируемом при записи макроса с относительными ссылками (запись макросов рассматривалась в главе 1). • На­ пример, следующий код записан с применением относительных ссылок при выделении активной ячейки и четырех ячеек правее: Af:Ч§e(:-€JJ: .J3?ong§! ( ':Ai_; Ett ::J.. s-e1~c!: '"~'-, ~,~~"" " Так как предыдущий код может показаться запутанным, записи с относительными ссылками стоит избегать. Свойство Cells является намного лучшим способом форми­ рования относительных ссылок на ячейки. Свойство Cells Свойство Cells объектов Application, Worksheet или Range может использо ­ ваться для получения ссылки на объект Range, содержащий все ячейки из объекта Work - sheet или объекта Range. Следующие строки кода ссылаются на объект Range, - содер­ жащий ячейки активного листа: Activesheet .." Cells APJ?l iJ?ation, Cells .· Так как свойство Cells объекта Application входит в коллекцию <globa l s>, то на объект Range, содержаЩий все ячейки активного листа, можно ссылаться следующим образом: ~с~Ц щ":-:'~ _: _· : ·;:: :=-:~: .... ········--~ - свойство Cells объекта Range можно использовать так: f.R~nge (::ц~ ьI:о" )_: -сеI1Б .·. Но в этом случае свойство Cells возвращает туже ссылку, что и квалифицирующий объект Range. Для получения ссьurки на конкретную ячейку относительно объекта Range можно вос­ пользоваться свойством Item объекта Range и в качестве параметров передать относитель­ ные координаты строки и столбца. Параметр строки всегда является числовым. Параметр столбца может быть числовым или строковым (содержать букву столбца). Следующие строки кода возвращают ссьurку на объект Range, содержащий ячейку В2 на а}(Тивном листе : · :ceiis :·:i:"tem(2, 2) .с_~Ц_е . :~;~_<:щ(2 ;:, "в. ::J " "" -··~- , .. Так как свойство Item является принятым по умолчанию свойством объекта Range, обращение к свойству можно опустить: се11~· ·( 2~, -2}" ф , '"~,- /'~- щ·· -- ,~--~ ·· · :felJ03 (2,;"" В ")", Обычно числовые параметры полезны при циклическом переборе последовательно­ сти строк или столбцов с использованием счетчика . В следующем примере выполняется перебор строк с 1по10 и столбцов с А по _ Е на активном листе. В каждую ячейку заносит­ ся соответствующее значение:
454 Глава 19 r.Pu.ьiic ·su:Ь F'J.1iёe11 'S'() ·· " ; Dim i As Integer, j As Integer i 1То.10 Forj =1То5 Cells (i, .j) . Value ·Next'· j ; ,Next·i (§!19: . $:U.ь._ i*j Результат работы этого кода показан на рис . 19.2. Рис. 19.2. Результат циклического перебора строк и столбцов Использовани,е свойства Cells в качестве параметра свойства Range Свойство Cells можно использовать в качестве параметра свойстваRаngе для опре­ деления объекта Range . Следующий код ссылается на диапазон Al :Е 1О активноГо листа: :R~ng_ё:Т.cfiUsд~JJ:;:··~§J~s Шi~s1[ _ ::.:. ,·::- .• ~, .· ~: .,··.' "'· : ·::,_ • _"""'""'~""-''""'°"·'"··и"'*""""""' Ссылки такого типа являются наиболее мощными, так как параметры можно указы- / вать в виде числовых значений. 1 Диапазоны на неактивных листах Как и в случае свойства Range, свойство Cells можно использовать для Ш)лучения ссылки на диапазон неактивного листа : ~()rR~fi~~~.t:;sJ :~це~е~.~с: ; ·:~9E[if s72>ТС.~:· .~ ·,,; Применение свойства Cells для получения ссылки на диапазон неактивного листа требует тех же предосторожностей, что и при использовании свойства Range . Необхо­ димо полностью ~валифицировать свойство Cells. Если активным является лист Sheet2 и интересует ссылка на диапазон Al:EIO на листе Sheetl, следующий код рабо­ тать не будет, так кaкCells (1, 1) и Cells ( 10, 5) являются свойствами активного листа: ' 1.$K~Eit~J ."?n~e·t;i: ;; ,) ;_ga l}ge.Ic~11~s] T ~· 1т ,;; ·с_~д1s· (10, :~J> : Fcн}!:, i3,6~cl
Использование диапазонов 455 Конструкция Wi th. свойств: End Wi th обеспечивает эффективный способ квалификации :with sheet':;;("sЪeet:Г;Г •· ·, -· · ; ; ·· · - , ... ,,., •. ,,:,· · .R;,nge( ~ Cells(l, 1-)' , , : cells(lO, ~)).· !"cн;1t.Bold 'EJ?-cJ. ·W;i.:~h. _.•" .".,"·'"· ···- ..•. . .•t.. . "}. , . ·'"··"'··'····· ···'· Дополнительная информация о свойстве Cells объекта Range Свойство Cells объекта Range является удобным способом получения ссылки на ячейки относительно начальной ячейки или внутри блока ячеек. Следующий код ссыла· ется на ячейку F 11: · Если необходимо рассмотреть диапазон с именем SalesData и выделить красным цветом любое значение ниже 100, можно воспользоваться следующим кодом: i?ubfic sиь .c6iorcёr1.S'( ). ...,,,.~ "'. Dim Sales As Range bim I As Long Dim J л's Long .Set Sales. = Range ( "SalesData") For I = · i То Sales . Rows.Count For J = 1 То Sales.Colшnns.Count . If Sales.Cells(I, J) . Value < 100 Then · Sales.Cells'(I, J) .Font.co;Lorindex 3 Else · Sales.Cells(I, J) .Font.Colorindex 1 EndIf. Next J Next I lEpd .euJ? т... ~.-..ы. Результат работы кода показан на рис. 19.3 . Рис. 19.3. Использование свойства Cells
456 Глава 19 На самом деле интересующие ячейки не обязательно должны находиться в пределах объекта Range. Можно ссылаться на ячейки з а пределами оригинального диапазона. Это значит, что достаточно зн ать координаты верхней левой ячейки объектаRаngе. Данный код ссылается на ячейку Fl 1, как и в предыдущем примере : . !!laiш~J.·~p1:g/ J , ~ЦsJ~ ,· з1 ··· .м Кроме этого, можно воспользоваться сокращенной версией. Следующий код также ссылается на ячейку Fl 1 : )~~rig~( "IЩ> 0~ ) (2.r 3 Следующий код тоже работает, так как можно обращаться непосредственно к свойству Iterns объекта Range, а не к свойствуСеlls, как было пока за но ранее: tga,,n,9·~ C' I?J9 ~ ) , It: ~mJ2" 3I ..... ·····'"'' .. " . .. . ... При этом можно использовать нулевые и даже отрицательные смещения, пока ссылка не выходит за пределы листа. Иногда использование таки х ссылок может привести к не­ ожиданным результатам, например, следующий код ссылается на ячейку С9 : fЕаЬg_е'(·' Щ о'· )то ; ь·г_-·· = ··:· . · • Данный код ссылается на ячейку BS: !:R.9'"fi9-.e'J ·:тii Q:: JJ . -: : i :.-:::О .....=-: .. Предыдущий пример использования свойства Font. Colorindex диапазона Sales может быть переписан следующим образом: p?iiЬiic · sиъ· c6io r'ce11Б () ;;/ Diщ Sales As Range ~-- ~~: ~- ~= ~~~; ~- ! Sales = Range ( "SalesData ·~ i 1 То Sales,Rows.Count j = '1 То Sales.Columns.Count Тf Sales(i, j) .Value <. 100 Then , Sales(i, j) .Font . Colorindex Else . Sale.s ( i, j) . Font. Colorindex End •If . 4 1. На само_м деле, при использовании такой сокращенной записи код работает немного быстрее . Например, как утверждает один из авторов этой книги, на его компьютере вто- рой пример работает примерно на 5% быстрее первого . · Ссылка на диапазон с единственным параметром В сокращенной записи ссылки на диапазон можно использовать как один, так и два параметра . Если эта методика применяется для получения ссылки на диапазон с несколь­ кими строками и значение индекса превышает количество столбцов в диапазоне, ссылка переносится на соответствующее количество столбцов на следующих строках диапазона. Данный код ссылается на Ячейку ElO: :в~ri§~·c: 'J?:i9_: i;;+ i:::x1?г:..... .
Следующий код ссылается на ячейку D 11: ;'RаП:iJеТ·· Що ':Б11"Т( :З' Использование диапазонов 457 Значение индекса может превышать количество ячеек в объекте Range. При этом ссылка будет продолжать . перемещаться по столбцам объекта Range. Следующий код ссылается на ячейку Dl2: :?,c(ngeJ: J)1 0 /в.iJ ")j s Использование единственного параметра может потребоваться для перебора всех ячеек диапазона без обращения к отдельным строкам и столбцам. Пример подпрограммы Co l orCells можно модифицировать еще больше, применив сЛедующий прием: iPubliC sub coiorCel1s () · Dim Sales As Range Dim i AS Long Set Sales = Range("SalesData') For i = 1 То Sales . Cells.Count If Sales(i) .Value < 100 Then · Sales(i) . Font.Colorindex Else Sales(i) .Font.Colorindex End If ,, Nex): i ~nd su1J ... 5 1 В четвертом и последнем варианте подпрограммы ColorCells можно перебрать все ячейки диапазона с помощью цикла For Each. . . Next. Этот способ подходит для си­ туаций, когда значение индекса цикла не используется для других операций. ,PuЫic sub ColorCells () · Dim aRange As Range For Each aRange In Range ( • SalesData") If aRange.Value < 100 Then aRange.Font.Colorindex 6 Else · aRange.Font.Colorindex End If "> Next aRange ,_End~ _SuJ? .. Свойство Offset 1 Свойство Offset объекта Range возвращает объекты, похожие на значение свойства Cells. Между этими объектами существует два отличия. Перво е заключается в том, что значение свойства Offset отсчитывается от О, а не от 1 (это подразумевается названием свойства "offset"/"смещение") . Обе показанные ниже строки кода ссылаются на ячейку AlО : iR:angef · .i'i:io'·) ': с·ё11:s t1 ~ ij ··· · •·· -- ·· - '"' ,_RaJ1ge _( 'A),0') .OH$et(O,O) .. ""' .: Второе отличие заключается в том, что объект Range, который возвращается в каче­ стве значения свойства Cells, состоит из одной ячейки. Объект Range, возвращаемый свойством Offset, содержит то же количество строк и столбцов , что и исходный диапа­ зон. С,ледующая строка кода ссылается на диапазон В2:С3: )s_д,!}ge_( ". 1 \.1: в2 " 1_, OJfset,(1, 1)
458 Глава 19 Свойство Offset может потребоваться для получения ссылки на диапазон того же размера, но смещенного на определенное расстояние. Например, в диапазоне Вl:В12 . мо­ гут храниться суммы продаж с января по декабрь, в ячейках С3:С12 может потребоваться создание плавающего среднего Значения за три месяца (с декабря ·ПО март). Эту задачу выполняет следующий код: J:>u.ьнc -·s:uь · мaveд.veia9:ё i) 6iпС; aRange As Range DiП\ i As Long s ·et:· aRange = ~ange ( "Bl: ВЗ ".) Fori =3То12 . • Cells(i, "С") .Value = WorksheetFunction.Round (WorksheetFunction.Sum(aRange) · ; 3, О) . Set aRange ' =· aRange.Offset(l, Q. ) ,Next i · Epq 'su.J:?~ ", · ~ Результат работы кода показан на рис. 19.4: Рис. 19.4. Среднее значение IJММЫ продаж за три месяца Свойство Resize Свойство Resize объекта Rang.e позволяет получить ссылку на диапазон с той же верхней левой ячейкой, но другим количеством строк и столбцов. Следующий код ссы­ лается на диапазон DlO:ElO: ~д,liff~I:JS'f91y2:Q..::"J.,,Eё.:sIZ:~II~-2 г: ".· --~ Свойство Resize также позволяет расширить или уменьшить диапазон на строку или столбец . Например, если существует набор данных, хранящийся в диапазоне с именем Database, и к набору добавлена еще одна строка, имя диапазона придется переопреде­ лить для включения дополнительной строки. Следующий код увеличивает именованный диапазон на одну строку:
Использование диапазонов 459 ~wii:h :Range('·bataьase'' ) .· t>'·:'.Re.fiz7;(.R?w5..c9un~ + 1) .Name = . "Database" c?r:i<;l ,J:J:i,};,,~ ~· (,~, . . " ,.. .•}, Если опустить второй параметр, количество столбцов останется неизменным. Точно так же можно опустить первый параметр и оставить н е изменным количество строк. Сле­ дующий код ссылается на диапазон Al :С 1О : :ВЖt:i]'~i'~h-1·:,r"J:a. : 1. j~E! sJ z.·~c ·~ ~:) __ Нижеiiриведенный код позволяет выполнять поиск значения в списке и кqпирование найденного значения и двух столбцов справа на новое место : г·· ьГiТSlii:J"Ffndit () . aRange As Range . ' i .· ,, a,Range. = ' Rang.e ( "Al :А12") . Find(What:="Июн", , LpokAt:=xlwhole, Lookin:=xlValues) · , · If:"aRarige Is Nothing Then У" м:Sgвох "Данные не найдены" , ·. Exit'.Sub ' · • Els.e · i .., ) aRange .Resize(1,-· з) .сору < .·; End• If ·,, lJ?P.~~1-~~~Y.~~~~<.:.~:·*;_ .~~.оо .~:.,.1-,,,. ..~.:.~'""'~'~".=~д~·.. ·*·:i*.>f.~,.. · ·'" д~...- - < оМ ~ Результат работы этого кода показан на рис. 19 .5 . Рис. 195. Поиск и копирование интересующих ячеек Метод Find не дублир ует функциональность команды меню Правка<=>Найти (Editqfind) . Метод возвращает ссылку на ячейку в виде объекта Range, но найденная ячейка не выделяется. Если метод Find не может обнаружить интересующую ячейку, возвращается объект null, возврат которого можно проверить с помощью оператора Is~othing. При попытке копирования объекта null возвращается ошибка времени выполнения.
460 Глава 19 Метод SpecialCells При нажатии клавиши <F5> на открытом листе выводится диалоговое окно Переход (Go То). В диало говом окне можно щелкнуть на кнопке Выделить (Special). После этого появится диалоговое окно, показанное на рис. 19.6. Выдемть 0~~·~~ь~~~1 О~s.онстанты О!11орму1ы l?.} '~!"..,_:;:;.i E?Jн"~ ·,:r l~jлcr;.iw;;-,~~;.'!e. i:?.::1:щ:; 6г11 О пустые ячеfiкн о текущую область О текущий 1:1ассив Оо§ъекты О отл1Nия по стg_окам О отлнч11Я по столбц.ам О §.лияющне ячейки· О ~~е11скмt:.1е ячейкн 6 nосл~нюю ячеt1ку О только виднм~е ячейки .О услое!;!Ь~е форматы О ороверка данных .~•ОК j1.отмено J Рис. 19.6. Диалоговое окно Выделение группы ячеек . В этом диалоговом окне предоставляются несколько . полезных операций, например, поиск последней ячейки на листе или всех ячеек с числами, а . не вычисляемыми значе­ ниями. Несложно предположить, что все эти операции могут выполняться средствами VВА. Некоторые операции выполняются собственными методами, но большинство опе­ раций осуществляются с помощью метода SpecialCel ls объекта Range. Поиск последней ячейки Следующий код определяет последнюю строку и последний столбец на листе: fPu~f'ic~"suJS' se i ect Lastceli () · / ;'DimaRangeAsRange • , Iiiin lastRow As Int.eger b;i.m la~tC?1umn As. ri;iteger. .Set aRange = Range ( "Al ") . . SpecialCells (x1CellTypeLastCell) lastRow = aRange.Row' lastColumn = aRar:ige.Colшnn Последняя ячейка определяется как пересечение последней содержащей информа- , цию строки листа и последнего содержащего информацию столбца листа. В процессе по­ иска последней ячейки Excel просматривает и те ячейки , в которых в течение текущего сеанса хранилась информация (даже если к моменту поиска эта информация была удале­ на). Последняя ячейка не сбрасывается, пока лист не будет сохранен. Считается, что содержащие форматирование и разблокированные ячейки также со­ держат информацию. В результате последняя ячейка может оказаться далеко за предела­ ми диапазона, содержащего данные, особенно если книга была импортирована из другого
Использование диапазонов 461 приложения электронных таблиц, например Lotus 1-2-3. Если же рассматриваю1:ся толь­ ко те ячейки, в которых содержатся числа, текст и формулы, воспользуйтесь следующим кодом: su.ь · GetR.ealLast<;'e1-i r> . Dirn realLastRow As Long ·' Dirn realLastColurnn As Long Ra~ge ( "Al :·) . Select On ~ Error Resurne Next realLastRow = Cells.Find{"*", Range("Al"), _ . xlForrnulas, , xlByRows, xlPrevious).Row realLastColurnn = Cells.Find("*", Range("Al"), xlFormulas, , xlByColurnns, xlPrevious) .Colurnn Cells(realLastRow, realLastColumn) .Select · Щрg, Sub . . В этом примере метод Find выполняет обратный поиск от последней строки и столбца, содержащих любой символ до ячейки Al (это значит, что Excel переходит на последнюю ячейку и от нее начинает поиск в сторону ячеi1ки Al). Оператор On Error Resume Next позволяет предотвратить ошибки времени выполнения, если лист оказывается пустым. Обр~~ите вниманИе, что переменные для хранения номера строки необходимо объявить с помощью. опер;пора Dim как имеющие тип Long ,- а не lnteger, так как переменные ' integer могут хранить зна'jения до 32767, а пист может содержать до 65536 стр;к. Для избавления от дополнительных строк, содержащих форматирование, выделите целые строки и воспользуйтесь командой Правка<> Удалить (Edit<>Delete). Кроме этого, выделите и удалите· ненужные столбцы. При этом последняя ячейка не сбрасывается. Для сброса последней ячейки лист необходимо сохранить. Кроме этого, для сброса по­ следней ячейки можно воспользоваться методом ActiveSheet. UsedRange. Следую ­ щий код удаляет лишние строки и столбцы и сбрасывает положение последней ячей'Ки: 'JS'u:ЬHc su:Ь DeleteunusedFormat.S () · Dirn lastRow As Long Dim lastColumn As Long Dim realLastRow As Long Dim rea.lLastColumn As Long With Range ( "Al"}. Sp~cialCells (xlCellTypeLastCell) ' lastRow = .Row lastColurnn .Colurnn End -With. realLastRow "Cells.Find("*", Range("Al"), _ xlForrnulas, , xlByRows, xlPrevious) .Row realLastColurnn = Cells.Find("*", Range("Al"), _ xlForrnulas, , xlByColumns, xlPrevious') .Colurnn If realLastRow < lastRow Then Range(Cells(realLastRO\v + 1, 1), _ Cells(lastRow, 1)) .EntireRow.Del ete End If . If realLastColurnn < lastColurnn Then Range(Cells(l, realLastColumn + 1), _ Cells(l, lastColumn)) .EntireColurnn .D elete
462 Глава 19 ~ · ActiveSheet. UsedRange tJ?I1d §11Ь ~ ,,, Свойство EntireRow объекта Range возвращает ссылку на объект Range, который содержит все столбцы от 1 до 256 (или от А до IV) из исходного диапазона. Свойство En - tireColumn возвращает ссылку на объект Range, содержащий все строки (от 1 до 65536) столбцов, входящих в исходный диапазон. ' Удаление чисел Иногда возникает потребность в удалении всех данных на листе или в шаблоне, что­ бы явно указать на необходимость ввода новых значений. Следуюiций код удаляет все числа на листе, сохраняя формулы: :оп· Бr rar· R'еs·ите Next · . , . -"···~ ·- . ~·-· -·. . .,. . :s:~1J.:з ~ .E>P.ec;:~<;1:l.Cel_l_13 (;.::J, C::~l],Typ~C::.oцpt<;1n,tp,,, x_lNμrnЬers) . · C::], ~<;1_r(: qntщl_ t§ · " ~:CL .... .Onepat, op . On J?iror в .показанном выш; npY,iмepe позвопяет. отключить сооб,Щ~~l<fЕ/об ошибке '!!ремени выполнения, если 'в интересующих яЧейках отtу~:ствуют Числа_ , " "- '_;~' ' '.~'t"_'; ' ',','< _..",: '/ "" ' • ' ''- ~ :-- ( , .' '' у·";'" Excel рассматривает даты как числа, поэтому в результате работы показанного кода даты тоже удаляются. Если даты используются в качестве . заголовков и их необходимо сохранить, можно воспользоваться следующим кодом: t1'ч.ЬH~:"silь ыe:~rNonbat:eceiis"i) ". 1 ' ;/< · Dim aRange А~ Rahge · {' N~ ~.: Jior Each aRange Ъn · E%.xlNuЦ1hers) . . . i' · If Not I ·sDate (aRange. Value) Then Next"' aRange · Свойство CurrentRegion Если таблица с данными отделена от остальных данных как минимум одной пустой строкой и одним пустым столбцом, конкретную таблицу можно выделить с помощью свой­ ства CurrentRegion любой ячейки в пределах таблицы. Это свойство является эквива­ лентом комбинации клавиш <Ctгl+Shift+*>. Для выделения таблицы Бананы, показанной на рис. 19. 7, достаточно щелкнуть на ячейке А9 и нажать комбинацию клавиш <Ct1·l +Shift+*>. Того же результата можно добиться с помощью работы следующего кода (если ячейка А9 называется Bananas) : - !S.~дii~I~J%anaДil§~~ J .<:;:i.iJ::r e:Ij,t;fйigi]:ri]se.J.e cJ:; · Это свойство оказывается полезным при работе с таблицами, меняющими размер с течением времени . При этом можно выделить все месяцы до текущего с ростом таблицы в течение года, а код каждый месяц модифицировать не нужно. Обычно в процессе рабо­ ты кода выделение вообще не требуется . Если необходимо выполнить консолидацию данных о фруктах в единую таблицу на листе Consolidation, а верхний левый угол ка­ ждой таблицы называется в соответствии с названием продукта, то для консолидации можно воспользоваться следующим кодом:
{с " sЦь :e:on.э·oiid.ate(J pi'm Pr.o .ducts As Variant .Ъim source As ·. Range · . pim :: De'st i nation . As Range l)im, i ·· AS r;o'ng Использование диапазонов 463 Appl i cati on.Screenupdating False I;r:\?dllcts =. Array ( "Mangoes", "Bananas", "' Lychees " ,, Set Dest i nation = Worksheets ( "Consolidation") For '::{. = LBound(Products) То ·uвound (Products) · .. With ' Range ( Products (i)) . CurrentRegion ·: ,.. .· \.• Set source - . Of fset(l, 1) .Resize( . Rows ; Count• :~< coiuffins ·:count - iJ · 1:·.. ${ ~ · ~~~r~~~~opy . fl"k f.i . = LВound(Products) Then . \i..·. Destinat:Lon. Pastespecial x'lPasteValues, rxiP?-steSpecialOperationNone .. .>.; •· Else . " . . ·.. . . .~ Desfination. PasteSpecial. xlPasteValues, R;st eSpecia10perationAdd · ~-у End· Tf , "Noxt i ·. ~· Appl i cation. CutCopyMode False. 'очистить t~о.9.-:;:~~~Р,;.»...;,.;-;~..,.,.~-~и.Х.,Оi>:.>с"иА<< :... А"~- , ,·> , . • :W i . ~ . ~ ' '" . - ~:N ..;,; ",,,,,.,(·~~ Фее Мар•· 4Зо: 6539 . 8166 4175 636:2 4026 '25ss » 973 ( 9735 31.36 . ' .13.12 '' 001 Сун..,;.57047 Рис. 19. 7. Выделение пюМицы с данными
464 Глава 19 Результат работы кода показан на рис. 19.8 . Рис. 19. 8. Консолидация таблиц с данными в одну таблицу Для ускорения работы кода и защиты от мерцания обновление экрана отключается . Функция Array обеспечивает удобный способ определения относительно коротких спи­ сков обрабатываемых элементов. Функции LBound и UBound используются для обеспе­ чения нез.ависимости от оператора Option Base в начале модуля . Этот код беспрепят­ ственно может использоваться в других модулях . Первый продукт и соответствующие значения копируются поверх существующих значений в указанных ячейках . Другие продукты и соответствующие значения копируют­ ся в соседние яч'ейки . В конце операции копирования выполняется очистка буфера об­ мена, что позволяет защитить пользователя от случайной повторной вставки через нажа­ тие клавиши <Entei->. Свойство End Это свойство эмулирует результат нажатия комбинации клавиш <Сt~·l+стрелка>. Если выделить ячейку в верхней части столбца и нажать комбинацию клавиш <Сt~-l+вннз>, выделение переместится на ячейку, которая находится перед первой пустой ячейкой . Если в столбце нет ни одной пустой ячейки, в~щеляется последняя ячейка с данными. Если ячейка после выделенной не содержит данных, выделение перемещается на сле­ дующую ячейку с данными, если такая ячейка существует, или в конец листа. Следующий код ссылается на последнюю ячейку с данными в конце столбца А (если между ячейкой Al и последней ячейкой с данными нет пустой ячейки): r~-:tfl:i~·пxi~·:I:~'.J'dii~.tiJ.qO::~I~..=::::~~~ Для перемещения в обратном направлении можно воспользоваться константами xlUp, x l ToLeft и xlToRi gh t. Если в данных встречаются пропуски, но необходимо получить ссылку на последнюю ячейку в столбце А; можно начинать с нижней части листа и проводить поиск в обратном направлении. Данные не должны выходить за пределы ячейки А65536: \R'i!i19~J';)>.~~.~)J:•J ,_E!!sll:x:JcYJ?i, ~ :.... ·'
Использование диапазонов 465 В разделе о строках далее в этой главе будет показан метод отказа от ссылки на ячейку А65536 и генерализации кода для использования в различных версиях Excel : Получение ссылки на диапазоны через свойство End Для получения ссылки на диапазон ячеек от активной ячейки до конца текущт-о столбца можно воспользоваться следующим кодом: ffi:ariяeJ"(.J<s::t;~vec;:·iч, A:c~t~ y~~ef:l : ~I1d~!){I,p9W!iIJ::.$ef..§ё.t . Предположим, что существует таблица с данными, которая начинается в ячейке В3 и отделена от остальных данных пустой строкой и пустым столбцом. Пока таблица со­ держит непрерывные заголовки в верхней части и непрерывные данны е в последнем столбце, то для получения ссылки на нее можно воспользоваться следующим кодом: 'Range\"J3з '~::.-R.ange( "вз ", : ?D.д. (~ 1т<?:R:Lg:Ь:t) ' :·E\ri~JxYf2ow~) 1':' sei e§ i '··· В данном случае результат работы кода эквивалентен использованию свойства Cu r- rentRegion, но свойство End имеет и другие применения, которые показаны в следую ­ щих примерах . Как обычно, при работе с объектом Range из кода VВА необходимость в выделении ячеек не возникает . Следующий код выполняет копирование непрерывных заголовков из верхней части листа Sheetl в верхнюю часть листа Sheet2. 1wit.Ъw o-rksЬ:eetsT;, sh"ee t: ·г;y·:R.al1ge" C"A.Г· г· ".... , ·w · ·•• · · • :Range(.Cells(l) , . End(xlToRight)).Copy Destination: = Worksheets ( "Sheet2") .Range ( "Al ") cJ;;n.d .. .Wi t .h _ .и~~-=·· ..•... ~·"'- ~ ......~ .... ...ш.m "-=· Пока существует активная книга, этот код может выполняться для любого активного листа. Суммирование диапазона Предположим, что функция С УММ (SUM) в активной ячейке должна складывать зна­ чения из ячеек ниже до следующей пустой ячейки . Для этого можно воспользоваться следующим кодом : :w1tь.-,xc-tз:vece 1·1· ---~--:,,.-r,-•y·" -,..--:,"...,~-·""""'·,.,-- ,... " ", "~ - т =· - -- . щ" ..-".,..,~~-"-':'···--,.".,,,....,.,.-,.,,..,,--~"'=-,...., ·т ='<~'<.·-~-, .k'"'<"..,, - --,~--- -- --,~,-,., Set aRange = Range( . Offset(l), . Offset(l) . End(xlDown)) i·- . Formula = "=SUМ(" & aRange.Address & ") " }~П.9.....-..W.~ t;.!!-.:. ""~_" }.Щ. • • .<' , .. _, ".,w:-.""'.~-"-~:i:." ·="'~;i...<.iJi'<=-~-~~..... "_ ~. ,,~';М'. Свойство Address объекта Range по умолчанию возвращает абсолютный адрес . Если необходимо копирование формулы в другие ячейки и суммирование расположенных ниже значений, можно воспользоваться о тносительным адресом и выполнить копирова­ ние следующим образом : f."PUБI"IC -suь~?··s·umRangeт·es t "("Tж=w~~~~W1'WГ" ~~~~ ··· ~·~ ·~·- · "~~· --~--'$='»;· ."~ .. ".... .,..~---",.. .. = ., Dim aRange As Range with ActiveceJ,l Set aRange = Range(.Offset(l), .O ffset,(1) . 'End(xlDown)) . Formula = " =SUM(" & · aRange.Address(RowAbsolute: =False, ColumnAbsolute: =False) & ")" , _ .; С:?РУ P~S.t..in.~}:~ <;>~ .;..~.a.1.19'eJ ;S e~l_~Jll ' ~-- ..
466 Глава 19 '~ : oH8et-(iJ· : Б~ёiix1тoRight) . off:s.e t i .:. 1 п ·· End With Конец диапазона назначения определяется по положению последней ячейки с дан­ ными в строке с формулой СУММ (SUM). · Результат выполнения этого кода показан на рис. 19.9 . Рис. 19. 9 . Суммирование mачений диапазона Свойства Co lumns и Rows Эти свойства предоставляются объектами Application, Worksheet и Range. Свой­ ства возвращают ссылку на все столбцы или строки листа, или диапазона. В любом случае свойство возвращает объект Range , · но возвращаемый объект Range может иметь странные характеристики, заставляющие думать , что существует "объект Colurnn" или "объект Row" (в Excel таких объектов не существует). Эти свойства могут использоваться для подсчета количества строк или столбцов, а также для обработки всех строк или столбцов диапазона. В Excel 97 количество строк листа увеличено с 16384 до 65536. Для определения .ко­ личества строк в активном листе можно воспользоваться свойством Count объекта, воз­ вращаемого сво~ством Rows : Это свойство оказывается полезным при создании макроса , работающего во всех вер­ сиях интерпретатора Excel VВА, а также для определения последней строки с данными в столбце начиная с последней строки листа:
Исполвзование диапазонов 467 Если в диапазоне SalesData хранится таблица с данными, следующий код позволяет перебрать все строки и вь'iделить полужирным шрифтом те, в которых значение первой ячейки превышает l ООО: 'Public. suiJ" iзoldCelis {) .' ! Dim Row As Object . For Each Row In Range("SalesData") .Rows If Row.Cells{l) .Value > 1000 Then "·' Row.Font.Bold True .El:Se Row.Font.Bold False End If Next Row · !~p,_d_ Sub' Результат работы этого кода показан на рис. 19. l О. Готоsо Рис. 19.1О. Выделение строк полужирным шрифтом Инте.ресно, что вызов Rows. Cel ls ( 1) нельзя заменить на Row ( 1) , как в случае с объектом Range. В данном случае использование сокращенной записи приводит к ошибке времени выполнения . Возможно , свойства Rows и Columns действительно возвращают специальный объект Range и о таких объектах проще думать как об объектах Row и Col - umn, хотя официально в Excel таких объектов не существует. Области При использовании свойств Columns и Rows совместно с ·составными диапазонами необходимо соблюдать осторожность. (Составные диапазоны могут возвращаться мето­ дом Spe ci a lCells при поиске ячеек с числовыми значениями или пустых яч е ек на лис­ те.) Составные диапазоны состоят из нескольких отдельных прямоугольных блоков . Ее-
468 Глава 19 ли ячейки не являются членами одного блока , вызов свойства Rows . Count возвращает количество строк только в первом блоке . Следующий код возвращает результат 5, так как рассматривается только первый диапазон , Al :В5. 1',ao9~T:.-?>_i: iз,~.сб .:~QlQ ; E.:ij : i';f$:~:I -Re>'1s. : Qo:,l~ i::~, ; • Блоки составного диапазона являются объектами Range в составе коллекции Area. Эти объекты могут обрабатываться по отдельности . Ниже показан код, отображающий адрес каждого блока в объекте Range: ' E:ach aRarige iri Range·( "Al :в·s, с·б: DiЬ·, Eli :Fl5 .; ) .Ar eas MsgBox aRange. Address . . ;Ne:x: t . ~i:ig _, .... : , •.~к,· В показанном ниже листе содержатся прогнозы объемов продаж , записанные в виде чисел. Значения стоимости рассчитываются по формулам. Следующий код копирует все числовые константы с активного листа в блоки листа SheetЗ . Между каждым блоком ос ­ тавляется пустая строка: ; р~J.ьпс· su.ь · cc:JJ.):Yд:reas{ J Dim aRange ·As RiЭ.nge . Dim 'Destlna'tiop. As Range Destina'tion о: Worksheets ( "SheetЗ") . Range ( "Al") Each · aRange Tn •Ce1ls. SpecialCells ( _ · xlCellTypeConstants, xH\timЬers) . Areas , ~Rang~\Copy Destination: o:Destination . .. ·, ,.' · . s et Destination Destination. Offset (aRange .Rows .Count Результа~работы кода показан на рис. 19.11 и рис. 19.12 . ··························································· ········•··················· Яна ..... .. ,Фев 100 ".,...."""".".-....""~ 60; о: 10! 11 jПр~д;;;.,~3 ·· 12т ·································· 401 35 55! ......... ...... .......... ~- ..... ............. .. ..... .... ........ .. . ··-! ···· 13 СТОИМ()С!l>~ ш шшш j~! )j! 14! 1<' '"/•- , · ··· ,; · ~ ~;;~~~1.($,fiii§_~ i~eJ .s J:<~l:iJJ; ГОТОf Рис. 19.11 . Исходный лист с чиС11овыми коистантами и формулами Рис. 19.12 . Скопированные чиС11овьtе константы
Использование диапазонов 469 Методы Union и lntersect Это методы объекта App licat i on, но они могут использоваться без ссылки на этот объект, так как являются членами коллекции <global s>. Как будет показано ниже, ме ­ тоды Un i on и Int ersect часто оказываются очень по.riезными. Метод Un i on можно использовать для генерации диапазона из двух или большего ко ­ личества блоков ячеек. Метод Intersect применяется для получения общих ячеек двух или большего количес тва диапазонов (пересечения диапазонов). Следующая процедура обработки событий из модуля кода листа не позволяет пользователю выделить ячейки из диапазонов BlO:F20 и H l O:L20. Одним из применений этой подпрограммы является за­ щита данных от изменения пользователем: ~'Pr±vafe sU.H worкsheei"Csёle<::t±onchange -<вY:va+ ,тar<iёt:.· As наng'ё) "" " Dim ForЬidden . As Range ' s et ForЬidden = Union(Range("Bl0:F20"), Range("H10:L20")) If Intersect(Target, ForЬidden) !s Nothing Then Exit Sub Range { "A l ") . Se],ect · MsgBox " Не.hьзя: выделить ячейки в диапазоне " & ForЬidden.Address, '~vbcritic~l ,_впо :s::i.!?."..=""~~.".".... . ··-- "д"" ••"" '"···= "" ~--~ ·= ~ ·"""·-~·"""'"""'""~'·=ю;.Й~ ,," . Процедуры обработки событий рассматривались в главе 2. Дополнительная инфор ­ мация о процедурах обработки событий приводилась в главе 10. Процедура обработки события Worksheet_SelectionChange вызывается каждый раз, когда пользователь выделяет новый диапазон листа, связанного с модулем процеду­ ры. В показанном выше коде метод Union используется для определения запрещенного диапазона по двум несмежным диапазонам. После этого метод Intersect и оператор I f применяются для проверки пересечения выделения с запрещенным Диапазоном. Если пересечение отсутствует, метод Intersect возвращает значение Nothing и подпро­ грамма завершает работу. Если пересечение существует, выполняется код после операто ­ ра If - выделяется ячейкаАl и выдается предупреждение. Пустые ячейки Для перемещения по строке или столбцу до первой пустой ячейки можно воспользо­ ваться свойством End. Еще одним способом является перебор ячеек в цикле и заверше­ ние цикла при обна,rух~ении пустой ячейки. Для обнаруженИ:я пустых ячеек также можно воспользоватьс.1! функцией VВА IsErnpty. В показанной ниже электронной таблице (рис. 19.13) для получения удобного для чтения отчета необходимо вставить пустые строки между каждой неделей.
470 Глава 19 Е Jдата Кп~tент .. . .. . .. . . . .. .. . 9. .~..~-~-~~---~Р..l?д.~.~. ..:Ч.~.~-~- 2 i ёJi янваJ'~?@Г. t".~~~ • 903 3 ' 01 янваnя2003r Голиб ············ ·················· · · ··331······· т! 02 ;,;; ,;э~я 2оозГ :Бвнэёидес ·· :2siГ i ~ Я~ ва ря 2сiQ:Зr.Г:ол,~б ... 612 .. ·· i gе~_нв.ае.я.2.СIО~ г. ;Гол. ~о____ ___ __ ::.~т~:~~::~: :__ ~92, ___ _,_~,5 ... 1 08 янва я2003 г.'Киммел 107 • 1в: 10 января 2003 .r. .. . Гомис .. ····· 77ij' ;· 1вt i9o!i1:~::~:~gа;~ .Щ~ональд ••.·:::......:.:.··.:: f~5· ..121~1 11 '· . 1.5. января .~CI0.3.. .r .. Б.. •.н.а.•.~/:\ес ~~1} 121:·;······ ·;·:.. 12 i 17 ~н~аря 2ск:J:З r. .Е)ен~~!' ее 13 ' }1января2ск:J:Зr ;.Г:о ".' ~~ . 624 · 5' 14 ... 22 января)(()3 rJол,иб _ __ . 193[ - )()} _ 15 1 23 января 2оо3 r. МакДо нальд ;MI 25 1§J2?ян~аря~:Зr. :ГQ•~б · ·...• .NJ • го '············ о ,;·'~···· ; -->i\J:,ii.ii'йTP!:O:IO,!!~l.~~P~i~./----·"--- ~-~-.J,··~':::;,::'::?ii::::;;.z:;:;yc:;; Готово Рис. 19.13 . Отчет по объемам продаж Следующий макрос сравнивает даты с помощью функции VВА Weekday для опреде­ ления дня недели (в виде числа). По умолчанию воскресенье имеет номер 1, а суббота ­ номер 7. Если номер сегодняшнего дня меньше, чем предыдущего, предполагается, что началась новая неделя и между строками с данными вставляется пустая строка . ·pui:5fic-SUь · ShowWeeks () -='?1~='* ·w,"-~,, ~-'-""~~-~w~~--- ~-~ Dim Today As Integer 1 Diщ .Yesterday _As Integer ' .- Range ( ''А2"). Select Yesterday = Weekday(ActiveCell.Value) Do . Until IsEmpty(ActiveCell.Value) Activece11:offset(l, 0).Select Today = Weekday(ActiveCe11 . Va1ue) If Today < Yesterday Then ' . ActiveCeli. EntireRow. Insert ActiveCell.Offset(l; 0) .Select ' End If Yesterday тоdау , Loop · · ~n,d,;..§-цp_ Результат работы кода показан на рис. 19 .14. Обратите внимание, что многие пользователи определяют пустую ячейку сравнением со строкой нулевой длины. В большинстве случаев такая проверка срабатывает. Она сработала бы и в предыду­ щем примере. Но может не сработать для ячеек с формулами, результат которых являет­ ся строкой нулевой длины. Для обнаружения пустой ячейки лучше использовать функ­ цию VВА IsEmpty.
Использование диапазонов 471 с D Е j g1';н~аря2(1()_3г~п;~е{т ....... ч~ч•• .. ш~~:;~кт. ! Dбъе1< пpo,!\;d:ЗilJ.e~a 3 : 01 января 2003 г -Голиб ·············· · · )iijj ·· ······ ··· .. . , Бан аны . ...... ..... ..... .. ....... .. }31·: ·:.г! Ь2Ян8аrЯ2663 Г! БенавИдес ;,;лi ···· : манго 299 , 5: .. . . . . ... . 61_Q6._ян~ар_я_2_(Х)_зг:!гол~б ..")fll:! " :БананЫ Т.! QС1январ~~Щ3r[Со~~~ " ! NJ .. j1;"~ ·::: , 8 ! ,qs."~н,в.ар.~.}~~-~·. i l:(11~'!1~!1______ . J ~J - . _____ j f:~r~§Y.!.?..~... .--t .. ___ -··- --··---· fo! 1Qянв~ря2(1()~г jrо,_,и~ _ ;ст .. . . . . . .. . . . .Jlи"."···· 11 : · 14январ~2СJ]3г :rо~Иб '~J iли,и· •..·.·••· ] ·· ·· ··· 22зr j 2,s} 2787.5 11 12: 14 января 2003 г ' Маt<Дональд ' MI ·_·__ ; i:;ан_~·,;·~- ····· ··· ···· ··· ··· ···· ·· · · · 1':3;/ 15' · ·1000·:.j 13i.·.·.1.·.·.s ... ·.·.я.·_;..·__._в_··.• .-. n.· .я .·.·..··.2.·.оо.··..·.·.··.3.··.·.··.г.·.·.i.Б.·. в ..·. -.н _··.а....в.·.·~.·д··.·..·.ё ..·· _с .. .···..·. · . • .·.1"1i · :л""" ··· ·· . ··· ········ ····· ·····' ~ - ' ·· ·· ········ ·.·.·.··.·.·.·..·.·.-.·. ·· · ·5е-698····1 t,· ... ... . . .. . ·.·.·.1.·.·.2.·.1·.·.'.~5·.·.·.·.:..,. ..· . · . ·- · . · 8.·.·1 ·_ 36.·3 · .·.·2 ·. 2.·.·1 .'. 55·.·.·.·.l ·.: J.!JJ.! . . .~-~-~-~J?. .~--~~-~- ~..iО~..~-~-~-~.д.~.~- ; м1 ··········iма·~·го ~; 15: ..... .. . : :.. . · .... ' ~~) ....... ;•.. .· · 1 1§ j 21я~~аря2(1()3г ) Го"и~ ;~:;т _jБана~~' ..! . ........... йЬl ....... ШJ ~~~ ' 1 ;;:- ~;~::~~:~~~j?\ГО!'"~а;;э-,;-ьд :~i ·~:-yz~aн______J_ ·· · · · 2551: ... ;?СJГ~ ".§100_=1 19 ·· ·-· -··- · •--- --- -- : : ····-----------6- ~.г""".... -.2 0 ·-1.' --·--- }Q_ 200 :NJ ·тмг,;;;··- -----.,..--- 120· : . : .. ",. ' ."._.:.~·-·__.·)···J··~·- ; ii j\ ciiarii]Piofii),salesData/ · -- " " " - J ~:;.':,::;,_;;.:,:.:::;_~:,.~;_;,:;:::;;;.;j' -~: Готово Рис. 19.14 . Отчет по обое.мам npoдmte с выделением недель пустыми строка.ми Копирование значений между массивами и диапазонами Для обработки всех данных диапазона стоит скопировать все значения в массив VВА и обрабатывать массив значений, а не объект Range, содержащий значения. После обра­ ботки значения можно скопировать обратно в диапазон . Следующая простая конструкция позволяет скопировать значения из диапазона в массив: Г..S1э:I~jJ5lft_~ :r ; ~i<;ang:e( :.AГRI66~6~o~;,:ГvaJ,μ_e. По сравнению с перебором ячеек данные передаются очень быстро. Обратите внима­ ние, что этот подход отличается от об_ъявления объектной переменной, которая ссыла­ ется на диапазон: ~?е.(- §_a) ~sP~.t,~ . ~ ~ari&e .С:.~~- ):1o«:JC!o:" ) Для присвоения значений диапазона переменной SalesData она должна иметь тип Variant. Интерпретатор VВА копирует все значения из диапазона в переменную, созда­ вая двумерный массив. Первая размерность соответствует строкам, а вторая - столбца.'1, по­ этому для доступа к значениям в массиве используется номер строки и номер столбца. Для присвоения значения из первой строки и второго столбца массива пере1у1енной Custorner можно воспользоваться следующим кодом: Когда значения диапазона присваиваются переменной типа Var i ant, создаваемый массив всегда индексируется начиная с единицы, а не с нуля, независимо от оператора Option Base в начале модуля . Кроме этого, массив всегда имеет два измерения, даже если диапазон состоит из одной строки или одного столбца . Структура массива повторя·
472 Глава 19 ет структуру столбцов и строк листа. Эта особенность помогает .при записи массива об­ ратно на лист . Например, при присвоении значений из диапазона Al :A l O массиву Sal esData пер ­ вым элементом является SalesData ( 1, 1), а последним - SalE;!sData ( 10, 1) . Когда массиву SalesData присваиваются значения диапазона A l :El , первым элементом явля­ ется SalesData ( 1, 1), а последним - SalesData ( 1, 5) . В последнем примере может потребоваться макрос для суммированИя прибыли по конкретному клиенту. Следующий макрос использует традиционный метод непосред­ ственной проверки и суммирования диапазона с данными: :J?иь11с: · -siib Gоliё:Ьто.А11 ( J ·Dim Total As DouЫe Dim i As Long With Range("A2 : G20 " ) For i = 1 То·.Rows.Count If . . Cells(i, 2) = "Голиб" Then Total :~тotal + .Cells(i~ 7) Next i End . With MsgBox "Сумма для Голиба . = " & Format (Total, "$#, ##0") ~~ц"9,.,,~uЬ , ,,...~м' :д ,: ,! ,,_ = t;(,, ~ U.:" ...- .. A.3•'~"'· ·'-'··"""'',J,..: ..... ..<.М."-"'··-· ·-··· .А.;;,..; ,,.,,,,,,", . .... ~ ..."~. ••"w:·MA ,h'~"A .1 Показанный ниже макрос выполняет ту же операцию, но сначала значения из объекта Range присваиваются переменной типа Variant, после чего обрабатывается получен­ ный массив. Скорость работы макроса заметно увеличивается. Он может работать в пять­ десят раз быстрее, что очень заметно при работе с большими массивами данных . : J?iiБiic · su:ь Go:iiёOт.:;t:a:п( ··-~··-·· ~ "·· -~ ".. ". ___ '". Dim SalesData As Variant ·Dim Total As DouЫe · Dim ·i As Long SalesData = Rarige("A2:G20") .Value For i = 1 то UBouhd(SalesData, · . 1) If SalesData(i, 2) "Голиб" . Треп Total .~Total + SalesData(i, ~) Next i ?.·, Cal1· MsgBox ( "Сумма' для Голи ба " & ~ormat (Total •.1';!1.9 ."e u J::>.:,~..< •..•.. .•.•.' ..•.•.•.~..~·"•" __ .. ~"""' ....~ ··"$#,##О"П Кроме этого, массив со значениями можно непосредственно присваивать объектуRаngе. Предположим, что набор чисел необходимо вывести в столбце Н в книге Frui tSales . xls из пред~щущего примера. Набор чисел является 10% скидкой для клиента 'Толиб". В следую­ щем макросе также перед обработкой диапазон значений присваивается переменной типа Variant: PubHc '. Sub00Go Hёbr:jГ$,EoilntTI :~··т Sal e sData As Vд:riant .Discount(),,As .Variant . i As Long .. , ,.. . , , . Sa1esData = Raпge ( ."А2 : G20" ); . Val ue ReDim Discount ( l то UBound(Sales.Data , ' Fqr i = 1·То'U:Bourid(shlesData, ,1): · : " If Sa,lesData{'i, 2) .. ,;· "Голиб •;. Then · : :;:; Discount Ci.;. дJ .; =·· saJesData (i, Бnd. If ·. ·.. . . . Next.'" •i • " • · . . •..'с: . ·· .; . Ra rige _(. " H2 " ) .Resize (UBound(Sal esDa t a , , f~P.~9\.·~~}:l.J:i ;""' ~.~..-...~д.._ . :; 'А ~-"-~,·~-~,~:-~ ~~;/;. ·. :.:Ji:.1::-, . .. : .ff . ''"'~x x.-;,-.,,.-....,h .M~~~~::Ь:ii:-·:d;,<;-_;;;,.~.<A--" _-~"-....Jнй".~"~''~""'·''· '·"'°"""""'''·'"'·'о.,ъ~
Использование диапазонов 473 Код создает динамический массив, который называется Discount. Размерность мас ­ сива меняется в соответствии с количеством строк в диапазоне SalesData (массив име ­ ет соответствующее количество строк и один столбец). После присвоения значений мас­ сиву Discount этот массив непосредственно присваивается диапазону в столбце Н. Об­ ратите внимание, что при этом необходимо правильно указать размер диапазона, в кото­ рый копиру~~пся значения. Указать первую ячейку, как при копировании на листе, недостаточно. Результ_ат работы этого макроса показан на рис . 19.15. ......... .............·... 1"$·.~--~--~-~-·~.!·.·.·.·.··· -J ~~~~-o -~:::~·~·J·Б~a-~i~:~!_ Л111.l~1 ::·:·J~::: .:=:J~Э;~Бyi_a_~· .... jC:J.... 'Л"'" ! Доход Ск~t ·· 15 :· ···· 13545"'· ==- -=- -·· <· 15 ' 4965 ·············· 2ьг 5900: =: ю 2 •:-~:~J 5 · ········· э1во '· . ~ft.. 121·g, .i1З?l2~: ?iьг -~ тх.{ ~2§I 223 • 12 5 ; p87,5j ............... ...... .... ...... 132' ....... .....·. {$' 1980 .. • •.•. ..••• .•• ..• .• .•• .•••••••• . 66~] 12.5 ....... ёЗБ2:ii' вs1 : ·.···.·.·.·.· •·· ··· .·..·• .. .. 151 .. ·· 1з215 ·· ' 624 ' 1s' юБО: ························ · 1ээ: 2ь: ···эа61J' "........."... """ . .. .." ... .. .2 ,,-05"5., :-: :: - 20~.".:. 5100 ! .. :~·~:-· 2ьг i~; . .....................J{31 ;;;-·~~::~ ~-···~:,~. Рис. 19.15. Копирование маесива в диапазон Я'Чеек Массив Discount может быть и одномерным. Но во время присвоения диапазону одномерного массива он будет содержать строку данных, а не столбец. Для обхода этого ограничения можно воспользоваться функцией листа Transpose. Предположим, что размерности мaccивaDiscount изменены следующим образом: R.eoim · bis.<;"~U.цt: !i :t9 ,pь<:,iuricl (sa~e·soa,ta, Эту версию м'ассива можно присвоить столбцу с помощью такой конструкции: .R.ange .(<1 н.2") '°: Resize(uвourid(Saiesbata, iJ; ·1) .valu'e · .wo_rJ:<.So!=eЧ·~:n"cti_on_,Т.E<ШsJ?()se.(y<J,Dii;;c:.oi.rri1:.) Удаление строк Достаточно часто. у разработчиков возникает вопрос: "Как лучше всего удалить строки листа, которые не потребуются в дальнейшем?" Обычно необходимо найти и удалить строки, содержащие определенный текст в определенном столбце. Наиболее подходящее решение зависит от размера электронной таблицы и ориентировочного количества уда­ ляемых элементов.
474 Глава 19 Предположим, необходимо удалить все строки, содержащие текст "Mangoes" в столб ­ це D. Одним из способов является перебор строк в цикле и проверка содержимого каж­ дой ячейки в столбце D. В таком случае лучше начинать с последней строки и переме­ щаться вверх строка за строкой. При этом Excel не нужно передвигать вверх строки, ко­ торые потом придется удалить. Если начать сверху не получится, . то лучше использовать простой цикл For ... Next, так как при удалении строк значение счетчика цикла небу- дет соответствовать номеру строки. PuЫi'c ' Slib .DeleteRowsl () Dim' i As Long Application . ScreerШpdating False . For· i = Cells (Rows:Count, "D "). End(xlUp). • Row То 1 Step -1 .. . · Тf Cells (i, "D"). Value "Mangoes" Then Cells (i, :,~ "р;· У. EntireRow. D~lete ' Next i i :,Е;р.с1 §.)"ф~ .. _ ..д ·....,.: y-»"i .....:! Есть хороший принцип программирования: если в электронной таблице Excel реали­ зуется определенная методика , она будет работать быстрее, чем соответствующая реЭ.Ли­ зация на VВА, например, с использованием циклаFоr ... Next. Разработчики VВА-приложений для Excel, не обладающие богатым опытом работы с пользовательским интерфейсом Excel, часто попадают в ловушку реализации на VВА операции, уже реализованной в Excel . Например, можно написать процедуру VBA, кото ­ рая перебирает отсортированный список элементов и вставляет строки с промежуточ­ ными суммами. Но ведь можно также воспользоваться VВА для вызова метода Subtotal объекта Range. Второй метод намного проще в реализации и выполняется быстрее, чем тело самостоятельно написанного цикла. Язь1к VIЗA h'Учше. исп'оЛьiовать для управления встро·е~ными возможностями Excil,,; че~ для n9вто,рной .р~ализаЦии функu,ио~альноi:ти Excel " ' ,, Но подходящее средство Excel не всегда очевидно. Наиболее вероятным канди~атом на поиск удаляемых ячеек без просмотра каждой строки является команда Правка9Найти (Edit9Find). В следующем коде метод Find используется для сокраще­ ния итераций цикла VВА: Public sиь · ьe1eieR6ws2 .(J · ·· .•. ..,.,, · Dim FoundCel1 As Range Application.ScreenUpdating = F,alse Set FoundCell ~ Range("D:D") .Find(what:="Mangoes") Do Until FoundCell Is Nothing Loop ,End Sub . FoundCell . EntireRow.Delete Set FoundCell = Range("D:D") .FindNext При небольшом количестве удаляемых строк этот код работает быстрее, чем первая про­ цедура. С увеличением относительной доли удаляемых строк · реализация становится менее эффективной. Возможно , на определенном этапе придется искать другое средство Excel. Самым быстрым известным способом удаления строк является использование воз­ можности Автофильтр (Aut0Filte1·). 'Public ' suь DeleteRowsЗ ( J" Dim LastRow As Long Di!!\ , P ,Ra,,gge _As Rang~
Использование диапазонов 475 >'· .,, , A.l?pli<;: a j:ion. screenupdating ' Rows(l)· ..rnsert .. · ,· ' .Range ( "1)1 " ) . Vaiue 7 . "Ternp" Wi'th ActiveSheet · · .U:sedRange LВ:stRow = .Cells.SpecialCells(xlCellTypeLastCell) .Rbw · S .et ·. aRarige = Range("Dl" , Cells(LastRow, ."D")) aRahge.~u~oFilter Fiel d: = l, Criterial: = "Maнгo" aR.ange.SpecialCells(xlCellTypeVisiЬle) .EntireRow'.Delete .~~dR~~ .; ' , End Wi~h . t?п<:l . з:иь,_~,...-~.~~ .• . !О.->·~: ' ""' -·~- ..: . Этот способ сложнее в реализации, но намного быстрее в работе и не зависит от ко­ личества удаляемых строк. Для использования cвoйcтвaAutoFilter в верхней строке диапазона с данными должны указываться имена полей . Сначала над диапазоном с дан­ ными вставляется строка с именем для столбца D. Свойство AutoFil ter используется только по отношению к столбцу D . При э:гом скрываются все строки, не содержащие строку "Манго". Метод SpecialCells применяется для выделения только видимых строк в столбце D. Это выделение распространяется на всю видимую строку, и строки удаляются включая строку с названием поля. CвoйcтвaAutoFilter автоматически отключается при удале­ нии строки с названием поля. Резюме В этой главе рассматривались самые важные свойства и методы, позволяющие рабо­ тать с диапазонами ячеек на листе электронной таблицы. Основное внимание уделялось методикам, которые невозможно выявить при использовании механизма записи макро­ сов . Рассматривались, в частности, с.l!едующие свойства и методы: о мeтoдActivate; о свойство Cells; о свойства Columns и Rows; о свойство CurrentRegion; о свойство End; о свойство Offset; о свойство Range; о свойство Resize; о метод Select; о метод Specia)Cells; о методы Union и In.tersect. В главе было показано, как присваивать значения из диапазона на листе массиву VBA и как присваивать массив диапазону листа. Перемещение значений в массив позволяет ускорить обработку. Также в этой главе отмечалось, что необходимость в активизации или выделении ячеек возникает очень редко, хотя при использовании механизма записи макросов эти
476 Глава 19 выполняемые вручную операции записываются всегда. Ахтивизация ячеек и листов за­ нимает ·очень много времени . Для обеспечения максимальной производительности кода этого процесса стоит избегать. Из последних примеров следовало, что обычно лучше использовать существующие возможности Excel, предоставленные объектной моделью, чем создавать собственный эквивалент этой функциональности на языке VВА. Не забывайте, что некоторые приемы использования Excel более эффективны . Для получения максимального быстродействия может потребоваться несколько экспериментов.
Использование имен Одной из наиболее полезных возможностей Excel является создание имен. Их можно создавать с помощью команды меню Вставка с::> Имя с::> Пр и своить (I11seгtc::> Naшec::>Define ). Для создания имени диапазона необходимо выделить диапазон , ввести имя в поле Имя (Nаше ) в левой части панели Формула (Foгшu la) и нажать клавишу <Енtег> . Но в Excel имена могут ссылаться не только на диапазоны . Имя -может содержать число, текст или формулу. Такое имя не имеет ВИДИМОГО поло­ жения на листе и может проGматриваться только в диалогов ом окне Вставкас::>Имяс::> Присвоить (Inseгt c::> Nаше с::> Defi11 e) . Таким образом, имена можно использовать для хра­ нения инфо рмации в книге без добавления данных в ячейки листа. Имена могут быть объявлены скрытыми. В таком случае имя не отоб ражается в диалоговом окне Вставка ~:::> Имя с::> Присвоить (Inseгtc::>Naшec::>Define) . Это один из способов сокрытия полезной ин­ формации от пользователей . О<rr.1чно имена применяются для слежения . за диапазонами листов. Имена оказывают­ ся особенно полезными при использовании таблиц переменного размера для хранения данных . Если известно , что опр еделенное имя ссылается на диапа~он с обрабатываемы­ ми данными, м~жно применять более простой код VВА. Кроме этого, существует не­ сколько простых приемов изменения опр еделения имени, позволяющих модифициро­ вать таблицы с данными с помощью кода VBA. В составе объектной модели Excel предоставля ется коллекция Names и объект Name , используемые в коде VBA. Имена могут быть опр еделены глобально на уровне кни ги , а могут быть локальными на уровне листа . При создании локальных имен одно и то же имя может использоваться в нескольких листах книги . Для создания объекта Name на уровне листа перед значением свойстваNаmе указывается- имя листа и восклицательный знак. Например, для определения локального в пределах листа Sheetl имени Costs в диалоговом окне Встав ка ~:::> Имя ~:::> П р исвоить (I11se1·t c::> Namec::> Defi11e) можно ввести Sheetl!Costs (рис. 20.1 ) .
478 Глава20 Имя: ~..~ ···· ·· ·· ··· ··· ·- - - - - -- -- ок 1 Закрыть 1 До§~ить L. __ ~алит.ь ~ормула: Е11~2=·--·---·-- -----==---::===-11\] Рис. 20.1 . Диалоговое окно, достуJiное по команде Вставкас:?И.мяс:?Присвоить При выводе диалогового окна Встаекас:> Имяс:>Присвоить (Inseнc:> Namec:> Define) отображаются глобальные имена из книги и локальные имена из активного листа . Ло· кальные имена квалифицируются именем листа справа . Если локальное имя совпадает с глобальнь,1м, отображается только локальное имя . Одним из источников путаницы является наличие имен у имен. ОбъектNаmе и свой· ство Narne этого объекта различаются . Следующий код во з вращает ссылку на объектNаmе из коллекции Narnes : Ш<:imE!§J;;.c;i;>§t§_ :I:;_-~;-- ...• . Для изменения свойства Narne объекта Narne можно воспользоваться таким кодом: '~airi~§ /~~f?§ t:;,_-i~ J : ыai1\:Ei ;,, _, . :~ Ne wbat fi'; ... ~: "''"·~·~: . .:::-::~::--~::··:::::. В результате изменения свойства Name к объекту Narne можно обращаться следующим образом: -Ш~i!l§:§ :C[~f'i"'-tJ.ii.:~?.-'· Г Глобальные и локальные имена хранятся в коллекции Narnes, связанной с объектом Workbook. При использовании записи видaApplication .Names или Narnes возвраща· ется ссылка на коллекцию Narnes активной книги. Для получения ссылки на коллекцию Na~es конкретной книги можно воспользоваться следующим кодом: .W9.i~l?0:9t:~ I~:~.o:oкe~x.:i:§ ~·J ::i;1~rii.e i> ::.· ..:_::~:::.:::.·· ·::..:.:: ·:·:.: . Локальные (но не глобальные) имена также принадлежат коллекцииNаmеs , с~язанной с соответствующим объектом Worksheet. Для обращения к локальной коллекции Names ин· тересующего листа можно воспользо.ваться ссылкой вида Worksheets ( "Sheetl") . Narnes или ActiveSheet. Narnes. Существует еще один способ обращения к именам, описывающим диапазоны . Для этого можно использовать свойство Narne объекта Range . Дополнительная информация об этом способе приводится ниже. Именова н ие диапазонов Для создания ссылающегося на диапазон глобального имени можно воспользоваться методом Add коллекции Narnes из объекта Workbook. ~:Name i;; ..д(;\Сi )iаП\е Т~;, b<:it a;"; ·· ~efE!i::s!J:'o. : ;; ::~sh.Э~YiH I:S$IQ: $J?IЦ "~:;.::~=" :..: · ".~: . .:"'.
Использование имен 479 Важно, чтобы перед определением указывался символ равенства и применялись абсо­ лютные ссылки на ячейки (абсолютные ссылки начинаются с символа$). в противном случае имя будет соответствовать адресу относительно активной ячейки на момент опре­ деления имени. Если имя должно соответствовать активному листу, ссылку на лист мож­ но опустить. !NaF\es': ~;;з:si:ыa.т~-~~,;-;;·Jia'i::a" :~~-Re(erJsтo i:~"~ $1Y$fo·, '$'1?$'12'"~:-~~.:;~.~ :':"'" . Если имя уже существует, существующее определение будет заменено новым. След~щий код позволяет создать локальное имя: LN~m~~·:. ii:(j,(:1''.NaЩi:-;::;~s,кe~ t:I!_$aI:e_s ;;·;" Reier sто ; ;;.~JsБee t:~T$ Е $.l:бJ"i:$t$J~.;;::1-;г· ~"':Z::::J С другой стороны, имя можно добавить в коллекцию Names, связанную с интересую­ щим листом . В этой коллекции хранятся только локальные имена листа: 1work:sl1eet"5T ·' sfieei:.Г'Г.r'James .ii:dёl N'ame ·, ; "c65t.~~,-,, :· l~~~i~E~'.12~ ~§.heeЦJ_tf 1 Q : $.F$ ~ " · Использование свойства Name объекта Range Существует более простой способ создания имени для объекта Range. Для этого мож­ но обратиться к свойству Name объекта Range. Если имя должно быть локальным, в значение свойства можно добавить имя листа: При создании кода с объектами Range проще работать таким образом, чем генериро­ вать строку адреса диапазона после символа равенства (эта строка передается в качестве значения параметра RefersTo метода Add коллекции Narnes) . Например, если после создания объектной переменной aRange ей необходимо присвоить имя Data, значение свойства Address объекта aRange придется присоединить к строке вызова, как показа­ но ниже: ri.lвaJne§ : A~d--Naii}ёj~ыiiз'~7 '_Re~er ~~o: ;;·;,;;" ~ & ~aR~~nge ~-~(:1&'es's~· N --~~-~~·-.".,--~··· -- -··' -""''""""""°" С другой стороны, можно воспользоваться следующим кодом: Но полностью забыть о методе Add не получится, так как это единственный способ создания имен для чисел, формул и строк. Специалъные имена Некоторые имена используются внутри Excel для отслеживания определенных воз­ можностей. При выборе диапазона печати на листе Excel присваивает этому диапазону локальное имя Print_Area. При создании заголовков печати E~cel создает локальное имя Print~Titles" а при извлечении данных из списка в новый диапазон с помощью команды Данные~Фильтр~Расширенный фильтр (Data~Filter~Advanced Filter) Excel создает локальные имена Cri teria и Extract.
480 Глава 20 В более старъ~х версиях Excel имя Da tabase исполъзовалосъ для диапазонов с данными. Хотя в соврем.еннъ~х версиях имя Da tabase применятъ не обязателъно, это UJ\IЯ все е~це распозндется некотаръ~.ми 'Ко.мпонентами Excel, например Расшир енным фил ьтром (Advanced Filter) . Макрос, применяющий дпя редактирования списка данных команду ДанныеqФормi (Data~ Form)" Не будет . работать со списками, которые начинаются за ' пределами диапаЗона ':, А 1:В2. ,Для обхода этого ограниЧения списку данных можно присвоить имя дa't:abase. О применении этих имен в Excel стоит знать и избегать их использования в собст­ венных приложениях (кроме случаев специального получения побочных эффектов, свя­ занных с этими именами) . Например, для удаления области печати можно удалить имя Print_Area . При · наличии определенной области печати следующие две строки кода являются эквивалентными: лctrv:e;·зьeeг·J>agesefu-P :' :P·aьt:дrea ·;; ~";.-·~-···:"' = Лc,tJyi=::>J:leet, Narn.e§("Pri_nt:_,A.rE!a,:; ) ,,J~,el~tE! ·. · Как итог, можно отметить следующие имена, при работе с которыми необходимо со· блюдать ос.торожность: о Criteria; о Database; о Extract; о Print_ Area; о Print Tit l es. - Хранение значений в именах Использование имен для хранения элементов данных уже рассматривалось в главе 3 в разделе ;'Метод Evaluate" . Теперь пришло время более подробно проанализировать эту возможность. При использовании имени для хранения числовых или строковых данных перед зна· чением параметра Refer s T o не нужно указывать символ = . Если это сделать, значение будет рассматриваться как формула. Следующий код сохраняет число и строку в именах StoreNшnЬer и StoreString соответственно: ;!5im 'x A.s variant~· -~-с~ х = 3.14159 'Names .Add Name: = " Stor!"Nшnher", RefersTo: =Х ,:Х = "Sales" · . JJa,inE!s. . J}dg. ЕёJ.!11.Е! : .-:. ·:et5l:t;!?_l?J::J::.~.ng::· " J3&~E!r:вT::> ;..7'~-~-""~--~·~··· = = ·· Эта возможность очень удобна при хранении данных для кода VВА между сеансами работы в Excel. Данные не . исчезают при закрытии Excel, и поддерживается хранение строк длиной до 255 символов. Для получения значения имени можно воспользоваться методом Evaluate. ;z ~: .. [$\;or:eN'ilffiPer:T Кроме этого, в име;f!ах можно хранить формулы . Формула должна начинаться с сим· вола =. Следующая строка кода сохраняет в имени вызов функции COUNTA. :N~щер ).d§ йaiii.~::=;·jf::E!i\1i,~PA ::~ ::~.~-(er:§ti: ,;;,I{c.6~fX1J)\._;JЖ1=!·
Использование имен 481 Это имя может -использоваться в формулах в ячейках листа для получения количества элементов в столбце А (рис. 20.2) . Е1 Microsoft f.xcel - Кннrа1 ,- - ~[§~ ... 1_января 2003 .r. . ........ а. я~варя 2(1()~ г •.. _ 15 янвае~:2()()3 г ;. 22 января)ЩЗ г ; .. 29 я~~аря 2(1()~ г. 5 февраля 2003 г _ _ 1:2 февра~~ :@)3 r · 1_9_февраля 200Зг ; Рис. 20.2 . Использование имен для xpa- нe1tW1. формулы листа И в этом случае для получения значения имени в коде VВА можно воспользоваться методом Evaluate: ~o_;г· cп~r!i'~tPAI .. Хранение массивов В имени можно хранить переменную массива с набором значений . Следующий код создает массив чисел MyArray и сохраняет значе ния массива под именемМуNаmе. PuЬii'c ·'-suЪ ' .ArrayToNaпie <) · ,_ D~m MyArray(l То 200 , 1 То 3) · Diщ I As Integer · Dim J As Integer · For r ], То 200 ForJ=1То3 MyArray(I, J) Next J Next I r·+ J Names.Add Name:="MyName", RefersTo:=MyArray r.f:rid suь В Excel 2003 размер массива ограничен только размером памяти и дискового простран- ства, а . также воображением разработчика. . Метод Evaluate может использоваться для присвоения значений содержащего мас­ сив имени переменной типа Variant. Следующий код присваивает содержимое имени MyName (создается в подпрограмме ArrayТoNarne) переменной MyArray. После этого выводится последний элемент массива :
482 Глава 20 ii:'i:11:Jiic · s U.J:>' 'Naineтoдr:J:-a:y:·( г· * Dim . MyArray As Variant 1 NyArray = ,[MyNarne] , i .. · MsgBox MyArray(200, · З) [~ri,9:..:§i,ip;_,_," ''k = " •"'·:. . · "'' ' В резулътате присвоения имени массива переменной типа Vari ап t всегда создается масruв с нумершцией на1~иная с 1, даже если в на<~але .модуля присутствует оператор Option Base О . Сокрытие имен Для сокрытия имени установите свойство VisiЫe в значение False. Это можно . сделать при создании имени : ;шa:т-~§.~'AfllCN~ifte·::;:" §f.if:.eJ~:tiiili§J; : .,·~-~ 8.eI~r§!.9::~2~,:щ··· r.~.~I~J.]EЗ_i!:9.1§§.:.•~•=:.~..~J,:::·&~~;fif~ Кроме этого, имя можно скрыть после создания: fШ~Щe$(~§;t::()~eJ!uffilJ~.r "' E:yr:sI~~;; ~:xaJ~:-· ..:··,.,.~ После этого имя не будет отображаться в диалоговом окне Вставкас:>Имяс:>Присвоить (Inseгtt=> Namec:> Define), Этого недостаточно для безопасного сокрытия информации , так как VВА позволяет легко обнаружить такое имя, но это эффективный способ защиты пользователей от странных имен. Кроме этого, стоит помнить, что если через пользовательский интерфейс Excel будет создано имя, совпадающее со скрытым именем , скрытое имя будет уничтожено, В этом случае для сохранения имен стоит защитить лист . Несмотря на ряд ограничений , скрытые имена являются неплохим хранилищем ин­ формации в пределах книги . Работа с именованными диапазонами На показанном ниже листе (рис . 20 .3) приводится список данных B4 :Dl0, которому присвоено имя Database. Кроме этого, в диапазоне B2:D2 находится область ввода дан­ ных, которой присвоено и:мя Input. Следующий код позволяет скопировать данные из диапазона Input в диапазон со списком данных и переопределить имя Da tabas е для включения добавленных данных: ~:PuЫJc ·su.1:n \ad:NewD a.ta о 1' Dim Rows Ai;> : Long · .•' ' wi th Ra~ge ( " Database" ) Rows =· • Rows. Count + 1 i\ Range ( "iЦput !') , Сору· Destinati.0n: =" . Cells ·(Rows, r" .··· .·· .~esize(Rbws).Narne = ".D<;э.tabaE;e" . .· f~· End.. Wi th ~1JSU~l1)?~ . ·' · · ·· В результате работы этого кода в диапазон Bl l :Dl 1 будут скопированы данные "Shelley 26 Ж". После этого имя Database будет ссылаться на диапазон B4:Dl 1. В переменной Rows хранится счетчик количества строк в диапазоне Database плюс еще одна строка для записи новых данных. После этого копируется диапазон I nput . Данные копируются в ячейку Bl 1, которая определена через свойство Ce l ls объекта .
Использование имен 483 Database. Интересующая ячейка находится в первом столбце диапазона Database. Расстояние от вершины диапазона до интересующей ячейки хранится в переменной Rows. Свойство Resize объекта Database возвращает ссылку на объект Range, в кото­ ром на одну строку больше, чем в диапазоне Database. Свойству Name нового объекта присваивается значение Database. Рш;, 20.З. Диапазон со списком данных и область , ввода Приятной особенностью этого кода является независимость от размера и положения диапазона Database на активном листе и от положения диапазон а Input в пределах ак­ тивной книги. Диапазон Database может состоять из семи или семи тысяч строк . В диа­ пазоны Input и Datab~se можно добавить дополнительные столбцы и код будет рабо­ тать точно так же. Он будет работать , даже если диапазоны Input и Database находят­ ся на р азных листах книги. Поиск имени Если необходимо проверить существование имени в пределах книги, можно восполь­ зоваться следующей функцией . Эта функция может применяться как в качестве функции листа , так и в качестве функции VBA . В результате она оказалась немного сложнее, чем могла бы быть. · . wuь1 i~ :'Func~'fon.,..~s~ameTnworkbooкTБ:Yvai'")~ame -i!Гs t rfngj . Лs ·всюI~аn· " Dirn Х As String С., "D{m aRange As .·.Range · !·~·- Appli(; ation. Vo~atile · ·· o n · Error Resurne Next f Set aR~nge - Applicatipn.Caller · ;, \"'Ei.r."Cleд.~ ·r.~f aRang€ Is No ·thing Th·en Х ; = ActiveWorkbook.Ngmes (Name) ._ Name Else ...," !. ..~,~~~-~$~" ;O:.R~OJ1§.~i:_q _~~!l!:...: Rsf_E?.!1!." .!L~es (!:I~l!'§.l ~ =..~;Y!"rn'?
484 Глава 20 Then . IsNameinWorkbook True Функция IsNameinWorkbook принимает аргумент Name, в котором в виде строки передается интересующее имя. Функция определена как непостоянная, поэтому значение функции листа пересчитывается каждый раз при добавлении или удалении интересую­ щего имени. Сначала функция определяет источник вызова. Для этого значение свойства App l ication. Caller присваивается переменной aRange. Если функция вызвана из ячейки, свойство Application . Calle:r возвращает объ­ ект Range, соответствующий вызвавшей ячейке. Если функция вы:Зывалась не из ячейки, оператор Set приведет к появлению ошибки, которая будет подавлена оператором On Error Resume Next . Соответственно, сообщ ~ ние об ошибке удаляется, так как сле­ дующие сообщения об ошибках не должны скрываться этим сообщением. После этого с помощью оператора I f проверяется определение переменной aRange. Если переменная не определена, функция вызвана из кода VВА. В таком случае функция пытается присвоить значение свойства Name объекта Narr\e переменной Х. Если такое имя существует , попытка завершается успешно и ошибка не возникает. В противном случае воз­ никает ошибка, которая и в этот раз подавляется оператором On Error Resume Next . Если функция вызывается из ячейки листа, предложение Else оператора If иден­ тифицирует книгу, в которой содержится объект aRange , и пытается присвоить значе ­ ние свойства Name объекта Name переменной Х. Родительским объектом для aRange яв ­ ляется лист, в котором хранится объект aRange. Родительским объектом для листа явля­ ется книга, в которой хранится объект aRange. И в этот раз, если имя не существует, возникает ошибка. Наконец, функция I sNameinWorkЬook сравнивает с нулем значение свойства NumЬer объекта Err. Если значение равно нулю, функция возвращает значение True (имя существу­ ет) . Если значение не равно нулю, функция возвращает значение False (имя не существует). Ниже показано использование функции IsNarneinWorkbook в ячейке электронной таблицы. ~'E:I!§N~Ш:~~n®"YJi'ti96J~I;~~1;2r :C• J,, ·-~Имд ._19.~~: '" ;; Следующая подпрограмма запрашивает имя у пользователя и проверяет существова­ ние этого имени. Обратите внимание, что при поиске локального имени необходимо указывать имя листа . Для этого используется форма записи вида Shee~ 1 ! Name . При вызове функции IsNameinWo r kbook в качестве функции листа, если имя "Lшi" существует, будет выдано следующее сообщение (рис. 20.4).
Использование имен 485 Рис. 20.4. Результат провер= существования имени Поиск имени диапазона Если диапазону присвоено имя и свойство RefersTo объекта Name точно соответствует координатам диапазона, то свойство Name объекта Range возвращает имя диапазона. Может возникнуть соблазн воспользоваться данным кодом для вывода имени диапа­ зона: J{:sg~,O_)( aJ<_al}ge _,N:,;inie~- _ Этот код не работает, так как свойство Narne объекта Range возвращает объект Name . Предыдущий код выводит значение принятого по умолчанию свойства объекта Name (это свойство RefersTo). Для вывода значения свойства Name объекта Name необходи­ мо воспользоваться следующим кодом: }1sgBox · aRan_ge_. Name_ .. N;:_э.rn:._~ --::"· . Этот код работает только в том случае, если диапазону aRange присвоено имя. Если имя не присваивалось, выполнение кода приводит к ошибке времени выполнения . Сле­ дующий код позволяет вывести имя выделенной ячейки на активном листе: rPuЪiic sub тEЗstNameoTR.ange ( J Dim aName As Name On Error Resume Next Set aName· = Selection.Narne I f aName Is Nothing Then MsgBox "Вьщелению не присвоено имя" El se MsgBox "Выделению присвоено имя " & aName ;Narne· End · If. 'Ji:л<:l suь Если диапазону aRange присвоено несколько имен, выводится имя, первое в алфа­ витном порядке. Результат работы этого макроса показан на рис. 20.5 .
486 Глава 20 Рис. 20.5. Определение и.л~ени выделенного диапазона Определение имен, пересекающих диапазон При проверке присвоенных диапазонам листа имен часто возникает необходимость определить все имена, которые связаны с выделенными ячейками. Иногда интересуют имена, которые полностью покрывают выделенные ячейки, а иногда достаточно знать частичное пересечение имен с выделением . Следующий код выводит список всех имен, которые по1щостью покрывают выделенные ячейки активного листа: !.i>uьг1сг~и1,:;' seГect :ton:Бпt:1·:r--e;1 .Y rriwaШesTY~·-·~· , ~ Dim · M'7ssiщ$ As String ~ Dim aName As Name ~' D~~ _NaineRar'ig_e As Range !с .::m:::::g:e::m::::t ' Eacl). . aN~me rn Names Set NameRange = Nothing Set NameRange = aNaщe.:R.efersToRange If Not NameRange rs ' Nothing Then If NaщeRange ..Parerit.Name = Activesheet.Name Then Set aRange .= :r rii:ersect (Selection, NameRange). · If Not aRange· Is Nothing Then · · ·· End End If. · Next aName . ;Jf· Message Tf ' Selection.Address = . aRarige.Address Then ~essage ,= Message &· aName . Name & vbcr If. . MsgBox i ·'· ··Else ' Msgвox имя не ~:ркрывает . выде·ление 1,,. вnd rf ;f:pq ;, ?,μl::J ~.мс.
Использование имен 487 В начале подпрограммы SelectionEntirelyinNames подавляется вывод сообще­ ний об ошибках (On Error Resume Next). После этого начинается цикл For Each. . . Next, который обрабатывает все имена в пределах книги. Между итерациями цикла значение переменной NameRange устанавливается равным Nothing , что позволя­ ет удалить ссылку на диапазон, оставшуюся от последней итерации. После этого свойство Name текущего объекта Name используется в качеств е объекта Range и ссылка на этот объект Range присваивается переменной NameRange. Если имя не ссылается на диапа­ зон, то операция завершается неудачно, поэтому остаток цикла выполняется только в случае присвоения переменной NameRange действительного объекта Range. Следующий оператор I f проверяет попадание ссылки NameRange в активный лист . Содержащий переменную NameRange лист является родительским. Внутренний код вы­ полняется только в том случае, если имя родительского листа совпадает с именем актив­ ного листа. После этого переменной Rng присваивается п ересечение выделенных ячеек и диапазона NameRange . Если пересечение существ ует и переменная aRange не равна · Nothing , выполня ется самый внутренний оператор If. В последнем операторе I f проверяется идентичность дИапазона пересечения в пере­ менной aRange и выделенного диапазона. Если диапазоны идентичны , выделенные ячейки полностью входят в диапазон NameRange и свойство Name текущего объекта Name добавляется к именам, которые уже указаны в строке Message . Кроме этого, добав­ ляется символ возврата каретки (с помощью встроенной константыvЬСr) , чтобы каждое имя выводилось в новой строке сообщения. После завершения работы цикла For Each. . . Next оператор I f проверяет нали­ чие строки в nеременной Message . Если переменная Message хранит строку нулевой длины, с помощью функции MsgBox выводится сообщение о том, что имена не найдены. Иначе выводится список имен , перечисленных в cтpoкeMessage . При запуске подпрограммы SelectionEntirelyinNames в пределах эдектронной таблицы с тремя именованными диапазонами (Data, Fred и Mary) будет получен ре­ зультат , показанный на рис. 20 .6 . Если необходимо определить имена, только частично пересекающие выделение , можно удалить второй внутренний оператор If (в результате будет получен следующий код): , ?иы1ё .· su::s ·ыaiiiesoveI: 1aь)P'ln\Jsef ec tionT ) ~··- : · . Dim ..Message As String . '· . t Dl'ffi ''.aName As Name ' ' ' Dim NameRange As Range DiJ11 · 'q,Range As Яange.. · o n , .Error Resume Next For Each aJ)Jame In Names Set NameRange = Nothing Set NameRange = Range(aName.Name) · rf: ·Not/ NameRange rs Nothing Th ~n NameRange.Parent.Namё = ActiveSheet ~ Name Then · ,Set aRiшge = ·rntersect (Selection, NameRange) " Tf ' Not aRange Is Nothing Then· Message Message & aName . Name & .End If Next aName . I f Message " " Then· . МsgBs;>;i< " f!и _oдl:.iP . из. .!:1Меll~.н_е, _ nePes::°eJs.a.e~ J?t:rдeлe, 1'!иe" .
488 Глава 20 f~;, ." . ''EiseГ·'~•·~; jj rE;nq Рис. 20.6 . Определение и.мен, покрыва~ощих выделение Обратите внимание, что в подпрограммах SelectionEntirelyinNarnes и NarnesOver- lappingSelection используются различные способы присвоения объектной переменной rgNarneRange диапазd на, на который ссылается имя. Следующие операторы являются экви­ валентными: 1set*NameR:ande ·~ Ыаmе". R.ef ~rsт6R:ange· ~?.§i:-~}.'1?..fii§B.ёi.If~,§' ~::. J~:9:!1gEL(~.a,щE)., .1:\аrп<?) . Резюме В этой главе подробно рассматривались механизмы работы с именами в Excel VВА. Бы- ' ло показано, как использовать имена для слежения за диапазонами листов, хранения число- вых и строковых данных. Кроме этого, рассматривалась возможность сокрытия имен, про­ верки существования имени в пределах книги и диапазона, а также определение частичного или полного пересечения именованных диапазонов. Эти навыки позволяют управлять сложными связями между перекрывающимися и пересекающимися данными.
1.. Работа со списками Список элементов часто используется в качестве абстракции реального мира. Напри­ мер, люди создают списки действий, покупок, акций, мест, передач, книг и т .д. В этой главе рассматриваются списки, отношения между списками и диапазонами, а также пуб­ ликация и совместное использование· списков в сети Inteгnet. Создание списка Список похож на диапазон с дополнительными возможностями. При создании списка на основе диапазона ячеек Ехсе! добавляет автоматический фильтр в начале списка . Этот фильтр поддерживает сортировку и фильтрацию списка, обеспечивает точку вставки и предоставляет маркер изменения размера в нижней правой части списка для ручного изменения размеров списка . Excel предоставляет очень простую процедуру создания списка . Щелкните в любом месте непрерывного диапазона ячеек и нажмите комбинацию клавиш <Ctгl+L> или вы­ берите команду Данные<=:>Список<=>Создать список (Data<=>List<=:>Cгeate List). В результа­ те рткроется диалоговое окно Создание с п ис~а (Сгеаtе List) (рИ:с . 21.1) . В диалоговом окне выводится достаточно точное предположение о содержимом списка. Установите флажок Список с заголовками (Му list has headeгs), если в первой строке списка содер ­ жится информация о заголовках. После щелчка на кнопке ОК будет создан список с рас­ крывающимся списком фильтра в верхней части каждого столбца и областью ввода в нижней части каждо.го столбца . Каждый из описанных элементов (кроме итоговых значений) показан на рис. 21.2 . Раскрывающийся список фильтра в начале списка · позволяет выполнять сортировку в порядке возрастания и убывания по определенному элементу списка. Список выделен темно-синей границей. Для сокрытия границы неактивного листа можно выбрать команду Данные<=>Список<=>Скрывать границы неактивных списков (Data<=:> List<=> Hide Boгder of
490 Глава 21 Inactive Lists). Маркер изменения размера работает, как и любой другой элемент управ­ ления размера. Маркер обеспечивает выравнивание по границам столбца и строки. Сим­ вол (*) указывает положение точки ввода. Итог для списка создается командой Данныес::>Списокс::>Строка итогов (Datac::>Listc::>Total Row). С.;;данне списка- . . .~ :!)::аж.11те расnолож.ен11е данных cn11o::a [:$д$1:$А$-10---------~ D'6ES~~-~:.~~OЬ.O!~~~J Рис. 21.1 . Создание списка Сокращенные команды для списков не 4 . в.и.це.11. . . икай 10 себя 1(* . 12 131 ~····- •i \~~~.~.!J..l.:{IJЦ Рис. 21.2 . Результат создания списка Как и большинство возможностей, списки добавляют контекстные меню с характер­ ными для списков командами . Панель инструментов Список (Lists) и контекстное меню списков содержат команды для вставки и удаления столбцов и строк, удаления содержи­ мого списка, преобразования списка в диапазон, суммирования, сортировки и изменения размера. IJpи щелчке правой кнопкой мыш~r на списке выводится контекстное меню. В данный момент интерес вызывают меню Вставить (Insert) и Удалить (Delete). В каж­ дом меню доступны пункты Строка (Row) и Столбец (Column), которые позволяют вставить или удалить столбец или строку. Сортировка и фильтрация списка ' Обычно для донесения дополнительного смысла моЖно изменять порядок и форму записи данных. Например, числа 11, 5, 3, 7 и 2 могут выглядеть последовательностью случайных чисел, но после сортировки в порядке возрастания (2, 3, 5, 7, 11) становится ясно, что это последовательность простых чисел. Размещение элементов в контексте часто JIОзволяет сообщить дополнительный смысл. Организация (сортировка и фильтрация) является еще одним методом передаЧи инфор­ мации. Возможность Автофильтр (Aut0Filte1·) позволяет сортировать и фильтровать дан­ ные списков. На рис. 21.3 показаны доступные по умолчанию параметррr1 сортировки. На­ пример, при создании индекса может потребоваться сортировка в алфавитном порядке.
1 Столбец1 т. ортировка по возрастанию ортировка по убыванию (Первые 10" .) (Условие".) бы видел икой жалела Рш:. 21.3 . Доступные параметры copmupolfКU списка Работа со списками 491 Создание диалогового окна UserForm на основе списка Автоматическая генерация диалоговых окон лежит в основе программирования на Visual Basic. Всего десяток лет назад создание простого диалогового окна для ввода дан­ ных требовало значительных трудозатрат. Диалоговое окно рисовалось с помощью сим­ волов ANSI. Значение автоматической генерации пользовательского инте рфейса сложно переоценить. Если необходимо просматривать список в виде диалогового окна UseгFoгm, выделите список и выберите пункт Данные<>Форма (Data<>Foпn). Как пока­ зано на рис. 21.4, эта команда позволяет получить полностью функциональное диалого­ вое окно практически без дополнительных трудозатрат. 1. 11.•ле.е. " . ~нтер_нн (' ~<><рыт~ Рис. -21.4. Диалоговое окно, сгенериро­ ванное автоматически Выше показано, как можно определить диалогов·ое окно, позволяющее добавлять, удалять и фильтровать данные . (Можно отметить, что в начале 90-х годов прошлого века приходилось заниматься ламинированием ручных аппликаций графического интерфей­ са, похожего на графический интерфейс, который показан на рис. 21.4. После этого _ не­ сколько дней уходило на его реализацию.)
492 Глава 21 Изменение размера списков После создания списка может потребоваться изменение его размеров. Для этого мож­ но воспользоваться пиктограммой изменения размера в нижнем левом углу списка или указать граничные ячейки списка. Последний способ доступен через команду Данныеq СписокqИзменить размер списка (DataQ ListQ Resize List). После этого откроется диа­ логовое окно Изменение размера списка (Resize List) (рис. 21.5). В этом диалоговом ок­ не список можно преобразовать в непрерывный диапазон ячеек. ~ыбернте н~~Н.~иапа3он дан~..'2.иска: Jiщmщ•!fш шш ш J~I Пр~11-1ечание: Заголовки должны оставаться в тоН же строке 1 а.результ11рующ11!1 диапазон списка - частично. перекрываться с исходным днапаюном. ОК j1Отмен•_j Рис. 21.5. Диалоговое окно Измене­ ние размера списка Перетаскивание маркера изменения размера в нижнем углу списка Как было показано ранее, пользовател ь может изменить размер списка с помощью пе­ ретаскивания пиктограммы изменения размера. В большинстве случаев это самый про­ стой способ изменения размера ·списка. При таком изменении размера в список добавля­ ются строки И столбцы, а в каждый новый столбец добавляется заголовок автофильтра. При этом крайне редко возникает необходимость создания списка на основе нескольких листов или из несмежных ячеек. Суммы столбцов Подсчет суммы столбца является распространенной операцией. Стоит отметить, что Excel пытается самостоятельно угадать необходимую операцию и просто подсчитывает количество строк в каждом столбце. Но при создании одинакового количества строк с простыми числами Excel распознает числовые значения и подсчитает сумму простых чисел в списке . Для подсчета суммы достаточно щелкнуть на кнопке Переключить строку итогов (Toggle Total Row) на панели инструментов Список (List) (рис . 21.6). Рис. 21.6 . Панель инструментов Список (List)
Работа со списками 493 Преобразование списка в диапазон Команда меню ДанныеqСписокqПреобразовать в диапазон (DataqListqConveгt to Range) выполняет преобразование списка в диапазон. Обычно создается большой объем кода для работы с диапазонами. Вместо отказа от этого кода лучше программно преобра­ зовать список в диапазон. В таком случае усилия по созданию кода для работы с диапазо­ нами не пропадут даром. В следующем листинге показано использование списка в каче­ стве диапазона (для этого выводятся ячейки, входящие в список/диапазон). ;.PU.1:.Jf Ic~' si.iБ ·-i::ciProR"an9ёTГ''' ":"':""--,-~т- -. : ··т ••"., ·" oiлi List .·As ListObject Set List ;,, Sheetl.ListObjects(l) Diin R As Rang~ ·· Set R .• = List. DataBodyRan.ge \/ ;'' Msgв&}c · R.Cel1s.Address ,End· .sчь~··--'"'= Свойство ListObj ects объекта Worksheet возвращает коллекцию списков в пределах конкретного листа. Эта возможность может использоваться вне конкретного листа. Имя интересующего листа передается в качестве параметра . Метод List. DataBodyRange воз­ вращает ячейки, составляющие диапазон. Если интересует часть списка, представленная в виде диапазона, передайте номера строк и столбцов в качестве параметров метода DataBodyRange. С помощью этого метода можно получить ссылку на диапазон, что обес­ печивает возможность использования существующего кода, предназначенного для работы с диапазонами. Публикация списков "Мыльный пузырь .com лопнул"·, но никто не сказал об этом компаниям eBay.com и Amazon.com. Эти компании зарабатывают реальные деньги в сети Inteгnet. Хотя по­ добное удается не всем компаниям, мало компаний отрицают полезность присутствия в Web. Внутренние сайты, сайты электронной коммерции и распространенность данных добавляют сил. Интересующие списки могут храниться на сервере, работающем под управлением Miaosoft ShaгePoint . После копирования списков на сервер Excel позволяет обновлять, синхронизировать и удалять списки. Предположим , отец игрока детской хоккейной команды хочет предоставить контакт­ ную информацию другим родителям игроков команДЬr. Создание списка с информацией и его публикация на сайте ShaгePoint не займет много времени. Если кто-то сменит номер телефона, разведется или уйдет работать в другую компанию, этот человек сможет про­ смотреть список и . обновйть контактную информацию. Старая привычка записывать имена друзей на обратной стороне телефонной книги может превратиться в привычку записывать имена на цифровом носителе . * Первый инвесrпиционный бум в Intem.et захончuлся палны.лt храхом. Из rпыся•t хомпаний осrпалисъ едини- цы. - Примеч. ред.
494 Глава 21 Для публикации списка данных выделите список и выберите команду ДанныеqСписокс:> Опубликовать список (Datac:::>Listc:::>PuЫish List) из меню Excel. Запустится мастер Публикация списка на узле SharePoint (PuЫish List to Shal"ePoint) (рис. 21.7, рис. 21.8 и рис. 21.9). Внесите всю необходимую информацию, и публикация списка будет завер­ шена. (На момент написания этой книги компанией Microsoft предоставлялась ознако­ мительная версия сервера Sha1·ePoint.) В Excel предоставляются простые механизмы публикации, просмотра, синхрониза­ ции и удаления списков. Просто выберите соответствующую команду меню. Разработчи­ кам может ·захотеться выполнить эту операцию в процессе работы кода._ В следующих фрагментах кода показано, как пр~граммно публиковать, синхронизи­ ровать, просматривать и удалять списки. f.110~~..!.i~!o..~li.~:i:~.P.яl!>l~!'!..:...~!.oii...l.ofl""""""""'.J~. Where do you want to puЫish Your list? &ddress: jhttp://softconcepts.sharepointsite.com _:J f7 bink to the new SharePoint list Provide а name and description for your list. Name: jНockey Contact list Qescription: Emeroency Parent Contact listl Рис. 21. 7. ПубликацWl списков на сервере SharePoint. Выбор сервера для публикации То puЬlish to а SharePoinl:. list 1 Excel must force columns to use certain recognized data types. AJI cells with individual formUas will Ье converted to va!ues. Verify that each of the columns listed below is associated with the correct data type. If а co1umn is associated with an incorrect data type, click Cancel and confirm that the key cell can Ье converted to the correct type. Column Contact Number 1Data Tvoe Text (sinQle line) Text (single Hne) 1Kev Cel 1 Рис. 21.8 . ПубликацWl списков на сервере SharePoint. Выбор публи~rуемых полей списка 1
Работа со списками 495 ··~··.····"........"""'..., """·"' '""1'.'>;""'"х<;~_.~ xl ". --- The hst was successfuПy puЬlished and may Ье viewed on: fБ~fRTiI~~f}~OБ~~-R~~·-:~Б.~.~-~-9.~i~I.~!·~:~~--~O~lЧ~~-ii:EO.~~-~~-·.<oБ.~.~-~·~·.·.~-~~.й~·!·:·(~-~-~~i.~i·.~-~~!'J Рис. 21.9 . Публикация списков на сервере Share- Point. Адрес опубликованного списка Публикация списка Предположим, существует список с контактной информацией. Вместо ручной публи­ кации списка можно написать код , который выполнит автоматическую публикацию. iPUb"iiC",,....sUь PUbii.ShL':Cs E"CГ ·"·-- ... ",.. ~--= ·: \ ·•. . Dim · Index As Integer ' жесткое кодирование индекса в целях тестирования Index =.1 Dim List As ListObject Set ·List = GetList(Index) bim Url As String ~ ' U:tl = List. PuЬlish (Array ( j~ "http: / /softconcepts. sharepointsite. сот", /,~ "Hockey Mo.ms Unite", "GLAНA Contact List"), True) (Обратите внимание: к моменту поступления книги в печать этот сайт SharePoint будет отключен . Адрес URL сервера Shai·ePoint придется заменить на адрес действительного пор­ тала SharePoint.) Конкретный список можно получить по номеру или по индексу. В данном примере список выбирается по номеру. Этот же подход используется в следующих несколь- ких примерах . (Код подпрограммы GetList не будет указываться повторно.) - В этом примере извлекается конкретный объект ListObj ect и вызывается метод ListObject. PuЫish. В качестве параметров метода передается та же информация, что и в показанном ранее диалоговом окне. Функция Array используется для передачи в виде списка адреса URL, имени и описания. Второй аргумент указывает необходимость поддержки двунаправленной связи между сервером SharePoint и листом. Если параметр установлен в значение True, все изменения в опубликованном списке будут отражены в списке в процессе следующей синхронизации .. Внесение изменений в список Теперь, когд~ список опубликован на сервере SharePoint, можно программно сохра­ нять изменения списка на листе. Следующий код дает понять, насколько простым явля­ ется этот процесс. ti?uБilё"""si.iь~sYiichr-onlzeLlsтл -··~ ~, ,.· ' :iise'cткoe кодирование индекса в · Dim Index As :rnteger Index = 1 (• ·., Dim List As ListObject Set List = GetList(Index) целях тестирования Cali List.UpdateChanges(XLListConflict.xlListConflictDialog-) ~119. .9ЧР~- ·'· . .. . _,_ ." ""'· _ _ ~,,
496 Глава 21 На рис. 21.10 показана модифицированная версия листа, а на рис. 21.11 - модифи­ цированное содержимое списка на сайте ShaгePoint. (В этом коде используется жестко закодированный номер и повторно применяется метод GetLis.t . Номер можно переда­ вать в качестве параметра или воспользоваться другим способом динамического измене- ния номера; эти способы рассматривались в предыдущих главах.) . S elect а View г~11;;~;~ н н i Actions lil Alertm" Ш E:cpur1 to spreadsheet е Moci ify 5ett1ilQS and cclumns Done 7 ---·- ."..+-·---·-···-·---- - ·- ·-· -·- -.- -~----~---· ___J ________~ ;/\3; ·;1\]ti§ii!il~~ii!~::>..:;11~•J.~:;;·;;;т;1 1 ii:1J1~ Гото~ Рис. 21.10 . Модифицированный список Sharepoint Tea m Site Hockey Moms Unite GLAHA Contact List \..ori K:rnmel:"'" \tValiace Simpson , r;t;,; D. Н . La'l-vrence ~ нt\oi Jackson iN ayfare ; ." . 555-1212 555- 1213 555- 1214 555- 1215 Internet Рис. 21.11 . Модифицированный список на сервере SharePoint Просмотр списка на сервере SharePoint Просмотр списка на сервере ShaгePoint ничем не отличается от просмотра любой дру­ гой WеЬ-страницы, требующей авторизации. Для этого необходимо открыть интересую­ щую страницу в обозревателе и авторизоваться в соответствии с требованием сервера Sha1:ePoint. В данном примере работа сайта обеспечивается партнером компании Miaosoft и можно вручную открыть соответствующую страницу или выбрать команду Данныеq СписокqПросмотреть список на сервере (DataqListqView List on Sе1>7ег) в меню Excel.
Работа со списками 497 Каждый сервер, скорее всего, будет предоставлять множество различных услуг и мо­ жет требовать определенной платы за их использование. Обычно стоит самостоятельно разобраться с оплатой услуг сервера и правилами использования SharePoint. Удаление списка На определенном этапе содержимое списка может стать неактуальным. В таком случае список придется удалить с сервера. В данном примере список можно будет удалить после завершения хоккейного сезона. Для этого в Excel выберите команду меню Данныес::> Списокс::>Удалить список (Datac::>Listc::>Unlink List). Далее для фактического удаления списка можно воспользоваться ресурсами сайта ShaгePoint. Кроме этого, поддерживается программное удаление списков: uп1 J.nktist: ·tт "' · - - кодирование As Integer Dim.List ' As ListObject' S~t List ~ G~tList{Index~ t Call List . РuЫish (.g;I:lQ Sub'"л .•. , .. Резюме Microsoft Excel и серверы ShaгePoint предоставляют относительно простой способ публикации данных. В этой главе было показано, как создавать, фильтровать и сортиро­ вать списки. Кроме того, была рассмотрена . врожденная связь между списками и диапа­ зонами, а также показано, как использовать код обработки диапазонов для работы со спи­ сками. Во второй половине главы рассматривались публикация, синхронизация, про­ смотр и удаление списков. Все эти задачи могут выполняться как из Excel, так и из VВА.
( ./ /
Сводные таблицы Сводные таблицы являются расширением таблиц с перекрестной табуляцией, кото­ рые используются для вывода статистической информации, а также для вывода сложных данных в табличном формате. В качестве примера перекрестной табуляции можно при­ вести таблицу сотрудников организации, разбитую по полу и возрасту. Сводные таблицы являются более мощным инструментом и поддерживают вывод более двух переменных, поэтому они могут использоваться для вывода списка сотрудников в соответствии с по­ лом, возрастом и уровнем алкоголя в крови (старая шутка статистиков) . Сводные табли­ цы особенно полезны при выводе данных в формате, который не предоставляется гото­ вым отчетом. Лучше всего при разработке приложения не только предоставлять пользо­ ват~лям отчеты, но и возможность извлекать данные для просмотра и обработки в Excel. Такой подход к разработке позволит сэкономить большой объем времени в будущем. Исходные данные для сводной таблицы могут храниться на листе Excel, в текстовом файле, в базе данных Access или в любой друтой внешней базе данных. В базе данных может хранить.ел до 256 переменных (главное, чтобы польЗователь смог интерпретиро­ вать результат) . Сводные таблицы поддерживают множество типов стандартных расче­ тов, включая суммирование, подсчет количества и среднего значения. Кроме этого, сводные таблицЬ1 поддерживают подсчет частичных сумм и общих сумм. Данные могут группироваться так же, как при использовании возможности сокрытия на листе Excel. Кроме этого, поддерживается сокрытие ненужных строк и столбцов . Так­ же внутри таблицы можно определить расчеты. Сводные ·таблицы предоставляют значи­ тельную гибкость при изменении структуры данных и при добавлении или удалении пе­ ременных. В Excel 2003 поддерживается создание диаграмм, связанных с результатами в сводной таблице. При этом из диаграммы можно управлять структурой данных. Сводные таблицы проектировались таким образом, чтобы сделать ручную генерацию и управление достаточно простыми . Для создания большого количества таблиц или до­ полнительной автоматизации операций можно воспользоваться объектной моделью Ex- cel. В этой главе рассматриваются следующие объекты:
500 Глава 22 о PivotTaЬle; о PivotCache; о PivotField; о Pivotitem; о PivotChart. Сводные таблицы являются наиболее развитой возможностью Excel . С каждой новой версией Excel сводные таблицы становились проще в использовании и предоставляли дополнительные возможности. Для большинства пользователей сохранение обратной совместимости между Excel 2002 и Excel 2003 является очень важным". Разница между этими версиями рассматривается далее. Создание отчета для сводной таблицы Сводная таблица принимает данные из листа или из внешнего источника, например, из базы данных Access. Данные из Excel должны быть структурированы в виде списка, как показано в начале главы 23 (хотя существует возможность использования данных из дру­ гой сводной таблицы или из нескольких консолидированных диапазонов) . Столбцы спи­ ска являются полями, а строки - записями. В в е рхней строке опр еделяются имена пол ей . Рассмотрим список, содержащий входные данные (рис. 22.1). Рис. 22. 1 . Список с входными данными для сводной таблицы Список содержит данные с августа 1999 года по декабрь 2001 года. Как обычно, в Excel желательно идентифицировать данные по имени, что намного упрощает обращение к ним из кода. В данном случае список называется Database. Excel автоматически обратится к этому имени при создании сводной таблицы. Предположим, что необходимо подсчитать сумму поля Количество на протяжении всего времен~ого периода по полям' Клиент и Продукт. Разместив указа-rель в пределах списка дан­ ньrх, выберите команду Данныеq Сводная таблица и отчет сводной диаграммы (Dataq
Сводные таблицы 501 Pivot ТаЫе and PivotChart -Repшt). На третьем шаге мастера щелкните на кнопке Макет (Layout). Перета:щите кнопку Клиент в область Строка (Row), кнопку Продукт (Pi-oduct) в об­ ласть Столбец (Column) , а кнопку Количество в область Данные (Data) (рис. 22.2). nеретащ11те кнопкн поЛей е нужнь1е ,области днаграммы. Fт~1аннца[ ПродуКтJ Стоабец Клиент е f ~ \;Хмма по полю Kolj. С!РОКа Дgнные '-правка J [ ОК ... j1Отмена Рис. 22.2 . Описание структуры сводной таблицы Если выбрать размещение сводной таблицы на новом листе, то будет создан отчет сводной таблицы (рис. 22.3). ЕJдот• i ~Клиент Е)Штат Еf Продукт EJ Коnи~ество '--- Еj Цена ~···· Ej Доход Рис. 22.3. Отчет сводной таблицы
502 Глава 22 Если при создании сводной таблицы в Excel 2003 включить механизм записи макро· сов, полученный код будет похож на показанный ниже фрагмент: r.д'ci:'{vework::Ьo ok~Pivotcac h.es: . A.d.Ci .·~' --•·~·.," · ( SourceType: =xlba tabase " SourceData: =" Database") . Creat'ePivotTaЬle TaЬleDe'stina-tioц: =" , ", ТаЫеNаmе:="СводнаяТаблицаl", , Defaul t y ersion: =xl.PivotTaЬleVe:;:sionl О ~ctiveSheet.PivotTaЬleWizard _ TaЬleDestination: =ActiveSheet. Cells ( З, _1) ;дci:iveSheet.Cells . (3, 1) .Select , ActiveSheet. PivotTaЪ1es ( "Сводная'Габлищi l") .AddFields . _, . ~ RowFields:="КЛиeнт", ColumnFields:="Пpoдyкт". - !Activesheet. PivotTaЬles ( "СводнаяТаблицаl ;, ) , 7 · PivotFields- ("Koличecтвo" )' . _ · - . Q:i,:::i~n..tat:A oJ:l ~=.: x. _lpat;aF,:ielc;I _ .. . .. ::~·..~:.- ..:.:, Для создания объекта PivotCache используется метод Add коллекции PivotCaches . Коллекция PivotCaches рассматривается далее. Для создания пустой сводной таблицы применяется метод CreatePivotTaЬle объекта PivotCache. Таблица размещается но· вом листе начиная с ячейки Al. Созданная таблица называется СводнаяТаблицаl . Кро· ме этого, в данном случае используется новый параметр, доступный только в Excel 2002 и Excel 2003. Это параметр DefaultVersion, определяющий принятую по умолчанию версию сводной таблицы . В предыдущих версиях Excel этот параметр приводил к ошибке компиляции. В следующей строке кода для перемещения сводной таблицы в ячейку А3 использует· ся метод листа PivotTaЬleWizard. В результате над таблицей появляется место для полей страницы, которые будут рассмотрены далее. Мастер работает со сводной табли· цей:, в пределах которой находится активная ячейка, поэтому перед использованием это· го метода код не должен активизировать ячейки за пределами новой составной таблицы. Показанный выше код не сталкивается с этой проблемой , так как по умолчанию _после за· вершения работы метода CreatePivotTaЬle активной является верхняя левая ячейка диапазона, содержащего сводную таблицу. Метод AddFields объявляет пол е Клиент как поле строки, а поле Продукт как поле столбца. Наконец, поле Количество объявляется как поле данных. Это значит, что поле отображается в теле таблицы и по умолчанию используется для подсчета суммы. Коллекция PivotCaches . О бъ ек т PivotCache является буф~ром и обеспечивает хранение и доступ к данным из источника данных. Этот объект выступает в роли канала связи между источником данных и объектом PivotTaЬle. Хотя в Exce_l 97 объекты Р i votCache генерировались автоматически, явное создание объектов не поддерживалось и возможность управления ими, как в следующих версиях, не предоставлялась. В Excel 2003 объекты PivotCache создаются с помощью метода Add коллекции Piv- otCaches (это видно из записанного кода) . При этом предоставляется полный контроль над данными, которые извлекаются из источника при генерации объекта PivotCache. Вместе с интерфейсом ADO (ActiveX Data Objects) можно достичь значительной степени
Сводные таблицы 503 контроля над внешними источниками данных (эта тема рассматривается ближе к концу главы). В главе 11 была продемонстрирована гибкость интерфейса ADO, а методики из этой главы позволяют создавать источники данных для сводных диаграмм. Объекты PivotCache можно использовать для генерации нескольких сводных таб­ лиц из одного источника данных. Это более эффективный подход, чем поддержка от­ дельного источника данных для каждой сводной таблицы . При создании объекта PivotCache можно указывать любое количество сводных таб­ лиц. Для этого используется мeтoдCreatePivotTaЬle объекта PivotCache. Коллекция PivotTaЫes В Excel 2003 предоставляется другой метод создания сводной таблицы на основе объ­ екта PivotCache. Это метод Add коллекции PivotTaЬles. ~su:ь Асtата:ь:Се (У Dim РС As PivotCache · · Dim РТ A.s PivotTaЬle t ~ Set РС Set РТ ' ActiveWorkbook. PivotCach.es . Add (SourceType: =xlDataba,se, SourceData: =."Da·tabase") , ,·· ActiveSheet.PivotTaЬles .Add(PivotCache~=PC, TaЬleDestination:="") ~Eri.d., Si,ib . ""' Данный метод не обладает дополнительными преимуществами по сравнению с мето­ дом CreatePivotTaЬle . Просто еще одна возможность Excel. Коллекция PivotFields Столбцьr из источника данных называются полями. При загрузке полей в сводную таб­ лицу они превращаются в объекты PivotField, принадлежащие коллекции PivotFields объекта PivotTaЬle . В коллекции PivotFields хранятся все поля из источника данных, а также добавленные вычислимые поля (не только те поля, которые доступны в отчете сводной таблицы). Вычислимые поля рассматриваются далее в этой главе. Для добавления объектов PivotFields в отч ет можно воспользоваться двумя мето­ диками. Можно применить метод AddFields объекта PivotTaЬle или присвоить зна­ чение свойству Orientation объекта PivotField: fSUb'"AddFiёldrзт·oтaы·e · () - ~ ,,.,..."-" ,. · With ·ActiveSheet.PivotTaЬles(l.) . AddFields RowFields:="State", AddToTaЬle:=True . PivotFields("Date") .Orientation = xlPageField End With При запуске этого кода вместе с примером сводной таблицы бур.ет получен следую­ щий результат (рис. 22.4).
504 Глава 22 22! 23! с Итог 24 :Смит Итог 25 !Об ий итог " • • >i\-11~f!~ L%fiП!iis!l:L~i;J:Т .Готово Рис. 22.4 . Добавление полей в сводную таблицу Метод AddFields может добавлять несколько строк, столбцов и полей страниц. Если не установить параметр AddToTaЬle в значение True (как показано в предыдущем при­ мере), добавляемые поля будут замещать существующие поля. Но мeтoдAddFields не поддерживает добавление или замещение полей данных. Следующий код переопределяет структуру полей существующей таблицы (не затрагивая поля данных). ;silЬ: "R.e'd.e:f'inePivot.тaь1 e ( J " - Dim ·PT . As PivotTaЬle Set; '· pт = ActiveSheet.PivotTaЬles(l) -' 4 PT : ACidFields RowFields:=Array( " Product", "Customer ~ ), Cc:>lumnFields : =" State" , J?ageFields: = "Date " .. Обратите внимание, что функцию массива можно использовать для добавления не­ скольких полей одновременно (рис. 22.5).
Сводные таблицы 505 ".1.~_! >!блоки Итог 20Юб ийитог 1784 ! " 1779! 8791 1144! 17~-~i.... • ·· · •i "),листs [ПИё.Тб"ХfiИё'l:2··тпис:тэ7 · "...'J"<2:~~~;1 Готово Рис. 22.5 . Добавление полей в сводную таблицу Свойства Orientation и Position объекта· PivotField позволяют реорганизо ­ вать структуру таблицы. Положение определяет порядок полей в пределах определенной части таблицы, начиная с поля слева. Если добавить следующий код в конец подпро­ граммы RedefinePivotTaЬle, поле Клиент будет находиться слева от поля Продукт, как показано выше. I~~{rI}FJ:)If:(~J,§~~(::;:~~~~tofu~:r:·;~Г."~.o~TПon." Свойство Function объекта PivotField можно использовать для изменения меха­ низма, с помощью которого поле данных учитывается в общей сумме. Свойство Num - berFormat позволяет изменить представление чисел. Если вставить следующий код в конец подпрограммы RedefinePivotTaЬle, в область данных будет добавлено поле Доход. По умолчанию оно будет добавлено после поля Количество. В следующих строках кода поле Количество перемещается на вторую позицию и меняется с "Сумма по полю Количество" на "Количество по полю Количество". В результате поле содержит количе­ ство транзакций по продаже. !s\l"fГAddDataF:i,~1<1'() " '" . '" "., """' ~ '"i. Dirn · РТ As PivotTaЬle ~--- .. ; ~" s ·et РТ = ActiveSheet, PivotTaЬles (1) ' Дос;Jавить и отформатироватъ новое поле Data v With РТ. PivotFields ("Доход") .Orientation = x1DataField .. NuroberForrnat "0" With ' Отредактироватъ существующее поле Data With " PT.DataFields("Cyммa по полю Количество") .Position = 2 ,, ,.".м.·.,,.,... "·" _ , fμi:ic t~():I}, :':" .?<:l."C.C?. .'ll"n !: "
506 Глава 22 Обратите внимание, что на поле необходимо ссылаться по тому же имени, что ис­ пользуется в таблице "Сумма по полю Количество". После этого код должен будет со­ слаться на поле по имени "Количество по полю Количество". С другой стороны, на поле данных можно ссылаться по номеру или присвоить ему другое интересующее имя. Результат модификации кода показан на рис. 22.6 . Коллекция CalculatedFields Новые поля в сводной таблице могут быть результатом расчетов с использованием существующИ:х полей. Например, можно рассчитать взвешенное среднее значение цены для каждого продукта, создать новое поле СредняяЦена и определить его значение как отношение дохода к количеству, как показано ниже: 1su:ь ~ ca:JC:U.1afeA:v'eragei:>'riceTГ ' Dim РТ As P:ivotTё!Ыe ~" " ' Добавить новый лист и сводную таблицу Worksheets.Add Set РТ= ActiveWorkbook,PivotCaches(l) .C~eatePivotTaЬle( TaЬleDestinai:.ion: =ActiveCel,l, Ta.ЬleName: = "СредняяЦена") With РТ ' Удалить существующее поле СредняяЦена On Error Resume Next .PivotFields("CpeдняяЦeнa") .Delete On Error GoTo О ' Создать новое поле СредняяЦена .. Calcula tedFields. Add Name: = "СредняяЦена" / Fоrmulа:="=Доход/Количество" ' Добавить поля Строка и Столбец . AddFields - RowFields:="Kлиeнт . ;,, ColumnFields:="Пpoдyкт" ' д6бавить поле СредняяЦена типа Data With . PivotFields ( "СредняяЦена") . Orientation :=.xlDa taF.ield . NumЬerForma. t = "О.ОО" End With ' Удалить итоговые суммы . ColumnGrand = False .RowGrand = False . End With End Sub
Смит .~.УМ~.~..~..Q.9..~..д9.?:9А. ... . . . . .. . .. . . . . .. . .. . .. . Ко,.,,честео по полю Количество ..~~. .!Манrо Ки <;У.~.~-~..r:!О.!:!О.~.дО~.9.А ... . . ."............... ...... 26 Количестео rю полю Количество 27 Првдеw ~.У.~~~..!':10Л.9.'}!О..АО.~9А..........................". . ·28 Количестео no полю Количестео · 29--i Робертс -~-~~~--~.n.9.~.A9.?.:9A...... ". . .. . .. . . .. ". . н~• Гото~о Ко.n11чесно по полю Количество Смит ~У.~.~~-~.Л9.~.д0~.9.А.................... ..... Количеспо по полю Количество ~.Y..~~-~..Q9..l).Of .UO А9.~9А...... ........ .............. . Количестео по полю Количество Предеш ~Y~~~Jt}J0.!'9!:119..AQ.~PA~-·~·-··--··~·-··" Количеспо по полю Количество Рис. 22.6 . Добаsление нового поля Сводные таблицы 507 Подпрограмма CalculateAveragePrice добавляет новый лист и использует метод CreatePivotTaЬle созданного ранее объекта PivotCache для создания новой свод­ ной таблицы на новом листе . Для обеспечения повторного запуска код удаляет суще­ ствующий объект P i votField, который называется СредняяЦена. Операторы On Error обеспечивают работоспособность кода даже в случае отсутствия поляСредняяЦена. Для доступа ·к коллекции CalculatedFields используется метод Calculated- Fields объекта PivotTaЬle . Метод Add коллекции CalculatedFields позволяет до­ бавить новое поле . . Обратите внимание, что несмотря_ на кажущееся введение поля в сводную таблицу, на самом деле поле добавляется в PivotCache. Добавленн о е поле доступно и в первой сводной таблице. Удаление новой сводной таблицы не приведет к удалению поля СредняяЦена из объекта PivotCache. После добавления нового поля его можно обрабатывать , как и любое другое поле из колле:~щии PivotFields . В послед­ ней строке кода удаляются поля суммы, создаваемые по умолчанию . Результат показан ниже (рис . 22 .7) . Так как цены в источнике данных не меняются , не вызывает удивления отсутствие изменений средневзвешенных цен для каждого про­ дукта в сводной таблице .
508 Глава 22 ··· ·· -· ·· ··· ' ·· ·· · ············ ·· · ·· ·· ·-········· ·•·· ·· ··········· ···· •• ··-·· ···· ···· · · ·· · · -· ·· ·-·- ·· ·• ··;···~~j~~~1 .5Jl1.~~~1~2J=:t·~·-···· ,~!]~ Рис. 22. 7. Добавление нового поля в сводную таблицу Будьте внимательны при создании коллекции Calculat~dFields. Необходимо · по~-" нить, .что вычисленИ11· выполняются после суммирования данных . из источника. В,данном ' примере подсчИтываются значения полей Доход и Количество, . после чего одна сумма дел11тся на другую; . Такое решение хорошо подХодит для, расчета средневзвешенной це- · ны и/или для . прос.того сложения или вычитания. Но при другой схеме расчетов этот лод.; ход может не .,подойти. Например, предположим, что в исходных данных отсутствует поле Доход. Это поле можно определить, как вычислимое поле (CalculatedField), равное произведению поля Цена на Количество. Такое определение не даст правильного результата. Значение поля Доход нельзя получить в результате произведения суммы значений Цена на сумму значений Количество (кроме специального случая, когда только одна запись из источни­ ка данных представлена в каждой ячейке сводной таблицы ). Коллекция Pivotltems С каждым объек~:ом PivotField связана коллекция Pivotitems . Для доступа к кол­ лекции Pivotitems можно воспользоваться методом Pivotitems объекта PivotField. Тот факт, что это не свойство, а метод, вызывает некоторое удивление. Это отличает ме­ тод Pivotitems от свойств Hiddenitems и VisiЬleitems объ екта PivotFi e ld, ко­ торые возвращают подмножества коллекции Pivotitems. В коллекции Pivotitems содержатся уникальные значения поля. Например, поле Продукт в исходных данных может содержать четыре уникальных значения - "Яблоки", "Манго", "Апельсины" и "Груши". Эти значения составляют коллекцию Pivotitems для этого поля. Группирование Excel поддерживает любой способ группирования элементов поля. Например, эле­ менты NSW, QLD и VIC могут быть сгруппированы в ВосточныеШтаты . Эта возмож­ ность требуется, когда в поле хранится большое количество элементов . Кроме этого, поддерживается группирование дат с использованием предопределенной структуры группы, включая год, квартал и месяц.
Сводные таблицы 509 При переносе поля Дата из источника данных в сводную таблицу в виде поля строки в таблице окажется около 400 строк, так как в источнике хранится множество уникаль­ ных дат (рис. 22.8) . .". ЕJдата =··· ЕJКnиен т ЕJШ тат ЕJЛродукт EJ Количестео [jЦена ~Доход EJ CpeднRRLJ.eнa Рис. 22.8 . Группирование значений даты 1014 ···· iio · 355 • """569 ................... : iiii:i · 624 ········· ···· ,.~ ··· 2"5 ." " ..""""" ."", .,"".....""" ."" ."" . . :jjj Элементы Дата можно сгруппировать в более осмысленные итоговые характеристи­ ки. Это можно сделать вручную, выбрав ячейку в сводной таблице, щелкнув правой кнопкой мыши на ячейке и выбрав команду Группа и структураqГруппировать (Gгoup and Show DetailqGгoup) . Откроется диалоговое окно (рис. 22.9), в котором можно вы­ брать пункт Месяц (Month) и Год (Уеа.г) . Авто "~., 0!:!1'Чннаяс: 0[~;] с w.агон: 1 2s:oв:i999 · ш 1 г2в:ь9:i999 J r;:lc-Щ~:;;------· Мннуты Часы ни Отмена J Рис. 22. 9 . Ручное группирование дат П_осле щелчка на кнопке ОК таблица будет выглядеть следующим образом (рис . 22 .1 О).
510 Глава 22 Рис. 22.10 . Группирование записей по дате Следующий код позволяет выполнить такую же операцию группирования: rsиь-drou"Poatesт;· -щ~~~ i: Dim РТ As P i votтaЫe • Dim Rng As Ran.ge ' Создать новую сводную таблицу в ячейке Al активного листа Set РТ= Activesheet.PivotTaЬleWizard(SourceType:=xlDatabase, ,sourceData:=ThisWorkbook.Names("Database") .RefersToRange , TaЬleDestination: =Range("Al " )) With РТ ' ' Добавить данные . AddFields RowFields:'="Дaтa", ColumnFields: = "Штaт" . Pi~otFields("Koличecтвo") .Urientation = xlDataField ' Найти метку Дата Set ,Rng = . PivotFields ("Дата") . LabelRange Сгруппировать все даты по месяцам и годам ' Rng.Group Start: =True, End:=True, _ Periods:=Array(False, False, False, False, True, False, True) ' End With !'!ld , § .1lf>_ . ~····'·'" При этом группируются объекты Range, расположенные под меткой поля или меткой элементов поля. Можно выбрать как метку с именем поля, так и метку с именем элемента. Главное - выбрать единственную ячейку. Если выбрать несколько имен элем'ентов, в группу будут добавлены только эти элементы. Подпрограмма GroupDates создает объектную переменную Rng, которая ссылается на ячейку с меткой поля Дата . Эта ячейка передается методу Group вместе с параметра­ ми, относящимися к датам. Параметры Start и End определяют началыrую ,И конечную даты. Если эти параметры установлены в значение True, в группу включаются все даты. Массив в параметре Periods соответствует пользовательскому вводу в диалоговом окне Группирование (Grouping). Этот массив описывает выбор месяца и года. Следующий код позволяет разгруппировать даты: 'stiь unarou:Pr;iaf.es (J' Di.m Rng As Range ,,~" ,§ e ,Jr .. NoЯ.. ;; , l;.ct,iV§' ~'\1.i!~LJ;'i.,29_1'1.~R+.§.s,.ll.
Сводные таблицы 511 r~TvotFl~1d.5T;;дa тa:;;T':'L'aьёII<aЩJe ·-~. • ~~~·,~]~~§~~~:~·.. Ь-,~~-и=~ш-~~"~i:.~-·=~""·~~. --- " ···· ~.•,·~. Повторная группировка выполняется с помощью следующего кода: ' ' .~~~....,,,.~_,_";,,,,.... .,..;.~-..- Свойство Visible Для сокрытия элемента можно установить его свойство VisiЫe в значение False. Предположим, что приходится работать со сгруппированными датами из предыдущего примера и необходим только январь 2000 года и январь 2001 года (рис. 22. J1). ~J..~ Sum ofNumberSold. · State l,~. 1 4 Years HDa1e [•. NТ <TAS ;YIC Grond Totзl · 5 :<ООО IJan 597 • 432! 1024 2053 ·1г :<001 IJan п 1230! 89 1392 7 Grand Total 670 1662! 11 13 3445 Рис. 22.11 . Сокрытие некоторъtх элементов поля Для этого можно воспользоваться следующим кодом: r,sць· :-е:0т:Раrем0пткs тт ··- "'"':.'~ ·-·-·-·=-~-·- - , Dim рт · As PivotтaЫe J?im oPI 'дs p.ivotit~m · Dirn . sMonth As s .t:i:1ng 11 Янв 1' 'дctiveSheet. PivotTaЬles (1) 'po'i - ·"Each PI In РТ . PivotFields ( "Г-оды" ) . Pi:votI tems. ··" ·. I·f PI.Name <> "2000" And PI.N .ame <>. "2001" Then ' х Pi .VisiЫe =· False End r:f • PT.PivotFiel.ds ("Дата"). Piyotitems (sMonth). Visib1e ,xor, Each ~т· In РТ. PivotFie;I.ds ("дата") . Pi votrtems '" ····· I .f • PT.Name <> sMonth Then PI. VisiЫe False Next :I:ч · Подпрограмма CompareMonths циклически перебирает все элементы в полях Годы и Дата, устанавливая свойство VisiЫe в значение False, если текущий элемент дол­ жен быть сокрыт. Этот код может использоваться повторно. Для сравнения других меся­ цев можно присваивать новые значения переменной sMonth. Обратите внимание , что интересующий месяц должен быть видимым до начала обработки элементов поля Дата. Это необходимо для обеспечения видимости интересующего месяца и защиты от одно­ временного сокрытия всех элементов . Если ни один из элементов не будет видимым, возникнет ошибка времени выполнения.
512 Глава 22 Коллекция Calculatedltems Для добавления вычислимых элементов в поле воспользуйтесь методом Add коллек­ ции Cal cul atedi tems . Предположим, что необходимо добавить новый продукт - "Дыня". Предполагается, что дынь будет продаваться на 50% больше, чем манго . Для включения этой информации в таблицу можно воспользоваться следующим кодом: rsu.:ь -дctд.ёaicu.ra:tedit.emTГ ·- ,· -; ~·· Wi th Activ;eSheet. PivotTaЫ~s (1 )· . PivotFields ( "Pr oduct ") . Calculateditems'. Add Nаmе:= " Дыня", Formu l a: = " =Maнгo*l . 5" End With Результат работы этого кода показан на рис. 22 . 12 . Е [SA Рис. 22.12 . Добавление в поле вычислимого элемента G н TAS [YIC 2з: ззгr·· " - ~х Для удаления объекта Calculateditem его нужно удалить из коллекции Calculat- editems или из коллекции Pivotitems объекта PivotField: [SuЬ "'rieletёcalculated'(tern( Г~ "·~·-·,- , With ActiveSheet:PivotT<;iЫes (l) .Pi votF:j.elds(Шpoдyкт " ) .Pivotiteins("Дыня") .Delete End With . Сводные диаграммы Сводные диаграммы впервые появились в Excel 2000. Они следуют всем правилам , определенным для объектов Chart, но связываются с объектами PivotTaЬle . При из­ менении структуры сводной диаграммы Excel автоматически меняет структуру связанной сводной таблицы. Соответственно, при изменении структуры сводной таблицы автома­ тически меняется структура связанной сводной диаграммы .
Сводные таблицы 513 Следующий код создает новую сводную таблицу на основе того же объекта PivotChart, который использовался для создания сводной таблицы на листе Sheetl. После этого на основе сводной таблицы создается сводная диаграмма (объект Рi votChart). su}) createP{votёhart{) Dim' .Ре As· Pivotcache Dim РТ As Pivotтaыe Dim Cht As Chart · ' · добавить новый лист Worksheets.Add Before:=Worksheets(l) ' Создать сводную таблицу на основе существующего ' объекта P.i votCache Set . РТ =, Р,С. CreatePivotTaЬle (TaЬleDestiJ:].at.ion: =ActiveCell),. · ' ·· Добавить лист диаграммы на осно~е акту~вной сводной Set Cht' = Charts.Add(Before:=Worksheets(l)) ' Отформатировать сводную диаграмму With Cht.PivotLayout.PivotTaЬle .PivotFields( " Клиeнт ") .Orientation = xlRowField . PivotFields ("Штат") . orientation .= xlColumnField .PivotFields("Koличecтвo") .Orientation= xlDataField '.AddDataField . PivotFields ("Количество"), "Sum of NumЬerSold" ;- _ xlSum ·End With ,End Suf>~ . . В результате этого кода получена диаграмма, показанная на рис. 22.13. Перевщите сюда поля стргниц 500:) !сумма Г1О ГIOJ'IO Комчестаоl 2000 1500 1000 500 Км Рtlбертс с...т Рис. 22.13. Сводная диаграмма
514 Глава 22 После создания сводной таблицы на новом листе код добавляет новую диаграмму. Для этого используется метод Add коллекции Charts. Важно, чтобы в момент вызова метода Add активная ячейка находилась в пределах сводной таблицы. При этом новая диаграмма автоматически будет связана со сводной таблицей . После создания сводной диаграммы ее можно связать со сводной таблицей с помо­ щью объекта PivotLayout (этот объект связан с диаграммой). После этого достаточно настроить необходимые поля сводной таблицы , воспользовавшись уже известными приемами . Последняя строка перед оператором End Wi th закомментирована. Это альтернатив­ ный способ добавления поля данных . Эту строку можно использовать вместе ·предыдущей, но метод AddDataField объекта PivotTaЬle доступен только в Excel 2002 и Excel 2003. Последующие манипуляции данными на диаграмме ДОЛЖНЫ выполняться только че­ рез соответствующую сводную таблицу. Для форматирования изменений на диаграмме можно воспользоваться свойствами и методами объектаСhаrt. Внешние источники данных Excel поддерживает хранение ограниченного объема данных. Кроме этого, Excel пло­ хо справляется с хранением нескольких связанных таблиц с Данными. Таким образом, приходится хранить данные во внешней базе данных и извлекать их по мере необходи­ мости. Самым мощным решением является использование интерфейса ADO (ActiveX Data ()bjects). Более подробно интерфейс ADO рассматривался в главе 11. В следующем примере показано, как подключаться к базе данных Access в файле SalesDB. mdb, в которой хранятся данные, используемые ранее , но также могут хра­ ниться намного более полные и сложные данные. Для запуска кода необходимо создать · ссылку на библиотеку ADO. Для этого переключитесь в окно редактора VВЕ и выберите пункт Toolsc::>References (Сервисс::>Ссылки). В открывшемся списке выберите "Micгosoft ActiveX Data Objects" и установите флажок напротив названия библиотеки. Если в списке присутствует несколько версий библиотеки, выберите библиотеку самой пос,ледней вер ­ сии. Этот код запускается только в Excel 2000, Excel 2002 и Excel 2003, так как он создает объект PivotCache. Код создает новый лист и добавляет сводную таблицу, похожую на созданные ранее. Но в данном случае в качестве источника данных исriользуется база данных Access : ;si.iь ~Pl votтableDataviaADO () Dim Con As' New ADODв :: Corinec.tion Dim RS As New ADODB.Re.cordset sql As . String · РС f...·s PivotCache РТ As .Pivo.tTaЬle Con.Open "Provider=Mictosoft.Jet.OLEDB.4 .0;" & ·· "Data °. Source=C: \Му Document.s\SalesDB.mdЬ; • "Sel ~.С t * rо\nдЕ; ~}сщ;ра ~s" ·~·"· . ··
Сводные таблицы 515 · · · ; )iт!:':!?Ыт'ь ·список·· Заriйсей · · . Set RS , = йеw ·ADODB.Recordset : :.F>ei:. 'нs :A-~t. ive.cщшection .' = con . RS.Open ·sql: " _'t,, ;~' ~~ • ~!,~ '" ~ ·: Создать кэш сводной таблицы · . .. . , , • Set PG 7 Ас tiveWorkbook. PivotCaches ;'Add ( SourceType: 7X1External) ./ set РС. Recordset = .RS · · · · • , ·--~- . ;- w РТ• . Nulist;:-ing · "О" . sm allGrid ~ F.a·1·se . AddFields RowFields: ;;;"Штат -~·, columnFields:="Пpoдyк'I'" / . PivotFields ( "Коnичество") . Orientation = xlDa'taFiE!id . '·'End Wi th .. . . . . ~:('/· ~End -_ sub-· ::,:.~> -_ ··., т'~ --- -·.••·-· ..•• '"..•·-..-· .• _J __ ...,._: _ ··-·~~-- .: •.•. '·~- _....._..,,._,[<...,._...-,,-__,...,м;• .~.• -~ ~-.-z""""""~'~ .<..... ~ ...::~. _ ..~ .- '""·---~-·--- Сначала создается объект Connection, устанавливающий подключение к базе дан­ ных Access. Для подключения используется метод Open объекта ADO Connection. По­ сле этого определяется оператор на яз1;>1ке SQL, в котором запрашиваются все записи из таблицы SalesData в базе данных Access. Таблица практически идентична той, которая используется в Excel (в таблице содержатся те же поля и данные). Дополнительная ин­ формация о языке SQL и терминологии ADO приводится в главе 11. После этого ссылка на объект Recordset присваивается объектной переменной RS. Свойству ActiveConnection объекта RS присваивается ссылка на объект Connection. Далее метод Open заполняет набор записей данными из таблицы SalesData в соответ­ ствии с инструкциями в операторе SQL. После этого открывается объект PivotCache и объявляется внешний источник дан­ ных. Для этого параметр SourceType устанавливается в значение xlExternal, а свой­ ству Recordset присваивается значение объектной переменной RS. В оставшейся части кода с помощью уже известных средств создается сводная таблица на основе объекта PivotCache. Более подробно создание наборов записей рассматривается в главе 11. Информация из главы 11 и из этой главы позволяет связывать наборы данных с объектом PivotCache. Та­ кая комбинация дает возможность работать с широким диапазоном. источников данных. Резюме Сводные таблицы позволяют выводить сложные данные. В этой главе рассматрива­ лись различные способы программного создания сводных таблиц на .основе различных источников данных, например на основе списков Excel. При этом указывались особенно­ сти кода, позволяющие сохранять совместимость между различными версиями Excel. Также для создания сводных таблиц использовались мастер из Ехсе! 97 и объекты PivotCache в более новых версиях Excel. В сводную таблицу можно добавлять поля в виде строки, столбца или поля данных. Поля могут содержать результат расчетов на основе других полей или элементов других полей. Элементы можно группировать. На-
516 Глава 22 пример, возможность группирования может использоваться для комбинирования дат по годам и месяцам. Кроме этого, элементы полеwможно скрывать. Со сводной таблицей можно связать сводную диаграмму : После создания такой связи изменения в одном компоненте будут отражаться на содержимом другого компонента. Для связи сводной ·таблицы и сводной диаграммы используется объект PivotLayout. Интерфейс ADO позволяет связывать сводные таблицы с внешними источниками данных.
Списки с фильтрами В этой главе рассматривается создание кода VВА для управления данными и фильтра­ ции информации в списках. Также описываются средства Данныес:>Форма (Datac:> Form), Автофильтр (AutoFilter) и Расширенный фильтр (Advanced Filter). Не останутся без внимания и вопросы создания списков с фильтрацией, генерации служебного кода с помощью механизма записи макросов, а также использования элементов управления д.J!Я вывода содержимого списков. Кроме того, демонстрируется, как обойти возможные проблемы, связанные с интернационализацией приложений. Структурирование данных Перед использованием инструментов управления списками Excel данные должны быть настроены особым образом, а именно: структурированы в виде таблицы из базы данных. В верхней части каждого столбца должен находиться заголовок с именем поля, а данные дол'жны быть записаны в строках, соответствующих записям в базе данных. На рис. 23.1 показан список с инф<?рмацией о продажах фруктов. Не 6тО'ит, рассматрив~ть E~cel в качестве полноценного приложения:~для -р~б~ты с;'баЗа~lИ данных. Excel поддерживает наборы данных ограниченного объема и не в состоянии обра-'. батывать несколько в:Заимосвязанных таблиц. Но Excel может ра~ст,ать , с дРугимИ : f'Jрил9..:', жениями баз данных и предоставлять необходимые данные с помощью таких мощных_ fЩ.,. стру~ентов, как Данные~Форма (Data~Form), , Автофильтр (AutoFilter), РасшИренный фильтQ (Advanced Filter), Промежуточные.Итоги (SuЬТotal) и СеiодНая таблица ·(РivоtТаЬlе). ;_ Этн- инс"r'рументы позволяют анализировать, модифицировать и ' вь~водиiь данные ei .удобно~ · форме. При~еры использования этих !"1нструментов приводились в главе 22. ' .,.
518 Глава 23 Рис. 23.1. Список с данньu1и Команда Форма Excel предоставляет встроенное диалоговое окно, которое может использоваться для просмотра, поиска и редактирования данных в .списках. При выделении единственной ячейки списка или же всего списка можно выбрать команду менЮ Данные<=:>Форма (Datat::>Form) и откроется следующее диалоговое окно (рис. 23 .2). 1 И315 Д~аенть ~М11ТЬ tf.a3aд ~anee 1 ~1Терии 2акрыть Рис. 23.2 . ДШ1Логовое окно для просмпт­ ра, поиска и редактирования данных Механизм записи макросов позволяет получить следующий код: rsиь мa.C:roi (}"~,~·,;@" ~/ ' k Macrol r ' , Макрос записан 11/16/.2003 Полом ~'1
Списки с фильтрами 519 -·"-~~;~·:'~ )i'&hge··c;1 В7 ·;;_._)"лl s·еfё:СЕ'"'~!Т'·,-., !' ,,: ' A;,ctiveSrreet. Show'DataForm ::s:~_g,·2..110, <;". :~·~" "' " · Если список начинается в диапазоне А5:Вб и в процессе записи макроса выделяется первая ячейка и открывается диалоговое окно Данныес:::>Форма (Datac:::>Fшm), записан­ ный макрос будет работать. Если список начинается за пределами диапазона А5:Вб и в процессе записи макроса выделяется верхняя левая ячейка и выводится диалоговое окно Данныес:::>Форма (Datac:::>Fo1·m), при запуске записанного макроса будет выдаваtься сообщение об ошибке._ Для решения этой проблемы интересующему списку можно при­ своить имя Database. Ecti11 приложение должно работать не . только ~ р;ги;,нальны~ сТандар:rах ~."Диало~. rовое окно Данныес:::>Форма (Datac:::>Forni) выводится 'с помощью метода ShowDataF9rm, .; 'то ВОЗЛ110Жность Данныес:::>Форма (Datac:::>Form) может б~1ть связана с 'рядом опасно~т~й> ' (lp~, вьlзове диалОгового. окна Даннь1ес:;>Форма.{Qаtа~Fоrrп) из VBA даты и ч11сn°а выво1 · ;,дятся .тоnько в соответствии с региональным'.11 ··ст~ндарт.ами .США: С другой стороны, .< ' -1 ., .· . . ', '· . ' введеtiНЫе · поnьзоватеnем числа и даты интерпр_ет,11руютс_я в со.ответств1111 с текуЩ11ми :регИонаnьными паJJамfi!трами Windows. Таким образом? при· !!Воде датьi в соответств.1111 -' · ~ ре[ион~льными стандартами ' Веn~кобрнтании (дд/~~/гггг) в Ji.Н<Jлоrовом окне Данные<=:> Форма. (Data.~Form) да:га ·будет повреждена, Дополнительная -информац11я 'пр11вод11тся"в . главе ; 17. · .: · Автофильтр Возможность Автофильтр (AutoFilter) обеспечивает простой способ выбора данных из списка. Для активизации автофильтра выберите пункт Данныес:::>Фильтрс:::>Автофильтр (Datac:::> Filterc:::>AutoFilter). Возле имени каждого поля появится раскрывающийся список. Если необходимо найти соответствие для конкретного поля, например Клиент, щелкните на раскрывающемся списке и выберите необходимое значение (рис. 23.3). Рис. 23.3. Использование возмоЖ1WстиАвтофильтр
520 Глава 23 Пользовательский Автофильтр Если необходимо получить более сложный филь~р, например диапазон дат, придется немного поработать. На экране (рис. 23.3) показано, как вручную фильтровать данные для отображения определенного месяца. Щелкните на раскрывающемся списке возле по­ ля Дата и выберите Условие (Custom). Заполните поля в открывшемся диалоговом окне (рис. 23.4). форм.i~т дат, прим~н~емыИ в диалоговом окне Пользовательский автофильтр (Custom · ~_uto.~ilter); завис~!;. от ре~ионаnьнь1х параметров. При работе с региональными парамет~ , рами Великобр111аниИ ·можно использовать формат дд/мм/гг. При работе с регионапь- . . kь1мИ ' nараметрами . США можно применять формат мм/дд/гг. . Кроме этого, распо-· Знаются и Другие .форматы. ' ,,._. __ - . -~- . ····---~~ ~ t.o.:.:.o~".~.o.o~..-..- .." .... "" ... ..+·· >i]\R!!i!!o!!~~дti!iii:UШ~.~~i .......... ·- Готоео Рис. 23.4 . Описание расширенного фw~ьтраАвтофw~ьтр Добавление раскрывающихся списков Для упрощения фильтрации на листе можно разместить элементы управления, ис­ пользующие возможности автофильтра. При этом над данными выполняются более сложные операции, чем просто фильтрация. Отфильтрованные данные можно копиро­ вать на другой лист и генериров ать отчет, использовать для создания диаграммы или просто удалит~" На рис. 23.5 показано применение двух элементов управления ActiveX для выбора интересующих месяца и года. ·
Списки с фильтрами 521 .f.... ... ........... ..... ~- ,_ ..................... ··+ ··-··· ·--···! ~;~·.;i;~:5~~#~lJ.~ ~&i~;--~itt~~I~;~IЧ~~~-~~~:·:_~~~~~~ш~: 8 i авг:ЗО.2003jГолиб j NJ. .. . ! Ябло.ки . · .... ..SСЮ ' ..5 2500' 2.1j . • . ;?'; > >i\[J~!aьJse /si1eei2lSiiёiii3/ ..... шш··· ;J~~~ ........ i~Uft) Найдено з,аписеi1: Э ю 15 . -;: '' : .:~ Рис. 23.5. Использование дополнительных элементов управления Раскрывающиеся списки по умолчанию называются ComЬoBoxl и СоmЬоВох2. Для внесения значений из списка в элементы управления можно присвоить свойству List - FillRange объекта СоmЬоВох значение "=Sheet2 ! Hl: Н12 " .С другой стороны , можно воспользоваться процедурой обработки события Workbook_Open в модуле ThisWork- book. Эта процедура вносит значения в элементы управления при открытии книги : ~Pri_·vaee· x; su,ь-- ~ wo·rkьoo·J<.=op-en·ry ~~=гг:~·:--·~"~· ·::-у ~-". -~ "_. , . ~ · Dim Months ( } As variant ' Dim Years () As Variant 1· Dim I As Integer · . !.' Months = Array( "Янв ", "Фев", "Мар", '' Апр", "11М'ай111 •11Июн11, '1·Июл11_, 11Авг11, 11Сен1~1 !'Оkт11' , 11Ноя11, 11Д~к11) Years =· Array(2002, 2003 , 2004) For I = LBound(Months } то uвound .(Moдths) Sheetl ."СоmЬоВох1 . Additem Month_s ( I) Next- I Sheetl. СоmЬо.Вох2 . List WorksheetFunc-tion : Transpose(Years} lE..I1q ·-~iШ= .."~~--.·-= . . .,,,.,..~~=~~';;,; ~""""'~'""· ··· ·=· · Метод Additem объекта СоmЬоВох добавляет значения из массива Months в список элемента управления ComЬoBoxl. Для демонстрации альтернативной методики функция листа Transpos~ преобразовывает массив Years из строки в столбец, а значения этого столбца присваиваются свойствуList объекта СоmЬоВох2 . Обратите внимание, что для описания положения раскрывающихся списков исполь­ зуется имя листа Sheetl ( это имя можно увидеть в окне Project Explorer (Окно проекта) или в окне Свойства (Propeгties ) в редакторе VBE). Несмотря на то что лист называется Database, он имеет программное имя Sheetl. Для изменения программного имени не ­ обходимо изменить значение (Name) (а не только значение Name) в окне Свойства (Pгopei-ties) (рис. 23 .б) .
522 Глава 23 ' Sheetl Di splayPai;ieBrea~.s : F~se DiSP~YR!Q~;-~·eit[F.~!S~····· . ~~~.01~.~~~.О~~~-~-~...... ~~~~~~---· . ~i:i~0!~~~1~~-t~9f'I ..!.!~~~---·--···· ~-~~o~~o~~-~~~9........ J~.1-~.~- ... . EnaЬlePivotTaЬle 'False EnaЫ~Selection .го· - :dNoRёs'triciions •:!\i#~Г ш . . ·•····· ' 8,43 vi?~1e .. ·· Г~i--~--~~-ёtv;s1ь1e· ·· Рис. 23.6. СвоШ:тва листа. Видимое и програ.мм1Wе и.мя листа Следующий код добавляется в модуль кода листа: !l:>rl.va ."te si.iь ''c6mb6вox1--.cЪange( )' · Call FllterDates ;End Sub ' \Private Sub CornboBo:x;2 -'Change () f, Call' FilterDates · ШndSub., "' : ;;..~".." .м: ,;.. -~.. . ""''"""·· i'-<~ . .;;.~ ' Пpi:r щелчке на раскрывающемся списке запускается пoдпpoгpaммaFilterDates. Она может находиться в том же модуле и быть объявлена как Private, если ее нс; должны ис · пользовать другие модули. Кроме этого, подпрогра.1\1му Fil terDates можно хранить в стан­ дартном модуле и использовать в качестве универсальной вспомогательной процедуры. Как написать подпрограмму FilterDates? Как было показано в предыдущих главах, можно применить механизм записи макросов. Это даст начальный фрагмент ~ода, с ко­ торым можно будет работать. После этого код будет модифицироваться для повышения производительности и гибкости. Следующий код получается при использовании меха­ низма записи во время фильтрации дат: ~suь ' мacro4' CJ ··· 1 ,' ,, f' .Macrb4 ' м.3.~rо ' Ма)l:рос;, 2~апис~н ,н11б/200З r.: Range { "д.·5" ) .Sele.ct Selectipц. ~utoFilt~r . . Selectioц.AutoFilter Field:=l, ~~Operator: =xlмd.( . _ 1 •; . · .. · · . · Criter1a2: .="<=9/15/20Q3" ~nd,, $1,10 . · ' .., .. ·, ;., ""..••·;..,с;-...; . Как обычно, механизм записи макросов выделяет диапазоны и генерирует предельно точный код. Интерес представляет немного более универсальный код, который работает с именованным диапазоном, а не с конкретным диапазоном ячеек. В процессе преобразо­ вания кода можно использовать именованный диапазонDаtаЬаsе.
Списки с фильтрами 523 rpi.iБi:ic ''sbb":." FJ,Tferbates'( j ' - . :~:·- ., j Rapge( "Database") ~ Aut'oFiiter FieJ,d:,=l·, _ '"" · Criteri~l:=". >~8/1/2003", ' --' . . · . ' "' O perator: =xlAnd, Criteria2: =i"<9/15/,2003, " "E;!J:f1., ~~,:Ф..;, ~.. , . На основе записанного макроса можно создать универсальное решение. Например, необходимо выбрать месяц из первого раскрывающегося списка и год из второго рас­ крывающегося списка. После этого в диапазон добавляется один месяц, что дает началь­ ную дату в виде выбранного года и месяца и конечную в виде года и месяца, следующего за выбранным. Результат преобразования кода показан ниже: ~r:ivaWsU:Б"'FiI terr:iates '{) "··· · ,.. 1 ·. Ьiт St~rtt.!qnth А!? Integer Ь Ч~m StaJ::tYear As Integer lf Dim StarJ:,Date As Date 1.· Di:ril EndDat.e As Date ! Di:m · StartCriterion As S_trin\J EndCriterion As String , StartM6nth = Me.ComЬoBoxl.Listlndex" + 1 .· sfartYear·· = Ме. СоmЬ6Вох2. Vaiue .. · StartDate = DateSerial ( StartYea·r , StartMon'th, .1) EndDate = DateSerial(StartYear, StartMonth. + 1, 1) . . 1• Startcriterion = ">=" & Format ( StartDat~; ;:mm/dd/yyyy~ ). > Endcri:terion ;,, "< " & Forma·t (EndDate, "m rri/dd/yyyy") i. ' Range ( "Database") .AutoFilter Field: ~1, Criterial: =StartCriterion; i. Operat.'6~:=xlAlld, . Crite·ria2 ·:=EndCrite:r:iori · tE.!1d . ~~\l)?..• ~.c:;:.<,... .". . .. ·'· ~-· ~~-·--• "'·'' ~ '· •. Подпрограмма F i l terDates присваивает значения из раскрывающегося списка пе­ ременным StartMonth и StartYear. Вместо использования имени объекта Sheetl применяется ключевое слово Ме, которое возвращает ссылку на лист, содержащий код. Это ключевое слово позволяет копировать код на другой лист не меняя имени листа. Для определения значения переменной StartMonth применяется свойство Listin- dex объекта CornЬoBoxl (это свойство · возвращает номер месяца). Так как свойство Listlndex начинает отсчет элемент ов с нуля, для получения правильного номера меся· ца к значению свойства добавляется 1. Функция Da teString выполняет преобразование номеров года и месяца в строку даты, которая присваивается переменной StartDate. Во второй функции DateSerial подсчитывается дата на один месяц· больше даты в пере· менной StartDa,te. Полученная дата присваивается переменнойЕndDаtе. Функция Format выполняет преобразование значений переменных StartDate и EndDate обратно в строки, соответствующие региональным стандартам США (мм/дд/гггг). К строкам добавляются соответствующие логические операторы, и по­ лученные строки μрисваиваются переменным StartCriterion и EndCriterion со· ответственно. Наконец, вызывается метод AJ toFilter диапазона Database, при вызове которого используется сформированный критерий . Получение точной даты В работе функции AutoFilter есть еще одна проблема, возникающая при работе с.датами во всех языковых версиях Excel. Она появляется при попытке получения точ· ной даты, а не дат в определенном диапазоне. В этом случае функция Аut оFil ter пыта·
524 Глава 23. ется сравнивать критерий со строковым представлением даты на листе, а не с соответ- ствующим значением даты. Excel хранит даты в виде числовых значений. Дата хранится в виде количества дней с 1 января 1900 года. Например, 1 января 2003 года хранится в виде числа 37622. При запросе даты больше или равной 1 января 2003 года, Excel пытается найти даты больше или равные 37622. Но при зацросе даты, равной 1 января 2003 года, Excel не ищет чи­ словое представление даты. Вместо этого Ехсе! пытается найти строковое представление даты 1 января 2003 на листе. Следующая модификация подпрограммы FilterDates позволяет извлекать точную дату из списка , так как переменной ExactCri ter:j.on присваивается значение даты в формате "ммм дд, гггг". На листе даты отформатированы в виде "ммм дд, rrrr": [~PrT':';·.a:~e · Dirn · . Dim ' '' b i_rn sU.13 FiiterE:xact"Date () ExactMonth···As Integer E:x:actYear As Integer ExactDate As Date ExactCriterion As String Dirn Exactмonth <,( Sheetl: CornЬoBoxl. Listindex + 1 ExactYear ·=_, Sheetl : СоmЬовох2. Value 1 ExactDate_· ~· DateSerial(ExactYear, ExactMonth, 1) ~ ExactCrit"erion = Forrnat(ExactDate, " mrnrn dd,yyyy") ;:... Range( "Database") .AutoFilter . Field: =1, Criterial: =Exactcriterion L~Q<1 .~:l12~-·-·~-~:,••:.•~ - . ...••. " Обратите внимание, что при изменении формата даты, который используется на листе, придется изменить формат даты и в коде, иначе код не будет работать. Предыдущий ·код будет въ~давапrь все записи для первого меся'lf,а, 11ia?C ·ка?С З'Нд'Чение 1 пе­ редается в ?Сачестве rпретъего параметра фун?С'lf,Uи DateSerial . Для въ~бqю любой даrпъ~ в пределах меся'lf,а в ячей-ку А2 необходимо добавитъ третий р'аскръ~вающийся спис01е. Кро.ме этого, в про'lf,едуру обработ?Сu собъ~rпия ComЬoBoxl_Click нужно вве­ сти ?Сод, ?Соmоръ~й будет добавлятъ в спис01е сооrпветствуюи,1,ее ?Соли'Чество дпей в зависи­ мости от .меся'lf,а, въ~бранного в раС?Сръ~вающемся спиС?СеСотЬовохl. Копирование видимых строк Для более простого создания листа с копией отфильтрованных данных в начале листа достаточно добавить кнопку ActiveX. В модуль листа можно ввести подпрограммуСliсk. Эта процедура копирует весь диапазон Database, так как по уМолчанию копируются только видимые строки. ti'ilvate":: suЪ ''comrnan~ciвUtt:~0ы.:..ё11 c-k tт =-, Dirn Newworksheet As worksheet kr',·.= Dirn ..Workshe'etNai:ne As String Dirn ' мonth As String Dirn Year As String . Diпi 'тernpWorksheet As Worksheet M~~th · ·sheetl. CornЬoBoxl. Value Year =; s!:ieetl.coiiiЬoвox2.Value ОК)n Error Re,surne ·N.ext WorksheetName = Forrnat( · DateValue (Year & ;, " &Month & " 1")., "rnmrn уууу")
,,, 'Err .' NumЬer .~ О Thfin МsgВох , "Эти данные уже Exit 'sub If \' Списки с фильтрами 525 Set , ]'JeWWorksheet Worksheets , Add . . .. .. ,·, Range("Database") .Сору Destination:=NewWorksheet.Range("A / NewWorksheet.Columns("A:G").A:utoFit . , ' · NeV:.worksheet :'Name = WorksheetName :J?лd' sчо .. "_:"... ... ..~ Процедура обработки события Click вычисляет имя нового листа в формате "ммм гггг". После этого проверяется существование такого листа. Объектной переменной при­ сваивается ссылка на лист с новым именем. Если при этом не возникает ошибка, лист уже существует. В таком случае процедура выдает сообщение и завершает работу. Если •_листа с новым именем нет, процедура обработки события добавляет новый лист после существующих листов. Диапазон Database копируется на новый лист. Ширина столбцов автоматически меняется в соответствии с размером скопированных данных. После этого процедура присваивает имя новому листу. Поиск видимых строк При использовании возможности Автофильтр (AutoFiltel') Excel просто скрывает строки, которые не соответствуют критерию фильтра. Если код должен обрабатывать только видимые строки, необходимо просмотреть все строки в списке и определить, скрыта ли каждая конкретная строка. С этой операцией связана определенная сложность. При и.спользовании свойства Hidden объекта Range этот объект должен представлять целую строку (от столбца А до IV) или целый столбец от строки 1 до 65536. Свойство Hidden единственной ячейки или строки из 7 столбцов (рис. 23.7) применять нельзя. Следующий код проверяет видимость каждой строки и закрашивает фон тех строк, в которых н.еправильно подсчитывается значение дохода. ~.'PfIVa,~e~~SUDгёOmmalldBU E"EOn i"'.=_·ё 1·"1 ck.( ; ~·· ~..,.. ~~m·~· Dirn Database As Range Dim .Row As Range NumЬerSo1d As DouЫe Price As DouЫe Revenue As DouЫe Wi th Raцge ( "ра tabase" ) Set Database = .Offset (l, With Each Row .In Database.Rows If Row.EntireRow.Hidden = False Then NumЬerSold = RovJ. Cells ( 5) . Value Price = Row.Cells(б) .Value Revenue = Row.Cells(7) .Value If AЬs(NumЬerSold · * Price - Revenue) > 0.000001 Row.Select MsgBox "Ошибка в· выделенной с.троке" ... , Row .Interior. Cpl<:}r}I10~JS ,.= ~ J,?... , м ""
526 Глава 23 Endrf· ; Next Row >_:§od_ .?Ч.Ь. "' •. Рис. 23. 7 . _Поиск uидимых строк В процедуре обработки события Click командной кнопки сначала определяется объ­ ектная переменная Database, которая ссылается на диапазон Database (кроме строки заголовков). После этого все строки диапазона Database обрабатываются в цикле For Each. . . Next. Первый оператор I f обеспечивает обработку только видимых строк. Значения полей Количество, Цена и Доход из текущей строки присваиваются перемен­ ным, и вт~рой оператор I f проверяет допустимость значения поля Доход (равное про­ изведению полей Количество и Цена). Та?С ?Са?С въ~числения на листе в-ыпол-н.яются с исполъзованием двоичного представления с сохранением точности до 15 значаи&их 'Цифр, равенство двух значений не всегда стоит проверятъ до последней десятичной тD'Ч?Си, особенно, если значения извлекаются из дру­ гого листа. Вместо этого стоит проверятъ, выходит ли ра.зни'Ца между значениями за допустимъ~е пределъt. Та?С ?Са?С разностъ значений может бъ~тъ отри'Цателъной и поло­ жителъной, для преобразования разности в положителъную исполъзуется фун?С'ЦияАЬs. Если проверка показывает недопустимую разницу между значениями, строка выделя­ ется и выдается соответствующее сообщение. Кроме Этого, в строке устанавливается светло-серый цвет фона.
Списки с фильтрами 527 Расширенный фильтр Самым мощным способом фильтрации данных в списке является использование воз­ можности Расширенный фильтр (Advanced Filteг). Список можно фильтровать на месте с помощью автофильтра, а можно копировать в другое место. Этим местом может быть тот же лист, другой лист в пределах той же книги или другая открытая книга. В следую­ щем примере извлекаются данн~е для штатов OR и MI за третий квартал 2003 года. Дан­ ные копируются в новую книгу. При использовании расширенного фильтра критерии указываются в диапазоне листа . Например, на рис. 23.8 показан диапазон Cri teria (Al :C3) . Эта книга называется Ex- tract. xls. Список данных находится в книге Databasel . xls. В ней хранятся те же данные, которые использовались в примерах автофильтров. " • • :';['; Sh~~1{ ·i's·0'he''''e''t''2·'''''>'s:!.'he''''e'.t"з0'''"'''''''''''''''''''''''''''''' Готово Рис. 23.8. Диатю.зон с кpumepUЯJ1tu В верхней строке диапазона Cri teria указываются названия полей из фильтруемого списка. Под названиями полей может быть расположено любое количество строк. Кри­ терии в разных строках комбинируются с помощью оператора OR. Критерии в пределах одной строки комбинируются с помощью оператора AND. Кроме этого , можно использо­ вать вычислимые критерии в форме логических операторов, которые преобразовывают­ ся в значения True или False. При применении вычислимых критериев верхняя строка диапазона Criteria должна быть пустой или содержать метку, которая не является на­ званием поля в списке (в данном случае это Вычисление) . При создании вычислимого критерия в формулах можно использовать названия по­ лей из списка данных . В строке формулы показано содержимое ячейки С2 : i~l\ШP <:I?~t.aJ::>@ft ;(,~13_ !__D~~~>.~$-rr$.4., .R .at: a_i?.~§.iY~~JJi ! D~te<-~$_M2 >
528 Глава 23 Формула в ячейке С3 ничем не отличается от формулы в ячейке С2. Показанные критерии эквиваленты применению следующего фильтра: f ( 'st.at.e;or:CNon bate> ;;J'ui ~,2ооз A'ND 'J5atё<sep зь-,2оозJ oR. _" ~;;.'\ "J§t,at;E:;':'1'1J;i\_JЩ:p ,.:p~,):e~':'.Ju1 ),,~QОЗ J?ND J:)aJ:~<§.ep ЗО,2QОЗ) Так как список с данными находится в книге Databasel. xls, ссы.Лки на поле Дата вводятся как внешние. В данном случае используются такие же ссылки, как и при обра­ щении к именам в другой книге. Так как названия полей не являются именами книги, формула возвращает значение #NАМЕ?. Для использования возможности Расширенный фильтр (Advanced Fiiter) список данных в книге Databasel. xls должен быть переименован ' в Database. В книге Extract. xls диапазон Al:C3 перемменован в Criteria, а диапазон A5:G5 преобразован в Extract. Если возможность Расширенный фильтр (Advanced Filter) запускается вручную с помощью коман­ ды Данныес:>Фильтрс:>Расширенный фильтр (Datac:>Filterc:>Advanced Filter), выводится сле­ дующее диалоговое окно (рис. 23 .9) , в котором можно ввести соответствующие имена. Обраtiотка ·- - - ~· О Ф.нльтроеать список на месте 0 скоnирое~ть результат в ,npyroe 11есто 1Лсходны11 диапазон: Днаnазон y~noв1-1i1: Поместить результат ~д11ма3он: ~t ~~~t···· ··· · ····~· ··· ··· ·················~ О Толь ко Уt!.Икальные записи г·· ок·····1[ Отмена . J Рис. 23.9. Настройка пара.метров расши­ ренного фильтра Для автоматизации этого процесса используется следующая процедура обработки со­ бытия Click командной кнопки Извлечь. Iv~i:'-e&<:Su];!\; command.вi'itt.ani2c i ·ici< о " Dim;i Da.t .:p.):)ase As Range Pim·., criter'ia As Range · :lm <Ext ct As Range " se = Workbooks { "Databasel. xls"). ~ets ( "Database") .' Range{ "Database") %.:. ' В процедуре обработки события определяются три объектные переменные, которые ссылаются на диапазоны Database, Criteria и Extract. После этого вызывается ме­ тод AdvancedFil ter объекта Range, который называется Database.
Списки с фильтрами 529 Резюме Возможность ДанЬiыеqФорма (Dataqfoгm) значительно упрощает создание макро­ сов для управления данными. Но если верхний левый угол списка находится за предела­ ми диапазонаАl : В2, список с данными необходимо переименовать вDatabase. Как было показано выше, возможности Автофильтр (AutoFilteг) и Расширенный фильтр (Advanced Filteг) могут использоваться вместе с кодом VВА для получения гиб­ ких решений по извлечению данных из списков. Комбинирование этих возможностей и элементов управления ActiveX (раскрывающихся списков и кнопок) позволяет сделать их доступными для пользователей всех уровней подготовки. Для получения списка необ­ ходимых методов можно воспользоваться механизмом записи макросов . После этого за­ писанный код адаптируется для применения 'элементов управления ActiveX. При этом необходимо обратить особое внимание на использование форматов даты, не соответствующих региональным стандартам США. При сравнении диапазонов с дата­ ми с помощью возможности Автофильтр (AutoFilteг) интерпретатор VВА требует при­ мененщr региональных стандартов США. Дополнительная информация о проблемах ин­ тернационализации приводится в главе 17. Кроме этого, если необходимо определить строки , которые были скрыты в результате использования автофильтра, свойство Hidden объекта Range доступно только для це­ лых строк листа. Возможность Расширенный фильтр (Advanced Filteг) обеспечивает самую мощную функциональность фильтрации в Excel. В расширенный фильтр можно устанавливать намного более сложные критерии , чем при использовании автофильтра. Кроме этого, поддерживается копирование отфильтрованных данных в ука~анный дИапазон. Также расширенный фильтр поддерживает копирование данных между книгами.
Генерация диаграмм В этой главе рассматривается использование механизма записи макросов для опреде­ ления объектов, методов и свойств, позволяющих управлять диаграммами. В дальней­ шем записанный код улучшается и расширяется для получения большей гибкости и эф­ фективности. Основное внимание уделяется доступу к объекту Chart из кода VВА. Этот объект предоставляет программный доступ к большому количеству объектов, содержа­ щихся в диаграммах Excel. Дополнительная информация об этих объектах приводится в приложении А. В частности, в этой главе будут рассматриваться следующие темы: О создание объектов Chart на отдельных листах; О создание встроецных в лист объектов Chart; О редактирование рядов на диаграммах; , О определение рядов с помощью массивов; О определение меток диаграмм, связанных с ячейками на листах. В Excel поддерживается создание диаграмм двух типов: диаграмм на отдельных лис­ тах и ди'!грамм', встроенных в существующие листы. Оба типа управляются одинаково. Единственное отличие заключается в том, что_ лист диаграммы является отдельным объ­ ектом Chart, а встроенная диаграмма хранится в объекте ChartObj ect. Каждый объект ChartObj ect на листе электронной таблицы является .:rленом коллекции ChartOb- j ects. Листы диаграмм входят в коллекцию Charts объекта Workbook. Каждый объект ChartObject является 'ЧJ!е'Н,ОМ '/Соллекц,ий Shapes и ChartObjects. Коллекция Shapes предоставляеrп алъrпернаrпивнъtй способ получения ссъtлО'/С на всrпроен­ Н'Ые диаграммъt. Механизм записи махросов генерирует 1'од, исполъзующий 1'0/LЛ,екц,ию Shapes.
532 Глава 24 Листы диатрамм Перед созданием диаграммы включите механизм записи макросов. С помощью мастера диаграмм создайте новый лист диаграммы. Диаграмма должна отображать данные из диа­ пазона A3:D7 (рис. 24.1). На втором шаге работы мастера выберите переключатель Ряды в столбцах (Seгies in Rows). На третьем шаге назовите диаграмму Манго. На· четвертом ша­ ге выберите переключатель Отдельном (As new sh.eet) и введите имя листа Манго. 1 Рис. 24 .1. Диапазон с данными для диаграммы Записанный макрос Записанный макрос должен выглядеть следующим образом: stiь макросi () ' Макросl . Макрос ' Макрос записан 3_1'. 03 . 2005 (Leschinsky Oleg) Charts.Add .. ActiveChart. ChartType = x1ColumnClustered . Activechart. SetSourceData Source: =Sheets ( "Sheetl") . Range ("АЗ: D7") , :PlotBy: = xlRows : .ActiveChart.Location Where:=xlLocationAsNewSheet, Nаmе:="Манго" with . AcЦveChart ~Hasтitle = True .Chartтifle.Characters.Text = "Манго" .Axes(x1Category, xlPrimary) .HasTitle = False · .Axes (xlValue, xlPrimary) . HasTit1e = Faise End With End S_1.1b
Генерация диаграмм 533 В записанном макросе для создания диаграммы используется метод Add коллекци·и Charts. Сначала опредедяется свойство ChartType активной диаграммы, после чего метод SetSourceData определяет диапазон с данными для диаграммы. Метод Loca- tion используется для опредеЛения листа диаграммы и присвоения ему имени. Свойст­ во HasTi tle устанавливается в значение True, чтобы можно было определить значение свойства ChartTitle. Наконец, свойство HasTitle осей устанавливается в значение False (этот шаг является необязательным). Манго OOOQ ····-· •···· - ·, ••yy"•••v•••• 1~ i _ ~ •l f Манго Sheetl;Z~t27~tз 7 Готово Рис. 24.2 . Диаграмма, созданная в результате работы .макроса Добавление листа диаграммы с помощью кода VBA Записанный код неплохо выглядит даже без модификации. Но лучше создавать объ­ ектную переменную, которая обеспечивает возможность ссылаться на диаграмму в по­ следующем коде. Кроме этого, можно удалить избыточный код и добавить заголовок диа­ граммы, связанный с листом. Эти.изменения отражены в следующем коде : (bP-t:I oП ExpHBt , i PuЬlic ·sub AddChartSheet() Dim aChart As Chart Set aChart = Charts.Add . Name = "Манго" With aChart . C hartType = _xlColumnClustered , . SetSourceData Source: =Sheets ( "Shee·tl" ) . Range ("АЗ : D7") , "~Plo'tBy: =xlRows " ;HasTitle = True ,· . ChartTitle. Text " =Sheetl!RЗCl" ~ End With. i~Ild su.ь . . ....1
534 Глава 24 Вызов метода Location был удален, так как в данном случае он не нужен, потому .что лист диаграммы создается по умолчанию. Мастер диаграмм не позволяет ввести формулу, определяющую заголовок диаграммы. Но изменение заголовка диаграммы можно записать отдельно. Из записанного · кода станет понятно, что для этого свойству Text объекта ChartTi tle необходимо присвоить текст формулы. В показанном выше коде заголовок диаграммы определяется как формула , ссылающаяся на значение в ячейке R3Cl или А3. При вводе формулы. в текстовый элемент диаграммь1 необходимо испол~зовать адреса­ цию ГJО номерам стр'ок ·и ~т'Олбцов (RЗС1), а не по именам ячеек (АЗ). Встроенные диаграммы При создании диаграммы, встроенной в виде объекта ChartObj ect, ем:у стоит присво­ ить имя, которое позволит ссылаться на объект в дальнейше м. Для этого можно вручную выделить ячейку листа (чтобы снять выделение с диаграммы), нажать клавишу <Ctгl> и щелкнуть на диаграмме . В результате будет выделен объект ChartObj ect , а не сама диа­ грамма. Имя объекта ChartObj ect отображается слева от поля Формула (Foгmula) в верхней части экрана. Как определяется выделение объекта ChartObj ect? Имя объекта отображается в поле имени слева от поля Формула (Foгmula). Кроме этого , в углах и посредине граней диаграммы отображаются белые квадраты (белые круги в Excel 2003). Если выделить диаграмму, а не объект ChartObj ect, квадраты будут черными . После выделения имя объекта ChartObj ect можно изменить в поле имени . После изменения необходимо нажать клавишу <Enteг>. Показанная ниже встроенная диаграмма (рис. 24.3) создана с помощью мастера диаграмм . После этого диаграмма перетаскивает­ ся на новое место и ее имя меняется нaMangoesChart. -~--E_ _,~ ___G_j:___.!i .-.,.--'· -t---~-- ...... ......" ..." ...." ... .." . Манго 1 o:xxJ ~ "•." . ._. "."."".•"""•." ." .•" .;"---" . .•"""""" 800) . ' 6ОСО '· . 40CXJ . 200:J . о Рис. 24.З. Создание встроенной диаграммы из кода
Генерация диаграмм 535 Использование механизма записи макросов При выделении диапазона A3:D7 и включении механизма записи макросов до созда­ ния диаграммы , включая перемещение объекта ChartObj ect на нужное место и изме­ нение имени на Mangoes~hart, будет записан следующий код: t:SU.ь 'м.aк.P o'C 2 Tj · Charts.Add · ·, .· . :{ActiveChart. Cha.i:-tтype .';" xlCol ilmncluJ.3~ered . Ac;t;:i veCh?.rt. Setsoщ:ceData . , . ,. ., \ii~ s'~urce: ;Sheets ( '' Sheetl". ) '. Range ( "А'з: D7") , 1'lotBy:;., xlRows ' ~S; ? A~tivecьa:r't. Location _Wher:e: =xlLocationAsObj e 'ct ; . .Name: =" Sheetl" с: 1• :; with ·· ActiveChaгt · .,. ' · · ·. · · · · ,. . ·HasTitle = ' True . C hartTi tle. Characters. Text = "Манго" " . « 3Axes(x1Category : xlPriпiary) .Has'IJitle7 = F.alse , :,, : ' .Axes (xlValш°' ; xlPririiary) .. HasTitie ., = Fal9e. _: · End With! . •·.. -о. '. :,, •' . :.....' ··: "· z,ctiveSheet. Shapes ( "диагр · . 27"). IncierrientI.;eft 96#· Activesh.e'et : Shapes ( "ди<>гр, 27") . IncrementTop . ~2.7 . ·75'· . A'ctivevvindow. VisiЫe ~ False • · · Windows ( "Chart.s :~ls !' ) . Actiyate· · Range("G4") .Select ;· · · · 1 • ActiveSheet' . Shapes ( "Chart;. · 2 7 ") . Select' . Seleqtiori.Name , "Mango\"schart" · -?;~O;L ' ~ -~~~.6.;i! ;,, . Jоо\1:.":и".~'»..,,.""'* До определения заголовка диаграммы записанный макрос напоминает макрос для создания листа диаграммы. Создание встроенной . диаграммы обеспечивается методом Location. До оператора EndWith записанный код можно использовать повторно. Но код перемещения объект а ChartObj ect и изменение имени объекта для повторного применения не подходят. В этом коде для идентификации объекта ChartObj ect ис­ пользуется имя , принятое по умолчанию. (Обратите внимание, что механизм записи макросов ссылается на объект ChartObj ect как на объект Shape. Это отличие было описано в начале главы.) При попытке повторного запуска этого кода или при адаптации кода для другой диа­ грамм'ьr код откажет при обращении к объекту Chart 3 О или к другой диаграмме, которая создавалась при записи макроса. Способ обращения к объекту ChartObj ect и получения ссылки на активный лист диаграммы является совершенно неочевидным . Добавление встроенной диаграммы с помощью кода VBA В следующем коде свойство Parent встроенной диаграммы используется для идеи- . тификации объекта ChartObj ect , внутри которого хранится диаграмма: ' s uD' 'Addcliart"( Г '""'- _ ,, ., ~- Dirn ' achart · As : Chart Active.shi:et '. ChartObj ects . Delete Set ·achart charts.Add .. Set 'achart = aChart.'Location(Where:=xlLocation'AsObject, · ~Name: :•sheetl") · · , k ~.• . WiJ.:!l . P..Gl:la. :r;: t.~~ ····""""'=···· · ~· -·"~"-~~'··--·""""''~-"'="'·'""""""
536 Глава 24 .C hartType = ' x icoii..unnciustered . SetSourceDa ta Source: =Sheets ( "Sheetl") . Range ("АЗ: D7 ".) , PlotBy:=xlRows .HasTitle = True . C hartTi tl·e . Text = "=Sheetl ! RЗCl" W:ith .Parent . Тор = R<щge("FЗ") .Тор : Left Range("FЗ") . Left . Name =: "MangoesChart" End With End With EncJ. . Sub , Сначала подпрограмма AddChart удаляет существующие обЪекты ChartObj ects. После этого объектн.ой переменной aChart присваивается ссылка на добавленную диа­ грамму. По умолчанию новая диаграмма находится на листе диаграммы , поэтому метод Location применяется для превращения диаграммы во встроенную диаграмму. При ~спользовании метода Lo'cation объекта Chart объект Chart удаляется и созд~~· •.j:!ТСЯ заново. При этом удащ1ются в~е ССЫЛКИ на оригинальный объект Chart. Тсiким ~.б" ' разом, Для получения ссы:Пки на н9вый объект. Chart возвраЩаемое ~ значение мет6Да ·• · L,oca tion необх.одимо присваивать объектной переменной типа chart. Подпрограмма AddChart определяет тип ди а граммы , источник данных и заголовок диаграммы , представляющий собой формулу , ссьшающуюся на ячейку А3. Подпрограмма AddChart устанавливает свойства Тор и Left объекта ChartObj ect равными свойст­ вам Тор и Left ячейки F3 . Для получения ссылки на объект ChartObj ect подпрограм ­ ма AddChart использует свойство Parent объекта Chart. Наконец, ~;rодпрограмма AddChart присваивает объекту ChartObj ect новое имя , чтЬ позволит ссылаться на объект в будущем. Редактирование рядов данных Самым быстрым способом определения полностью нового набора данных для диа­ граммы является использование метода SetSourceData объекта Chart. Кроме этого, отдельными рядами можно управлять с помощью объекта Series, который хранится в объекте SeriesCollection в пределах диаграммы. В следующем примере показано, как получать доступ к отдельным рядам. В данном случае из диаграммы MangoesChart удаляются все ряды, после чего по од­ ному добавляются четыре новых. Новая диаграмма будет содержать информацию о про­ дуктах в выбранном пользователем р егионе. Для упрощения поиска данных о продуктах каждому диапазону продукта присвоены имена. Например, диапазону A3:D7 присвоено имя Mangoes (соответствующее метке в ячейке А3) . Полученная в результате диаграмма показана на рис. 24.4 . Следующий код выполняет преобразование диагRаммы MangoesChart и добавляет новые данные (обратите внимание , что для работы кода на листе должна присутствовать оригинальная диаграмма). Так как подпрограмма MangoesToRegion состоит из не­ скольких частей, рассмотрим каждую часть в отдельности . (Здесь приводится полный листинг подпрограммы MangoesToRegion. Вспомогательные методы будут рассматри ­ ваться далее.)
Рис. 24.4. Добавление рядов на диаграмму ;pi.ibli'c' FuncEion J:>ickRegion{) As r:rlteger ~ , Dim ''Answer' As String Do Генерация диаграмм 537 Answer. InputBox ( " Введите номер Региона ( 1 to 4) ") IfAnswer.>="1" ·AndAnswer <="4"Then Exit Else · Do Call 1 EndIf MsgBox '( "Выберите номер Региона из 1, 2, 3 или 4", vbCritical) ~, Loop, ~- ~ ~ Pic~Reg;Lon ;~nd · F,~1\ctidn fc- , <" ~ Cint(Answer) lP.UЬlio Su~ MangoesToRegion () t': Debug, Asser-t MangoClщrtExists () ' , Предохранитель: Rет _ смысла что-то делатъ, ' выполняется предварительное условие If Not MangoChartExists () .Then · ;MsgBox "Диаграмма MangoesChart не найдена vbCritical · ' Exit suь End r .f, As Cha.rt . . . DimaCh~rt set achart Debug.Assert GetMangoChart() .Chart (aChart Is Nothing False) , ·"<-:' если не - процедура завершена " ,
538 Глава 24 .: caf1'"~i5~ieteseries{aciiar't . ·se r i"e'Ei.б31T-ect:i. 6n) . ~ .1Д1: ' AddProductsFo:r'Region ( Pic"kRegion (), aChart) . . fl :::\ ~,y . 1 ; / - ~$; ..~ . w .н!.n~~kfti,_,..~'"~·~~u -.-t:."· ""-'··'·" *'~ ...-;.-~ ~.io;.<;;;o. Функция PickRegion выдает пользователю окно ввода (InputBox) с запросом на выбор значения 1, 2, 3 или 4. Подпрограмма MangoesToRegion предполагает , что ис­ ходная диаграмма Манго существует. Подпрограмма Debug. Assert используется только в процессе разработки. После этого предохранитель проверяет существование ориги­ нальной диаграммы. Эта проверка предназначена для потребителей . Далее из объекта ChartObj ect извлекается объект диаграммы (для этого используется подцрограмма GetMangoChart, которая возвращает объект ChartObj ect). Наконец, выполняется удаление существующих рядов и добавление новых д1r.я выделенных дацных (Манго , Ба­ наны, Личи или Рамбутан):, iJ:'tiБПc" s1t:6-c:мangoes+foi1e9'1'011( г ···z-г--.- ~,А •"~.:~ •, ;( ' • .-J:,'f>-~;~--~&'fi ·' . '> : Debug cAsser oCbartExists () Работа этого кода обеспечивается методами MangoChartExists, GetMangoChart, DeleteSeries, AddProductsForRegion и PickRegion. Рассмотрим каждый из этих методов бол~е подробно: - : Puьiic ' FU.ncHonJ1ari'gO'cl:iaГй:X:t·з·t"з сг лs в6oiean;-"'· · ! MangoChaf-tExisfs ·= ·GetMangoChart Is Nothing = False [~,:r:!c;l__p_u_П.91::i9!f.w~_,,.;.,2~.W»N•.. ~-~~:~.:<-!.;.~;.';"'' '~-"1д"'~ ~-~м~~-~~~*"".мt.~.....,~~-~~'"':k~: ;_ =~",. '·· Подпрограмма MangoChart Exists вызывает подпрограмму GetMangoChart и про­ веряет действительность возвращаемого объекта ChartObj ect. Если диаграмма не су­ ществует, обработчик ошибок в подпрограмме GetMangoChart возвращает значение Nothing. ·Puь1 i'C ·- FuПC:t1aП' e:~мai1r;iCicharf' ( у - АБ·~·е:ьа.нььJеG'f " ! on Er,ror GoTo Catch · · С · Set GetMangoCbart = Worksheets ( "Sheet1") . ;~.Chartobj,ects ( J;Ma ngoesChart") ' Exit. Function · ,_" . ' . . ,. . 1catch: \.\ .> ' - ". . '' . : Set GetMangOChart Nothing 1End, y u):icf:i,gi} .""'~·,""""'"""'"''~"~'~-'""д·'·'''''""'"
Генерация диаграмм 539 После этого подпрограмма DeleteSeries принимает параметр типa. SeriesCollec­ tion, который извлемется из объекта Chart. Далее подпрограмма перебирает и удаляет существующие ряды. После удаления существующих рядов создаются новые ряды для всех продуктов из выделенных диапазонов с информацией. В завершение новым рядам предоставляется за­ головок и имя: /; : . Dim •'I As ; Intege:z:- Dim .1 As Integer pim пшgеУ As Range Dim · rarigex As Range Dim···products As variant . ' bim. regions As · variant Ьim · pr0 ductsname А13 Variant bim '. regionsriame As Variant : -', ' ~- . . inteQ'er; ·· : "<"' p;;oducts · ,;, Array 0 ("Mangoes", "Bananas", "Lychees"; "Rambutan") regi<;шs;,, Array("Sou·th'', "North", "East"; "West") :· Рамбутан") "Запад",) For I = I,.Bound (prC>4u~ts) то UBound (products) , ··. . Set rangeY = Range(products(J)) .Offset(region; 1) .Resi ze(l, . s . .et rangeX = Range(proctuctsO:)' ) .Ьf'fE:et(O, lJ .Resize(l, З). Wi°th · Chart. SeriesCollection.NewSe:ties . Nam~ -; ; productsnam'e ( I} · •' ; Values = rangeY "xvalues = · "='' & • rangeX.Address ' . " JRowAbso1ute:=True, _ · Col'umnAЬsolU:te:· =True, ....;, -~' ReferenceStyle; =xlRlCl., .External.: =тrue) Wit.h " chart ..'Chartreit .i е •. техt regi onsname ( regi оп f)f~d/~~~~,щgoChart () : Nam~: = "RegionChart" t!~.........;;.;_,~,~~-~A.:_,,.-.~. ~. • .-.. <,..,..,,,,,,,~1.C...-,_'X,-•.•4<•-~.;z...... '•'°"·~· Вот и все. В двух словах это выглядит так: была найдена существующая диаграмма, на ней удалены существующие ряды и добавлен~~ новые данные. Показанное в этом приме­ ре разбИ:ение на методы является более предпочтительным, так как оно позволяет сокра- ' тить объем ненужных комментариев и отказаться от использования большого количества временных локальных переменных.
540 Глава 24 Десятилетний опыт программирования позволяет писать большие монолитные ме­ тоды с большим количеством временных переменных. Это один из допустимых подхо­ дов к программированию, но современные подходы к методам разработки программного обеспечения, включая рефакrпори'Нг (refactoтing), ·который может применяться в VBA как и в любом другом объектно-ориентированном языке, доказывают, чт6 короткие методы, уменьшение количества временных переменных и правильно названные методы вместо большого количества временных переменных позволяют сделать код более простым для сопровождения. Дополнительная информация на эту тему приводится в книге Мартина Фаулера Refactoтing: Irnproving tlie Design ofExisting Code (Addison-Wesley, 1999). Определенr,1е рядов диаграм·мы с помощью массивов Для определения ряда диаграммы можно присвоить массив свойствуVаluеs объекта ряда. Такой способ определения ряда требуется для генерации диаграммы, не связанной с исходными данными. Подобная диаграмма может распространяться в отдельной книге независимо от исходных данных. На рис . 24 .5 показана диаграмма для данных из диапазонаМаngоеs . В поле Фо рмула (Formula) над листом показано определение первого ряда данных. Названия месяцев и значения на вертикальной оси определяются в массивах Excel. Текст имен диапазонов присваивается именам рядов. Рис. 24.5 . Создание трех.мерной диаграммы
Генерация диаграмм 541 '''Фу,нкция $~RIES померживает использование массивов до 2SQ ,. элемен~ов. 'Это 6гра~;;'L < ~0Чивае:r'~олЙчествс» т;чек диаграммы, которые .можно укаэатьс помощью массива. , "· ,.,. . ·.. " "· . . '. .' --,_ Следующий код позволяет создать трехмерную диаграмму: fPU:E'i :гc~·su:J3 ' мakeArraychart <) • [· D~m sourceWorksheet As Worksheet . hf" D_7m sour~eRange . As Range w, Dim. aWorkbook As Workbook Р'. 'Di~ aW6rksheet As Workshe.et ~" : . · Dim a'chart As Charf ~--. :, · Dim' al\!ewseries As series ~- <'bim J: ·As 'rnteg~r f'· Dirii Sal'esArray. As Variant t ·: · ._ Dim ЩonthAr-ray As Variant ~1Р, ,, = Array( "Янв ", ;. >· 1' Фев 11 , "Мар") ( ' · ОпредеЛИТЬ · ИСТОЧНИК данных ~ S.et sourceWorksheet = ThisWorkbook. Worksheets ( "Sheetl") 1\' ' Set sourceRange = sourceWorksheet. Range ( "Mangoes " ) t: ' Со~:ать новую кн~гу ~· Set aWo'rkЬook · = Workbooks. Add ~ Set aWorksheet = aWorkbook . Worksheets(l) i ' ... создать новый объ.ект ·диаграммы и встроить его в лист Set aChart aWorkbook.Charts .Дdd Set aCha,rt aChart . Location (Where: =xlLocatioпAsobj ect, i~Name:;, " Листl") J\ · , With aChart . • , Определить тип диагр9ммы . ChartType = x lЗDColumn For'r'= 1То4 . ' Создать новый ряд Set . aNewSeries = ..SeriesCollettion. NewS'?ries ' Передать данные. в массиве :;· SalesArray = sourceRange . Offset(I, 1) .Resize.(l, aNewSeries.Values = SalesArray aNewSe ri es . XValues = MonthArray aNewSeries,Name sourc~Range . Cells '(I + .1, 1) .Value Next I . HasLegend = False . HasTitle = тrue . ChartTitle.Text = "Манго " Расположить и !iазвать объект ChartObject· ' в диапа зоне В2 : 122 . With . Parent .Тор = . aworksheet : Range("B2 ") .Тор .Left ,,; aworksheet . Range("B2") .Left . Width = aWorksheet. Range ( " В2 : 122 ". ) . Width . Height = a Worksheet. Raдge .( "В2: I22 ") . Height . Name "ArrayChart" With
542 Глава 24 1 (Именованный диапазон Mango e s добавляется с помощью команды меню Вставка<=:> Имя<=:>Определить (Inseгtt::>Namet::>Define) . Диапазон Mangoes определяется ячейками с А3 по D7 .) Подпрограмма MakeArrayChart заносит названия месяцев в массив MonthArray. При необходимости эти данные могуг извлекаться из листа . Ссылка на лист с данными присваивается переменной sourceWorksheet. Диапазон Mangoes сохраняется в пере· менной sourc eRange. Для диаграммы создается новая книга и ссылка на эту книгу при· сваивается переменной aWorkbook. Ссылка на первый лист новой книги присваивается переменной aWorksheet. Новая диаграмма добавляется в коллекцию Charts в преде· лах объекта aWorkbook. Ссылка на новую диаграмму сохраняется в переменной aChart. Метод Location обеспечивает преобразование диаграммы во встроенную диаграмму и переопределяет значение переменной aChar t . В структуре Wi th. . . End Wi th с помощью свойства ChartType объекта aChart диаграмма превращается в трехмерную гистограмму. В цикле For. . . Next создается четыре новых последовательности. На каждой итерации цикла с помощью метода NewSeries создается новый ряд. Данные диапазона из соответствующей строки при· сваиваются непосредственно переменной Sa l esArray типа Variant . Сразу после этого значение переменной Sal esArray присваивается свойствуVаluеs объекта нового ряда. Массив MonthArray сохраняется в свойстве XValues объекта нового ряда. Текст в столбце А диапазона Mangoes присваивается свойству Name объекта нового ряда. После этого код удаляет добавляемую по умолчанию легенду диагр<\.ММЫ и устанавли· вает заголовок диаграммы . Оставшийся код работает с объектом ChartObj ect, который является родительским объектом для объекта диаграммы. Этот объект размещае;ся точ· но над ячейками B2:I22 . Кроме этого, диаграмме назначается имяArrayChart. В результате работы кода создается диаграмма в новой книге. Полученная диаграмма полностью независи.ма от исходной книги и содержащихся в ней данных . Если диаграм· му скопировать и вставить в новую книгу, она все еще будет содержать исходные данные . Преобразование диаграммы для использования массивов В преобразовании существующей диаграммы для использования массивов, а не ссы· лок на ячейки, нет ничего сложного. После такого преобразования диаграмма становится независимой от данных, на основе которых она создавалась. В следующем фрагменте ко· да показан процесс такого преобразования:
Генерация диаграмм 543 -~ "»•~?'~/' ~--~.';,/"' , ,, . • " ; ' -:'"'·""":·"~.~- • ' !/Ni(.'jO>'>I<''" ''"'1У' ' ~' """""'"""'"t•C' '"""~''2"'0<"" ;;с:< ~·~ == Ч"'"'С"='""",','.~,"Ф;.'~rz-:.~··~ •·•• ' ••• ~~--":' = ''>"""'К \ , MsgBOx "Извините. , Объем данных · превышает о:Гр<J.ничение f~MCiGhcиBa •• ,:·'~ ~J:::riя1..• ~чо..~ . .,,, .... - ·· ..,..,,.. Для каждого ряда на диаграмме свойствам Values, XValues и Name назначаются собственные значения. Хотя этим свойствам можно присваивать ссылки на диапазоны, свойства всегда возвращают массивы. Эта особенность· обеспечивает возможность пре· образования ссылки на диапазон в массив . Помните, что количество точек данных в массиве не может превышать 250 элемен­ тов . Если это ограничение превышено, код выдаст сообщение об ошибке. На этот случай в подпрограмме предусмотрен обработчик ошибок. Определение использованных в диа грамме · диапазонов Поведение свойств диаграммы, которое полезно для преобразовани~ ДИ:аПазо~а в м~с­ сив, ока~ывается проблемой при программном определении диапазо~а, на основе кото­ рого создавалась диаграмма. Если бы свойства Values и XValues возвращали строковые значения, проблема решалась бы предельно просто. Единственным свойством, которое возвращает информацию о диапазонах , является свойство Formula. Оно возвращает функцию SERIES в виде строки. Формула может вы­ глядеть следующим образом : fi~E.iШ;;"§,J S.li§юE[~;CL.$Л$!7:Шi~i!XL.f~IEй1$1J..91l~~iIЛЖ~4:i§Jl$],:~J5. . :,:,~~..;:.:J1L<d Свойство XValues определяется последними двумя параметрами, а свойство Values - третьим парам е тром. Для получения необходимой информации нужно н айти запятые и извлечь текст, который находится между ними. Следующий код предназначен "' u u / u для раооты с диаграммои , встроеннои в активныи лист: · fi;iU:J;) f rc·sU.ь 'C Ge'ER. aiige sfr r offiёf:iaf·t:: б "~"'' • '( D~m· ~se~ies дs ~eries· ••<.. . .• . Di:m ser1esFunct1on· As · string . .-' Dirn firstcoпima As rn.teger · 1'' Dim "5econdco~a A.s Integer . Di.rn f:hirdComrna As .Int.eger ·· · J;"angeValu estring As String . , .pim rangeXValueString As String : Dim '. rangeValueAs Range ':' ' D':irn rangeXVal ue As Range ;, " . .'-~ GoTo Catch запятые firstComma = ·rnstr(l, seriesFunction, ",") secondComrna = InStr(firstCoПU11a + 1, seriesFunction, ", ") . thirdco'mma = Instr ( secondComma + .1 , · s e ri.esFunction, ; . t1зв'.iтечь СТрОКОВОе представление . ССЩJОК на диапаЗОНЫ , /. rangeXValueStrip.g '·= Mid(seriesFunction, firstComma + 1, . : .. ., :,' S.§.co<.::ю51,<;o rщn.a ~ .П:i::§J;..G.cO m!!l? - 1)_ ,,__ ~· __ •
544 Глава24 rangeValueString Mid(seriesFunction, secondComma + 1, _ thirdCornma - secoridComma - 1) .' Преобразов.э.ть строки в объекты Range Set rangeXValue = Range(rangeXValueString) Set rangeValue = Range (rangeValueString) · ' В:ыделить диапазоны . раз ными цветами rangeXValue.Interior . <Colorindex = 3 rangeValue.Interior.Colorindex = 4 Бxit Sub · ·ca.tch: ~ MsgBox "Изв.ините, произошла ошибка" & vbcr & "Возможно·, в диаграмме содержаться некорректные ссыпки на: · !'·.~диапазоны" . ·""' · 1~Ч9: ~.S:tiJ:J. ~ •·- _ Переменной seriesFunction присваивается формула ряда . В этой формуле содер­ жится строковое представление функчии SERIES . С помощью функции InStr опреде­ ляется положение первой, . второй и третьей запятых. Функция Mid позволя~т извлечь строковое предст~вление ссьvrки на диапазон. Преобразование строк в объекты Range осуществляется с помощью св~йства Range . Преобразование строк в объ екты Range выполняется даже для диапазонов из других листов и книг. Достаточно, чтобы исходные данные находились в открытой книге . После получения диапазона можно обрабатывать объект Range. Например, можно программно изменить значения в ячейках диапазона или размер диапазона. В данном случае для демонстрации программного управления выполнено выделение диапазонов разным цветом. Метки диаграмм \ В Excel предоставляете.я возможность добавления меток данных на диаграмму. Для этого метки должны быть основаны на рядах значений или на значениях О<:И Х. Все эти возможност·и доступны в диалоговом окне Диаграмма<=>Параметры диаграммы (Chaн<=>Chaгt Options). Кроме того, в качестве меток можно вводить собственный текст или текст форму· лы, ссылающейся на ячейки, но создание таких меток требует значительных трудоза­ трат. Для этого ряду необходимо добавить стандартные метки , после чего отдельно выделять каждую метку и редактировать текст. метки или модифицировать текст фор ­ мулы в поле Формула (Foгmula). Эти же операции могут выполняться в результате ра­ боты макроса. Ниже показана диаграмма ежемесячного уровня продаж (рис. 24.6) каждого торго­ вого представителя. Метки определяются формулами, связанными с четвертой стро­ кой листа (например, 'Jenny" в апреле). Формула в доле Формула (Formula) ссылается' на ячейку Е4. .
Генерация диаграмм 545 Рис. 24. 6 . Создание меток диаграмм Предположим, что создана похожая небольшая диаграмма без меток данных. Сле­ дующий код позволяет добавить метки данных и ввести формулы, определяющи~ текст меток: Yi>U:Ьli.c~' sufГA.Mbai:ai.aЪeis ('Г · · Dim ,sales As Se;;.ies Dim . points As points D.~m ;,aPo':int As J:>oipt · Dim ·· aRange .As Rang.e Dim' <r· As. Integer . · Set 'aR'ange, ,,;; Range ( "В4 : G4 " )• , ·; Set "sales = ActiveSheet ~ ChartObjects(l) .Chart.Seriesc' scЭ:les. HasDa.taLabels = True ·· ·•• Set points = sales . points · · Each aPoint rn points · ~~I~1.. . aP:Oint . DataLabel.T,ext = "=' " & ' (RowAbsolute:=True; ColumriAЬsolute:'=True, _ • Referencestyle; =xlRlCl, External : =True) · aPoint.DataLabel.Font.Bold . = True i aPoint. Da .taLabel. Posi tion xlLabelPosi tionAЬove 1 .. . Next apoint &114 :$ЧR ~ :··• .•ь.
546 Глава 24 Объектной переменной aRange присваивается ссылка на диапазон B4:G4. Перемен­ ной sales присваивается ссылка на первый и единственный ряд встроенной диаграм­ мы. Свойство ряда HasDataLabels устанавливается в значение True. Цикл For Each. . . Next обрабатывает каждую точку ряда данных. Для каждой точки код создает формулу и присваивает строку формулы свойству Text метки данных; соответствующей этой точке. Формула ссылается на ячейку листа с использованием формата RlCl. Кроме этого, текст метки данных выделяется полужирным шрифтом и метка располагается над точкой данных. Резюме В Excel предоставляются простые способы программного создания ссылки на диаграм­ му или лист диаграммы. Объект Chart является членом коллекции Charts в пределах книги. При работе со встроенной диаграммой необходимо помнить, что объект Chart хранится в объекте ChartObj ect, который принадлежит коллекции ChartObj ects, при­ надлежащей листу. Положением и размером встроенной диаграммы можно управлять с помощью свойств Тор, Left, Width и Height объекта ChartObj ect. Если ссылка на объект Chart уже получена, ссылку на объект ChartObj ect можно получить с помощью свойства Parent объекта Chart. Отдельные ряды на диаграмме хранятся в виде объектов Series. Объекты рядов принадлежат объекту SeriesCollection, который хранится в объекте диаграммы. Ме­ тод Delete объекта Series позволяет удалять ряды на диаграмме . Метод NewSeries объекта SeriesCollectionдaeт возможность создавать новые ряды. Свойству Value объекта Series можно присваивать массивы VBA, а не объекты Range. При этом создается диаграмма, не зависящая от данных на листе. Такая диаграм­ ма может распространяться без исходного листа с данными. Свойства Values и XValues возвращают значения данных, а не ссылки на диапазо­ ны с данными диаграммы. Для получения ссылки на диапазон с данными можно обра­ титься к функции SERIES, которая хранится в свойстве Forrnula каждого ряда: Точка данных на диаграмме является объектом Point и принадлежит коллекции Points объекта Series. В пользовательском интерфейсе Excel не предоставляются спо­ собы связывания значения ячейки с меткой точки данных. Но такие связи могут созда­ ваться с помощью кода VВА.
Файлы и папки Office Большинство рассматривавшихся в этой книге объектов доступны в объектной модели Excel. Это не единственная объектная модель, которая используется при написании кода на Excel VВА. Несколько объектных моделей (или библиотек типов) автоматически связыва­ ются с каждым проектом Excel VBA. Список этих библиотек предоставляется в раскрываю­ щемся списке в окне Object Browser (Просмотр объектов) или в окне, появляющемся по команде меню ToolsqReferences (Сервис<>Ссылки) в редакторе VВЕ. Существующие ссылки можно определить по установленному флажку напротив названия библиотеки. В списке перечислены библиотеки Excel, VВА, Office, OLE Automation и Forms (если в приложении используются диалоговые окна UserForm) . Для подключения дополнитель­ ных библиотек необходимо установить соответствующие флажки в диалоговом окне, дос­ тупном по команде Toolsq·References (СервисqСсылки). Этот процесс рассматривался в предыдущих главах, например · в главе 14. Объектная модель Office доступна всем приложениям из состава Mici-osoft Office. В ней содержатся объекты, используемые во всех приложениях Office. Одним из таких объектов является CornmandBar, который будет рассмотрен в следующей главе . В этой же главе рассматриваются два объекта, доступные в объектной модели Office и применяе­ мые для поиска, .открытия и сохранения файлов, и связанные с ними сво йства: О FileSearch о FoundFiles о PropertyTests о FileTypes о SearchScopes о ScopeFolders о SearchFolders
548 Глава 25 О FileDialog О FileDialogFilters О FileDialogSelecteditems Объект FileSearch впервые появился в пакете Office 97 и с выходом Office ХР был значительно улучшен. Этот объект позволяет выполнять поиск файлов по большому .ко­ личеству критериев, например по типу, размеру, расположению и времени последней модификации. Объект Fi leSearch добавляет имена файлов в колл~кцию FoundFi les. Объект FileSearch можно использовать для операций над группами файлов вместо функции VВА Dir. Например, этот объект позволяет обнаруживать файлы определенного возраста и удалять или перемещать их в архивный ката;~:ог. Кроме этого, oбъeктFireSearch полезен при получении данных из нескольких связанных файлов. Например, файлы, нахо­ дящиеся в каталоге, имя которого начинается с имени клиента, можно консолидировать в один общий файл. · Объект FileDialog появился только в Office ХР. Этот объект позволяет выводить диалоговые окна Открыть файл (Open File) и Сохранить файл как (Save File As), а также предоставляет обозреватель для поиска файлов. Объект FileDialog является более мощ­ ной версией методов GetOpenFileName и GetSaveAsFileName объекта Application, который доступен во всех версиях Excel, поддерживающих язык VВА, но недоступен в других приложениях Office. Так как объект FileDialog входит в объектную библиотеку Office, он доступен всем приложениям Office ХР. Объект FileSearch Следующий код выполняет поиск файлов Excel в каталоге С: \ Temp и всех его падка: талогах. \.oiJ~;г§п:-в~~1icTf··0 ·=: · ·· ·:".·." ·· <; "'··' / ' ~.· , :.... ''> · , ·.·'"·- - .- :. ·.•, • i· J;>ublic sub . FindclientE.xcelFiles () '· .. pim •FileNariie' As Variant ·' < ·' Dirri ' ' В6~ готовi,(').'~ Критерий ' поИска •Newsearchf · ~ . .• . · · · .L9ok;rn · ~· ··с: \теmр " ;sea.rchSubFoidi=rs . = True . F;ileType >9«· MsoFileTypeE)$;celWorkbooks :·LastModi fi<;!d = MsoLasi:Modified. riisoLastModifiedAnyTime count '= . : ExecU:te · • "тiоД!>ото'вит~· · те~.с~ сообщения !1<;!s_sage =;; format (Count, ;. ## #" ) Message = >'' Н.;з.йдено · фай:Лов: " & :Мessage For .: Each , fileName In . FoundFiles · · .. :• мessage ' =' Message • & vbCr & FileN~me N~x\:. FЧ~a.rne :•; , -. , ··. vbinformation)
Файлы и папки Office 549 В этом листинге для получения ссылки на объект Office. F i leSearch через свой­ ство Application . FileSearch ·используется конструкция Wi th . .. End Wi th. Зна­ чение свойства Appl ication . FileSearch можно присвоить локальной перемен;юй, но обычно это только добавляет лишние строки кода. После этого необходимо инициализировать критерий поиска. Обычно в качестве· критерия предоставляется информация о расположении файла, маска имени файла и ос­ тальные необходимые параметры . Свойство Lookin определяет подкаталог, в котором будет вестись поиск. Метод NewSearch очищает все свойства объекта FileSear c h , кроме свойства Lookin. Так как эти свойства сохраняют значения, пока открыто прило­ жение Excel, желательно явно указывать начало нового поиска с помощью метода NewSearch. Свойство SearchSubFolders управляет поиском в подкаталогах каталога, указанного в свойстве Lookin. Свойство FileType определяет расширения файлов , которые включаются в крите­ рий поиска. Константа msoFileTypeExcelWorkbook позволяет включить в критерий все расширения файлов Excel (.xls , .xlt, .xlm, .xlc и .xla). Ниже приводится таб­ лица с доступными константами. Константы тsoFileType MsoFileTypeAllFiles MsoFileTypeBinders MsoFileTypeCalendaritem MsoFileTypeContactitem MsoFileTypeCustom MsoFileTypeDatabases MsoFileTypeDataConnectionFiles MsoFileTypeDesignerFiles MsoFileTypeDocumentimagingFiles MsoFileTypeExcelWorkbooks MsoFileTypeJournalitem MsoFileTypeMailitem MsoFileTypeNoteitem MsoFileTypeOf f iceFiles MsoFileTypeOutlookitems MsoFileTypePhotoDrawFiles MsoFileTypePowerPointPresentations . MsoFileTypeProjectFiles MsoFileTypePuЬlisherFiles MsoFileTypeTaskitem MsoFileTypeTemplates MsoFileTypeVisioFiles MsoFileTypeWebPages MsoFileTypeWor dDocuments
550 Глава 25 Свойству LastModified можно присваивать следующие константы: Константы тsoLastModified MsoLastModif ied.AnyTime MsoLastModifiedLastMonth MsoLastModifiedLastWeek MsoLastModifiedThisMonth MsoLastModifiedThisWeek MsoLastModifiedToday MsoLastModifiedYesterday Вместо использования свойства FileType можно указать маску имени файла в свой­ стве FileName, например: Кроме этого, можно искать текст, содержащийся в свойствах файла или в теле файла. Для этого интересующий текст необходимо присвоить свойству TextOf Property объ­ екта Fi l eSearch. Свойство FoundFiles Метод Execute объекта FileSearch выполняет поиск и добавляет в коллекцию FoundFiles объекты, представляющие найденные файлы . Кроме этого, методЕхесutе возвращает количество найденных файлов. С помощью коллекции FoundFiles можно получить доступ к именам и пут:и найден­ ных файлов . В показанном ранее коде для обработки списка используете.Я цикл For Each. . . Next. Имя каждого файла добавляется в переменную Message. Между имена­ ми файлов вставляется символ возврата каретки. В результате работы этого кода выдает­ ся следующее диалоговое окно (рис. 25 . 1), фактическое содержимое которого будет от­ личаться в зависимости от файлов, хранящихся на компьютере. мicros~ft 'Ехсе1 . ~ ( _'; .;\ ; 2 .F~os Found ,,~:_· -~C:\Temp\Filese.Эfch.xls · C:\Temp\Mu~iSelect.xls Рис. 25.1 . Результат поиска файлов
Файлы и папки Office 551 Свойство PropertyTests В Office 97 и Office 2000 в диалоговом окне Файлс:::>Открыть (Filec:::>Open) предостав­ лялась кнопка Дополнительно (Advanced), щелчок на которой открывал диалоговое окно Расшире~ный поиск (Advanced Find) . В этом диалоговом окне указывался один или больше критериев поиска файлов. Коллекцию PropertyТests можно использовать в VВА для описания условий поиска, подобных условиям в диалоговом окне Расширенный поиск (Advanced Find). В Office ХР диалоговое окно Расширенный поиск (Advanced Find) было замещено командой Файлс:::>. Поиск (Filec:::>Seaгch), но даже в Office ХР можно использовать коллек­ цию PropertyTests из кода VBA. Следующая процедура ищет файлы Exc el, размер которых превыш ает 5000 байт (новый код выделен полужирным шрифтом). !'Publlc .$U:i:; :Pi ildE~rg'ecП erit.Exce1F:l1 es-.(}''".- c"";<'·'·- ,., . .Ьirn .Filer_arne As yar~ant· ·. - Dim Message As String Dim ·]: As :Long · • Diin coiJ.nt 'Лs Lqng · · ' · .:Newsearch ;. .. . Lookin = "с: \ WINDQWS ·~-, . Search.SubFolders . - =•' True For .I = .Cqunt. то 1· Step -1 .:. • Reinove I .I t<;'';. . ~< Name ': ·= "Files of ·Туре", Conditi·on: =msoConditionFileТypeExcelWorkhooks · , '. , "}"~ . " - ·F orrnat (Coun t , "##'#") "Найдено файл~в : " & ,,.м~ssage '. For Each ·pileNarne ' I n " FoundFil es ( Mes$age ;,= Mes sage & vl;>Cr: & F i'I eNaщe. Next 'Fil'eName ' · ~ 1., Erfd With•' ,.'. ~~4 ~е-~~э. ,
552 Глава 25 Коллекция PropertyTests работает независимо от параметров в диалоговом окне Расширенный поиск (Advanced Find). Она не распознает условия из этого диалогового окна и не меняет его установленные параметры. Условия в коллекции PropertyTests сохраняются до вызова мeтoдaNewSearch. Метод Add коллекции PropertyТests добавляет новые условия. Условия указываются через присвоение строки параметруNаmе. Строка имеет тот же формат, который использу­ ется в раскрывающемся списке Свойство (Pгoperty) в диалоговом окне Расширенный поиск (Advanced Find). Первым добавляется условие "Файлы типа". Это еще один способ указать, что необходимо искать файлы Excel. Для этого пapaмeтpyCondition присваива­ ет~я соответствующая константа. Список доступных к~шстант слишком велик, чтобы при­ водить его здесь. Те.хнология InterlliSense обеспечивает автоматический ввод кон­ стант при редактировании кода, а названия констант говорят сами за себя. Непри!lтной особенностью колл~кции PropertyТests является при~;rятое по умолча­ нию условие, которое определяется при запуске Excel и после вызова метода NewSearch. В этом условии параметр "Файлы типа" определяется кaкrnsoFileTypeOfficeFiles. Та­ ким образом, желательно очистить коллекцию до ввода новых условий, что позволит на­ чать поиск без дополнительных условий. Код в цикле For. . . Next удаляет элементы кол­ лекции в обратном порядке. Сначала удаляются элементы с наибольшим порядковым но­ мером. В противном случае при каждом удалении элемента менялись бы порядковые номе­ ра элементов коллекции. В качестве второго условия указывается параметр "Размер'', имеющий значение 5000 байт. Параметр Connector имеет значение rnsoConnectorAnd. Это значение параметра указывает соединение первого условия со вторым с помощью ло­ гического оператора And. Кроме этого, можно использовать значение rnsoConnectorOr. Полный список доступных значений параметра приводится в приложении В. 'Е~лf1 ,n;~и t11~'пЬльзо'~i!~ии Office 97 и~и Office 2000 · вместо значе;ия msoconnectoX:Ancl' ' ук~З~ть зtia'4i=111-1e msoConnecto :r;Or, интерпретатор VBA аварийно завершит рабоrу 1.~ :со­ об~ен~ем ' 015,;оwИб~е. Как " обычно, в этом сообщении не содержИтся полезной, ин, · . маU,ИИ, ~/1'!(,~воля~Ш.гй определить ГJРИ';!ИНУ проблемь1. А проблема в ТО/'('; что у~л .•· "~айri.ьi•.~Ип~~· 'нещ.зя комбинировать с Другими условиями с помоЩью . лоrи~ескот9 · оnе~.;1~ pe1topa -".6.е; Есhй поАытаться это сДеiiать вручную в Диал9г~вом окне · Р.асшир~н1;1ый · ~-1,- ·и_ - . -- --- - ·.··- r .>f .. , . _- _ _ д._ _ -' -<· J'. •'П9ИC?K'(Advai:iced. Find), . будет вьiдано понятное сообщение . о невозмо>1_<ност.и ·такой ,.к9N\" .·бинаЦИи. ЕсЛИi ~аруШИтЬ ЭТО . правило . в bffice ХР, ошибка не ВОЗНИ!\Нет' НО для nоnучения+ '•. ре~ульуат~ необходИмо ·и~полрзовать' оnератор And. Помните об эт.ом. , t> ,, ~- "-J," ,. .~.>,"~- "., ,_ •.•., •• -~-~ • , • Коллекция FileTypes В Office 97 и Office 2000 можно указать только одно значение свойства FileType объекта FileSearch. В Office ХР предоставляется коллекция FileTypes, позволяющая определить несколько условий для типов файлов. Следующий код для Office ХР находит все файлы Excel и Wo1·d в указанных каталогах: iRiiЫ Гc:-.sц'Щj.<'JЪc1ciientExce1Ai1dwo'ic!F~· 1-e;,· {) r>} DiЩ:' FileNarfie As Variant . .. Vi> '' pirii мess"цg~ ' :rl.s :;>tr;inQ' bim ~_I<A.sif~Lprig : ~:-: ·.·' >", ·· · ,iЦt ' c.ount l\s ;1. Lohg · ·. A~plic~tion·~- Fi leSearch '{ NewSearch · ·.
· -..F ' i i eт y p e ;,• msoF'I1eТyp'eE:xceiwork:books· ~· . FileTypes.Add msoFileTypeWordDocuments .· Lookin = "С: \WINDOWS" f .SearchSUЬFolders = True .'. ·. LastModified = msol..astModifiedAnyтime ·., Count = .Execute = Format(Count, "###") = "найдено файлов: ·~ & · " For Each FileName In .FoundFilщ3 Message = Message & vbCr & FileName Next FileName Файлы и папки Office 553 k С.~ 11 MsgBox(f:!ess age , vbinformation) ' ~{ End With ~;, ~En;d Sub Колл~кция FileTypes сохраняется до вызова: метода NewSearch. Этот метод очи­ щает коллекцию и добавляет значение msoFileTypeOfficeFiles, но очистка коллек­ ции перед добавлением новых записей не требуется. Если свойствуFilеТуре присвоить значение, все существующие записи в коллекции FileTypes удаляются и значение свой­ ства Fi leType становится единственным элементом коллекции FileTypes. После это ­ го для добавления элементов коллекции можно использовать метод Add. Для этого при­ меняются те же константы типов файлов, которые были показаны ранее. Коллекция SearchScopes Во всех показанных ранее фрагментах кода предполагается, что структура каталогов на компьютере известна и разработчик может указать список каталогов, в которых необ­ ходимо искать интересующие файлы. Но что, если структура неизвестна и ее необходимо выяснить? Эта функциональность может потребоваться каждому приложению, которое должно работать на любом компьютере. Коллекция SearchScopes впервые появилась в Office ХР и предоставила механизм для выяснения структуры каталогов . Следующий код рассматривает каждый элемент кол­ лекции, представляющий собой объект SearchScqpe. rP'U::Ьii'c~ 'suЬ'- L'istsearc:hsco'P~oьj ёcts,) · · ~ • Dirri S_earchScope . As Se'archScope [, · Dim Message As String !· For Еаёh SearchScope· In ~- Message = Message & ~' Message · = Message & " Туре=" & 1 Next SearchScope i: Call мsgBox(Message, vЫnformation) Этот код выдаст следующее окно сообщения (рис. 25.2). Объекты SearchScope представляют рассматриваемую структуру. Свойство Туре по­ зволяет идентифицировать категорию каждой структуры. Совершенно не удивляет присут­ ствие папок Мой компьютер (Му Computeг) и Сетевое окружение (Netwoi-k Places).
554 Глава 25 г-- 'У """''""'~-----~~~ --~- ~- Microsoft Ехсе\ ~ r"1ой компьютер ' Туре=О Мое Сетевое окруженне Туре=2 Qutlook , Туре = ! Рш:. 25.2 . ОМасти 1юиС1Ш феи/лов В справочном руководстве приводятся следующие константы, представляющие воз­ можные значения типов: Константы тsoSearchln MsoSearchinCustom MsoSearchinMyComputer MsoSearchinMyNetworkP l aces MsoSearchinOut l ook Добавление и удаление членов коллекции SearchScopes не поддерживается. Скорее всего, тип Custom будет использоваться в будущих разработках. Свойство ScopeFolder Каждый объект SearchScope имеет свойство ScopeFolder, в котором содержится ссылка на объект ScopeFolder. Объект ScopeFold~r описывает верхний уровень структуры. В показанном ранее ,коде свойство Name объекта ScopeFolder содержит описание соответствующей структуры. Внутри объекта ScopeFolder, представляющего верхний уровень структуры, хра­ нится коллекция ScopeFolders, содержащая дополнительные объекты ScopeFolder. Следующий код выводит значения свойств Name и P ath объектов ScopeFol~er под объектом ScopeFol der каждой структуры:
Файлы и папки Office 555 В результате работы кода (при отсутствии подключения к сети) выдается следующее диалоговое окно (рис . 25.3). ~Ой компьютер Диск З, 5 (А:) Path=A:\ Гюка/iьный диск (С :) . Path=C:\ .Общ11е; до_~ументы Path-C:\Documents and Settings\AI Users\Documen.ts ДокумеНты • Leschinsky Oleg Path=C:\Documero,ts and 5ettings\Leschinsky Ol~i<\My_l)octJments . СD·дискоеод(0:). ' Path=D:\ · Ехсе1200ЗVВА на ." Main\hel<;je\work\ Translatlons\di.olektil<.o " (У:) . Pal:h•Y:\ • ·;mages н~ "Main\helge\work\Transl.ations\dialektika\Excel200ЭVВA' (Z:) Path=Z:\ . ' Мое сете&ое окружение helge на main server .{Samьa· 3.0.10 -Deblan) (t'1ain) helge на maln server (Samba з.О.11-DеЫаn) (Maln) ·helge на mains erver (S~'mba З.0.1"fa - Deblan) .(Main) · homes на main server (SaffiЬa з:О.14а-ОеЬlзn) (Main) ·.,_ netlOQ:>n на main server (Sarnba 3.0.14a-DeЬian) (Main) ~·1он &еб-у3~. MSN P&h=l-il:tp:/lw~w.msnusers.com/ Path=\\Мoin\hel\>e Path=\\~lairi\heige 'Path=\\М•in\helge Path=\\МAIN\homes Path=\\МAIN\ne~ogon 1i1чные. Пanкi:i , Path=-щtlOok:\\Л111.:11ыe ~апкн lг~_og;::::JI Рис. 25.З. Структура каталогов, в которых будет выrwлнятьт поиск файлов Оператор Select Case предоставляет удобный способ изоляции и проверки каждой структуры верхнего уровня. Любая коллекция ScopeFolders верхнего уровня содержит объекты ScopeFolder, представляющие корневые каталоги доступных файловых структур. Каждый объект ScopeFolder содержит собственные коллекции ScopeFolders для описания собственных подкаталогов. Такая структура предоставляет механизм спуска по дереву каталогов. Коллекция SearchFolders Коллекция SearchFolders также появилась в объектной J1Одели с выходом Office ХР. Свойство Lookin объекта FileSearch определяет единственный каталог, в кото­ ром будет выполняться поиск. Свойству присваивается строковое представление пути к каталогу. Для определения дополнительных ~талогов, в которых будет выполняться поиск, используется коллекция SearchFolders. Для этого в коллекцию необходимо до­ бавить новые объекты ScopeFolder. В отличие от коллекции FileTypes, создаваемой заново при ус тановке свойства FileType, коллекция SearchFolders не меняется при установке свойства Lookin и при вызове метода NewSearch. Значение свойства Lookin используется совместно с элементами коллекции SearchFolders.
556 Глава 25 Так как коллекция SearchFolders сохраняет состояние на протяжении всего сеанса работы с Excel , желательно · очищать ее перед началом нового поиска. Следующий код выполняет поиск во всех подкаталогах корневого каталога диска С . При обнаружении ка­ талога, имя которого содержит строку "System32", этот каталог добавляется в коллекцию SearchFolders. SearchScope :A's searchScope ScopeFolder ' Af; scopeFolder su,.ЬFolder 11, s ', 'scopeFolder · i ic·~~i/ш. FHeSearch То1Step-1 Код очищает коллекцию SearchFolders и просматривает коллекцию Search- Scopes и коллекцию ScopeFolders, пока не обнаружит диск С. После этого просмат­ ривается свойство Name каждого объекта ScopeFolder из корневого каталога диска С. При этом код пытается найти каталоги , имя которых начинается со строки "SYSTEM32". Для обеспечения нечувствительного к регистру сравнения имена каталогов преобразо­ вываются в верхний регистр . После обнаружения подходящего каталога объект добавляется в коллекцию Search- F o l ders с пoмoщью · мeтoдaAddToSearchFolders объекта ScopeFolder. После этого код вызывает подпрограмму PerformSearch, которая показана ниже. Эта подпрограмма выводит имена файлов Excel , расположенных в каталоге SYSTEM32 : t~4"!31J.«s·:;:5μ15< 11e,rto'h!ise&rch 1у:- ~··· Dэ..m · Fil'eName ' . As Variant ·· Dim : м~s:9Jgce As '. string " ··:ьuflt'A:~ ьong · , ' ·':::->~' '
Файлы и папки Office 557 _, ; sea'rchsiiЬFOi'ders' = тri.ie -.FileName .= "*. . xlS'" . · · " :uas.tModified = rrisoLastModifiedAnyTiine coi.int. ·;,; t;- _ · Execute · ·'• Message = Format(Count, . Message• =,. "Найдено файлов: \." & k· •.. Each FileName In . ·FoundFiles &vbCr& Подпрограмма PerformSearch устанавливает свойство Lookin объекта File- Search равным строке нулевой длины , что позволяет избавиться от ссылок на каталоги, оставшИхся после предыдущего использования oбъeктaFileSearch. Объект FileDialog С выходом Office ХР разработчикам стал доступен объект FileDialog, позволяю­ щий коду VВА выводить диалоговые окна Файлс:>Открыть (Filec:>Open) и Файле:> Сохранить Как (File'=>SaveAs). Для этих же целей пользователи предыдущих версий Excel могут применить методы GetOpenFileName и GetSaveAsFileName oбъeктaApplica­ tion. Обратная совместимость с этой возможностью сохрщrяется и в Office 2003. Одним из преимуществ объекта FileDialog является дополнительная возможность просмотра отдельного списка каталогов. Кроме этого, объект FileDialog доступен во всех прило­ жениях Office. В данном примере создается лист, на котором выводятся изображения, выбранные пользователем в диалоговом окне Файле:> Открыть (File'=>Open) (рис. 25.4). На листе содержится элемент управления Рисунок (Image), доступный на панели ин­ струментов Элементы управления (Contгol Toolbox). Элементу управления присвоено имя "Imagel". Для автоматичес1юго изменения размеров изображения в соответствии с размерами элемента управления используется свойство PictureSizeMode (свойство устанавливается в значение zoom). Расположенная выше кнопка имеет принятое по умолчанию имя и надпись Select File. Модуль класса листа Sheetl содержит следующую процедуру обработки события:
558 Глава 25 Рис. 25. 4. Выбор изображепия с помощью диало гового окпа Открыть файл ~i>Jiva t:e· $~~ :c;sтrniiniiвU:t: FonJ:::c1 i с:к о~.- , -Dim Filter$ ·As F' il eDialogFil,ters ~ Diпi: Fi le:Name );'s ,striщГ ' ' • ir>~·,t;~ -~,,- ~"' :--:>:"'·(, ,;. -· Свойство FileDialog объекта Application возвращает ссылку на объект File- Dialogs. Тип диалогового окн а определяется следующими кoнcтaнтaмиmsoFileDia­ logType:
Константы MsoFileDialog MsoFileDialogFilePicker MsoFileDialogFolderPicker MsoFileDialogOpen MsoFileDialogSaveAs Коллекция FileDialogFilters ~ Файлы и папки Office 559 Свойство Filters объекта FileDialog возвращает ссылку на коллекцию FileDialog- Filters, хранящуюся внугри объекта FileDialog. Фильтры определяют типы файлов, отображаемых в списке. По умолчанию существует 24 предопределенных фильтра, которые пользователь может выбирать из раскрывающегося списка в нижней части диалогового окна Открыть файл (File Open). Метод Clear коллекции FileDialogFilters удаляет предо­ пределенные фильтры. После этого код добавляет один фильтр, позволяющий просматри­ вать список файлов . j pg. Метод Show объекта FileDialog выводит диалоговое окно. При щелчке на кнопке Открыть (Open) метод Show возвращает значение True. Если пользователь щелкает на кнопке Отмена (Cancel), метод Show возвращает значение False и работа процедуры завершается. Коллекция FileDialogSelectedltems На самом деле метод Show не открывает выбранный файл. Вместо этого имя и путь выбранного файла добавляются в коллекцию FileDialogSelecteditems. Как будет показано ниже, в диалоговом окне можно выбрать несколько файлов. В предыдущем примере пользова;ель мог выбирать только один файл. Имя файла извлекается из перво­ ~о элемента коллекции FileDialogSelecteditems, на которую ссылается свойство Selecteditems oбъeктaFileDialog. Функция LoadPicture присваивает файл свойству Picture элемента управления Image. Типы диалоговых окон Диалоговые окна различных типов практически ничем не отличаются, кроме заго­ ловка. В диалоговых окнах для выбора файлов и папок в заголовке отображается строка Поиск (Bгowse), а в остальных тип'1Х - строка Открыть файл (File Open) или Сохранить файл как (File Save As). Диалоговые окна всех типов, кроме окна выбора папок, отобража­ ют список файлов и каталогов. В окне выбора папок отображается только список каталогов. Метод Execute Как было показано ранее, метод Show выводит диалоговое окно FileDialog и выбран­ ные в диалоговом окне элементы добавляются в коллекцию FileDialogSelecteditems. Диалоговое окно не пытается открыть или сохранить файлы . МетодЕхесutе заставляет диа­ логовое окно выполнить необходимую операцию открытия или сохранения немедленно по­ сле щелчка на кнопке Открыть (Open) или Сохранить (Save), например:
5601 Глава 25 1~:гt.ь. : лpi)Tic&t:ion:.FiieD:i.a1og \xibi aiogoi:>eD.i ~.'~~.,, If . Show Then .Exe.cute E;9d·\Wi. t11 ' Свойство MultiSelect Показанное на рис. 25.5 приложение модифицировано для поддержки выбора не­ скольких файлов. Для этого необходимо удерживать клавиши <Shift> или <Ctгl> при щелчке на интересующих именах файлов . Выбранные имена файлов загружаются в рас­ крывающийся список ComЬoBoxl в верхней части экрана. После этого раскрывающийся список можно использовать для выбора и просмотра щrтересующего файла. Рис. 25.5. Въ1б1>J1 несколысих файлов из списка В код были внесены следующие модификации:
Файлы и папки Office 561 , а:tсь ,. ... .,. . .. f/ > cal'l :·:мsgBox('Eri. Description; IE:ii9:.:.sч}:)· , ;;:",.,)",;'.. :~;. ,·! }.. ,..:., ." Свойство AllowMultiSelect устанавливается в значение True. Раскрывающийся список очищается от существующих значений. После этого в цикле For Each . . . Next элементы коллекции FileDialogSelecteditems добавляются в раскрывающийся спи­ сок. При установке свойства Listindex в значение О возникает событие Change и проце ­ дура обработки события загружает первое изображение в элемент управления Irnage. Резюме Объекты FileSearch и FileDialog предоставляют разработчикам VBA удобные средства для создания кода работы с файлами. Так как эти объекты являются частью объ­ ектной модели Office, они доступны во всех приложениях Office . Объект FileSearch доступен со времен выхода Office 97 и во всех последних верси­ ях Windows. С выходом Office ХР этот объект был значительно улучшен. Объект File- Search позволяет находить файлы с общими характеристиками, например, с похожими именами или одинаковым расположением. Найденные файлы могут обрабатываться по­ следующим кодом.
Командные панели Коллекция Comrnand.Вars является членом объектной модели Office, рассматривае­ мой в приложении В. Эта коллекция содержит все меню, панели инструментов и контекст­ ные меню , уже встроенные в Excel и другие приложения Office, а также те, которые соз­ даются разработчиком . Для доступа к командным панелям используется свойство Com - mandBars oбъeктaApplication. Впервые командные панели появились в Office 97 . В Excel 5 и Excel 95 панели меню и панели инструментов были разными типами объектов. Контекстные или всплывающие меню, появляюrциеся при щелчке правой кнопкой мыши на ячейке листа, были специ ­ альным типом панели меню . В Excel 97 и в бол~е поздних версиях "командные панели" стали универсальным термином для описания панелей меню, панелей инструментов и контекстных меню . Командные панели содержат элементы управ.Ления (contro/,s). При щелчке некоторые эле­ менты управления выполняют операции, например Копирование (Сору). Эти элементы до более подробного их рас9,10трения назовем ~сомандами (commands). Существуют и другие элементы управления (например, Файл (File)), которые при щелчке на них создают новый набор элементов управления. Такие элементы управления называются меню (тепи). В данной главе рассматривается создание и управление этими инструментами. Панели инструментов, панели меню и всплывающие меню Ниже показано окно Excel, в верхней части которого расположена стандартная па­ нель меню Worksheet (рис . 26.1) .
564 Глава 26 Рис. 26.1. Панель .меню Worksheet В панели меню Worksheet содержатся такие меню, как Файл (File) и Правка (Edit). При щелчке на меню выводится дополнительный список команд и меню . О Пункты Вырезать (Cut) и Копировать (Сору) являются командами и расположе- ны в меню Пр~вка (Edit). О Пункт Очистить (Сlеаг) является примером меню внутри меню Правка (Edit). На рис . 26.2 показана панель инструментов Стандартная (Standaгd). В панелях инструментов хранятся элементы управления, которые запускают команды Excel. Например, кнопка с ножницами вызывает команду Вырезать (Cut). Кроме этого, в панелях инструментов хранятся элементы управления других типов, например раскры­ вающийс.Я список Масштаб (Zoom) (второй с конца панели инструментов Стандартная (Standaid) на рис . 26.2), позволяющий выбрать или ввести коэффициент масштабирования (в процентах). На некоторых панелях инструментов содержатся кнопки, щелчок на кото­ рых приводит к выводу меню, например кнопка Сводная таблица (PivotTaЬle) на панели инструментов Сводная таблица (PivotTaЫe) . стаидартная • х Рис. 26.2. Панель инструментов Стандартная
Командные панели 565 На рис . 26.3 показано контекстное меню, которое отображается при щелчке правой кнопкой мыши на ячейке листа. В этом контекстном меню содержатся команды, например Вставить (Paste), и меню, например Удалить (Delete) , для операций, которые допустимы в данном контексте (в данном случае, в ячейке). В Excel 2003 имеется примерно 124 разных встроенных командных панелей, содер­ жащих несколько тысяч элементов управления. Кроме этого , можно создавать собствен­ ные командные панели или исполрзовать существующие в соответствии с текущими по­ требностями. Для этоrо можно применить команду меню Виде::> Панели инструментов~ Настройка (Viewc::>:Гoolbarsc::>Customize) или выполнить программную настройку . ,. ~: ! ~обавить ячейI01". 11·····'·····•········ ····· ······· ··········'···········"··········"·'''····"" . • «i ' 1 ~ал11ть." ,j~ Очнстнть Все ·k __~ Оч11ст11Ть содерж11мое ".J ....... ..................."......."""""" ... ..." ····· ····+ ···· ····· ····· ····· ···· ·· +···· ·· ··! E;j~ ~бав нть '!"_меч___ан_н• ______ j ............... f ... ... .... .. . . .. . .. .. Wj Формат а.чеек ... ·.·.1 ·., Во!брать ~1З раскрывающегося списка.. ,_._ Добавить контрсльное ~начение _ , - Создать список, .. Е 21H..··.-··:····.·.·~···."·~····.·.·~···"d··:,~т·.··i··"· .·/.··:~·······~···L···~t1•··~··~·~.1 "!'~к;t~..cfar~~.__·:_:~.__·12!_'"к.__•:;:··.__ ·--:п; :р :; ; ;: :: : ;: ;; : :э п: :; ; ;: :'" 1;:,,:\·······'.··. ·········· ····· ,Ун · Рис. 26.З. Контекстное меню ячейки листа Практически всю настройку можно выполнить вручную, включая связывание ко­ мандных панелей с книгами , но некоторые операции выполняются только с помощью кода VВА. Например, VВА необходим для следующих операций: О автоматическое удаление или сокрытие командной панели при закрытии или де­ активизации соответствующей книги; О добавление собственного меню во встроенную панель меню при открытии книги и удаление меню при закрытии книги; О динамическое изменение командных панелей в ответ на действия пользователя; О использование некоторых элементов управления, которые могут создаваться и мо­ дифицироваться только из кода VВА. Другими словами , командные панели могут быть трех типов, а именно : меню, панель инструментов или контекстное меню. При создании командной панели с помощью VВА не­ обходимо указать тип создаваемой панели. Тип указывается в качестве параметра метода
566 Глава 26 Add коллекции CommandВars. Примеры таких параметров приводятся в следующей таб­ лице. Тип существующей командной панели определяется с помощью свойства Туре, кото­ рое возвращает числовое значение , равное одной из следующих встроенных констант. Константа MsoBarTypeNormal MsoBarTypeMenuBar MsoBarTypePopup Тип командной панели Панель инструментов Панель меню Контекстное меню Элементы управления на командных панелях также имеют свойство Туре, содержа­ щее одну из констант msoXXX. Чаще всего используется элемент управления, свойство Туре которого равно msoControlButton. Такой элемент управления используется для предоставления команд, например командь1 Копировать (Сору) в меню Правка (Edit) на панели меню Worksheet, или кнопки на панели инструментов, например кнопки Вырезать (Cut) на панели инструментов Стандартная (Standaгd). При щелчке такие элементы управления запускают макрос или встроенную операцию Excel. Второй по распространенности элемент управления имеет свойство Туре, равное msoControlPopup. Этот элемент управления соответствует меню на панели меню, на­ пример меню Правка (Edit) на панели меню Worksheet или меню, содержащемуся в дру­ гом меню, например подменю Очистить (Сlеаг) в меню Правка (Edit) на панели меню Worksheet. Такой элемент управления имеет собственную коллекцию Controls, в кото­ рую можно добавлять собственные элементы управления . Элементы управления имеют свойство Id. Свойство Id встроенных элементов управ­ ления определяет внутреннюю операцию , которая выполняется элементом управления . При создании собственного элемента управления для запуска макроса при щелчке на элементе управления имя макроса необходимо присвоить свойству OnAction. Все соз­ данные пользователем элементы управления имеют свойство Id, равное 1. Со многими встроенными пунктами меню и с большинством элементов упр_авления на встроенных панелях инструментов связано графическое изображение, которое опре­ деляется свойством Faceid. Свойства Faceid и Id встроенных команд обычно имеют одинаковые значения. Если известно конкретное числовое представление, значение свойства Faceid встроенного элемента управления мо .жно использовать при создании собственного Элемента управления. Для определения числового значения можно вос­ пользоваться VВА, как показано в следующем примере. Встроенные командные панели Excel Перед началом создания собственных командных панелей желательно определить, как структурированы встроенные командные панели и какие панели уже доступны в Excel 2003. Следующий код можно использовать для просмотра существующих и добавленных пользователем командных панелей . В результате выполнения этого кода в столбце А вы­ водится список всех командных панелей . В столбце В выводится содержимое коллекции Controls соответствующей командной панели (рис. 26.4). Этот код не пытается вьшо­ дить элементы управления более низкого уровня, принадлежащие таким элементам управления, как меню Файл (File) в панели меню Worksheet, поэтому процедура называ­ ется ListFirstLevelControls.
Командные панели 567 Кроме этого, макрос выводит значение свойства Id каждого элемента управления. Если для элемента управления существует графическое изображение, то оно появляется вместе со значением свойства Faceid. Обратите внимание, что некоторые показанные в списке элементы управления могут не отображаться на экране. Например, при отсут­ ствии почтовой системы не будет показана панель инструментов Стандартная (Standaгd) и кнопка Mail Recipient. Для тестирования кода добавьте подпрограмму в , стандартный модуль (не модуль класса). Не добавляйте код в модуль ThisWorkbook или модуль класса листа. Кроме это­ го, необходимо ввести показанную ниже функцию IsEmptyWorksheet. В приведенном примере обращает на себя внимание то, что практически во всех име­ нах элементов управления присутствует символ амперсанда. Амперсанд используется при разработке элемента управления для определения клавиши быстрого доступа к пункту . меню. Например, меню &File будет отображаться как File, но комбинация клавиш <:Alt+ F> может применяться для быстрог~ доступа к этому пункту меню. Рис. 26. 4. Вывод списка командных панелей и элементмв управления
568 Глава 26 Показанный ниже код позволяет просматривать список элементов управления перво­ го уровня: ~suь·: LiStF.ir'St:L€Vё1ёvontr·o1s-т г- --" v" v· ·-" r- P" f Ьim cbCtl As CommandBarControl Dim· cbBar AsCommandвar Dim i As Integer , If Not . IsEmptyWorksheet(ActiveSheet) Then Exit Sub o"n Error. Reslime. Next Application. Scree.nUpdating = False Cells (1, .. 1) .Value "Командная панель" Cells (1, 2). Value "Элемент управления" Cells(l, 3).Value " F.aceID" : Cells(l, ·4) .Value "ID" Cells(l, i ·) <_ Resize(l,4) .Font.вoTd True i=2 · For ·Each. cbBar In CommandВars ·A pp lica tion. Sta tusBar = "Обрабатывается · cbBar . Name cells(i, 1) . Value = cbвar.Name ч..i+1 For EachcbCtl In cbBar.Controls Cells(i, 2) .Value = cbCtl.Caption cbCt.l. CopyFace If Err.NumЬer = О Then ActiveSheet.Paste Cells(i, 3) · Cells(i, 3) .Value = cbCtl.FaceID End If Cells (i, · 4) .Value = cbCtl. . ID Err:Clear i=i+1 Next cbCtl ,>,Ne,xtcbBar .. . . Range. ( "А:В") .EntireColumn.AutoFit Application.StatusBar = False i EЧd•.§ug, , . . .•..~= ,, . Сначала подпрограмма ListFirstLevelControls проверяет содержимое листа с помощью показанной ниже функции IsEmptyWorksheet . Для дальнейшей работы ко­ да лист должен быть пустым. После этого оператор On Error Resume Next использу­ ется для защиты от ошибок времени выполнения при попытке доступа к несуществую­ щим изображениям. Во внешнем цикле For Each. . . Next переменной cbBar при­ сваивается ссылка на каждую командную панель. После этого значение свойства Name командной панели выводится в строке состояния (для демонстрации текущего с~стояния задачи) и копируется в текущую строку столбца А (текущая строка определяется пере­ менной-счетчиком i). Внутренний цикл For Each . . . Next обрабатывает все элементы управления в ко­ мандной панели cbBar: Значение свойства Capti.on каждого элемента управления вы­ водится в столбце В. После этого код пытается использовать метод CopyFace элемента управления для копирования изображения элемента управления в буфер обмена. Если
Командные панели 569 операция копирования не приводит к появлению ошибки, изображение вставляется в столбец С и в этой же ячейке выводится значение свойства Faceid. Значение свойства I d элемента управления выводится в столбце D. После этого код удаляет все сообщения об ошибках, увеличивает значение переменной i на единицу и переходит к обработке следующего элемента управления. Показанная ниже функция IsEmptyWorksheet проверяет, является ли предостав ­ ленный в качестве параметра объект Sht на самом деле листом. Если это так, функция проверяет, равно ли О количество ячеек в использованном диапазоне. Если оба условия вьfполняются, функция возвращает значение True. В противном случае функция выдает предупреждение и возвращает принятое по умолчанию значение F аlsе. ·· u,ъ.c:t:Tori rsБffi'ptyworkshee t' (sli:t° ' As оь':i еёt.) '.As · 130·а1еаi::?"'У:.к· " rf TypeName{Sht) = . "Worksheet" Then . · · . Jf Wor)<sheetFunction.CountA(Sht. UsedRarige) · · IsE:mptyWorksheet ·= тrue · Exi t Fцщ:tion "End If ridIf. . иsgвох · "Активизируйте пустой лист " [J?:ri.<i f':,μ~<;: ,t :\. qr,i_ ~ .•. Элементы управления любого уровня вложенности В следующем примере (рис. 26.5) показанные выше подпрограммы используются бо­ лее активно. Поиск вложенных элементов управления выполняется по отношению ко всем обнаруженным элементам управления. Некоторые элементы управления, например, содержащие графические изображения , не могут быть показаны более подробно. Ин­ формация о вложенных элементах управления приводится со смещением вправо. Код может выводить информацию об элементах управления на всех существующих уровнях вложенности, iю Excel не использует элементы управления с уровнем вложенности больше трех. Следующий код позволяет просматривать список элементов управления на всех уров' нях вложенности: (:Suь~ ·Lls~A.1:i.coritr'61s <) Di щ " cbBar As CommandBar Dim R~g As Range ~ Diпi cbCtl · As CommandBa.rControl :Not IsEmptyWorksheet {ActiveSheet) Then Exi.t Sub Application . ScreenUpdating = False Set Rng = :Range { "Al") Each cbBar In Appllcation.CommandBars Application.StatusBar = "Обрабатывается панель " & cbBar . Name ' ;Rng '. Value = cbBar. Name' · For Басh cbCtl In FbBar.Control s Set Rng Rng. Offset (ListControl.s {cbCtl, Rng) ) Next cbCtl Next cbBar Rarige( "А: I") . EntireColumn.AutoFit Application . StatusBar Fa l se Sμb
570 Глава 26 Рис. 26.5 . Вывод информации об элементах управления ~юбого уровня вложенности Подпрограмма ListAllControls перебирает коллекцию CommandBars. Текущая ячейка в столбце А отслеживается с помощью переменной Rng. Имя текущей командной панели от0бражается в строке состояния. Кроме того , оно выводится в ячейке, на кото­ рую указывает переменная Rng. После этого подпрограмма перебирает все элементы управления в пределах текущего объекта CommandBar. Для этого используется показан ­ ная ниже функции ListControls . В главе 14 рассматривалось полfrение списка командных панелей в редакторе VВЕ. Для этого достаточно изменить строку на строку w&~g:a:s:s;;cвa,7-rд;}.J)i?J~f:~tioл:vвi{: 'tommanaвai',:~г'·~"""':":f":_:·:,,-~~л~~~·;;;и:i~ Функция ListControls предоставляет дополнительную информацию о каждом элементе управления и каждом вложенном элементе управления . Информация об эле­ ментах управления выводится на листе начиная с ячейки, на которую указывает пере­ менная Rng. В результате функция ListControls возвращает количество строк инфор­ мации об элементах управления. Переменная lOffset используется для вычисления нового значения .Rng, в соответствии с которым будет выводиться информация об эле­ ментах управления на следующей командной панели.
U:i1'C:tiori'ii LI§fcon·н·01s ·cc;ьct:1 As · c6mmandв arc·on:t:roi ; · ' У~азыв~е~ на •текущУю · отроку относитеЛьно Rng iI(j,offse.t As' Long ·...• ·· .. . · · · ~\Ком'андная па:нель, хранящаяся . в cpCtl i~ c~lS~b Лs Coпunand~arControl -~ . в~fo;,· ~~~ume '·Nex.t ; Of.fset. = О". ,. · . n9) 6Н:se~(lOffset, 1) .Value ·= Командные панели 571 ! ~g. Offset ( lOffset ' 2) . Valtie = cbCtl. Туре :о . ..... ~; ,~. ··· nоiщт·атъся скопИровать · 1,1иктограмму элеме~т·а УriрёJ.вления; ~ · :, )!е , вс':таr;~'Лять изображенИе, еслИ коirиров;знИе прИJзело к f,}~~ :О; о~~--6~}~~ (::~~: :~. ·> · -·. _ ~,\~- ·,,; f/ cbc.t;r : ~opyFace •. ,, ,. ~•. '. I СEir ;Nuriilier ·.= · QThen . . ., . ~ь·· ,, A9Чy;es):le~~-.Pa~t·e RniJ.Offset(lOffset, 3) , !!'"' '· Rng.Offset>(lOffset, 3) .Va,lue - cbCtl.Fa.ceid · r .Eбci ir{ ,.. .. ,.·. r,. t'\.: ·,:. 'Пр9цшить .· т1,ш . элем.:нта уr:~равления ~ $~lect • ('a·s ·e · cbCtl, Туре .~.··.•·_(' case<i, . 2 ; ·4;- . б, 7, 13. • is , •.· ·, · Ничего · н:е .делать д!lя· эти х эл .ементов ' управления · >:с ,. ·ca :s e Else ' Ее.Ли текущий элемент управления содержит . другие ·~ ·• Э.Лементы управления·, вызыват.Ь функцию рекурсивно For Each. ctlSub In cbCtl.Controls lOffset = l:Offset + · • t;istCQntrOls(ctlSub, Rng.Offset(lOffset, 2)) . > Next ct).,Sub ·· с . i'i Ч. Of:fset ,;;, lOffset - ·1 ~ EnC( ,s-elect ~ч~~-;~~6~i~~~~~ =-- ~~~~s-~-t -+ 1 Функция ListControls является рекурсивной . Она вызывает сама себя столько раз, сколько существует вложенных уровней элементов управления. Пере1'н~н:ная lOffset используется для определения текущей строки, в которую записывается информация об элементе управления. Данный код очень напоминает код функции ListFirstLevel- Controls. При этом функция записывает тип элемента управления, а также надпись, пиктограмму и идентификатор пиктограммы. Большинство элементов управления име­ ют следующие типы: О 1 - msoControlButton; О 10 - msoControlPopup. Но иногда встречаются элементы управления других типов: О 2 - msoControlEdit; О 4 - msoControlComЬoBox; О 6 - msoControlSplitDropdown; О 7 - msoControlOCXDropdown; О 13 - msoControlSpl i tBut tonPopup; О 18-msoControlGrid.
572 Глава 26 Для отказа от просмотра списка элементов управления в ситуациях, где это не имеет смысла, используется конструкция Select Case. При обнаружении элемента управления с вложенными элементами функция List- Controls вызывает сама себя, передавая в качестве значения параметра Rng текущее значение Rng плюс значение переменной lOffset. Кроме этого, текущая точка ввода смещается на два столбца вправо . Функция ListControls продолжает вызывать сама себя, пока не доберется до самого нижнего уровня вложенности . После этого функция продолжает обрабатывать более верхние уровни элементов управления . При каждом вы­ зове функция возвращает количество строк, записанных относительноRng. Идентификаторы Faceld Нижеприв.еденный код позволяет получить таблицу со списком пиктограмм встроен­ ных элементов управления (рис. 26.6). В Office 97 присутствует около 3500 пиктограмм. В Office 2000 предоставляется 5500 пиктограмм, в Office 2002 - 7000 пиктограмм, а в Of- fice 2003 - 10000 пиктограмм. Обратите внимание , что многие значения Facei d соот­ ветствуют пустой пиктограмме. Кроме этого, некоторые пиктограммы повторяются с увеличением значения Faceid. Рис. 26.6 . Пиктограммы встроенных эле.ментов управления Следующий код позволяет вывести список в~ех пиктограмм встроенных элементов управления: },;иь· '.L i'sE.д.IiF'aC'esl ? · Dim·т• As Integ er ' Отслеживает ''текущее. ··Значение FaceTd, , Pim j As Int.e ger · ·, от·слежи вае т т екущий ст ОJ1бец ли ста ·. ; Pim~..~A~ . :I:!lt:§!g~f;": ,: oj;_c:rr~ЖJ.1:B.Ci~'E .'I'е~::хщую СТР.9К.У. J1ИС,та ..~ ' ·~.Cд;Y:,,i.L'.
Командные панели 573 cbBar As CornrnaridBar If 0Not IsEmptyWorkshe~t(Active'Sheet) :on. · Бr r o r GoTo :Recover Applicaj:ion.ScreenUpdating = ' False ' ;Создать временную командную панель С · единст riенной . ' кнопкой для хранения пиктограммы, кооr,орая_ · б;t,('ет . /::~оnирована.. ~e~a·~g~~; . CornrnandBars ,.I\dd ( Posi tion: =msoвarFl'~~i:~g, _ . '·· . MenuBar: = Fa.lse, _ "' ·temporary: =True) .. · cbBar.Controls.Add(Type:=msoContro1Button ~ · · temporary:=True) . j=1То1:0 i=i+1 ' Appl ic:Э.tion.StatusBar = "FaceID = " & i ' · ' Назначить ·кнопке текущий Faceid .; cbCtl. Faceid = i ·' '. Попытаться tко.пироват.ь и;;>ображение. Cja лист cbCtl .CopyFace Ac tiveSheet.Paste Cells(k, j + 1) Cells (k, j) . Va.lue = i ' Разрешить обработку сообщений Windows DoEvents Nextj' k=k+1 ' Разрешить обработку сообщений Windows DoEvents Loop . Application.StatusBar "Всего э'9ементов -" & i !Recover: < I f Err . Number = 1ОО4 Then Resume Nex.t . Applicatio~.StatusBar =· False . [ cbBar. Delete l~ц.d,_Sub · 9б р~ rи те '.внимание, ч;о в этом коде ~спользуется две команды ~oEvents. При это~ Exc~I . возвр ащает · управление и позволяет обрабать1вать стандартные сообщения операционной . системы Windo ws. Без ЭТИХ. 'команд окно Excel выглядело бы завИсшим, хотя на самом де­ ле 13 это время Excel обрабатывает с;войства Fac.eid. В процессе работы этого кода в .строке состояния Excel .будет выводиться счетчик обработанных элементов' управления. Функция ListAllFaces создает временную панель ин струментов cbBar. Для этого применяется метод Add коллекции CommandBars. Созданная панель инструментов объ­ является как: О временная (Temporary), а значит, она будет удалена при завершении сеанса рабо­ ты в Excel, если не была удалена ранее; О плавающая (Floating), а не зафиксированная возле края экрана или выполнен­ ная в виде всплывающего меню; О не панель меню (cbBar является панелью инструментов).
574 Глава 26 На панель инструментов cbBar с помощью метода Add ко;vrекции Controls добавляется временный элемент управления, который присваивается объектной переменной сЬСt l. Цикл Do. . . Loop продолжает перебор элементов, пока не останется действитель­ ных значений Facei d. Цикл Do ... Loop увеличивает счетчик на k , которое представля­ ет номера строк на листе. Для каждой строки значение j меняется от 1 до 10. Перемен­ ная j описывает столбцы листа. Значение-переменной i увеличивается на единицу на ка­ ждой итерации цикла For. . . Next. Значение переменной i соответствует значению свойства Faceid. Свойству Faceid элемента управления cbCtl присваивается значение i. Полученная пиктограмма копируется на лист. Некоторые элементы управления имеют пустую пиктограмму, а некоторые пикто­ граммы просто отсутствуют. Пустые пиктограммы. копируются без ошибок, а отсут­ ствующие приводят к появлению ошибки 1004. При появлении этой оiпибки код перехо­ дит к обработке ошибки по метке Recover. Если номер ошибки 1004, код продолжает выполнение после оператора, который привел к появлению сообщения об ошибке. В ре­ зультате останется пустая ячейка для хранения изображения пиктограммы, а код перебе­ рет все значения свойства Faceid, допустимые в данной версии Office. Выбор последне­ го значения свойства Facei d приводит к появлению ошибки с номером -2147467259. После этого код очищает строку состояния, удаляет временную командную панель и за­ вершает свою работу. П9луче~ная в. Последних. трех 'np'1Mepax 11нформаЦ'1Я не . докумеНТ';!рована комnан~е~ .Micro- ., soft. "'Эт~ ·Данны~ 'ок.аз1;>1ваt9тся очень ценнь\МИ пр.н мdД11ф11ка'Ц11И .су,Щ~ствуюЩi1Х' стр,уктур и ловер.ениЯ командн~:,1х па,нел~й. Кроме .того, Эта ,11нформац~iя м9жет '1споль:Зова;ься в кас Ч~\ВЕ{ справочника П,О .П}1КТОГраммам встроеннь1х·· элементов управления. ,В• надстройке: ' CBLis't . xla'содер~~тсЯ .код этой книги, nозвоnяющий прос:fо, генерировать эти CriИCKl.f. ' • ... .• . ". . i;-_ / Создание новых меню Если пользователю необходимо предоставить дополнительную функциональность без удаления стандар_тных команд, в существующую панель меню Worksheet можно добавить новое меню. На рис. 26 .7 показано новое меню Custom, расr:юложенное между меню Окно (Window) и Справка (Help). Рис. 26. 7. Добавление нового меню
С ;'' ·1,"'·~···· ."On.Ac~tlon· = "·showDataForm" 1' End . With ' · .Controls.Add(Type:;,msocontrolButton) Caption = '"& P:r::int Data List· " .OnAction" = "PrintDataList" End wi,th· · · . With .Controls.Add(TyPe:=ms~Control:Вutton) . Caption =· "Sort ·· Names &Ascepding" , . BeginGroup = True . . OnAction . = . "SortList" , . . Parameter = "Asc" ;;•',:;, Бnd" wi th . ' Wi th·, . ·tont:i;-o ls .' A dd (Туре: =msoControlBut ton) ·' ... Cq .ption' ,,; '' Sort Names &Deвcending" ~. OnAction ;,, "SortList" - : Parameter - "Dsc ·~ ; End With, End .With ' •• !J?I1:<:l.".9.cЧ~,..,-· ..~--~· Командные панели 575 . . Подпрограмма AddCustornмenu создает объектную переменную cbWSMenuBar, ко- торая ссылается на панель меню Worksheet. Если меню необходимо разместить перед существующими меню, нужно знать их порядковый номер. В данном примере показано определение значения свойства Index элемента управления. Для добавления нового меню в подпрограмме AddCustornмenu используется метод Add коллекции Controls, принадлежащей панели меню. Свойству Туре присваивается значение msoControlPopup, что позволяет связывать с новым элементом управления другие элементы управления. Параметр Before позволя ет разместить новое меню пер ед существующим меню Справка (Help). Если не указать позицию меню, оно будет добавле­ но в конец панели меню. Свойству Caption нового меню присваивается значение &Custom. Символ &не отображается при выводе меню на экран, но указанный после него символ подчеркивается. Это значит, что для активизации меню с клавиатуры можно вос­ пользоваться комбинацией клавиш <Alt+C>. После этого с помощью метода Add коллекции Controls нового меню в него добавля­ ются команды. Все команды имеют тип msoControlButton, что позволяет связать макрос с любой командой. Свойству Caption каждой команды присваивается соответствующее значение (учитывая комбинации клавиш, выделяемые с помощью символа&) . Свойству OnActiori каждой команды присваивается имя запускаемого макроса. У первого пункта ме­ ню свойство BeginGroup устанавливается в значение True. Над этим пунктом выводится разделительная полоса, выделяющая элемент управления как начало Группы. Большинство команд сортировки имеют одинаковое значение свойстваОnАсt iоn. Для того чтобы отли­ чать команды, свойству Parameter при сваивается соответствующая текстовая строка. Свойство Parameter применяется для хранения текстового значения, а строка может ис­ пользоваться по-разному. В данном случае строка "А:к" используется для сортировки по воз­ растанию, а строка "Dsc" - для сортировки по убыванию. Как будет показано далее , процедура SortList применяет эти строки для определения необходимого порядка сортировки. Макрос OnAction Свойству OnAction пункта меню Show Data Form присваивается следующий макрос: fPrlvaf~ :-su:ь~sn6wData:F6rm1 j k , frnPersonal.Show \;Ел9 ~S..Ч.ь ~·
576 Глава 26 Эта подпрограмма выводит ту же форму данных, которая демонстрировалась в главе, посвященной диалоговым окнам UserForm. С пунктом меню Print Data List связывается следующий макрос: r:Private Sub ·PrintDataL1St () · ! Range ( "Databa.se" ) . PrintPreview :Er,i.d §ЧJ? .•.: " •-~~' "'· ,м,:: :. Подпрограмма PrintDataList включает предварительный просмотр списка, в ко­ тором пользователю предоставляется возможность напечатать список. С пунктом меню Sort связывается следующий макрос: iPriva tЁГsuf, sort.List ( }~ ."# 'Dim iAsc.Dsc As Integer r t Select· Case· .CornmandBars·., ActionControl. Parameter Case "Asc". iAscDsc · ·~ · xl]\scending. case "Dsc" • iAscDsc = xlpescend~ng ~ ED.d Select' ( Range .( "Database"). Sort Keyl: =Range ( "А2"), !Header: =xlYes LJfr,i.ci 5>21?,~-=-· Для получения ссылки на запустивший подпрограмму элемент управления командной панели используется свойство ActionControl коллекции CommandBars. Это свойство напоминает свойство Application. Caller, применяемое в пользовательских функци­ . ях для определения вызвавшего функцию объектаRаngе. Обладая информацией о вызвавшем объекте элемента управления , подпрограмма SortList может просмотреть значение свойства Parameter для получения дополни­ тельной информации . Ечш значение свойства Parameter равно "Asc" , подпрограмм а SortList выполняет сортировку в порядке возрастания . Если свойство Parame ter имеет значение "Dsc", подпрограмма выполняет сортировку в порядке убывания. Кроме этого, элементы управления имеют свойство Tag, используемое точно так же, как свой­ ство Parameter, и содержащее еще одну текстовую строку . Свойство Tag можliо приме­ нять в качестве альтернативы свойству Parameter. Кроме этого, в нем можно хранить вспомогательные данные. Передача значений параметров В . предыдущем примере свойство Parameter элемента управления использовалось для передачи информации в подпрограмму, связанную со свойством OnAction. Кроме этого, было показано, что для этих же целей можно применять свойство Tag. Если необ­ ходимо передавать более двух фрагментов информации, то лучше во спользоваться под­ программой, принимающей параметры. Предположим, необходимо передать три элемента данных, например, название про­ дукта, стоимость и цену. Такая подпрограмма может выглядеть следующим образом: [sub siIOWI>rO'd:uct(sNamё -:-.As 'strlng , ~ dcosE As . bouьie; dPrice лs ' riouble)' . , MsgBox "Продукт ,- "· .& sName & vbCrc. & - ·.... ,. :•стоимость: . "' ' & Format (dCost, • $0. 00 " ) & vbcr & 1 ''Цена : " & F ormat.(dPr ice, " ·$0' .оо")' · iщrьg.:§.чJi'-~v~~-· """'~·. ~. "'·"' ·· -~ .· ~ . ...~~,-:. . .....""'*~".)и, ..~.:." .. - : _ ,,, .А<>:: ..... ""·· " ._ "'"""'
Командные панели 577 Для запуска этой подпрограммы из элемента управления командной панели свойству OnAction элемента управления необходимо присвоить следующее значение: ( •:§'hqwP?="i;J"p:{i§t::~ '~]\l)pJji_:~ ,~, Все выражение заключается в одинарные кавычки. Любой строковый параметр в пре­ делах выражения заключается в двойные кавычки . Для присвоения этого выражения свой­ ству OnAction элемента управления, на который ссьurается объектная переменная Ctl, можно воспользоваться следующим кодом: '.GJ1;.Q,J1h~1::1..2.ii ', i: .: :~ ,~~i,i,§~J:'!:9<:1Y:~I;: "' :'Ai?r:JJ'~ ;:';;•;·:•~~;.~l~,;,d''C:~~ji\~,·i$i'7J'.;;;~:;~;1;:;2;;.:~Яiix1J:'c(~fi~~~~l11$1t!il Комбинация одинарных и двойных кавычек может оказаться сложной для воспри­ ятия. Вся строка заключается в двойные кавычки, поэтому внутренние двойные кавычки необходимо указывать дважды . Удаление меню Встроенные и собственные элементы управления можно удалять с помощью метода Delete. Следующая подпрограмма удаляет меню Custom: fJ?llbl·:l C~sиъ - R:e-iiюv'ecU'stoдiиeiiilT Г'\•ж"":r. .;: · · ' oim . cьwsM<?nuвar As cornтandвar Оператор On Error защищает от ситуации, когда меню уже удалено . ' ~~ ~#~~р~~а в~тр~~~ной ко~wан,цнЬd панели . ~ •h~рв6на~ал~~ , можнi:> Применить 'метод Res.E;t, . Если nольз9ватели моДИфиЦ' йлиi~с~9льзу,~т .к~Иги У1 надстройки, м~JiифицИруЮЩ~~~ко~а'tiдн· , nриМеf<!ени~:: этоr-о метода 'нежелательно, так к,а~ ~f~ модифи.~:ё! ., Следующую процедуру обработки события необходимо добавить в мoдyльThisWorkЬook. В результате меню Custom будет добавляться при открытии книги и удаляться при закрытии.
578 Глава 26 Создание панели инструментов Простую панель инструментов с кнопками и раскрывающимися списками можно соз­ дать вручную. Но существуют и более сложные элементы управления , например mso - ControlEdi t , msoControlDropdown и щsoControlComЬoBox, полноценное управле­ ние которыми возможно только с помощью кода VВА. В данном примере создается па­ нель инструментов с тремя элементами управления. Первый элемент управления имеет тип msoControlButton и запрашивает у пользо­ вателя ввод списка данных . Рис. 26.8. Элемешп управлепия msoControlВutton Второй элемент управления (рис . 26.9) имеет типmsoControlPopup и содержит два элемента управления msoControlButton. Третий элемент управления (рис. 26.10) имеет тип msoControlDropdown и обеспе­ чивает применение возможностиАutоFil ter к диапазону Department. Рис. 26. 9 . Элемепт управлепия msoControlPopup
Командные панели 579 -;·;· ·;·.;;·· ···о;;····· ··········· · .. ;~ех . .. ...... ~~~J'~r1'11~"! trvГ·[ls·-· · ,f' p.s.. Feehan, De bЬie j( il.S . Qe_~;;-~;,Ы~ii = ::: Jt _: :=: ~ · ·iis . f> .hi.•. 1 .d.s.•. .J.o.s i. •.... . х ...... ··+:,1,..:s:.c·. ; ·............ ...... Z_eJl, _ .f=<! . _ j !Y,1__ ,.. Berry,(;hery l I .. ··тs.··- Cheatham, Lisa :F !iS. ,.. Cii110~. The;esa :f' · il s .. ....... ., [)liriJёi,:вa~iri .. :f' ......... .. ] 1§ .. _ , 13 Lolfre do,~o nique ... ' F jl.S. .. .1А.. Seyller, s~~ ··· · У ·········· ···········is..... ............. + ' , ......;...... МF .... мк ·RD 15 Shetty, Uma ··· ·· ··· ··:F ·· ·1 1.s : ...1 ..0 .. Tag gan,Jeff ....... J.. IFvl :1S j.. ~S~L---~ f :; 17 Welte, Jo .................. )§ .; ·-·---· - ·· -- !- ····· ········ : .j !~ (>r~J:.s1~~yer ; !)onn3;F p.s . , , 19 Weis, Gordon _;м .]i_$. --·-···--·~· ····--··· -···•-· ··· ··· .~. i<;niJ~;~;; ·~: ;f;г -··: ...tis. •••• •" ••• ••• ••• •••••••••<••••••+···· 21 Patterson, Brian :м . ".1 . . .,s".~~" ;; ·•• ~: >1 \ !i~~riJJ}:iЧ?.Xn~~i~I Готово Рис. 26.10 . Элемент управле11Ш1 msoControlDropdown Для создания панели инструментов используется следующий код: : PuJ5r':t.C:§suБ~ c.r'eateтБ01ъ-a-r:1 '· · . ' · у.дап~ть существующую nанеЛь инструментов, ~\ ' ' ' которая · называ~т:сЯ:· Управление даннЬ~ми ьQР ?:tr,or ' Resщhe Next : . , ~' . . . .· . \) coЦII!lar\:dвars ( "УПР,авленИе дащ~ь~ми") . Delete [';:· r;;on· ~Erro:r: GoTo 'tO ' ,. ·. ·. ·' . 'i· l .... " ' ~- .Создать . новую пане.Ль инструментов .., , [: ' wi7h ,. CornщandBar s . Add (Naчie: ,f= '' Yl]'pa вл'еJ;iие' Д~ННЬ~ '") ~· · With .conti:'ols.Add(Type: .=ms9contr9lButton)_ r . .O;nAction = "ShowDaЧ1Form ~ ·. ., , '.• . . Faceid·= 264 . . . . . .TooltipText = "'Пока:За<:рь форму El]'d Wlth . ' . \ .. ~. ''' , With .Controls.Add(Type:=rnsoControlPopup) , ;~:"· .. · -. ,capti.on ;, "' С?рти:ровка" · ·· . , .· ._. . Too'ltipText = "Сортировка по убыванию или ' по Wi th: . Controis .Add (Туре: =msoControlButto'n) _ , Capt:ion = "Сортиров.ка -ho · ~F:a6eid,= 210 . ' , . 'OnA ctiqn = " SortList" . Par'ameter = "Asc" End With . . . With. . Controls : лdd (Туре: =rnsocontr61Button ) .. . Caption· := ;,Сортировка · по убыВаниЮ" · . ·Faceid; = 211 " . .OnAction ·= ."SortList" . Pararne ter . = .: "Dsc" ... · End 'with · End . With . . , With .cont rols.Add(Тype:=rnsocontrolDropdown) '""'"·- ·AC!<;l,It:eш_ "(A;Ll,)" • ~-' н
580 Глава 26 ' :A.dditem ·;;АЬ'; . Additern "CR" .Additem · ''DS" . AddI tem ': HR" · <.l\ddТ.tern ,;I.S." . Additern "MF" . Additern : ;'МК" ;}l.dditem ' "RD " . AdditeI!l "SL" ''~ ОЦАсtiоц, = '' Fil ·terDepartпient" . . TociltipText _: . "Выберите отдел" End With ·. · . Visible = rгrue rid · wi:th . . Создание самой панели инструментов не требует особых усилий. В подпрограмме CreateToolbar применяется методАdd коллекции CommandBars. Для всех параметров панели инструментов используются принятые по умолчанию значения (кроме значения поля N.ame). Первый элемент управления создается так же, как пункт меню. Для этого применяется метод Add коллекции Controls. Этому элементу управления присваивает­ ся макрос OnAction, значение свойства Faceid и всплывающая подсказка. Вторым создается элемент управления msoControlPopup. Это раскрывающийся список, в который заносятся коды отделов. Свойство OnAction этого элемента управле­ ния указывает на подпрограмму FilterDepartment. Кроме этого, элементу правления назначается всплывающая подсказка. После создания элемента управления свойству Vis iЫе присваивается значение True. Ниже показан код подпрограммы Fi l terDepartment. = False Элемент управления раскрывающегося списка имеет свойство List, представляющее собой массив элементов списка, и свойство Listindex, содержащее номер текущего элемента списка. Свойство ActionControl объекта CommandBars ссылается на актив­ ный в данный момент элемент управления и позвол'яет быстро получить доступ к свойст­ вам List и Listindex для определения необходимого кода отдела. Код используется в соответствующей операции AutoFilter. Если выбрать пункт (Все), свойство Auto- FilterMode родительского листа диапазона Database устанавливается в значение False. При этом будут удалены все раскрывающиеся списки Auto~ilter и показаны все скрытые строки. Желательно запускать подпрограмму CreateToolbar из процедуры обработки со­ бытия Workbook_Open, а удаление панели инструментов - из процедуры обработки события Workbook_BeforeClose. Если панель инструментов не удалить, она постоян­ но будет присутствовать в Excel. Поведение панели инструментов в пределах другой книги
Командные панели 581 не определено. Если к коллекции CommandBars обращаться непосредственно из проце­ дур обработки событий, ссылку необходимо квалифицировать с помощью названия oбъ­ eктa Appl icat ion: 'f,pi;>licj(i.ot1~,. f.9_Пl11!ё!rici!3~xsJ" УрраJ?!i~~и~ _,М~1:1ь~ ").,Q~~,;f~e Обычно созданная командная панель выводится в том месте, на которое указывает операционная система Windows. Для получения единообразного внешнего вида и указа­ ния точного положения новой командной панели можно воспользоваться соответствую­ щими вызовами Win32 API. Для этого в проект VBA придется вставить еще один модуль. Добавьте следующий оператор в новый модуль: :beciare Furict':гc;n:~ c;·e;t·sy.st:einМet:ilcsЗ 2 ':ць ·;;user32•· -: · · · "· · · · .·~·. ~·:~" · .. ... (Byyal " :r:чое.х.. ~s ,Loпg) А.е ke>чg=- · · · В операторе Declare определяется вызов GetSystemМetrics32, позволяющий по­ лучить размеры экрана в пунктах. Эта информация дает возможность определить цен­ тральную точку и вывести командную панель. Измените код командной панели следую· щим образом (в этом варианте используются вызовы Wiп32 API): PuЬlic Sub CreateToolbar() ' Удалить существующую панель инструментов, , ' которая называется Управление данными Оп Error Resurne Next CornrnaпdBars ("Управление данными") . Delete Оп Error GoTo О ' Создание ново й панели инструментов With CornrnaпdBars.Add(Narne : =" Yпpaв лeниe данными" ) Wi th .C ontrols . Add (Typ e: =msoCoпtrolButtoп) .ОпАсtiоп = "ShowDataForm " .Faceid = 264 . Tool tipText = " П оказать форму для данных " Епd With With .Coпtro ls .Add(Type : =ms oCoпtrolPopup) .Caption = " Сор т ировка" .TooltipText = "С ортировка по убыванию или по возрастанию " With . Controls.Add(Type:=rnsoCoпtrolButton) . Caption = " Сортировка п о возрастанию " . Faceid = 210 .OпAction = " SortList" .Pararneter = "Asc" End With With .Controls.Add(Type: =rns oControlButton) · . Caption = " Сортировка по убыванию " .Faceid = 21 1 .OnAction = " SortList" . Pararneter = "D sc " Епd With End With With .Controls.Add(Type:=rnsoControlDropdowп) . Addrtem " (Все) " .Additem " AD" .Additem "CR" .Addi tem " DS"' .Additem "HR" .Additem " ИС" "
582 Глава 26 .Addi tem "MF " .Addi tem "МК" .Additem "RD" .Additem " SL " .OnAction = "FilterDepartment" .TooltipText = "Выберите отдел" End With .VisiЫe = True End With · f5im '" lwidth. дs- i.oiig'~ • .,..... Dim lHeight As. Lщ1g lWidth = Module1.GetSystemМetrics32(0) lHeight = Module1.GetSystemМetrics32(1) With CoiтunandBars ( "Упра.вление данными") - , Position =·msoBarFloating · ·. Left.= lWidth: / 2 .Wicith/2 ··.Тор =.lHeight·' /2- . Height· / ·2 EndWith . ' . Ширина экрана в пунктах ·' Высота экрана в ~унктах f~nd Sub r В блоке кода определяются две переменные, используемые для хранения высоты и ши­ рины экрана. Для получения информации о высоте и ширине экрана используется вызов Win32 API GetSystemМetrics32 . Параметры функции позволяют получить разную ин­ формацию. Обл.адая информацией о размере экрана, можно произвести соответствующие вычисления и определить свойства командной панели для отображения на экране. Исполь­ зование API из кода VВА позволяет значительно расширить возможности интерпретатора. Контекстные меню Встроенные контекстные меню Excel выводятся в результат е работы подпрограммы ListF irstLevelControls, которая рассматривалась ранее в этой главе. Модифици­ рованная версия этой подпрограммы отображает список командных панелей типamso - BarTypePopup (рис. 26.11). · Ниже показан код для вывода списка контекстных меню . tsиъ Dim cbCtl As Co mma n dBarCo ntrol Dim cbBar As CommandBar Dim i As Integer If Not IsEmptyWorksh eet(ActiveSheet) Then Exit Sub On Error Resume Next Appl i cat i on.ScreenUpdat ing = False Ce~ls(1, 1) .Value " Командная пане л ь " Ce il s (l, 2) .Value " Элеме нт управления " Cell s (l, 3) .Va lue "Faceid" Cells(l, 4) . Value "ID" Cells(l, 1) .Resize(l, 4) .Font.Bold True i=2 For Each cbBar In CommandBars 'дpp i'l c aHon·:s Eat\isвar ~= "66i:>аб9т ка~ПанеЛИ ;; "ё&' cbвa:i:O: N'arne . I f cbBar , ТУРЕ? .i 7, insoBarTypePopup Then ·. · \:~l).s (~ "у,'1) _, V_g.lu,e ~ :; Фf><:ir."Name ""'· · · .(
Командные панели 583 Next cbBar Range ( " А:В"). EntireColumn.AutoFit Application.StatusBar = False End Sub В С D : .....: f.-''-"'""""""""""""-"==----·~-~.~.~.~-~.!..Y.~.P.~.~·~·~·~·~·~·· -· .. ... . . " " . . ." . ... . /а c~ ld .. . . . . .~.1.Р.. . . ... . ".. . ... . f ·~ } О&бновить данные- ·- ·- -· ------·-- .;:~1~~1~ ..}~I! .:::::··~·:~~~-:~·--~-:~·:·!.9~Р~~;-~~H:~~-~:~:~~!:·:~o~~E~:~P.:~~~·.o·~!.~8~.~:~:rp~~~~-;.;:~:.:..:. ;_-:···:j~$§_[·:::~:~···~~~~-$.Г . &([)ор" хлы : · ... .. 30.~?.4!. ; &Удалить по~е .о ..5.416 , !;416 , 957 t ........ 957 Г ·· ·· 957:· ······ 957 ' ................... ....... .... ..... .................."...... ..,.Лi~СТ1 ........... .. .. ......... .. ............... .. .. ····л·йёТ2 ......... ................... ............ ... ... ......···········~······ .•• .. 99··~5"77 :.,.·. 957!. ·· ···· ··· ·· ·957 ; ............ ... " .... ... ~n~f1COKЛ11CToi 9s7' 957' Сп&нсок m1СТов ·957' ·· ·· ·" 9s/ .:g~~~-~~~ ~:;~t~:""" " ......... ... .. ... .... ... .... . ............. . . , ::·::g~t l ..... ... 99~~5?77~·.' - ёп~,,~;;;; :;;;;~;.;0· ................. ..... ... " _ .·· · · ·· · · ···· ·· · · ." 957, '• .... 957' 957! · сп&исок л11стов 957 ' 9571 .. ... '' ······· 957t 9571 .::~.~-~-~-~-~-~--~-'1.~т~.~---·· . Сп&и сок л11с тов ······· ·с-п·&~с·о·к··;;~·ё·тов ····· · ·· ···· 957 :... .. 95ii ..... ............. ..................., ... 957' 95it ............................. ................ · Сn&исок Л11СТОВ .. ~~t1 ···· :ti .................,.............. ....... .......j.. ·--- ·'&в-Ь,~)ёзэ-т~ ··-···· ·· -------~JI. ·· ""_21 ··-·- -21 : ~:~~"-"'irii"-"·'~-- """".. _______ " ." ." "":. = :=~~ _::: .1э ··· ···· ···. :•.1~ ; Вст&ав11Ть · ~· ·· ·· ·· ··· ·22' . . :-~~ ~~:· ~~~: :: ·,;~}:~--~--~~-~--~· :· · ~~. .3~~~1 755"1 Лl!fiiZбiifi.?:lШr;i"J'·'·······················:::.·":...:.•~-"'J:<~'•~~~~~-~~~~j;f ···········~·1·~~il~ Рис. 26.11 . Список встроенных контекстных меню Excel Этот код практически ничем не отличается от кода подпрограммы List - FirstLevelControls . Отличается только первая структура If, которая заставляет подпрограмму обрабатывать только элементы управления msoBarTypePopup. Если рас­ ~:;мотреть список, полученный в результате работы подпрограммы ListPopups, можно
584 Глава 26 узнать распространенные контекстные меню . Например, в списке показаны контекстные меню Cel l , Row и Colwnns, соответствующие контекстным меню, появляющимся при щелчке правой кнопкой мыши на ячейке листа, номере строки и букве столбца. Присутствие двух экземпляров контекстных меню Cell, Row и Column может пока­ заться странным. Первый набор используется, когда лист находится в нормальном ре­ жиме , а второй - в режиме Page Break Preview. После идентификации контекстного меню с помощью VВА его можно модифициро­ вать для собственных задач . Например, на рис. 26.12 показано модифицИрованное кон­ текстное меню Се!!, в котором присутствует команда Очистить все (С!еаг All). ' ~ Копировать ~ Сп~,цнальная ест авка ... -----------------· Добав.ить ячейки ~аnить... 0""'1СТ11ТЬ ~се Добав11ть приме~анне Формат а.чеек ... Во_~брать из раскрывающегося списка". Добав.ить контрольное ~начение ~оздать список ... f; Гиперсс~лка. ,, fJ,! [!Of'ICK ." Рис. 26. 12 . Модифицированное контекстное меню Cell Для добавления элемента управления Очистить все (Clear All) используется следую- В начале выполнения подпрограммы AddShortCut переменной cbBar присваивает­ ся ссылка на командную панель Cel 1.
Командные панели 585 \ Если необходима ссылка на командную панель Cell, которая отображается в представ- лении Page Break в Excel 2003, можно воспользоваться свойством Index: [$:е t:' cJ3j3:~:J:-~:s':,:f~(jffiЖaj1ctj3,~~~ '()i г:·~: .. 'с? Если код должен быть совместим с другими версиями Office, то в данном случае необхо­ димо соблюдать осторожность. В Excel 2000 свойс~1ю Index командной панели Cell из пред­ ставления Page Break имеет значение 26, а в Excel 97 это же свойство имеет значеF1ие 24. Подпрограмма AddShortCut записывает свойство Index элемента управления Очистить содержимое (CleaJ: Contents) в переменную lTndex, что позволяет добавить но­ вый элемент управления перед элементом управления Очистить содержимое (Сlеаг Con- tents) . Для добавления нового элемента управления в командную панель cbBar в подпро­ грамме AddShortCut используется метод Add коллекции Controls. В качестве параметра метода передается значение свойства Id встроенного пункта меню ПравкаqОчиститьq Все (EditqCleaгq All) . Метод Add коллекции Controls позволяет указывать свойство Id встроенных команд . Значение свойства Id можно узнать с помощью подпрограммы ListAllControls . Значе­ ние свойства Id совпадает со значением свойства Faceid. Для пункта ПравкаqОчиститьq Все (EditqCleaгq All) свойство Id равно 1964. Встроенное свойство Caption добавленного элемента управления имеет значение "Все" ("All"), поэтому в пьдпрограмме AddShortCut значение свойства Caption меня­ ется на более понятное. Модифицированное контекстное меню Cell можно спокойно оставлять в коллекции ComrnandBars. Меню не связано с книгой и не зависит от доступа к макросам в пределах определенной книги. Отображение всплывающих командных панелей Если контекстное меню должно отображаться без щелчка правой кнопкой мыши на ячейке или диаграмме , то для его отображения можно воспользоваться несколькими ва­ риантами кода. Например, для отображения контекстного меню Cell можно воспользо­ ваться комбинацией клавиш <Ctгl+Shift+C>. Для этого применяется следующий код: ($Ub '~.::s·e?tShO~iECU f,'T') ·· / .r': ""~_.,.;~-~l ,'''., ,.; if.. '' Appl:ication IO nKey оi л +с", ''ShowCellShortcut'1• !' а·· ... ь·· ,'(· ., · ·· ../ · • ··· ..En ., ·su ..< .· , . .,. ,. . . l~rivate sub >ShowCellShortcui: О : ·· i.c. . .' . co rillnandBars C".Cell" ) .ShowPopup х: =0, :.,?μ_q.~_~e~fi"x~Lt~.д.~-~~:t~~~.~" ', Для отображения контекстного меню Cell в левом верхнем углу экрана в подпрограм­ ме ShowCellShortCut используется метод ShowPopup. Значения координат экранах и у пер едаются· методу в качестве параметров. Кроме этого , всплывающее меню можно по.irностью создать самостоятельно. Всплы­ вающее меню f (рис. 26 . 13) отображается при щелчке правой кнопкой мыши внутри диапазона Database. За пределами этого диапазона выводится обычное контекстное меню Cell.
586 Глава 26 Рис. 26.13 . Оrrwбражение собственного контекстного мен10 Для создания контекстного меню используется следующий код: . sць· мakei5oi:Jup , ... .. - · • ,~ ..,,,,,.. . wi th Commaч.dвai§'. ' A;dd 0(I4a11_\e :_= :·пat?J.. _ РОР,Щ:>" ' _P,osi tA.21::.l' :omsoBarPdpl,lJ?) With . Controls.Add(Type:=msoControlButton) . OnAction = " ShowData Form" .Face ID = 264 .Caption = "Форма данных " .TooltipText = "П оказать ' форму данных" End With Wi th . Controls. Add (Тур.е: =msoControlButton) .Caption = " Сортировать в порядке возрастания " . FaceID = 210 . OnAction = "SortList" . Parameter = "Asc " End With With .Controls.Add(Type:=msoControlButton) .Caption = " Сортировать в порядке убывания" .FaceID = 211 . OnAction = " SortList" .Parameter = "Ds c" End With End With End Sub Этот код напоминает код для создания меню и панели инструментов из предыдущих примеров. Разница заключается в том, что при создании контекстного меню с помощью метода Add коллекции CommandBars параметр Posi tion устанавливается в значение msoBarPopup. В данном случае свойство Name устанавливается в значение Da ta Popup. Для отображения контекстного меню можно воспользоваться следующей процедурой обработки события BeforeDouЬleClick, расположенной в модуле кода листа, в кото- · ром находится диапазон Database.
Командные панели 587 ii?r:i.va.t.ё . sиь ··.worкsl1eёt::__1зe·t0rёRI1JЫcII.ck. <в:fvai тarget л·s ·Range, · _ ···· t'· <•/ ·. •: , · '· .,' - '", . C,з.ncel As Вбо!еаn) f .. · . If N pt . Intersect (Range С '' Database"), Target) . Is . Nothing Then, !\:·,;. , Coпu:naridB?rs · ( "Data Popup" ). . ShowPopUJ? • ,.. ·. !.\<:;;1End.~i~.· c~l ' = :;rrue . " . "-' :·' > '. El}<:'J, $.t,i:J?. , ,;, « При щелчке правой кнопкой мыши на листе процедура обработки события проверяет попадание ячейки Target в диапазон Da tabase. Если ячейка находится в пределах диа­ пазона, подпрограмма выводит контекстное меню Data Popup и отменяет событие щелч­ ка правой кнопкой мыши. В противном случае отображается стандартное контекстное менюСеl l. Отключение командных панелей Командные панели имеют свойство EnaЬled и свойство VisiЫe. Если командная панель включена и не имеет тип msoBarTypePopup, она отображается в диалоговом ок­ не Сервис<=> Настройка (Tools<=>Custoшize). Если напротив командной панели в диалого­ вом окне СервисqНастройка (Tools<=>Ctistoшize) установлен флажок, панель отобража­ ется на экране. Если свойство EnaЫed не установлено в зщtчение True, установить свойство VisiЫe в значение True невозможно. Установка свойства VisiЫe командной панели типа mso- BarTypeNormal в значение False удалит панель с экрана. Установка свойства VisiDle панели меню Worksheet в значение False не работает. Excel рассматривает этот объект как осо\5ый случай и отображает его всегда вместе с активным листом. Единственным способом удалить с экрана меню Worksheet является установка свойства EnaЬled в значение Fa 1 se. Следующий код удаляет с экрана все видимые панели инструментов и панель меню Worksheet: :su:ь R.ёШo:VeтooiБarsдn.<з.work.sheeE~1eriU.вarЛ ·· ( , Dim cbBar As ComщandBar · ·. ·· Fo7 'Each cbBar In CommandBars .·, If cbBar . •EnaЫed .And cbBar. Туре !" cbBar. VisiЫe · False · ' End ·,if '-"' '- - ' Ne~.t cbBar.' , !. 'coI\UnandBars (: "Worksheet мenu ваr':). Ena:Ыed·' ' Applica:tion.Onкey ;·%- ,", "" ·· [~1}9,, §.110,.;,,;;;;·~ . -~ ",,-,,,:,;· . , ,,, ·~ • Результат работы кода показан ниже (рис. 26.14) . ~ hо~ледняя о~ерация 1/nоД~рограмме R~oveTQolba:f-sмdworkshk'etM~nuBa; откnю­ "'Чае~ .крмбйнацию кnав1'1ш <Alt+->, · наЖатие ко~орой при1юдит к от.ображению управ- . . ляющ~г~ меню окна . книги. !:ели не отключить Эту .к<:>мб11нацию· клавиш; пользователь см'6жет · обращатьсЯ к управляющему меню И, 11сn6Льзовать кЛ~в}!ЩИ уnравn'ения курсо- : ром. для медленного nоiвnенИЯ фантомной копии naн~n11 меню :worksh eet. ' ·· ' , ,. " ~'. ' ' , ~ '
588 Глава 26 Рис. 26.14 . Удале1tuе с экртш всех па1tелей u1tструмеитов и панели меюо Workslieet Для восстановления панели меню Worksheet и панелей инструментов Стандартная (Standard) и Форматирование (Foгmatting) можно воспользоваться следующим кодом. Предполагается, что свойство EnaЫed панелей Инструментов не установлено в значе­ ние False: ~su:ь-';:I~esforeifoБ1Ы:ti'sXnд.worksЪe e t:меП\lваr <у i:, )l Coiifu.i:i'ndBars' ("Worksheet мenu Bar"J .EnaЫed r-·,., _' App1ication.OnKey' "%-" r-"', -~; Corfu.pandB,ars ( ,; S):anda'rd" ·) . VisiЫe = True К , CommandBars{"Formatting") .Visible True f.E!.i4flJ ':!J?;.-;;,.._ .•:.""' "-~i""""·~·· - · :. ;,,,___,,...","' ·' ... True Отключение комбинации клавиш для доступа к диалоговому окну Настройка Если пользователям необходимо запретить доступ к собственным или встроенным командным панелям, можно ограничить доступ к диалоговому окну и панели инструмен­ тов Настройка (Customize). Следующий код должен быть сохранен в личной книге мак­ росов (Personal. xls). После этого он будет запускаться при каждом запуске Excel. В первой строке кода отключается пункт меню СервисqНастройка (ToolsqCustomize). Во второй строке отключается контекстное меню, которое отображается при щелчке пра~
Командные панели 589 вой · кнопкой мыши на командной панели. Кроме этого, отключается пункт меню Видq Панели инструментов (ViewqToolbai·s). Так как этот код находится в процедуре обработки . события книги, необходимо указывать ссылку на объект Application. Обратите внимание на синтаксис показанного кода. ~ данном случае элемент управ­ ления Сервис (Tools) в панели меню Worksheet рассматривается как отдельная команд­ ная nанель. Поиск в сгенерированном подпрограммой ListAllControls списке пока­ жет, что существует встроенная командная панель Menus . К элементам этой командной панели можно обращаться как к отдельным командным панелям. Командная панель Toolbar List появилась в Excel 97 Service Release. Эта командная панель не доступна в более ранней версии Excel 97 - это специальная скрытая панель. Как элемент командной панели Menus, панель ToolBar List не имеет соответствующего значения Index коллекции ComrnandBars, хотя к ней можно обращаться по имени (параметр Name). Если необходимо защитить некоторые командные панели, можно воспользоваться свойством Protect объекта командной панели. Следующий код включает все параметры защиты панели инструментов Стандартная (Standard). Константы для ненужных пара­ метров защиты можно не указывать: UЬ' ' :РrоЕ'е§Етз01ьа:r·с1 ·'. ··; . '· coЦirnandBa:ts ( "Standard" J • Protec.tion '·' ·.;·!:::,::::'?=·.~.;_р·"\~'·:~;;">;~'г:~::;.(·~:т;:::хт~:"'::<~~v:"~: ,Т?""";_,,~ = "mso'вiэ.rNocus:to;n-iie + msoBarNoRёsii:e• · Для отключения защиты воспользуйтесь следующим кодом: ~sи~·\t.Jif1'rof:.ёcEт361ьarTJ ;·.::··. · г .. ,,,,, : :. · · CommandBa:ts (," Standard") r~.n~..cf?l!J? ..: · · • Создание командных панелей на основе таблиц Профессиональные разработчики Excel редко создают панели инструментов и пунк­ ты меню по одному. Чаще всего ис;пользуется решение на основе таблиц, в результате ко­ торого в таблицу заносится информация о необходимых 1лементах и специальная под­ программа генерирует все элементы на основе этой информации. Такой подход значи­ тельно упрощает определение и проектирование командных панелей. Предположим, что созданное ранее в этой главе меню Custom необходимо создать с помощью нового метода. Сначала создайте таблицу с информацией о меню. Вставьте новый лист, переименуйте лист в MenuTaЫe и заттолните его, как показано на рис. 26.15 и рис. 26.16. На листе Data содержится база данных работников. Список данных будет использоваться для определения списка отделов.
590 Глава 26 ' Рис. 26.15. Создание .1t1еню 11а основе таблиц . ToolTip ,Parameter :Custom Menu 264 , 4 ~~- ~~"~~-1\f.!~~Iii~?.~i[gI~~i;.·:: .: .·:·";,. ::::;:.: ;.·:;.;.; ._ ;. _ _ _.;" --- ----· -,~;- готоео Рис. 26.16. Создание меню на основе таблиц На листе MenuTaЫe используются следующие столбцы: Столбец Название Описание А AppNBE Значение Арр заставляет подпрограмму добавлять пункт в меню Excel. Значение VBE заставляет подпрограмму добавлять пункт в меню редактора VBE . Код обработки пунктов меню VBE рас­ сматривался в главе 23 В CommaпdBar Имя командой панели верхнего уровня, в которую добавляется создаваемое меню. Эти имена извлекаются из листин га, который генерировался ранее в этой главе С Sub Coпtrol ID Номер ID встроенного всплывающего меню, с которым связыва- ется добавляемое меню. Например, 30002 является· идентифика­ тором всплывающего меню Файл (File) О. Туре Тип добавляемого элемента управления: 1 - нормальная кнопка, 10- контекстное меню и т. д. Эти значения соответствуют зна­ чениям констант msoControl . .. , показанным в окне Object Browser (Просмотр объектов) Е Captioп Текст пункта меню F Positioп ' Положение добавляемого пункта меню на командной панели . Ос- тавьте это поле пустым для добавления меню в конец панели G Begiп Group Значения True или False определяют добавление разделителя перед пунктом меню Н Builtlп ID Если добавляется встроенный пункт меню, в этом поле указыва­ ется идентификатор меню. Для собственных пунктов меню ис­ пользуется идентификатор 1
Столбец Название J к L N Procedure Faceld ToolTip Parameter Datalist Рорuр1-п Командные панели 591 Описание Имя подпрограммы, которая запускается при щелчке на пункте меню Идентификатор встроенной пиктограммы элемента управления, которая будет связана с добавляемым пунктом меню. Кроме это­ го, в данном поле может указываться имя изображения на листе, которое будет использоваться в качестве пиктограммы кнопки. Стандартная пиктограмма Создать (New) имеет идентифика- тор 18 Текст всплывающей подсказки для кнопки Строка, которая присваивается свойству Parameter создавае­ мого элемента управления Используется ТОЛ?КО для элементов управления, содержащих раскрывающиеся списки, например msoControlDropdown (тип 3) . В пьле содержится имя диапазона ячеек листа, которые называются DataList и содержат элементы создаваемого рас­ крывающегося списка При добавлении собственных контекстных меню значение этого поля используется в качестве заголовка контекстного меню. Можно добавлять любое количество уровней вложенности. Для этого необходимо добавить нужное количество столбцов. Код ав­ томатически определит дополнительные столбцы Так как лист MenuTaЫe будет часто использоваться в коде, желательно присвоить ему осмысленное имя, например shМenuTaЬle. Для этого найдите и выделите лист в окне Project Explorer (Окно проекта) в редакторе VВЕ и измените имя листа в окне Properties (Свойства). После этого в окне Project Explorer (Окно проекта) имя объекта будет вы­ глядеть как shMenuTaЫe (МепuТаЫе). Использование такого имени позволит обращать­ ся к листу непосредственно , как к об'ьекту . В результате следующие две строки будут эк­ вивалентны: !f5ePti:i:f"."l'r:i. ilt.~ тi:ll swor kьook: wcrrk Щie ёfs р;меnU:таЫе") .fii affie " ., }p.§!J.μ~ " rf~Чt: "?h!<IE!IlчT,ab}..e,r;rq.!fl=e ...· • " '" · •. . . . Лист DataLists должен быть переименован в shDataLists. Ниже показан код для создания меню на основе информации в таблице. Код должен находиться в новом модуле , которЪrй нaзывaeтcяmodSetupBars. В начале модуля определяется большое количество констант. Они соответствуют ка­ ждому столбцу таблицы меню и используются на протяжении всего кода. Если структура меню изменится, достаточно переименовать эти константы и не нужно будет искать "магические числа" по всему коду. [·'' kо~ ~та"fiтЬ!· дЛ.iГ (; ;_t; ()iJбЦов . _j:абЛИ'!.\ЬГ е:- о ПИс а:Ние14 командных П-а н ёЛей . "'"~· \Const . miTABLE:_APP_VBE As Integer 1 Const m,iTABLE_COMMANDBAR_NA,МE As Integer 2 !qonst miTABLE_CONTROL_ID А;з J;nteger 3 .const miTABLE_CONTROL_TYPE As Integer ·4 ~qonst miTAВLE_CONTROL_CAPTION As Integer 5 ;const · miTЛBLE_CONTROL_POSITION As . Integer 6 LC.OI_l§.i:..,i!iJ~~~=gol'!"."rR0~-9В:9UR .. ,,._~.§. :r:ri.t:€=э:e:i:;,, .~" '7,
592 Глава 26 rсоii~ :г::тrтлвLБ: coNт.Rocвuitтr& ~· р,:5 ±n:t:e9er ,_,s 1c6r1'§ 't '' miTABLE- CONTROL - PROC As Intege.r; 9 ~coils t ' miTABLE:::coNTROL= FACEID As Integer 1 о ~Cppst m~TABLE_CONTROL_TOOLTIP As Integer 11 •Const miTABLE CONT<ROL PARAМETER As Integer 1 2 . ic ,on,st m~TABLE:::coNTROL:::DATALIST As Integer 13 ~c.onst miTABLE_ POPUP _START As Integer 1 4 i; к~~fстанта д:Пя определения времени жИзни командной · панели ~: Е'сли установить эту константу в. значение Fa1.se, пользователи 1·: не пот~;:ряют допо.irнительные элементы управления, добавленные . ~· .на- ВёJ.ШУ командную панель . . . iconst mЬTEMPORARY As Boole.an т Fals e [,;· /' . «' . . ~;.i', tЛедующий" иДентификат~р приJiожения используе.тся для ~\(меНю , ·. чт? З.начительнq упрощает . их удаление \9.9.11§\; "J?~!Ч?PIP' !i§. ?1:.r.J,n.g , =_ "J,<?:.l:Jl. eJ?:i;jy~~coщman.<:J,fi?ri.з. '' Константа mЬTEMPORARY позволяет сделать изменения меню постоянными или вре· менными. Константа psAppID содержит строку идентификации, которую можно при­ сваивать свойству Tag создаваемых элементов управления . Такая идентификация значи­ тельно упрощает поиск и удаление элементов управления. Подпрограмма фактического создания меню вызывается из процедуры Auto_Open для книги или процедуры обработки событияWоrkЬооk_Ореn. f' 110дПiSoГ.PaММa: .·se~tuJ;JМeritis · · '" '·=· · ". .,. \" , f!азначение: ' ·· Добавляет · командные цанели, определенные Аисте shМen,uTaЬle · ub S~tUpMenus () Dim... rgRow As Range . Dim cbAllBar's As CommandВars cbBar . As CommandBar··· cbBtn As CommandBarControl . , iBu;iltJ;~ID As Iriteger, iPopUpCol. As Integer, vaData As Variant . 'Игнорировать ошибки в табщще оnределен~й . созданием. защищает от . Дублирования меню . . Перебрать .:все' строки таблицы генерации меню . oi .Each rgRpw In shМenuTaЬle .°Cells (1) . CurrentRegion. Rows . 1 · иГнорироват ·ь . строку с. загоЛовкаМи · · · г:f · rgRo.w,Row > ,, l Then ,· ' , Считать .· с троку в . массив со значениями . ячеек aData = rgRow.Value . . t,: "''~i, ФJ3CЭ:E =~ -:l:!2!h:i,л11 ~ =: . ~-··"=~·-· Для добавления меню в Excel и в редактор VВЕ может использоваться единая подпро­ гра~ма. Единственное различие заключается в применяемой коллекции CommandBars ( может использоваться коллекция VВЕ или Excel) . В данном примере кода не содержатся все необходимые элементы для создания меню в VBE. Дополнительные требования для создания таких меню рассматривались в главе 23.
Командные панели 593 t • -поЛУ:<~йть · f<:оЛ:лекцИЮ Бсёх ' командн:Ь!х ПанеJ~ёй '!ГvвЕ: или~ вх'сеГ ~, . . If vaData ( i ' miТАВLЕ_АРР_ VВЕ) = •. Vf3E :: Then .··.··· . Set cbAllBars Application·. VBE .CommandBars Els.e · · ;;; cbAllBa.rs Application. Cqп\mandJ:\ars ' Попытаться найти 11нтересующую командную ланелЬ ·, Set cbBar = cbAllBars. Item(vaData (1, ·miTABLE_COММANDBAR_NAМE)) ' Если панель не найдена, ее необходимо If"cbBar· Is Nothirig Then ' Set cbBar " cbAl lBars. Add (_ . Name: =vapata (1, miTABLE_COММANDBAR_NAМE) . ' ' temporary : =rilЬTEMPЩ<ARY) .. Если необходимо найти встроенное всплывающее меню, в которое будет добавляться элемент управления, можно выполнить рекурсивный поиск в коллекции CommandBars. Например, если нужно добавить пункт меню в меню Правкас::>Очистить (Editc::>C!eaг), можно ввести идентификатор меню Очисти ть (Clear) (30021) в столбец Sub Control ID . С другой стороны, в столбцы PopUp можно ввести одно или несколько имен элементов управления. Ввод Edit в разделе PopUp1 и Clear в PopUp2 позволяет добиться того же результата, что и ввод 30021 в поле Sub Control ID. Первый метод удобнее при добавле­ нии элементов управления в существующие меню . Второй метод используется при до­ бавлении элементов управления в создаваемые меню. ЕсЛи Значение' установЛено, . на йти встроенное всгiЛывающее ' меню (по ' идентификатору)' в которое будет добавляться . ' .элемент управления. Например, Worksheet Menu BarQEdit If Not IsEmpty(vaData(l, miTABLE_CONTROL _ID)) Then! Set· cbBar · = . cbBar.FindControl(ID:=vaData(l, '- · miTABLE_CONTROL_ ID)' Recursive: =True) .CommandBar End If ' Перебрать все имена в ст олб це Popu'p для перехода ' ло структуре меню' · For iPopUpCol = miTABLE_POPUP_ST.ARTTo UBound(vaData, 2) · Если значение установлено, .п'ерейти к следующему r ' всплывающему !;;!еню . f , If Not IsEmpty ( vaData ( l, Ц>o_pUpCol)) Then t Set cbBar = cbBar .Controls (vaData(l, ~~iPopUpCp1)) : commandВц_r · . . End If N.~xt ,;, При добавлении существующего элемента управления Excel значение свойства Id можно указать в столбце Bui ltln ID . Если элемент управления должен вызывать собствен­ ную процедуру, имя процедуры указывается в.поле Procedure: (".,_.,,...., . П6ЛуЧить . ИдёнтИФИка тор.'ДобавЛЯёмоГо . вс'т:Роённо:ГсГЭлемен.та ' ~ ' управления · . · ~ iBuiltinID = vaData(l, miTABLE_ CONTROL_ BUILTIN) i! ~~. ' Если иде·нтификатор не указан, сделать его равным 1, что " с;оответствует создаваемому элементу управления If iBuiltinID = о Then iBuiltinID = 1. .
594 Глава 26 IsEmpt'y( v abata (1, .. miTABLE_CONTROL_:PoSITION) j 6r -.. :. vaData(l, miTABLE_ CONTROL.:. ..POSITION) > - cbBar.Controls.Count Then · Set cbBtn = cbBar . Controls .Add' (Type: =vaData (1, _ miTABLE_CONТROL_TYPE), ID:=iBuiltinID, temporary: = mbTEMPORARY) set cbBtn cbBar.Controls.Add(Type:=vaData(l, miTABLE_ CONTROL_TYPE), ID: =iBuiltinID, temporary := mbTEMPORARY, _ before:=vaData(l, _ miTAВLE _CONTROL _ POSITION)) " Установить остальные с войства кнопки With cbBtn . . Caption = vaData(l, miTABLE_CONTROL _ CAPTION) . BeginGroup = vaData(l, miTABLE _ CONTROL_GROUP) с •• •••~.~ ••:л~OOJ.t..ipTe;>et .= y aData( 1, . miTABLE_:_C:()t'JTВ.()L_<r:Q()L.ТI_!') Можно использовать одну из стандартных пиктограмм Office (для этого необходимо указать значение Faceid) или предоставить собственное изображение, прим.еняемое в качестве пиктограммы. Для использования собственного изображения в столбце Faceid достаточно указать имя объекта Picture. ·· по:Пё ' F'acёid моЖет быть nустьiм, еслИ- кнопка · не содержит ' пиктограмы, может содержать "номер встроенной пиктограммы ' или может содержать имя объекта.на листе, в котором ' хранится и'зображен ие . .If Not IsEmpty(vaData(l, miTABLE _CONТROL_FACEID)) . Then If IsNumeric(vaData(l, miTAELE _ CONTROL_ FACEID)) Theμ ' ЧислоЕое· значение FaceID. Используем его. · . FaceJ;d = vaData (1, mi TABLE _ CON'f'ROL_FACEID) F;lse ' Текстовое значение FaceID, .по~тому копируем . ' иЗображение на кнопку . shМenuTaЬle.Shapes(vaData(l, miTABLE_ CONTROL_FAC:EID)) .CopyPicture .PasteFace i End Н ~.. ".; "" .E:Тl9:_=\:J~•.:. ..•. ... --~·""·· •."" •.. ;". )Келательно для всех своих пунктов меню устанавливать свойство, идентифицирую­ щее тот пункт, который создан разработчиком. Если для этого используется свойство Tag , для поиска всех своих пунктов меню можно применить метод FindControl объек­ та CornmandBars . При этом не нужно помни~ь, что и куда было добавлено. Этот метод поиска используется в процедуре RemoveMenus далее в этом модуле. г ' Устан оБИтЬ. свой ст во 'rag~ дЛя ИдентИ<J.)йк аЦии ·· соЗданного "-·, ' эле!-fента уnравления. · · · ' Таким образом созданный элемент управления можно '. найти даже в случае переиме~ювания или. перемещен,ия ' пользователем . .· · · · . . ',Гаg := ,psAppID ' . Установить свойство onA:ction элемен'та управления. ' Заключить " _имя : книги. в кавыч·ки, на случай, . если . имя . :. содержит 11робел1;>r. . . . . .· "_:ц :N2~~&&.1!12.!=Y, (yaD;:J,t(i (1 " !!1~.f'"!l!\LJ?~<:::9t-J.:Т:13(),L_PROC)) . треп
Командные панели 595 Если процедура ищет информацию в свойстве Parameter элемента управления, эта информация вводится в столбец Parameter: ' hрJ1св оить · Зна.·ченИе C:вoйc.тi3-Y ; I>ar~пleI'er.:.- ~"-"' " ... , If Not IsErnpty' (vaData (1, rniTABLE_CONTRЩ~pAR.дМETER).) Then , < Pararneter = vaData (1, lТ!iTA)3LE_CONTRbE.:_PAEд11ETER) . . , .,, '-""""''z..·~-~~cl. r.~ _, ~---~"""'--- .. · ' :.....~.,;.,...,.;;!;i,)~fi.~:.d't~:~1~J'~~ Для раскрывающегося списка список значений вводится на листе Datalists и списку присваивается имя. Имя можно ввести в столбце Datalist: ···· ""~ ; ~ внё ётИ ~сПИсок ' да.иных "FГ :Ра ёкр'ЬrБ'а.IОщИйБi ''·' сПй"ёок~ч·· ·~·~­ ·If Not · IsErnpty (vaData ( 1, rniTABLE_CONTJ3.0L2_DA'ГALIST)) For Ea:ch Rng In :shDatallsts ~ Raiige(vaJ:)ata(l', . . . rniTABLE_ CONTROL;_DATALisTJ} .A d ditern Rng,Value Next Rng . End If W,,:j.th После закрытия книги приложения необходимо запустить код, который удалит все добавленные меню. Некоторые разработчики используют вызов CommandBars. Reset, но при этом в командных панелях будут удалены все модификации. Более подходящим решением является поиск и удаление всех собственных пунктов меню и командных пане­ лей. Для этого требуется две подпрограммы . Первая удаляет все пункты меню из кон­ кретной коллекции CommandВars (поиск выполняется по значению свойства Tag): fPЪvate sub Removeм·enusFromБars (cbвais' As cornrnaridВ:a]:-s) =c ·· Dirn cbCtl As 'cornrnandBarControl ' ' Игt~орироватЬ · ошибки при удалении с.о,б,ственных пунктов · On Error Resurne · N.ext ' Исполь s·овать к<;>л.Л е кцию CornrnandBars" With c .bBars '· . . ' Найти объект CornrnandBarControl с нашим Set cbCtl. = . . FindContrQl (Tag: =psAppID) • • • ф "Выполнять . цикл, пока элемент Do Until cbCtl Is Nothing " " Удалить ' найде нный элемент cbCtl.Delete ~ Loop· · j. :End with [~nc::l~.§Y.11~,,c,,~."-~"""""'-~"""
596 Глава 26 Вторая подпрограмма вызывает первую для удаления пунктов меню из командных панелей Excel и ·VВЕ . Кроме этого, подпрограмма удаляет все добавленные командные панели, в которые пользователь не вставил собственные элементы управления: ~SU:Ь'· RemoveMenu s ( ' ,·· - . , ·_, . ·.· Dim . cbfзar As ·. Comm°;ndBar, " rgRow As Range~ stBarNarne i игнорирова.дь оиiибки пр.И удал ении пунктов . меню ' . и командных ланелей on Error Resurne · Next ,_ . ', . ' Удалять пункт~'·tункты ' ме'ню из созданных командных , ' Панелей Ехс'е], . и VBE ReinoveMenusFr6rnBars Application.CornrnandBars :RernoveMenusFro!:'?arsApp1ication.VBE:cornffiandBars • ~ • •. < < • ' Перебрать все строки таблицы г.енерации меню . For .Each rgRow. In shMenuTaЫe. Cel!s (1) .«::urrentJ' .e,gion. Rows .~ Игнорировать .строку · с заголовками "' I f..•rgRow, Row · > . 1 Then . stBarName rgRow. Cell sJl, · 1 . • . s et cbBar = Not.h;i.ng · _,/ ' Найти . командну:Ю • панель · в . vвЕ иди Ехсе1 . If rgRow. Cel!s (1 , . rniTABLE_APP _VВE). = "VВЕ" Then Set cbBar Applicat i ori.VBE"CornrnandBa,rs· (stBarNщne) ·Else ~- - _-- л. -.- • ,. -~ _·. - • Set cbBar End If Applicatipn.corn:rr\andBars(stBarNarne) \ ' Если кома,ндная: · панел~; найдена и не являетс,я · ' удалить · командную Панель " If Not cbBar Is Nothi1;lg Then If Not cbBar.Bu:l.ltin .Then УдаЛя_ть только · пусты;= командные · пQ.нелИ - ' подьзователь или другое приложение могли ' добавить щr · команднуiо Панель сОб(:ТВенные ' элементы уriравления . •If . cbl3ar:Controls.Count =О End If . End 'J:f . .EAdп . 'Next ~~nd $~)?..;..· Подnрограмму SetUpMenus необходимо запускать из подпрограммы Auto_Open или процедуры обработки события WorkЬook_Open, а подпрограмму RemoveMenus - из под­ программы Auto_Close или процедуры обработки события WorkЬook_BeforeClose. На этом этапе создан полный шаблон, котор'Ьrй может использоваться в качестве ос­ новы для любого приложения Excel (или применяться в обычной книге, в которой необ­ ходимо модифицировать струкТуру меню). В первой записи таблицы (рис . 26.15 и рис. 26.16) в панель меню Workbook добавля­ ется меню Custom. Вторая запись определяет пункт меню, который называется Show Data Form (рис. 26.17).
Командные панели 597 :worksheet Menu Ваг a-..::: -J;:...:t:1::..... · ···_ ··· ·_ ·_, · 'worksliёei мёПu вэг .s.. А~:ю wor:1<sьeetмeлu.Вac::.,_..____ .__ _ iJ' &Pnnt oaiaцst i Н ~ ~ •1 !\ MenuTabk,"{~J5_1([!:~~/ · <;;;·w··к ~~';;i · ~:~:!.ij Готово Рис. 26.17 . Добавляемые пунюпыменю 2 2. Таблицу можно расширить и добавить новые пункты меню, а также создать команд­ ные панели и элементы управления, как показано на рис . 26.1 8 и рис. 26.19. Е F \vo~ksh~ei Me~u в~г · Туре j Caption 1o!&custoni ·· 1 j&Show Data Form !Position .Begin Group • 9.... 1vvorksheet tv1ё~u ваг .... ............ ... i i~PГlniData List .. : 2, .. .. .. _ . . . . . ;worksheet Menu Ваг 1jSort Names &A~ceri ......................з..IR.LJ.E. . . .. . . . ........ •....... 1 ;~oгtt-Jarтi~~§.[)~~cs ( .. ........... .... ..... ... • . ... 1' 6 iY:'oJi<sh~etщn~ ва.г i 7 ]Manage Data • ·i;·...~- ·;··~;i\\ ~.~n~J~;~!~l.~:~~z:~i~:т-:::::~: !. __ _ _ ____ _ 10•&Show Data Foгm · .. .1 ";; --- - -- Jii;:,;ss"=.::::;;;:;:.· ?:г ГOTOS(I Рис. 26.18. Добавление пунюпов меню и элел~енто в управления J к • FacelD i тoo!Ti p ' Parameter '·· :cusiom мenu : ShowDataFoгm : 2.&iJ. ···· ·- ... '&PгintDataList ··· 4' .. .. i·· . j C~stom .: ' Custom SortList 6 1safiLisi . /;I~t~~~~~t~~г 'Asc · · ·- -· ---- - - - -- ---·· ·-·· -···· ·Iosc· ····-·-····-· -·-· ". <custom • • , fcu5iёffi • ·············· J ГOTOISO Рис. 26.19. Добавление пунюпов меню и элементов управления Следующие процедуры позволяют автоматизировать запуск этого кода при открытии и закрытии книги: гг·подriроГра'Мма ,~ illit o!::open =~- . -~·=w~·- '~ ·-·--··- · " -~--­ k Назначение : Добавление' меню и пунктов меню в приложение isub Auto_Open () · ~ SetUp~enus , , ~ Cornrna:ndBars ("Управление данными") : VisiЫe True tEnd , Sub · . f. • ; ПЬдпрсSграмма: Auto:_Close t' •~J,!азна}1.еви ~ :..;. . . У"дс~ля.ет ь.1~ню. и,. !lYI:IJ.<.т~ M~ljJO и ~ !lРИЛО)Ке}:!ИЯ, _
598 Глава 26 ~:Suь; ЛU.~o_close () · R.enюveMenus ;E;n,d Sul? Данные в строках со 2 по 6 таблицы MenuTaЫe позволяют создавать меню Custom (рис . 26.20), совпадающее с меню Custom , которое создавалось ранее в этой главе (кроме этого, добавлены несколько пиктограмм ) . р~ ~аН11 -~~~ ~ Встр~ .Фор~ С~с: л.~1е : ~::оtя~ ·0кНQ ~прм.!е~ ··-'""'~·'*"",~"..~,.,,._".. ...." .. ,.. .. .., ,_ • .• ::.· ~·- ~ ,. ~1 >hawD•t•Fo•m ~. ,~ ~!:::·:.:::. Г~~~' :Е~~!r~ : i:J~e -- ~ ---·· j~ , ~ -- -----1~~~~-. -~~ Joan .. ...... . .. ........... ... 371f: ' ;'f~Ч( МК Joh~ .............. .. 44j~ .. . .. . :If<L!E . l:J:3 . _ 4Э : м . JFl\.~:3E ........ Hf'< .. ... ~o]i:_ ... ,FA~S~ --- ~А_О 55 iF iTRUE ·SL ... . 42lм lтRUE RD , ......... ..... ~ТF .. :~~~$( HR 21J JALSE 'cR эв : F ...··············. [тRU E мк 43]М ___ 1T_f<UE ·i~F 41 iM .' FALSE MF зв;f: 'тRUE ... RD ге~ .............. ......45.,~ .. ·········· ······ 'FALSE. HR Готоrо Рис. 26.20 . Создание coбcmвe1t1tozo .л1еи10 В строках с 7 по 11 создается панель инструментов Управление да н ными, совпадаю­ щая с панелью инструментов, которая создавалась ранее . Данные для раскрывающегося списка отделов хранятся на листе Datalists (рис. 26.21 ). Выделенному диапазону при­ своено имя Departme nts. Строка 12 описывает пункт Очистить Все (Сlеаг All) в контекстном меню для ячейки листа. В строке 13 описывается добавление встроенного элемента управления Merge Across в меню Форматс:::> Строка (Fш-matc:::>Row) (рис. 26 .22). Хотя показанный выше код позволяет добавлять элементы в существующие контекст­ ные меню, он не в состоянии создавать новые контекстные меню . Для этого достаточно будет добавить несколько столбцов в таблицу и соответствую щим образом модифициро­ вать код. Эта методика оказывается достаточно гибкой для реализации всех возможных вариантов.
... .\...... . . ... ... .j.. ..... Командные панели 599 Рис. 26.21 . Список с данны.ми 'для раскры­ вающегося .меню ~4)'1 4З:М 40F ss :F 42м '·-···-···---'-··----- - _ 47.F ""2i"' F' __ ,_ __ _ 38F Рис. 26.22 . Добавление существующего эле.мента управления в .меню Резюме В этой главе рассматривалась структура командных панелей Ехсе! и было показано, как создавать: О списки пиктограмм встроенных элементов управления со свойствами Id и Faceid; О полные списки значений Face i d, которые доступны в данной версии Excel; О полный список элементов всплывающих меню.
600 Глава 26 Кроме этого, было показано , как создавать собственные командные панели, а также как добавлять в них элементы управления. Рассматривались различия между тремя типа­ ми командных панелей : панелями инструментов , панелями меню и всплывающими ме­ ню. Кроме того, были рассмотрены методы програм!v!но го создания этих типов команд­ ных панелей . Было пок.азано, как включать и отключать командные панели и элементы управления, ·а также как защищать командные панели, чтобы пользователи не могли вно­ сить изменения в их структуру. И наконец, было продемонстрировано, как создавать таблицы с определениями из­ менений в структуре объектов CormnandBar при открытии приложения . Этот подход по­ зволяет модифицировать меню и значительно упроща~т внесение изменений . .
С март-теги При вводе значения в ячейку листа Е~се! пытается интерпретировать введенный на­ бор символов в осмысленное значение. Интерпретация выполняется в соответствии со следующими правилами: О если запись содержит символы 0-9 и символ, который может являться разделите­ лем целой и дробной части или разделителем разрядов, данное значение можно использовать при расчетах; О если запись содержит символы 0-9 и разделитель даты, значение может являться датой и использоваться в расчетах (при этом подразумевается использование спе- циального формата ячейки); · О если ячейка получает значение #N/A, #Value ! и т.д., это ошибочное значение, которое будет распространено на все расчеты, ссылающиеся на эту ячейку; О если запись начинается с символа = , она может рассматриваться как формула, зна­ чение которой будет преобразовано в число; О если запись не соответству.ет ни одному из перечисленных критериев , это значе­ ние рассматривается как текстовая строка - то есть, случайный набор символов. В любом случае Ехсе! рассматривает введенное значение, как определенный тип дан­ ных - число, дату, формулу и т.д. Выбор определенного типа данных подразумевает со­ ответствующее множество типов поведения , операций и свойств (поведение и операции определяются компонентами этого типа). Например , все записи типа "Формула" имеют следующее поведение: О значение записи проверяется на наличие "синтаксических" ошибок, например, от­ сутст~ующие скобки и т.д.; О записи должны быть включены в дерево зависимости вычислений Ехсе! ;
602 Глава27 О должно вычисляться значение записи; О в ячейке должен отображаться результат вычисления, а не текст формулы. До выхода Excel 2002 правила определения типа ячейки, а также множество типов поведения и свойств были зафиксированы в коде Excel. Единственным способом расши­ рения распознавания типа было предварительное форматирование ячейки (для прину­ дительного определения конкретного типа) или подключение событий Worksheet_ Change, Worksheet_SelectionChange и Worksheet_ Calculate к соответствующим листам с последующей проверкой введенных, выделенных или измененных данных в процессе пересчета листа. Этот механизм был достаточно гром_оздким и не позволял просто реагировать на все варианты изменения содержимого ячейки листа. В Office ХР была предоставлена возможность создания смарт-тегов, которая позволя­ ла определять собственные "типы данных" (например, биржевые символы, имена фай­ лов, медицинские термины, номера компонентов и т.д.) и логику распознавания, застав­ ляющую Excel распознавать введенное значе'ние, как принадлежащее определенному ти­ пу данных. Кроме того, предоставлялась возможность определить список действий, ко­ торые могли выполняться над этим типом данных . После распознавания записи, как имеющей определенный тип данных, допустимые операции предоставлялись пользователю в виде всплывающего меню при наведении ука­ зателя мыши . Например, следующее меню предоставляется для биржевых символов, реализованных с помощью смарт-тегов (рис. 27.1). В данном случае сим~юл MSFT распо­ знается как биржевой символ компании Micгosoft. S1ock qt1ote оп MSH Моп eyCe1'itr·o .1I ·j~ Со111рш1у repo11 011 MSN Мо11еуСе11tг ·· ·{о -~ Rece11111ews 011 MSN Mo1teyCe"t1 ·01I :11 ;.~.· .Reinove tl1is $111011 Tag , '12 ) S!op Recog11izin9 "'MSFТ" @ ,~1 ..S.11м11 Tag Optio11s ... Р~- ·· Рис. 27.1. Операции, доступные для типа "биржевой символ" Для включения смарт-тегов в пределах книги выберите команду Сервис<=> Параметры автозамены (Tools<=>AutoCoпect Options), активизируйте вкладкуСмарт-теги (Sma1·tTags), установите флажок Пометить данные смарт-тегами (Label Data with SmaгtTags) и выбе­ рите установленный механизм распознавания типов смарт-тегов . Компания Micгosoft предоставляет на своем сайте официальный инструментарИй разработки SmaгtTag Softwaгe Development Кit (SDK) для пакета Office ХР . Хотя инстру­ ментарий разработки может оказаться полезным, на момент написания книги для пакета Office 2003 такого инструментария разработки еще не существовало. Но в инструмента­ рии разработки для ОПiсе ХР предоставляется несколько инструментов, которые совмес ­ тимы с Office 2003 и могут использоваться для определения проблем и получения общего представления о процессе разработки смарт-тегов . Инструментарий доступен на сайте по aдpecyhttp://msdn . microsoft.com/office/ .
Смарт-теги 603 Улучшения в механизме смарт-тегов С выходом пакета Micгosoft Office 2003 в механизм смарт-тегов были внесены значи­ тельные улучшения, которые реализованы в виде новой библиотеки типов, используе­ мой совместно с библиотекой типов Office ХР. В результате и в Office ХР, и Office 2003 может применяться один и тот же механизм смарт-тегов. Перед использованием приме р а реализации механизма смарт-тегов рассмотрим некоторые улучшения, которые стали доступны с выходом Micгosoft Office 2003. Библиотека типов Microsoft SmartTags 2.0 Библиотека типов Micгosoft SшaгtTags 2 .0 сохраняет интерфейсы ISmartтagAci ton и ISmartTagRecognizer для обратной совместимости с Ofiice ХР . Кроме этих интер­ фейсов в библиотеке типов версии 2.0 предоставляются интерфейсы ISmartTagAci ton2 и ISmartTagRecognizer2. В них предоставляется больше функциональности и поддер­ живаются возможности смарт-тегов, доступные в пакете Micгosoft Ofiice 2003. Рассмотрим состав каждого интерфейса, а также описания существующих и новых элементов. О DisplayPropertyPage - метод вызывается при щелчке на кнопке Свойства (Configuгe) для настройки объекта SmartTag. Метод принимает параметры SmartTagID (типа Long) и LocaleID (типа Long) . Так как библиотека SшaгtTag DLL может содержать несколько объектов SmartTag, параметр SmartTagID по­ зволяет определить отображаемую страницу свойств. О PropertyPage - предназначенное только для чтения свойство, позволяющее приложению определить, поддерживает ли смарт-тег страницы свойств. Как и ме ­ тод 'DisplayPropertyPage, этот метод принимает параметры SmartTagID (типа Long) и LocaleID (типа Long). О Recognize2 - метод очень напоминает Recognize И принимает несколько до­ полнительных параметров, позволяющих упростить процесс распознавания тек­ ста. Метод Recognize2 принимает параметр TokenList (типа ISmartTagTo- kenList), который разбивает текст на отдельные слова. В результате разработчик освобождается от задачи разбора текста. О SmartTaginitialize - метод вызывается при загрузке смарт -тега и возвращает имя объекта вызывающему приложению. Интерфейс ISma rtTagActio"n2 содержит следующие определения: О InvokeVerb2 - этот метод выполняет ту же функцию, что и предыдущая версия, которая фактически выполняет операцию при выборе операции над объектом SmartTag. Разница между InvokeVerЬ2 и InvokeVerb заключается в том, что метод InvokeVe rЬ2 принимает дополнительный параметр LocaleID; О IsCaptionDynamic - этот метод определяет некоторые новые возможности объектов SmartTag в Office 2003. В пакете Office ХР все заголовки смарт-тегов были статическими и не менялись после определения. Метод IsCaptionDyrJ.amic позволяет определить, действительно ли заголовок является динамическим . Если это так, метод SmartTaginitialize вызывается при каждом вызове меню смарт­ тега. В результате заголовок можно будет менять на этапе выполнения;
604 Глава 27 О ShowSmartTagindicator - этот метод возвращает значение типа Boolean и определяет, выводится ли индикатор смарт·тега; О SmartTaginitialize - этот метод ничем не отличается от метода Smart- Taginitial i ze из интерфейса I SmartTagRecognizer2 , но он вызывается при загрузке компонентаАсtiоn объекта SmartTag; О VerbCaptionFromID2 - определяет каждый заголовок в меню действий объекта SmartTag. Этот метод позволяет создавать каскадные меню, использование кото­ рых показано на примере приложения. Если коротко, то новая библиотека типов предоставляет больше информации о ре­ гиональных параметрах и поддерживает новые возможности, например, каскадные ме­ ню, динамические меню и автоматический разбор текста . Теперь пришло время создать смарт-тег, который будет работать в Office ХР и Office 2003 и использовать несколько описанных выше новых возможностей. Смарт-тег FileName Введите следующий текст в ячейку листа: :c:\1i\~d.i_~\iR~ic~;ьmJ;!:·:·-"=~~::~- -;·_'""·~ ~·- ····с:·:-~:= ·· · В соответствии с правилами распознавания введенных данных это не число, не дата, не формула, не ошибочное значение и ни один из поддерживаемых в Excel типов. Эта последовательность символов для Excel выглЯ:диt случайной . Но для пользователей это - файл, возможно, файл изображения. Это имя файла, принадлежащее типу данных FileName . Если предположить, что эта последовательность символов обозначает имя файла, над именем файла можно выполнить несколько операций : О проверить существование файла; О переименовать файл ; О открыть файл в соответствующем приложении; О если это файл электронной таблицы, открыть его в том же или в новом экземпляре приложения Excel . Реализация смарт-тега FileName позволит: О расширить подпрограммы распознавания типов Excel для определения ячеек, со­ держащих имена файлов; О предоставить Excel список операций, которые могут выполняться над именами файлов (и над файлами) ; О предоставить код для выполнения операций . . Помнит.~ , что в .данном. -случ~е смарт-тег тестируется в Microsoft Excel, но erd тоЧно так ж~ мо~но 11с:nользовать в 8Word, Outlook, , PowerPoint 11 ·Access. ·· В тщете Microsoft . Offite Х~ смарт-теm. поддерживались. только ' в1•.Word, Excel 11 . Outlook. В Microsoft Office 2003 эfа ·~- возможность nоддерж~ваетс:я ' во всех· перечисленных ранее приложения)(. ••. ' ' '. -,/ ' 'У -~ -: - , '-.<. (. <·.. --_,
Смарт-теги 605 Структура объекта SmartTag Большинство объектов SmartTag состоит из трех компонентов: О уникального идентификатора типа данных (или нескольких идентификаторов не­ скольких типов в пределах одного oбъeктaSmartTag); О модуля класса, который выполняет распознавание, если весь введенный в ячейку текст Excel передает функции этого класса, связывающей ячейку с уникальным идентификатором, и если ячейка проходит условие проверки; О .модуля класса, предоставляющего список операций, доступных для этого типа данных, и выполняющего выбранную пользователем операцию. Обратите внимание, что можно расширять существующие объекты SmartTag. Д.irя этого необходимо предоставить дополнительные процедуры распознавания, которые бу­ дут связывать ячейку с уже существующим идентификатором (например, для расшире­ ния списка символов, которые распознаются смарт-тегом Stock Syшbol) и / или предо­ ставлять дополнительные операции для существующих идентификаторов (например, для получения биржевой информации не только от MSN, но и от других поставщиков). Физически объекты SmartTag являются динамически подключаемыми библиотеками ActiveX. Часто такие объекты создаются на языках Visual Basic или С++. Обычно в этой библиотеке хранится класс Recognizer , класс Actions и модуль Globals, в котором хранятся константы и перечисления, используемые обоими классами. КлaccыRecognizer и Actions должны реализовывать конкретные интерфейсы для предоставления Excel и другим приложениям Micгosoft Office возможности вызывать компоненты класса. Начнем с создания смарт-тега FileName. Откройте Visual Basic 6 , создайте· новую биб­ лиотеку ActiveX DLL и вызовите проект FileNameSmartTag. Интерфейсы Recognizer и Actions определяются в библиотеке типов "Micгosoft Sшагt Tags 2.0 Туре LiЬгагу". Ссылку на эту библиотеку необходимо создать в диалоговом окне Проекте> Ссылки (Too!sc> Refeгences) . Для это.го напротив названия библиотеки нужно установить флажок. Эти интерфейсы предназначены для обратной совместимости с Mici-osoft Office ХР. Уникальный идентификатор смарт-тега При связывании ячейки листа с объектом SmartTag ссылка хранится в книге в фор­ мате XML. Это значит, что идентификатор Smar t Tag должен создаваться специальным образом - в виде указателя Unifoгш Resouгce Identifieг (URl), после которого указывает­ ся символ '# ' и имя конкретноrо типа объекта SmartTag. Строка URl предоставляет возможность идентифицировать источник идентификатора И группы ID. Комбинация идентификатора "и группы позволяет получить глобально уникальный и однозначный идентификатор . Полная строка идентификатора конкретного типа данных имеет сле­ дующий формат: tЧi:n_: stliemas:·<~coffiP::~P'i>:".: t::_o~I:c~gI2.iJ.i?~~J§ma:f~т.49~~Iii~ ~:-'· "":':'~;:"": В данном примере распознается три типа имени файла: О файлы, которые можно открыть в Excel, получают идентификатор "urn:schemas-wrox- com:Excel2003ProgRef#ExcelFile";
606 Глава 27 О файлы, которые можно открыть в Woгd, получают идентификатор "urn: schemas- wrox-com: Excel2003ProgRef#WordFile"; О файлы, которые можно открыть в других приложениях , получают идентификатор "urn:schemas - wrox - com:Excel2003ProgRef#NonHostFile". Добавьте в проект Visual Basic новый модуль Globals и эти идентификаторы в виде констант . ri · s-~.этot:{ м.одуле~-х_р ·анят_Сfi · _-·~дО'баЛЬН"'ЫеКёнГсТа н-ты- J.1 "~П е.Р,е Ч~"ёления-;. ~~!>:~,t~ t , ко;:'орыr:= , ~с:Дdльзуются сJ9::: ектами SrnartTag '· · , ~.. ' f, ·:: -~- .. ·: -< _ ( .. ~~>'. .,·~-, ' . -·' .. f ' У.ниверсальные . и;центиФи.ка,торы р~сурсов дл~ ...типов [~uЬ,,~~::csocn:e;::-U:r1~l~0c%~'~=~~ce12ooз ~;p~R~f#~~~elFi1e;, :Public Const psURIWoi;'d,J:• = :'ri '-' , . ·· ··. · · ;~ "urn:schernas~wrox-'com ;. E~cel200. 3ProgRef#Wor.dF.i1e" ! PuЫic· Con's .t psURINonНo~t ' = '. "u rn ~ scnernas ;-wrox- "" L~c9ip :Ex<?ei2 9.oз~r'Q.i;iв,~fjfpqnJ:!cistf Ч'e " .,.. .· ,; · Многие создаваемые здесь процедуры объектов SmartTag вызываются несколько раз для перебора последовательности, например имен Recogni zer или действий SmartTag, с передачей номера последовательности в качестве параметра. Для улучшения читаемости желательно определять соответствующие номерам последовательностей перечисления (Enumerations или Enums) в модуле Globals . Следующие перечисления используются далее в этой главе, но определяются здесь, в мoдyлeGlobals . ·smartt'ag: ·c:··-· ··.
Смарт-теги 607 Класс Recognizer Взаимодействие между Excel (или другим приложением Micгosoft Office) и процеду­ рой распознавания смарт-тега осуществляется через специальный интерфейс - ISmart - TagRecognizer, который реализован в классе. Для создания класса, реализующего интерфейс, переименуйте принятый по умолча­ нию класс Classl в Recognizer и введите в класс следующий код: ( ':~ модуль "распо'знаванИя Имен файлов · roptiOn Explicit . . ... c:+rnP l.~!n.eJ:?.J:.s;.· r srr,ia:z::t:З::ag:\.'<ecogni zer, Этот интерфейс предоставляет следующие методы и свойства. Все они должны быть реализованы в классе. Методы и свойства ProgID Name Desc SmartTagCount SmartTagName SmartTagDownloadURL Recognize Описание Идентиф икато р класса Recogni zer, который ·определяется , как<Название_проекта>.<Имя_класса> Короткое имя объекта SmartTag, которое отображается в списке объектов SmartTag Описание объекта SmartTag Количество типов данных SmartTag, которые распознаются этим классом Вызываетс я по одному разу для каждого класса для предостав­ ления уникального идентиф икато ра типа данных Если фа йл открывается на компьютере , н а котором не установ­ ле н а библиотека Sma r tTa g , значение этого свойства указывает на источник загрузки библиотеки Actions. Основная подпрограмма, которая выполняет распознавание и обработку текста Первые три компонента одинаковы для всех объектовSmаrtТаg . fi?rivate "i? r.o'Pe'r i:y dei 1·smari::"тa9-R:ec ogni zer_Pro9-rd(J д:s·· s t:ring .,.,,,.. . ; · · l _ISrnartTagRecognizer_Progid = "FileNameSmartTag.Recogni z er " 1Ena ~ropertl' . . . :Private Property Get ISmartTagRecognizer_Narne { . _ !· ByVal LocaleID As Long) As String ~ , !Srnar.' tтagRecognizer_Narne = " Filenarne ·sщartTag Recognizer'' [End Property · ~. p"rivate p'roperty Get ISrnartTagRecognizer_Desc { :._ ' .. · · · ByVa 1 Local.eID As Long) As String . ISmartTagRecognizer_Desc = "SmartTag DLL to recognize tilenames " :Jf!'l~.:.~r•;щ§rtт ~. . ," ~ ___ ... Свойство SmartTagCount просто возвращает количество распознаваемых классом типов данных. В данном случае распознается три типа данных - файлы Excel, файлы Woгd и файлы других форматов .
608 Глава 27 (Priva:t:~··Proi;Jёif'y ь·ег :i:srilartтagR:eё o9nizer_:_sшartтaQ-coU.nt.TJ Лs Lon·q: t> ISmartTagRecognizer_SmartTagCount = 3 i;i;;@ ~R:r;:i?!?!?EtX " .."" ...:~ Свойство Smar tTagName вызывается несколько раз по разу для каждого распознаваемо­ го типа данных . В качестве параметра свойству передается номер типа данных (в данном случае 1, 2 или 3) . Свойство возвращает уникальный идентификатор (URI) для данного ти­ па данных. Многие методы интерфейса SmartTag применяют эту технику передачи номе ­ ра для идентификации конкретного значения или операции. Для улучшения читаемости кода можно использовать перечислимый тип, значения которого соответствуют трем по ­ следовательным номерам; перечислимый тип peTagSequence определен в показанном ранее модуле G l ob~ls. Значения этого перечислиr.:~ого типа используются свойством SmartT agName . !i' iiva't€?'F>roi5'8rt:;гG'eT "rsтa::rt.тa'g:Re co9n.Гz e r.::.:Smarfтag:Name · г ·~. ! ' ByVal SmartTagI D As Lori.g) As 'string ' Вернуть '• идентификатор URI для указанного peTagExcel ISmartTagRecognizer_SmartTagName 'fa.se peTagWord psURIExcel · ISmartTagRecognizer_ SmartTagName = psURIWord cJ.se peTagl-ionHost . . · r ·sma;ctTagRecogniz er_ Sma r tTagNa11,1e End :Select · psURINonH()St Pr_OQ§Ftx, - . В свойстве SmartTagDownloadURL подобный код можно применять для предоставле­ ния ссылки на библиотеку Act i ons. В данном случае оба класса Act i on и Re cogni zer расположены в одной библиотеке DLL. t:i'Г i'V<it:e·~:i>ra:P ert:Y: '-Ь et. · rsffia rt1'agR.e.coiini zer.::.:Smar·t.тaiiiowii 'Load.UR.L( ''~·--" · ByVal SmartTagID As Long) As String. · · (' ISrrtart'ГagRecognizer_SmartTagDownloadURL ·= · L?Ed__ I;,r,:,ope~ty_ .~ ., .,.~~· . Класс Recogni zer выполняет все необходимые операции и является самым слож- ным компонентом механизма SmartTag. Правильный класс Re cogni zer должен: О распознавать правильные последовательности символов; О не давать ложных срабатываний; О работать бI>rстро. Если необходимо распознавать элементы списка терминов (например, номера компо­ нентов), желательно загрузить полный список элементов в массив (это можно сделать в одном из свойств,- например ProgI D), особенно если список придется получать с дру­ гого WеЬ-сайта или извлекать из базы данных. Несмотря на качество механизма распознавания , скорее всего, будут возникать лож­ ные срабатывания. Например, последовательность символов "TRUE" одновременно мо­ жет соответствовать значению типа Boo l ean и действительному биржевому символу . В результате ячейки со значением True типа Boolean будут распознаваться как бирже -
Смарт-теги 609 вые символы. Точно так же процедура распознавания моделей автомобилей может рас­ познать числа 106, 206, 405 и т.д. как действительные номера моделей, хотя на самом де­ ле это результаты вычислений в ячейках Excel. В данном случае для распознавания строки как имени файла, строка должна соответ­ ствовать одному из следующих условий: О строка может иметь формат <буква>: \<текст>. <расширение> без пробела по­ сле точки; О строка может иметь формат\ \<текст>\<текст>. <расширение>. В результате некоторые имена файлов не будут распозна!-Iы (например, не все имена файлов не имеют расширения), но при этом будут распознаны некоторые строки, кото­ рые не являются именами файлов. Для улучшения алгоритма можно проверять наличие недопустимых символов внутри имени файла, но даже приведенные выще правила яв­ ляются хорошим примером. Кроме этого, файлы поддерживаемых форматов имеют расширение . xls и . xla вExcel и .?.ос И . dot в Woгd (в зависимости от приложения). Следую~ий код добавля­ ется в класс Recognizer: ·Privat.e suь rsrnaitTagRecognizer_:Rec6gniz\3{вyva ·1 техt As string, . ByVal DataТype As SrnartTagLib.IF_TYPE, · _ , · ByVal LocaleID As Long, _ ByVal RecognizerSite As _ SrnartTagLib.ISrnartTagRe_cognizerSite) ' Переменн~~е, ·которые используются для поиска именl-1 . файЛа Dim iStart As Long, iEnd As Long, iDot As Long, iSlash As ' Переменная, в которой хранится имя файла Dim sExt As String ' Переменная, в которой хранятся свойства объекта SrnartTag Dirn oPropBag As Srnart;TagLib.ISrnartTagProperties Абзац Word может содержать несколько ·имен файлов, пр:Идется перебрать по порядк_у · '· Найти символы в начале имени файла· iStart; = InStr(iEnd, техt, ":\") ' If ·istart > О Then istart iDot = Else . ' istart iS1ash =iStart-1 InStr(iStart, Te~t, ".") If iSlash iDot End If End If rr1str(iEnd, техt, "\\") TnStr(iStart; Text, "\') >ОThen rnstr(iSlash, Text, ". ") ' ~ ..f ' Если найдено начало и конец имени файла ... J.f ,istaft; -~ Q A,nq iDot; . > ~о "rhe_n = · ~·~·"~--~-
610 Глава 27 ~ ~· r (· 1 проверить наличие . символа сразу' после точки Trim$(Mid$(Text, iDot + 1 , 1)) <>- " " Then • · Действительное имя файла! ·' Найти конец расширения·" ~осле · которого может ' существовать другой те.кст , ее.Пи речь иДет об For iEnd = iDot· + . 1 То Len(Text) . ·rc InStr (1, "\: *?" "<> 1 ", Mid$. (Text, iEnd, ·· · <>.О Then·Exit .For Next , • Получить расширение sExt = Mid$ (-Text, . iDot + 1, iEnd - i.Doi:) ' Получить свойств.а этого qбъе.кта SmartTag Set. oP:r:opBag =, Recogni zerS_i te.: GetNewPropert yBag ' Добавить Имя файла·· и расширение в свойс'Ilва. объекта ' для · последуiощего использования · oPropBag.Write "FileName", . Mid$(Text, iStart, iEnd - o ·PropBag. Write "Extension " , sExt ' · Соот13етствует ли имя поддерживаемому типу файла , В Excel используется тип данных IF_ TYPE_ CELL, а в испоhьзуется . тип Данных IF_ TYPE_ PARA. . . ' Фактическое распознавание текста выполняется в ' Commi ts·m ·artTag . · )f (DataType IF_TYPE_CELL And (sExt = "xls" Or sExt = "xla")) .Then RecognizerSite.CommitsmartTag psURIExcel, 1-. iStart, iEnd - iStart, oPropBag Else:tf (pataType IF_ TYPE_ PARA And ·· .' (sExt = "<;ioc" Or s Ext = " dot")) Then · ~ecognizerSite.CommitSmartTagpsURIWord, _ . iStart '· iEnd - iStart, oPropBag Else . . . · Recogni:ierSite.CommitSmartTag psURINonHost, _: :_ · .istart, iEnd. - iSta'rt, oPropBag · End If End If End If Loop Until ir:Jot ·= ·о Or iEnd >= Len (Text) Класс Actions После распознавания компонента с помощью класса Recognizer, Excel должна найти элементы для отображения во всплывающем меню объекта SmartTag. Эти элементы соот­ ветствуют операциям, поддерживаемым этим типом данных смарт-тега. При выборе одной из этих операций Excel должна обратиться к библиотеке SmartTag и выполнить запро­ шенную операцию . Все эти действия выполняются через интерфейс ISmartTagAction. Для создания класса, реализующего данный интерфейс, добавьте в проект новый мо­ дуль класса, выберите режим создания экземпляров '5 - Mul tiUse', переименуйте класс в Actions и введите следующий код:
Смарт-теги 611 ~Т моДуЛ ь для оnераций объёкта SmartTag дЛя имен файл о в i [dption Exi;>li.cit i}J11I?:+~I!l.§.nts JSmё(_rt~ёlJJf.cЦon . Интерфейс ISmartTagAction предоставляет следующие методы и свойства . Все они должны быть реализованы. Методы и свойства Описание ProgID Идентификатор класса Recognizer. Определяется как <ProjectName> . <ClassName> Name Короткое имя объекта SmartTag, которое отображается в списке объектов Desc Описание объекта smartTag SmartTagCount Количество типов дан~ых SmartTag, распознаваемых классом SmartTagName Вызывается по одному разу для каждого типа данных для предо~ ставления уникального идентификатора типа данных SmartTag(::aption Вызывается по одному разу для каждого типа данных и передает заголо­ вок, который выводится во всплывающем меню объекта SmartTag VerbCount Вызывается для каждого типа данных и передает количество допус­ тимых операций VerЫD Вызывается для каждой комбинации типа данных и операции. Пре­ доставляет уникальный идентификатор этой комбинации VerbCaptionFromID Вызывается для каждого идентификатора операции . ,Предоставляет заголовок для вывода во всплывающем меню объекта SmartTag VerbNameFromID Вызывается для каждого идентификатора операции . Предоставляет программное имя операции (такие имена позволяют вызывать опе­ рации из кода VBA - дополнительная информация приводится да­ лее в этой главе) InvokeVerb Вызывается при щелчке на одном из меню объекта SmartTag или при вызове операции из кода VBA. Это основная подпрограмма, вы­ полняющая выбранную операцию Первые пять свойств не отличаются от свойств интepфeйcaISmartTagRecognizer. F:Privatё Propert y de t :Isma i tтagA. cti6n:._ProgrcГ( J., A.s · . · string 1 · ISmartTagAction_Progid "FileNameSinartTag.Acti ons" rEnd Property . . f. ~', (Privat:e Property Get ISmartTagAction_Nq.me(ByVal LocaleID As Long) i ~ As String : ISma·rtTagAc.tion_Name = "Filename SmartTag Actions" [End _Property lPrivate Property Get ISmartTagAction_:_Desc (ByVal LocaleID As Long) i~ As St.iing : · ISmartTagAction_Desc = "Provides actions to perform on filenames " · tE:n?- . Property · \ . .· ' \Private Property Get ISmartTagAction_SmartTagCount () As Long .: , · ISmartTagActi.on_SmartTagCount = 3 [End ·Property · ' i.J?fJ.Yя~~ P.J:s>R~:t;"t.Y G~t. _ISJ11a]."t'J:agAc.:t.i9ы,~Sm~r,t:1:~9NёlШ~ ( '
612 Глава 27 .. . : . . ' вуvаТ sinartTag±]) As Long) As String Интересующий идентификатор URI для номера " ' объекта SmartTag Sele.C:t Case smartTagID · . .cas e peTagExcel >',,,· _ ISmartTagAction_ SmartTagName psURIExcei ·. Case ·peTagWord .. ISmartTagAction_SmartTagName - psURIWord ck:se, p~TagN()llHOS t ' · ISmartTagAction_Smari:TagName d ' Select · ., :P.sURINonHost '. Свойство SrnartTagCaption предоставляет заголовок, который отображается во всплывающем меню объекта SrnartTag: . Prope"r'ty'' Ge,f ' rsmartтagAci::ion_sma·rt:тagcaption ( " . ByVal ·SmartTagID As Long, · ByVal LocaleID SmartTag ,"Файлы Excel" · ' Case peTagWord · _ ISmartTagActiQri_SmartTagCaptiori ''Файлы Word" . ;Case PeTagNonHost ·· ·' IsmartTagActiori_smartTagCaptiqri \Zl'' Select · "Имена файлов" · Свойство VerbCount возвращает количество операций для каждого объекта SrnartTag. В данном примере предоставляются следующие операции: О проверка существования файла; О переименование файла (также в результате этой операции обновляется содержи· мое документа); О открытие файла в принятом по умолчанию приложении; О если Excel или Wol"d распознали собственный файл, предоставляется дополни· тельная операция по открытию файла в новом экземпляре Excel или Wol"d. Для большей читаемости кода для этих операций в модуле Globals определено пе· речисление peFileVerbs, в котором указаны идентификаторы, соответствующие иден· тификаторам объектов SrnartTag и операций. Свойство VerbCount класса Actions используется для получения количества опера· ций, доступных для каждого типа данных. f!i~lya~e"' JSro:Pei,t:y: ь~г tsffiaifтagдction~verЬcouni: ( _: f;~· ·~;., · · · · '· .. ByVal smartTagName As String) ,и~.·:'':? ' . ,-,; ~.~~': s~lect case ·smartTagName _. [.1,,;,.,.,."'''r;:.i'i~.'!=.J?J?l:JI<:IE,,~fel ,~-
rsmarE'ragAction_verЬcount - 4 ' Ca,se psURIWord ISmartTagAction_VerbCount 4 Case psURINonHost , ISmartT agAction_ VerbCount 3 End select . . :Enci proper_ty,,,. . . Смарт-теги 613 Свойство VerЫD используется для получения уникального идентификато ра каждой операции , Точная нумерация операций в перечисленииреFilеVеrЬs позволяет вычис­ лить идентификатор на основе номеров объектов SmartTag и номеров операций: fPrivatё Property det :I siiiaitтa9лc ilon::_v'erБ±i5(::_·, .... ByVal SmartTagName As String, _ ByVal VerЫndex As Long) As - .. Long Sele,:t Case SmartTagName Case psURIExcel 0 ISma:rtTagAction_VerЫD t;ase psURIWord ISma r tTagAction_VerЫD Case pstJRI NonHost ISmartTagAction VerЫD End Select . - 10 .+ VerЫndex 20 + VerЫndex 30 + VerЫndex Теперь, когда программа Excel получила информацию о всех предоставляемых опе­ рациях, каждой операции присваивается заголовок, отображаемый во всплываю щем ме­ ню объекта Smar tTag, :Private Property Get ISmartTagAction_VerЬcaptionFromID( - ~ :ВyVal VerЫD As Long, ByVal ApplicationName As String, ByVal LocaleID As Long) As String Select Case VerЫ·D Case peXLExists , peWordExists, pe:Jl!HExists · 1 ISmartTagAction_ VerbCaptionFromID "Пров ерить '~ .'существование файла" 1 r Case peXLRename , peWordRename, peNHRename ISma·rtTagAction_VerbCaptionFromID = Case peXLOpen, peWordOpen, peNHOpen ISmartTa.gActioil~VerbCaptionFromID "Открыть файл" Case peXLOpenNew ISmartTagAction_ VerbCaptionFromID "Открыть файл в новом экземпляре Excel" Case peWordOpenNew ISmartTagAction_VerbCaptionFromID "От крыть файл в новом экземпляре Word" End Select g<:nd . Pr.op~rty .. .
614 Глава 27 Excel предоставляет механизм включения операций SmartTag из кода VBA. Свойство VerbNameFromID используется для предоставления программного имени каждой опе ­ рации. Далее в этой главе приводится дополнительная информация о применении кода VВА для управления объектами SmartTag и вызова их операций в Excel. ;Pri vate Property Get rsinartTagAction_ VerbNameFromID ( .:: '• 1- 1 ! ByVal VerЫD .As Long) As String Select Case VerЫD Case peXLExists, peWordExists, peNHExists · ISmartTagAction_VerbNameFromID = "CheckExists" Case peXLRename ," peWordRename, peNHRename ISmartTagAction_VerbNameFromID = "Rename" Case peXLOpen, peWordOpen , peNНOpen ISmartTagAction_ VerbNameFromID "Open" Cas~ peXLOpenNew, peWordOpenNew ISmartTagAction_VerbNameFromID "OpenNew" ~ -- End Select · ' [E;,i,:id Prop~r\;-y Главной подпрограммой клaccaActions является метод InvokeVerb. В этом методе выполняется выбранная операция. Обратите внимани~, что в качестве - одного из пара­ метров методу передается объект Target . При вызове Из Excel значением параметра яв­ ляется объект Range, в котором хранится распознаваемый текст. ;это позволяет полу­ чить полный доступ для запроса и м<;>дификации любого объекта Excel. В данном случае текст имени файла будет модифицироваться при вызове операцииRеnаmе. Функция Windows API ShellExecute позволяет открывать файлы в соответствую­ щем приложении (дополнительная информация о Windows API приводится в главе 16). Следующее определение необходимо добавить в начале клaccaActions: С'" Д.тiя" открьiтиЯ Файла· и-сПользуе'тсЯ ·'выЗов API - SheiiExecute ·- 1Private Declare Function ShellExecute Lib "shellЗ 2. dll" ; Alias "She llExecuteA" ~ (ByValhwnd As Long, ByVal lpOperation · As String, " ByVal · lpFiie As String 1 ' ByVal lpParameters As String, _ ""' Byyal,. l j:>Di:i;:ec!:,o_r::t,_} \s" ~triiJ.g, Byy~l nSho~mc:l. .J\s Long).• )~s . Long ~- Для выполнения запрошенной операции используется нижеприведенный код: fJ?r'ivat.e · suь ismari:тagAёtl on_rnvokevert>' <iз'YVa1 verЬiD ~ .д:s= tong ; - _- t -·· ByVal ApplicationName As String, ByVal Target As Obj ect, 1- ByVal Properties As SmartTagLib . ISmartTagProperties, j ByVal Text As String, ByVal Xml As . String) · ;;! ~ Dini sNewName As StZ..ing i, _Dim _oHost As Object 1- Dim а .As Long t !-- i!· .' Все операции ' требуют существования файла, · поэтому эта ' проверка -вьп;юлняется в первую очередь ·rf Not FileExists (Text ) Then щsgв0х ;,Файл ' " : & техt & " ' :не существует;,, vbOKOnly + vbCritical , "FileName Smart
Смарт-теги "· s~i'ёёt" casё · veiь±J5,,. Case peXLExists, peWordExists, условие выполнено, файл существует "Thefile ';!&техt&'-" ' exists", _ vbOKOnLy, "Fi 1 eName Smart Tag" peX4Renaine, peWordRename, ' Получить новое имя файла, передав исходное·, ' · имя файла, в качестве принятого По умолчаниIQ значения sNewName = · Inрutвох("Введите новое имя файла",_:_ "FileName ' smart . Tag", Text) .' Если имя изменилось (и пользователь не щелкнул · ' на кнопке Отмена) . ·.. sNewNaine. <» " · ~, Апd sNewName <> Text Tllen OnErrqr ·Resume 'Next ' . . . переИмено,вать файл Name Text As• sNewName IfErr=·ОThen ' Файл усnешно п,ереименован, поэтому можно . ' · из~енить , строку имени файла ' · каЖдое . !)рилоЖение (Excel, Word или IE) '· требует '. использования собственного синтаксиса: · Select >Case Left$ (LCase$ (Applicatio.nName), 5) ,case ".excel" · 'I'arget.Value ~ sNewName Case l''word." Targe.t . Text: =. sNewName tase ' EJ,.9e Tar:get.Inner:Text sNewName Select' · · Case peXLOpen ' Открыть файл в Excel . Target.Application.Workbooks.Open Case peWordOpen ' Открыть файл в Word Target :Applicatio.n . documents. Open ' Case peNHOpen , Text ' Воспользоваться ф~н к ци ей API ShellExecute 1 ' дл я открытия файла в . принятом по умолчанию'' реДакторе On Error Resume Next а = ShellExecute (О, .vbNullString, Tex't, vbNullString , :_ v bNullString, 1) peXLOpenNew Открыть файл · Ехсеl в новом экземпляре Excel Set oHost = CreateObject("Excel.Application") olfost. Workbooks. Open Text · oнost.VisiЬle = True Case peWordOpenNew ' Открыть файл Word в новом э кземпляр е Word S e t oHost = CreateObject ( "Word. Application") · o!fost. dos;umen~s. 0pE?n Je~,t 615
616 Глава 27 В подпрограмме InvokeVerb для проверки существования файла используется от­ дельная функция: ·· rrvi;i i:e 'F'U:nc йon .. F'ПeE:x':tsts<sF':i.1e дs st'r:-ingJ лs вo61eaii ." .... • На этом реализация завершается . Сохраните проект Visual Basic и создайте библиоте­ ку DLL. Реализация возможностей объектов SmartTag в Office 2003 К этому моменту был создан полностью функциональный смарт-тег, который может ра­ ботать как в Microsoft Office ХР , так и в Micгosoft Office 2003 . Теперь в каждый класс будет добавлено несколько строк кода, которые позволят использовать возможности Ofiice 2003 . В класс Recognizer необходимо добавить выделенный ниже код, что позволит реализо- вать интерфейс ISmartTagRecognizer2. ' j'I МодуiiЩ 'д:Ля 'расЦоЗна ва ния имен~- файлов fOptJon Expl'icit . . · Jmp1.etneI1~s I SmartTagRecogrii zer irmplements rsmartTagRecognizer2 ' P):-ivate . Property Get . JSmartTagRecogr;iizer:_Progid() As .. String l/i·' ISma'rtTagR.ecogni z er.c_ ProgJd. =. "FilenameSmartTag. Recogni ze:i;-" \!?P:'<:i.1)'EЭP§t~Y ,,,;:;,.,,,,,. ···"··'···--~~--~-. :_ , · Как было показано ранее в этой главе, этот метод требует реализации только четырех методов, поэтому после кода приводится краткое описание принципов его работы. До­ бавьте следующий код в конец клaccaRecognizer: · e·~oдЬi 'йf! тёi:JФe йc a·•rsmarEтaQ-'R~9 09-r1:Lz.er2 ..·~ , ,lic. SцЬ . TSmartTagRecogni zer;2{_Recogni ze2 (ByVal .· 13yVal · DataType ,As :SmartTagLib. IF_:тУрЕ, _ y,va.1 LocaleID As Long, :2 · .. . ... yV<;i.1 . Recogrii«;erSi t .e2 As • SmartTagLib . ISmartTagRecogni-zerSi te2, ByVal''·Дppli c atlonName ·. As String, · -.. :!tY'f(al TokE1_nLii;:~ As _smar!;TagLib. ISmartTagTokenList) . · r~taтt:TagRec~gnizer~Recbgnize .техt, ···· _ .. Dat<;Тype, LocaleID, Recogn:i.zerSite2 ' ,.J}~~(~§:_μ!?::::'::iLъ.:~~i~"/:li,,, ..-h~:.·*~',.~~-~ h.; _: .' ~A~-r~-~- ~~:;_'*"-'- ..:~. . ·", ..h~, ··'·~ ,~.~ ,., ;t; В методе Recogni ze2 можно воспользоваться средствами разбора текста на компо­ ненты , но для сохранения ясности используется вызов исходного метода Recognizer, чтобы Office ХР и Office 2003 применяли один и тот же метод для определения соответ- - ствия текста требованиям объекта SrnartTag. Добавьте в класс следующие три метода:
Смарт·теги 617 Propёrty cet isina:r:tтaQ-.ReCoQ-h:l.2ei2 _I?roi:Jert:Yi>age (ByVal SmartTagID As Long, _ ' · _ ByV.a1 LocaleID As .Long) As ' Boo l ean . ISmartTagRecognizer2_PropertyPage _= False ;End, Proper:ty, · · !. . iPuЫic Sub ISmartTagRecognizer2_DisplayPropertyPage( \\ ByVal SmartTagID As Long, · ; ByVal LocaleID As Long) tEnd Sub \. PuЫic Sub ismartTagRecognizer2_ SmartTaginitialize{ • ByVal AppName As String) · !~n.d Sl!J.:!, ' ·· . ... • .::.. .~ ···- ,• Метод PropertyPage возвращает значение False, так как страница со свойствами этого компонента не предоставляется. Если бы страница со свойствами предоставлялась, она выводилась бы методом Di splayPropertyPage. К этому моменту все необходимые методы интерфейса ISmartTagRecognizer2 уже реализованы. Теперь для реализации интерфейса ISmartTagAction2 необходимо внести сле­ , дующие изменения в клaccActions: :opt.Io'n~ Exi)Iie::·:rt ·' · ··•I." iтmplements ISmartTagAction frmplements , ISmartTagAction2 :Private Property c;:et ISmartTagAction_Progid () As String • ; . ISmartTagAction_ Progid = "FilenameSmartTag. Actions" ;End. J;?з,:::op~rt:y_ _ . . ~:... . _~1. ,-~.• ~- Метод InvokeVerb2 отвечает за передачу всей необходимой информации исходно­ му методу InvokeVerb. Добавьте следующий код в клaccActions: ' Public _sul5 rsmar:tтagA.ction:2--:i:nvoкeverЬ2 (ByVal verь :tb As Long /' _B y va l~ "', . :: '' · ·:. ;~ · .A pplicationName As String, ByVal Target As 01;>ject, ByVa.l _ ·,j Properties As SmartTagLib. ISmartTagProperties, _ByVal• _ · " · j Text _As String, ByVal Xml А$ String, B:(Val - LocaleID As Long) [IStnartTagAction_InvokeVerb Verl:!ID, · ApplJ.cationName, )Targ_et, Properties, Text, Xml · В данном примере динамические заголовки не отображаются . Кроме того, в объектах SmartTag должны использоваться. индикаторы подчеркивания, которые реализуются с помощью показанного ниже кода. Добавьте следующий код в конец клaccaActions: •i?uьl.Ic'" J:>ropertY: dei:·· rsmiiit:тagA:cti6n2_:.rscaptionDYпamiё(вy\ra1 '~ ·-"·· ·· · · VerЫD As Long, ByVal ApplicationName As String, ' JЗyVal LocaleID As Long) As J3oolear1 · ISmartTagAction2_IsCaptionDynamic ' End · Property" False fPuЫic ' Property Get ISmartTagAction2_ShowSmartTagindicator(J3yVal ~ VerЫD As Long, J3yVal Appl,icationName As String, JЗyyal_ !~ LocaleID As Long) As J3oolean р" .. rsm~rtTagAction2_ShowsmartTagindicator '''= True ;End ' Property
618 Глава 27 ipU'iJHc '·sиь· Hi:itartтaQ-Actlon2:._sЦiarfтagrnl tiailze (в:Yvai ···" · · · ApplicatioдName As String) End Sub · Код для использования расширенных возможностей Office 2003 практически завер­ шен. Осталось добавить метод VerbCaptionFrornID2, фактически предоставляющий текст для всплывающих меню смарт-тега. Office 2003 поддерживает подменю, поэтому здесь используется код метода VerbCaptionFrornID с минимальными модификациями. iPU:Ьlic i?r0Per'ty Gёt rsiiia'it. тa.·g.дC:H6~ii2.:.ver:ЬcaptTonF'roinrt2 (вy'vai· verb1D , As Long, ByVal ApplicationName As String, ByVal LocaleID As Long; ByVal _ Properties As SmartTagLib.ISmartTagProperties, ByVal _ reco'gJ::iized_text As String, ByVal · Xml As String, ByVal _ Target ' As Object) As String · Select' Case· VerЫD ь Case peXLExists, peWordExists, peNНExists f ISma:rtTagAction2_VerbCaptionFromID2 = 0 "Проверить l~ сущес:твоваю:tе фа):!ла" Case peXLRena:me, peWordRename, 'peNHRename · ISmartTagAction2_VerbCaptionFromID2 "Переимено вать файJi. ." Case , peXLOpen, peWordOpen, peNНOpen rsmartTagAction2~VerbCaptionFromID2 "Открыть///Файл" Case peXLOpenNew I$martTagAction2_VerbCaptionFromID2 · "Открыть///В новом экземпляре Excel" Case. peWorclOpenNe\\7 • rsmartTagAction2_VerbCaptionFromID2 · ";Открыть// /Открыть файл в . новом экземпляре ·\'Jord" End Select ;itr:id :i:ro_per.:ty . Глядя на код, легко заметить, что он ничем не отличается от кода метода VerbCap- tionFrornID, кроме трех пунктов меню, содержащих символы косой черты (! / / ) . Эти символы указывают на использование подменю. В данном случае главное меню будет на­ зываться Открыть (Open), а три пункта меню будут являться пунктами подменю. Эта возможность доступна только при работе в Micгosoft Office 2003. Регистрация смарт-тега Как и при использовании надстроек СОМ, пакет Office должен знать о существовании би9лиотеки SrnartTag. Для этого в системный реестр Windows необходимо внести соот­ ветствующие записи. В отличие от надстроек СОМ компания Microsoft не предоставила необходимых инструментов для упрощения процедуры регистрации. Для этого придется вручную создавать необходимые разделы системного реестра. Для создания записей можно воспользоваться файлом. reg, содержимое которого показано ниже . При з.апуске Excel сканирует системный реестр в поисках следующего раздела: HKEY_CURRENT_USER\Software\Microsoft\Office \Common\Smar t ~ Tag\Recognizers
Смарт-теги 619 Обычно имя такого раздела соответствует идентификатору ProgID или иденти фика­ тору ClassID класса Recognizer для объектов SmartTag. Полученный идентификатор применяется для создания экземпляра класса. Для получения остальной информации об объекте SmartTag используются свойства интерфейса ISmartTagRecognizer. Этот процесс повторяется и для клaccoвActions. Сначала необходимо определить идентификаторы классов, сгенерированные средой разработки Visual Basic. Для этого выберите команду ПускqВыполнить (Sta1·tqRun) и запустите приложение regedit. В списке слева найдите раздел HKEY_CLASSES_ROOT\ <Имя_проекта>. <Имя_класса>\Сlsid и обратите внимание на значение записи (Default). Это значение соответствует идентификатору класса. Для копирования идентификатора выполните двойной щелчок на записи (Default) и воспользуйтесь комбинацией клавиш <Ctгl+C> для копирования значения в буфер обмена. Для примера FileName раздел системного peecтpaActions называется HKEY_CLASSES_ ROOT\FileNameSmartTag .Actions\Clsid. В данном случае идентификатор класса Actions выглядит как {76C5099E-36E2- 4BBE-BA02-6097FAF5CFA2 }. Для класса Recognizer раздел системного реестра называется HKEY_CLASSES_ROOT\ FileNameSmartTag.Recognizer\Clsid. Идентификатор класса Recognizer выглядит как {76C5099E-36E2-4BBE-BA02- 6097FAFSCFA2} . Эти идентификаторы классов используются для регистрации библиотеки SmartTag (идентификаторы необходимо указать в классе . reg) . Для этого откройте редактор Блокнот (Notepad) и скопируйте в него следующий текст. Показанные выше идентифи­ каторы необходимо скопировать вместо строк ActionClassID и RecognizerClassID: :rй~~GEDrT4 " ,.. · ··:, "_..... ~-· -" .. " ····.~·· .."~, ~~ . fcHKEY..: ..CURRENT _USER \ So f twa~e\Мi.crosof t \O.f f ice\Comrrion \ Smart' 'таg] ' ' ' i;. ' . [НКЕУ CURRENT USER\Software\Microsoft\Office\Common\Smart L~ Tag\Action;j · ' . · · " [HKEY_CURRENT_USER\Sqftware\MicrosoH\Office\Common\Smart i~ Tag\Actions \ActionClassIDJ f• '' frнк:Ey_CURRENт.:..usE:R \Soft-ware\Microsof t \ Of f ice\common\smcirt \~ .Tag\Recognizers] · · . .\ · · . · · · '' ' r. " . ·' , \ IHKEY~CUiffiENТ_USER \So f tware \Microsoft \Of fice \Common\ Srna:i;t ~~ ~~gSВ..§q95;{~~~~-:t;_?. ;~).~ec,og~~~-e!C1:a~?;I;~J "~ ." ", ~: :. " . м ~- , ~- - .N~~#$~ ,;.. " ... Удалите пустые строки в начале файла и сохраните файл с расширением. reg. Полученный в результате файл FileNameSmartTag. reg состоит из шести строк и выглядит следующим образом: (E'Щ3EDIT4 = ( fIHKEY_CURREN'r '_U SER \ So f.tware \Microsoft\Off ice\ Common\ smart r[H~EY_CURRENТ_USER\Software\Mi~rosoft\Office\Co~o~\Smart 1~ ,Tag\Actions] · i . trнкEY_CURRENT_USER\Software\Microsoft\Office\Common\Smart · i:!>Tag\Actions\{76C5 099E-36E2-4BBE -BA02 -6097FAF5CFA2 }] !. "
620 Глава 27 :пп.<tY::_::cuR.R:EN'т_u·sЁ:R\soft:ware 'i мicrosof t \Office \ com.П\on \ smart [~Tag\Recognizers] !:<- ·'-. :&< ...... \ I I:IKEY_CURRENТ_USER\Software \Microso ft \Office\Commo n\Smart h~Tёig.\ReC()gnizers\ {7.6С5099Е-З 6E2-4BBE-BA02-6097F..l':F5C,FA2}] . . Выполните двойной щелчок на файле . reg в окне Проводника Windows (Windows Exploreг), и соответствующие записи будут добавлены в системный реестр . После этого Ехсе! будет распознавать смарт-тег Fi leNarne. Использование смарт-тега FileName Запустите Excel 2002, выберите команду СервисqПараметры автозамены (Toolsq AutoCoпect Options) и активизируйте вкладку Смарт-теги. Для вклюЧения объектов SmartTag установите флажок Пометить данные смарт-тегами (Label data with SmaгtTags). В списке должна присутствовать запись "Filename SmaгtTag Recognizeг" . Установите соот­ ветствующий флажок и щелкните на кнопке ОК. Ниже показано диалоговое окно (рис. 27 .2), в котором установлены все необходимые флажки . Excel сап recOQnize certain types of data in your workЬooks; For each recognized type, there are actions you сагi perform with that data. ~label data with smart tags ~ecognizers: !ОDate (Smart tao lists) !0 Financial Symbol (Smart tao lists) f 0 Person Na me (Outlook e-mail recipients) ~ ~ Excelfile (Fi!ename Sma rtTag Recognizer) i0 Wordfile (Filename Smartтag Recognizer) j 0 NonHostFile (Filename SmartTag Recognizer) 1 ......................................................... ................ .............. .................., Show smart tags as '·······················································"'''' ОEmbed smart tags in this workЬook Рис. 27.2 . Включение с.март-тегов FileNaтe Все ячейки, содержимое которых соответствует критериям имени файла, получат ин­ дикатор смарт-тега (темный треугольник в нижнем пр авом углу). При щелчке на символе i станет доступно меню с операциями над смарт-тегом FileNarne (рис. 27.3). Оре11 ~ Reniove this S 1пartTag .,, .х S!OI) Recog11iziвg "c:\lнiaнs.xls" ~ ;_ ....... ........\.. . Рис. 27.3. Меню операций uдд смарт·тегом
Смарт-теги 621 Управление смарт-тегами из кода VBA Так исторически сложилось, что компания Micгosoft обеспечивает управление всеми возможностями Excel с помощью языка VBA. Смарт-теги не являются исключением. Сле­ дующие объекты и свойства позволяют реализовать в коде те же операции, которые дос­ тупны через пользовательский интерфейс. Объект/Свойство Wo rkbook . SmartTagOptions Application . SmartTag- Recognizers SmartTagRecognizer Worksheet.SmartTags, · Range.SmartTags Описание Объект, через который можно получить доступ к парамет­ рам из диалогового окна Смарт- теги. Параметры устанав­ ливаются на уровне книги Коллекция всех установленных классов распознавания соответствует списку классов распознавания в диалого­ вом окне Смарт-теги Установленный класс распознавания, управляющий воз­ можностью его использования Коллекция всех смарт-тегов на листе или в диапазоне. Один диапазон может использовать несколько классов распознавания, поэтому содержит несколько смарт-тегов smartTag Единственный смарт-тег smartTag. smartTagActions Коллекция операций, допустимых для конкретного смарт­ тега. Операции предоставляются классом Actions SmartTagAction Операция смарт-тега в конкретном диапазоне. Для за пус­ ка операции используется метод Execute Workbook. RecheckSmartTags Метод для запуска по вторного распознавани я всех эле­ ментов книги В следующих примерах показано, как использовать некоторые из объектов и свойств. Проверка активности класса распознавания При работе со смарт-тегами сначала необходимо убедиться в наличии определенного класса распознавания и проверить, включен ли этот класс . F'U.nct:IЪrГ ±sR.ecognizerA.cfive (sPro9-if? -дs 'str'fn9- J' A.s smartTagRecognizer ~ Перебрать все установленные классы распознавани . .: For Each ·. oSTR In Applica tion. SmartTagRecogni zers ' . не этот ли класс мы ищем? If osтR : ProgID = sProg!D Then ' Если этот , то определить, включен ли IsRecognizerActive = oSTR.EnaЫed ~- Exit For End If
622 Глава 27 Удаление смарт-тега из диапазона Одной из проблем работы со смарт-тегами является возможность ложного срабатывания процедуры распознавания, в результате которого в ячейку будет добавлен ошибочный объект SmartTag. Например, стандартный смарт-тег Stock Symbol распознает строку "TRUE" как действительный биржевой символ, даже если это значение True типа Boolean. Следующий код находит и удаляет все результаты ложных срабатываний: :sub Rernoveiзooleanтril~ (} r 'f. . !" ~' 1' i· .· Dim oSht As Worksheet Dim oTag · As .. s _martTag ' Это идентифи:kатор URI смарт-тега StockTicker · Const sTicker As ' String - . "urn: schemas-microsoft- com: offi ce: smart tags#-stockticker ,, . . Перебрать . -все-,·листы а.ктивной книги For Each oSht i _ri · ActiveWorkbook. Worksheets 'Перебрать : все смарт-теги на листе For Each oTag In· oSht. SmartTags· · "_ ·r ' 0Смарт.:.тег StockTicker со значеrfием типа Boolean? If :* oTag .Name sTicker .And . TypeName(bTag:Rarige . Value) = "Boolean" ' Д,э, поэтому смарт-тег неоt;)ходимо удалить из ячейки .. : oTag. Delete 'End If .. Добавление смарт-тега в диапазон При создании класса Recognizer для выполнения распознавания класс имеет гло­ бальную область видимости. Это значит, что метод Recognize будет вызываться для кажд9го значения во всех книгах Excel или во всех документах Woгd. Существует воз­ можность ограничить область видимости до Wol"d или Excel , но ограничить область ви­ димости до книги, листа или диапазона нельзя. Коллекция SmartTags предоставляет метод Add, позволяющий добавлять в ячейку смарт-тег для определенного типа данных. Этот метод дает возможность полностью обойти класс Recognizer и выполнить распознавание с помощью кода на VBA. В таком случае придется реализовать только класс Actions, который предоставЛЯ:ет всплываю­ щее меню и обеспечивает выполнение операций. Например, может оказаться, что смарт-тег StockTickeг распознает слишком много ячеек, на самом деле не содержащих биржевых символов. Предполож:Им, что имеется сводная таблица с полем биржевых символов и только элементы из этого поля должны содержать смарт-теги Stock Symbol. Сначала необходимо отключить класс Recognizer для смарт-тега Stock Symbol (это можно сделать в диалоговом окне Смарт-теги) . После этого можно использовать следующий код VВА для распознавания биржевых символов в сводной таблице:
Гs'up AddтI'ckerTagTo Pivo tтаЫ етi tles() [ Dj.m;<oField As ;ivotField f':,, Dim,_ oitem As Pivotitem 1 ,, , Diin 'c\cell As Range , ~у " , Смарт-теги f:-.. ;, const ''sтicker As string ,. ,,, 1 "urn: schemas-microsoft- corn: o'ffice: smar;ttags#stockЦc~er" ' ,··" i . ... , ~~:· . .• р·.: . . ~ ~· . ,· Получ!1ТЬ '<;:имвол ' из ~оля сводной таблйць1 . ,,, геt oFi'eld = ActiveSheet. PivotTaЬles (1) . PivptFields. (" Synibol. ") f ,' Дере6рать все' элемеr~ты это,rо поля сводной таблицы · '' For , Each oitem In oFie1d.Pivotitems ' Перебрать все ячейки в диапазоне Fo'i : Each ocell In oтtem. LaЬeiRange · " Если . ячейка не пуста : тf Not IsErnpty(oCell) Then . ; . . . добавить ):\ ячейку ' смарт -тег oCell.SmartTags;Add sTicker , End' If . , Next Next t. ·, , fE;I1_<;l_ 623 Подобный прием позволяет комбинировать интерфейс и мощь всплывающего меню операций объектов SmartTag с точностью и контролем распознавания с помощью Excel VВА. После распознавания объекты SmartTag могут сохраняться в пределах книги. Для этого в диалоговом окне Параметры смарт-тега (SmaгtTag Options) необходимо устано­ вить флажок Внедрить смарт-теги в книгу (Embed SmaгtTags in this Woгkbook). Проблемы, связанные с использованием смарт-тегов Компания Micгosoft реализовала отличную технологию смарт-тегов, но данная реали­ зация имеет несколько слабых мест, о которых стоит упомянуть. Метод Recognize Самой значите~ьной проблемой является относительно небольшой объем информа­ ции, которая передается в мeтoдRecognize из интерфейса ISmartTagRecognizer. f:Privat~suБ rs·martTagRecognizer_)~ecogni ze (ByVa l Text"A'S: s'tring ;· '_ . f." · ,·. ByVal DataType As SinartTagLib: IF_TYPE;- _ ~-• · . By.Val LocaleID As Long, , _ " , · (' . . , ByVal RecognizerSi te As ~~ --~.rщi:;:J::Т~о.И:Р""" :i; §!n_ar _ t Ta,g~e<;::.o,Q:,n.i,,~r~it§') ,,: Обратите внимание, что текст передается в виде строкового значения (As String). При этом отсутствует информация об источнике этого текста. Например, значение True типа Boolean и текстовое значение TRUE могут быть сгенерированы на основе строки "TRUE" - метод Recognizer не различает эти значения. Хотя во второй версии биб­ лиотеки типов SmaгtTag предоставляется больший объем информации и выполняется разбор текста на элементы, информация об источнике текста не предоставляется.
624 Глава 27 Вторым слабым местом текущей реализации является отсугствие информационного контекста. Библиотека просто получает запрос на распознавание единственного текстового элемента. Если бы была возможность проверить соседние ячейки, распознавание было бы более точным. Например, смарт-тег "CaI Model" распознает текст "206" как номер модели Peugeot 206. Если бы была возможность рассмотреть соседние ячейки, можно было бы за­ метить, что "206" является одним из многих чисел и не имеет никакого отношения к номеру модели. Третье слабое место связано с тем, что объекту не передается информация о "важности" или позиционном контексте. Например, нет возможности отличать заголовок спи.ска (который не должен содержать смарт-тег) от элемента списка (который может содержать смарт-тег) . Точно так же для создания смарт-тегов в конкретной книге (например, соз­ данной на основе конкретного шаблона) или в конкретньiх ячейках сводной таблицы не­ обходимо .использовать код VВА. Все эти проблемы могуг быть решены через передачу того же параметра Target, кото­ рый доступен в методе InvokeVerb интерфейса ISmartTagAction. Если бы в метод пе ­ редавалась ячейка с распознаваемым текстом, метод мог бы рассмотреть соседние ячейки, проверить позиционный контекст или ограничить распознавание до определенных книг. Покрытие В Office 2003 классу Recognizer передается только содержимое ячейки на листе Excel или целый абзац Wиd. В большинстве приЛ~жений Excel используется намного больше представлений текста: О диаграммы; О диалоговые окна UserForm; ·О комментарий:, метки и другие элементы управления; О диалоговые окна VBAMsgBox и VВА InputBox. Было бы неплохо, если бы распознавание текста распространялось и на эти формы представления. Резюме В Office 2003 компания Microsoft предоставила возможность реализации собственных подпрограмм распознавания введенных данных и собственных меню со списком опера­ ций, которые выполняются для распознанных ячеек. Эти операции могуг использовать­ ся для обработки распознанных ячеек, поиска необходимой информации из других ис­ точников и для простой интеграции данных с листов с другими приложениями . Классы Recognizer и Actions легко реализовать любому разработчику, который знаком с языком Vistial Basic . Для точного управления смарт-тегами можно использовать язык VВА. Иногда это по­ зволяет полностью отказаться от применения класса Recognizer. Как всегда при добавлении новой функциональности, в следующей версии остается пространство для улучшений . Существует несколько сайтов, посвященных использованию смарт-тегов: О http://www . officesmarttags. com; О http://www. officezealot. com/smarttags .s
Excel и сеть lnternet Так исторически сложилось, что большинство основанных на Excel приложений остава­ лись внугри самой программы Excel , а. внешнее взаимодействие осуществлялось через пользо­ вателя , который предоставлял данные и получал результаты. Для хранения данных применя­ лись отдельные книги , которые, как могли, Имитировали реляционную базу данных. В то время как технологии работы с данными развивались от драйверов ODBC в сторону DAO и до текущей версии ADO (дополнительная информация о библиотеке АDО-приводится в главе 11), практика хранения данных во внешних базах данных и даже получения данных от друг:Их систем по сети стала более распространенной . Теперь Excel все чаше используется в качестве интерфейса запросов и анализа .для больших корпоративных баз данных. При этом для получения данных применяются объекты QueryТaЬle и PivotTaЬle. Но при таком подходе доступность данных ограничивается корпоративной сетью и базами данных. Начиная с Office 97 компания Miпosoft. увеличивала способность Excel получать дан­ ные из внешних источников, включая доступ к сети Internet и использование смежных технологий. Это была встроенная функциональность (например, WеЬ-запросы) или воз­ можность использования стандартных внешних объектов (например, Internet Transfei- Contгol, управление WеЬ-обозревателем и программа разбора MSXML). Все эти объекты включены в состав пакета Office. В Excel 2002 предоставлен достаточный объем функциональности для пересмотра под­ хода к разработке приложений Excel. В результате можно выходить за пределы привычной . среды Excel/ADO при получении данных, публикации результатов, контроле за приложе­ ниями и совместном использовании данных с распределенными системами за пределами локальной сети. В этой главе рассматривается функциональность, доступная в Excel 2002. Кроме это­ го, показано, как использовать часть этой функциональности для доступа к сети Inteгnet. Полное описание связанной с сетью Internet функциональности Excel выходит за преде; лы тематики этой книги .
626 Глава 28 ' qбр~тЙте внимание, что в этой главе термин "lnternet" употребляется в самом 'ширqком смысле; описывая как внутренние, так и в1:1ешние сети. Для чтения этой Главы необходи­ , мо иметь базовое представление о сети lnternet и принципах ее- работы. В приведенных . riрИмерах используется WеЬ-сервер, , работающий на локальном компьютере, но . эт,И приложения могут применяться И для работы с удаленным сервером. Что за ажиотаж? Комбинирование Excel и сети Inteгnet позволяет: О совместно использовать информацию; О публиковать информацию для неизвестных потребителей . Использование стан­ дартных форматов и протоколов позволяет потребителям получать однородный, надежный и безопасный доступ к информации; О глобально распространять информацию как внутри, так и за пределами сетей орга­ низации, сохраняя управление безопасностью и доступом к ценной информации; О извлекать информацию, предоставляемую другими организациями или частными лицами. При этом информация может извлекаться из нескольких несвязанных ис­ точников и использоваться в качестве исходных данных для приложения; О совместно использовать информацию производителями и потребителями или по­ ставщиками и клиентами через применение стандартных форматов обмена; О увеличивать полезность приложение через распространение результатов работы среди большего числа получателей, чем при работе на отдельном персональном компьютере; О использовать Excel в качестве ключевого компонента бизнес-проц.ессов большего масштаба, включающих в себя несколько организаций. Использование сети lnternet для хранения книг Самым простым способом совместного использования информации является хране­ ние книг на WеЬ-сервере. Excel 97 предоставляет возможность только загружать книги с WеЬ-сайтов, а в Excel 2000 и Excel 2002 поддерживается также сохранение книг на WеЬ­ сервере . Для этого используются расширения FгontPage Sегvег, которые должны рабо­ тать на сервере. Для открытия книги с WеЬ-сервера или сохранения книги на сервере вместо имени файла используется адрес URL. ;su:ь"6PenFromweьs:t t:e:AnCi§aveвack·t г Diщ oBk As Workbook Открытъ · книгу с WеЬ-сайта ' Следующую ссылку необходимо заменить на адрес сервера, _ к которому предоставлен доступ s_et SJBk =' Wo rk Ьo ok s. Open( "http: //www.MySite.com/bookl .xls") ' с:охранить · книгу на WеЬ-сайте с новым именем oBk.SaveAs "http:/ /www.MySite . cqm/Book2.xls"
Excel и сеть Internet 627 Если сервер требует регистрации, Excel может запрашивать идентификатор и пароль при каждом сеансе доступа (как в предыдущем примере) или передавать идентификатор и пароль в качестве одного из компонентов URL: ;s·Q .J? oi?enFroms .ecureweЬs:l teAn.dsaveвack:'(T , >1 Dim оВ}с As · wo;i::kЬook [· ;с ' открыть книгу с WеЬ-сайта ~. SetoBk= :~workbooks. Open ( "http: / /UserID: Pwd@\.Jww. М ' · Сохранить книгу на WеЬ.:_сайте · е: ноJ3ь . ·. .. . ·..···. .. . . ' о·вk ·saveAs "http://UseriD:Pwd@www.MySit.e.i36m/вook2 .·xls" • • ..' .• А•• • . •N • •' ~. '. ,, i~!';r:ic:l .JN!?... ' Конечно, адреса URL можно использовать и в диалоговых окнах Открыть файл (File Open) и Сохранить как (Save As). ИспользованИе сети lnternet в качестве источника данных "Классическое" приложение Excel использует два источника данных - базы данных в сети и пользователя. Если элемент данных не доступен в базе данных, пользователь должен ввести и поддерживать этот элемент. Для этого приложение должно содержать листы и диалоговые окна для хранения информации и предоставления механизма для ввода данных. В качестве типичного примера можно привести поддержку информации о курсе об­ мена в финансовой модели; обычно ответственность за получение и ввод в модель по­ следних значений курса обмена возлагается на пользователя. Приложение можно сделать более полезным, если ·автоматизировать получение информации о курсе обмена из одно­ го из WеЬ -сайтов. В следующих разделах представлены различные способы получения информации из се­ ти Inteгnet. В качестве примера используются значения курса обмена долларов CIIIA, дос­ тупные на сайте http://www.x-rates.com/d/USD/taЫe .htrnl. Ниже показан внеш­ ний вид соответствующей WеЬ-страницы (рис :28 .l). Открытие WеЬ-страни_ц в качестве книг Самым простым решением является открытие всей WеЬ -страницы в виде книги с по­ следующим сканированием листов в поисках необходимой информации, например курса обмена USD/GBP. ~-Ещь~о'РёП1JsЬ-R-,Э:--Еёs:Раg:ё ·() "_ "! [ ~ Dim oBk As Workbook Di;n oRng As Range ~~ ' ' открыть страницу в виде книги 1 Set oBk 7 Workbooks. Open ( "http: / /www. x - ~~rates. com/d/USD/taЬle.html") • " :..:"~lii~ЙТ.f1 . P.1дtlJG.r.~aцИ!O _() t':?P..!::!.!..~!'!f~OЬ:1 ФХ.!:!1'Е:.~- ""~:~-··
! 628 Глава 28 ов·k. Worksheets ( 1 j . Cells: F:Lnd("Br{tlsh Pounds") Считать значение курса обме на MsgBox ''Курс обмена USD / GBP с:оставляет " & oRng.Offset(O, 1) .Value End Sub ~'in ~ка е_f1д 11збрёs1-1-1Ое СР»С ~nра ека - У Уо Menu Currency Cqlcplatar Cыstom ТаЫе Histqric Lookup Cшrency Ph otos i:lQme. FXCM Ne\.\'S В: Quotes . Real Time Ouotes .. Forex Market NF=!WS . Currency Forecasts Cllrrency T r ading . Wh•1 trade currency? . What moves rates? . How t o get started? т!:">"" с:зг1.!1: "~~.i.~,!".~.о:-:.}... .::.-. • •o111!:.a1s t~ "S•t: gr~;:-hs Canadian Dollar Chi11ese Yu an Euro Hong Kong Ootlar Indian Rl1pee Japanese Yen Malaysian R1nggit Mexican Peso New Zealand Oollar Norwegian Kro ner Singapore Dollar South African Rand South Korean Won ~"; 1 :inl.-::. D11 1 USD inUSD1 1.30685 0.765199 : 2.3095 0.432994 ! 0.559816 1.7863 1 1.2132 О.824266 j 8.109 0.12332 • 6.0341 0.165725 i 0.808996 1.2361 : 7. 7709 0.128685 ! 43.44 0.0230203 : 111.87 0 .0089 3895 i 3.7 .5 0.266667 ! 10.605 0 .0942951 i 1.44259 0.693 198 i б.404 0.156152 i 1.6532 0.604887 : 6.45 0 .155039 i 1016 0.000984252 ' '" wYJD ..F..f. . , . .. . Q .(IПOO':l.d.~7 ; Рис. 28.1. Страиица со ~taчeюtJUtU курса обмеиа валют ~~::~~~::-1 •9•ntin• P•so 1 ustr.,;ilian Doll,;ir otsw,;in.oi Pul11 ! r1:1li11n R••I j ritish Pound ' 1 an.!ldi11n Doll•r j.Chile11n Pe so ! , Chirнвe Yu.ari j , Colombl.!ln Peso \ . o"·1ish l'..rorie i 1: ~':;~9 Kon~ Doll;iir i !. Hun9,;irl.oin Forint j 1 . lc•loind K1on.oi . lndi.an Rup11• 1 , Irarii11n Ri•I , iн11eli New Shekel . '1 · J .oip11nese Yen ! . t.\al~ysi•ri Rin9c;iit 1 , Mt: x1c11n Peso 1 . t~t:p.вlese Rup e e 1 . Jll•"" ze.•l11nd Ooll11r !: 6%:~~1;~111кron•r 1 э._.:, ".~.,.." С таким подходом связана определенная проблема - приходится загружать всю WеЬ­ страницу (включая графические изображения, рекламные баннеры и т.д.) . При этом приходится загружать даже ту информацию, которая не представляет интерес . Ненуж­ ные данные значительно замедляют получение необходимой информации. Использование WеЬ-запросов WеЬ-запросы впервые появились в Excel 97 и улучшались в каждой последующей -вер­ сии Excel. WеЬ-запросы позволяют получать единственную таблицу с информацией с WеЬ-страницы. При этом поддерживается возможность автоматического обновления данных при каждом открытии книги или через регулярные промежутки времени. Одной из проблем WеЬ-запросов было использование десятичного разделителя и раз­ делителя тысяч из региональных параметров Windows при интерпретации чисел, полу­ ченных с WеЬ-страницы. Если информация о курсе обмена извлечена из европейского сайта, точка воспринимается как разделитель разрядов , а не разделитель целой и дроб­ ной части . В результате курс обмена оказывается на несколько порядков больше. Следо- . вательно, до Excel 2002 WеЬ-запросы не могли обеспечить надежного извлечения ин-
Excel и сеть lnternet 629 формации, в которой используются разделители целой и дробной части и разделители разрядов, отличные от применяемых в США. В Excel 2002 компания Micгosoft добавила в объект Application три свойства, по­ зволяющих временно переопределить параметры распознавания чисел. Эти свойства доступны и в Excel 2003. О Applicat i on. Dec i ma l Separ ator - символ, используемый в качестве раздели ­ теля целой и дробной части. О Applicat i on. Thou sandsSepar ator - символ, используемый в качестве разде­ лителя 'разрядов. О Applicat i on. UseSystemSeparators - выбор набора разделителей, исполь­ зуемых при интерпретации чисел (Excel или Windows). Эти свойства позволяют выбрать в Excel разделители, совпадающие с разделителями на WеЬ-странице, выполнить запрос и вернуть разделители, принятые по умолчанию . Если необходимо использовать возможности автоматического обновления WеЬ-запросов, эти разделители должны устанавливаться в процедуре обработки события BeforeRefresh и восстанавливаться в процедуре обработки события AfterRefresh. Создание таких про­ цедур предполагает применение модулей классов для перехвата событий (более подробно эта тема рассматривается в главе 6). В данном случае достаточно извлечь таблицу с курсами обмена валют. Следующий код создает и выполняет новый WеЬ-запрос . На самом деле проще создать код с помощью ме­ ханизма записи макроса, что позволит обеспечить правильность выделения. 1-: ·- Йзвле\!ение курсов обМ'ена до.riларов CI!IA - c помоЩью ' wеЬ-запроса [Sub GetRatesWithWebQuery () · :(,"_ . . !. Dim oBk As . WorkЬo6k Dim oQT As QueryTaЬle ' Сохранение тёкущ11х ' п9раметров Dim sDecimal 'As String Dim sThousand As String Dim Ы.JseSystem As ~~olean ' · Создание новой книrи Set ' oвk = Workbooks-Add форматированияс . чисел :~-' 1 с.озда.ние таблицы - запроса для ;з9грузки курсов обмена ' дощ1ароiз CI!IA With oBk.Worksheets(l) Set oQT = .QueryТaЬles.Add( . . Connection:="URL; http:/ /www . x-rates.com/d/VSD/t~Ыe.html", Destination: =. Range ( "Al")) End Wit;:.h ' Установка свойств таблицы ·запроса With oQT .Name = "USD" . ' Указат~:. выделение конкретной таб.riицы .WebSele~tionТype = xlSpecifiedTaЬles ' Импортировать пятую таблицу на странице .:.W!=bTa12J,es _ . =: "5 " ~ ~ _, ,. = >'i '
630 Глава 28 Игнорировать форматирование WеЬ-страниц~ .WebFormatting = xlWebFormattingNone ., Не пытаться распознавать даты . WebDisaЫeDateRecognition = True ' Не обновлять запрос при каждом открытии файла . RefreshOnFileOpen = False ' Ожидать завершения запроса .BackgroundQuery = True ' Сохранить результаты запроса в книге . SaveData = True ' Изменить ширину столбца в соответствии с новыми . A djustColumnWidth = True End Wi th . With ' Application End ' Восстановить текущие параметры форматирования чисел sDecimal = .DecimalSeparator sThousand = . ThousandsSeparator bUseSystem = . чs eSys temS epar ato rs ·, ' Изменить разделители в соответствии с разделИтелями . ' на WеЬ-странице . Decimaiseparator = "." . ThousandsSeparator = "," . UseSystemSeparators = True .' Игнорировать ошибки , возника.ющие в результате ' неудачн ого зав.ершения запроса On Error Resurne Next " Выполнить запрос, оЖидая его завершения oQT.Refresh BackgroundQuery: =False ' Восстановить параметры форматирования чисел в E:xcel . DecimalSeparator · = sDecimal · . ThousandsSeparator = sThousand ·.пseSystemSeparators = bUseSystem With Строка . WebTaЬles=S в предыдущем примере заставляет запрос извлекать пяrую таблицу на странице. Буквально это означает пятый экземпляр тега<ТАВLЕ> в исходном коде НТМL-страницы (рис. 28.2). Данный код разбирает WеЬ-страницу и отображает всю необходимую информацию, за исключением графически.х изображений и побочной информации. •
Excel и сеть lnternet 631 в с Menu American Oollar , . . .!.J:..~.~.гт~~~У .<;.~.1~~1.?~.!?.~.... "..". .l !: ! . i s . ~ . .~.~--~1.~~-~--~o . .~.~~".Q.~.~P.~~. . " " ············ ···· · · · · · · · · · ·· · · · ·· · · ·:. · ·"·,! ·.·) ······.·~·..·-~····.·9···.·.·.·.·.·······;····i·n····u······s····o········ 3 i Custom ТаЫе · .J \us.tral.i .an Do.1 .lar ... ! 1 30685 l 65$519~ .J Brэzitian Rea l 2.3095 J .9.:~.з-~.~~~ ... British Pound ' 6 .559816 1.7863 ······т··ca·nadJ"a·n·'Ьaii·aг·· .."................."......"........................... ..."....~ 1·~-~йз:2" ···· ····Ейi24·2в·1г· ········•·· ·· ·· ·· ···:ci1iПeseYuaii , вimi ··········· о.12э32 _;· ·· ···· ··· : ь~iiisi1kГo~e .............. ...................................... ; 6634Г ··· 6i6s72s · ...; . . l Euro i .о 808996 1236 i , · . .··.··. ·. ·· . · ·. .••. ·. ·. ·· .f·· .· ·. · .· · .н1·.n......od..·.", ·.·. · a..9 .. .·n .·.к....Ro....u .." .·.P.~.e·.·.o.e.......o. •.i1a.r. . . . . . ........ ... '.777.09. 6.128685 ................................................................................... :.~.3. ~.4........ 12 ! Xore.x.~a.r.ke.tNey.,s l ~a.pan.e.seye.n . . .. ;1_11 87 . 13 , -~~~re.~E:Y..fo~es~.~t-"··-· • •;.!!la.l!fJ.iЭ.~ i:!io.Я~i!•• -- --· ---··- · ··-·· ___ ----·•..l.3-?.5........ . .:iiJ~~~i;ш~~,P~~cY? i ~ilYii-~~~;~~~t: · ·········································· н;~~;9·...• ~JiiШ1 т 17 i. What m.ovesra.tes?.... ! .~in.gapore Dollar . ... · ··· j 1..6532 . ······ 6604887 j • 18 !. Howto ge1 sta~ed? , SouthAfrican Rand '6.45 .. ; o:i55639 : 19 :. Тhе$эоо мiniдc ct ; ?autii~ore~~~oii 1 01 01 90909842~~ : 20· ! F'Геё F'Гaёiice десi : sri Lan ka Rupee ·· ·2·;· ··:· ····· · · · Swedish Krona ."."..." ... ...." " ..".".".""" .." .. Готс~ео Рис. 28.2. Таблица с.результатоАt выполнения WеЬ-запро са Разбор WеЬ-страницы для получения конкретной информации WеЬ-зап росы отлично справляются с получением таблиц с информацией , находящих­ ся на WеЬ-страницах . Но WеЬ-запросы слишком громоздки, если необходимо получить один или два элемента массива информации. Еще одним решением является считывание страницы с помощью скрытого экземпляра Intei-net Explorer, поиск необходимой · ин­ формации в исходном коде страницы и возврат интересующего результата. Следующий код требует наличия ссылки на объектную библиотеку "M ici-osoft Intei-net Contгo ls". ~su:ь··G-et\:E;b-toGBPRatetisingI E'(T' ~ - . • ' ~ Dim Dim Dim oIE As SIШocVw. IhternetE)Cplorer sPage As String ' . ·• iGBP As Long, iDec_ As Long .Dim iStart As Long , iEnd As Long .Dim dRate As DouЫe ' Создать . новый ( скрытый) Экземпляр IE ::·' set oIE = New SHDocVw . InternetExplorer ' Открыть WеЬ - страницу ·oIE .Navigate "http: //wwW .x -rates. com/d/USD/taЬle .html" ' Подождать полной загрузки WеЬ-страницы Ьо Un'til oIE.readyState READYSTATE_COMPLETE DoEvents Loop
632 Глава 28 йЗвЛечь· текст WеЬ - страницы в переменную sPage = oIE.Docurnent.body.InnerHTML :.'*******************************************************'******** с ' :исходный код HTML для британских фунтов будет ~- ·.·• 13ыглядеть следующим образом: '<tr bgcolor=white> ' <td> '<font fac e =" Verdana" size=- l>&nbsp;&nbsp;Briti sh : ~ Pound&ribsp;&nbsp ; </font> · '</td> ·· <td align=" right ">. '<font· face = "Verdana" size= - l>&nbsp;<a ~~href=" /d/GBP /USD/graphl20. htrnl" ·~class="' rnenu " >О. 5493 6</a>&nbsp; </ font> • . ' </td> . ;<tdalign="right"> . ' <font face = "Verdana " size=- l>&nbsp;<a !~href=" /d/USD/GBP/graphl20. htrnl" . ' ~class= " rnenu">l.8203</a>&nbsp;</font> i • </td> ' </tr> ~ ·~***·**~************************·***********.****'****************;· " Дл~ о.пределения курса обмена необходимо найти .: • запись . для британских фунтов t;~ после чего переместиться вперед с поЛучен,ия , •' значения курса обмена ,.· Найти запись для британских фунтов в строке . НТМL iGBP =' InStr(l, sPage, "&nbsp;British Pound") ' Найти следующий десятичный разделитель, которьiй .,.. ' · находИтся в расширении файла HTML iDec = InStr ( iGBP, sPage, " . ") ' Найти следующий десятичный разделитель, . который ' будет нахОдится в Пределах значения курса' обмена iDeC = In.Str(.iDec; + 1, sPage1 11 • 11 ) ' Найти начаЛо и конец числа .istart = InStrRev(sPage, ">" , iD~c) + i:End ' = InStr ( iDec, sPage, "<") j . . ' . Оценить. число, ·предположив, что оно ••. с.оответствует ' реГиональ:Ным пара.метрам США ' · dRate = Val(Mid$(sPage, iStart, i Eпd ' - • istart)) ;: Вывести курс · обмена M~gBox "Курс обмена USD/GBP равен " , & dRate ', ,,, ,;.;,~......л .~/шh ·:·::~-~:ж.,.~, · Самый подходящий метод зависит от конкретных обстоятельств, а также от необ­ ходимого объема данных. Для единственного элемента желательно использовать по­ следний подход. Для получения большего количества элементов стоит применять W_еЬ­ запрос для перенесения страницы или таблицы в книгу и поиска интересующих запи­ сей на листе .
Использование сети lnternet для публикации результатов Excel и сеть lnternet 633 WеЬ-сервер может использоваться в качестве хранилища информации. Результаты работы приложения могут храниться на WеЬ-сервере и предоставляться большей аудито­ рии, чем при использовании печатных версий отчетов. Размещение результатов на WеЬ­ страницах позволяет читателям применять эти результаты в качестве источников дан­ ных для собственного анализа и передачи результатов этого анализа заинтересованным сторонам. Настройка WеЬ-сервера Все показанные ниже примеры требуют привилегий записи на· WеЬ-сервер. Так как в некоторых примерах используются Active Sегvег Pages (ASP), то в данном случае будет использоваться сервер Micгosoft IIS 5.1 . Запустите консоль IIS и щелкните правой кноп­ кой мыши на узле Default Web site. Выберите пункт Properties (Свойства) и активизи­ руйте вкладку Ноте Directory (Домашний каталог) (рис. 28.3). При этом будут предос­ тавлены различные параметры принятого по умолчанию WеЬ-сайта. Установите флажки Read (Чтение) и Write (Запись) и щелкните на кнопке ОК. @ А directory lьc.:aled on this computer О А sh.are located on another со mputer О А 1edi1ection to • URL Local Path: О Script source access [;;]Read ~WгКе _q_ _ O_i~-~.~~.o.rx..~.~~~~!~~ Applicat ion Seltings Application name: Starting point: ' Е>:ecute Permissions: Applicalion Protection: ~LOg visils 2] lnde:.: this resou1ce , Brow_se. " 1. Remove . J Рщ. 28.3. Настройка параметров WеЬ-сайта .Сервер 115 5.1 ' предоставляется в составе Windows ХР. · Для запуска консоли 115 откроj:jте . меню Пуск. {5tart), выберите пункт Выполнить-{Run) и введите ' команду :i:netmgr. После эtого ЩеЛ~ните ·на кнопке ·ОК. Вместо этого можно ~ткрыть Панель управления {Control Р.3-пеl), выполнить д~зойной щелчок на пиктограмме Админl(!стрирование (Administrat!ve Tools) и запустить консоль lnternet lnformatioл Services. · · ~ ' > • , i Обратите внимание на поле Local Path: (Локальный путь) . Именно в нем определяется корневой каталог WеЬ-сервера. По умолчанию в качестве корневого каталога используется С: \inetpub\wwwroot\. Любая WеЬ-страница, расположенная в этом каталоге, доступна
634 Глава 28 по адресу http: //localhost/<Имя страницы> .html. Именно на этой странице будут опубликованы результаты первых нескольких примеров. Пример Timesheet в этой главе по­ требует настройки виртуального каталога (Viгtual Diгectoгy), что будет рассмотрено далее. Сохранение листов в виде WеЬ-отраниц Самым простым способом публикации результатов в виде V\lеЬ-страницы является создание шаблона книги, в котором определено все форматирование и ссылки. После этого при получении необходимых результатов достаточно скопировать соответствую ­ щие значения и сохранить книгу непосредственно на WеЬ-сервере. lsuь ·Pub:i1shR:ёsu1tsтowёь () •·············· Dim oBk As Workbo.ok Dim oSht As Worksheet ' Создать новую копию книги . WеЬ Templ ate Set oBk = Workbooks:Add("c:\mydir\WebTemplat e.xls") ' Получить первый лист" книги ·Set . oSht oBk. Worksheets ( 1) · ' · В,нести рез ул ьт ат ы. в книгу-шаблон oSht . Range ( "Pr ofits") . Value = Workbooks ( "Results .xls") ,. ·· . Workshee.ts ( ''.Financials") . Range ( " Profi ts " ) . Value '' Сохранить . непосредственно на сервере как WеЬ- страницу oSht ; SaveAs "http://loca1host/ResultsJuly2001.htm" , xlHtml •; Закрыть книгу o:Вk .. Close False .С Добавление интерактивности с помощью WеЬ-компонентов В предыдущем примере статическое предстiвление листа сохранялось на сервере в форма· те HTML. В Excel 2000 компания Micгosoft предоставила доступ к WеЬ-компонентам Office, позволяющим создавать интерактивные WеЬ-страницы. При создании интерактивного пред­ ставления листа выполняются следующие преобразования: О лист или отдельные диапазоны листа превращаются в WеЬ-компонент Spr ead- sh<:;!et; О выделенные диаграммы превращаются в WеЬ-компоненты Chart; О сводные таблицы превращаются в WеЬ-компоненты PivotTaЬle. Эти компоненты являются встроенными в НТМL-страницу элементами управЛения ActiveX, обеспечивающими тот же уровень интерактивности, что и пользовательский интерфейс Excel, но доступными через обозреватель. Подробное описание WеЬ-компонентов выходит за пределы тематики этой книги (в Office 2003 механизм WеЬ:компонентов был значительно улучшен), но следующий код можно использовать для сохранения книги в виде интерактивной WеЬ-страницы. Такая книга может содержать опубликованный диапазон данных (Al :C30), сводную таблицу · и встроенную диаграм11>rу.
Excel И сеть lnternet 635 •; ' . Ко'Лir!:1Кйия ... I ' uЫ is hO bj ее ts содержит )ЗСе · компоненты листа, .: · Ко'тор)'не доЛжнЬr быть опублИкованы на . . ,Woj.th )\ctiveWorkbook. PuJ:5).ispObj eets все .обЪе'~<\:ьr riУ:\)ликации , На'\Jа~ь с WеЬ :С компонента Pivot 'faЬle r . •·. . A dd (xlSou:i;-cePivotTable, "http: / /localhost/page. htrn", "Sheetl '\ , .~. "PivotTablel ". , xlHtrnlList j . Pub::\.ish :rr.ue ;;4 ,;:~; . ~· ' добавить Диапазон 'Листа на эту же ·страницу . . A dd, (x1SourceRange, ' "http: / /localhost/page .hi:m", "Sheetl", . ·"Аl ':СЗО", xlHtrnlCalc) .PuЬlish False· . ' После < этоI'О публикуется диаI'рамма с Исходньrми данными .A:dd (xlSourceChart, "http: / /localhost/page.htrn"· , "Sheetl", · ·~·chart ·l!" , · xlHtrnlChart). Pub1ish Fals.e Обратите внимание, что в предыдущем примере все компоненты публикуются на одной и той же странице . Указание различных адресов URL позволяет создать несколько страниц. В результате работы кода создаются достаточно простые WеЬ-с траницы - они просто используются для размещения различных WеЬ-компонентов (рис . 28.4). Скорее всего, для создания качественных WеЬ-страниц потребуется до.полнительная обработка. Г~ l~ ["';ь ~· ii_т>=·r и·: ir' f.. 10 11 12 13 14 !5 15 17 18 -- в1с . ;..:..- _"j j 2: 1· 2; 1 2• 1 2• 1 2: 1 2: 1 2i 1 i .~ ~!2 2 2 2 2 2 2 2 2 10 1, 2 21 1 2 72 ' -~:!!.__:_}.=2z::::~ iд:.-:~eet l Рис. 28.4. Публикацuя элементов книги в виде WеЬ-страницы
636 Глава28 Использование сети lnternet в качестве канала связи Извлечение данных из WеЬ-страниц и публикация результатов в виде WеЬ -страниц во многих отношениях является пассивным использованием сети Inteгnet; при этом WеЬ­ сервер в основном служит в качестве хранилища. Кроме этого, WеЬ -серверы могут под­ держивать работу приложений, которые обеспечивают более динамическое взаимодей­ ствие с пользователями. Серверное приложение выступает в роли главной контактной точки для всех клиентских книг . При этом сервер выпо.лняет следующие функции: О централизованное хранение данных; О сведение данных от нескольких клиентов; О _распространение данных среди остальных клиентов; О управление процессами; О поддержка механизмов обработки значений. В качестве примера можно рассмотреть систему учета рабочего времени , в которой ю~ждому сотруднику выделяется книга Excel для ежедневного ввода информации об от­ работанном времени. В конце каждого месяца сотрудники подключаются к сети Inteгnet и отправляют книги с информацией о рабочем времени приложению на WеЬ-сервере. При этом серверное приложение сохраняет полученные данные в центральной базе дан­ ных. После этого менеджер подключается к серверу и получает информацию о рабочем времени персонала. Менеджер проверяет предоставленную информацию и выдает раз­ решение на оплату, отправляя код авто·ризации обратно на сервер . Бухгалтерия извлека­ ет авторизованный лист с данными о рабочем времени с того же WеЬ -сервера и загружает эти данные непосредственно в систему бухгалтерского учета с последующей обработкой выплаты заработной платы. Использование сети Inteгnet и стандартных форматов данных при двунаправленном обмене даННJ;>IМИ позволяет интегрировать клиентов Excel с другими системами, напри ­ мер, с системой бухгалтерского учета. При этом необходимые бизнес-процессы могут ра­ ботать за пределами корпоративной сети . В этом разделе такая интеграция рассматривается с точки зрения Excel 2003 . При этом в качестве примера Используется приложение для регистрации сообщений об ошибках . Связь с WеЬ-сервером В пределах корпоративной сети практически весь обмен данными , от передачи фай ­ лов до выполнения запросов к удаленным базам данных, осуществляется с использовани­ ем закрытых двоичных форматов. В основном- из соображений безопасности для обмена данными в сети Inteгnet используются текстовые форматы, _например адреса URL - htt p://www. MySi t e. com/MyPage . htm. Для связи с приложением на WеЬ -сервере необходимо вести обработку на сервере и обмениваться информацией с приложением . В Excel 2003 для связи с WеЬ -сервером может использоваться мeтoд F o ll owHyp erli nk объекта WorkЬook. Но применение этого метода связано с рядом проблем, включая:
Excel и сеть lnternet 637 О все данные, полученные в результате использования гиперссылки, автоматически отображаются в виде новой книги; О разработчик практически не управляет процессом обмена информацией. Компонент Mic1·osoft Inteгnet Tгansfeг Contгol (rnsinet. осх) является более гибкой альтернативой. Элемент управления ActiveX, который часто называют ITC, является оболочкой над файлом wininet . dl 1, предоставляющим низкоуровневые функции сети Inteгnet на платформе Windows. Передача данных от клиента к серверному приложению Существует два механизма, позволяющих отправлять информацию на WеЬ-сервер. Ее можно передавать в составе строки URL или отправлять в качестве отдельного фрагмен­ та запроса НТТР. Кодирование URL Параметры могут кодироваться в строке URL. Для этого перед первым параметром после строки URL указывается символ ? . Для разделения параметров между собой ис­ пользуется символ&. http://www.MySite.com/MyPage.asp?paraml=valuel ~&param2=value2&param2 =value3 Преимущество этого метода заключается в том, что параметры остаются частью стро­ ки URL и могут сохраняться в папке Избранное (Favoгites) или вводиться непосред­ ственно в обозреватель. Недостатком этого способа является ограничение на длину стро­ ки URL (в Inteшet Ехрlогег длина строки URL не может превышать 2083 символа), что сужает объем информации, передаваемой в качестве параметров. Передача данных с помощью запроса POST При отправке запроса на WеЬ-сервер в нем содержится информация о различных за­ головках, в которых передается ·информация о типе и версИи клиентского приложения, типе и версии протокола связи, а также об идентификаторе пользователя и паролях . Кроме этого, в запросе может присутствовать поле POST, которое желательно использо­ вать для передачи информации на сервер. Применение этого способа показано в приме- . ре приложения далее в этом разделе . Передача данных от серверного приложения к клиенту Передача информации от приложения клиенту выполняется очень просто - данные могут предоставляться на WеЬ-странице, которую можно считывать с помощью стан­ дартных методов, рассмотренных ранее в этой главе. Приложение WеЬ-сервера - запись журнала ошибок Существует ряд конкурирующих технологий, обеспечивающих возможность обработки данных на WеЬ-сервере: .NET Fгarnewoгk, PERL, CGI, JavaSeгveг Pages (JSP) и Active Serveг Pages (ASP). Разработчик VВА может создавать страницы ASP с помощью языка VВScгipt. Для предоставления страниц ASP в качестве WеЬ-сервера должен использоваться Mi- cгosoft Inteгnet Infoгmation Serveг под управлением операционной системы Windows NT, Windows 2000, Windows ХР или Windows Serveг 2003, или Peгsonal Web se1veг под управ­ лением операционной системы Windows 98 или Windows Ме. Дополнительную инфор­ мацию можно найти в разделе "Настройка WеЬ-сервера" ранее в этой главе .
638 Глава 28 В следующем примере показано создание приложения для WеЬ-сервера, обеспечи­ вающего работу центрального журнала для любых ошибок времени выполнения, возни­ кающих в процессе работы приложения Excel (или любого другого приложения). Сер­ верное приложение состоит из трех компонентов: О базы данных.Ассеss, в которой хранится журнал ошибок; О активной серверной страницы для записи в журнал ошибок; О активной серверной страницы для отображения содержимого журнала ошибок. Клиент (Ехсе!) использует общую процедуру обработки ошибок. База данных Access для хранения журнала оши"бок Сначала создайте базу данных ErrorLog. mdЬ в Access 2002. База данных .р;олжна со­ держать таблицу ErrorData со след}'!Ощими полями: Имя поля Тип данных Комментарий ErrorID AutoNumber Сделайте это поле первичным ключом ServerTime Date/Time Application Text 50 символов ErrSource Memo ErrNumber NumDer Loпg lпteger ;ErrDescription Memo В этом примере в журнал записывается фактическая информация об ошибках. Обыч­ но в реальных приложениях хранится значительно больший объем информации, вклю­ чая имя пользователя, имена файлов с данными, имена книг и модулей, версии Excel и Windows, а также региональные параметры. С помощью FгontPage 2002 создайте новую WеЬ-страницу и импортируйте базу дан­ ных. Для этого воспользуйтесь командой Filec::>lmport ... (Файлс::>Импорт) . F1·ontPage ав­ томатически создаст папку fpdЬ для хранения базы данных и подключение к базе дан­ ных. При этом у разработчика будет запрошено имя для создаваемого подключения. На­ зовите подключение ErrorLog. Виртуальные каталоги Как было показано ранее в разделе "Настройка WеЬ-сервера", в данном примере будут использоваться виртуальные каталоги. Откройте IIS и щелкните правой кнопкой мыши на узле Default Web. Выберите пункт Newc::>Virtual Directory (Создатьс::>Виртуальный каталог). После этого запустится мастер создания виртуального каталога (Viгtual Diгectoгy C!'eation Wizai·d) . Щелкните на кнопке Next (Далее) и введите псевдонимVВА_РrоgRеf (рис. 28.5). При этом URL http: //localhost/VBS_ProgRef будет перенаправляться на лю­ бой указанный каталог на жестком диске. Имя этого каталога передается серверу IIS на следующем этапе. Введите имя каталога, в котором Fl'ontPage сохранил страницы ASP (рис. 28 .6) .
Excel и сеть lnternet 639 Virtual Di rectory Alias You must give the virtual di rectory а sho1t nome, or аГ!аs, for quick 1eference. " Туре the ·al~~yOu_want to use to gaii1 accesst~ thisWeb Vi1tual diн~ctOfy. use -the same naming c~ventiom t~t ~ WOtid for namiГig а directory ~ ·· .- ·'· AHas: , ,,<Bock 1c~~~i} JI ,, Cancel , Рис. 28.5. Ввод псевдонима д//Jl виртуального каталога \lleb Site Content Directory Whe1e is the conlent you want to puЫish on lhe Web site? ------~- ~~~-------------- --- Ent~1 Uie path to the dlectory lhat contains the contenl DirectOfy: Рис. 28. 6 . Выбор каталога на жестком диске Щелкните на кнопке Next (Далее) и проверьте доступность каталога на запись . Это завершающий этап создания виртуального каталога , После этого адрес URL http: //localhost/VВA_ProgRef/MyPage.asp позволит получать доступ к страни­ цам в каталоге С: \Му Docшneri ts \Му Webs \myweb \. Страница ASP, записывающая данные в журнал ошибок Создайте пустую страницу во Fi-ontPage. Сохраните страницу под именем StoreEr - ror. asp, активизируйте вкладку HTML и скопируйте следующий код HTML: i<:%@ '. LANGUAG~--;vвscRTPт-- %>'~ '<% - \ '" h ******~**~~***~****~*~*~*~*********************~************* ~;~* •· ' ' ' · '* Иця стран!'1цы: st.oreError. asp ~1*
640 Глава 28 8ходнЫе параметры: ' информациЯ для сохраненИ я * в журнале ошибок передается с помощью запроса POST ~ ·* (который используется в WеЬ - формах). Файл POST '*содержит информацию в формате: t'* Имя1::значение1&Имя2 = ЗначенИе2&ИмяЗ = ЗначениеЗ и т. д. '* . . • * выходные значе·ния: возвращает номер созданной записи с '*· информацией .об ошибке '* Назначение: . Получает информацию об ошибках приложения и сохраняет полученную информацию в базе данных '*********~**** ·***!****~******** ·**********************- ******** Dim objConn, t?bjRS, sтаЫе, lErrID, objField, objID °( · • Игнорировать'· любые ошибки, · например, отсутствие некоторых ' полей ' в. зi:!про'~е POST .• On Error Resume Next ' Создать ссылку на Объекты Jet Engine для очистки кэшей Set objJE ё' ' Server.CreateObject("JRO.JetEngine") · ' Создать пОдк,nючение ADO , . . Set objCon~·: = Server : CreateObj ect ( "ADODB. Connection"') ' ВоспользЬвать:ся строкой подключения, сгенерированной • во FrontPage objConn.Open Application("E:z;:rorLog_ConnectionString") ' Очистить : кэш' для принудительной записи dbj_JE . RefreshCache obj.Conri · ' Создать подключение к таблице журнала ошибок Set objRS = Server.CreateObject("ADODB.Recordset") objRS.ActiveConnection = · objConn objRS . LockType = 3 objRS.CursorType = 2 objRS.Source "ErrorData" objRS.Open ' Добавить запись в таблицу . журнала · ошибок objRS. AddNew ' Внести всЮ информацию об ошибке For EachobjField in objRS.Fields
"· End ·sei~ёt Next .' Сохранить Данные в баЗе данных objRS.Updat e r, · ' Счита,ть иден тифи·катор ошибки и objR,S;Иove L<;ts t ;Response,, Writ,e . objRS. p;i elds « О) .Va lue · ' .objRS . Gl ose . set objRS = NOth ing " "• Очvr'стИть ' кэш для принудительной obj JE,; :p.e f resh'Cache objconn · objConn . Close . set obj(:qnn Nothing < Nothin g Excel и сеть lnternet 641 Код просматривает файл базы данных на сервере и ожидает, что для каждого поля в базе данных в запросе POST будет присутствовать параметр. Функция Reques t извле­ кает значение параметра из строки POST. Извлеченное значение записывается в базу данных . В завершение работы подпрограммы вызов Response . Wri t e отправляет иден- тификатор клиенту. · Страница ASP для просмотра журнала ошибок Сценарий страницы ASP для просмотра журнала ошибок достаточно сложен , так как он генерирует код HTML для просмотра страницы в обозревателе, а также предоставляет возможность 'перемещения между ошибками . Создайте новую страницу Error Log. asp, пер еключитесь в пр едставлен ие HTML и скопируйте следующий код : :<%@ LANGUAGE =V.iзsci:йPT %-:>· ·. - " .,-~ ,,,, '<% ' '·. "* [ '*Имя: страницы : Er:rbrL'og. a sp ; ~· ..·· .· ' ~ . . t ' * Вх одные п араметры: ErrID - r.',*. быть. показа на в об озревателе i•*' •Ор · r•·* , [ •* Выходные · значения : " •* обозревателя ;' ~ Назначени~ : Обеспечивает возможнос т ь .просмотра ' ' * данных журнала ·ошибок -~· 1*':' . r l* ~ * ~~************ * * * **********~•***** * ************ *** *** * * ' Любые ошибки будут игнорироваться On Error .Resume Next · ' Считать параметры, переданные в URL s Op = Request .QueryString ( " Ор ") ,iEr:t = , J:Sequest. Qu ~ryS tr in9." ( " E:rrID.: )
642 Глава 28 sOp Else sOp End If , ,End .If навигации .If iErr = 1'Last .11 · If ·iEr:r; 7 "" Then iErr . 1 .If iErr- < 1 Then iiEFr 1 ·тhen ' .,создать . поДkлЮ Ч ен(1~ к базе дан ных журна,ла ошибоN , objConn' • ;;о' •Serv:er . CreateObject ( "ADODB . Connection") , Open : дppli?:j:ttion ( '~ ErrorLog_ConnecЦc>nString") ..' СоЗ•д~т~ пс>д~~~·~~~~ ' к , та~лице журнаdа о~ибок , ' . . ' set objE.S =: per:;r eJ:: ': .CreateObject ( "ADQpB.Recordset") objRS . Activeconriection = , objcorin objRS .cursor'rNoe/ = ' З _, .j • ' .· ·-. - ~".
Excel и сеть lnternet 643 Подпрограмма обработки ошибок в Ехсе/ В то время как база данных и две страницы ASP работают на сервере, необходимо на­ писать подпрограмму обработки ошибок в Excel для регистрации ошибок времени вы­ полнения в базе данных на сервере. Для отправки информации об ошибках на приложе­ ние WеЬ-сервера используется объект Microsoft Internet Tгansfer Conti·ol. Кроме этого,
644 Глава 28 ошибка отображается в простом окне сообщения. В реальных приложениях на сервер от­ правляется больший объем информации, а пользователю выдается более понятное с9- общение об ошибке. Откройте книгу в Excel 2003 и добавьте ссылку на Micгosoft Inteгnet Tгansfeг Contгol (возможно, для этого придется найти файл msinet. осх, который обычно расположен в каталоге Windows\ Sys temЗ 2). Скопируйте в модуль следующий код: :.optiьn "E:xi;JJ.Ici i:· - 1: · общий обработ.Чик .оwибок ;·;;uь Errorнandler ( ) -; :~. oinet As Inet . ' ·.: · lConte~t : As Lo~g • sData ll.!3 . Str:i,ng ' sHeader As · str±ng sResult ' AsString ' ·,:':'' . (·:;," · ';~3.емпляр объекта Internet Traщзfer Control ne.t ' ·.создать . с~року. запроса POST с информацией об 0шибке "Арр:ЦсаЦоn=ЕхС;еl 2003 Prog Ref" & "&"&' ;;, ~· Errsource=" & Err. Source & " & " & ."ErrNiimЬer=". & Err.Nurnber & "& '' & "Er"i.-D'e{~C:ription=" & Err. Description . . ... Пр~бе~Ьr}·~~о:~·k~димо заменить на символ + (• .' .~ •.. s'Data ,;: Rei°place (sData, "+" ) . ~ ~>:'!:{ ;· .. :·Ъ':t{'.·>"" ·,,~:;.,"·:;·~"-' ' . У-казать передачу !3 запросе POST закодированного ·!" спи(::ка лаJ?аметров sHeader '· 'ё · ••coi;itent-Type: appllcation/x-www -forrn-urlencoded." ' ·отправить информаци'ю об ошибке на сервер ;, o1net. .AccessType = icDirect oinet.Execute · " http://localhost/VBA_ProgRef/StoreError.asp", sD.ata, sHeader :""· · Подождать, пока .сервер не завершит, обработку • Do . While oinet.StillExecuting · DoEvents · · >Loop ' Из.влечь полоtченный текст (например, идентификатор ошибки) · · · 1content ;= · o.Inet .· GetHeader ( ".content-length") ·sResu1t. = orriet.Get.Chunk(l·cantent + 100) • . ~!· .• "В базе данных . сохранена ошибка номер " & sResult ош~:~·е-жу деления на ноль для . проверки обработчика ошибок errHandler на ноль
Excel и сеть lnternet 645 Sub Запустите подпрограмму Testit несколько раз для проверки процедуры обработки ошибки. Если все настроено правильно, будут выдаваться сообщения с увеличиваю щи­ мися идентификаторами ошибок. Передача информации между клиентом и сервером осуществляется с помощью списка пар параметр/значение . Компоненты слабо связаны, поэтому изменения в одном компоненте не потребуют изменений других компонентов. Такая слабая связанность и является основным преимуществом WеЬ-приложений. XML С усложнением систем между ними стали передаваться все большие объемы инфор­ мации . На определенном этапе списков параметр/значение становится недостаточно для передачи всего объема информации. Для сохранения слабой связанности WеЬ­ архитектуры был разработан новый формат для обмена данными. Этот формат называ­ ется eXtensiЬ!e Maгkup Language или XML. Формат ХМL позволяет структурировать данные в иерархические отношения и назна­ чать каждому элементу определенный тип данных (например, Name, HouгsWoгked и т.д.). Код XML для простой карточки учета рабочего времени может выглядеть следующим обра­ зом (при этом префикс TS: используется для отделения собственных тегов от других тегов). . . ·~ Bock • ~ • i~:J @ ~ :}JSe•rch. 'j'~ F•~or<es • ·. A1drr?s.; ·!i1.ht~·~·;1μ:·~ih~~t/VВ~~p~·~·~~;fi'Ё;~~~=~·~·~ ~~~;~·R. .ii) ~··. '•; i;:k~ ExGel 2003 Prog Ref Application Error Browser Error Numb er: [ З ServerTime 112312004 4 09 00 РМ Applicarion: Ехсе! 2003 Prog Ref ErrSource: VВAProject ErrNumber 11 ErrD escriprion: Division Ьу zero Рис. 28. 7. Просмотр содержимого базы дан­ ных с информацией об ошибках
646 Глава 28 ~~:~;Y~~~~~n~;~~o;:~ ··;imesheet> . . . . . . . ;.,(TS,: T imesЪeet xmlhs: TS-=; :• urn: schemas_ wrox _ com: Excel ProgRef: Timesheet "0 > J. <+s: Emplo~ee>, · . . . · · · ·• · • <TS:FirstName>Stephen</TS:FirstName> .·~ <тs:LastName>Bullen</TS: LastName> · · <TS:EmployeeNumЬer>1234</TS:EmployeeNumЬer> </TS:Employee> . · .<TS :ReportingMonth> . · •<тs:Year>2001<:/.TS:Year> . ' <TS: мonth>б<Iтs .:мonth> <TS:TotalstdнC>urs>157.5</TS:TotalStdНouis> </.TS:ReportingMonth>,- '<тs: HoursWor·ked> ·,, " ,\, <Ts: рау> i<):rs';i:J'ay> ·· ' <TS·: StdHouis>7< 5< / TS: StdHours> , .<TS: Overtime;:,~</T~: Overtime> </TS:HC>ursWorked> <TS:Hoursworked> .<тs: Day>4< ;тs/рау> . <TS:StdHours>7.5</TS:StdHours> · .<TS: ov~rtirne>ti< ;тs: Overtime> i· </TS :HoursWorked>;f:,; .,. .<тs.,нoursWoiked> ·>1 . <TS: Day>S< / TS : Day> <TS: StdHoμп;>, 6</TS: StdHours> . <TS:Overtim~J> . ;. ·<;тs: HoursWork~d> .::i: ;i;1.т.s,_:1'J1.'11~sh~et> :~:.·"с:;г ,.2:. '\•.. Для отправки данных приложению WеЬ-сервера можно воспользоваться все тем же механизмом запросов POST, который применялся для отправки пар параметр/значение . Тег <?xml -version=" 1. О"?> в начале кода идентифицирует код как XML. При этом приложение на сервере загрузит код XML в программу разбора (XML Parser), позволяю­ щую извлекать структурированные данные. Словари XML В предыдущем примере в коде XML карточки учета рабочего времени. используются теги <T imesheet>, <Employee>, <ReportingMonth> и т .д. с произвольно выбранны­ ми именами. Имена тегов придуманы спеЦиально для этого примера. Любое приложе­ ние, пытающееся извлечь информацию из текста XML, должно знать, что означают эти теги и какие типы данных они представляют . Такое описание данных XML называется "Словарем XML". Для обмена информацией оба участника диалога должны использо~ать один и то1' же словарь. Хотя любая организация и даже каждый разработчик могут определить собственный словарь, существует несколько стандартизирующих организаций, работающих над опре­ делением словарей XML, соответствующих требованиям отрасли. По возможности стоит использовать стандартные словари, а не в очередной раз изобретать велосипед. Начи­ найте поиск словарей с сайтов ht t p://www. wЗ. org, http://www. BizTalk. org, http://www. rosettanet. org или с сайтов регулирующих органов конкретной отрасли.
Excel и сеть Internet 647 Схема XML-SS Одним из таких словарей XML является схема XML-SS, которая используется 'компа­ нией Micгosof"t для описания данных из электронных таблиц. И Excel 2003, и библиотека Office 11 Speadsheet Web Component могут читать и записывать XML с помощью схемы XML-SS . До последнего момента документация на схему XML-SS была доступна на WеЬ­ сайте Micгosoft. Но в результате одной из реорганизаций эта документация исчезла. Для получения представления объекта Excel Range в соответствии 'со схемой XML-SS воспользуйтесь новым аргументом свойстваRаngе. Va:lue: tsu15;Qe,t~a~g5~2fмL () . . . ~-,,, "· i · Dim s>RangeXML As String 1,;. ~t'{ ·, · ъе~ат~ ",~ окне Imme~iate ! :г Debug }rint sRangeXМL f-· ;"- _ /"' k• :End Sub · ··· • · >..•. ,_~ . .. .. . ...... ...-~;-,_,.,_...,._"л.;:..; ,;о.;,;,.'°""'""'·.-.,; · ;;v,~• •мж "'·~ык""_._"iс< Рассмотрим следующую карточку учета рабочего времени в качестве примера (рис. 28.8). Рис. 28.8. Карточка учета рабочего времени В результате преобразования в соответствии со схемой XML-SS будет получен сле­ дующий код XML (некоторые дни удалены) . r<?.Xffii'· v.ersIЬn.=~·u I. 6 · · ?.> ,".... ~-~ "'"" ·- "". f<'?mso:..appiication ·· progid= ." Excel. Sheet" ?>" . ~<Workbook xmlns.= "urn: schemas-microsoft-' com .: 6ffice: sp:peadsheet" xmlns:iJ="urn :schemas-microsoft-com:office:office" , f xmlns :х= "urn ·: schemas-micr'osoft-com: office: exc~ l" ' ~ ):.CJ:n_:J.!f_§.: s§=: ·:.i,irn :g9:Q.e,m~s -:_;nic:i::<?S.52.f.t-:<;;9m: of Ц9е : _spre;;i. dshe~J;:~
648 Глава 28 ~>'ZirJi~s ?htmi·; "http: ЛWWV.. wз . org j тR./RБё.<Ъtml 4 о "> i'• <iDo'cumentProperties xmlns="urn: schemas - microsoft-com: office.: office " > <]\cithor>Brian Patterson</Author> <LastAuthor>Brian Patterson</LastAuthor> < · f'eateci>2004-01-2sт22: 20: 36Z</Created> astSaved>2004;_01:-25T22 :.23: 53Z</LastSaved> Version>ll. 5606</Version> · p'OcumentProperties> ·... xcelWorkbook Xmlns="urn:schemas-microsoft-com:office:excel"> <WlnQ.owHeight>6810</WindowHeight> <WindowWidth>4635</WindowWidth> ·. . ;:w:lndowTopX>120</WindowTopX> ,, ,..;Windo'wтopY>l5</WindowTopY;> t .·.·~:~~~=~~~~~~~~~~:~:~~~;~~~~;:~~~~~~~;ure> ~''<:;/ExcelWor)<book> . .. ./ ,,\(. i.·<~~~~f:~ss,: ID:i "Defaul t" зi<:~~фе= "Normal "> . f <Alignri\ent . ss:yertical="Bottom"/> f <Borders/> r o;.<::Font/> ~ •,'· <Interio:r- /> К< $~\1mЬerForЦ1at/;> : . <Protecti·on/> ~> <Istyie> ; <Style :Ss :ID='! "322 ">' ' ,. ;-::Fon t · x:Family=-"' sw · 1<;.s't:yle;O; · < · · "" г .~'styl~ ss::tp=·i s23"> ~ .·· <J'llignment . ss :нь'f-izontal;"Center" ss :Vertical= "Bottom" /> ~f.· <~oцt x:Family;;:, •' . sw· " • ss:Bold="l "/> f </Style? ' . .. . •· ~st:i1~ ; ss; ~.·· ,:<A:figpmeh ss :.Vertical= "Bottom" /> ~ <Istyl'e~ ··· .. .· t <9tyle '~sq:1·I?="s25">' . • 11 ::.< <J>!umP~rF6rriщ t ss: Format= "@" ! > ii·,c</styleS. '· • . ~ /s'tyles;;. .. ;<:wo'rksheei: · ss: Name'= "Timesheet" > , i' <Table ss :ExPaiidedColUmnCbunt=" З" ss :ExpandedRowCount=" 15" : ~x·;Fu11Co].umns=';l" ' · " : ~ x:FuliRows="l .~'> ' ~Colшnrt ss:AutoFitWidth=" O " ss:Width="70 .5 "/> <:,colμmn ss:AutoFitWidth="O" ss:Width.="61.5 "/> z· <~ow> .' > . . ' . .<Cell .ss: StyleI,D= "s22 "><Data ss: Туре'=" String" >Employee · :: </Data><!cell> <Cell><Data .ss: Туре'= "NumЬer" >1234</Data>< /Cell> 's s : StyleJD=" s22 "><Data ss :Туре= ''String" >Surname: </Data></Cell> ' (!elI><Di&ta · ss:Type="String">Patterson</Data></Cell> Ro\:J> .. . . '' <Row> <::<:celi ' ·' ks: StyleID= "s22 "><Data ss :Туре=" String">First name: </Data></Cel~> ; " ' < <CeTl'><pata'' ss: Туре=" $tring" >Brian</Data></Cell> г .< _/R _ow>! ·). · , . . , г' <Row ss :тndex=" s" > ~:<' \ .<Ce'll ss: Styl€ID="'s22 •;><Data 'ss :Туре= "String" >Month</Data></Cell> ' iЬ-:f:;g1J..~?·~ ?J:.Y:Jo~~TP':' с' §~,s .:·>~])~t9' . s .s: Туре:=".?Ч-i.ю.g'.' >January
<RQ~ ss:Index="7 "> <CeJ.Pss:StyleID= "s23 "><I)ata <Cell . 's s : StyleIP=" s22" ><Data ~te ll ss:~tyJ.eID="s22"><Data <Row> Excel и сеть lnternet 649 . . <tell s ·s: StyleID=" s24 ,;><Data ss: Туре= "N'umЬer">i</Data>< <Ceil><Data ss: Туре= "NumЬer ">7. 5</Data><'/CelJ.> · · <cell><Data ss: Type="NumЬer" >2</Data></Ce11> · : <iRow> .<R()w> ·~: <Cell ss:StyleID="s24">«Data <Row> <cell ss:StyleID="s24"><Data ss:Type="N'umЬer" </Row» <Row> <cell ss: StyleЦ>= "s24" ><Data ss: Type="NumЬer" >4</Data></Ceil>. <Cell><Data ss:Type="Number">7. . 5</Data></Cell> .<Ce ll><Data ss :Туре= "NumЬer" >1</Dat·a></Cell> </Row> <Row> <Cell ss: StyleI.D= "s4_4 "> <Data ss: Туре= "NumЬer" >5</Data></Cell> <Cell><Data ss: Туре= ;,NumЬer" >6</Data></Cell> . </Row> .· · · ·. <Row> <Cell· ss: StyleID= "s 24" ><Data ss: Туре= "NumЬer">б</Data></Cell> <Cell><Data ss:Type=- "N~er">7. 5</Data></Cell> . </R·ow> <Row> .· <Cell ss: StyleID=" ;24" ><Data ss: Туре= "NumЬer" . >7</Data></Cell> · <Cell><Data ss :туре = "N\nnber" >7. 5</Data></Cell> · </Row> ''. ·· · · <Row> , . "...·. . . . . · <cell ss: StyleID=" s24 "»<Data ss: Туре= "NumЬer" >8</Da.ta>< /Се11> :<Cell><Data ss: Туре= "NJlmЬer" >7, 5<}Data></Cell> < /Row> · · "• '·. .·." · ··' ·· ·· . </ТаЫе> . r, <WorksheetOptioщ; xrnins.= "urn :'schemas-mi'cposoft-com: <Print> <ValidPri:nterinfo/> <HorizontalResolution>600</Horizont.a1Resolution> . <VerticalResolution>O</VerticalResolutio:n> . , </Print> · <se:i.ect:ed/> <ProtectObjects>False</ProtectObjects> ' <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> :< /Worksheet> <Worksheet ss:Name="sheet2"> 1 <Works)тeetOptions xmlns= "urn: schemas-microsoft'-c o m: office: excel "> <!"rotedtObj ects>False</ProtectObj ects> · <ProtectScenarios>False</ProtectScenarios> . </WorksheetOptions> '< /Wcirksheet> ;<Wbrksheet ss: Name=" SheetЗ "> · <WorksheetOptions xrnlns= "JJ.rn: schemas-microsoft-, com: office: excel ''> · . <ProtectObj ects>False< /ProtectObj ects> . , <Prot ~ctScщ1ario s>Fal. s § !_</P.fO !_:?ctScenai; :_ios~
650 Глава 28 ~·~1:гyworl<sh'eetoi:> t: i c;n.з·;. ·­ r-<: 1Worksьee t> · ~.!.k9I:E-029J<:~... _~- Код XML для книги содержит данные, формулы и форматирование, но не содержит встроенных объектов, диаграмм и кода VВА i><tr· -- -. ~" ,,!,~ - - • -;~-.:.~;' - , . - • ' ' ~ ДолоЛнительная 1:1нформ~u,~·я;'о Помержке XML в Excel 2003 ·доступна на сайте компан11И. MiCrosoftno' aдp~cyhttp!'://ksdn.inicrosoft.com/Office/. - · , ..· \ ', - • • , '? "" :•~\,:' ::~···'·><i:'', - . -. ;. ,. . , Использование XSLТ для преобразования XML Рассматривая данные, соответствующие схеме XML-SS, можно заметить, что они вы­ ражаются в терминах книг, листов, таблиц, строк и ячеек, хотя в показанной ранее кар­ точке учета рабочего времени данные представлены с точки зрения объектов Timesheets, Employees, ReportingMonth и HoursWorked. Перед отправкой данных карточки учета рабочего !!ремени на WеЬ-сервер необходимо преобразовать схему XML- SS в схему Timesheet. Эта задача выполняется с помощью XSLT или eXtensiЫe Stylesheet Language: Transfoгmations. XSLT является декларативным языком, позволяющим применять таблицы стилей к исходному документу XML. Таблицы стилей выбирают из исходного кода XML опреде­ ленные элементы данных в определенном порядке. В результате получается новый доку­ мент XML, соответствующий целевой схеме. В данном случае преобразование будет вы- ' глядеть следующим образом: 'ltl:iL ?:;Г$;':+7g_9p_c.тi3e-~Ekiй '."HИ(:;~ стИ,Jr~й -·; ·т.l_rne.sь·eёt.': x}fJ'Z" Ниже показан код XSLТ для такого преобразования: :<?xml versio n=''f' .. (J ;; ?> - ,. ·. i<xsl: Styleshe'eб ver's.ion=" 1. 6•• j xmlns !xs}="ht:,tp: p ~ .' wз. org/1999/Xf>L/Transform" · " xmln9: xl,= "'Цrn: schemas-microsoft-corn: of fic.e: spr,eadsheet" xrnlns:ss.:="urii:scheпias-rnicroso:!t '- com:office:spreadsheet" ~ •. : ' exc~yde-result ,_: ~r;efi~es= "xl ss ·~ >. > ' .'· . ' '.. '''' ~<xsl: ternplate mat _ch=" /xl .<Workbook/xl :Worksheet/xl:Tab1e" > .·· , ..... t<тs· : irimesh_eet" хm1,ш>: ,: тs,~. i:urn: schemas_:::wrox-". corn: I;:xcelProgRef: Tirnesbeet" > ~," <TS':Emp~oyee>. · , · · · · '· <TS;Eirs.tName> " 1 .,. '<xs·l: value·-'of.. , . '-·", . kQ}se1e~t_,;,,,xl: R~w/i1 :cbli [xl :NaroedCe1l [@ss: Narne= 'Fo:teNarne •] .] ;~ic. Data" /> · i· i </тs:FirstNa~e> " · ·' :< · ··«.· .. -:· ·· ' !, .. ·/:··. <iт:~~~~~~~:::of ~f •. " ,·; •· ·· )...•• /,. · • r~s~iect='"xl: Row/Xl :сЕ:н [Xl :NamedCell [@ss :Niirne= 'SU:tname '· ] ]/Xl: Dctta "'/> i·· .• ·. ' '. ·. .' :. . . '· ' ' ' с . . ·> ' • , .~·.• • '' ь ' </TS:LastNaп\e> · . ·. i;, • <тs_,: ErnpioyeeNuniЬer> ;, :·~ ~·i.·' .>+ :<.).>sl :value7 of · , ; ·-~ . . . '· . .. /.. ~~s~~~Фtz:= "х,1: Rciw/xl: сеГI [xl :~§lmeqcell [@~s: Nai1)e ,:; 'вmр~о ;) J /xl: Data:"I> . · · « ~/TS ':EmployeeNurnЬer> · · · •· ·· · · · · · . ;</TS: Employee> ·' · · ~TS ;'RepdrtiIJ,gм"Onth:>., · <TS: ,Year»' '' '·. '·· . ,. .'-.. ;::x~1::va1ue .... of · •.!.'~'· ,.·., ·," ·•, · J·; ·•• ." • . ' · 1'" · i~se1e,ct=: s:ibstr,ing (xl :Row/xl,: C~ll [xl :NarnedC~ll[@ss :Nam~=· Month ~ . 1 J lxl !~:Data,1. ,4):'/>"· .. · · r~~.~~./1',;?":,~xea~> h-~,~:"~A. ~:·,."~-. ,",' 7 '
тs!.Моn:tн>·" ' -= . · ". . • <xsl:Value-of :Se1'ёct;,,"··sub~tring {xl Excel и сеть Internet 651 :oata., б;· 2)' ;,-/> · ~ ;, ~/TS:Moцth> - , ~·· -::тs :TotalStdHours> · ,, . . ., · " · · · ;·. ~·. . , <;xsl,:va·lue-of . · . , ,, ·. · ', , ., :. ' . '·· ~~;se}-ett7 ·:xl: Row/,xl: Сеlч;х1 :NamedCell [@ss: NаЩе"'' StdHours'],] /;xl: D~t~·~ /> . ~ . . </TS: TotalStdHours> · · , . ·1·-;"'·.,· · r .'~<:/r$):.~~portingMonth> . ' . .· ' >·. " ,,, ':_. , ),,· . .:' ..· .'i .., ·. .\' 1· ..;xsl: f.or':C(each select= "xl :'Row/xl :Cell ('xl :Name.dCell [@ss: Name= 'Days'] J "> (,. <x,:зl:ij: ' ' · ,· .· .. ; 'r. ''· <:·.· ~~·!С · . •· . · l9<>test'= "string (numЬer ( .. /xl :Cell [xl :NaпiedCell !@ss' :Name,_ 'нours ' ] J/xl' ~~:Data))~="'< ·r;iaN!"> ·. · ·· '-. · · · ; " ;.-::тs :Hbursworked>. ~. ;,~,-··. '<тs = Day> !;'•/ ' ;:r. <xsl: value..:.of . > . , ," . ·.: ~.~sele~t=:·. ,· zxl: cell [xl :' Namedceli [@;,;'s ::Named ' Days/ j: . (,, <!T.S:Day> · . ··• . , .. ·· . . . (,' . <:TS:StdHours> • '·· " .. i'' . :'Ь ,1·,· <xsl :,;alue-o~ · .' ' . ..· · ·· . . ;,; .. ·. "~select=" ·; : /xl: Cell [xl :NamedCell [@s:s :Name= 'Нош: s']] /xl :Data" /> '. ·. ·..«/т s: s 'tdHours > . ..t .. ·'· . . 1 Код XSLT может читать и человек. Главное , понять следующие правила. D Только теги, которые начинаются с <xsl> и </xsl> являются элементами обр а­ ботки. В них программе разбора XML сообщается, как ц,ыполнять преобразование данных. D Все остальные теги копируются в исходящий поток. D Следующее выражение находит ячейку с именем диапазона ForeName и возвраща­ ет элемент Data (то есть, его значение) . В языке VВА эквивалентом такого преоб­ разования является инструкцияRаngе ( "ForeName" ). Value. D Нижеприведенное выражение запускает цикл For. . . Each для всех ячеек име­ нованного диапазона Days. Эквивалентом этого выражения в языке VВА является оператор For Each oCell In Range ( "Days"). Cells.
652 Глава 28 О В схеме XML-SS существует древовидная структура Лист=>Строки9Ячейки , по­ этому родительским объектом для ячейки (../ в XSLT) является строка, а значит, эквивалентом выражения ; ~~JE!,Ct;,,:::·:~;~ {'x±:._:'.<::e.i.JJ~1 .:Jla,rтiedce),,1 J.~ss ;_rqame~ ' н6:iirs · J J (~i; bat.a" 15 :., . в языке VBA является !J\pp}ic~aИ:c?n" r r.it~rsect ioC:eц .)n(i,re~qw , Rang e ( "нouri3" )J", v~l~e_·-:;:~:::.· -~ ~- · О При трансформации удаляются дни, информация для которых не вводилась . Сле­ дующее выражение XSLТ rt:&i.§I:::·;;~.r~'i1&Xt11\!t!t:E!i.J ., :.:J и .':' ·Nii!f~ ~ эквивалентно функции VBA I sNшner i с ( ) . Ссылка на этот код размещается в ячейке "XSLT" на листе "XSLT" (рис. 28. 9). Код VВА для преобразования и отправки кода Timesl1eet ХМL приложению на WеЬ­ сервере показан ниже . Для преобразования в данном случае используется программа разбора MSXМL (эта программа разбора доступна в объектной библиотеке "Micгosoft XML, v3.0"). XML Опреде.цить три экземпляра · программы разбора MSXML Один экзеr;шляр будет и спользоваться· для исхо.чного ' ' кода XML - в формате XML-SS Diпi xmlsource As MSXML2 . DOMDocument30 . ~\ для преобразов;щия _ ':, ' 0ДJ,i1-i э·хЗмепляр будет использоваться Для · цолученiюriо ' кода ХМL в формат TimeSheet ' Dim xm1Timei3h'eet As MSXМL2. DOMDocumeritЗO ' ,х , ;:<\".~· . ' ' · Inteц1et Transfer MSXML ··v . Загрузить исходный -код хМL с листа тiпiesheet 1 source, loadXМL Worksheets ( " Timesheet " ) . Range ( "Al : С4 о" J · ':'al1;1e(xl RqngeValueX!1LSpreadsheet)
Excel и сеть lnternet 653 Считать полученнЬlй ко.n TimeSheet XML ; в': переменнУIQ sTi~esheetXML = xmlTimesheet.XML Создать новый экземпля:р объекта Internet Set oinet New Inet Отправить код XML на сервер oinet'.Execute "http: // localhost /MyPage.asp", "POST", А ·\~ <?xml version= "1 .0"?> -~~.SГ~!-Y·!~~:~~:~(~~-~-~i~-~~~~T:·q_~·-·.. .... "_. ____ . .. ."-..."" -···- . ..........x.rri1.n.~:x.~ 1.:'::.h.t.te.:.//"'!""..>VЗ,or9/1~99/)(SL[Гr~nsforгn.:...................... xm lns: xl = -urn; schemas~m icrosoft -со m: off1ce: sprea dsheet • . . .. . . . x.~ 1~_~:~ .§.: .~-~-~-~-~-~- ~~-~ -~~-~~~icro~.o~ ~ -~-~-~-~~-ff .i ~~ :. ~p-~-~-~-~-~~ ~-~( .... . .. .. exclud.e:r~~ult:pref1~e~; ~x.l. ss> ........ .......................................... ...... ' ·······ij [::1 ·········· ·····rj <xs l:template match;"/x l :Wo rkbook/xl:Wo rks.heet/xl: TaЫe"> <;тs Тin1eshёet X"11nsJ$;''uгn sёiieГrias~,;,г0x~ёo"1Exce1pгogi:/e@;;,eslieёi·>··.·.·.. .. [~ <Т? ЕГ!)рlоуее > ... . <TS:F irstName> ·.·. .··_Е:\~ ~vgJJ:~t~.~~1eci;;'xi Row1xlcei1fx1.N эгn 8ёic€i11@ss Name;;'i' o;eName']JJxi ьэ1.··1>•···· . . . .. .. . . . . . . .. . . .. . !.j ·· ·:~~,1f:~i~д:~1~~1~··;;iR.o~ixi.•.c~i11~iN.a.гn•<ГC.~lil@-.-~,N~,;:;~~"3~i~•;;;•>1JM~•i~'ii .........................·[· ·; ....· :::~.Т:ti~~~:r·E~~~!~fi,~C>"Wixi ·cв11ix1•·iJamedcё ii1@ss~:~~~.~~P~~;1~<1 Ьа1а'/, · ··· ···j·j .. <.(ГS EгnployeeNuгnber> . ..... ... .................... . ... .<IТ S:E mpl oye e> ~TS 1<eponingf.1o ~th >.. <TS: Year> · ~~~s~: ~~ё:or 5ёieci ;'5uьЗ 1 ;;п9(xiRowixi ёeii[x1i\iame<lcёii1@55NЭГl1ё~·мonih·jvxi ЬЭ1а:1.4)'1> <TSMonih> .. < x:sTva1~e-oi.s~ё1ёc1~'s~ь~1;;~9{xi .~o...;(x1C:e 1i[ xГ~Э-;;;e~c;~iЛ@s:s:Н~,;:;.ё~.i<1.~.n.i.hjj1x1 :.[)i1~,13 .2)'?? </ТS:Mo nth > <TS:Toia 1stdHours> ···-·--· . .. . "...." ······ ·········-···-----· ··-· ·· ··· <x sivai ue-oi sё18ёi;·x1:f:!ow/x i cё.ii1xi i\ia1nёcicё.111@S:s i\iame;'Siciнours'iiixi bata'i> </ТS:ТotalStdHours > <Jтs Repo~ing~onth> ·..·................ ................. ... ......... ................................................................. <x.sl. for~ eac~ selei: t;"x.1 .. .Ro:-vl.x.1 . Се. 11./ xl :.N .a m .e.dCellj@ss l\)am e=o l)ay s:J[ > ..... . . . ....<х sl 1f te~t;"st ri~g(nuгnbe r(.Jxl:.(;elljxl l\Jaгn~d(;ell[@ss l\J •.rn.•.:'.'Н.o.u.rs]J/~1.. . :Oata))!;NaN'"> .. " .. t!~+~i~t~v · Т<;.:-.;.:: i.:ii01~:.;;;:s ····· ~}:I'· Готово Рис. 28.9 : Код XSL Т для преобразования схемы до~сумента h.олное описание Языка XSLT выходит за пределы тематики этой книги. оолее подробна~ ин;·:с формация достуnна в книге XSLT Programmer's Reference, Wrox Press, ISBN 1~861005~06-l. ,•." ., ' ' < • Резюме В Excel 2003 компания Miпosoft предоставила разработчикам приложений Excel воз­ можно~ть использования сети Inteгnet в качестве неотъемлемой части приложения.
654 Глава 28 О Книги могут открываться и сохранятся на WеЬ-сервере , который поддерживает серверные расширения Fгont Page . О Excel может открывать НТМL-страницы в виде книг. О WеЬ-запросы могут использоваться для извлечения таблиц с данными с V\ТеЬ-страниц. О Объектная библиотека Inteгnet Ехр!оге1· обеспечивает автоматизацию извлечения данных из WеЬ-страницы без накладных расходов работы с книгой. О Книги Excel могут сохраняться в виде WеЬ-страниц с сохранением содержимого . О Поддерживается создание интерактивных WеЬ-страниц, которые обеспечивают взаи­ модействие с обозревателем на том же уровне , ЧТG и при взаимодействии с Excel . О Объект Micгosoft Inteгnet Tгansfeг Contml может использоваться для обмена дан ­ ными между приложениями Exce l и WеЬ - серверами. Данные передаются как в виде списка параметров, так и в виде структурированного кода XML. О Excel 2003 поддерживает схему XML-SS, позволяющую распространять листы . С помощью кода XSLТ программа разбора MSXML может преобразовывать схему XML-SS в другие схемы перед отправкой данных на WеЬ-сервер. Все эти инструменты позволяют разработчикам находить новые решения, в которых Excel является ключевым элементом бизнеЕ-процесса большего масштаба . При этом в бизнес-процессе могут принимать уч~стие несколько географИчески распределенных организаций.
XML и Excel Иногда сложно определить, какие технологии стоит использовать, а какие можно проигнорировать . Кто-нибудь помнит DDE? А кто слышал о SGML? На самом деле эти технологии (DDE, к SGML это относится в меньшей мере) можно просто игнорировать, так как . они являлись промежуточными и обеспечили переход к более подходящему ре­ шению . Но иногда возникают технологии, которые просто невозможно игнорировать. XML - одна из таких технологий . Более точно вопрос можно сформулировать следующим образом: могут ли разработ­ чики VВА-приложений в Excel позволить себе игнорировать XML? Точно сформулиро­ ванный ответ будет выглядеть так: ненадолго . XML быстро становится определяющим языком в развитии сети Inte1·net, как английский стал определяющим при развитии тех­ нологий . В этой главе язык XML рассматривается немного более подробно, включая ис­ пользование XML совместно с Excel. Что такое XML? Язык XML или eXtensiЫe Ma1:kup Language является подмножеством языка SGML (Standa1·d Generalized Markup Language) . XML - это язык ' разметки (как HTML), предо­ ставляющий возможность хранения и описания данных. Самой важной особенностью языка XML является его самоописательная природа и текстовое представление. Так как XML описывает сам себя, он легко может переноситься в сетях, включая самую большую сеть - Inteгnet. В сети Internet можно передавать не только текст, но все же в сетях ТСР/ХР текстовому формату отдается предпочтение. Так как XML имеет текстовое представление, его очень просто передавать и обраба­ тывать. Так как в коде XML хранятся данные и элементы описания данных, это очень удобный формат для передачи информации. Поймите правильно, двоичные файлы (графика, видео, музыка) хорошо выполняют свою задачу, но XML станет универсаль­ ным языком в сети Internet в ближайшем будушем .
656 Глава 29 При первом знакомстве формат XML может напугать. Но минимальное знакомство с HTML позволит быстро привыкнуть к формату XML. В следующем лис тинге показан целый файл XML: (< '?xml version;·.; i. о" standalone="yes ,; ?> ' <snapshot> ~ ·• <'R.Э,cording> . . · · . . <Id>O</Id> . .. . . <Count>O</Count> .. ·. ·• ~Whe!l>2004 - 02 - 01тo9: 27: 42. 7096378- 05: 00</\tJhen> ' /. <Instanceid>O< / Instanceid> ···<Dealerн'and>QD, JS</DealerHand> ' ; . , : PlayerHand>QC,10D</PlayerHand> . -::= нaridNurnber>O </Hand.Number> · <; Ci.lrrentBet>25</currentBet> ' <мoney>SOO< /Moriey> ' .:;PlayS.tate>Push</Playstate> , <:нirits>stand</Hints> ·:. · f•.:</Recbrdirig> · · t'5:/~x:i.ap~f19'.t:>. ", . К сожалению, возможности привести здесь полное руководство по использованию языка XML нет, но издательство Wгох выпустило несколько хо роших книг по XML, по­ зволяющих стать профессионалом в работе с этим языком . При этом читать и писать код XML вручную не обязательно, так как большинство инструментов могут делать это авто­ матически. Текст XML имеет простой формат, используемый для передачи данных. В этом листинге первый тег указывает на то, что текст является документом ХМL. Первая строка может иметь другую форму, но обычно первая строка документов ХМL очень похожа на приведенную здесь. Слова в<>, например, <snapshot>, являются тегами. Такие теги вы­ ступают в роли дескрипторов для описания типа данных. В определенной степени эти деск­ рипторы можно воспринимать как описания типов в объекпю-ориентированном программи­ ровании. Внешние дескрипторы, например <snapshot>, определяют 'пространство имен (область действия имени). Вложенные дескрипторы, например <Recording>, могут рас­ сматриваться как аналог определенного пользователем типа данных или класса. Таким обра­ зом, в пространстве имен или области видимости имен <snapshot> определен тип, который называется <Recording>. Наконец, сам:ые внутренние элементы являются членами типов. Другими словами, объект snapshot. Recording содержит члены Id, Count, When, Instanceid, DealerHand, PlayerHand, HandNurnЬer, CurrentBet,Money, PlayState иHints . Самым внешним элементом может быть <BlackJackhand>, но даже в приведенном виде достаточно простой файл XML содержит значительный объем информации о пере­ даваемых данных. Имена элементов .указываются явно вместе со значениями. Типы дан­ ных могут быть получены так же, как и значения. (XML поддерживает явное указание типа данных и не только . ) · Что такое XSD? XSD, или XML Schema Definition (определение схемы XML), является технологией описания документа XML без данных. Как и в случае технологий баз данных (а XML в некотором смысле является универсальным механизмом хранения данных ), в техноло­ гии XSD существуют таблицы и схемы. В таблицах содержатся данные, а в схемах - опи­ сание данных, хранящихся в таблицах. При этом в файле XSD содержится схема, описы­ вающая варианты, типы и структуру данных в соответствующем файле XML.
ХМL и Excel 657 Если записать схему для ХМL-файлов, содержащих структуру сданных наборов карт в BlackJack, она будет выглядеть следующим образом. J<"?;cmf ·-·ve:CS'l 'Oll= ~1г1 ~. л-_d ~· ·"~ -'·?"> ~- <~'~' ··">'~,·-~:~·x:v?'·~.~··1'··< -."-т~·/"'\:~ _:. .·. · ri;:xs: schem<i · id=" ~napshot" , targetNamespace=:: http: / ;xmlns : ms tns=; ;, ht tp: //~ empuri . .org / gam~ . xsd ,; 1· . xmlns="http://tempuri.Org/game ·.x sd " .. ~. jXтlns: xs;= "http: //W'#W .wЗ .. org/2001/XМLSche~a·; ;~ microsoft,-'co m: xml-msdata" . ,..... ... . ..· .. ·.·· ,. · at·tr.ibuteForrnDefaul t= "qualified" elerrientFormDefaul t= ''qua <xs: elemerit ·· name= '1 snapslJ.ot!' rrisdata: IsDataSet:," true" msd;,ta ·, EhforceCohstraints"'" Fa'lse {~ · · . · · <xs:cpmplexType> <xs:choice maxOccurs="uilbounded"> · · <xs[element name'; ' "Recording" :> · · <Xs: cpmplexType> . ' · <xs: '3.E:!guence> <xs: elerrient name~ ". ld .~ .1<- .' .. •, .·" . . . . ' ' <xs:element na:пie="Count" ' type="xs:integei" .1:!> mlnocc:;urs="0 " /> ... >, ... . . ;,··. . . . \''·:· ••· <xs: elerrient · riam'e= "When" · .type= "xs.: dateTime" f~ miriOccurs=" О" / > . . ' <xs: element name=·" Ihstanceid" · name ="DealerHand" :1:!> miцOccur'S=" О" / > u '. 1:!> minoccurs= "0 '' name="1'layer~and" ,.1:!> •1:!> ;~ 'i:!> 'name=.'' HandNurriЬer ;, ,;i:.ype= "xs : s tring" ; <xs: 1 1:!> i:ninOccurs="O" /> ··· ' <xs: element l~ miiiOccurs=" О" /> < /xs ·: sequence> . < ! xs : coinpl'exType> . . </xs: el.eпient> · ·· </xs: cho.ice> ·• _. ,; :<<xs :. corripl.exType> · :' </xs.:'element> i::;/?C.'3 ;J>c::l1er,n,a .;> •.. ~ ..« " •... . ""' · :. ., ~· ·· ,__ , ~.".;, . с.,::.,," .· При этом схема выглядит сложнее, чем сами данные, но помните , что преимуще- · ством такого формата является полное описание связанных со схемой данных, а также использование текстового представления. Кроме этого, применение текстового фор­ мата позволяет легко передавать файлы XSD по сети, что делает их неплохим общим знаменателем.
658 Глава 29 Что такое XMLSS? В Ехсе! схемы XSD непосредственно не применяются . Вместо этого Ехсе! выполняет преобразование схем в формат XMI.SS (XML Spl"eadsheet Schemas) . В частности, Ехсе! преобразовывает типы данных из схем в типы данных Ехсе! и отображает XMI.SS в па­ нели задач XML Source . В результате в Ехсе! схема представлена в виде Spreadsheet Schema в панели задач Источник XML (XML Sошсе) (рис. 29.1). Обратите внимание на панель задач Источник XML (XML Sошсе) (для доступа к этой панели выберите пункт Данные<=>ХМLс:>Источник XML (Datac:>XML<=>XML Sошсе)). На ней будет показана XML Spreadsheet Schema с дескрипторами, но без данных. Разница заключается в том•. что файл XML может содержать О i-rли больше элементов , определен­ .ных в схеме. Например , может быть только одна пара тегов <snapshot></snapshot>, но пара <Recording>< / Recording> может повторяться любое количество раз. Это не - · плохая метафора для представления файла схемы в виде определения класса, а файла XML - в виде экземпляра класса . ~~~.~.,~-~n:!.?.!~-~~~:.:_. [~-~~~~-~.:-.~~?.·····~····. ........\~~! а 2' sna., .. ..hot 8 (Э Recor linQ ' 6]Id : ·{J Count ;··-·ttJ When · ~ Instanceid [}] I Ф!tffl):Нftl · · (1i.J PlayerHand ··!ЬJ Haind/Чumber ёi] CurrentBet G'J Money ' ·· · @ PlayState ·· G) Hints Чтобы соnос:т а вить nоеторяюшнеся 3nементы1 : nерет&Uнте их Н3 дерееа Hl!I лист, где должны будут отоб~ жатьс я х~голоекн данны х . · Чт обь1 нмn орТ11Р0МТь данные1 еосnольэуйтесь кноnк~ "Импорт Хfvt.-данных• ~ пане "1 жстр ун ентое Хnнсо~" . 1Паро1"тры . ~ 1 ,. ..,к-.- Р.Т_Ы_ХМ.-" .~J Проверит!:' К"РТУ для !Ксnорта . .. ;:@ Советы гю соnоставлен11ю ХМL Рис. 29.1 . ПаШ?Ль задач Исrтwчник ХМL Импорт данных в формате XML Реальным преимуществом ХМL и XSD является их использование в качестве общего зна­ менателя (в частности, они являются открытым стандартом, который никому не принадле­ жит). При этом все соглашаются, что такой формат является неплохим кандидатом на общий метод обмена данными. В результате все приложения, способные читать и записывать данные
ХМL и Excel 659 в формате XML, мoryr общаться с другими приложениями, которые в состоянии работать с форматом ХМL. Возможность такого взаимодействия не зависит от языка, платформы, опе­ рационной системы, средств разработки и методов передачи данных . Общий язык обмена данными для всех инструментов - это Шi!,Г в правильном направ­ лении. Достаточно вспомнить, что несколько лет назад было практически невозможно обмениваться данными между Woгd, Excel и другими приложениями, особенно если эти приложения написаны независимыми разработчиками. Конечно, можно было использо­ вать файлы с разделением полей запятыми, а механизм Automation поддерживал связы­ вание кода непосредственно с Ехсе!, но файлы с разделением запятыми не содержали информации о природе данных, то есть отсутствовала стандартизированная схема, а для применения механизма Automation требовалось обладать особой информацией об Excel. Стандартизация данных и схемы позволила каждому приложению экспортировать и им­ портировать XML. При этом для совместного использования данных не требуется ин­ формация о потребителях данных. То есть, для совместного применения данных с Excel приложение не должно использовать Excel VВА через механизм Automation. Для демон­ ~трации гибкости этого подхода здесь используется недавно созданная простая игра. Black Jack: гибкость данных Игра ВlackJa~k имеет несложные правила, но предоставляет широкий выбор стратегий игры. Хотя у нас и так получается неплохо играть, мы решили немного улучшить нашу игру. В результате была написана игра BlackJack (рис. 29.2). Она создана на базе инфраструктуры .NE T. При создании игры были использованы разработки из теории вероятности, а также создан встроенный механизм записи, записывающий комбинации карт на руках ведущего и игрока, ставку и результат сдачи в файл XML. Создание механизма анализа игры и по­ строение графа результатов может потребовать большего объема трудозатрат, чем хотелось бы, но при этом как минимум необходим механизм просмотра данных. Именно для этого и нужна программа Excel. При создании игры, или при анализе хо­ да игры для выигрыша дополнительной сотни в казино Вегаса, или при создании крити­ ческого приложения для анализа пыли на Марсе, Excel можно использовать в качестве мощного аналитического инструмента. Если в качестве формата хранения данных ис­ пользовать XML, эти данные можно будет легко импортировать в Excel. XoтJr игру BlackJack можно ,реализовать в Excel с помощью языка VВА и библиотеки cards. dll (которая предоставляется в составе Windows), эта глава посвящена другой теме. (Исходный код игры BlackJack ДQступен no адресу http://www. softcocnepts. com/ BlackJack/ .) На рис . 29.3 показаны импортированные данные игры BlackJack, в которой началь­ ная сумма увеличена с $500 и $2520. Это достаточно успешная игра, поэтому хотелось бы рассмотреть данные для получения представления о правильной стратегии. Можно за­ метить, что схема загружена из файла XML (показана в панели Источник XML), строки и столбцы преобразованы в списки, включая заголовки столбцов автофильтра и строки вставки (не показаны).
660 Глава 29 ···········- ·; ... . ... . ........ . . . ... ,...•. · ···· ···· ·;,,·- ······ -····"··- ·······.~·· ...ЬJt'QJ~1 § ame .C.hoic es tlelp Рис. 29.2 : Игра Вlackjack Рис. 29. З. Данные с результатами игры в Blackjack :;::<' ~ ёi·!Э' Re(OOOQ ' "Ш1 ~-Q Count --а when ;::J lnst<1necld : g Deolertiarid· : .Q PlayerH•nd . CJ HandrtumЬcr ·· В turтentl.lc t ·. 3 Моnсу tj PlayState · ::iJ Hint1
ХМL и Excel 661 Импорт файла XML Ре~изация OpenXМL вызывает метод OpenXМL коллекции Application . WorkЬooks. Этот метод принимает три аргумента: исходный файл XML, файл XSLТ (ХМL Style Sheet Transformation) и LoadOption. Файл XML содержит данные. Файл XSLT содержит доку­ мент XSL Transform (немного ниже этот документ будет рассматриваться более подробно), а параметр XlXmlLoadOption описывает способ обработки данных XML. Код из листинга эмулирует поведение пункта меню Данныес::> XMLc::> Импорт (Datac::> XMLc::> Import). ;I>i.iьH'c sufГoI?enxМLTJ' •· D:1.т ·· a:woi'кЬO'oi< :As -11 a:r1щs:9i<;:,· • Ji'< .. Set aWorkbook = A:pplication.Workbooks , .QJ;?~:tiXf,fL( ,,< -"· . Filename:=."game.xml", , t .oadOption:= ~~ Xl:xп;lIJoadOption. XiXmlLoadimportToList) [J;:nd, ••. suь ·.. .~"=· ·""·=·'"''" ...•" ~~---~·- -< '!. ., В данном примере объявляется объект WorkЬook и вызывается метод Application. Workbooks. OpenXМL . Этот метод возвращает книгу с импортированным кодом XML и и~влеченной схемой Excel XML Spreadsheet Schema. Что такое XSL и XSLТ? XSL - это аббревиатура, которая ссылается на язык разметки XML. В XSL разделяется представление данных (лист стилей) от фактических данных (файл XML). Например, передача параметра XlXMLLoadOption . XlXMLLoadimportToList приведет к форма· тированию данных XML в виде коллекции списков . Теперь , когда есть представление о файлах XSL, возникает вопрос - что такое файл XSLT? Как было сказано ранее, XXSL содержит листы стилей для XML. В листах стилей описывается представлен ие данных XML. Файл XSLT (XSL Transform) описывает фор­ матировани е и отображение данных XML. Для изучения XMLS и XSL можно порекомен­ довать второе издание книги издательства Wrox XSLT: Prograrnmer's &ference Майкла Кея (Michael Кау). В данном случае нужно знать две вещи: во-первых, для использования XML в Excel не обязательно изучать XML, XSL и XSLT, но это очень мощные технологии; во-вторых, ре­ комендуемая книга в 900 страниц, что, к сожалению, говорит о невозможности описания такой темы в данной главе . Путем пересмотра метода OpenXМL и включения в него воз­ можности использования файла XSL Transform , была показана разница между простым импортом данных XML и преобразованием и форматированием данных с помощью XSLT. В первом листинге показаны немного модифицированные первые несколько строк файла game . xml. В этих строках предст~влен файл XSL}, который используется для форматиро­ вания. Во втором листинге приведен новый файл преобразования game. xsl. В третьем ли~тинге показана новая процедура OpenXМL, используемая вместе с файлом XSLТ. t< ?Хт1 vers:l on;;;.1 : 0·· ?'> ! <?юnl-stylesheet · type:: 'text/xsl • href= •game.xs.1 .' ?> ~-~s.n~psh'ot> . ( <Recording; 1 <Id>O</Id> c ; <Count>O</Count> . <WЦem>2004-02..:01Т09 : 27 : 42. 7096.378-05: 00</Wl\en> <Instanceid>O</ Instanceid> · ' <Deal erHand>QD, JS< / De·alerHand> <PlayerЯand>QC,10D < /PlayerHand> .. . = 9с;; тато-~.Л>?fша , _J:!g~ef?e J:i.J:!_O ·"не · п_оксз з?н,_
662 Глава 29 Во второй строке полужирным шрифтом выделена новая информация. В результате для форматирования файла game. :xml используется файл game. xs 1. Помните, что формати­ рование отделяется от данных. При этом можно быстро поставить друтой файл XSL и по­ лучить друтое подмножество данных и полностью друтое внешнее представление: \<xsl i'style{slleet ' xrn lns :xsi =';Ь:ttp ,-; /www. wз. org/i.9§9' /XsL/тrans·form...,' ' version=" 1. О"> i <xsl : .template ma tch=" / "> : · <HTML> ~· ·<body> , . i <tаЫе> i <COt.GROUP WIDTH=" :l00" ALIGN="CENTER"></COLGROUP> <COLGROUP ' WIDTH= "l00" ALIGN="CENTER"></COLGROUP> ·<COLGROUP WIDTH7" 100" ALIGN= '' CENTER" >< /COLGROUP> <COLGROUP WIDTH="lOO" · AL IGN="CENTER"></COLGROUP> <COLGROUP WID'rH= :• 1 О О " ALIGN= " CENTER" >< / COLGROUP> . <COLGROUP WIDTH="l00" ALIGN="CENTER"></COLGROUP> <COLGROUP WIDTH="100" ALIGN= ,"eENTER"></COLGRЬUP> <TD><B>Dealer Hand</B></TD> <TD><B>Player Hand</B></TD> <TD><B>Hand .#</B></TD> . <TD><B>Bet</B></TD> <TD><B>Player Funds</B></TD> <TD><B>.Resuit<fB></TD> . . . <xsi : f or-ea9h selec t=" snapsh~ t / Re<;:ording" > <tr> .. ·• . . <td><xsl :value-of -select= "DealerHand" /></td> <td><xsl: value-o f select=" PlayerHand ". / >< / td> · <td><xsl: value-of seJ,ect=." HandNumber" />< /t.d> <td><xsl: value-of select=" CurrentBet"' /></td> <td;><xsl: value-o.f · select= "Моnеу" /></ td> <td><xsl :value-of select='~ PlayState" /></td> </tr>. · ' ._· '</xsl : ·for - each> ~/tаЫе> ' " <lb.ody> ' </HTML> r .. < /xsl; templa'te> l:sJ,:x,: sl ;.§t_yj,esl}_e.:~.t ?: ·, В файле game . xsl содержится информация о форматировании. Для описания внешнего вида информации принято применять код HTML. Как показано в предыдущем листинге, для форматирования данных используется файл HTML с выделением заголов­ ков столбцов полужирным шрифтом и размещением данных в таблице HTML. В результате данные будут выглядеть, как WеЬ-страница. Полужирный шрифт для каждо­ го оператора XSLT определяется только для выделения . конкретных столбцов в файле game.:xml. Кроме этого, можно создать более сложный файл XSLT, в котором над дан­ ными будут выполняться арифметические операции, добавляющие новые данные к ста­ тическим данным из файла game . :xml. Наконец, ниже приводится пересмотренная функция OpenXМL. В следующем листин­ ге показано, что параметр XlXInlLoadOption не используется. Вместо него применяется динамический массив Array ( 1). С помощью этого аргумента определяется используе­ мый лист стилей для файла .XML. Например, если бы вторая строка выглядела как <?:xml-stylesheet type=' text/xsl ' href= 'game2. xsl' ?> и в качестве пара­ метра передавался бы Array ( 2), то для форматирования данных использовался бы файл game2 . xs 1. Вот новый вариант подпрограммы OpenXМL:
ХМL и Excel 663 Хотя в эrу главу нельзя втиснуть 900 страниц по XML, XSL и XSLТ, из текста данной главы можно понять, что XML, кроме простого метода передачи данных по сети и между приложениями, поддерживает использование отдельного файла для форматирования и преобразования, что позволяет хранить одну копию данных и использовать несколько ва­ риантов представления. На рис. 29.4 показан внешний вид динамической страницы в Excel. . 4 5 •7 .9 QD,JS QD,JS QD,JS JC,AC JC,AC JC,AC 9D,6S 9D,6S,QC 9D,6S,QC 9D,6S,QC 4D,3D 4D,3D,6D,QD 4D,3D,6D,QD 4D,3D,6D,QD 2D,OC_ 2D,QC,4D,6H 2D,QC,4D,6H 2D,QC,4D,6H · 2D ,QC,4D,6H .21 QH,2D : 22 QH,2D,2H, 10Н QC,10D KS,AS KS,AS KS,AS JS,3D J S,3D J S,3D JS,ЭD 6C,KD 6C,KD 6C,KD 6C,KD KC,JH KC,JH KC,JH KC,JH KC,JH ЭС,10D ЭС,10D 23 QH,2D ,2H , 10Н 3С, 10D · 2 4 QH,2D,2H, 10Н 3С, 10D '25 AS,4S 5H,AD '26 AS,4S,AS ,4D 5H,AD,3S . ! с1 Hand # о :-;;?; 1-• УУ~\QЩ:!.("~·ц~.у ~~~~-·А!..1- . .•• ,." _ Готоео ;· Рис. 29.4 . Представление страницы в Excel Экспорт листа в файл XML D 1 -Е-:=т:=:=f ·. _L _;;i Bet Player Fun d s Result rq 25 500 Push EJ. 30 35 35 40 45 45 45 50 55 55 55 60 65 65 65 70 75 80 80 80 85 90 90 90 500 500 500 552.5 552.5 552.5 597.5 597.5 597.5 597.5 652.5 652.5 652.5 652.5 717.5 717.5 717.5 717 .5 717.5 797.5 797.5 797.5 797.5 617.5 Push Push None Win Win None Win Win Win None Win Win Win None Win Win Win Win None Win Win Win None Lose l~ !}[ Предположим, что в рассматриваемую версию данных внесены изменения, · напри­ мер, удалены конфиденциальные записи, а полученные данные необходимо экспортиро­ вать в новый файл XML для передачи клиентам. Для экспорта данных В" новый файл можно воспользоваться методомWоrkЬооk. SaveAsXМLData. В следующем листинге показан код для экспорта файла game. xml с помощью отобра­ жения XMLSS, созданного в Excel . Новый файл сохраняется под именемnеwgаmе. xml.
664 Глава 29 Publ.:Lё si.iь E:Xport:XМL(j f. bim map As XmlMap ;. Set rilap = ThisWorkЬook.XmlMaps("snapshot_Map ") Dim newPath As String newPath = ThisWorkbook. path + "\newgame. xml·" lf (map.IsE:XportaЬle) Then · Call ThisWorkbook.SaveAsXMLData(newPath, rnap) Else MsgBox " Невозможно использовать " & rnap_ . Narne & " для экспорта данных" f EndIf .End ~ub Принятое по умолчанию имя отображения можно палучить в диалоговом окнеДанныеq ХМLqСвойства карты XML (DataqXМLqXМL Мар Pгopeгties) (рЙс. 29.5). Это диалоговое окно испол.ьзуется для изменения форматирования и преобразования данных в Excel, как преобразование XSL применяется для форматирования д3.нных ХМL. Резюме ~мя: ;.........:.......... ....с.......:....... .. . . . . . . . . .. .. .... ... . Проверка на соответсте~1е схе!".е Xf'1L · О ароеерять данные на сооте;етстене схеме nр1111мnорте 11 'ксnорте И:::точ1-111к д~жых ~ со~а~ть определение нсточннка данных в кнl'l"е Форм~; ~1 р~нетка данt:ь;х ~ подстраивать Ц!l1Pt1HY столбца 0 сохражть фило.тр столбца 0 сохра111ть форматы ';:iИСел Пр11 обноележн нлн 11мnорте данных: ~) ~а~1енять существующ11е данные новыf'1и О добавnять новые данные в существующие ХNL-списки Рш;, 29.5 . ИЗJ.rенение 1шра.111етров преобразования ХМL XML, XSL и XSLТ являются примером успешного перехода от закрытых к открытым форматам данных. Многие современные приложения и средства разработки изначально поддерживают чтение и запись XML. Это значит, что приложения в будущем потребуют все меньше трудозатрат на взаимодействие, так как они будут использовать понятный всем общий стандарт. Разработчики VВА-приложений в Excel могут читать данные XML от других прило­ жений без создания специального кода. Одним из таких приложений является ShaгePoint (описывается в главе 21). Службы SliaгePoint используют XML для передачи данных, по­ зволяя публиковать списки в сети Inteгnet. Технологии форматирования и преобразования данных (XSL и XSLT) позволяют от­ делять данные от форматирования и структуры. В результате один экземпляр данных может иметь несколько различных представлений.
• Объектная модель Ехсе12003 Большинство объектов из объектной модели Excel связаны с соответствующ'ими кол­ лекциями. Обычно имя коллекции' имеет форму имени объекта во множественном' числе. Например, коллекция Worksheets хранит объекты Worksheet. Для простоты изложения объекты и соответствующие коллекции будут рассматриваться вместе в одном разделе. Общие свойства коллекций и связанных с ними объектов В большинстве случаев объект коллекции хранит только объекты соответствующего типа. В следующих разделах показаны общие свойства и методы объектов коллекций. В каждом из разделов рассматриваются только уникальные свойства, методы и события . Общие свойства коллекций Имя Тип возвращае- . Описание мого значения Application Application Count Lo ng Creator Long Parent Object Только чтение. Возвращает ссылку на приложение, вла­ деющее текущим объектом. В данном случае это Excel Только чтение. Возвращает количество объектов в кол ­ лекции Только чтение. Возвращает число типа Long, описы вающее место создания объекта (в Excel или за его пределами) Объект Parent, который является вл адельцем объекта коллекции. Например, свойство Workbook. Par e nt воз­ вращает ссылку на объ ект Appl i cation
666 Приложение А Общие свойства объектов Объекты также обладают общими свойствами. Для избежания избыточности ниже перечислены общие свойства и методы всех объектов. Эти свойства будут упоминаться в описании объектов, но определение свойств пр иводится только здесь. Имя Application Creator Parent Тип возвращае- Описание мого значения Application Long Object Только чтение. Возвращает ссылку на объект приложе­ ния, владеющий данным объектом (в данном случае это Excel) Только чтение. Возвращает число типа Long, которое описывает место создания объекта (в Excel или за его пределами) Только чтение. Объект-владелец текущего объекта . На­ пример, свойство Characters. Parent может возвра­ щать ссылку на объе кт Range, так ка к объект Range мо­ жет быть одним из владельцев объекта Characters Объекты Excel, их свойства, методы и события Объекты перечислены в алфавитном порядке. Для каждого из них предоставляется общее описание и возможные родительские объекты . После этого в табличном формате приводится список всех свойств, методов и событий объекта. В последнем разделе опи­ сания каждо го объекта представлены примеры кода с использованием объекта . Объект Addin и коллекция Addins В коллекции Addins содержатся все объекты AddJ..n, доступные в Excel. Каждый объ­ ект Addin соответствует надстройке из списка в диалоговом окне Надстройки (Addin) (для открытия этого окна выберите пункт меню СервисqНадстройки (ToolsqAddin)). Перед использованием в текущем сеансе каждая надстройка должна быть установлена (Addin. Installed = True). В качестве примера объектаАddin для Excel можно при­ вести Analysis Toolpak, MS Que1y Addin и Conditional Sum Wizaid. Метод Add коллекции Addins позволяет добавлять в коллекцию объекты Addin. Этот метод требует указания параметра FileName (обычно это имя файла с расширени­ ем XLL или XLA). Свойство Count коллекции Addins возвращает количество надстроек, которые доступны в текущем сеансе Excel . Общие свойства объектов Addin Определения свойств Application, Creator и Parent приводились в начале при­ ложения .
Свойства объекта Addin Имя Тип возвращае- мого значения CLSID String FullName String Installed Boolean Name String Path String Title String Объектная модель Excel 2003 667 Описание Только чтение. Возвращает уникальный идентификатор · объекта Addin Только чтение. Возвращает полный путь и имя файла для соответствующего объекта Addin Устанавливает/возвращает возможность использования объекта Addin в текущем сеансе Только чтение. Возвращает . имя файла для объекта Addin Только чтение. Возвращает полное имя файла для объекта Addin Только чтение. 'Это скрытое свойство возвращает строку, отображаемую в диалоговом окне Диспетчера надстроек (Addiп Manager) Пример: Объект Addin и коллекц!lя Addins В этом примере предполагается, что установлена надстройкаАnа!уsis Toolpak: ~:>:μseA trcЭ.~ys1g;r019iPaC.k {) ~ ,-. ~--- - :, ·-~"" -~-- - -- - :---·~;", !'""~""ТГ~·-т im c>A.9-din , As Addin · ,.. . .·. . .·•· " Удостовериться, · что надстройка , Analysis Toolpak установлена 017 , Each oAddin In • Addins . - ,· ·· · ''«' Ц oAddin.Na,me = "ANALYS32 . XLL" Then ; <' oAddin.' :' Inst~lled = T:tue . .. i"End If [§I}~~,;~~:д~.·'"·~:;,,.· Обратите внимание, что вместо перебора коллекцииАddins можно обратиться к ин­ терактивному справочному руководству и воспольз С{ваться следующим кодом: LX9~in§ Г: ~~<>.й~Is.~ :!::<;юJJJ.'~k ''J _,J n~i'.tii i,1·~4~,,;·_:тJЧ'.e'" • К сожалению, такой подход не работает для неанглийских языковых версий, если имя надстройки было локализовано. Объект Adjustments Объект Adjustrnents содержит коллекцию чисел, которые управляют "маркерами" из­ менения размера родительского объекта Shape. Каждый объект Shape имеет до 8 таких маркеров. Каждый маркер может быть связан с одним или двумя параметрами, в зависимо­ сти от возможности перемещения в горизонтальном или вертикальном направлении. Зна­ чения параметров находятся в пределах от О до 1 и измеряются в процентах. Абсолютное значение 100% изменения параметра определяется конкретным объектом Shape. Общие свойства объекта Adjustments Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
668 Прилщкение А Свойства объекта Adjustments Имя Тип возвращае- Описание мого значения Count Long Item Single Только чтение. Возвращает количество параметров, связанных с родительским объектом Shape Параметры: Index As Long. Устанавливает или возвращает значение параметра или параметров, на которые указывает па­ раметр Index Пример: объект Adjustments В этом примере на листе рисуется черная стрелка. После этого выполняется модифи­ кация формы наконечника стрелки . :sиь :дcta:Arrow <) " '· · Dim · oshp As Shape ' Добавить · ст!'>елку на лист Set bShp Act;:iveSheet.Shapes.AddShape( :: :.." · m soShapeRightArrow, 1 О, 10, 100, 50} " .·.;{ наконечник" стрелки н.а расстоянии 30% , от начала ' и ра $меститъ " древко" на расстоянии 40% от н.ачала в высоту 1 в ширинуj . ' ~ i '1 .~ oShp. Adjvstments ( 1)' = О. 3 Слева направо oShp:Adjustm.ents(2} = 0:4 ' Сверху вниз Объект AllowEdi~Range и коллекция AllowEditRanges Объект AllowEdi tRange описывает диапазон ячеек на листе, которые можно редак­ тировать при установленной защит~ . Каждый объект AllowEditRange может устанав­ ливать права доступа для любого количества пользователей в сети и использовать от­ дельные пароли. Применяя эту возможность, обратите вниман11е на свойство Locked объекта Range . При разблокировании ячеек и защите листа любой пользователь получает доступ к этим ячейкам вне зависимости от объектов AllowEdi tRange. При блокировании всех ячеек объекта AllowEditRange любой пользователь все еще может редактировать ячейки, пока не будет назначен пароль или не появятся новые пользователи и им не будет запре­ щен доступ без пароля. Коллекция Al lowEdi tRanges содержит все объекты Al lowEdi tRange, которые можно редактировать на защищенном листе . Дополнительная информация приводится в разделе, посвященн.ом oбъeктyAllowEditRange . Свойства коллекции AllowEditRanges Имя Тип возвращае­ мого значения Описание Count Long Только чтение. Возвращает количество объектов AllowEdi t- Range, доступных в области Item AllowEditRange Параметр : Inde x As Vari a nt. Возвращает один объект Allow- Edi tRaчg e из коллекции AllowEdi tRanges
Методы коллекции AllowEditRanges Имя Тип возвращае­ мого значения Параметры Add AllowEdi tRange Ti tle As String, Range As Range, [Password] Свойства объекта AllowEditRange Имя Тип возвращае­ мого значения Описание Объектная модель Excel 2003 669 Описание Добавляет объект AllowEdi tRange в коллекцию AllowEditRanges Range Range Возвращает подмножество диапазонов, которые можно редак­ тировать на защищенном листе Title String Возвращает или устанавливает заголовок WеЬ-страницы при сохранении документа в виде WеЬ-страницы Users UserAccessList Возвращает список пользователей, которым разрешен доступ к защищенному диапазону листа Методы объекта AllowEditRange Имя Тип возвращае- Параметры Описание мого значения ChangePassword Password Устанавливает пароль для диа пазона, As String который можно редактировать на за­ щищенном листе Delete Удаляет объект Unprotect [PasswordJ Снимает защиту с листа или книги Пример: объект AllowEditRange Следующая подпрограмма перебирает список имен диапазонов на листе и добавляет oбъeкт AllowEditRange для каждого диапазона, имя которого начинается с " ре". Кроме . этого, подпрограмма запрещает доступ к диапазону pcNetSales всем, кроме одного пользователя, который может редактировать диапазон после ввода пароля . :'SUb ,Ci-ea te·A·l-i OWRciri~·eS"_( ~·" '<f• Dim lP6s As Lohg Dim' nm · As Name .Dim oAilowRange AS AllowEditRange . Dim sName As String . With wksAЦowEditRange :· I'!еребрать все имена диапазонов уровня листа For Each nm In .Names ' Сохранить имя sName = nm.Name ' Найти положение символа "! " ];P9s = InStr(l, sName, "! ", vbTextCompare) " . .~ . Е_(:,!!11 символ " ! " най.IJен ...
670 Приложение А 0 •• Есл11 ' Сразу. пчеле восклицательного знака ' встречается ·,по9ЛЕщователь.ность . · ' "' •:ре", .' созДр.ть · объект A1lowEdi t-Range й Mid(sNaпie, Цо's · t 1 ,.-i) ~ "ре" Then. · Проверить ·· блокировку ячеек · } ~:dЗбЛькИрование ячеек предоставит • nрльзоватещо . . . . · . i:un.RefersтoRange.Locked = True , ~ ' ', · иЗвЛеч~' . с·сыпку на лист (включая , . ' ' 'Из имени . диапазона ··sNa'цte =. RightisName, :L.en (sNarne) - Объект Application Объект Application является корневым объектом объектной модели Excel. Доступ ко всем объектам из объектной модели возможен только через объект Application. При этом многие объекты доступны глобально, например свойство ActiveSheet объ­ екта Application. Это значит, что доступ к активному листу можно получить двумя способами: через cвoйcтвoAppl. ication.ActiveSheet и чepeзActiveSheet. Объект Application содержит большинство атрибутов уровня приложения, которые можно устанавливать через диалоговое окно Сервисе::> Параметры (Toolst:::>Options) в Excel . Например, свойство DefautlFilePath является эквивалентом полю Размещение файла по умолчанию (Default File Location) на вкладке Общие (Geneгal) диалогового окна Параметры (Options). Большинство свойств и методов объекта Application имеют соответствующие эк­ виваленты в диалоговом окне Параметры (Options). Кроме .того, объект Application используется для автоматизации доступа к Excel из других приложений, например Wo1·d. Функции CreateObject и GetObject, а также
Объектная модель Excel 2003 671 ключевое слово New используются для создания нового экземпляра объекта ExcelAppli - cation из другого приложения. Дополнительная информация по автоматизации досту­ па из другого приложения приводится в главе 15. Кроме этого, объект Application предоставляет ряд событий . Но события объекта Application не доступны автоматически . Для использования событий oбъeктaAppli­ cation необходимо выполнить следующие три операции. Сначала следует создать новый модуль класса, например, cAppObj ect, и объявить в классе объектную переменНую с квалификатором доступа PuЬlic, например, AppExcel. Эта объектная пер еменная будет обеспечивать обработку событий. Объявление пере­ менной выглядит следующим образом: !~f:iИ4S:.r.;~1'!.h~Ji.~!iI~::~J?2'~'fS:~.i : l~~ g:x.;~~§J~~P~I~~~:i:,:(oii.~:::·::.:.--: После этого события oбъeктaApplication становятся доступны в классе объектной переменной AppExcel . При этом в классе реализуются соответствующие процедуры об­ работки событий . Например , если ~еобходимо, чтобы при каждой активизации листа выводилось сообщение, напишите следующий код: t'Pii.v~Ee/ $ii$- AppExceI:.:;sJ:ieetA'ёfii'at: e-(вyva1 sh .ii's,·· aь) .e f t) · .·,; }·Вьi~.ести\ ИМя ~~листа ·-'. 1 • • , · ,~ ," М~gВох J:" Т'оль ко что бь!л акти виз'ирован ли.ст. " &.: sh ..Narne ,,,,,;,~м-.• i i ~S~~t J~~ .7~ ~ .:} ;},> <:;~ :..~::-.~~:~:_:,~~-~=· -~- -· ~~ ·' v:. ... ,": .~--·~ ····':,м·~-..:',.,,_;N~А.~•. ," . r.,A ....~... .• ~.".~-=..~. Наконец, с помощью текущего объекта Application создайте экземпляр класса в процедуре стандартного модуля. Свойство EnaЬleEvents объекта Application должно быть установлено в значе ­ ние True. В противном случае события не буду:г генерироваться . Общие свойства объекта Application Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Application Имя ActiveCell ActiveChart ActivePrinter ActiveSheet Тип возвращае­ мого значения Range Chart String Object Описание Только чтение. Возвращает ячейку активного лис­ та, в которой расположен курсор Только чтение . Возвращает выделенную диаграм­ му из активной книги. Если в данный момент не выделено ни одной диаграммы, свойство ничего не возвращает Устанавливает/возвращает имя текущего принтера Только чтение. Возвращает активный лист актив­ ной книги
672 Приложение А Имя Тип возвращае­ мого значения Ac tiveWindow Window ActiveWorkbook Workbook Addins Addins AlertBefore- Boolean Overwriting Al tStartupPath String AnswerWizard AnswerWizard ArbitraryXМL- Boolean SupportAvailaЫe AskToUpdate- Boolean Links Assistant AutoCorrect AutoFormatAs - YouTypeRepl ace- Hyperlinks Automation- Securi ty AutoPercent- Entry AutoRecover Build Ass i stant AutoCorrect Boolean MsoAutomation- Securi ty Boolean AutoRecover Long CalculateBefore- Boolean Save Описание Только чтение . Возвращает выделенное окно Excel Только чтение . Возвращает активную книгу Только чтение . Возвращает коллекцию надстроек, доступных в Excel в данный момент Устанавливает/возвращает необходимость выдачи сообщения при каждой попытке перезаписи непус­ той ячейки в результате операции перетаскивания и отпускания Устанавливает/возвращает папку с альтернатив­ ными файлами запуска Excel Только чтение . Возвращает объект, п оддерживаю­ щий управление мастером ответов Возвращает доступность функций работы с XML Устанавливает/возвращает необходимость выдачи запроса на обновление связей при открытии со­ держащей записи книги Только чтение . Возвращает объект, п оддерживаю ­ щий управление Помощником Office Только чтение. Возвращает объект, поддерживаю­ щий управление возможностями автозамены в Excel Устанавливает/возвращает возможность автома­ тического форматирования/создания гиперссылок при вводе текста Устанавливает/возвращает уровень безопасности макросов при программном открытии файла в Excel. Этот параметр не зависит от параметров безопасности макросов в диалоговом окне Безопасность (Security), доступном через меню Сервисq Макрос (Toolsq Macros), хотя константа msoAutomationSecuri tyByUI заставл53ет свой ­ ство и спользовать значение параметра из диало­ гового окна ' Устанавливает/возвращает необходимость добав­ ления символа % при вводе числа в ячейку с вы­ бранным Процентным форматом чисел Устанавливает/возвращает парам етры автовос­ становления , например Path и Time Только чтение . Возвращает точный номер версии Excel Устанавливает/возвращает необходимость пере­ счета книг перед сохранением на дис ке . Предпола­ гается, что автоматический пересчет формул от­ ключен (свойство Calculation)
Имя Тип возвращае- мого значения Calculation XlCalculati on Ca l culation- XlCalcu l a tion - I n terruptKey InterruptKey Calculation- XlCalculatio n - State State Calculatio n- Lo ng Vers ion Ca ller Vari a nt CanPlay Sounds Bo o lean CanRec ordSounds Bo o lean Captio n String CellDragAnd Drop Bo o l ean Ce lls Ran ge Cha rts Sheets Cl ipb oardFo rmats Var iant Columns Range COМAddins COМAddins ComrnandBars ComrnandBars ComrnandUnde r - Xl Comrn and- lines Unde r l ines ConstrainNumer i c Bool e an Объектная модель Excel 2003 673 Описание Устанавливает/возвращает режим пересчета формул: автоматически й , ручной или полуавтоматический Устанавливает/возвращает клавишу , которая мо­ жет прервать операцию пересчета в Excel Только чтение . Указывает текущее состояние рас­ ч'етов в Excel: в Процессе, в очереди или заверше­ ны Только чтение . Возвращает версию Excel и версию механизма расчетов , которые использовались при последнем сохранении файла · Только чтение. Параметры: [ I n dex ]. Возвращает информацию , оп и сывающую источник вызова те­ кущего кода Visual Bas ic (например, функцию ячей­ ки или событие документа) Только чтение . Возвращает возможность воспро­ изведения звуковых уведомлений в Excel. Это свойство не используется начиная с Excel 2000 Только чтение . Воз вращает возможность записи звуковы х уведомлений в Excel . Это свойство не ис­ пользуется нач и ная с Excel 2000 Устанавливает/возвращает заголовок осн овного окна Excel Устанавливает/возвращает возможность перетас­ кивания -ячеек Только чтение . Возвращает все ячейки а ктивного листа Только чтение. Возвращает все диаграм м ы актив­ ной книги Только чтение . Параметры : [ I n dex J . Возвращает массив значен ий формата (Xl Cl ipboardF ormat), находящегося в буфере обмена в данны й момент Только чтение. Возвращает все столбцы активного листа Только чтен ие . Возвращает коллекцию установ­ ленных надстрое к СОМ Только чтени е . Возвращает колле кцию командных панелей , до ступ ных в Excel Устанавливает/возвращает способ подчеркивания команд в Excel. Используется только на платформе Maciпtosh Устанавл ивает/возвращает необходимость распо­ знавания ручно го ввода толь ко чисел и знаков п унктуации . Испол ьзуется на платфор ме Windows, п оддерживающей руко п исный ввод
674 Приложение А Имя Тип возвращае­ мого значения Control- Boolean Characters CopyObjects- Boolean WithCells Curs6r XlMousePointer CursorМo vement Long CustomListCount Long CutCopyМode X lCutCopyМode DataEn tryМo de Long DDEAppRetu rnCode Long DefaultFi l ePath String DefaultSave - Format DefaultSheet- Direction DefaultWeb- Options XlFileFormat Long DefaultWeb- Options Decima l Separator String Dialogs Dialogs Описание Устанавливает/возвращает отображение управляю­ щих символов в языках с записью справа налево. (Для этого должна быть установлена поддержка языка) Устанавливает/возвращает возможность выреза­ ния, копирования и сортировки объектов (например, ~строенных объектов) одновременно с данными в ячейках Устанавливает/возвращает указатель мыши, кото­ рый отображается в Micrpsoft Excel Устанавливает/возвращает тип используемого кур­ сора: визуальный или логический Только чтение. Возвращает количество созданных и встроенных списков, используемых в Excel (например, Понедельник, Вторник , Среда".) Устанавливает/возвращает текущее состояние операции вырезания или копирован ия Устанавливает/возвращает возможность редакти­ рования заблокированных ячеек (xlOf f позволяет редактировать, xlon позволяет редактировать только незаблокированные ячейки, xlStrict по­ зволяет редактировать только те незаблокирован­ ные ячейки, которые нельзя отменить с помощью нажатия клавиши <Escape>) Только чтение. Возвращает результат (подтверждение/ошибку) последне го сообщения DDE, отправленного Excel Устанавливает/возвращает принятую по умолча­ нию папку, которая используется при открытии файлов Устанавливает/возвращает принятый по умолча­ нию формат файла ; который используется при со­ хранении Устанав:Ливает/возвращает направление нового листа в Excel Только чтение . Возвращает объект, позволяющий управлять параметрами, доступными в диалоговом окне Параметры веб-документа (Web Optioпs) Устанавливает/возвращает символ , который ис­ пользуется в виде десятичного разделителя. Это глобальный параметр, о каз ывающий влияние на все открытые кни ги . Для сброса собственных раз­ делителей используется оператор Applica- tion. UseSyst emSeparators = True Только чтение. Возвращает коллекцию всех встро­ енных диалоговых окон
Имя DisplayAlerts Display- ClipboardWindow DisplayComrnent- Indicator DisplayDocument- ActionTaskPane DisplayExcel4- Menus DisplayFormula- Bar DisplayFull- Screen DisplayFunction- ToolTips Displayinsert- Options DisplayNote- Indicator DisplayPaste - Options Тип возвращае­ мого значения Boolean Boolean XlComrnent- DisplayMode Boolean Boolean Boolean Boolean Boolean Boolean Boolean Boolean DisplayRecent- Boolean Files DisplayScroll- Boolean Bars DisplayStatus- Boolean Bar Объектная модель Excel 2003 675 Описание Устанавливает/возвращает необходимость вывода типичных сообщений Excel (например, "Сохранять изменения в книге?"). Сообщения можно отклю­ чать. В таком случае всегда будет выбираться от­ вет, принятый по умолчанию Устанавливает/возвращает необходимость вывода окна буфера обмена. Используется в Microsoft Of- fice Maciпtosh Editioп Устанавливает/возвращает режим отображения комментариев и индикаторов в ячейках Устанавливается в значение True для отображе­ ния панели задач Действия с документами (Documeпt Actions) Устанавливает/возвращает необходимость ото­ бражения меню Excel 4.0 · Устанавливает/возвращает необходимость ото­ бражения панели Формула Устанавливает/возвращает необходимость работы в полноэкранном режиме Устанавливает/возвращает режим отобр'ажения подсказок для аргументов функций при вводе функции в ячейку Устанавливает/возвращает необходимость вывода раскрывающегося списка Параметры вставки (lпsert Optioпs) возле диапазона после вставки ячеек, строк или столбцов Устанавливает/возвращает необходимость ото­ бражения индикатора комментария в верхнем пра­ вом углу ячейки Устанавливает/возвращает необходимость ото­ бражения кнопки Параметры вставки (Paste Optioпs) возле диапазона после операции вставки. Этот параметр доступен в пакете Office ХР, а зна­ чит, оказывает влияние на все остальные прило­ жения Office, в которых используется эта возмож­ ность Устанавливает/возвращает необходимость ото­ бражения списка последних открытых файлов в меню Файл (File) Устанавливает/возвращает необходимость ото­ бражения полос прокрутки для всех открытых книг в текущем сеансе Устанавливает/возвращает необходимость ото­ бражения строки состояния
676 Приложение А Имя Тип возвращае­ мого значения EditDirectlyln- Boolean Cell EnaЬleAnimations Boolean EnaЬleAuto­ Complete Boolean EnaЬleKeyCancel- XlEnaЬleCancel- Key Кеу EnaЬleEvents EnaЬleSound ErrorChecking- Opti ons Boolean Boolean ErrorChecking - Op tions Excel4Int1Macro- Sheets Sheets Excel4Macro- Sheets Sheets ExtendList · Boolean Featurelns tall MsoFea ture- Ins tal l Fil eConverters Variant FileDialog FileDialog FileFind IFind Описание Устанавливает/возвращает возможность модифи­ кации существующего текста непосредственно в ячейке. Обратите внимание, что та кая переза­ пись текста в ячейке возможна в любом случае Устанавливает/возвращает необходимость анима­ ции удаления и добавления ячеек, строк и столбцов Устанавливает/возвращает текущее состояние возможности автодополнения (AutoComplete) Устанавливаетfвозвращает реакцию макроса Excel на попытку пользователя прервать выполнение макроса (например, с помощью комбинациИ клавиш <Ctrl+Break>). Этот параметр можно использовать для отключения прерываний со стороны пользователя, перенаправления прерываний обработчику ошибок или для останов ки выполнения кода (этот вариант принят по умолчанию). Использовать осторожно Устанавливает/возвращает необходимость генера­ ции событий для объектов из объектной модели Excel, поддерживающих события Устанавливает/возвращает возможность использо­ вания звуков в Excel Устанавливает/возвращает свойства проверки ошибок, напр име р вackgroundCheck ing, Indi - ca torCol orindex и InconsistentFormula. Эти параметры соответствуют параметрам на вкладке Пров е рка ошибо к (Error Checkiпg) в диалоговом ок­ не Сервис qП араметры (Tools q Qptioпs) Только чтение. Возвращает коллекцию листов, со­ держащих международные макросы Excel 4 Только чтение . Возвращает коллекцию листов, со­ держащих ма кросы Excel 4 Устанавливает/возвращает необходимость авто­ матического добавления формул и форматирова­ ния при добавлении строк или столбцов в сущест­ вующие списки строк и столбцов Устанавливает/возвращает реакцию Excel на дос­ туп к не установленной функции (это касается как программного , так и интерактивного доступа) Только чтение. Параметры: [ Indexl J , [ Index2 J. Возвращает массив всех доступных в Excel преоб­ разователей файлов Параметры: [ f i 1e Diа1 ogType J . Возвращает объект, который представляет экземпляр одного из нескольких типов диалоговых окон Возвращает объект, обеспечивающий поиск файлов. Используется в Microsoft Office Maci пtosh Edition
Имя FileSearch FindFormat FixedDecimal FixedDecimal- Places GenerateGet - PivotData Height Hinstance Hwnd IgnoreRe mote - Requests Interactive International Iteration Тип возвращае- мого значения FileSearch FindFormat Boolean Long Boolean DouЫe Long Long Bool ean Boolean Variant Boolean Объектная модель Excel 2003 677 Описание Только чтение . Возвращает объект, обеспеЧиваю­ щий поиск файлов Устанавливает/возвращает критерий поиска для типов форматов ячеек, который используется вме­ сте с методами Find и Rep l ace Устанавливает/возвращает необходимость опре­ делять десятичную точку во вводимых числах с помощью свойства FixedDecimalPlaces Устанавливает/возвращает десятичную точку для всех вводимых в будущем чисел Устанавливает/возвращает возможность получе­ ния в Excel данных отчета сводной таблицы Устанавливает/возвращает высоту основного окна приложения Excel. Это значение невозможно изме- нить, если основное окно развернуто во весь экран или свернуто в пиктограмму Только чтение . Возвращает дескриптор экземпляра , приложения, вызывающего Exce l. В основном ис­ пользуется другими приложениями, например, !"!а­ писанными на Visual Basic Только чтение. Возвращает дескриптор окна верх­ него уровня для окна Excel. В основном использу­ ется другими приложениями, например, написан­ ными на Visual Basic Устанавливает/возвращает возможность игнориро­ вать удаленные запросы DDE Устанавливает/возвращает способность Excel реа- гировать на ввод с клавиатуры или мыши Только чтение. Параметры: [ Index]. Возвращает параметры интернационализации Excel. В качестве значения параметра lпdex можно использовать константы XlApplic a tioninternational Устанавливает/возвращает необходимость пере­ бора и пересчета всех ячеек в циклических ссылках в попытке определить циклическую ссылку . Свой­ ство используется -одновременно со свойствами Maxi terati o ns и MaxChange Langua geSe ttings La n guageSettin gs Только чтение . Возвращает объект , описывающий языковые параметры Excel Le ft DouЫ e Libra r y Path String Устанавливает/возвращает положение левого края основного окна приложения Excel. Это значение не меняется, если окно развернуто во весь экран или свернуто в пиктограмму Только чтение . Возвращает имя каталога, в кото­ ром хранятся надстройки
678 Приложение А Имя MailSession MailSystem MapPaperSize Тип возвращае­ мого значения Variant XlMailSystem Boolean MathCoprocessor- Boolean AvailaЫe MaxChange DouЫe Maxiterations Long MemoryFree · Long MemoryTotal Long MemoryUsed Long MouseAvailaЫe Boolean MoveAf terReturn Boolean MoveAfterReturn- XlDirection Direction Name String Names Names Network- String TemplatesPath NewWorkЬookStart Working ODBCErrors ODBCErrors Описание Только чтение. Возвращает шестнадцатеричный номер почтового сеанса или значение Null, если в данный момент активного сеанса не существует Только чтение . Возвращает тип используемой на компьютере почтовой системы (например, xlMapi, xlPowerTalk) Устанавливает/возвращает необходимость автомати­ ческой модификации документов, отформатирован­ ных для стандартного размера бумаги другой стра­ ны/региона (например, для размера А4), чтобы доку­ менты правильно печатались на листе стандартного размера в данной местности (например, Letter) Только чтение. Возвращает информацию о доступ­ ности математического сопроцессора Устанавливает/возвращает минимальное измене­ ние между итерациями циклической ссылки перед остановкой итерации Устанавливает/возвращает максимальное количе­ ство итераций для циклической ссылки Только чтение . Возвращает количество свободной памяти (в байтах), доступной Excel Только чтение . Возвращает общее количество па­ мяти (в байтах), доступной Excel (включая уже ис­ пользуемую память) Только чтение . Возвращает количество памяти (в байтах), которая используется Excel Только чтение . Возвращает до_ступность манипуля­ тора типа мышь Устанавливает/возвращает необходимость пере­ мещения текущей ячейки при нажатии клавиши <Eпter> Устанавливает/возвращает направление переме­ щения курсора при нажатии клавиши <Eпter> для смены текущей ячейки Только чт,ение. Возвращает "Microsoft Excel" Только чтение. Возвращает коллекцию определен­ ных в активной книге имен Только чтение. Возвращает расположение сетевого ресурса , на котором хранятся шаблоны Excel Только чтение. Возвращает объект Startworking Только чтение. Возвращает коллекцию ошибок, по­ лученных в результате последнего запроса или ис­ пользования отчета сводной таблицы с подключе­ нием ODBC
Имя ODBCTimeout OLEDBErrors OnWindow OperatingSystem Organization- Name Path PathSeparator PivotTaЬle- Selection PreviousSelec- tions ProductCode PromptFor- Summaryinfo Range Тип возвращае­ мого значения Long OLEDBErrors String String String String String Boolean Variant String Boolean Range Ready Boolean RecentFiles RecentFiles RecordRelative Boolean ReferenceStyle XlReference- Style Объектная модель Excel 2003 679 Описание Устанавливает/возвращает время подцержания подключения ODBC (в секундах) Только чтение. Возвращает коллекцию ошибок, по­ луЧенных в результате последнего запроса или ис­ пользования отчета сводной таблицы с подключе­ нием OLE DB Устанавливает/возвращает процедуру, которая вы­ зывается каждый раз при активизации окна конеч­ ным пользователем Только чтение. Возвращает название и версию операционной системы Только чтение. Возвращает имя организации,' ото­ бражаемое в диалоговом окне О программе Microsoft Excel Только чтение. Возвращает путь к установочному каталогу Excel Только чтение. Возвращает обратную косую черту (''\ ") на ПК и двоеточие":" на Maciпtosh Устанавливает/возвращает использование струк­ турированного выделения в сводной таблице . На­ пример, при выделении заголовка поля выделяют~ ся связанные с ним данные Только чтение. Параметры: [ Index]. Возвращает массив последних четырех диапазонов или имено­ ванных областей, выделенных с помощью диало­ гового окна Имя (Name) или диало гового окна Переход (Goto) Только чтение. Возвращает глобально уникальный идентификатор приложения Excel Устанавливает/возвращает необходимость запроса у пользователя итоговой информации при попытке сохранения файла Только чтение. Параметры: celll, [Се112 J . Воз­ вращает объект Range, содержащий ячейки, опре­ деляемые параметрами Только чтение. Определяет готовность приложения Excel Только чтение. Возвращает коллекцию последних открытых файлов Только чтение. Возвращает необходимость ис­ пользования относительных (тrue) или абсолют­ ных (False) ссылок на ячейки при записи макросов Устанавливает/возвращает формат ссылок на ячейки: Буква Число (например, А 1, АЗ) или Номе­ рСтрокиНомерСтолбца (например, R1 С1, RЗС1)
680 Приложение А Имя Registered- Functions Rep l aceFormat RollZoom Rows Тип возвращае­ мого значения Variant ReplaceFormat Boolean Range RTD RTD ScreenUpdating Boolean Selection Object Sheets Sheets SheetsinNew- Long Workbook ShowChartTip - Boolean Names ShowChartTip- Boolean Values ShowStartup- Boolean Dialog ShowТoolTips Boolean ShowWindows- Boolean InTaskbar SmartTag- SmartTag- Recognizers Recognizers Описание Только чтение. Параметры: [ Indexl] , [ Index2 J . Возвращает массив и описание функций, относящих­ ся к внешним библиотекам DLL или ресурсам кода Устанавливает/возвращает критерий замены для типов форматов ячеек при замене с помощью ме­ тода Replace Устанавливает/возвращает необходимость про­ крутки или масштабирования при использовании колеса прокрупи на мыши Только чтение . Возвращает все строки активного листа Только чтение. Возвращает ссылку на объект дан­ ных реального времени (RTD), подключенный к серверу данных реального времени Устанавливает/возвращает необходимость обнов­ ления экрана в процессе работы процедуры. Это свойство используется для ускорения работы кода через отключение обновления экрана (для этого свойство необходимо установить в значение False) на время выполнения процедуры. Для об­ новления экрана вручную можно воспользоваться методом ScreenRefresh Только чтение. Возвращает объект, выделенный в данный момент (например, лист, диаграмму) Только чтение . Возвращает коллекцию листов ак­ тивной книги Устанавливает/возвращае:г количество пустых лис­ тов, создаваемых в новой книге Устанавливает/возвращает необходимость ото­ бражения подсказок для названий точек данных на диаграмме Устанавливает/возвращает необходимость ото­ бражения подсказок для значений точек данных на диаграмме Устанавливает/возвращает необходимость ото­ бражения панели задач Новая книга (New Work- book) при загрузке приложения Excel Устанавли,вает/возвращает необходимость ото­ бражения экранных подсказок в Excel Устанавливает/возвращает необходимость ото­ бражения каждой книги в панели задач (тrue) или отображения одного элемента для Excel (False) Только чтение . Возвращает коллекцию механизмов распознавания смарт-тегов, которые используются в лриложении в данный момент
Имя Speech Тип возвращае­ мого значения Speech Объектная модель Excel 2003 681 Описание Только чтение. Разрешает доступ к свойствам и методам программного управления голосовых инструментов Office SpellingOptions SpellingOptions Только чтение. Разрешает доступ к орфографиче- StandardFont Standard- FontSize StartupPath StatusBar Templa t esPath ThisCell ThisWorkbook Thousand s - Separator Тор Transition- MenuKey Tra n s itiori. - Me nuKeyAction Transition- Nav igKeys String DouЫe String Variant S tring Range Workbook String DouЫe String Long Boolean ским параметрам приложения Устанавливает/возвращает шрифт, который ис­ пользуется в качестве стандартного шрифта Excel Устанавливает/возвращает размер шрифта, кото­ рый используется в качестве стандартного размера шрифта в Excel (в пунктах) Только чтение. Возвращает папку, которая исполь­ зуется в качестве стартовой папки Excel Устанавливает/возвращает текст строки состояния. Возвращает значение False, если программа Ex- cel перехватила управление строкой состояния. Устанавливается в значение False для передачи Excel управления строкой состояния Только чтение . Возвращает путь к шаблонам Excel Устанавливает/возвращает ячейку, в которой вы­ зывается определенная пользователем функция Только чтение . Возвращает книгу, содержащую ра~ ботающий в данный момент код VBA Устанавливает/возвращает символ, который ис­ пользуется в качестве разделителя тысяч . Это глобальный параметр, затрагивающий все откры­ тые книги. Для глобального сброса собственных разделителей воспользуйтесь оператором Appli- cationuseSystemSeparators = True Устанавливает/возвращает положение верхнего края основного окна приложения Excel. Это значе­ ние не может быть установлено, если окно развер­ нуто во весь экран или свернуто в пиктограмму Устанавливает/возвращает клавишу, которая вы ­ зывает меню Excel. По умолчанию используется клавиша <./> Устанавливает/возвращает реакцию на нажатие клавиши <Traпsitioп Мепu>. При этом может ото­ бра жаться меню Excel (x l Exce lMe nu) или диало­ говое окно Справка Lotus (Lotus Help) (xlLotusHelp) Устанавливает/возвращает состояние клавиш Traпsitioп Navigatioп. Эти клавиши обеспечивают другой способ перемещения и выделения элемен­ тов листа
682 Приложение А Имя UsaЬleHeight UsaЬleWidth UsedObjects UserControl Тип возвращае­ мого значения DouЫe DouЫe UsedObjects Boolean UserLibraryPath String u.serName UseSystem- Separa tors Value VBE Version VisiЫe Watches String Boolean String VBE String Boolean Watches Описание Только чтение. Возвращает вертикальное про­ странство (в пунктах), доступное в окне Excel . Это пространство доступно для окна листа . Если сво­ бодное пространство недоступно, свойство воз­ вращает значение 1 Только чтение. Возвращает rоризонтальное про­ странство (в пунктах), доступное в окне Excel . Это пространство доступно для окна листа. Значение этого свойства .будет недействительным, если сво­ бодное пространство отсутствует. Для проверки свободного пространства проверяйте значение свойства UsaЫeHeight (>1) Только чтение. Представляет объекты, выделен­ ные в книге Только чтение . Возвращает значение True, если текущий сеанс Excel был запущен пользователем, и значение False, если текущий сеанс Excel был запущен программно Только чтение. Возвращает расположение над­ строек СОМ Устанавливает/возвращает имя пользователя в Excel . Обратите внимание, что это имя отобра­ жается на вкладке Общие (Geпeral) в окне Параметры (Optioпs) и не совпадает с сетевым идентификатором пользователя или именем , кото­ рое отображается на заставке Excel Устанавливает/возвращает необходимость использо­ вания системных разделителей в Excel. При установке этого свойства в значение False можно восполь­ зоваться свойствами Application. Decimal - Separator и Application ..Thousands- Separa tor для переопределения системных раз­ делителей. Системные разделители определяются в диалоговом окне Региональные параметры (Regioпal Settiпgs) в Панели управления (Coпtrol Panel) · Только чтение. Возвращает строку "Microsoft Excel" Только чтение. Возвращает объект, позволяющий управлять редактором VBE Только чтение. Возвращает версию Excel Устанавливает/возвращает видимость Excel для пользователя Только чтение. Возвращает объект Watches, кото­ рый представляет все диапазоны, отслеживаемые в процессе пересчета листа
Имя Width Windows Тип возвращае­ мого значения DouЫe Windows Объектная модель Excel 2003 683 Описание Устанавливает/возвращает ширину основного окна приложения Excel. Значение этого свойства не мо­ жет быть установлено, если основное окно развер­ нуто во весь экран или свернуто в пиктограмму Только чтение. Возвращает все окна, открытые в предела х текущего сеанса Excel WindowsForPens Boolean Только чтение. Свойство позволяет определить, работает ли Excel в среде с поддержкой рукописно­ го ввода (Windows for Реп Computing environment) WindowState- XlWindow Workbooks Worksheet - Function Worksheets State Workbooks Worksheet- Function Sheets Устанавливает/возвращает текущее состояние ок­ на (развернуто во весь экран, свернуто в пикто­ грамму или нормальное состояние) Только чтение. Возвращает все открытые книги (не включая надстройки) из текущего сеанса Excel Только чтение. Возвращает объект, содержащий все функции листов Excel, которые могут исполь­ зоваться в VBA Только чтение. Возвращает все листы в пределах активной книги Методы объекта Application Имя Activate- Microsoft- Арр AddChart- AutoForma t AddCustom- List Calculate Calculate- Full Тип возвращае- Параметры мого значения Index As XlMSAppli - cation Chart, Name AsString, [Description] ListArray, [ByRow] Описание Активизирует приложение, ука~анное в качестве значения параметра XlMSApplication. Открывает прило­ жение, если оно еще не открыто. 'Рабо­ тает так же, как функция GetObj ect вVВА Добавляет форматирование и легенды объекта Chart, указанного в виде пара­ метра, в собственные типы диаграмм Добавляет массив строк, определенный параметром ListArray, в собственные списки Excel. Параметр ListArray мо­ жет указывать на диапазон ячеек Пересчитывает все формулы в откры­ тых книгах, изменившиеся с момента последнего пересчета. Имеет смысл только при ручном пересчете Пересчитывает все формулы во всех от­ крьггых книгах. Запускает принудительный пересчет всех формул в каждой книге вне зависимости от наличия изменений с мо­ мента последнего пересчета
684 Приложение А Имя Тип возвращае- Параметры мого значения Calculate- FullRebuild Calculate- FullRebuild Centimeters- DouЫe ToPoints 1 CheckAbort Check- Spelling Convert- Formula DDEExecute Boolean Variant DDEinitiate Long DDEPoke Centimeters As DouЫe [KeepAbort] Word As String, [Custom- Dictionary] , [I gnore- Uppercase] Formula, FromReference Sty le As XlReference S tyle, [ToRe ferenc e - Style ], [ToAbsolute], [RelativeTo] Channel As Lo ng, String As Stri ng Арр As String ,' T opic As S tring Chanriel As Long,Item, Dat a Описание Полностью пересчитывает все откры­ тые книги, включая формулы с зави­ симостями Принудительно запускает полный пе­ ресчет данных и перестраивает зави­ симости для всех открытых книг. Обра­ тите внимание, что зависимости - это формулы, зависящие от значений дру­ гих.ячеек Выполняет преобразование значения параметра Centimeters в пункты, где 1 см =28.35 пункта Останавливает пересчет в приложении Excel · Проверяет орфографию параметра word и возвращает значение True, если ошибок не обнаружено и False, если ошибки обнаружены Выполняет преобразование значения параметра Formula из формата ссылок R1 С1 в формат ссылок А1 и наоборот. Возвращает преобразованную формулу . Кроме этого, позволяет преобразовы­ вать значение параметра F ormul a в форматы с абсолютными и относи­ тельными ссылками. Для этого исполь­ зуется параметр т_oReferenceStyle и константы XlReferenceStyle , Отправляет приложению объект Com- ma n d с помощью механизма DDE че­ рез канал, номер которого указывается в качестве значения параметра Com- mand. Свойства, названия которых на­ чинаются с DDE, связаны с устарев­ шей технологией Dyпamic Data Ex- chaпge. Эта технология использова­ лась для совместного доступа приложений к данным Возвращает номер канала, который дол­ жен использоваться для обмена данны­ ми по технологии DDE для указанного имени приложения и раздела DDE Отправляет значенИе параметра Data элементу приложения через указанный канал DDE
Имя Тип возвращае- мого значения DDERequest Variant DDETerminate DeleteChart AutoFormat Delete- CustomList DouЬleClick Evaluate Variant Execute- Variant Excel4Ma cro FindFile Boolean Get- Variant CustomList- Contents Get- CustomList - Num GetOpen- Filename Long Variant Параметры Channel As Long, Item String Channel As Long Name As String ListNum As Long Name String As Stri ng ListNum As Long ListArray As [FileFilter], [Filterindex], (Title], [ Butt onTex t], [Mu ltiSel e ct] Объектная модель Excel 2003 685 Описание Возвращает информацию для указан­ ного канала и элемента DDE Закрывает указанный канал DDE Удаляет указанный в параметре Name собственный тип диаграммы Удаляет собственный список с указан­ ным номером. Первые четыре списка являются встроенными и _не могут быть удалены Запускается двойным щелчком на ак­ тивной ячейке активного листа Оценивает строковое выражение из параметра Name, как при вводе в ячей· ку листа Выполняет макрос Excel 4, указанный в параметре String. Результат вы­ полнения макроса передается в виде возвращаемого значения метода Отображает диалоговое окно Открыть (Ореп), позволяя пользователю вы­ брать файл. При удачном открытии файла возвращается значение True Возвращает собственный список, на который указывает параметр ListNum. Список возвращается в виде массива строк Возвращает 1-JOMep списка, совпадаю­ щего с указанным массивом строк. Ес­ ли ни один из списков не соответству­ ет массиву строк , возвращается зна­ чение О Отображает диалоговое окно Открыть (Ореп) с необязательными фильтрами файлов, заголовками и текстами кнопок, которые передаются в качестве пара­ метров метода . Имя и путь к файлу пе­ редаются в качестве возвращаемого значения. При установке параметра MultiSel ect в значение True метод возвращает массив имен файлов. От­ крытие файла методом не выполняется
686 Приложение А Имя Тип возвращае- Параметры мого значения GetPhonetic String GetSaveAs- Filenarne Goto Help Inchesтo- · Points InputBox Intersect Variant DouЫe Variant Range [Text] [ Initial- Filenarne], [FileFilterJ, [Filterindex], [Title], [ButtonText] [Reference ], [Scroll] [HelpFileJ, [Help- ContextID] Inches As DouЫe Prornpt As String, [Title], [De fault], [Left ], [Тор ], [HelpFile ], [HelpContext- ID], [ Туре ] Argl As Range , Arg2 As Range, [ ArgЗ] , ... [ ArgЗO ] Описание Возвращает фонетический текст япон­ ских символ ов, переданных в качестве значения параметра техt. Если пара­ метр техt не предоставляется, воз­ вращается альтернативный фонетиче­ ский текст предыдущего значения па­ раметра Text Отображает диалоговое окно Со~ранить Как (Save As) с принятым по умолчанию необязательным именем файла , фильтрами файлов, заголов­ ками и текстами кнопок, которые пере­ даются в качестве значений парамет­ ров. Путь и имя файла передаются в качестве возвращаемого значения метода. Сохранение файла методом не выполняется Выделяет объект, на который указыва­ ет параметр Reference. При этом ак­ тивизируется лист, содержащий объ­ ект. Параметр Reference может ука­ зывать на ячейку, диапазон или имя процедуры VBA. Если параметр Scroll установлен в значение True, выделенный объект будет размещен в верхнем левом углу окна Excel Отображает раздел справочного руко ­ водства, на который указывает пара­ метр HelpContextID. Файл справоч ­ ного руководства указывается в пара­ метре нelpFile Выполняет преобразование параметра Inch es в пункты и возвращает новое значение (1 дюйм равен 72 пунктам) Выводит простое окно ввода, похожее на окно ввода , п редоставляемое стан­ дартной функцией VBA. При этом па­ раметр Туре может использоваться для установки типа возвращаемого значения , например, формула (О), чис­ ло (1 ), текст (2), Bool e an (4), ссылка на ячейку (8), ошибочное значение (16) или массив значений (64) Возвращает пересечение диапазонов, указанных в виде значений парамет­ ров . Возвращаемое значение имеет ТИП Range
Имя MacroOptions MailLogof f MailLogon NextL etter On Key On Repeat OnTime OnUndo Qui t RecordМac ro Тип возвращае- Параметры мого значения [Macro], [Description], [HasMenu], [MenuText}, [HasShortcut Кеу] , [ ShortcutKey] , [CategoryT, [Sta tusBar], [ Help- ContextID] , [Help FileJ [Name], [Password] , [Down load- NewMail J Workbook Кеу As String , [Procedure ] Text As String , Pro - cedure As Strin g EarliestTime , Procedure As String, . [Lates tTime ], [Schedul e ] Text As String , Pro- cedure As String [ BasicCode ], [Xl mCode} Объектная модель Excel 2003 687 Описание Обеспечивает модифи кацию атрибу­ тов макроса, например имени, описа­ ния, клавиши быстрого запуска, кате­ гории и связанного файла справочного руководства . Является эквивалентом диалогового окна Параметры макроса Завершает текущий почтовый сеанс MAPI (например , Exchaпge , Outlook) Подключается к принятому по умолча­ нию кл иенту электронной почты MAPI (например, Exchange , Outlook). Прини­ мает такие параметры, как имя И пароль Используется в система х Macintosh вместе с расширениями PowerTalk для открытия самой старой не п рочитанной книги ИЗ лотка Входящие (ln Тгау) . В операционной систе м е W indows ге­ нерирует сообщение об ош ибке Вызывает процедуру , на которую ука- · зы вает параметр Procedure. Проце­ дура запускается пр и каждом нажатии клавиши или ком б инаци и кл авиш, ко­ торые указываются в параметре Кеу Указывает текст, который выводится в пун кте меню Правка q Повтор (Edi tq Repeat), а также процедуру, вы­ зываемую при выборе команды Пра в ка q Повтор (Editq Repe at) Указы вает процедуру , которая запус­ кается в м·омент, определенный пара­ метром Ea r lie s t Time . Параметр L a t estTime позволяет оп исать диа ­ пазон времен и Указывает текст, которы й выводится в пун кте .меню Правка qQтменить (Editq Undo), а также процедуру, вызы­ ваемую при выборе п ун кта меню Правка q Qтменить (Editq Undo) Завершает работу Microsoft Excel Добавляет код из параметра Basic- Code в записываемый в дан ный мо­ м ент макрос
688 Приложение А Имя Тип возвращае- Параметры мого значения Описание RegisterXLL Boolean Repeat Run Variant Save- Workspace SendKeys SetDefault- Chart Undo Union Volatile Wait Range Boolean События объекта Application Имя Параметры Filename As String [Macro], [Argl], [Arg2], ... [ArgЗO] [Filename] Keys, [Wai t] [FormatName], [Gall ery] Argl As Range, Arg2 As Range, [ArgЗ], ... [ArgЗO] [Volatile] Time Описание Загружает ресурс с кодом , у_казанный в параметре Filename. При этом вы­ полняется регистрация всех функций и процедур, доступных в этом ресурсе Повторяет последнее действие поль­ зователя. Должен находиться в самом начале процедуры Запускает макрос или процедуру, ука­ зан1-1ые в параметре Macro. Этот метод позволяет запускать макросы Excel 4.0 Сохраняет рабочую среду в файле, на который указывает параметр Filename Отправляет нажатия клавиш из пара­ метра Keys пользовательскому ин­ терфейсу Microsoft Excel Устанавливает принятый по умолча­ нию тип диаграммы, который исполь­ зуется при программном добавлении диаграмм. Значение параметра For- ma tName может соответствовать од­ ному из встроенных типов или собст­ венному типу диаграммы Отменяет последнее действие, выпол­ ненное через пользовательский ин­ терфейс Возвращает объединение диапазонов , указанны х в качестве значений пара­ метров Установка параметра Volatile в зна­ чение True приводит к Пересчету зна­ чения функции, даже если парам етры функции не изменились Приостанавливает работу макроса и Excel до достижения момента, ука­ занного в значении параметра Time NewWorkbook Wb As Workbook Возникает при создании новой книги, которая пе­ редается в качестве параметра процедуры обра­ ботки события SheetActiva,te Sh As Object Возникает при активизации листа (лист отобра ­ жается поверх других листов) . Активизированный лист передается в процедуру обработки события в качестве параметра
Имя SheetBefore - DouЬleClick SheetBef ore - RightClick Параметры Sh As Object, Target As Range, Cance l AsBoolean Sh As Object, Target As Range, Cancel As Воо- lean SheetCalculate Sh As Obj ect SheetChange Sh As Object, Target As Range SheetDeactivate Sh As Object Объектная модель Excel 2003 689 Описание Возникает перед двойным щелчком на листе . Лист и потенциальное место двойного щелчка передаются в процедуру обработки события в ка- честве параметра. Действие двойного щелчка можно отменить . Для этого параметр cancel не ­ обходимо установить в значение True Возникает перед щелчком правой кнопкой мы- · шина листе . Лист и потенциальное место щелчка правой кнопкой мыши передаются в процедуру обработки события в качестве параметров. Дей- ствие щелчка правой кнопкой мыши можно отме­ нить . Для этого параметр cancel необходимо ус­ тановить в значение True Возникает при пересчете листа. Пересчитывае­ мый лист передается в процедуру обработки со- бытия в качестве параметра Возникает при изменении диапазона. на листе , например, при удалении содержимого диапазона, вводе данных, удалении строк или столбцов, вставке данных и т . д. Не возникает п ри вставке строк/столбцов Возникает, когда лист теряет фокус. Лист пере ­ дается в процедуру обработки события в качест- ве параметра SheetFollow- Hyp~rlink sh As Obj ect, Возникает при щелчке на гиперссылке внутри Target As Hyper- листа . Лист и гиперссылка передаются в пpoцe­ link дуру обработки события в качестве параметров SheetPivotTaЬle ByVal Sh As Ob - Update ject, Target As PivotTaЬle SheetSelection- Sh As ОЬ- Change ject,Target As Range WindowActivate Wb As Workbook, Wn As Window Window- Wb As Wo rkbook, Deactivate Wn As Window WindowResize Workbook - Activate Wb As Workbook, Wn As Window Wb As Workbook Возникает при обновлении отчета сводной таб­ лицы. Лист и отчет сводной таблицы передаются в процедуру обработки события в качестве пара­ метров Возникает при выделении новой ячейки на листе . Новый диапазон и лист передаются в процедуру обработки события в качестве параметров Возникает при активизации окна книги (при ото­ бражении окна поверх остальных окон книг). Кни­ га и окно передаются в процедуру обработки со­ бытия в качестве параметров Возникает при потере фокуса окном книги . Книга и окно передаются в процедуру обработки собы­ тия в качестве параметров Возникает при изменении размеров окна книги . Кни­ га и окно передаются в процедуру обработки собы­ тия в качестве параметров . Событие не возникает при изменении размеров окна приложения Excel Возникает при активизации книги (книга отобра­ жается поверх всех остальных окон). Книга пере­ дается в процедуру обработки события в качест­ ве параметра
690 Приложение А Имя Параметры WorkbookAddin- Wb As Workbook Install WorkbookAddin- Wb As Wo rkbook Uninstall WorkbookBefore- Wb As Workbook, Close Cancel As Boo - lean WorkbookBefore- Wb As Workbook, Print Cancel As Boo - lean WorkbookBefore- Wb As Workbook , Save Workbook- Deactivate WorkbookNew- Sheet WorkbookOpen WorkbookPivot- TaЬleClose­ Connection WorkbookPivot- TaЬleOpe n ­ Connection SaveAsUI As Boo - lean, Cancel As Boolean Wb As Workbook Wb As Workbook, Sh As Object Wb As Workbook ByVal Wb As Workbook, Target As PivotTaЬle ByVal Wb As Workbook, Target As PivotTaЬle Пример: объект Application Описание Возникает при добавлении в Excel надстройки, которая одновременно является кн и гой . Книга надстройки передается в процедуру обработки событ ия в качестве параметра Возникает при удалении из Excel надстройки, ко­ торая одновре менно является книгой. Книга над­ строй ки передается в процедуру обработки собы­ тия в качестве параметра Возн икает перед закрытием книги. Книга переда­ ется в процедуру обработки события в качестве парам етра . Закрытие книги можно отменить. Для этого параметр Cancel необход им о установить в значение тrue Возни кает перед отправкой книги в печать . Книга передается в процедуру обработки события в ка­ честве параметра. Печать можно отменить. Для этого параметр cancel необход имо установить в значение True Возникает перед сохранением книги . Книга пере­ дается в процедуру обработки события в качест­ ве пара метра . Сохра нение книги можно отме­ нить. Для этого параметр Cancel необходимо ус­ тановить в значение True. Есл и пара метр SaveAsUI установлен в значен ие True, отобра­ жается диалоговое окно Сохра н ить Как (Save As) Возникает при потере к)-lигой фокуса. Книга и ок­ но передаются в процедуру обработки события в качестве п араметров Возникает при добавлении нового листа в книгу. Книга и новый лист передаются в процедуру об­ работки события в качестве пара метров Возникает при открытии книги. Открытая книга передается в пр оцедуру обработки события в ка­ честве параметра 1 Возникает при разрыве подключения к отчету свод- ной таблицы. Выделенная книга и отчет сводной таблицы передаются в процедуру обработки собы­ тия в качестве параметров Возникает пр и создании подключен ия к отчету сводной таблицы. Выделенная книrа и отчет свод­ ной табли цы передаются в т~роцедуру обработки события в качестве параметров В этом примере показано, как использовать метод App l icat ion . GetOpenF i leName для получения имени файла, который необходимо открыть. Ключевой особенностью применения этой функции является присвоение возвращаемого значения переменной типа Vai·iant.
Объектная модель Excel 2003 691 еГо номер (последний! ) , Application.CustomListcoU:nt . • .сЕе забудьт:е:, что он бы.11 ':ЬAdded ~ ' ~rue End ·If ,:· . Коллекция Areas В коллекции Areas хранятся коллекции , объектов Range. Каждый объект Range пред­ ставляет блок ячеек (например, Al:AlO) или единственную ячейку. КоллекцияАrеаs мо­ жет хранить несколько диапазонов из разных частей книги. Родительским объектом для коллекции Areas является объект Range. Общие свойства коллекции Areas Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
692 Приложе,Jiие А Свойства объекта Areas Имя Тип возвращае- Описание мого значения Count Long Itern Range Пример: коллекция Areas Топько чтение. Возвращает количество объектов Range, которые содержатся в области Параметры: Index As Long . Возвращает один объект Range из коллекции Areas . Параметр Index соответствует порядку выде­ ленны х диапазонов Если при использовании объекта Range, содержащего несколько различных облас­ тей, двадцатая ячейка не входит в первую область диапазона, код вида rgRange. Cells ( 2 О) . Value применять нельзя. Это связано с тем, что Excel выполняет поиск только в первой области, неявно используя вызов rgRange.Areas (1) .Cells (20). Value. В этом примере показана функция для обхода этой проблемы: ~ ь·. тesf::М:ul.tiAreacellsO ·. ""· Dim oRNg As Range ' Определить диапазон, состоящий из нескольки х Set oRNg = Range("D2:F5,H2:I5") , 'Ячейка FS должна быть двенадцатой. MsgВox "Rng.Cells(12) is " & oRNg . Cells(12).дd'dress . & · vbCrLf & "Rng .. Areas(l).Cells().2) .is" & - ··· ·· oRNg.Areas(l) .Cells(12) .Addr'ess vbCrLf & "MultiAreaCells(Rng, 12. ) is " & ' ~ мuitiAreaCells (Rng., 12 )· . Address ',. ..: • ' :~ • ' ·" ,. ' ;'' > ;:~~ ' Ячейка н2 :· должна быть ·13 • ячейкой · составliчго диапазона· Цервой ячейкой . во второй .' об.Пасти. · · · · · · ,. MsgBox ''Rng . Cells (.13) is. • " . & oRNg .Cells ( 13 j , дddress. & .vЬCrL.f & "Rng : Area:'s(l) .Cells(13) 1s " & _ · oRNg.Areas(l) . cells{lЗ) .Address ' "MultiArea:CeЦs(Rng, 13) is " & _ М"~l tiAreaCeЦs (Rng ', ,:Р) .Addr;ess IEnd ·. Sub .< .•:. ·, iFUn:ction мuitiA,reaceJ.ls (oR,ange As. Range, iCellNurn ~ Dirn iTotGells As Long·, ' oArea As Range ! ' Перебрать все облас.~и :диапазона ,' '· .. !> ' ·начиная с r;rервой, ес.л:и области· закончилис1о ·. [· Do · · · 1' For ' Each ciArea . In oRange . Areas '' Входит лИ и;;.тересующа.я ячейка в эту . 'область? If iTotCells + oArea.Cells.Count >= iCellNuin Theh ,> .· . . .· . ;·' ·.. -· ""' _, __ ,· '(. ~,'.Да .- ве'рнуться и set MultiAreaCells . Exit Function -Eise завершить работу функциИ" oArea. Cells (iCellNurn , ~. f , " Нет - отсчитать ячейки .и продоJ1жить· ' .·• • iTotc,eЦ.s · iTotCells + oArea.Cells,count · End'Jf . .. r~ ~ехt ,~"_/,:-~ · ·, . Loop ""> : ?.I1fi, ,fy.pcj::~Oif.\,, ".,;
Объектная модель Excel 2003 693 Объект AutoCorrect Объект AutoCorrect обеспечивает доступ ко всей функциональности автозамены (AutoCoпect) в Excel . Общие свойства объеКта AutoCorrect Опреде.Ления свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта AutoCorrect Имя Тип возвращае- Описание AutoExpand- ListRange Capi tali ze- NamesOfDays мого значения Boolean Boolean CorrectCaps - Boolean Loc;k Correct - Boolean SentenceCap DisplayAuto- Boolean CorrectOptions ReplaceText Boolean Twoinitial- Capitals Boolean Методы объекта AutoCorrect Имя Тип возвращае- мого значения Add- Variant Replacement Delete- Variant Replacement Устанавливается в значение True для автоматиче­ ского развертывания в списках Устанавливает/возвращает необходимость преобра­ зования в верхний регистр первых букв названий дней недели Устанавливает/возвращает необходимость автома­ тического исправления ошибок набора, возникающих при включении клавиши <Caps Lock> Устанавливает/возвращает необходимость преобра­ зования в верхний регистр первой буквы предложения Отображает/скрывает кнопку Параметры автозамены (AutoCorrect Optioпs) . По умолчанию свойство уста­ новлено в значение True. Значение свойства влияет на весь пакет Office. Изменение значения свойства в Excel повлияет на все остальные приложения Excel Устанавливает/возвращает необходимость автома­ тической замены некоторых слов на слова из списка автозамены Устанавливает/возвращает необходимость автоматиче­ ского преобразования второй буквы слова в нижний ре­ гистр, если первая буква находится в верхнем регистре Параметры · What As String, Re - placement As String What As String Описание Добавляет слово (значение параметра Wha t), которое будет автоматически заменяться на другое слово (значение параметра Replacement) в массив списка замены (ReplacementList) Удаляет слово из списка Replacemen- tList. При этом автоматическая заме- на слова . на другое слово отключается
694 Приложение А Имя Тип возвращае- Параметры мого значения Replacement- Variant List Пример: объект AutoCorrect [Index] Описание Возвращает многомерный массив строк. Первый столбец массива со­ держит заменяемое слово, а во втором столбце хранится замещающий текст. Параметр Index можно использовать для получения массива, содержащего слово и его замену В этом примере объект AutoCorrect используется для поиска замены конкретного слова. r suБ ''тe.stA.\.i tocorreъ ·t:()" ;", . MsgBox ;, · ', .(с) ' · заменяется на [End, Sub ' .Furiction UseAutoCorrect (ByVal sWord As · String) ;. -D±m As Integer . Dim vaR.epList As Variant J: D;i.itl. si;teturn As String t' ,. ' ' п9 . Умолчанию возвращать исхо. дное слqв ·о sReturn = sword : '. Загрузить список замен в : ма~::~ив , . . . k·:;; vaRepList = Application.AutqCorrect.ReplacernёritList Е'' ' · перебрать список з_амен --;_., . .· · .. for ±:. = LBound (vaRepLi.st) . oro , UBound(vaRepList) ,,,, . · ·, , Найдено ли совпаденИе? · .. ·. • . . f vaRepList ( i, 1) : _,;;_ _ sWo:i-d ' 'ifhen ·· Вернуть 'текс';' ' ~аменьi ' ' sReturrt , = "vaRepList (i, ' В~~й;_ги из цик.hа •· '' · .·: .E:xit Fpr: ·. ·-'- ~n·d <rf. " ·~-' .' Вернуть .слово или · его замену, UseAutoCorrect =·sReturn ,?,~-~~-μ,мf:iЯ.t.~<?,n~.:,_m ~·'"'-".:~~..~h'A• . • &~~ -= ! ' & = ~ ; .~ : " - ~ = " - · Объект AutoFilter такая Объект AutoFil ter предоставляет доступ к функциональности автофильтра в Excel. Объект поддерживает программную фильтрацию диапазона с текстом для получения строк конкретных типов, скрывая строки, которые не соответствуют определенному критерию. Примеры фильтров поддерживают получение первых десяти строк столбца, получение строк, равных определенному значению, а также получение непустых ячеек в строке. Для доступа к этим возможностям в Excel можно воспользоваться командой ме­ ню ДанныеqФильтрqАвтофильтр (Dataqfilte1·qAutoFilte1·) . Для объекта AutoFilter родительским является объект Worksheet (подразумевается, что в пределах листа мо­ жет присутствовать только один автофильтр) . Объект AutoFilter испо:льзуется совместно с методом AutoFilter объекта Range и свойством AutoFil terType объекта Worksheet.
Объектная модель Excel 2003 695 Общие свойства объекта AutoFilter Определения свойств Application, Creator и P.arent приводились в начале при­ ложения. Свойства объекта AutoFilter Имя Тип возвращае- Описание мого значения Filters Filters Только чтение. Возвращает коллекцию фильтров, связанных с диапазоном (например, непустые строки) Range Range Только чтение . Возвращает группу ячеек, к которой применяет­ ся автофильтр Пример: объект AиtoFi/ter В этом примере показано использование oбъeктoвAutoFilter, Filters и Filter. Приведенный ниже код выводит список всех применяемых в данный момент фильтров: tsU.ь sliowA:u\:'oFfi t ercr"i tёria о · . · ",. I;Jim oAF .As AutoFi'lter, oFl t As· ~, · Dim s.Fl~ld As String ·.., '. < .. · · · D im' sCri tl As String, sCr:iit2 As i:• .D im ; sMsg As String., i ,л$ ·' r'nt.eger· ~ .' ." Проверить существов.аi!1;1е•' филJ;,тров ; Листе ~ · ·· ·rf . лctivesheet .AutoFЫ:terM9de ',=,; ' Fa1$e Then.· ' • . MsgBox "Автоф:Ильтр на ли'с;::те отсутсо;гвуе~r " . ."· Exit Sub ··· · "·"' · .• ft':.;/:' '{'; ;, ·· · .Edd~ ~f . } . ' Получить · обЪект ав'l'.оФИльтра, установле1-щого на , S'et oAF =1,~ AC,tiveShiэet .AutoFilter . ,. . .. . "'- Перебрать все объектьi Filters· внутри объекта AutoFil,ter .". For i : "i · То ..oAF.Filt'.ers.Count . . ' .. ' ло.iiу~Ить имя поля. Из первой строки ' .цнацазона с автофильтром . sField = oAF,Range.Cellsll, ' Получить .о.бъект· Fi'iter Set. oF.lt = ' oAF.I;ilte:ts('i) " Если фИЛьтр вклюЧен ... :tf 'OF1t. on . 'rhen · . ' '. Получить стандартньrй \критерий филь трациИ ·• st-fsg ;, sMsg & vbCrLf & sField ' & . oFlt. Cri'teria1 ' Если это специальный фильтр, отобразить' select Case oFlt.Operator Case xlAnd ,, · · · · s'Msg = sMsg & " And " &' .•sField ·ca se xlOr 'sмsg=sMsg&." Or " & sField &· oFlt·. Case xiвottomlOitems · sMsg =' sMsg . & " (bottom ' ca'se xlвottomlOPercent sMsg' = sмs:g .& " (bottom 10%)" ' Case xlTopl.Oitems , sMsg =·sMsg& • (top10 · Case xlTqplOPe:tcent sMsg=sMsg&" (top Select.
696 Приложение А sмsg = "" тhen . ··р• ' Фильтры не установлены. Сообщить об этом sM,sg ="диапазон _ " & oAF.Range.Address & " Фильтры установлены. Показать фильтры "Диапазон · " & oAF.Range.Address & " содержит следующие фильтры:" & sMsg ' Вывести сообщение MsgBox sMsg ~n_cl,._§u]? Объект AutoRecover Этот объект обеспечивает доступ к параметрам автоматического восстановления приложения Excel, которые доступны на вкладке Сохранение (Save) в диалоговом окне Параметры (Options). Изменение этих параметров отражается на всех книгах. Обратите внимание, что каждая книга может выбирать необходимость использования автоматиче ­ ского восстановления. Этот параметр также доступен на вкладке Сохранение (Save). Общие свойства объекта AutoRecover Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта AutoRecover Имя Тип возвращае- Описание мого значения EnaЫed Boolean Path String Time Long Возвращает значение True, если объект Au toRecover вклю­ чен Устанавливает/возвращает полный путь к каталогу, в котором хра­ нятся временные файлы для автоматического восстановления Устанавливает/возвращает интервал времени для объекта Au- toRecover. Возможные значения свойства находятся в диапа­ зоне от 1 до 120 минут (по умолчанию свойство установлено в значение 1О) Пример: объект AиtoRecover В следующей подпрограмме и в функции устанавливаются свойства oбъeктaAutoRe­ cover . После этого они используются в коде соответствующей книги , !SUb s·etAtl-toRёCOV8i5PtlOБS: (.>~ -}JP'ff' ,,_ _ , ."~",....-~. ~" у·л~""~ _, ._~""""'· ·- ~".,~,,." [ ~· . , Установить параметры автоматического восстановления i <' .. ... · c hang~A utoRec ov~rse ttings True, "С: \D,ocuments. and ,~setting,s\AgamaOffice\My ~~Docllinents\"Backup "Filep\AutoRecover\Excel", 2 i "<; ·'• . ' Г.' Удостовериться, ' что установленные · параметры . ~-; ·ThisWorkbook . .EnaЫeAutoRecover ~ - · True•<··· · i :Eцd Sub · 11\шction ChangeAut~Recoverse'tйngs (Optionai :ВуVа1 ~Enabie . As Variant, ;Optional ByVal · vPath :,As Variant, Optional ByVal v'rime _As Nariant) · r With Application.AutoRec.over .. ·'' ·· . k,,~·- :,--:t,;м~~:.... , ~~-'~ ::, . У.<?~О}~??лр1}~.?.~.?~ ·..;:9. _вqff _g~_ ?9 ~-м ~~q~~ ,~.SO ". JЧ?~ -~1::!.~:~Л1~. r.;~~х ~~- ~~~Jj~~ ~ -~~Р~,М~~Р~ё(-~):i.
Объектная модель Excel 2003 697 ····г · ·· wotV'1' sм±s. siЪsЛ 'VБiiaЬiЭY ·-ть:·еn \ Вклiочить автоматическое , . ., . En~bled , vEnaЬ,le End <If Объект Axis и коллекция Axes В коллекции Axes хранятся все объекты Axis в пределах диаграммы Excel. Каждый объект Axis является эквивалентом оси на диаграмме Ехсе! (например, ось Х, ось У и т.д.) . Родительским объектом для коллекцииАхеs является объект Chart. Кроме типичных атрибутов, коллекция Axes предоставляет свойство Count, которое возвращает количество объектов Axis в пределах коллекции. Кроме того, в отличие от большинства других коллекций, метод Item коллекции Axes принимает два параметра: Туре и AxisGroup. В качестве значений параметра Туре можно использовать одну из констант xlAxisType (xlValue, xlCategory или xlSeriesAxis). Необязательный второй параметр, AxisGroup, может принимать в качестве значения одну из констант xlAxisGroup (x,lPrimary или xlSecondary). Общие свойства объекта Axis Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта Axis Имя Тип возвращае- Описание мого значения AxisBetween- Boolean , Categories AxisGroup XlAxisGroup AxisTitle AxisTitle BaseUnit XlTimeUnit Устанавливает/возвращает пересечение оси значений с осью категорий между категориями (как в гистограмме) или параллельное размещение оси значений с метками категорий (как в диаграмме графика) Только чтение . Возвращает rруппу текущей оси (основная, xlPrimary, или вторичная, xlSecondary) Только чтение . Возвращает объект для управления свой­ ствами заголовков оси Устанавливает/возвращает тип базовых единиц измере­ ния для оси категорий . Применяется совместно со свой­ ством BaseUnitisAuto. Использование совместно с осью значений является оwибкой
698 Приложение А Имя Тип возвращае- Описание мого значения BaseUnitis- Boolean Auto Устанавливает/возвращает автоматический выбор еди­ ниц измерения для оси категорий . Использование со­ вместно с осью значений является ошибкой Border Border Только чтение. Возвращает свойства границы для выде ­ ленной оси Category - Names Category- Type Crosses CrossesAt DisplayUnit DisplayUnit- Custom DisplayUnit- Label HasDisplay- UnitLabel HasMajor- Gridlines HasMinor- Gridlines HasTitle Height Left Major- Gridlines MajorTick- Mark MajorUnit Majorunit- IsAuto Vari ant Устанавливает/возвращает имена категорий для осей в виде строкового массива XlCategoryType Устанавливает/возвращает тип оси, которая использует­ ся в качестве оси категорий. Применение совместно с осью значений является ошибкой XlAxisCrosses Устанавливает/возвращает точку пересечения оси с дру­ гой осью: минимальное значение, максимальное значе­ ние, автоматически выбирается Excel или собственное значение DouЫe XlDisplayUnit DouЫe DisplayUnit- Label Boolean Boolean Boolean Boolean DouЫe DouЫe Gridlines XlTickMark DouЫe Boolean Устанавливает/возвращает значение, в котором другие оси пересекают текущую ось. Используется, когда свойство Crosses установлено в значение xlAxisCrossessCustom Устанавливает/возвращает тип единиц измерения, ото­ бражаемых для осей (например, xlThousands) Устанавливает/возвращает значение отображаемых еди­ ниц, если свойство Displayuni t установлено в значе­ ние xlCustom Только чтение. Возвращает объект, позволяющий управ­ лять метками единиц измерения оси Устанавливает/возвращает необходимость отображения метки единицы измерения, созданной с помощью свой­ ства DisplayUni t или свойства DisplayUni tCustem Устанавливает/возвращает необходимость отображения основных ЛИНИЙ на оси Устанавливает/возвращает необходимость отображения до п олнительных линий на оси Устанавливает/возвращает необходимость отображения заголовка оси Только чтение . Возвращает высоту оси Только чтение. Возвращает положение оси относительно левого края диаграммы Только чтение. Возвращает объект, позволяющий управ­ лять форматированием основных линий Устанавливает/возвращает внешний вид основных меток (например, внутри оси, за пределами оси) Устанавливает/возвращает значение основной единицы измерения Устанавливает/возвращает необходимость автоматиче· екай установки значения свойства Maj orUni t
Имя Тип возвращае- мого значения MajorUnit- XlTimeUnit Scale MaximumScale DouЫe Maximum- Boolean ScaleisAuto MinimumScale DouЫe Minimum - Boolean ScaleisAuto Minor - Gridlines Gridlines MinorTick- XlTickMark Mark MinorUnit DouЫe Minorunit- Boolean IsAuto MinorUnit- XlTimeUnit Scale Reverse - Boolean PlotOrder ScaleType XlScaleType TickLabel- XlTickLabel- Position Position TickLabels T_ickLabels TickLabel- Long Spacing TickMark- Long Spacing Тор DouЫe Туре XlAxisType Width DouЫe -- --- Методы объекта Axis Объектная модель Excel 2003 699 Описание Устанавливает/возвращает тип основной единицы изме­ рения Устанавливает/возвращает максимальное значение на оси Устанавливает/возвращает необходимость автомати ч е­ ского определения максимального значения на оси Устанавливает/возвращает минимальное значение на оси Устанавливает/возвращает необходимость автоматиче­ ского определения минимального значения на оси Только чтение. Возвращает объект, позволяющий управ­ лять форматированием дополнительных направляющих Устанавливает/возвращает внешний вид дополнительных меток (например, внутри оси, за пределами оси) Устанавливает/возвращает значение дополнительной единицы измерения Устанавливает/возвращает необходимость автоматиче­ ского определения значения свойства мinoruni t ' Устанавливает/возвращает масштаб для дополнитель­ ных единиц измерения . Устанавливает/возвращает необходимость обратного от- счета значений на оси Устанавливает/возвращает тип масштабирования для единиц измерения: линейное или логарифмическое Устанавливает/возвращает положение меток относи­ тельно оси (например, выше, ниже) Только чтение. Возвращает объект, позволяющий управ­ лять свойствами меток на оси Устанавливает/возвращает частоту отображения меток Устанавливает/возвращает частоту отображения меток на оси. Использование вместе с осью значений является ошибкой Только чтение. Возвращает положение верхнего края оси относительно верхнего края диаграммы Устанавливает/возвращает тип оси (xlca tegory, xlSeriesAxis или xlValue) Только чтение. Возвращает ширину оси Имя Тип возвращае- Параметры Описание мого значения Delete Variant Select Variant Удаляет ось из коллекции Axes Выделят ось на диаграмме
700 Приложение А Пример: объект Axis и коллекция Axes В этом примере устанавливаются метки для оси Х (вне зависимости от лежащих в ос­ нове диаграммы данных) и применяется соответствующее форматирование. J$ut?~~;= p·or;~a -tXAXiS Т ) ., "'··-· ,.щ~р··~ -· · "' · · :,,; , Dirn oCht As Chart! oAxis As Axis ;;' •· >; Получить первую встроенную диаграмму на л11сте ·· Set oCht = ActiveSheet . ChartObj ects ( 1) . Chart ' %. ·, Полу,..ить ось Х этой диаграмм~,~ ' ;:' Set . oAxis = oCht. лх_еs (xlCategory) ;, · ' .В~rп9лнить ф9рматир9вание 9СИ Х With ЬAxis : ''. categqryNames .=· Аrга.у (. " Item 1", · . TickLabels. Orientation: =' 45 . AxisBet.weenCatego'ries = True - . ReversePlotOrder ' = Fals$ . . . MinorTickMark = xlTickMark:N:one · . .Мajor',ГickMark ·= xlTickM.arkcross ( End With .. . ,; cl?:ri.9' "S,ч]? ..:: ,, •., Объект AxisTitle В объекте AxisTitle хранится форматирование и текст заголовков каждой оси диа­ граммы. Родительским для oбъeктaAxisTitle является объект Axis. Объект AxisTitle используется совместно со свойством HasTitle родительского объекта Axis. Для суще­ ствования дочернего объекта AxisTitle свойство HasTit~e должно быть установлено в значение · тruе. Общие свойства объекта AxisTitle Определения свойств Application, Creator и· Parent приводились в начале при­ ложения . Свойства объекта AxisTitle Имя AutoScale - Font Border Caption Characters Fill Font Тип возвращае- Описание мого значения Variant Border String Characters Cha'rtFill- Format Font Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта в случае изменения размера родительской диаграммы Только чтение. Возвращает свойства границы вокруг заго­ ловка выделенной оси Устанавливает/возвращает текст заголовка оси Только чтение. Параметры: [ Start J, [Length]. Возвра­ щает объект, содержащий все символы заголовка оси. Объект поддерживает управление отдельными символами Только чтение. Возвращает объект, содержащий парамет­ ры форматирования фона в заголовке оси диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры шрифта заголовка оси диаграммы
Объектная модель Excel 2003 701 Имя Тип возвращае- Описан-Йе мого значения Horizontal- Variant Alignment Interior Interior Left DouЫe Name String Orientation Variant ReadingOrder Long Shadow Text Тор Vertical- Alignment Boolean String DouЫe Variant Методы объекта AxisTitle Устан;;~вливает/возвращает параметры горизонтального выравнивания заголовка оси диаграммы. В качестве зна­ чений свойства используются константы xlAlign Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области в области тек­ ста заголовка оси диаграммы (например, цвет внутренней области) Устанавливает/возвращает расстояние от левого края об­ ласти текста заголовка оси до левого края диаграммы Только чтение . Возвращает имя объекта заголовка оси Устанавливает/возвращает угол текста для заголовка оси. Значение измеряется в градусах (от -90 до 90) или может быть равно одной из констант xlOrientation Устанавливает/возвращает направление текста (слева направо или справа налево) . Имеет смысл только в соот­ ветствующих языках Устанавливает/возвращает необходимость отображения заголовка оси с эффектом тени Устанавливает/возвращает текст заголовка оси Устанавливает/возвращает расстояние от верхнего края текстовой области заголовка оси до верхнего края диа­ граммы Уст~навливает/возвращает состояние горизонтального выравнивания заголовка оси. В качестве значений этого свойства исп.ользуются константы xlVAlign Имя Тип возвращае- Параметры Описание мого значения Delete Variant Удаляет заголовок оси Select Variant Выделяет заголовок оси на диаграмме Пример: объект AxisТitfe В этом примере к оси Х добавляется заголовок. Кроме этого, в заголовок добавляется ' ' текст и форматирование .
702 Приложение А ·~'"".caP"t.l:'on = · •1 З а г6Л6 вок ос Их" " . .Font.Bold = Tiue 1\ En.d W1th [i;;r.id .,e~q,-·-~-- Объект Border и коллекция Borders Коллекция Borders содержит свойства четырех границ родительского объекта. Роди­ тельскими объектами коллекции Borders являются объект Range и объект Style. Коллек­ ция Borders всегда содержит четыре границы. Для доступа к одному из объектов Border внугри коллекции Borders можно воспользоваться константами xlBorders Index, которые выступают в качестве значений свойства Item коллекц~ Borders. Каждый объект Border соответствует границе или границам вокруг родительского объекта . Некоторые объекты поддерживают доступ ко всем четырем границам, как еди­ ному целому (например , независимый доступ к левой границе не поддерживается). Сле­ дующие объекты могут выступать в качестве родительских для объекта Border (не кoл­ лeкции. Borders): Axis, AxisTi t le, ChartArea, ChartObject, ChartTitle, Data- Label, DataTaЬle, DisplayUnitLabel, Downbars, DropLines, ErrorBars, Floor, GridLines,HiLoLines, LeaderLines , Legend, LegendKey, OleObject, PlotArea, Point, Series, SeriesLines, TrendLine , UpBars и Walls. Данные коллекции также могут выступать в качестве родительских для объекта Border: DataLabels, ChartOb- j ects и OleObj ects. Коллекция Borders предоставляет несколько свойств кроме обычных атрибутов коллекции. Эти свойства перечислены в следующей таблице. Свойства коллекции Borders Имя Тип возвращае- мого значения Color Variant Colorlndex Variant Count Long LineStyle Variant Value Variant r Weight Variant Описание Устанавливает/возвращает цвет для всех четырех границ внутри коллекцйи. Для выбора цвета используется функ­ ция RGB Устанавливает/возвращает цвет для всех четырех границ внутри коллекции. Для выбора цвета используется поряд­ ковый номер цвета в текущей цветовой палитре Только чтение. Возвращает количество объектов Border в коллекции . Всегда в.озвращает значение 4 Устанавливает/возвращает стиль линии, которая исполь­ зуется для отображения границы (например, xlDash). Для установки стиля линии применяются , константы xlLineStyle Устанавливает/возвращает стиль линии, которая исполь­ зуется для отображения границы (например, xlDash). Для установки стиля линии применяются константы xlLineStyle. Совпадает со ·свойством LineStyle · Устанавливает/возвращает толщину границ, входящих в коллекцию (например, xlThin, xlThick). Для установки значения используются константы xlBorderWeight
Объектная модель Excel 2003 703 Общие свойства объекта Border Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Border Имя Тип возвращае- Описание мого значения Color Variant Устанавливает/возвращает цвет границы. Для выбора цвета используется функция RGB Colorindex Variant LineStyle Variant Weight Variant Устанавливает/возвращает цвет границы. Для выбора цвета используется порядковый номер цвета в текущей цветовой палитре Устанавливает/возвращает стиль линии, которая использует- ' ся для отображения границы (например, xlDash). Для уста­ новки стиля Линии применяются константы xlLinestyle Устанавливает/возвращает толщину границ, входящих в коллекцию (например , xlThin, xl Thick). Для установки значения используются константы xlBorderWeight Пример: объект Border и коллекция B.orders Настройка трехмерного эффекта для диапазона: rsuБ7тestFormat:З-D''(j -~··,.,. · : - · ·;--·~, : ! ;"<· \ отф_орматироlэать ' выделе'нный диапазон, ' придав утоплен~rй ;. -. ,· FofrnatЗD' selection" • · . · .:: , • IE.,ds·Ь -,. . ~. _, , , ~'х;.> u , , ' "•' ,.; . ~SUb· Fo:r;rnat-ЗD (oRange AS Range' : optior;al bSunken AS Booleap., \'. - ' ' . Иqпо;Ль зование д!.fапазdна . .' . , {';$ Wi.tb oRange .\. · . · ·· · . · · . ' ~ О'круЖИть 'диапазон. белой граниμей ' . BorderAround Weight: =xlMediuщ, color: '=RGB( 255~. 255' " Диапазон ·. утоплен, поэтому щщую и верхнюю . .. ; ·. • · сделать темно-серь~ми · . , .. . . цori:ler~(xlEdgelieft).Colo:r =. RGB(9q, 96, . 96) •. . Б'orP.ers(xlEdgeTop) .Color = 'RGB(96.; 96, 9.6) . Els~: :ЦИапазоk. вЫстуriает~• . rюэ~ому .тем~9-9ерым . ~ пра'вая ' и ниЖнЯя границы , . Borde.rs (xlEdgeRigдt) .Color = · • Bqrders (~lEdgeвoЬtorn) . Color RGB ( 96, , ,., . ,". Бnd IJ . . . . . !·"''E:nd·With · ('' ' ' ,;.§,Ц§.,.8~ Коллекция CalculatedFields Дополнительная информация приводится в разделах "Объект PivotField", "Коллекция PivotFields" и "Коллекция CalculatedFields".
704 Приложение А Коллекция Calculatedltems Дополнительная информация приводится !3 разделах "Объект PivotField", "Коллекция PivotFields" и "Коллекция CalculatedFields". Объект CalculatedMember и коллекция CalculatedMembers Коллекция CalculatedМemЬers содержит все объекты CalculatedМemЬer из ука­ занной сводной таблицы. Каждый объект CalculatedМemЬer соответствует вычисли­ мому полю или вычислимому элеме нту. Общи~ свойства коллекции CalculatedMembers Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства коллекции CalculatedMembers Имя Тип возвращаемого Описание значения Count Long Возвращает количество объектов в коллекции Item CalculatedМember Параметр : Index As Var i ant. Возвращает единственный объект CalculatedMemЬer из коллекции CalculatedMem- bers Общие свойства объекта CalculatedMember Определения свойств Applicat i on, Creator и Parent приводились в начале при­ ложения . Свойства объекта CalculatedMember Имя Тип возвращае- Описание мого значения Formula String Возвращает формулу объекта CalculatedМemЬer в формате многомерного выраже н и я (МОХ) IsVa l id Boolean Указывает на успешное создание экземпляра указанного объекта CalculatedMember с помощью поставщика OLAP в течение текущего сеанса. Свойство возвращает значение True, даже если сводная табл и ца не подключе­ на к источнику данных Name String Устанавливает/возвращает имя объекта Solveorder Long Возвращает значение аргумента многомерного выражения объекта Calcula tedМemЬ er (по умолчанию свойство возвраЩает значение О) SourceName String Возвращает имя объекта, полученное из исходных данных для указанного отчета сводной таблицы Туре XlCalculated- Возвращает тип объекта CalculatedМemЬer MemЬerType
Объектная модель Excel 2003 705 Методы объекта CalculatedMember Имя Тип возвращаемого значения Параметры Описание Delete Удаляет выделенный объект Пример: коллекция Ca/cu/atedMembers и объект CalculatedMember Данная подпрограмма возвращает информацию о каждом об~екте CalculateMemЬer из источника данных, который используется для создания · сводной таблицы на листе wksPi votTaЬle . Подпрограмма выдает сообщение в том случае, если источник данных не является одним из типов OIAP или в сводной таблице отсутствуют oбъeктыCalculated­ MemЬer. r su:ь\ Mt:U:iricaICi.й~teHмemьei:s· ( D.im :_lI con As L,ang' lCount Dim рtТаЫе As , Piv9tтaЫe D.iin oCalc;MernЬer As CalculatedМeroЬer Pi.i:n oCalcMeroЬers . ·As . Cal .cu1at.edMeroЬers Рiщ i>+rifo A.s striцg · · ' iУс.тановить' t:cьi.Jiкy на своднуЮ т.аблицу Set: . ptTabl~ >= wksPivotTab_ie.PiyotTable on .Error Resume Next ·· · ' · · Set oCalcMernЬers Eircr ·GoTo О ··~·. Возвращается JJИ ссьmка на ВЬIЧИСJiЙмые'• Эле/.4' · :tf •Not ; oCalcMemЬers Is Not.Ji .3 .ng' :Гhen :·· · ' Еслй в пределах сводной таблицьi ·~):{И~ вычислимый э31емент~:: . ". oCalcMemЬers ..Count > · О Then -:•• ; ИНициализироватЬ . С::четчик ' . и · переменные сообЩен~й · ·· 1count = 1 l .Icon ,,; yЫnformation ' .Коллекция ' Это НЕ;! , ис'точнИк даннь!х . о Цdon ·~ v):>Critic'al . . . .. " ·. . i $:tnfo = "Невозможно '< ..>i . . . принадлежит · тИпу OLAP. ;, 1.~''-,.: ~i;iq_,тe ..~ " .. ''·"'·
706 Приложение А Объект CalloutFormat f Объект CalloutForrnat соответствует линиям выноски на геометрических формах . Родительским для oбъeктaCalloutForrnat является объект Shape. · Общие свойства объекта CalloutFormat Определения свойств Application, Creator и .Parent приводились в начале при­ ложения. Свойства объекта CalloutFormat Имя Тип возвращае- Описание маго значения Accent MsoTriState Angle MsoCallout- AngleType AutoAttach MsoTriState AutoLength MsoTriState Border MsoTriState Drop Single DropType MsoCallout- DropType Gap Single Length Single Устанавливает/возвращает необходимость использования вертикальной акцентированной полосы для отделения по­ ля выноски от линии Устанавливает/возвращает угол линии выноски относи­ тельно поля выноски Устанавливает/возвращает необходимость автоматиче­ ского изменения соединения линии выноски к полю вы­ носки в зависимости от направления линии (слева или справа от поля выноски) ' Только чтение. Возвращает возможность автоматического изменения размера линии выноски при перемещении со­ ставного поля выноски Устанавливает/возвращает наличие границы вокруг поля выноски Только чтение. Возвращает расстояние от поля выноски до точки, на которую указывает линия выноски Только чтение. Возвращает точку на поле выноски, к кото­ рой присоединяется линия выноски Устанавливает/возвращает расстояние между концом ли­ нии выноски и полем выноски Только чтение. Возвращает длину первой части линии выноски. Свойство AutoLength должно быть установле- но в значение False Туре MsoCalloutType Устанавливает/возвращает тип линии, которая использу- ется для выноски Пример: объект Cal/outFormat В этом примере устанавливается форматирование выносок на листе: F-SUb1~'FOrma~tA·i-i CaIIOUt's. ()~~ ". ~·~ ~. ~ ~-~~· t; .. Diin oShp AS Shape . . , ~· i;,: D.im oCF As CalloutFormat ,· ·, . . .·· ' . Ь;;._:,:._ • . ll§!P.e <:?pa.~.9." !ЗS-.~ .J;1 е,ом.~:t'Р.~::О<: ~!<ие, . Фv;r г~м.•Jra_1дt:r ~';r'~e,-
F'oг·;щ~~~·:: ~~~~=;~?c:I~es4e.~f :·~~a.p_es ·· 1: f' ;oShp ;' 'l'ype = rnsoCaЦout Then , , _ . ·"'· ' · да . }- вКдючить автомат11ческое oShp.TextF'raщe-.AutoSize = . True :,.>,:~' ·! , -i~ ' ;: -- . . i ·, ' Полууи'ть объект · ca,iloutFormat· Set oCF ,= oshp.Callout; . . . . ,> .'. " Объект CellFormat Объектная модель Excel 2003 707 Этот объект одновременно представляет cвoйcтвaFindFormat и ReplaceFormat объек­ та Appl i cation, которые используются методами Find и Replace (соответственно) объек­ таRаngе . Для поиска формата ячеек внутри диапазона с помощью метода F ind сначала необхо­ димо установить значение свойства FindFormat. Для замены форматирования ячеек внутри диапазона с помощью метода Replace сначала следует установить значение свойства ReplaceFormat. Любые значения, присвоfнные аргументам What или Re- placement, будут комбинироваться с помощью операции And. Например, при поиске слова "wгох" и установке свойства FindFcirmat для поиска полужирного шрифта будут найдены только те ячейки, в которых присутствует полужирный текст "w1·ox" . При поиске форматирования необходимо убедиться в том, что параметр Search- Format метода Find установлен в значение True. При замене форматирования в значе­ ние True должен быть установлен параметр ReplaceFormat метода Replace. Если необходимо найти только форматирование, параметр What метода Find не должен иметь значения. Если нужно заменить только форматирование, параметр Re- place метода Replace также не должен иметь значения. При замене одного форматирования другим необходимо явно указать форматирова­ ние, которое будет заменяться HOB:\>IM. Наприме р, если при поиске ячеек, содержащих полужирное выделение и выделение красным цветом, форматирование необходимо за­ менить на выделение синим цветом (без полужирного выделения), компонент полужир­ ного выделения в свойстве ReplaceFormat необходимо явно установить в значение False. В противном случае будет получено выделение синим цветом и полужирным шрифтом. При поиске или замене различных параметров форматирования (или вообще без применения параметров форматирования) воспользуйтесь методом Clear объекта ' CellFormat (если была объявлена соответствующая переменная) или методом Clear свойств FindFormat и ReplaceFormat. Установка параметров SearchFormat и Re- placeFormat методов Find и Replace в значение False не приведет к отказу от ис­ пользования параметров свойств FindFormat и Replac e Format.
708 Приложение А Общие свойства объекта CellFormat Определения свойств Application, Creator и Parent приводились в начале при· ложения. Свойства объекта CellFormat Имя Тип возвращае- мого значения Addindent Variant Borders Borders Font Font Formula- Variant Hidden Horizontal- Variant Alignment IndentLevel Variant Interior Interior Locked Variant MergeCells Variant NumЬerFormat Variant NumЬer­ Forma tLocal Variant Orientation Variant ShrinkToFit Variant Описание Показывает, выполняется ли автоматическое смещение текста при установке выравнивания текста в равномерное распределение по веJ?тикали или горизонтали Устанавливает/возвращает критерий по иска в зависимо­ сти от формата границ ячейки Устанавливает/возвращает критерий поиска в зависимо­ сти от форматирования шрифта внутри ячейки Возвращает необходимость сокрытия формулы при защи­ те листа . Возвращает значение Null, если в указанном диапазоне одновременно содержатся ячейки со скрытыми и без скрытых формул Устанавливает/возвращает горизонтальное выравнивание указанного объекта Устанавливает/возвращает уровень смещения для ячейки или диапазона Устанавливает/возвращает критерий поиска в зависимо­ сти от формата внутренней области ячейки Устанавливает/возвращает возможность модификации ячеек внутри диапазона при защите листа. Возвращает значение Null, если блокируется только часть ячеек диа­ пазона Возвращает значение тrue, если диапазон или стиль со ­ держат ячейки, полученные путем слияния других ячеек Устанавливает/возвращает формат чисел, связанный ячейками внутри диапазона. Возвращает значение Nul l, если ячейки имеют разный формат чисел Устанавливает/возвращает формат чисел, связанный с ячейками внутри диапазона . Формат возвращается на языке пользовательского интерфейса. Возвращает значе­ ние Null, если ячейки имеют разный формат чисел Устанавливает/возвращает ориентацию текста для ячеек. Для установки свойства могут использоваться значения в пределах от -90 до 90 или константы XlOrientation Устанавливает/возвращает необходимость автоматиче­ ского изменения размера текста внутри ячейки в соответ­ ствии с изменившимися размерами столбца. Возвращает значение Null, если строки диапазона имеют различные значения свойства ShrinkToFit
Объектная модель Excel 2003 709 Имя Тип возвращае- Описание мого значения Vertical- Alignrnent WrapText Variant Variant Методы объекта CellFormat Устанавливает/возвраl.цает вертикальное выравнивание ячеек диапазона . длЯ установки свойства можно восполь­ зоваться константами XLVAlign Устанавливает/возвращает перенос текста внутри ячейки . Возвращает значение Null, если ячейки внутри диапазо­ на используют различные параметры переноса текста Имя Тип возвращае- Параметры Описание мого значения Clear Пример: объект Cel/Format Удаляет критерии, установленные в свойствах FindFormat и ReplaceFormat Следуiощая подпрограмма выполняет поиск в используемом диапазоне на листе. При этом все ячейки, содержащие шрифт Tahoma и светло-синий фон, заменяются на ячейки со' шрифтом A.l'ial и светло-зеленым фоном. §up ' R:ёi:?1aceFor:mats- ,) ·".:: ~ __,." ••· , ··~:+,, ~~ ~ ~· :h'~ • УстаноiзитЬ критерий п'оИс!{а With oCellFindFormat"'< ·· · " . Clear· · .Font.Narn'e' = , "Tahoma'" °. · ,,_. •·, ., . Interior. ColorI,ndex· = End 'with· ' ' . ' ).§nd';_Sub, , _,, . , .
710 Приложение А Объект Characters Объект Characters обеспечивает доступ к отдельным символам в текстовой строке. Символы обладают рядом визуальных свойств , модифицируемых с помощью этого объ­ екта. В качестве родительских объектов для объекта Characters могут выступать Ax- isTitle, ChartTitle, DataLabel и Range. Каждый из родительских объектов пре­ доставляет свойство Characters ( [Start], [Length]) для доступа к соответствующе­ му фрагменту текста. Параметр Start указывает на начальный символ, а параметр Lenght описывает количество символов. Общие свойства объекта Characters Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта Characters Имя Caption Count Font Phonetic- Characters Text Тип возвращае- мЬго значения String Long Font String String Описание Устанавливает/возвращает полную строку, которая содер­ жится внутри объекта Characters Только чтение. Возвращает количество символов, храня ­ щихся в объекте Только чтение . Возвращает объект, подцерживающий управление шрифтом символов Устанавливает/возвращает фонетические символы, храня­ щиеся в объекте Characters Устанавливает/возвращает полную строку, содержащуюся в объекте Characters Методы объекта Characters · Имя Тип возвращае- Параметры Описание Delete Insert мого значения Variant Variant Пример: объект Characters String As String Удаляет символы из коллекции Заменяет символы в коллекции на указан­ ную строку В этом примере для всех заглавных букв в активной ячейке устанавливается полужир­ ный шрифт красного цвета размером 16 пунктов. ~sU:Ь TFormaT9ё1Tcap'i~aisYJ "' t'• ':D.:i,пi ::;Text As Stririg м · , ~·" D±rn oChars As ,Characters t<', ' Dirn i AS Integer , · . ~"· · ~· Подучить : текст •с. из активной ~. , ,sтext ::;; , лctivece1l' , ·Text · · ~·. '•: Перебрать .' симв6ль! текст~ [., For<i ' = 1 То Len(sText}' i)i,. · · ' 'явля'етс;я Ли 'е:Им~ол .за:~:'Лавншi? · !'. , Tf 'Asc(Mid(sText·' , i,. 1).) :> 64·:... . '." , ьс:"';'"'"'"i.• "".,10: Ьnс1 , :Л.~q .(f1Jc1JS:t~){t: . •. ;\, , .. ±)J..:&.21:~: 'i'l:i5!n ,~.
Объектная модель Excel 2003 711 Объект Chart и коллекция Charts В коллекции Charts хранятся все листы диаграмм в пределах книги . Для этой кол­ лекции в качестве родите_льского всегда выступает объект Workbook. В коллекции Charts хранятся только листы диаграмм . Отдельные диаграммы могут быть встроены в листы электронных таблиц и диалоговые листы. Для доступа к объекту Chart в пределах коллекции Charts можно воспользоваться свойством Item. В качестве параметра свой­ ства I tem указывается имя диаграммы или порядковый номер, описывающий положе ­ ние диаграммы в книге (слева направо) . Объект Chart обеспечивает доступ ко всем атрибутам конкретной диаграммы в Excel. Это касается форматирования диаграммы, типа диаграммы и других ее свойств . Кроме этого, объект Chart предоставляет события, используемые для программного управле­ ния диаграммами. Коллекция Charts предоставляет несколько свойств и методов, нехарактерных для остальных коллекций. Эти свойства и методы перечислены в следующей таблице. Свойства и методы коллекции Charts Имя Тип возвращае- Описание маго. значения Count Long HPageBreaks HPageBreaks VPageBreaks VPageBreaks Visib;I.e Variant Add Chart Только чтение. Возвращает количество диаграмм в кол­ лекции Только чтение. Возвращает коллекцию, содержащую все горизонтальные разрывы страницы, связанные с коллек- щ1ей Charts · Только чтение. Возвращает коллекцию, содержащую все вертикальные разрывы страниц, связанные с коллекцией Charts Устанавливает/возвращает необходимость отображения диаграмм, входящих в коллекцию Метод. Параметры: [Before], [After], [СоuntJ.До­ бавляет диаграмму в коллекцию . Точку назначения диа­ граммы можно определить, указав объект листа, который находится перед новым объектом диаграммы (параметр Before) или после нового объекта диаграммы (параметр After). Параметр Count определяет количество созда­ ваемых диаграмм
712 ПриложениеА Имя Тип возвращае- Описание мого значения Сору Delete Move PrintOut PrintPreview Select Метод. Параметры: [Before], [After]. Добавляет ко­ пию активной диаграммы в точку, определенную с помо­ щью параметров Before и After Метод. Удаляет все диаграммы в коллекции Метод. Параметры: [BeforeJ, [After]. Перемещает те­ кущую диаграмму в точку, определенную с помощью па­ раметров Метод. Параметры: [From], [То], [CopiesJ, [ Preview], [ActivePrinter], [ PrintToFile], [Collate J , [PrToFileNameJ. Печатает диаграммы из коллекции. Принтер, количество копий, порядок и необхо­ димость предварительного просмотра определяются па­ раметрами метода . Кроме этого, печать листов может быть перенаправлена в файл. Для этого можно восполь­ зоваться параметрами PrintToFile и PrToFileName. Параметры From и то определяют диапазон печатаемых страниц Метод. Параметры: [ ЕnаЫ eChanges J . Выводит текущую диаграмму из коллекции в режиме предварительного про­ смотра . Для отключения кнопок Поля (Margins) и Параметры (Setup) нужно установить параметр EnaЫe ­ Changes в значение False. При этом пользователь не сможет менять параметры страницы на этапе предвари­ тельного просмотра Метод . Параметры: [ReplaceJ. Выделяет текущую диа­ грамму в коллекции Общие свойства объекта Chart Определения свойств Application, Creator и Parent приводились в начале при­ ложения. :Свойства объекта Chart Имя Тип возвращае- Описание мого значения AreaЗDGroup ChartGroup AutoScaling Bool e an BarЗDGroup ChartGroup Только чтение. Возвращает объе.кт chartGroup, содер­ жащий группу диаграммы с областями для трехмерной диаграммы Устанавливает/возвращает необходимость изменения размера трехмерной диаграммы в соответствии с разме ­ рами двумерного эквивалента . При этом свойство Right - AngleAxes должно быть ус1ановлено в значение True Только чтение. Возвращает объект ChartGr oup, содер­ жащий группу гистограммы для трехмерной диаграммы
Объектная модель Excel 2003 713 Имя Тип возвращае- Описание мого значения BarShape XlBarShape ChartArea ChartArea ChartTitle ChartTitle ChartType XlChartType CodeNa me String ColumnЗD - ChartGroup Group Corners Corners Data T aЬle DataTaЬle Depth- Long Percent Display- XlDisplay- BlanksAs BlanksAs El evation Long Floor · Floor GapDepth Long HasAxis Variant HasDataTaЬle Boolean Устанавливает/возвращает базовую геометрическую форму, которая используется в трехмерной или двумер­ ной гистограмме (например, параллелепипед, цилиндр, пирамида и т.д. ) Только чтение. Возвращает фрагмент диаграммы, содер­ жащи й оси, заголовки, легенды и свойства форматирова­ ния Только чтение. Возвращает объект, поддерживающий управление свойствами заголовка диаграммы . Использу­ ется совместно со свойством HasTi tle Устанавливает/возвращает тип диаграммы . Это свойство определяет действительносfь других свойств диаграммы. Например, если свойство ChartType установлено в зна­ чение xlЗDbarClustered, то свойство BarЗ DGroup мо­ жет и спользоваться для получения доступа к свойствам группы диаграммы Только чтение. Возвращает программное имя диаграммы, определяемое на этапе проектирования в редакторе VBA Только чтение. Возвращает объект ChartGroup, содер­ жащий группу гистограммы для трехмерной диаграммы Только чтение . Возвращает объект, содержащий все углы тре хме рной диаграммы Только чтение . Возвращает объект, поддержи вающий управление таблицей данных диаграммы Устанавливает/возвращает степень зависимости (в про ­ центах) глубины трехмерной диаграммы (оси у) от ширины трехмерной диаграммы (оси х) Устанавливает/возвращает способ обработк и пустых яче­ ек пр и построении диагра·ммы (например , xlNot Plotted, xlZero или xlinterpolated) Устанавливает/возвращает угол (в градуса х), п од которым пользователь видит трехмерную диаграмму. Допустимое значение угла зависит от типа трехмерной диаграммы Только чтение. Возвращает объект Gпараметрами фор­ матирования базового уровня трехмерной диаграммы Устанавливает/возвращает зависимость (в процентах) глубины рядов данны х от ширины маркеров Параметры : [ Indexl J, [ Index2 J . Устанавлива­ ет/возвращает необходимость создания оси для диаграм­ мы . Параметры могут использоваться для определения ти­ па оси (с помощью констант x l AxisType в качестве значе­ ния первого параметра) и группы оси (с помощью констант xlAxisGroup в качестве значения второго параметра) Устанавливает/возвращает наличие таблицы данных (если таблица данны х связана, она отображается) . Ис­ пользуется совместно со СВОЙСТВОМ DataTaЬle
714 ПриложенИеА Имя HasLegend HasPivot- Fields HasTitle Height- Percent Hyperlinks Index Legend LineЗDGroup MailEnvelope Name Next PageSetup Perspective PieЗDGroup PivotLayout PlotArea PlotBy Тип возвращае- Описание маго значения Boolean Boolean Boolean Long Hyperlinks Long Legend ChartGroup MsoEnvelope· String Object PageSetup Long ChartGroup PivotLayout PlotArea XlRowCol Устанавливает/возвращает необходимость отображения легенды на диаграмме. Используется совместно со свой­ ством Legend Устанавливает/возвращает необходимость отображения элементов управления сводной диаграммы. Свойство мо­ жет устанавливаться в значение True только при исполь­ зовании отчета сводной диаграммы Устанавливает/возвращает необходимость отображения заголовка диаграммы. 'Применяется совместно со свойст­ вом ChartTi tle Устанавливает/возвращает зависимость (в процентах) высоты трехмерной диаграммы (ось z) от ширины (ось х) Только чтение . Возвращает коллекцию гиперссылок, свя­ занных с диаграммой Только чтение. Возвращает расположение диаграммы в родительской коллекции Только чтение. Возвращает свойства форматирования для легенды. Используется совместно со свойством HasLegend Только чтение . Возвращает объект ChartGroup, содер­ жащий группу диаграммы графика для трехмерной диа­ граммы Устанавливает/возвращает заголовок электронной почты для документа Устанавливает/возвращает имя диаграммы Только чтение. Возвращает следующий лист в книге (слева направо) в виде объекта Только чтение. Возвращает объект, поддерживающий управление параметрами страницы для диаграммы Устанавливает угол перспективы, под которым отобража­ ется трехмерная диаграмма, если свойство RightAngle- Axes установлено в значение False Только чтение. Возвращает объект ChartGroup, содержа­ щий группу круговой диаграммы для трехмерной диаграммы Только чтение. Возвращает объект, поддерживающий управ­ ление расположением полей отчета сводной диаграммы Только чтение. Возвращает объект, поддерживающий управление форматированием, направляющими, марке­ рами данных и другими визуальными элементами облас­ ти, в которой выполняется построение диаграммы. Эта область находится внутри области диаграммы Устанавливает/возвращает необходимость использования в качестве рядов данных столбцов оригинальных данных . (значение xlColumns) ИfИ строк оригинальных данных (значение xlRows) .
Имя PlotVisiЫe - Only Previous Protect- Contents ProtectData ProtectDraw ingObjects Protect - Formatting Protect- GoalSeek Protection- Mode Protect- Selection RightAngl e- Axes Rotation Scripts Shapes ShowWindow SizeWith- Window SurfaceGroup ТаЬ Объектная модель Excel 2003 715 Тип возвращае- Описание мого значения Boolean Boolean Boolean Boolean Boolean Boolean Boolean Boolean Variant Variant Scripts Shapes Boolean Boolean ChartGroup ТаЬ Устанавливает/возвращает необходимость построения только видимых ячеек или видимых и скрытых ячеек (значение False) Только чтение. Возвращает объект, представляющий пре­ дыдущий лист в книге (слева направо) Только чте н ие. Возвращает состояние защиты от измене­ ний диаграммы и всего содержимого диаграммы Устанавл ивает/возвращает возможность перенаправле­ ния исходных данных для диаграммы Только чтение. Возвращает возможность модификации геометрических фигур в пределах диаграммы (ProtectDrawingObjects = False) Устанавливает/возвращает возможность изменения па­ раметров форматирования диаграммы Устанавливает/возвращает возможность модификации точек на диаграмме с помощью указателя мыши Только чтение. Возвращает необходимость защиты поль­ зовательско го интерфейса. Даже если на пользователь­ ский интерфейс диаграммы установлена защита, код VBA, связанный с диаграммой, может быть модифицирован Устанавливает/возвращает возможность выделения гео­ метрических фигур в пределах диаграммы, а также воз­ можность их добавления в диаграмму Усrанавливает/возвращает необходимость фиксации осей . с использованием правильных углов для трехмерной диаграм­ мы, даже если перспективная проекция диаграммы изменится Устанавливает/возвращает угол поворота относительно оси z (в градусах), под которым пользователь видит трех­ мерную диаграмму. Допустимые значения угла зависят от типа трехмерной диаграммы Только чтение . Возвращает коллекцию кода VBScript, свя­ занного с диаграммой (обычно этот код в дальнейшем ·ис­ пользуется на WеЬ-страницах) Только чтение . Возвращает все геометрические фигуры в пределах диаграммы Устанавливает/возвращает возможность отображения встроенной диаграммы в отдельном окне, а не в виде встроенного объекта в пределах листа Устанавливает/возвращает необходимость автоматиче­ ского изменения размера листа диаграммы в соответст­ вии с размером окна Только чтение . Возвращает объект ChartGroup, содер­ жащий группу диаграммы поверхности для трехмерной диаграммы Только чтение. Возвращает объект таЬ для диаграммы или листа
716 Приложение А Имя VisiЫe Тип возвращае- Описание мого значения XlSheetvisiЬi- Устанавливает/возвращает необходимость отображения lity диаграммы. Свойство visiЫe может устанавливаться в значение xlVeryHidd en. В таком случае диаграмма окажется недоступной для конечного пользователя Wall s Walls Только чтение. Возвращает объект, позволяющий управ- Wal l sAnd- Boolean Gridlines2D Методы объекта Chart Имя Тип возвращае- мого значения Activate Apply- CustornType Apply- DataLabels AreaGroups Object Axe s Object лять гранями трехмерной диаграммы Устанавливает/возвращает необходимость двумерного отображения линий и граней трехмерной гистогрqммы, трехмерной диаграммь1 с областями и трехмерной кла­ стерной диаграммы Параметры Описание Активизирует диаграмму. После этого на диаграмму указывает свойство Ac tiveCha rt Char tType As Меняет тип диаграммы на тип, XlChartType, указанный в качестве значения [ TypeNarne J параметра ChartType. Если па- раметр ChartType равен xlUs- e r De fined , второй параметр по- зволяет указать соб ственное на- звание типа диаграммы [ Туре As XlData - Устанавливает маркеры точек для Lab elsType] , диаграммы . В параметре Туре [LegendKey], указывается необходимость ото- [AutoText], бражения метки категории, про- [HasLeaderLines] , цента от целого, значения или от- [ShowSeriesNarne] , каза от вывода метки. Возле мет- [ShowCat egoryNarn eJ, [ ShowValue ], ки может отображаться ключ ле- [ShowPe r centage ], генды . Для этого параметр [ ShowBubЬleSize ], LegendKey необходимо устано- [Separator] вить в значение T ru e [Index] Возвращает единственную группу диаграммы с областями (c hartGroup) или коллекцию групп диаграммы с областями (ChartGroups ) для двумерной диаграммы Туре , AxisGrou p Возвращает объект Ax is или As XlAxisGroup коллекцию Axes для соответст- вующей диаграммы. Тип оси и группы осей могут выбираться с помощью параметров
Объектная модель Excel 2003 717 Имя Тип возвращае- Параметры мого значения BarGroups Object ChartGroups Obj ect ChartObjects Object ChartWizard Check,- Spelling [Index] [Index] [ Index] [Source], [Gallery ], [Format ], [PlotBy], [CategoryLabels], [SeriesLabels], [HasLegend], [Title], [CategoryTitle], [ValueTitleJ, [ExtraTitle] [CUstomDictionaryJ, 1IgnoreUppercase ], [AlwaysSuggestJ, [SpellLang] Описание Возвращает единственную группу линейчатой диаграммы (chartGroup) или коллекцию групп линейчатой диаграммы (ChartGroups) для двумерной диаграммы Возвращает единственную группу диаграммы (chartGro up) или коллекцию групп диаграммы (ChartGroups) для диаграммы Возвращает единственную встро­ енную диаграмму (ChartObj ect) или коллекцию встроенных диа­ грамм (ChartObjects) в преде­ лах диаграммы Единый метод для модификации ключевых свойств диа граммы. Укажите свойства, значения кото­ рых необходимо изменить. Пара­ метр Source позволяет указать источник данных. Параметр Gal- lery позволяет указать тип диа­ граммы. Параметр Format позво­ ляет указать один из десяти встроенны х автоформатов диа­ граммы. Остальные параметры у казывают способ получения дан­ ных из источника, источник меток категорий, источник ll(leтoк рядов, необходимость отобра жения ле­ генды, а также заголовки диа­ граммы и осей. Если значение параметра Source не указано, этот метод может использовать­ ся, только если содержащий диа­ грамму лист является активным Проверяет орфографию текста на диаграмме. При этом можно ука­ зать собственный словарь (CustomDictionary). Кроме это­ го, можно игнорировать все слова в верхнем регистре (I gnoreUppercas e ). Excel можно заставить отображать список предложенных замен (AlwaysSuggest)
718 Приложение А Имя Тип возвращае- Параметры мого значения ColшnnGroups Object Сору CopyPicture CreatePub- lisher Delete Deselect Doughnut- Groups Evaluate Export Object Variant Boolean [Index] [Before], [After] [AppearanceAs XlPicture- Appearance] , [Format As XlCopyPicture- Forma t J, [Size As XlPicture- Appearance J Edition, Appear- ance As XlPic- tureAppearance, Size As XlPic- tureAppearance, [ContainsPICT], [ContainsBIFF], [ContainsRTFJ, [ContainsVALU] [Index] Name Filename As String, [FilterName], [Interactive] Описание Возвращает единственную группу гистограммы (ChartGroup) или коллекцию групп гистограммы (ChartGroups) для двумерной диаграммы Добавляет новую копию диаграм­ мы. Положение определяется па­ раметрами Before или Aft:er Копирует диаграмму в буфер об­ мена в виде изображения . Пара­ метр Appearance позволяет оп­ ределить копирование экранного представления или представле­ ния для печати . Параметр For- ma t позволяет определить тип изображения, которое копируется в буфер обмена . Параметр Size дает возможность определить размер изображения при копиро­ вании диаграммы с листа диа­ граммы Используется на компьютерах Macintosh для создания изобра­ жения диаграммы в стандартном формате. Метод является экви­ валентом метода CopyPicture на ПК Удаляет диаграмму Снимает выделение с объекта диаграммы Возвращает единственную группу кольцевой диаграммы (ChartGroup) или коллекцию групп кольцевой диаграммы (ChartGroups) для двумерной диаграммы Оценивает значение параметра Name так, как будто строка вводи­ лась в качестве выражения в ячейку листа Сохраняет диаграмму в виде изо­ бражения (в формате jpg или gi f) в файле, имя которого пере­ дается в качестве значения пара­ метра Filename
Имя GetChart- Element ' LineGroups Location Move OLEObjects Paste& PieGroups Объектная модель Excel 2003 719 Тип возвращае-. Параметры мого значения Описание Object Chart Object Object хAsLong,уAs Long, ElementID As Long, Argl As Long, Arg2 As Long [Index] Where As XlChart- Loca tion, [Name] Возвращает элемент диаграммы, расположенный по координатам х и у. Передаются только первые два параметра. Переменные должны передаваться в качестве значений последних трех пара­ метров. После вызова метода в последних трех параметрах можно ожидать возвращаемых значений. Параметр ElementID возвращает одно из значений xlChartitem. Параметры Argl и Arg2 могут содержать или не содержать данные в зависимости от типа элемента Возвращает единственную группу диаграммы графика (ChartGroup) или коллекцию групп диаграммы графика (ChartGroups) дriя двумер>ной диаграммы Перемещает диаграмму в пози­ цию, указанную в качестве значе­ ний параметров Where и Name. Параметр Where позволяет ука­ зать точку назна~ения переме­ щаемой диаграммы: лист диа- , граммы или встроенную диаграм­ му [BeforeJ, [AfterJ Перемещает диаграмму в точку, определенную в параметрах [Index] [Туре] [Index] Возвращает единственный объект OLE (OLEObj ect) или коллекцию объектов OLE (OLEObj ects) для диаграммы Вставляет данные или изображе­ ние из буфера обмена в диаграм­ му . Параметр Туре может ис­ пользоваться для выбора вставки форматов, формул или всего со­ держимого буфера обмена Возвращает единственную группу круговой диаграммы (chartGroup) или коллекцию групп круговой диаграммы (ChartGroups) для двумерной диаграммы
720 Приложение А Имя PrintOut PrintPreview Protect · Тип возвр ащае- Параметры мого значения [From}, [То}, [Copies}, [Preview], [ActivePrinter] , [PrintToFile}, [Collate}, [PrToFileName} [EnaЫeChanges] [Password}, [DrawingObjects], [Contents}, [ Scenarios J , [UserlnterfaceOnly} RadarGroups Object [Index} Refresh Описание Выводит диаграмму на печать. Принтер, количество копий, поря­ док сортировки и необходимость предварительного просмотра ука­ зываются с помощью параметров метода. Кроме этого, лист можно распечатать в файл . Для этого используются параметры PrintToFile и PrToFileName. Параметры From и то могут ис­ пользоваться для определения диапазона печатаемых страниц Выводит текущую диаграмму в режиме предварительного про­ смотра. Для отключения кнопок Поля (Margiпs) и Параметры страницы (Setup) параметр En- aЬleChanges необходимо уста­ новить в значение False. При этом пользователь не сможет из­ менить параметры страни .цы Защищает диаграмму от измене­ ний. При . этом можно указать чув­ ствительный к регистру пароль в качестве значения свойства Password. Кроме этого, метод позволяет защитить геометриче­ ские фигуры (DrawingObj ects), все содержимое диаграммы (contents) или только пользова­ тельский интерфейс (UserlnterfaceOnly) Возвращает единственную группу лепестковой диаграммы (ChartGroup) или коллекцию групп лепестковой диаграммы (ChartGroups) для двумерной диаграммы Обновляет содержимое диаграм­ мы, перечитывая источник данных
Объектная модель Excel 2003 721 Имя Тип возвращае- Параметры Описание мого значения SaveAs Filename As Сохраняет текущую ди аграмму String, в новой книге . Имя файла указы- [FileFormat ] , вается в качестве значения пара- [ Password], метра Filename. Формат файла, [WriteResPasswo rd], пароль, пароль для чтения, соз- [ ReadOn ly- дание резервных копий и другие Recommended], [CreateBackup], свойства сохраняемого файла [ AddToMru], указываются с по мощью пара- [TextCodepage ], метров метода [TextVisualLayout], ' [Local] Select [ Replace ] Выделяет дИаграмму Series- Object [Index] Возвращает единственный ряд Collection (Series) или коллекцию рядов (SeriesCollection) для диа- граммы Set- FileName As · Устанавливает фон диаграммы Background- String с использованием изображения Picture из файла, имя которого передает- ся в качестве значения параметра Fi leName SetSource - Source As Range, Устанавливает в качестве источ- Data [PlotBy ] ника данны х диаграммы диапа- зон, на который указывает пара- метр source. В качестве значе- ний парам етра PlotBy использу- ются константы XlRowCol . Этот параметр позволяет выбрать по- . строение строк или столбцов Unprotect [ Password ] Снимает защиту с диаграммы . Если диаграмма защищена пара- лем, пароль указывается в каче- стве параметра метода XYGroups Object [ Index ] Возвращает единственную группу точечной диаграммы (ChartGroup) или коллекцию групп точечной диа- граммы (ChartGroups) для дву- мерной диаграммы События объекта Chart Имя Тип возвращае- Описание мого значения Activate Before- ElementID As DouЬleClick XlChartitem, Argl As Long , Arg2 As Long, Canc-@1 As Boolean Возникает при передаче фокуса в диаграмму Возникает перед двойным щелчком на диаграмме. Элемент, на котором выполняется двойной Щелчок, передается в про­ цедуру обработки события в качестве значения параметра ElementID. Парам етры Argl и Arg2 могут содержать или не содержать значе ния в зависимости от значения параметра ElementID. Событие двойного щелчка можно отменить. Для этого параметр Cancel устанавливается в значение True
722 Приложение А Имя Тип возвращае- Описание мого значения Before- Cancel As RightClick Boolean Calculate Deactivate DragOver DragPlot MouseDown MouseMove Mou seUp Resize Sel ect Button As Xl MouseButton , Shift As Long, х As Long, у As Lo ng Button As XlMouseButton, Shift As Long, х As Long, у As Lo ng 1 Butt on As XlMouseButton, Shift As Long, хAs Long, у As Long ElementID As Xl Ch artitem, Argl As Long , Arg2 As Long SeriesChange Seriesindex As Lo ng, Poi ntindex As Long Возникает перед щелчком правой кнопкой мыши на диа­ грамме. Событие щелчка правой кнопкой мыши можно от­ менить . Для этого параметр cancel необходимо устано­ вить в значение True Возникает после отображения новых или измененных данных в диаграмме Возникает при потере фокуса диаграммой Возникает, когда в обл?сть диаграммы перетаскивается диа­ пазон ячеек. Обычно событие используется для изменения курсора мыши или вывода сообщения о текущем состоянии Возникает при перетаскивании и отпускании диапазона ячеек в области диаграммы. Обычно событие использует­ ся для модификации атрибутов диаграммы Возникает при нажатии кнопки мыши в области диаграм­ мы. Каждая нажатая кнопка мыши передается в значении параметра Butt o n . Параметр Shift содержит информа­ цию о состоянии .клавиш <Ctrl>, <Shift> и <Alt>. Через па­ раметры х и у передаются координаты указателя мыши Возникает при наведении указателя мыши на диаграмму. Каждая нажатая кнопка мыши передается в значении па­ раметра Button. hараметр Shift содержит информацию о состоянии клавиш <Ctrl>, <Shift> и <Alt>. Через парамет­ ры х и у передаются координаты указателя мыши Возникает при отпускании кнопки мыши над диаграммой. Каждая нажатая кнопка мыши передается в значении па­ раметра But ton. Параметр Shift содержит информацию о состоянии клавиш <Ctrl>, <Shift> и <Alt>. Через парамет­ ры х и у передаются координаты указателя мыши Возникает при изменении размеров диаграммы Возникает при выделении элемента диаграммы. Выде­ ленный элемент передается в процедуру обработки собы­ тия в качестве значения параметра El e mentID. Парамет­ ры Argl и Arg2 могут содержать или не содержать значе­ ния в зависимости от значения параметра ElementID Возникает при изменении значения точки на диаграмме. Параметр Se ri esin dex содержит расположение ряда в коллекции рядов диаграммы. Параметр Pointindex возвращает расположение точки в пределах ряда Пример: объект Chart и коллекция Charts В этом примере на основе таблицы, содержащей активную ячейку, создается трех­ мерная диаграмма, выполняется ее форматирование , и изображение диаграммы сохра­ няется в формате . jpg: 1 tsu~"'.'?;tea;i:1rAЬ.CiБiporicfiart о ""'.'":""~~·,,..·-~ !' , . D.1ih ·10Cht As. Chart ··· . ~ .'~~ ::С.оздать 1;1oвyIQ ( пустУIQ ) . диагр,:;мму k;;;,;....S§!:-,:..,Nogc;)1t = C]larts ,)\dd .~ ;..,.-~.. :·:,No.- ;~
Объектная модель Excel 2003 723 Объект ChartArea Этот объект предоставляет параметры форматирования, связанные с областью диа­ граммы. Для двумерных диаграмм объект содержит оси, заголовки осей и диаграмм. Для трехмерных диаграмм объект содержит заголовок и легенду диаграммы. Часть диаграммы, в которой отображаются данные (область построения), не входит в объект ChartArea. Дополнительная информация о форматировании области построения приводится в разде­ ле , посвященном объекту PlotArea. Родительским для объекта ChartArea всегда являет­ ся объект Chю:t. Общие свойства объекта ChartArea Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ChartArea Имя AutoScale- Font Border Тип возвращае- Описание мого значения Variant Border Устанавливает/возвращает необходимость изменения размера шрифта в объекте ChartArea при изменении размера в объекте Chart Только чтение. Возвращает атрибуты границ вокруг выде­ ленной области диаграммы
724 Приложение А Имя Тип возвращае- мого значения Fill ChartFill- Format Font Font Height DouЫe Interio r Interior Lef t DouЫ e Name String Shado w Boolean Тор DouЫe width DouЫe Методы объекта ChartArea Описание Только чтение . Возвращает объект, подо,ерживающий управление атрибутам и заполнения области диаграммы Тол~:;ко чтение. Предоставляет доступ к таки м свойствам Font ,какТуре иSize Устанавливает/возвращает высоту области диа граммы в пунктах Только чтение. Возвращает объект, подо,ерживающий уп р авление форматированием внутренне й части област и диаграммы (например', цветом внутренне й области) Устанавливает/возвращает расположение левого края об­ ласти диаграммы относительно диаграммы (в пунктах) · Только чтение . Возвращает имя области диаграммы Устанавливает/возвращает необходимость создания эф­ фекта тени вокруг обла сти диаграммы Устанавливает/возвращает расположение верхнего края области диаграммы относитель но диаграммы (в пунктах) Устанавливает/возвращает ширину области диаграммы в пунктах Имя Тип возвращае- Параметры Описание мого значения Cl ear Variant ClearContents Variant ClearForma ts Variant Сору Variant Select Variant Пример: объект ChartA rea Очи щает область ди а граммы Удал яет содержимое из области диа­ гра мм ы, не затрагивая форматирование Удаляет форматирован ие из области диаграммы , не затрагивая данные Ко пир ует область диагра м мы в буфер обмена Акт и визирует и выделя ет область диа ­ граммы Настр ойка форматир ования области диаграммы: !sU.tГ'Fбrmatём~t.Area < г ··- · , ., -"· -- -· ,". 1 ~ Dim оСА As Ch art,Area .. , Set ~ oCA . = Charts(l } .ChartArea , With оСА ' .. о: : в'order -..LineStyle ·= . xlContinuous i: ... "·.FiЦ, . PresetT€;!x tur e .d msoTe x tureCanv as . ~ .··t: ; Fill.VisiЫe msoTrue ~ . J;nd ·Yl~~ь, .• ,; ;: ~p.g.;;_§;j,lj:>_,""""~ . . ·~·"'-'··~"'"·"''"""'' '""'·"'""'"'""'
Объектная модель Excel 2003 725 Объект ChartColorFormat Этот объект описывает цвет для родительского объекта ChartFillFormat. Напри­ мер, объект ChartFillFormat предоставляет свойство BackColor, которое возвраща­ ет объект ChartCo l orFormat, позволяющий устанавливать цвет. Общие свойства объекта ChartColorFormat Определения свойств Application, Creator и Parent приводились в начале при ­ ложения. Свойства объекта ChartColorFormat Имя RGB Тип возвращае- Описание мого значения Long Только чтение. Возвращает значения красного , зеленого и си­ него цветов, позволяющие сформировать интересующий цвет SchemeColor Long Устанавливает/возвращает цвет для объекта ChartCol- orForma t с помощью номера индекса в соответствующей цветовой схеме Туре Long Только чтение . Возвращает тип цвета: RGB, смешанный или цвет из схемы Пример: объект ChartColorFormat В этом примере в качестве шаблона заливки диаграммы используется встроенный цвет номер 6. После этого выводятся значения красного, зеленого и синего цветов для выбранного встроенного цвета. sиь ·setc:har·tco1orF\>rmat{j - · ' Dim oCCF As ChartColorFormat .wi th Charts ( зJ. PlotArea. Fill ·что. объект ·ChartColorFor~a t для: ·· об1:,~ктiЭ. <FbreColor · .' Выбрат~:, встроенный цвет #6 oCCF.SchemeColor = ' 6 '., •, С.читать ._ значения: красного; зелен'ого и синего цветов · для цвета #6 . MsgBox' "F6recoior # '6 RGB i s: " & vbC:tLf ' ,;Красный .=" · & ((oCCF.RGB And &HFFOOOO) . / &Н10000) & vbCrLf ·"Зеhеный ,;,. " &' . ( (oCCF.RGB And &HFFOO) / &Н:190J & vbtrй & ,•. "Синий •;,, . " . & ( (oCCF . ·RGB And &HFF)) . 1 End with ~E,rj,q, §;ЦQ~=···~·~·-· ~. Объект ChartFillFormat Этот объект описьrвает форматирование заполнения, связанное с родительским объ­ ектом. Он также поддерживает управленне основным цветом, цветом фона, а также шаб­ лонами, связанными с родит.ельским объектом.
726 Приложение А Общие свойства ChartFillFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта ChartFillFormat Имя BackColor ForeColor Gradient- ColorType Gradient- Degree Gradient- Style GradientVar iant Pattern Preset- GradientТype Preset- Texture TextureName TextureType Туре VisiЫe Тип возвраЩае- мого значения ChartColor- Format ChartColor- Format MsoGradient- ColorType Single MsoGradient- Style Long MsoPattern. ,- Туре MsoPreset- GradientTyPe MsoPreset- Texture String MsoTextureType MsoFillType MsoTriState Описание Только чтение. Возвращает цвет фона в виде объекта ChartColorFormat Только чтение. Возвр_ащает основной цвет в виде объекта ChartColorFormat Только чтение. Возвращает тип используемого градиент­ ного заполнения цветом Только чтение. Возвращает степень яркости градиентной заливки Только чтение. Возвращает используемую ориентацию градиентной заливки Только чтение. Возвращает применяемый центральный градиент Только чтение. Возвращает шаблон, который использует­ ся для заполнения Только чтение. Возвращает тип применяемого градиента Только чтение. Возвращает встроенную текстуру заполнения Только чтение. Возвращает невстроенную текстуру запол­ нения Только чтение. Возвращает информаци.ю о том, является ли текстура собственной, встроенной или смеша_нной Устанавливает/возвращает прозрачность заполнения. До­ пустимые значения находятся в пределах от О (непрозрачная) до 1 (полностью прозрачная) Только чтение. Возвращает информацию о том, является ли заполнение текстурой, градиентом, сплошным цветом, фоном, изображением или смешанным заполнением Методы объекта ChartFillFormat Имя OneColor- Gradient Patterned Тип возвращае- Параметры мого значения Style As MsoGradi- entStyle, Variant As Long, Degree As Single Pattern As , MsoPat- ternType 1 Описание Устанавливает стиль, вариант и степень градиентного запол­ нения одним цветом Устанавливает шаблон запол­ нения
Объектная модель Excel 2003 727 Имя Preset- Gradient Preset- Textured Solid TwoColor- Gradient UserPicture UserTextured Тип возвращае- Параметры мого значения Style As MsoGradi- entStyle, Variant As Long, PresetGra- dientType As Mso- PresetGradientType PresetTexture As MsoPresetTexture Style As MsoGradi- entStyle, Variant As Long [PictureFile], [PictureFormat], [PictureStackUnit], [Picture Placement] TextureFile As String Пример: объект ChartFillFormat Описание Выбирает стиль, вариант и встроенный тип градиента для градиентного заполнения Устанавливает встроенную тек­ стуру для заполнения Устанавливает заполнение од­ ним цветом Устанавливает заполнение двухцветным градиентом Устанавливает заполнение с помощью изображения в формате PictureFile Устанавливает заполнение с по­ мощью собственной текстуры в формате TextureFormat Объект ChartGroup и коллекция ChartGroups В коллекции ChartGroups хранится информация о построении диаграммы, связан­ ная с родительской диаграммой. Диаграмма может содержать больше одного объекта ChartGroup. Например, одна диаграмма может быть связана одновременно с диаграм­ мой графика и линейчатой диаграммой. Свойство ChartGroups объекта Chart может использоваться для получения доступа к коллекции ChartGroups. Кроме этого, свойст­ ва PieGroups и LineGroups объекта Chart также возвращают только группы круговой диаграммы и диаграммы графика соответственно. Кроме обычных свойств коллекции, коллекция ChartGroups предоставляет свойство Count , которое возвращает количество объектов ChartGroup в пределах коллекции . Роди­ тельским для коллекции ChartGroups или объекта ChartGroup является объект Chart. Объект ChartGroup содержит все отображаемые точки диаграммы соответствующе­ го типа. Он также может содержать несколько рядов (каждый столбец или строка исход­ ных данных). Каждый ряд может содержать несколько точек (для каждой ячейки исход­ ных данных) . С объектом Chart может быть связано больше одного объекта Chart-
728 Приложение А Group. Свойства BarЗDGroup , ColшnnЗDGroup, LineЗDGroup, PieЗDgroup и Sur- faceGroup объекта Chart позволяют получить доступ к определенной группе, соответ­ ствующей типу диаграммы. Методы AreaGroups, BarGroups, ColшnnGroups, Dough- nutGroups , LineGroups, PieGroups, RadarGroups и XYGroups объекта Chart по­ зволяют получать объекты ChartGroup или коллекции ChartGroups. Общие свойства ChartGroup Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта ChartGroup Имя Трп возвращае- Описание мого значения AxisGroup XlAxisGroup BubЬleScale Long Doughnut- Long HoleSize 1 DownBars DownBars DropLines DropLines FirstSlice- Long Angle GapWidth Long HasЗDshading Boolean Устанавливает/возвращает, является ли группа диаграм­ мы основной и л и дополнительной Устанавливает/возвращает процент увеличения р~Змера точек относительно принятого по умолчанию размера . Действительные значения находятся в пределах О от 300. Это свойство может использоваться только для группы пузырьковой диаграммы Устанавливает/возвращает размер отверстия в группе круговой диаграммы. В качестве значения указывается относительный размер в процента х. Действительные зна­ чения входят в диапазон от 1О до 90 . Это свойство может ис пользовать ся только вместе с круговыми диаграммами Только чтение. Возвращает объект, позволяющий управ­ лять форматированием полос понижения на группе диа­ граммы графика. Это свойство действительно только для групп диаграммы графика. Используется совместно со свойством HasUpDo wnBars Только чтение. Возвращает объект, позволяющий управ­ лять параметра ми форматирования лин ий в группе диа­ граммы граф ика или диаграммы с областями. Свойство действительно только для групп диаграммы графика или груп п диаграммы с областями. Используется совместно со свойством HasDropLines Устанавливает/возвращает угол, который используется для первого сектора групп круговой или кольцевой диа­ граммы (первая точка данных, отображаемая на экране) Устанавливает/возвращает размер промежутка между столбцами различных последовательностей данных. Кро­ ме этого, при работе с линейчатыми/круговыми или круго­ выми/круговыми диаграммами свойство GapWidth описы­ вает расстояние между основной и дополнительной диа­ граммами (свойство ChartType родительской диаграммы должно быть равно xlPieOfPie или xlBarOf Pie) Устанавливает/возвращает необходимость применения трехмерных эффектов при отображении элементов управления группы диаграммы
Объектная модель Excel 2003 729 Имя Тип возвращае- Описание мого значения HasDropLines Boolean HasHiLoLines Boolean HasRadar- Boolean AxisLabels HasSeries- Boolean Lines HasUpDown- Boolean Bars HiLoLines HiLoLines Index Long Overlap Long RadarAxis - TickLabels Labels SecondPlot- Long Size SeriesLines SeriesLines ShowNega- Boolean tiveBubЫes Устанавливает/возвращает необходимость отображения линИй при выводе группы диаграммы. Это свойство ис­ пользуется совместно со свойством DownLines Устанавливает/возвращает необходимость отображения линий максимального и минимального уровней при по­ строении группы диаграммы. Это свойство применяется совместно со свойством HiLoLines Устанавливает/возвращает необходимость отображения меток углов на угловой диаграмме. Свойство действи­ тельно только для групп угловой диаграммы Устанавливает/возвращает необходимость отображения линий рядов для группы диаграммы . Это свойство исполь­ зуется совместно со свойством seriesLines Устанавливает/возвращает необходимость отображения полос повышения и понижения для группы диаграммы . Это свойство используется совместно со свойством DownBars и UpBars Только чтение. Возвращает объект, позволяющий управ­ лять форматированием линий максимального­ минимального уровня в диаграмме графика . Это свойство действительно только для диаграмм графика Только чтение. Возвращает положение текущего объекта ChartGroup в родительской коллекции Устанавливает/возвращает необходимость перекрытия или разделения пол ос и столбцов внутри рядов. Свойству могут присваиваться значения в диапазоне от -100 до 100, где -100 приведет к отображению промежутка между по­ лосами/столбцами, равного ширине полосы/столбца. Зна­ чение 1ООО приводит к наложению полос/диаграмм друг на друга. Это свойство действительно только для групп дву­ мерных линейчатых диаграмм и гистограмм Только чтение. Возвращает объект, позволяющий управ­ лять форматированием и метками осей угловой диаграм­ мы. Это свойство действительно только для групп угловой диаграммы Устанавливает/возвращает соотношение (в процентах) ·между размером дополнительной группы круго­ вой/круговой или линейчатой/круговой диаграммы и раз­ мером основной диаграммы Только чтение. Возвращает объект, позволяющий управ­ лять форматированием линий рядов в группе диаграммы . Линия ряда соединяет одинаковые ряды данных в группах наложенных гистограмм, наложенных линейчатых диа­ грамм, круговой/круговой или линейчатой/круговой. Это свойство используется совместно со свойством HasSeriesLines Устанавл ивает/возвращает необходимость отображения точек с отрицательными значениями. Это свойство дейст­ вительно только для групп пузырьковой диаграммы
730 Приложение А Имя Тип возвращае- Описание мого значения Size- Represents SplitType SplitValue UpBars VaryBy- Ca tegori es XlSize- Represents XlChartSplit- Type Variant UpBars Boolean Методы объекта ChartGroup Устанавливает/возвращает необходимость представления значения точки данных с помощью размера или области точки на группе пузырьковой диаграммы. Это свойство действительно только для группы пузырь ковой диаграммы Устанавливает/возвращает способ разделения двух диа­ грамм в группе круговой/круговой или линейча­ той/круговой. Например, диаграмма может делиться по процентному значен ию {xlSpli tByPercentValue) или по значению {xlSplitByValue) Устанавливает/возвращает значение, которое комбиниру­ ется с основной круговой диаграммой и рассматривается подробно в дополнительной диаграмме в группе круго­ вой/круговой или линейчатой/круговой диаграммы Возвращает объект: поддерживающий управление фор­ матированием полос п овышения в группе диаграммы графика. Это свойство действительно только для групп диаграммы графика. Свойство используется совместно со свойством HasUpDownBars Устанавливает/возвращает необходимость использования разных цветов при отображении различных категорий в одной последовательности группы диаграммы. Для ис­ пользования разных цветов диаграмма должна содержать ед и нственную последовательность данны х Имя Тип возвращае- Параметры Описание мого значения Series- Object Co llection [Index] Возвращает единственный ряд (series) или коллекцию рядов (seriesCollection) для ди аграммы Пример: объект ChartGroup и коллекция ChartGroиps Этот код устанавливает промежуток для всех групп гистограммы в пределах диаграм­ мы равным 10 % и включает окрашивание каждого гистобара в свой цвет. u!3...F'6i'mati::o1Uтns () ' "~.,~· •• Dim oCht AS Chart Dim oCG As ChartGroup '· . , ·For Ea.ch oCG In; Charts ( 1) . GolumnGroч.ps .. ~: 'oCG.GapWidth = 1о ' < •' . ,·. oCG. Varyi3:yCategori.es =, TrueA Next ' , ·· Объект ChartObject и коллекция ChartObjects Коллекция ChartObj ects содержит все встроенные в лист электронной таблицы, лист диаграммы или диалоговый лист объекты Chart. Сами листы диаграмм в этой кол­ лекции не хранятся. Они доступны в коллекции Charts. Каждый объект Chart из кол­ лекции ChartObjects доступен через объект ChartObj ect . При этом объект Ch art -
Объектная модель Excel 2003 731 Obj ect выступает в качестве оболочки для диаграммы . Свойство Chart объекта Chart- Obj ect позволяет получить доступ к диаграмме . Кроме этого, объект ChartObj ect предоставляет свойства для модификации форматирования встроенной диаграммы (например, Height и Width). Коллекция _ChartObj ects предоставляет ряд свойств, выходящих за пределы ти­ пичных атрибутов коллекции. Эти свойства перечислены ниже. Свойства и методы коллекции ChartObjects Имя Тип возвращае- мого значения Border Border Count Long EnaЫed Boolean Height DouЫe Interior Interior Left DouЫe Loeked Boolean Plaeement Variant PrintObjeet Boolean Rounded - Corners Boolean Описание , Только чтение. Возвращает свойства границ вокруг кол­ лекции объектов диаграммы Только чтение . Возвращает количество объектов Chart- Obj ее t в коллекции Устанавливает/возвращает возможность запуска пользо­ вателем макросов, связанных с каждым объектом Chart- Obj eet в коллекции Устанавливает/возвращает высоту объекта ChartObj eet, если в коллекции находится только один объект · Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области всех объектов Chart в коллекции (например, цвета внутренней области) Устанавливает/возвращает расстояние от левого края объекта ChartObj ее t до левого края родительского лис­ та. Это свойство рабоатет, когда в коллекции хранится только один объект ChartObj eet Устанавливает/возвращает необходимость блокирования объекта ChartObj eet при защите родительского листа. Это свойство работает, когда в коллекции хранится только один объект ChartObj eet Устанавливает/возвращает способ привязки объекта ChartObj eet на листе (например, свободное расположе­ ние, перемещение вместе с ячейками и т.д . ) Для установ­ ки этого свойства можно воспользоваться константами XlPlaeement. Это свойство работает, если в коллекции хранится только один объект ChartObj eet Устанавливает/возвращает необходимость печати встро­ енной диаграммы при печати родительского листа . Это свойство работает, если в коллекции хранится только один объект ChartObj eet Устанавливает/возвращает необходимость закругления углов встроенной диаграммы (тrue) или отображения правильных углов диаграммы (False). Это свойство ра­ ботает, если в коллекции хранится только один объект ChartObjeet
732 Приложение А Имя Тип возвращае- Описание мого значения Shadow Boolean ShapeRange ShapeRange Тор DouЫe VisiЫe Boolean Width DouЫe Add ChartObject BringTo- Variant Front Сору Variant CopyP icture Variant Cut Delete Duplicate Variant Variant Select Vari ant SendToBack Variant Устанавливает/возвращает необходимость отображения эффекта тени вокруг встроенной диаграммы. Это свойст­ во работает, если в коллекции хранится только один объ­ ект ChartObj ect Только чтение. Возвращает объекты ChartObj ect из коллекции как объекты Shape · Устанавливает/возвращает расстояние от верхнего края объекта chartObj ect до вершины родительского листа. Это свойство работает, если в коллекции хранится только один объект Chart Ob j ect Устанавливает/возвращает видимость всех объектов из коллекции ChartObj ects Устанавливает/возвращает ширину объекта ChartOb- j ect, если в коллекции хранится только один объект Метод. Параметры : Left As DouЫe, Тор As DouЫe, Width As DouЫe,Height As DоuЫе.Добавляетобъ­ ект ChartObj ect в коллекцию ChartObj ects . Положе­ ние нового объекта Cha:=- tobj ее t указывается с помощью параметров Left, Тор, Width и Height Метод. Размещает все объекты коллекции ChartObj ects на переднем плане поверх всех остальных объектов Метод . Копирует все объекты ChartObj ect из коллекции в буфер обмена Метод. Параметры: Арреаrаnсе As XlPi ctureAppear- ance, Format As XlCopyPictu reFormat. Копирует . изобра жения объектов Char t из коллекции в буфер об­ мена. Параметр Appearance позволяет выбрать копиро­ вание экранного представления или представления для печати. Параметр Format позволяет выбрать тип изобра­ жения, которое будет скопировано в буфер обмена Метод. Вырезает все объекты ChartObj ect из коллекции в буфер обмена Метод . Удаляет все объекты ChartObj ect из коллекции Метод. Дублирует все объекты ChartObj ect из коллек­ ции в родительском листе. (Например, если в родитель ­ ском листе присутствует два объекта ChartObj ect, в ре­ зультате вызова этого метода на листе о кажется четыре объекта ChartObj ect.) Метод. Параметры: [Replac e ]. Выделяет все объекты ChartObj ect в коллекции Метод. Размещает объекты ChartObj ect из коллекции на заднем плане за другими объектами Общие свойства объекта ChartObject Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 733 Свойства объекта ChartObject Имя Border Bottom- RightCell Chart EnaЫed Height Index Interior Left Loeked Name 'Plaeement PrintObjeet Proteet- ChartObjeet Rounded- Corners Shadow ShapeRange Тор TopLeftCell Тип возвращае- мого значения Border Range Chart Boolean DouЫe Long Interior DouЫe Boolean String Variant Boolean Boolean Boolean Boolean ShapeRange DouЫe Range Описание Только чтение. Возвращает свойства границы вокруг встроенной диаграммы Только чтение. Возвращает диапазон, состоящий из одной ячейки и расположенный под нижним правым уг.riом объ­ екта ChartObj ее t Только чтение. Возвращает фактическую диаграмму, свя­ занную с объектом ChartObj eet Устанавливает/возвращает необходимость запуска мак­ роса, связанного с объектом ChartObj eet Устанавливает/возвращает высоту встроенной диаграммы Только чтение . Возвращает положение объекта Chartob- j ее t в родительской коллекции Только чтение. Возвращает объект, поддерживающи й управление форматированием внутренней области объек­ та диаграммы (например, поддерживающий установку цвета внутренней области) Устанавливает/возвращает расстояние от левого края объ­ екта ChartObj eet до левого края родительского листа Устанавливает/возвращает необходимость блокирования объекта ChartObj ее t l'lpи защите родительского листа Устанавливает/возвращает имя объекта ChartObj eet Устанавливает/возвращает способ привязки листа Char- tObj ее t к листу (например, свободное расположение, перемещение вместе с ячейкой и т . д.) Для установки этого свойства можно воспользоваться константами XlPlaeement Устанавливает/возвращает необходимость печати встро­ енной диаграммы при печати родительского листа Устанавливает/возвращает возможность изменения раз­ мера, перемещения и удаления встроенной диаграммы с родительского листа Устанавливает/возвращает необходимость закругления углов встроенной диаграммы (тrue) или отображения лравильны х углов диаграммь! (False) Устанавливает/возвращает необходимость отображения тени вокруг встроенной диаграммы Только чтение. Возвращает объект ChartObj eet в виде объекта Shape Уста навливает/возвращает расстояние от верхнего края объекта ChartObj eet до верхнего края родительского листа Только чтение. Возвращает диапазон одной ячейки, распо­ ложенной под верхним левым углом объекта ChartObj eet
734 Приложение А Имя Тип возвращае- Описание мого значения VisiЫe Boolean Width DouЫe ZOrder Long Методы объекта ChartObject Устанавливает/возвращает необходимость отображения объекта ChartObject Устанавливает/возвращает ширину встроенной диаграм­ мы Только чтение. Возвращает положение встроенной диа­ граммы относительно других объектов на листе. Кроме этого, значение свойства zorder совпадает с положени­ ем объекта ChartObject в родительской коллекции Имя Тип возвращае- Параметры мого значения Описание Activate Variant BringToFront Variant Сору Variant CopyPicture Variant Cut Variant Delete Variant Duplicate Select Variant SendToBack Variant Appearance As XlPicture- Appearance, Format As XlCopyPicture- Format [Replace] Делает встроенную диаграмму ак­ тивной Размещает встроенную диаграмму поверх всех остальных объектов на листе. Меняет значение свойства ZOrder Копирует встроенную диагр_амму в буфер обмена Копирует изображение объекта Chart в буфер обмена . Параметр Appearance позволяет выбрать экранное представление или пред­ ставление для печати . Параметр Format позволяет указать тип изо­ бражения, которое будет скопиро­ вано в буфер обмена . Параметр Size используется вместе с лис­ тами диаграмм для указания раз­ мера изображения Вырезает встроенную диаграмму в буфер обмена Удаляет встроенную диаграмму с листа Дублирует встроенную диаграмму и размещает дубликат на том же родительском листе Устанавливает фокус на встроен­ ную диаграмму Отправляет встроенную диаграмму на задний фон за всеми объектами на листе Пример: объект ChartObject и коллекция ChartObjects В этом примере создаются изображе~ия . j pg для всех встроенных диаграмм на ак­ тивном листе.
Объектная модель Excel 2003 735 is,ilb ' Б}[i;j'6rte1i~rtё5:f,)) ec t s (Y~·~·· ' . '' '. '~ .....,,.,.,.,··· ·~ г:- r, =' li, ' Dirn . оСО As Ch~:i;-tObj ее t · · • < .. ": F:Ф• Each . оса :tn ActiveSheet. ChartObj ects .; ·. · r:- ·' ·· ' ЭкспортЙ рова· ть диаграмму .в виде изображения jpg. ~;. · , ; Назвать .изображе.ние ~, в соответствИ'И с · именем ~ . .. .., . . ,· ' ~- : .· ': встроеннои диаr:раммы . . >., . ·> oCO.Chart.Export "с:\" & oCQ.Na:rne & 1":\ jpg'', "' jpg" , Nex·t ·' ·" · · · · fE:nd'S'Ь , •.. ..: ~~."" . ,>,.. },!,",..,."~·,,_v:llV~ ...~ ;, ~~ Объект ChartTitle Объект ChartTitle содержит весь текст и параметры форматирования, связанные 'с за­ головком диаграммы . Для объекта ChartTitle родительским является объект Chart. Обычно этот объект используется совместно со свойством HasTi tle родительского объекта Chart. Общие свойства объекта ChartТitle Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ChartТitle Имя AutoScale- Font Border Caption Characters Fill Font Horizontal- Alignment Interior Left Narne Тип возвращае- Описание мого значения Variant , Border String Characters ChartFill- Format Font Variant Interior DouЫe String Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении разме­ ров родительской диаграммы Только чтение. Возвращает свойства границы вокруг вы­ деленного заголовка диаграммы Устанавливает/возвращает текст заголовка диаграммы Только чтение . Параметры: [ Start J, [LengthJ. Воз­ вращает объект, содержащий все символы заголовка диа­ граммы. Этот метод позволяет управлять символами за­ головка по отдельности Только чтение. Возвращает объект, содержащий все па­ раметры форматирования заголовка диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры форматирования шрифта заголовка диаграммы Устанавливает/возвращает параметры горизонтального выравнивания заголовка диаграммы. Для установки этого свойства можно воспользоваться константами xlAl ign Только чтение, Возвращает объект, содержащий параметры форматирования области текста в заголовке диаграммы Устанавливает/возвращает расстояние от левого края за­ головка диаграммы до левого края диаграммы· Только чтение . Возвращает имя объекта заголовка диа­ граммы ·
736 Приложение А Имя Тип возвращае- Описание мого значения Orientation Variant ReadingOrder Long Shadow Te xt Тор Vertical- Al i grunent Bo o lean String DouЫe Variant Методы объекта ChartТ itle Устанавливает/возвращает угол текста в заголовке диа­ граммы . Значение свойства указывается в градусах в диа­ пазоне от -90 до 90. Кро ме этого , для установ ки свойства можно воспользоваться одной из кон стант XlO r ient ation Устанавливает/возвращает направлен ие чтения текста (слева направо ил и справа налево). Сво й ство имеет см ысл только для не которых языков Устанавливает/возвра щает необход и мость отображения эффекта тени дл я заг~товка диаграммы Устанавливает/возвра щает текст заголов ка диаграммы Устанавливает/возвращает расстояние от верхнего · края заголовка диаграммы до верхнего края диа гр аммы Устанавливает/возвращает параметры верт и кального вы­ равнивания заголов ка ди аграммы . Для установки этого свойства можно воспользоваться константа м и x l VAl ign Имя Тип возвращае - Параметры Описание Delete Select мого значения Variant Variant Пример :_объект ChartТitle Удаляет заголовок из д и аграммы Выделяет заголовок ди агра м мы ' · Удостов:еритьсЯ , чт.6 н а диагра.'мме присутствует заголов ок Charts (1) . HasTi tle =···тrue • · Получить · объек т ChartTi tle Set ост = Charts/1) ..ChartTitle· ' Отформатировать заголовок диаграммы With оСТ .· · •. .···· . ••·.· . · . Caption <;; ·· "He llo · world" · ''. Font . Name = "Time"s New ROman" .Font.Siie ;~01~'~ . . ./charact ers("l, _ 1)>Font.Col or . " •RGB(255, О, . Charac ters (7, · 1) . Font.Col oi::. = RGB(2 55 , О, , Border. LineSty l ~ ·· = •xlCont;inu ous .Borde:i:< Weight xlThin < shado w · End .With Объе кт ColorForm at Объект Co l orF ormat описывает один цвет, который используе тся родительским объектом. Родительскими объектами могут быть FillForma t , LineFormat, Sh adow- Format и ThreeDFormat.
Объектная модель Excel 2003 . 737 Общие свойства объекта ColorFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ColorFormat Имя Тип возвращае- Описание мого значения RGB Long SchemeColor Integer TintAndShade Single Туре MsoColorType Пример: объект ColorFormat Только чтение . Возвращает значения красного, синего и зеленого компонентов текущего цвета Устанавливает/возвращает цвет объекта ColorFormat в виде номера в текущей цветовой схеме Устанавливает/возвращает значение, позволяющее осве­ тить или затемнить цвет указанной геометрической фигу­ ры . Значение свойства находится в диапазоне от -1 (самый темный) до 1 (самый светлый) . Значение О соот­ ветствует нейтральной подсветке Только чтение. Возвращает тип цвета: RGB, смешанный или полученный из палитры Устанавливает свойство ForeColor эффекта заливки геометрической фигуры. rsu.ь Fo'iiuatShapeColour () .•. " "~· i Dim oShp As Shape . t' Dim oCF As ColorFormat i .set oShp , = Act_i v~Sheet. Shapes ( 1) V Set oCF .= oShp. Fill . ForeColor ,.. oCF.SchemeColor = 53 t . L~~<t.. s.:.чo".,·. ~-·· = ·-·'" "' " ·&.. ,~=····ш. ~ Объект Comment и коллекция Comments В коллекции Comrnents хранятся все примечания ячеек из родительского объекта Range. Каждый объект Comrnent содержит примечание для одной ячейки. Общие свойства объекта Comment Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Comment Имя Author Shape VisiЫe Тип возвращае- Описание мого значения String Shape Boolean Только чтение . Возвращает имя автора примечания Только чтение. Возвращает поле примечания в виде объ­ екта Shape. Этот объект поддерживает управление пара­ метрами поля примечания Устанавливает/возвращает необходимость постоянного отображения примечания (True} или отображения приме­ чания только при наведении указателя мыши
738 Приложение А Методы объекта Comment Имя Тип возвращае- Параметры мого значения Delete Next Coпunent Previous· Coпunent Text String [Text], [Start], [Overwrite] Описание Удаляет примечание из ячейки Возвращает следующее примечание ячейки из родительской коллекции Возвращает предыдущее примечание ячейки из родительской коллекции Устанавливает текст примечания. Пара­ метр Text содержит текст примечания. Параметр Start позволяет определить точку вставки в существующее примеча­ ние . Для перезаписи существующего текста параметр overwri te устанавли­ вается в значение True Пример: объект Comment и коллекция Comments В этом примере удаляется имя пользователя, добавленное Excel в начало примечания. После этого выполняется форматирование примечания для обеспечения большего удоб- ства при чтении. · suЪ ·F'o rma tcommёnt. s О Di.m· oCoпunent As C.oпunent, i As Integer ·· ' Перебрать · все примечания в пределах листа For Each oC .oпunent In Active'sheet. Coпunent ~ ' ·Работаем' · с текстом пр имечани~=~ Wi th OC<;;пunent. Shape. TextFrame. Cha.racters ." Найти и у~алИ т:ь имя пользователя, , добавленно.е i =.InStr(1; .Text , ":" & vbLf) ; Ifi·>ОThe.n. : .Text=Мid(.Text,i +2) End If ' Увел ичить размер· щри ф та With .Font . Name. « si'ze . Bold End With End · With 11 Arial" 10 False . , включить автоматическое изменение oCoпunent.Sbape . TextFratne.AutoSize 1 Next · !'Endh ~u.f> • с• ···°"~"·· -· Объект ConnectorFormat Этот объект представляет соединительную линию между геометрическими фигурами. При перемещении любой из геометрических фигур линия автоматически меняе.т конфи­ гурацию для сохранения визуальной связи между фигурами. Для объекта Connector- Format родительским является объект Shape.
Объектная модель Excel 2003 739 Общие свойства ConnectorFormat Определения свойств Application, Creator и Parent приводились в начале при­ ·ложения . Свойства объекта ConnectorFormat Имя Begin- Connected Begin- Connected- Sha pe Begin- Connection- Site EndConnected End- · c onnected- Shape End- Co nnection- Site Туре Тип возвращае- мого значения MsoTriState Shape Long MsoTriState Shape Long Ms oConnector - Туре Описание Только чтение. Возвращает присутствие геометрической формы в начале соединительной линии. Применяется вместе со свойством Begin ConnectedShape Только чтение . Возвращает геометрическую форму, кото­ рая связана с началом соединителы1-юй линии . Применя­ ется вместе со свойством BeginConnect ed Только чтение. Возвращает точку подключения на геомет­ рической фигуре, с которой связано начало соединитель­ ной линии. Используется вместе со свойством BeginCon- nected Только чтение. Возвращает присутствие геометрической формы в конце соединительной линии. Используется вместе со свойством EndConnectedShape Только чтение. Возвращает геометрическую фигуру, кото­ рая связана с началом соединительной линии . Использу­ ется вместе со свойством EndConnected Только чтение . Возвращает точку подключен ия на геомет­ .рической фигуре, с которой связан конец соединительной линии . Используется вместе со свойством EndConnected Устанавливает/возвращает тип используемой соедини­ тельной линии (например, ms o Connecto r Strai ght, msoConnectorCurv e) Методы объекта ConnectorFormat Имя BeginConnect Di scon nect EndCo nnect Тип возвращае- Параметры мого значения Conn ected Sh ape As Shape , Con- nectionSite As Long Conn ectedShape As Shape, Con- n ecti onSi te As Long Описание Связывает начало соедин ительной линии с геометрической фигурой, ука­ занной в качестве значения параметра ConnectedShape. Точ ка подключения указывается в качестве значения па­ раметра Connecti onSi te Отключает геометриче скую ф игуру, ко­ тор ая находится в нач але соедини­ тельной линии . Этот метод не пе ре­ м ещает соединительную л ин ию Связывает конец соедин ител ьной ли­ нии с геометрической фигуро й, ука­ занно й в качестве значен ия п араметра Connected shape. Точка под ключения указывается в качестве значения па­ ра метра Connectionsi te
740 Приложение А Имя Тип возвращае- Параметры мого значения Описание End- Di sconnect Отключс;~ет геометрическую фигуру, ко­ торая находится в конце соединитель­ ной линии. Этот метод не перемещает соединительную линию Пример: объект ConnectorFormat В этом примере все соединительные линии форматируются в виде кривых . подключен а · с . EridConnected Объект ControlFormat Объект Cont rolFormat содержит свойства и методы , позволяющие уirравлять таки­ ми элементами управления, как поля ввода и списки. Родительским для этого объекта всегда является объект Shape. Общие свойства объекта ControlFormat 1 Определ.е,ния свойс.тв Application, Creator и Parent приводились в начале при- ложения. Свойства объекта ControlFormat Имя Тип возвращае- Описание мого значения DropDown- Long Lines EnaЫed Boolean LargeChange Long Устанавливает/возвращает количество строк, отображае­ мых в раскрывающейся части комбинированного списка . Используется только с комбинированными списками Устанавливает/возвращает состояние элемента управле­ ния · (включен/выключе н) Устанавливает/возвращает значение полосы прокрутки, которое добавляется или отнимается при каждом щелчке пользователя на внутренней области полосы прокрутки. Используется только с полосой прокрутки
Имя Тип возвращае- мого значения LinkedCell String ListCount Long ListFill- String Range Listindex Long LockedText Boolean Мах Long Min Long Mul tiSelect Long Pr intObject Boolean Sma llChan ge Long Value Long Методы ControlFormat Объектная модель Excel 2003 741 Описание Устанавливает/возвращает диапазон, в который копиру­ ются результаты работы злемента управления Только чтение. Возвращает количество элементов в поле списка или в комбинированном списке. Применяется толь­ ко с полосой прокрутки Устанавливает/возвращает диапазон, в котором хранятся элементы для поля списка или комбинированноrо списка. Используется только с комбинированным списком или по­ лем списка Устанавливает/возвращает элемент, который в данный момент выделен в поле списка или в комбинированном списке. Используется только с комбинированным списком или полем списка Устанавливает/возвращает возможность модификации текста в элементе управления при блокировке книги Устанавливает/возвращает максимальное значение, которое может принимать полоса прокрутки или поле счетчика. Применяется только с полосой прокрутки или счетчиком Устанавливает/возвращает минимальное значение, кото­ рое может принимать полоса прокрутки или поле счетчи­ ка. Используется только с ПО:flОСой прокрутки или счетчи­ ком Устанавливает/возвращает реакцию списка на пользова­ тельское выделение. Это свойство может устанавливать­ ся в значение xlNo ne (выделяется только один элемент списка) , xlSimple (в выделение добавляется каждый элемент, на котором щелкает пользователь) или xlEx- tended (для выделения нескольких элементов списка пользователь должен удерживать клавишу <Ctrl>). Ис­ пользуется только с полями списков Устанавливает/возвращает необходимость печати эле­ ментов управления при печати листа Устанавливает/возвращает значение, которое добавляет­ ся или отнимается от значения полосы прокрутки, когда пользователь щелкает на стрелке полосы прокрутки. При­ меняется только с полосами прокрутки Устанавливает/возвр.ащает значение элемента управления Имя Тип возвращае- Параметры мого значения Описание Additem Text As String, [I ndex] Добавляет значение параметра техt в поле списка или в комбинированный список. Этот метод может использо­ ваться только с полями списков или комбинированными списками
742 Приложение А Имя List Rernove- Alliterns Rernoveitern Тип возвращае- Параметры мого значения Variant [Index] Index As Lon<i', [Count] Пример: объект Contro/Format Описание Устанавливает/возвращает массив списка строк, связанный с комбини­ рованным списком или полем списка. Кроме этого, метод устанавлива­ ет/возвращает отдельные элементы списка, если указать значение пара­ метра Index. Используется только с полями сп исков и с ко мбинирован­ ными списками Удаляет все элементы из поля списка или комбинированного списка. Ис­ пользуется только с полями списков и с комбинированными списками Удаляет элементы, на которые указы­ вает значен ие параметра Index. Ис­ пользуется только с полями списков и с комбинированными списками В этом примере сбрасываются все поля списка, раскрывающиеся списки, полосы про­ крутки, счетчики и флажки на листе. !s'UB ResefForrncontrolsY J •• · '· Dim 'oshp As Shape · Dirn oCF As. controlForrnat ' Перебрать все геометрические фи'гуры · For Еаёh oShp In ActiveSheet.. Shapes •' Это элемент управления Формы (Forrns)? · :If oShp . Туре = r ns oForrnControl Then .. Ne:x:t ' Да, получить объект · ControlForrnat Set oCF = oShp.ControlForrnat ' Сброси.ть э.лемент · управления соответствующим Select са~зе oShp.ForrnControlType CasexlListBox, xlDropDown: oCF.RemoveAllitems · casexispinner, .xlscrollвar oCF: Value = oCF. Min. !1.!:В.9'. ~Ч]?:;_., . ~ . Объект Corners Этот объект представляет углы трехмерной диаграммы. Для него родительским объ­ ектом является объект Chart. Родительская диаграмма должна быть трехмерной. Доступ к отдельным углам невозможен.
Объектная модель Excel 2003 743 Общие свойства объекта Corners Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Corners Имя. Name Тип возвращае- Описание мого значения String Только чтение. Возвращает имя объекта Corners - обычно это "Corпers" Методы объекта Corners Имя Select Тип возвращае- Параметры мого значения Variant Описание Выделяет углы диаграммы Пример: объект Corners Пример отсутствует - существует только метод для выделения углов, что не несет практиче~кой пользы. Объ~кт CubeField и коллекция CubeFields В коллекции CubeFields хранятся все поля отчета сводной таблицы , основанные на кубе OLAP. Каждый объект CubeField представляет измерение или иерархию полей из куба OLAP. Родительским объектом для коллекции CubeFields является объект Piv- otTaЬle. Кроме типичных атрибутов, коллекция CubeFields предоставляет свойство Count. Свойство Count возвращает количество объектов в коллекции. Методы коллекции CubeFields Имя AddSet Тип возвращае - Параметры мого значения CubeField Name As String, Caption As String Описание Добавляет новый объект CubeField в коллекцию CubeFields Общие свойства объекта Cub~Field Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта CubeField Имя Caption CubeField- Type Тип возвращае- Описание мого значения String XlCubeField- т:fpe Только чтение. Возвращает текстовую метку, которая ис­ пользуется для поля куба Только чтение. Возвращает значение, определяющее, яв­ ляется ли поле куба полем иерархии (xlHierarchy) или полем измерения (xlмeasure)
744 Приложение А Имя DragToColurnn · DragToData DragToHide DragToPage DragToRow ЕnаЫе - Multiple- Pageitems HasMemЬer- Prop erti es HiddenLevels L ayou t Form Layout- Subtotal - Location Name Orient a tion Pi votFiel ds Position ShowinField- List Treeview- Co n trol Va lue / Тип возвращае- Описание мого значения Bo olean Boolean Boolean Boolean Bo olean Boolean Boolean Long XlL ayout- FormType XlSubto tal- LocationType String XlPivot Field- Ori entation Pivot Fie lds Long Bool ean Treevi ewQon- trol Strin g Устанавливает/возвращает возможность перетаскивания поля в позицию столбца. Для полей измерений .это свой­ ство равно значению Fal se Устанавливает/возвращает возможность перетаскивания поля в позицию данны х Устанавливает/возвращает возможность перетаскивания поля из отчета сводной таблицы (сокрыти я п оля) Устанавливает/возвращает возможность перетаскивания поля в позицию стран и цы. Для полей измерений это свой­ ство равно значению 'F а l sе Устанавливает/возвращает возможность перетаскивания поля в позицию строки . Для полей измерени й это поле равно значению False Устанавливает/возвращает возможность выделения не­ скольких элементов в области полей стран и цы для свод­ ных таблиц OLAP Только чтение . Возвр а щает значение True, если выбраны свойства-члены , котор ые должны отобра жаться для поля куба Устанавливает/возвращает скрываемые верхние уровни иерархии поля_ куба . Перед установкой своИства в значе­ н и е, превышающее О , нужно установить свойство в значе­ н и е О (при этом будут по казаны все уровни , после чего часть уровней будет скрыта) Устанавливает/возвращает способ отображен ия вь1бран­ н ых элементов св одно й таблицы устанавливает/возвращает положение итогов полей свод­ ной таблицы относительно выбранных поле й Только чтение. Возвращает имя объекта Устанавливает/возвра щает расположен и е поля в отчете сводной таблицы Только чтение. Возвращает коллекцию Pivot Fiel ds Устанавливает/возвращает номер позиции п оля иерархии среди всех полей той же ориентации Устанавл и вает/возвращает необходимость отображения объ екта CubeField в спи ске полей Только чтение . Возвращает объект, позволяющий управ­ лять кубом в отчете сводной таблицы OLAP Только чтение. Возвращает имя поля
Объектная модель Excel 2003 745 Методы объекта C.ubeField Имя AddМemЬer­ PropertyF i eld Delete Тип возвращае- Параметры мого значения Property As String, [Property Order] Описание Добавляет поле свойства в ото­ бражение поля куба . Обратите внимание, что выбранное поле свойства будет недоступным для просмотра, если в представлении сводной таблицы отсутствуют поля Удаляет объект Объект CustomProperty и коллекция CustomProperties Данный объект позволяет сохранять информацию внутри листа или внутри смарт-тега. Эта информация может использоваться в качестве метаданных для генерации кода XML. Также она доступна любой подпрограмме, работающей с листом или смарт-тегом. Более важным аспектом этого объекта с точки зрения разработчика является возмож­ ность хранения информации, специфичной для листа или группы листов. В таком случае подпрограмма может обращаться к объекту CustomProperty, анализировать получен­ ную информацию и принимать решение о дальнейшей обработке листа. Раньше для хра­ нения информации о листе многие разработчики использовали имена диапазон ов на уровне листа, которые хранились только в пределах этого листа, что позволяло исполь­ зовать такие же имена в других листах для хранения других данных. Например, каждый лист в пределах книги содержит десяток бюджетных листов и три лис­ та с отчетами, в которых моrуг присутствовать одинаковые имена диапазонов IsBudget. Во всех бюджетных листах в этом имени хранится значение True. На листах отчетов в этом имени хранится значение False. Если подпрограмме необходимо перебрать листы и приме­ нить различное форматирование в зависимости от типа листа, подпрограмма может прове­ рить значение имени диапазона и определить, обрабатываетсЯ ли бюджетный лист. Новый объект CustomProperty значительно упрощает хранение такой информации (или любой другой информации), позволяя отказаться от использования диапазонов уров­ ня листа, хранения информации на скрытом листе или применения системного реестра. Коллекция CustomProperties предоставляет доступ к объектам CustomProperty для листов и смарт-тегов. В объекте CustomProperty может храниться информация как для листа, так и для смарт-тега. Эти объекты напоминают объекты Document.Property из объектной модели OfficeXP, но они хранятся в пределах листа или смарт-тега, а не для всего документа в целом. Общие свойства коллекции CustomProperties Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства коллекции CustomProperties Имя Count Item Тип возвращае- Описание мого значения Long Только чте ние . Возвращает количество объектов в преде­ лах коллек ции CustomProperty Только чтение. Index As Variant. Возвращает один объект из коллекции
746 Приложение А Методы коллекции CustomProperties Имя Тип возвращае- Параметры мого значения Описание Add CustornProperty Narne As String, Добавляет информацию в дополнительное Value As Variant свойство Общие свойства объекта CustomProperty Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта CustomProperty Имя Тип возвращае- Описание мого значения Narne Value String Variant Устанавливает/возвращает имя объекта Устанавливает/возвращает стиль линии границ (например, xlDash). ДлЯ установки значения свойства можно воспользоваться константами xlLineStyle. Свойство является аналогом свойства LineStyle Методы объекта CustomProperty Имя Тип возвращаемого значения Параметры Описание Delete Удаляет объект Пример: объект CиstomProperty Эта подпр ограмма посл едовательно перебирает листы в пределах книги и создает объект CustomProperty, который называется IsBudget. Значение объекта IsBudget зависит от того, содержит ли лист фразу "Бюджетный анализ". После этого выводится результат работы подпрограммы. ;sиь · c r:e a. i::e ci.isfomi>r6'i> ert:Tes ( ) '·"~7·~···:· .·· ··7 ·•:", ...... '~· "/ . Dim_ bBtidget .As Boolean ·· ' · . ~- , Dirn lRow •As . Long, · · . .' · ,· . D~П) oC_μstornProp АЕ; . C_~st:cimProperty• '· Dirn . rцg As Range, wks As ..Worksheet [" , Отклю;_rить ~· обновление экра.на и f<• < with Application ' 'У : FiД.dForm~t« Clea·r·. · . Screen\Jpdating 'Witn , . ' ' О{iИ:СТИТЪ !JИСТ-,.; на• котором будет · ' " объек.т6 J? CustornProperty ~ . w~scus t;. ' omPrqpe'rt-i es . U$e~aдge . Of f set; ( 1 , •' · йi'ifщиализ~ровать 0 сЧетЧЙк строк ., ' в ' первой С'J,'р о ке · !'!а:~юДятсЯ: ',",',; . ',<
Объектная модель Excel 2003 747 • : дg:еек· и ·0шиък·ах Пойска ~об Ъ€"ктоЬ. · cust9inPropeity· ·· On Error Resшne Ne'xt · ·ъвudget =' F.alse '\~," .1 .;, к. с~жалению, нельзя с<;:ьmат~·ся на объект по . имени. ,Только по номеру. ,,, ..·., wks. Cus.tomP;roperties (1) .. ;, . _/, .·;;. .,· ' " ' .Если , объект CustomProperty · с.уще.ствует, , •··' и. добавить заново · : If .Not oCustomProp Is · Nothii;i.g ··Thщi'; oCustomProp. Delete • ' • •·< ~ Обратите в~има.нйе, · Что :Зна~ение ;~вudget з~клю~ено .в ~· Двойные ' кавычки. · . ·~· · · • Если Этого . не сделать, True будет · сохранено " как - 1, :· а· False -- как О (соответствующие числоi\ьiе значения) t. .'set oCustoniProp = wks. cu~tomProperties ; Add (Name: = f~ ''Is~u.dge.~ •:, ~alu: \ ''" " , & bBudget & "") · •" ПеречислИть пара,метрьr объектов custorпProperty на листе. • Wi th: \11ksCus tomProperties · Вызов Parent . N_ame воз в ращает имя объект.а, . .~ в котором хранится . объект: Cu stomProperty. ; В данном случае . это имя лИста. · . Cells(lRow, 1) .Va lue · ,,; ocustomPr.op . Pa;rent.Name .Ceils( lRow , 2) .Value ' = oCust'omProp.Name ~· Cells (1Row, 3 ), , Value· oCustoinProp. Value ., End With · одиу строку Объект CustomView и коллекция CustomViews :В коллекции CustomViews хранится список дополнительных представлений, связан­ ных с книгой. В каждом объекте c:istornView хранятся атрибугы дополнительного пред­ ставления книги. В дополнительном представлении хранятся такие параметры, как размер и положение окна, ширина столбцов, скрытые столбцы, а также параметры печати книги. Для коллекции CustornViews родительским объектом является объектWоrkЬооk. Кроме типичных атрибугов, коллекция CustornViews предоставляет два дополни­ тельных свойства. Свойство Count возвращает количество объектов CustomView в пре­ делах коллекции. Метод Add позволяет добавить .представление в коллекцию Custorn- Views . В качестве значения параметра ViewNarne метод Add принимает имя представле­ ния. При необходимости в представление можно добавить параметры печати (PrintSettings) и скрытые строки и столбцы (RowColSettings ) .
'748 ПриложениеА Общие свойства объекта CustomView Определения свойств Application, Creator и Parent приводились в начаЛе при­ ложения. Свойства объекта CustomView Имя Name Print - Settings RowCol- Settings' Тип возвращае- Описание мого значения String Boolean Boolean Только чтение. Возвращает имя дополнительного пред­ ставления Только чтение. Возвращает необходимость включения представление параметров печати Только чтение. Возвращает необходимость включения в представление скрытых строк и столбцов Методы объекта CustomView Имя Тип возвращае- Параметры Описание Delete Show мого значения Удаляет дополнительное представление Отображает дополнительное представле­ ние и связанные с ним параметры Пример: объект CustomView и коллекция CustomViews Подпрограмма последовательно выводит дополнительные представления книги, вы­ держивая паузу в 2 секунды. uь>showCustomView ( )" ... ·"D~m .,oCV As Cшф;>mVi EM ' Перебрать все лредставлени.я, содержащие информаЦИю ь ·.строках ' ' н ·. столбцах. ' FbiEach oCV IriActiveWorkbook.CustomViews · f . oCV. RoWCcilSet'tings Then t>CV. Sho\./ . nd'If . Объект DataLabel и коллекция DataLabels В коллекции DataLabels хранятся все метки отдельных точек и линий трендов для ряда данных. В каждом ряду присутствует только одна коллекция DataLa bels. Для коллекции DataLabels родительским является объект Series. Каждый объект DataLabel представ­ ляет одну метку данных для линии тренда или точки данных. Коллекция DataLabels ис­ пользуется вместе свойством HasDataLa)Jels родительского объекта Series. Коллекция DataLabels предоставляет несколько свойств и методов кроме типичных атрибутов коллекции . Эти методы и свойства перечислены в следующей таблице.
Объектная модель Excel 2003 749 Свойства и методы коллекции DataLabels Имя AutoScale- Font AutoText Border Count Fill Font Horizontal- Alignment Interior Name NurnЬerFormat Number- Format- Linked NumЬer- FormatLocal Orienta tion Position Тип возвращае- мого значения Variant Boolean Border Long ChartFill- Format Font Variant Interior String String Boolean Variant Variant XlDataLabel- Position Rea dingOrder Lo ng Separator Variant Shadow Bool e an ShowBubЬl e- Bo ol ean Size Описание Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Устанавливает/возвращает · необходимость автоматиче ­ ской генерации текста меток данных Только чтение. Возвращает свойства границы вокруг кол­ лекции меток данных Только чтение. Возвращает количество меток даннь1х в коллекции Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки меток данных в коллекции Только чтение . Возвращает объект, содержащий парамет­ ры шрифта для меток данных в коллекции Устанавливает/возвращает параметры горизонтального выравнивания меток данных. Для установки свойства можно воспользоваться константами x lAlign Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области меток данных в коллекции (например, внутренний цвет) Только чтение . Возвращает имя коллекции Устанавливает/возвращает формат чисел, который ис­ пользуется, если метки данных являются числами или да­ тами Устанавливает/возвращает необходимость применения того же формата чисел, который используется в ячейках с данными для меток данных Устанавливает/возвращает имя формата чисел, который используется в метках данных. Имя указывается на языке пользовательского интерфейса Устанавливает/возвращает угол, под которым расположен текст меток данных . Значение свойспщ можно указывать в градусах (в пределах от -90 до 90) или воспользоваться одной из констант XlOrientation Устанавливает/возвращает расположение меток данных относительно точек или ли.ний тренда Устанавливает/возвращает направление текста (слева направо или справа налево). Это свойство может исполь­ зоваться с некоторыми языками пользовательского ин ­ терфейса Устанавливает/возвращает разделитель, который исполь­ зуется для меток данных на диаграммах Устанавливает/возвращает необходимость отображения тени вокруг меток данных Устанавливает/возвращает необходимость отображения размера пузырька для меток данных на диаграмме
750 Приложение А Имя Show- CategoryName ShowLegend- Кеу ShowPercent age ShowSeries - Name ShowValue Туре Vertical- Alignment Delete Select Тип возвращае- мого значения Boolean Boolean Boolean Boolean Boolean Variant Variant Variant Variant Описание Устанавливает/возвращает необходимость отображения имени категории для меток данных на диаграмме Устанавливает/возвращает необходимость отображения ключа из легенды (обычно это один из цветов) вместе с меткой данных Устанавливает/возвращает необходимость отображения процентного значения вместе с меткой данных на диа­ грамме Устанавливает/возвращает необходимость отображения имени ряда Устанавливает/возвращает необходимость отображения значений меток данных конкретной диаграммы Устанавливает/возвращает тип отображаемых меток дан­ ных для коллекции (например, метки, проценты, значения) Устанавливает/возвращает параметры вертикального вы­ равнивания меток данных. Для установки этого свойства можно воспользоваться константами xlVAl ign Метод . Удаляет метки данных Метод . Выделяет метки данных на диаграмме Общие свойства объекта DataLabel Определ ения свойств Application, Creator и Parent приводились в начале при­ ложения . Своrtiства объекта DataLabel Имя Тип возвращае- Описание AutoScale- Font мого значения Variant AutoText Boolean Border Border Caption String Characters Characters Fill ChartFill- Format Font Font Horizontal- Variant Alignment Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Устанавливает/возвращает необходимость автоматиче­ ской генерации текста меток данных средствами Excel Только чтение. Возвращает свойства границы вокруг мет­ ки данных Устанавливает/возвращает текст метки данных Только чтение . Параметры: [StartJ, [LengthJ. Возвра­ щает объект, который представляет диапазон символов текста Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки для меток данных Только чтение. Возвращает объект, содержащий парамет­ ры шрифта для метки данных Устанавливает/возвращает параметры горизонтального выравнивания метки данных. Для установки этого свойст­ ва используЮтся константы xlAlign
Имя Interior Lef t Name NumЬerFormat Number- Format- Linked Number- FormatLocal Orientation Position ReadingOrder Separator Shadow ShowBubЫe- Size Show- Category- Name ShowLegend- Кеу Show- Percentage ShowSeries- Name ShowValue Text Тор Туре Vertical- Alignment Тип возвращае- мого значения Interior DouЫe String String Boolean Variant Variant XlDataLabel - Position Long Variant Boolean Boolean Boolean Boolean Boolean Boolean Boolean String DouЫe Variant Variant Объектная модель Excel 2003 751 Описание Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области метки данных (например, цвет внутренней области) Устанавливает/возвращает расстояние от левого края метки данных до левого края родительской диаграммы Только чтение . Возвращает имя метки данных Устанавливает/возвращает формат чисел, который исполь­ зуется для меток данных, являющихся числом или датой Устанавливает/возвращает необходимость использования одинакового формата чисел для меток данных и ячеек·, содержащих данные для диаграммы Устанавливает/возвращает имя формата чисел для меток данных на языке пользовательского интерфейса Устанавливает/возвращает угол расположения текста для метки данных. Значение этого свойства можно указывать в градусах (в пределах от -90 до 90). Кроме этого, можно воспользоваться константами XlOrientation Устанавливает/возвращает расположение метки данных относительно точек или линий тренда Устанавливает/возвращает направление текста (слева на­ право или справа налево). Это свойство может использовать­ ся с некоторыми языками пользовательского интерфейса Устанавливает/возвращает разделитель, который исполь­ зуется с метками данных на диаграмме Устанавливает/возвращает необходимость отображения тени для меток данных Устанавливает/возвращает необходимость отображения размера пузырька для меток данных на диаграмме Устанавливает/возвращает необходимость отображения имени категории для меток данных на диаграмме Устанавливает/возвращает необходимость отображения ключа из легенды (обычно это один из цветов) вместе с меткой данных Устанавливает/возвращает необходимость отображения про­ центного значения вместе с меткой данных на диаграмме Устанавливает/возвращает необходимость отображения Имени последовательности Устанавл'ивает/возвращает необходимость отображения значений меток данных конкретной диаграммы Устанавливает/возвращает текст метки данных Устанавливает/возвращает расстояние от верхнего края метки данных до верхнего края родительской диаграммы Устанавливает/возвращает тип отображаемых меток дан­ ных (например, метки, проценты, значения) Устанавливает/возвращает параметры вертикального вы­ равнивания меток данных . Для установки этого свойства используются _ константы xlVAl ign
752 Приложение А Методы объекта DataLabel Имя Тип возвращае- Параметры мого значения Delete Variant . Select Variant Описание Удаляет метку данных Выделяет метку данных на диаграмме Пример: объект DataLabel и коллекция DataLabels В данном примере метки данных добавляются ко всем точкам диаграммы. Для этого используется столбец слева от диапазона значений для оси Х. 1зu.ь . JrcidrSat:a.t..a.ьe1 s сг ·· ~-· .".~~·~· · ··,. ~. Dim ose:r As · Series 1·.. Dim vaSpli ts As. variant :;1;''· r)iп\ oXRng· As Яange ' · Dim o:LЫRng As Range . · bim оLЫ ' As DataLabel ·· > ·' ' перебрать все ряды диаграммы :Fqr : Each oSer In Charts(l) .SeriescoJ'lection , : , ·· i' Получить формулу · ряда и раЗде.irить ее на · " .составляющие (ИМ:Я, диапазон· Х, диапазон У, ·порядок) :va):;prits =. Split ( o$er. Formula' ", ") :,; _,- ~ < диап'аз'он :Х , = Range (yaspli ts ( LBound (vaSpli ts) + 1) ) . 'Получить . столбец слева от диапазона Х · Set oLЫRng;, oXRng ..Offset(O, '-1) Nex.t , для рядов · Получить обiект DataLabel Set ' oLЫ = osei.Points(i) .Da~aLabel ,:· ··:. Получqть текст и выравнивание · .with оt.Ы . .. . .~apti9n~ = ot.ЫRng.cells(i} ·. Position - xlLabelPositionAЬove With· . . Next·· ~~9::8\J.\:>..l;;"« Объект DataTaЫe В этом объекте хранятся параметры форматирования, связанные с таблицей данных диаграммы. Родительским для этого объекта является объектСhаrt. Общие свойства объекта DataTaЫe Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 753 Свойства объекта DataTaЫe Имя Тип возвращае- Описание мого значения Aui:oscale- Font Border Font HasBorder- Horizontal HasBorder - Outline HasBorder- Vertical ShowLegend- Кеу Variant Border Font Boolean вi:юlean Boolean Boolean Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Только чтение . Возвращает свойства границы вокруг таб­ лицы данных Только чтение. Возвращает объект, содержащий парамет­ ры шрифта для таблицы данных Устанавливает/возвращает необходимость отображения горизонтальных границ ячеек в таблице данных Устанавливает/возвращает необходимость отображения внешних границ ячеек в таблице данных Устанавливает/возвращает необходимость отображения вертикальных границ ячеек в таблице данных Устанавливает/возвращает необходимость отображения ключа легенды вместе с содержимым таблицы данных Методы объекта DataTaЫe Имя Тип возвращае­ мого значения Параметры Описание Удаляет таблицу данных Delete Select Выделяет таблицу данных на диаграмме Пример: объект DataTaЬ/e Добавляет таблицу данных в диаграмму и меняет форматирование чтобы между значениями отображались вертикальные линии. ; s·uь -Form~tr5a t~а·таь1е ~с)~·~,<':,,· ,... ,, Dirn oDT As DataTabl~· . • Отобразить таблицу Данных Charts (i) . HasDataтaыe · = True .· ' ПолучИть объект·. DаtаТаЬlе Set , oDT · = > Charts'(l) ': DataTaЫe • . ОтформатИроватЬ · таб:Лицу Данных таким образом', •· чтобы отображались · только вертикальные линии Wi th oDT . . . , . HasBorderOutline :,; . False .HasBorderHorizontal = False ..HasBorderVertical ' = True i End·Wiф L:§:n§ . i?:U!?. ·' ·"""··· · .. ; . • Объект DefaultWebOptions таким образом, ! Поддерживает программный доступ к принятым по умолчанию параметрам диалогово­ го окна Параметры веб-документа (Web Options). Эти параметры определяют поведение Excel при открытии страницы HTML и при сохранении листа в виде страницы HTML.
754 Приложение А Общие свойства объекта DefaultWebOptions Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта DefaultWebOptions Имя Тип возвращае- Описание мого значения AllowPNG Boolean AlwaysSave- Boolean InDefault- Encoding Checkif- Boolean Office- IsHTМLEditor Download- Boolean Components Encoding MsoEncoding FolderSuf f ix String Fonts WebPageFonts Load- Boolean Pictures LocationOf- String Components Organizein- Boolean Folder PixelsPer- Long Inch RelyOnCSS Boolean RelyOnVМL Boolean SaveHidden- Boolean Da ta Устанавливает/возвращает возможность использования формата Роr1аЫе Network Graphics (PNG) в качестве вы­ ход ного формата изображений. Этот переносимый фор­ мат поддерживает сжатие изображений без потерь, обес­ печивая при этом достаточно высокую степень сжатия Устанавливает/возвращает необходимость сохранения WеЬ-документов с использованием принятой по умолча­ нию кодировки Уста навливает/возвращает, является ли пакет Office при­ нятым по умолчанию редактором для страниц, созданных средствами Office Устанавливает/возвращает информацию о присутствии компонентов Office на компьютере пользователя, когда пользователь просматривает файлы Excel в WеЬ­ обозревателе Устанавливает/возвращает тип кодировки, в которой со­ храняются документы Только чтение. Возвращает суффикс для каталога под­ держки, который создается при сохранении документа Ex- cel в виде WеЬ-документа. Это свойство зависит от языка Только чтение. Возвращает коллекцию допустимых WеЬ­ шрифтов Устанавливает/возвращает необходимость загрузки изо­ бражений при открытии файла Excel Устанавливает/возвращает адрес URL или путь, по кото­ рому доступны WеЬ-компоненты Office, необходимые для просмотра документа в WеЬ-обозревателе Устанавливает/возвращает необходимость сохранения файлов поддержки в отдельной папке • Устана.вливает/возвращает способ отображения графика плотности и ячеек табл и цы на WеЬ-стран ице Устанавливает/возвращает необходимость использования каскадных листов стилей для форматирования шрифтов Устанавливает/возвращает необходимость отказа от ге ­ нерации изображений при сохранении документа с рисо­ ванными объектами. Для создания изображений на лету используется язык Vectoг Markup Laпguage (VML). Этот язык основан на XML и обеспечивает генерацию вектор­ ной графики для WеЬ-страниц Устанавливает/возвращает необходимость сохранения на WеЬ-странице всех скрытых данных
Имя SaveNewWeb- PagesAsWeb - Archives ScreenSize Target- Browser Update- LinksOnSave UseLong- FileNames Тип возвращае- мого значения Boolean MsoScreenSize MsoTargetBrow ser Boolean Boolean Объектная модель Excel 2003 755 Описание Устанавливает/возвращает возможность сохранения WеЬ­ страницы в виде WеЬ-архива Устанавливает/13озвращает размер экрана целевого мони­ тора Устанавливает/возвращает версию обозревателя Устанавливает/возвращает необходимость обновления ссылок при каждом сохранении документа Устанавливает/возвращает необходимость использования длинных имен файлов, если такая возможность существует Пример: объект Defau/tWebOptions В этом примере показано, как открывать WеЬ-страницу, не загружая изображения. Объект Diagram Объект Diagram представляет предопределенную коллекцию геометрических форм, ок­ руженных невидимой границей. Это комбинация добавления геометрических фигур вручную с помощью панели инструментов Рисование (Drawing) и использованием расширенной вер­ сии программы Организационная диаграмма, которая предоставлялась в предыдущих верси­ ях Microsoft Office. Внутри каждого объекта Diagram хранятся объекты Node. Каждый объект Node представляет отдельную геометрическую фигуру в пределах диаграммы. Существует несколько предопределенных объектов Diagram, доступных пользовате­ лю : Cycle, Target, Radial, Venn, Pyramid и-OrgChart . Важно обратить внимание, что объект Diagram принадлежит объекту Shape ( s) , ко­ торый, в свою очередь, принадлежит объекту Worksheet. Следовательно, для добавле­ ния объекта Diagram в существующий лист необходимо использовать метод AddDia- gram коллекции Shapes . [A9.~Jxe]h~lf. ·Ш'iё1P~@:.Kfi:<1R~~a,9-LщliJffispP,i;'9,gj,-;ёlJJIOi.:9:~h;~;:f~; ",~',~~~ ' -4Iш::- ··~.9iП,,_,,,,,,,,,,",,,,.,",\Ш""' Если результат выполнения предыдущего кода присвоить объектной переменной, код будет возвращать объект Shape. Для добавления геометрических фигур в объект Dia- gram можно воспользов~ться объектом DiagramNode в пределах объекта Shape. ~ct".1:x.~sn..§i"~t:"":$naR~~:J iТ~~I5IaЯ"f§mN6de·:cflJJ. Fe:,i,ъ :·;.,.аСЫi,?Сiё ·"'"'"""'-~-"'--·--
756 Приложение А Для обращения к свойствам и методам самого oбъeктaDiagram (эти свойства и мето­ ды показаны ниже) необходимо обращаться к oбъeктyDiagram через объект Shape. fA.'C:tlV~sfie'et. shapёsTf> ·: й·аg-rат ~ :Noд.es' (1 г. тeX:t'sflape'?F'П Гвaciccoiar , ":_ ' ·ч l?cЬ:~ilJ:e,c:o).or, .z .. J7,, · Общие свойства объекта Diagram Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Diagram Имя Тип возвращае- Описание мого значения AutoFormat MsoTriState AutoLayout MsoTriState Nodes DiagramNodes Reverse MsoTriState Устанавливает/возвращает состояние автоматического форматирования Устанавливает/возвращает константу, которая определяет автоматическое размещение узлов и соединительных ли­ ний в пределах диаграммы Только чтение. Возвращает объект DiagramNodes, кота- , рый содержит простой список всех узлов из указанной диаграммы Устанавливает/возвращает необходимость обратного по­ рядка перечисления узлов Туре MsoDiagramType . Только чтение . Возвращает тип диаграммы Методы объекта Diagram Имя Тип возвращае- Параметры мого значения Convert Пример: объекта Diagram Туре As Mso DiagramType Описание Выполняет преобразование ;гекущей диа­ граммы в другую диаграмму Следующая подпрограмма создает диаграмму, добавляет несколько геометрических фигур (узлов) и выполняет форматирование . Цвет геометрической фигуры и имя шриф­ та извлекаются из таблицы на листе, что позволяет легко экспериментировать с внешним видом диаграммы. 1 На момент написания этой книги любая попытка программного добавления текста в узлы объекта Diagram приводила к ошибке . 'sU.15' ·c::rea:.t:ebfaQ'ra.тrт'"":::··· -.~, ··• ·•· ' ..• УJ;(алИть существующи:е . геометриЧ-есКие rо~а,ндной кнопкИ) ' ": ' n· Error :Res\iдle Next , _ · · ._F,9:i,:Jj:as;J1 "0,,R:i..ё19'.Eё1J.1!§1:1.~P"' <?~":rл :,w!c,s.R:i29':i:-ё1!1\S~i?.hё1P.es~,··
Объектная модель Excel 2003 757 I f obiagrainshap'e~Hasblagrarn ':Гflen ' oDiagram's1i'ape :beiete NextoDiagramshape Error Gото о··· ·· 1 ' Отключить об~ов.irение' экрана · A ppl ication.ScreenUpdating ·= False У' . Создать объект Diagram · Set ·ьDiagramShape = ' wks,Diagrams. Shapes; '. ~~AddD~agram (msoDiagran;orgChart, 2, 2, 3 '2so) ~· ' Удалить прозрачный · Фон 1· oDiagrai;iShape ..Fill. VisiЫe msoTrue !· 1 t· t 1 ' Создатq узел верхнего уров ня set oDiagramNode = ·oDiagramshape . Diagr.amNode. Children , AddNode With . oDiagramNode ~'' -' ~< . ' Выnолнить форматирование узла · верхнег9 уровня wi th . shape . . AutoshapeType = msoShapeBevel /~ TextFrame .' Characi:ers. Font. Name wksbiagram:s.Range(sRANGE_LEVELS) .Cells(l, 2) .Text . :Fill . ForeColor. SchemeColor = :_ · ·· wksDiagr.ams. Rarige ( sRANGE_LEVELS ) .·Cells.(1 , 3) . Value En.d With , · · Создать дочерний узел под узлом верхнего уровня set oDiagramNodeChild = . Children .AddNode • ' · ·выполнить форматирование дочернего узла W.i th .oDiagramNodeChild .shape . TextFrame.Characters.Font.Name ",, wksDiagrams' Range ( SRANG'E _LEVELS) . shape.Fill.ForeColor.SchemeColor = _ . wksDiagrams, Range ( sRANGE_LEVELS) "Cells ( 2, 3) . Value . End With ' ., . . ' · !?а'зместить два дочерних узла под дочерним уз.;rом ' узла верхнего уровня Rorlcount=1То2 . . . With oDiagrainNodeChild.Children.AddNode .shape.TextFrame . Characters.Font.Name wksDiagrams .Range (sRANGE_LEVELS) ..с'ел, s (3, 2) . Text . Shape: Fill. ForeColor. schemeColor = С:.. , ,(:( · wksDiagrams.Range(sRANGE_LEVELS) .Cells(3, 3) . Value End· With . .. Next 1Coun't ' Соsдать еще один дочерний · узел ниже узла верхнего уровня set . oDiagramNodeChild = . C hi l dren.. AddNode With .oDiagramNodeChild .Shape .TextFrame . Characters.Font.Name · wksDiagrams , Range ( sRANGE_LEVELS) . Cell s ( 2, 2) . Text . Shape. Fill. ForeColor . SchemeC,o l or = _ wksDiagrams:Range(sRANGE_LEVELS) .Cells(2, 3) .Value with ~ Добавить два дочерних узла ниже этого дочернего узла ' ( он находится на один уровень ниже узла верхнего уровня ) Fq~ _. l<;qi,i_цt_ =: , 1 То ..2.- ·- ·· ,,,, ,,",,,"' ,, ,,
758 Приложение А ··· П.h- obJ..agrariiN6i:1echi id.. ch.i idreii. Md.Noeie· ., . Shape.TextFrame.Characters.Font.Narne wksDiagrarns. Range ( sRANGE_LEVELS) .· Cells ( 3, 2) . Text .Shape.Fill.ForeColor.SchemeColor = _ wksDiagrams.Range(sRANGE_LEVELS) .Cells(З, 3) .Value · End With · .; Next . lCount iEnd · with ~; (En)i . ~u}? Объект DiagramNode и коллекция DiagramNodes Объект DiagrarnNode представляет одну геометрическую фигуру внутри объекта Diagram. Геометрические узлы ниже определенного узла являются дочерними. Для до­ бавления узлов ниже текущего узла воспоЛьзуйтесь методом AddNode свойства Chil - dren этого объекта. · Коллекция DiagrarnNodes содержит все объекты Node из объекта Diagram. Каждый объект Node соответствует геометрической фигуре внутри oбъeктaDiagram. Общие свойства коллекции DiagramNodes Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства коллекции DiagramNodes Имя Count Тип возвращае- Описание мого значения Long Только чтение. Возвращает количество объектов внутри коллекции Методы коллекции DiagramNodes Имя I tem SelectAll Тип возвращае- Параметры Описание мого значения \" Diagram Node Index As Variant Возвращает один объект из кол­ лекции Выделяет все геометрические фи­ гуры в коллекции Общие свойства объекта DiagramNode Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта DiagramNode Имя Children Diagram Тип возвращае- Описание мого значения DiagramNode- Children IMsoDiagram Только чтение. Возвращает коллекцию дочерних узлов для конкретного узла Только чтение. Возвращает представление диаграммы
Имя Тип возвращае- мого значения Layout MsoOrgChart- LayoutType Root DiagramNode Shape Shape TextShape Shape Объектная модель Excel 2003 759 Описание Устанавливает/возвращает стиль форматирования до­ черних узлов организационной диаграммы Только чтение. Возвращает корень корневого узле: диа­ граммы Только чтение. Возвращает геометрическую фигуру, свя­ занную с указанным комментарием, узлом диаграммы или гиперссылкой Только чтение . Возвращает геометрическую фигуру тек­ стового поля, связанного с узлом диаграммы Методы объекта DiagramNode Имя AddNode CloneNode Delete MoveNode NextNode PrevNode ReplaceNode SwapNode Transfer- Children Тип возвращае- Параметры мого значения DiagramNode DiagramNode DiagramNode DiagramNode [pos As MsoRela- tiveNodePosi tion], [nodeType As MsoDia - gramNodeType] copyChildren As Boo - lean, [pTargetNode As DiagramNode], [pos As MsoRelativeNode- Posi tion] pTargetNode As Diagram- Node, pos As MsoRela- · tiveNodePosition pTargetNode As Diagram- Node pTargetNode As Diagram- Node , [ swapChildren As Boolean ] pReceiving Node As DiagramNode Описание Создает узел диаграммы и возвращает объект Dia- gramNode, представляю­ щий созданный узел Клонирует узел диаграммы и возвращает объект Dia- gramNode, представляю­ щий клонированный узел Удаляет объект Перемещает узел диаграм­ мы и все его дочерние узлы в пределах диаграммы Выделяет следующий узел диаграммы в последова­ тельности узлов и возвра­ щает объект Diagram- Node, представляющий выделенный узел Возвращает предыдущий узел диаграммы в коллек­ ции узлов диаграммы Заменяет целевой узел диаграммы исходным Меняет местами целевой и исходный узлы диаграммы Дочерние узлы исходной диаграммы перемещаются в получающий узел
760 Приложение А Объект DiagramNodeChildren Объект DiagramNodeChildren представляет родительскую геометр~ческую форму, расположенную на один уровень ниже объекта DiagramNode. Каждый объект Diagraп\­ NodeChildren сам по себе является объектом DiagramNode. Если объект Diagrarn- NodeChildren имеет дочерние узлы ниже по иерархии, _каждый Из этих узлов также может рассматриваться, как объект DiagramNodeChildren. Общие свойства объекта DiagramNodeChildren Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта DiagramNodeChildren Имя Тип возвращае- Описание мого значения Count Long FirstChild DiagramNode LastChild DiagramNode Только чтение. Возвращает количество объектов в кол­ лекции Только чтение. Возвращает первый дочерний узел роди­ тельского узла Только чтение . Возвращает последний дочерний узел ро­ дительского узла Методы объекта DiagramNodeChildren Имя AddNode SelectAll Тип возвращае- Параметры мого значения DiagramNode \ [Index ], [nodeType As MsoDiagramNodeType] · Объект Dialog и коллекция Dialogs Описание Создает новый объект DiagramNode Выделяет все геометрические фигуры в пределах коллекции Коллекция Dialogs предоставляет доступ к списку всех встроенных диалоговых окон Excel. Константы XlBuil tinDialog используются для получения доступа к от­ дельным объектам Dialog в пределах коллекции Dialogs. Объект Dtalog представля­ ет одно встроенное диалоговое окно Excel. Каждый объект Dialog обладает собствен­ ными свойствами в зависимости от типа диалогового окна. Кроме типичных атрибутов , код;rекция Dialogs предостав~яет свойство Count, возвращающее количество объектов Dialog в коллекции. Общие свойства объекта Dialog Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 761 Методы объекта Dialog Имя Тип возвращае- Параметры Описание мого значения Show · вoolean [Argl], [Arg2], . . . [Arg30] Отображает диалоговое окно с использо­ ванием указанных параметров. Если поль­ зователь щелкает на кнопке ОК, метод ' возвращает значение True. Если пользо­ ватель щелкает на кнопке Отмена (Сапсеl), метод возвращает значение False. Список передаваемых аргументов зависит от типа диалогового окна Пример: объект Dia/og и коллекция Dialogs Объект DisplayUnitLabel Объект DisplayUni tLabel содержит весь текст и форматирование, связанные с метками единиц измерения на осях диаграмм. Например, если значения на осях изме­ ряются в миллионах, отображение таких больших чисел может привести к переполне­ нию экранного пространства ненужной информацией. Применение такой метки едини­ цы измерения, как "Миллион", позвол ~т использовать меньшие числа. Для этого объек­ та родительским является объект Axis. Этот объект обычно используется вместе со свойством HasDisplayUni t родительского объектаАхis. Общие свойства объекта DisplayUnitLabel Определения свойств Application, Creator и Parent приводились в начале при ­ ложения. Свойства объекта DisplayUnitLabel Имя AutoScale - Font Border Caption Characters Fill Font Тип возвращае- мого значения Variant Border String Characters ChartFill- Format Font Описание Устанавливает/возвращает необход.имость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Только чтение . Возвращает свойства граниЦы вокруг мет­ ки единицы измерения Устанавливает/возвращает текст метки единицы измерения . Только чтение . Параметры: [ Start J, [Length] . Возвра­ щает объект, содержащий все символы метки единицы измерения. Этот объект позволяет управлять отдельными символами метки Только чтение. Возвращает объект, содержащий параметры форматирования заливки для метки единицы измерения Только чтение. Возвращает объект, содержащий парамет­ ры шрифта для метки единицы измерения "
762 Приложение А Имя Тип возвращае- Описание мого значения Horizontal- Variant Alignment Interior Interior Left DouЫe Name String Orientation . variant ReadingOrder Long Shadow Text Тор Vertical- Alignment Boolean String DouЫe Variant Устанавливает/возвращает параметры горизонтального выравнивания метки единицы измерения. Для установки этого свойства используются константы xlAlign Только чтение. Возвращает объект, содержащий парамет­ ры форматирования области текста метки единицы изме­ рения (например, внутреннего цвета) Устанавливает/возвращает расстояние от левого края текстовой области метки единицы измерения до левого края диаграммы Только чтение. Возвращает имя объекта DisplayUni t- Label ' Устанавливает/возвращает угол отображения текста в метке единицы измерения . Значение свойства может указываться в градусах (в диапазоне от -90 до 90) или с помощью одной из констант XlOrientation Устанавливает/возвращает направление чтения текста (слева направо или справа налево) . Это свойство может использоваться с некоторыми языками пользовательского интерфейса Устанавливает/возвращает необходимость создания эф­ фекта тени для метки единицы измерения Устанавливает/возвращает текст метки единицы измерения Устанавливает/возвращает расстояние от верхнего края области текста метки единицы измерения до верхнего края диаграммы Устанавливает/возвращает параметры вертикального вы­ равнивания метки единицы измерения. Для установки это­ го свойства можно воспользоваться константами xlVAlign Методы объекта DisplayUnitLabel Имя Тип возвращае- Параметры Описание мого значения Delete Variant Удаляет метку единицы измерения Select Variant Выделяет метку единицы измерения на диаграмме Пример: объект DisplayUnitLabel lsuJГ'Ad.CiunTtLaБ'eГГГ· ,,,., "" ' """:·~·wр~Ч'''''Г~~·~":~"" ! ,, Dim oDUL As. bis~layUni~Label .:,, . • ' .Отформат!<[рОвать ось У для отображения With Cha'r;ts(l) ': Axes (xlValue) > .DisplayUnit =· xlThousandii(· " · . HasDi$playUnitLabel =· тrue •» ЛолуЧить метку единицы :v.rзмерен:Ия Set ' ODЦL = . DisplayUni tLabe.1 End With .
Объектная модель Excel 2003 763 Объект DownBars Объект DownBars содержит параметры полос понижения на диаграмме. Для объекта DownBars родительским является объект Chart. Для проверки существования этого объекта можно воспользоваться свойством HasUpDownBars объекта ChartGroup. Общие свойства объекта DownBars Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта DownBars Имя Тип возвращае- ' мого значения Border Border Fill ChartFill- Format Interior Interior Name String Методы объекта DownBars 'описание Только чтение. Возвращает свойства границы вокруг по­ лос понижения Только чтение . Возвращает объект, содержащий парамет­ ры форматирования заливки для полос понижения Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области полос понижения (например, цвета внутренней области) Только чтение. Возвращает имя полос понижения Имя Тип возвращае­ мого значения Параметры Описание Delete Select Variant Variant Объект DropLines Удаляет полосы понижения Выделяет полосы понижения на диаграмме Этот объект содержит информацию о форматировании линий проекции на диаграм­ ме. Для него родительским явля'ется объект ChartGroup. Для проверки существования этого объекта можно воспользоваться свойством HasDropLines объекта ChartGroup. Общие свойства объекта DropLines Определения свойств Application, Creator и Parent приводились в . начале при- ' ложения.
764 Приложение А Свойства объекта DropLines Имя Тип возвращае- Описание мого значения Border Border Только чтение. Возвращает свойства границы вокруг ли­ ний проекции Name String Тоnько чтение. Возвращает имя линий проекции Методы объекта DropLines Имя Тип возвращае- Параметры Описание мого значения Delete Variant Select Variant Пример: объект DropLines suь AddAndFormat.ЬropLiries() Dim oDLine As DropLines ' Показать drop ·liii.es Удаляет линии проекции Выделяет линии проекции на диаr:рамме Charts ( 1) . ChartGtoups ·(1) . HasDropLines = True ' ' Получить объект ·· DropLines Set oDLine = Charts(l) .ChartGroups(l) . DropLines ' Отформатировать линии проекции With oDLine . . . Border . Weigh_t = xlMedium . Border . Linestyle = xlDash .Border.Colorindex = З End wйh • ,,.;,,~. ' Объект Error и коллекция Errors В объекте Error х ранится одна ошибка из ячейки , содержащей несколько потенци­ альных ошибок. В коллекции Errors хранятся все ошибки из такой ячейки . Каждая ячейка может со­ держать несколько ошибок . Эти ошибки аналогичны возможности проверки ошибок из Excel 2003 . Различные ;~П:ы .определяемых в Excel ~шибок' можно обнаружить на вкладке Проверка ошибок (Епоr Checking) в диалоговом окне Сервисс:::>Параметры (Тооlsс:::>Пар~метры) . В прило­ жениях Excel содержащие ошибки ячейки выделяются с помощью небольшого треуголь ­ ника в верхнем левом углу. По умолчанию на большинстве систем используется зеленый цвет индикатора , но цвет индикатора можно Изменить с помощью параметра Цвет отображения оLUибок (Епоr Indicatoг Color) на вкладке Проверка ошибок (Епог Check- ing) диалогового окна Параметры (Options). При выделении диапазона, содержащего ошибку, отображается диаграмма в виде зна­ ка восклицания в желтом ромбе . После этого пользователь может щелкнуть на пикто­ грамме · и выбрать способ обработки ошибки в этом диапазоне. Если был выбран способ обработки, например, игнорирование или один из предложенных вариантов, зеленый индикатор исчезает во всех диапазонах, содержащих подобную ошибку. Зеленый инди­ катор в других ячейках указывает на то, что в них присутствуют ошибки других типов . На момент написания этой книги объект коллекции Errors и объект Error не под­ держивали обработку нескольких ошибок в диапазоне из нескольких ячеек (как описано
Объектная модель Excel 2003 765 выше). В справочном руководстве и в руководстве по объектной модели показано, что родительским объектом для коллекции Errors является объект Range. Но каждая по­ пытка обратиться к коллекции Errors из объекта Range, содержащего несколько ячеек, приводит к сообщению об ошибке. Так как любая ячейка может содержать несколько ошибок, в коллекции Errors хранятся все ошибки, содержащиеся в пределах одной ячейки. В результате для обработки ошибок в диапазоне из нескольких ячеек придется перебирать ячейки в цикле. Обратите внимание, что ни коллекция Errors, ни объект Error не содержат счет­ чика или бинарного значения, указывающих на факт существования хотя бы одной ячей­ ки. По этой причине потребуется дополнительный код, который будет перебирать все типы ошибок в каждой интересующей ячейке с проверкой значенияVаluе объекта Er- ror. Если это свойство возвращает значение True , ошибка соответствующего типа при­ сутствует в ячейке. Для пере_бора типов ошибок при определении их наличия можно воспользоваться свойством Itern коллекции Errors. Общие свойства коллекции Errors Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства коллекции Errors Имя Itern Тип возвращае­ мого значения Error Описание Возвращает объект Error, хранящийся в коллекции Errors Общие свойства объекта Error Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Error Имя Ignore Value Тип возвращае­ мого значения Boolean Boolean Объект . ErrorBars Описание Устанавливает/возвращает необходимость обработки оши­ бок в пределах диапазона Только чтение. Подтверждает соответствие всем критериям проli!ерки · В объекте ErrorBars хранятся параметры форматирования полос ошибки для диа­ граммы. Для этого объекта родительским является oбъeктSeriesCollection. Общие свойства объекта ErrorBars Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
766 Приложение А Свойства объекта ErrorBars Имя Тип возвращае- Описание мого значения Border Border Только чтение. Возвращает свойства границ вокруг полос ошибки EndStyle XlEndStyleCap Устанавливает/возвращает стиль, который используется для окончаний полос ошибки Narne String Только чтение . Возвращает имя полос ошибки Методы объекта ErrorBars · Имя Тип возвращае- Параметры Описание мого значения ClearForrnats Variant Delete Select Variant Variant Пример: объект ErrorBars ! suЬ"""'"'ЛCfdA!ld:F'ormaE'ErroFвars' ( J~ f .· -Dii;ri oSer As seri~s··· · ; f, .Diщ . oErrBars As .(irrorJЗars l ·. ' " Добавляет пол,осы ошибки к первой Сбрасывает форматирование полос ошибки Удаляет полосы ошибки Выделяет полосы ошибки на диаграмме r (На урОВНе +f:,-. 10% ' ОТ ЗНаЧеНИЯ) ' sёt' oser = Charts (1) . seriesCollection ( 1) · .~. .. oser. Ецоrваr ~xlY ' · xlErrorBarinclU:deBoth, ~ ,,· · 'xlErrorвarTypePe.r;cent, 10 ~·• '.•полУчить >ot'Yi,e)'(т ' ErrorBars [' Set oErrВ'ars ., ,;., oSer. ErrorBars " ~~ .. ' ' !. устаноБит( фо. р&iа-т11ров. ание · ~:юлЬс .ошибки [ · • Wi th· oErrвars .. .. . · ~ . . Border. Weight = x1Thick ~· . ]3order. LineStyle d .· xlCon t,inuous · . Border .. Colorindex ;= - 7 .EndStyle = xlCap ~. ~.t:ёi . With ' l?ш:!"е.Но.............- . Коллекция ErrorCheckingOptions Представляет все параметры, доступные на вкладке Проверка ошибок (Error Check- ing) в диалоговом окне Сервис~Параметры (Tools~Options). Свойство Backgroup- Checking этого объекта позволяет скрыть все индикаторы ошибок (небольшой тре­ угольник в верхнем правом углу ячейки). Свойства этого объекта позволяют сообщить Excel тип необходимых проверок на на­ личие ошибок. На объект ErrorCheckingOptions можно ссылаться через объект Application, а значит изменение его свойств затронет все открытые окна. Общие свойства коллекции ErrorCheckingOptions Определения свойств Application, Creator и Parent приводились в начале при­ ложения .
Объектная модель Excel 2003 767 Свойства коллекции ErrorCheckingOptions Имя Background- Checking EmptyCell- Ref erences Evaluateтo- Error Inconsis - tentFormula Indicator- Colorindex ListData- Validation NшnЬerAsText OmittedCells TextDate Unlocked- Formula- Cells Тип возвращае- мого значения Boolean Boolean Boolean Boolean XlColorindex Boolean Boolean Boolean Boolean Boolean Описание Устанавливает/возвращает необходимость фоновой про­ верки наличия ошибок. Определяет, отображается ли кнопка автоматического исправления возле содержащей ошибку ячейки Устанавливает/возвращает необходимость проверки на­ личия ошибок для ячеек, содержащих формулу, которая ссылается на пустую ячейку Устанавливает/возвращает необходимость проверки на­ личия ошибок для ячеек, значение которых оценивается, как ошибочное Устанавливает/возвращает необходимость проверки на­ личия ошибок в ячейках, содержащих противоречивую формулу Устанавливает/возвращает цвет индикатора ошибки Возвращает значение True, если в списке включена п~о­ верка действительности данных Устанавливает/возвращает необходимость проверки на­ личия ошибок для чисел, записанных в текстовой форме Устанавливает/возвращает необходимость проверки на­ личия ошибок в ячейках, содержащих формулы, которые ссылаются на диапазон с пропущенными соседними ячей­ ками (которые можно включить в диапазон) Устанавливает/возвращает необходимость проверки на­ личия ошибок в ячейках, которые содержат текстовое представление даты с двумя цифрами для записи года Устанавливает/возвращает необходимость проверки на­ личия ошибок для разблокированных ячеек, содержащих формулу Пример: коллекция ErrorCheckingOptions В следующей подпрограмме для установки параметров проверки наличия ошибок ис­ пользуется таблица на листе. [s'uь-Se f'Errьrche6k'ingopfioiis ()"' .. r> _У--.':~. . .·· . . !' F~ ~. ,, J iч; >::- ~~ rngSet tings 1\.S Range· \<Setting As Variant .. ' ' ·; !1айти начало таблицы Settings Set rngSettings =. wksErrors : Range("E,rrorSettings") "« '1# >f :-.· . . ·, . ' , riepeбpat.r~ ' )Зсе свойства ErrorCheckirig' и . ' , установить · их в соответствиями: со значения.ми в таблице. · Wi th,. Application:.. ErrorChecкingOptions •• '· :с: ,: : . ' ;< •: _~;.,,. . ' ..• ' ..·._ ·.· ' -:,_ У•: _' ,,. vset ting = rngS~ttings. Cells ( 1, 2) . Val ue .. If '. Len(vsetting) And (vSetting = True . or ' vSetting . :.. Ba.·ckgroundChecking =' vSet t ing ;: " ~.:ц.~(Ч . .
768 Приложение А vSetting = rngSettings.Cells(2, 2) .Value If Len(vSetting) And (vSetting = True Or vSetting .EvaluateToError = vSetting End If vsetting rngSettings.Cells(З, 2) .Value If Len(vSetting) And (vSetting = True Or vSetting .TextDate = vSetting End If vSetting rngSettings.Cells(4, 2) .Value If Len(vSetting) And (vSetting True Or vSetting .NumЬerAsText = vSetting End If vSetting rngSettings.Cells(5, 2) .Value If Len(vSetting) And (vSetting = True Or vSetting .InconsistentFormula = VSetting End If vSetting = rngSettings.Cells(б, 2) .Value If Len(vSetting) iшd (vSetting = True Or vSetting . Omi .ttedCells vSetting End If vsetting = rngSettings.Cells(7, 2) .Value If Len(vSet;:ting) And (vSetting = True Or vSetting . Unlo.ckedFormulaCells = vSetting End If vSetting = rngSettings.Cells(8, 2) .Value 'I f Len·(vSetting) And (vSetting = True Or vSetting .EmptyCellReferences = vsetting End If vSetting ~ rngSettings.Cells(9, 2) .Value If LCase(vSetting) = "xlcolorindexautomatic" Then .IndicatorColorindex = xlColorindexAutomatic False) Then False) Then False} False) False) Then. False) Then False) Elseif Len(vSetting) And (vSetting > 1 And vsetting < 100) .In:dicatorColorindex = vsetting End If End With ' Иногда . индикаторы не отображаются. ' после завершения .подпрограммы. ' В. таком случае необходимо обновить Application. ScreenUpdating True . iEnc1 S1,11:?_ ;" •• _ " -~ .......",,..••. Объе.кт FillFormat содержимое экрана. Объект FillFormat описывает эффекты заливки, доступные для геометрических фигур. Например, объект FillFormat определяет сплошную, текстурированную и мо· заичную заливку родительской геометрической фигуры. Получить доступ к объекту FillFormat можно только через объект Shape.
Объектная модель Excel 2003 769 Об щие свойства объекта FillFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства FillFormat Имя Тип возвращае- мого значения BackColor ColorFormat ForeCol or ColorFormat Gradient- MsoGradient- Co lorType Col o r -r;ype Gradient- Single Degree Gradient- MsoGradient - Style Style Gradient - I nteger Variant Patt e rn MsoPa tte rn- Туре Preset - MsoPreset - GradientТype GradientType Preset - Mso Pre set- Textu r e Texture Tex t u reNa me String T extureType MsoT extureType Transparency Singl e Туре · MsoFillType VisiЫe MsoTriState Методы объекта FillFormat Описание Только чтение. Возвращает цвет фона в виде объекта ColorFormat Только чтение. Возвращает основной. цвет в виде объекта ColorFormat Только чтение. Возвращает используемый тип градиент­ ной заливки цветом Только чтение . Возвращает яркость градиентной заливки Только чтение. Возвращает ориентацию используемого градиента Только чтение . Возвращает · используемый вариант гради­ ентной заливки из центра Только чтение. Воз вращает шаблон заливки, если исполь­ зуется этот тип заливки Только чтение. Возвращает тип применяемой градиентной заливки Только чтение . Возвращает встроенную текстуру , которая используется для залив ки Только чтение. Возвращает имя собственной текстуры, которая используется для заливки 1 Только чтение. Возвращает тип используемой текстуры : собственная, встроенная или смешанная Устанавливает/возвращает степень прозрачности залив­ ки . Принимает значения в диапазоне от О (непрозрачная) до 1 (полностью прозрачная) Только чтение. Воз вращает тип используемо й заливки: текстура, градиент , сплошной цвет, фон (в Excel не при­ меняется), изображение или смешанный Устанавливает/возвращает видимость параметров залив­ к~ в родительской геометрической фигуре Имя Тип возвращае- Параметры мого значения . Описание OneColor - GradieRt Patterned Style As MsoGradi - entSty le, Variant As I n teger , Degree as Singl e Pattern As MsoPatternType Устан а вливает стил ь , вариант и степень градиентной залив­ ки одним цветом Устанавливает шаблон заливки
770 Приложение А Имя Тип возвращае- Параметры Preset- Gradient Preset- Textured Solid TwoColor- Gradient UserPicture UserTextured мого значения Пример: объект Fil/Format 1 ts)115:' fr6riii.atshap e( J: . Style As MsoGradient- Style, Variant As Integer, Preset- GradientТype As MsoPresetGradientType PresetTexture As MsoPresetTexture . Style As MsoGradi~ entStyle, Variant As Integer PictureFile As String TextureFile As String ~.'>-'. Описание Выбирает стиль , вариант и встроенный тип градиента, используемые для градиент­ ной заливки Устанавливает встроенную текстуру для заливки Устанавливает цвет для сплошной заливки Устанавливает стиль двух­ цветной градиентной заливки Выбирает изображение для заливки из файла Picture- File Устанавливает собственную текстуру для заливки . Тексту­ ра выбирается из файла тex­ tureFi le ~ : J?im ofF. ..лs iПiFormat , ·: ~ , ПО.ДУ~1;1?:'Ь · ·форматирОВаf!~tе Заливки первой rеоме'трической j" set oFF = ·ActiveSheet.Shapes(l) :Fill , ti ., . '> Отф.орматирqвать ' геьмет.ричес1'Ую фигуру 1·· .With·. 6FF 1: •• • ;:. ·• ;,·• · ' 't · ·> ··~·· ·.Tw oCo ~orG rad i,e ~t msoGradientFromCorner, 1 .' . EoreColor. SchemeColor .= · 3 · • >' ~ .вackcolor ~ schemecolor = s· · ~Enq With· ·. · • "· ~. ti;;ig, .$μf>J.",~ .. ::;, . Объект Filter и коллекция Filters В коллекции Fil ters хранятся все фильтры, связанные с родительским объектом AutoFilter. Каждый объект Filter определяет один фильтр для одного столбца диа­ пазона с установленным автофильтром. Родительским объектом этой коллекции· являет­ ся oбъeкт AutoFilter. Кроме типичных атрибутов коллекции, коллекция Fil ters предоставляет еще одно свойство. Свойство Count возвращает количество объектов Filter', которые хранятся в коллекции. Общие свойства объекта Filter Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 771 Свойства объекта Filter Имя Criterial Criteria2 On Operator Тип возвращае- Описание мого значения Variant Variant Только чтение. Возвращает первый определенный для фильтра критер1:1й (например, ">=5") Только чтение. Возвращает второй критерий для фильтра, если такой критерий определен Boolean Только чтение. Возвращает информацию об использова­ нии фильтра в данный момент XlAutoFilter- Только чтение. Возвращает тип оператора сортировки, Operator определенного для фильтра (например, xlToplOiterns) Пример: объект Filter и коллекция Filters Пример использования объекта Filter и коллекции Filtеrs . приводился в разделе, посвященном объекту AutoFormat. Объект Floor Объект Floor содержит параметры форм атиров ания базового уровня трехмерной диаграммы. Родительским для этого объекта является объектСhаrt. Общие свойства ,объекта Floor Определения свойств Application, C:1ceator и Parent приводились в начале при­ ложения . Свойства объекта Floor Имя Тип возвращае- Описание мого значения Border Fill Border ChartFill- Format Interior I n terior Narne String PictureType Variant Методы объекта Floor Только чтение. Возвращает свойства границы вокруг ба­ зового уровня трехмерной диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки базового уровня трехмерной диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области базового уровня диаграммы (например, цвет внутренней области) Только чтение. Возвращает имя объекта Floor Устанавливает/возвращает способ отображения связан­ ного рисунка на базовом уровне трехмерной диаграммы (например, с растягиванием иriи в виде мозаИки). Для ус­ тановки этого свойства используются константы Xl Pictu reType Имя Тип возвращае- Параметры мого значения Описание Clear Forrna t s Variant Сбрасывает форматирова н ие объекта Fl oor
772 Приложение А Имя Тип возвращае- Параметры мого значения Описание Paste Select Variant Пример: объект Floor rsTiЬ' F6r:ffiatf'faЪ±-' ( г · -"- · - Вставляет рисунок из буфера обмена в объекта Floor 1 Выделяет базовый уровень на диаграмме ~- •' Dim ' oFlr' As Floor ш ' ролучитъ ,, обЪект Floor для диаграммы . Set. oF·lr =' Chaтts(1) .Floor· ' · • \ Отформатировать базовый уровень . с использованием ,. ' ~' белого мрамора •, With . oFlr . ' Fill.PresetTe;xtured msoтextureWhiteMarЫe Fill. VisiЫe = 'rrue i E~d With , ' . ·, \EI_ld ,cS1J.li,;.,.,#, Объект Font В объекте Font хранятся все атрибуты форматирования, связанные со шрифтами в родительском объекте, включая тип, размер и цвет шрифта. Возможными родитель­ скими объеК1:ами объекта Font могут выступать объекты AxisTitle, Characters, ChartArea,ChartTitle,DataLabel,Legen~LegendEntr~Range, StyleиTick­ etLabel. Коллекция DataLabels также может выступать в роли родительского объекта для объекта Font. Общие свойства объекта Font Определения свойств Application, Creator и Parent приводились в начале при­ . ложен ия. Свойства объекта Font Имя Тип возвращае- Описание мого значения Background Variant Bold Variant Color Variant Colorindex Variant FontStyle Variant Устанавливает/возвращает тип фона, который использу­ ется для текста (xlBackgroundAutomati c, xlBack- groundOpaque и xlBackgroundTransparent). Для ус­ тановки этого свойства применяются константы XlBack- ground. Используется только для текста на диаграммах · Устанавливает/возвращает необходимость использования полужирного шрифта Устанавливает/возвращает цвет шрифта. Для создания значения цвета необходимо использовать функцию RGB Устанавливает/возвращает цвет шрифта. Для создания значения цвета используются константы XlColorindex или значение индекса в текущей цветовой палитре Устанавливает/возвращает стиль шрифта (например, " Полужирный")
Объектная модель Excel 2003 773 Имя Тип возвращае- Описание мого значения Italic Variant Name Variant OutlineFont Variant Shadow ' Variant Size Variant Strike- Variant through Subscript Variant Superscript Variant Underline Variant Пример.' объект Font Устанавливает/возвращает необходимость использования курсива Устанавливает/возвращает имя шрифта Устанавливает/возвращает необходимость использования контурного шрифта. Не применяется в операционной сис­ теме Windows Устанавливает/возвращает необходимость использования шрифта с эффектом тени. Не применяется в операцион­ ной системе Windows Устанавливает/возвращает размер шрифта Устанавливает/возвращает необходимость использования перечеркнутого шрифта Устанавливает/возвращает необходимость использования шрифта в виде нижнего индекса Устанавливает/возвращает необходимость применения шрифта в виде верхнего индекса · Устанавливает/возвращает необходимость применения подчеркнутого шрифта Объект FormatCondition и коллекция FormatConditions В коллекции FoпnatConditions хранится условное форматирование определенного диапазона ячеек. Родительским объектом в данном случае выступает объект Range. В коллекции FoпnatConditions может храниться до трех объектов FoпnatCondition . Каждый объект FoпnatCondition представляет определ енное форматирование , которое применяется при выполнении условия. Кроме стандартных атрибутов, коллекция FoпnatCondi tions предоставляет одно свой­ ство и два метода. Свойство Count возвращает количество объектов FoпnatCondition, ко­ торые хранятся в коллекции. Метод Add может использоваться для добавления в коллекцию условия форматирования. При этом необходимо указать значение параметра Туре (для уста­ новки этого параметра используются константы XlFoпnatConditionТype). Условие опре­ деляется с помощью параметровОреrаtоr, Foпnulal и Foпnula2 .
774 Приложение А Имя Count Add Delete Тип возвращае- Описание мого значения Long Format- Condi tion Только чтение. Возвращает количество объектов, храня­ щихся в коллекции Метод. Параметры: Туре As XlFormatCondi tionType, [Operator], [Formulal J, (Formula2 J . Добавляет объ­ ект FormatCondition в коллекцию Метод . Удаляет объект Formatcondition из коллекции Общие свойства объекта FormatCondition Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта FormatCondition Имя Borders Font Formulal Formula2 Interior Operator Туре Тип возвращае- Описание мого значения Borders Font String String Interior Long Long Только чтение. Возвращает коллекцию с отдельными ат­ рибутами границ для условия форматирования Только чтение. Возвращает объект , содержащий пара­ метры шрифта для условия форматирования Только чтение. Возвращает значение ячейки, выражение или формулу, которые должны быть равны True/False. Если формула или выражение равны значению тrue, форматирование применяется к ячейке Только чтение. Возвращает значение ячейки, выражение или формулу, которые должны быть равны значениям True/False. Это свойство действительно только в случае, если параметр Operator установлен в значе­ ние xlBetween и ли xlNotBetween Только чтение. Возвращает объект, содержащий пара­ метры форматирования внутренней области условия форматирования (например, цвета внутренней области) Только чтение . Возвращает оператор, который применя­ ется к свойствам Formulal и Formula2 . Значения этого свойства совпадают со значениями констант XlFormat- ConditionOperator Только чтение. Возвращает необходимость применения форматирования из объекта Formatcondi tion в зави­ симости от значения ячейки или в зависимости от форму­ лы . Значения этого свойства совпадают со значениями констант XlForma tcondi tionType
Объектная модель Excel 2003 775 Методы объекта FormatCondition Имя Delete Modify Тип возвращае- Параметры мого значения Туре As XlForrnat ConditionType, [Operator], [Forrnulal], [Forrnula2] Описание Удаляет условие форматирования Единственный способ модифика­ ции условия форматирования, так как все свойства объекта предна­ значены только для чтения Пример: объект FormatCondition и коллекция FormatConditions Объект FreeformBuilder Объект FreeformВuilder используется родительским объектом Shape для создания новых геометрических фигур произвольной формы. Для получения oбъeктaFreeforrn­ Builder применяется метод BuildFreeforrn объекта Shape. Общие свойства FreeformBuilder Определения свойств Application, Creator и Parent приводились в начале при· ложения.
776 Приложение А Методы объекта FreeformBuilder Имя AddNodes Convert- ToShape Тип возвращае- Параметры мого значения Shape SegmentType As MsoS egme n tType , Edi t ingType As MsoEd iti ngType , Xl As Single , Yl As Single, [Х2] , [У2], [ХЗ], [УЗ] Пример: объект FreeformBuilder rsu:Б"1&аk:едrъьсг-··"""""~~".",:7 ''··· ~ra.loFFB As F reefo rmBy.i l der · Описание Добавляет точку к геометрической ф и гуре , которая рисуется в данный мо мент Добавляемый узел связыва­ ется линией с п оследним добавл ен­ ны м узлом. Параметр SegmentType при меняется для описания типа ли ­ н ии между узлами . Пара м етры Xl, У~, Х2, У2 , ХЗ, У З и спользуются для определени я положения добавляе­ м ого узла. Координаты отсчитывают­ ся от верхнего левого угла документа Выполняет преобразование добав­ ленных узлов в объект Shape :; со:Ьд'ать"; новый объект FreeformBuilder ....: ::t :.i:?FFв . '~. Activ~sh.eet. Shape s .Вui l dFree form (ms o EditingCor n er, ;:• , добавить линии · в пр оизвольную фигуру "With oFFB . · ,·~'. AddNodes mso~egmeц.tLine ; щsC>EditingAuto, 1 00 , 2 00 · .·ApdNod.es msoSegmeritCurv e , ms o Edi t i ngCorner, _ 200; 200.. . :AddN,ode9 . ms:oSegmeri t :Ц:ne, msoEdi t ingAu1:;o, 200, 300 t ' . ~d~;1Nodes, msoSegmentLine , m1:'oE.di t ingAuto, 100 , ЗОО ~ ·.· ·' · 'Преобразовать узлы в геометрич ескую фигуру l:.i' . .:convertтoshape. ;н.. ' End With · [~I}S!;i§~~~~\~~~~-~~~~-- ""-«*--~N ".><~-·=-~- Объект Graphic Этот объект представляет изображение, которое можно разместить в одной из шести точек верхнего или нижнего колонтитула страницы. Этот объект одновременно является аналогом кнопок Вставить рисунок и Форматировать рисунок в диалоговых. окнах Верхний колонтитул (Header) и Н ижний колонтитул (Fo oter) в диалоговом окне Параметры страницы (P age Se tup) . Важно обратить внимание, что изменение свойств этого объекта не приведет к добав­ лению объекта в область верхнего или нижнего колонтитула страницы . Для вывода ри­ сунка в одну из областей колонтитулов необходимо добавить строку "&G" ( с помощью ко­ да VВА). Общие свойства объекта Graphic Определения свойств Application , Cr e at or и Par7nt приводились в начале при­ ложения.
Объектная модель Excel 2003 777 Свойства объекта Graphic Имя Brightness ColorType Contrast · CropBottom CropLeft CropRight CropTop Filename Height LockAspect- Ratio Width Тип возвращае- Описание мого значения Single Устанавливает/возвращает яркость указанного рисунка. Значение этого свойства должно находиться в диапазоне от О.О (минимальная яркость) до 1.0 (максимальная яркость) MsoPictureCol Устанавливает/возвращает преобразование цвета, кото- оrТуре рое применяется к указанному рисунку или объекту OLE Single Устанавливает/возвращает контраст указанного рисунка. Значение этого свойства должно находиться в диапазоне от О.О (минимальный контраст) до 1.0 (максимальный кон- траст) ' Single Устанавливает/возвращает количество точек, которые вырезаются из нижней части указанного рисунка или объ­ екта OLE Single Устанавливает/возвращает количество точек, которые вырезаются из левой части указанного рисунка или объек­ та OLE Single Устанавливает/возвращает количество точек, которые вырезаются из правой части указанного рисунка или объ­ екта OLE Single Устанавливает/возвращает количество точек, которые вырезаются из верхней части рисунка или объекта OLE String Устанавливает/возвращает адрес URL или путь к указан­ . ному объекту Single Устанавливает/возвращает высоту объекта MsoтriState Устанавливает/возвращает необходимость сохранения про­ порций при изменении размера геометрической фигуры Single Устанавливает/возвращает ширину объекта Пример: объект Graphic Следующая подпрограмма выдает запрос на выбор графического файла. Выбранный · рисунок помещается в верхний колонтитул активного листа в виде водяного знака. Раз­ мер рисунка меняется в соответствии с размерами страницы .... ". . ". ·• · ." .. ". "--···---.---·~--------··· ·""·- .""" сэг····--· >"""""""''' jS-qp·-.AddWat:~:r:mark () ··· · ·.. ! •· . Dim . oSheet· As Object . J?:im _:>File As string :~ :~
778 Приложение А · • f:> аЭре.ШитЪ ' Бьiбор только однОJ:;о.' Фа йла · .AllowMultiSelect = False · · · ' ' Очистить фильтры и создать .· собствен~ый фильтр /Переключиться на собственный фильтр перед · ' . о'тобраЖением диа11 о гового окна • . .Filters.Add "All Pictures", " * : gif; /·o 'jpg; *.jpeg; *.bmp; ~.wmf; *': gif;~.emf;*.diJ?;* . jfif;*.jpe",1 · .' Разрешить . ~редварительный просмотр · рисунков .IniJ:ialView ': ' цisoFiJeDial6gViewТhuniЬnail riоказать диалоговое окно . -1 означает ~ что лользователь)'Jе'щелкал на If" .'Show ·= 71 Theh · • ' Сохранить имя выбранного файла sFile · = . selecteditenis (1 J ' ·', - ,_ ' ; . ВставИть рису !:Юк в верх ний · коЛонтИ тул Иi th ·:osheet. PageSetup · · . With ; Centerнea,derPicture · . ; . .FHename .:;: · sFil~e . .. . . · .. ColorType ;,, · ms.oPictufeWat~rmar~ . Ьbc);<Aspe·ctRatio =·тrue ··..· ·. заподнять всю Объект Gridlines В этом объекте хранятся параметры форматирования, связанные с основными и до­ полнительными направляющими линиями осей диаграммы. Направляющие линии яв­ ляются расширением отметок на оси, видимым на фоне диаграммы. Они упрощают пользователям определение значения объекта диаграммы. Родительским для объекта Gridlines является объект Axis. Для проверки действительности объекта и создания объекта Gridlines воспользуйтесь свойствами HasMajorGridlines и HasMinor- Gridlines объектаАхis.
Объектная модель Excel 2003 779 Общие свойства объекта Gridlines Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Gridlines Имя Тип возвращае- Описание мого значения Border Border Name String Методы объекта Gridlines Только чтение. Возвращает свойства границы вокруг на­ правляющих линий Только чтение . Возвращает имя объекта Gridlines Имя Тип возвращае- Параметры Описание мого значения Delete Variant Select Variant Пример: объект Gridliпes Коллекция GroupShapes Удаляет объект Gridlines Выделяет направляющие линии на диаграмме В коллекции GroupShapes хранятся все геометрические фиrуры, составляющие сгруп­ пированную геометрическую фиrуру. Коллекция GroupShapes содержит коллекцию объ­ ектов Shape. Родительским объектом для этой коллекции является объект Shape. Кроме типичных атрибутов коллекции, коллекция GroupShapes предоставляет два свойства. Свойство Count возвращает количество объектов Shape внутри коллекции, а свойство Range возвращает подмножество геометрических фигур из коллек'цииShареs. Объект HiLoLines В объекте HiLoLines хранятся параметры форматирования для линий максимума­ минимума диаграммы. Родительским для объекта HiLoLines является объект Chart- Group . Линии максимума-минимума соединяют точки наибольших и наименьших значе­ ний в группе двумерной линейной диаграммы.
780 Приложение А Общие свойства объекта HiLoLines Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта HiLoLines Имя Тип возвращае- Описание мого значения Border Border Только чтение. Возвращает свойства границы вокруг ли­ ний максимума-минимума Name String Только чтение . Возвращает имя объекта HiLoLines Методы HiLoLines Имя Тип возвращае- • Параметры Описание мого значения Delete Variant Select Variant Пример: объект HiLoLines ~st.iБ'iAdd.AhdI'orrnat:::Н1..-r:o1:rпes о . . Удаляет линии максимума-минимума Выделяет линии максимума-минимума на диаграмме f ,. Diщ . o:HLL As HiLoLines , · !i ,;. ·, Добавить линИи макси~ума-минщ-1ума к первой fCha:.rts (;1)' . C hartGroups'(.l) . HasHiLoLines = Tru~ !.;"· >, Получить oбъeкт , RiLqLines ,,' , .' ! . ,· set ' oHLL := Chart's(l) : chartGroups(l) .HiLoLines ! ~:." f \·Отформатировать JIИНИ~ · . ·· ~ 1;·,Witb oHLL · ' Ч·; < Borde.r .Weight "° ·· xlMediurn . · , . z.·,,: .вord~r.Linestyle . = · xlContinuous ~· · •·••·.'J~order. color!ndex = з. N ,End .with LJ?no:5?:~o;;,{.,.,,".~~. .~;:.;;;J;..~~."-~>..J~:iA:..•: · "~~;:: .""; :~~.~ Объект HPageBreak и коллекция HPageBreaks В коллекции HPageBreak хранятся горизонтальные разрывы страницы из области печати родительского объекта. Каждый объект HPageBreak представляет один горизон­ тальный разрыв страницы в области печати родительского объекта. В качестве роди­ тельских для объекта HPageBreaks могут выступать объекты Worksheet и Chart. Кроме типичных атрибутов, коллекция HPageBreaks предоставляет одно свойство и один метод. Свойство Count возвращает количество объектов HPageBreak в пределах коллекции. Метод Add позволяет добавить в коллекцию объект HPageBreak (при этом на лист добавляется горизонтальный разрыв страницы). МетодАdd принимает параметр Before, описывающий диапазон, над которым вставляется горизонтальный разрыв страницы. Общие свойства объекта HPageBreak Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 781 Свойства объекта HPageBreak Имя Extent Location Туре Тип возвращае- Описание мого значения XlPageBreak- Exten t Range XlPageBreak Только чтение . Возвращает необходимость растягивания горизонтального разрыва страницы на весь экран или только в пределах области печати· Устанавливает/возвращает ячейку, в которой расположен горизонтальный разрыв страницы. Верхний край ячейки совпадает с линией разрыва страницы Устанавливает/возвращает тип разрыва страницы (автоматический или ручной) Методы объекта HPageBreak Имя Delete DragOf f Тип возвращае- Параметры мого значения Direction As XlDirection, Regionindex As Long Описание Удаляет разрыв страницы Вытаскивает разрыв страницы за пределы области печати . Параметр Direction описывает направление перетаскивания разрыва страницы . Параметр Regionin - dex определяет область печати, в которую перетаскивается разрыв страницы Пример: объект HPageBreak и коллекция HPageBreaks Объект Hyperlink и коллекция Hyperlinks Коллекция Hyper l inks предо~тавляет доступ к списку гиперссьvюк на листе или в диапа­ зоне. Каждый объект Hyper l ink соответствует одной гиперссьшке на листе или в диапазоне. Кроме типичных атрибутов, коЛJiекция Hyperlinks предоставляет методы Add и Delete. В качестве значения параметра Anchor метод Add принимает текст или изображение, кото­ рые будут использоваться в качестве ссылки, а в качестве параметра Address метод при­ нимает адрес URL или имя файла. На основе этой информации создается объект Hyper- l ink. Метод Delete удаляет объект Hyperlink из коллекции. Кроме этого, коллекция Hyperlinks предоставляет свойство Count, которое возвращает количество объектов Hy- per l ink в коллекции.
782 Приложение А Общие свойства объекта Hyperlink ОпредJления свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Hyperlink Имя Address EmailSubject Narne Range ScreenTip Shape SubAddress Textтo­ Display Тур е Тип возвращае- Описание мого значения String String String Range String Shape String String Long Устанавливает/возвращает имя файла или адрес URL, на которые ссылается гиперссылка Устанавливает/возвращает тему сообщения электронной почты, если гиперссыл ка указывает на адрес электронной почты Только чтение. Возвращает имя гиперссылки Только чтение . Возвращает полож~ние гиперссылки в до­ кументе Устанавливает/возвращает текст, которы й отображается при наведении указателя мыши на гиперссылку Только чтение . Возвращает геометричес кую фигуру, свя­ занную с гиперссылкой Устанавливает/возвращает точку в документе, связанную с гиперссылкой Устанавливает/возвращает текст, который отображается в виде гиперссылки Устанавливает/возвращает тип объекта Методы объекта Hyperlink Имя AddToFavo- rit es CreateNew- Docuinent Del ete Follow Тип возвращае- Параметры мого значения Filenarne As String , EditNow As Boolean, Overwrite As Boolean [NewWindow], [AddНistory], [ Ex trainfo] , [Method], [Headerinfo] Описание Добавляет значение свойства Address в папку Избранное (Favorites) Создает новый документ. Имя файла (FileName) извлекается из адреса гипер­ ссылки. Для открытия документа в соот­ ветствующем редакторе устанавливает­ ся свойство Edi tNow в значение True . . Для перезаписи существующих докумен­ тов с таким же именем устанавливается свойство Overwri te в значение True Удаляет объект Hyperlink Открывает документ, на который указы­ вает свойство Address. Установка пара­ метра NewWindow в значен ие True по­ зволяет открыть документ в новом окне. Для отображения документа в папке жур­ нала необходимо установить параметр AddHistory в значение True. Параметр мethod позвол яет установить свойство Extrai n fo в значение Get или Post
Объектная модель Excel 2003 783 Пример: объект Hyperlink и коллекция Hyperlinks Объект lnterior В объекте Interior хранятся параметры форматирования внутренней области ро ­ дительскq_го объекта. В качестве родительских объектов могут выступать oбъeктыAxis­ Title, ChartArea, ChartObj ect, ChartTi fle, DataLabel, DownBars, Floor, For- matCondition, Legend, LegendKey, OLEObject, PlotArea, Point, Range, Series, Styl e, Upbars и Walls. Кроме этого, в качестве родительских объектов могут высту­ пать коллекции ChartObj ects, DataLabels и OLEObj ects . Общие свойства объекта Jnte_rior Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта lnterior Имя Color Colorindex Тип возвращае- Описание мого значения Variant Variant Устанавливает/возвращает цвет внутренней области. В данном случае для создания значения цвета использу­ ется функция RGB Устанавливает/возвращает цвет внутренней области. В данном случае используются константы XlColorindex или номер цвета в текущей цветовой палитре
784 Приложение А Имя Тип возвращае- Описание мого значения Inv ertlf- Negative Pattern Variant Variant PatternColor Varia n t Pattern- Colorlndex Variant Пример: объект lпterior :·su.oт~ъ;п;a:t:"Range{ J ~~,,,. Устанавливает/возвращает необходимость ин вертирова ­ ния цвета внутренней области родительского объекта , ес­ ли значение цвета является отрицательны м Устанавливает/возвращает шаблон , которы й использует­ ся для заполнения внутренней области родительского объекта. Для установ ки этого свойства используются кон­ станты XlPatt e rn Устанавливает/возвращает цвет шаблона вн утренней об­ ласти. В данно м случае для создания значе ни я цвета ис­ пользуется фун к ция RGB Устанавливает/возвращает цвет шаблона вн утренней об­ ласти. В данном случае используются константы XlCol- , o r lndex или номер цвета в текущей цветово й пал итре · · Dim·'olnt As :Interior S / По.лучит~;· внутре1;1~юю' обла~ть текуniего выделения ~.. S.et. o+nt =. ·s election.Interior f' Отформатировать внутре1щюю область для использования 1·' ЖелТ'ь,го .; цвет.а ' [.· , х (цв.е т ·Зав11сит от текущей цветовой палитры кни.ги ) . ' with;ыnt. . :. :- •· ·'• ·'. Patt'ern = xlsolid, · _ Co.l orlridex = 6 •§~Q:r;~ik~:Mi~'t!:CC:: <;;~ Объект IRtdServer ' Этот объект предоставляет возможность подключения к серверу данных реального времени (Real-Time Data Seгve 1· - RTD) . Такие серверы позволяют Excel регулярно полу­ чать данные без необходимости создания дополнительного кода. В предыдущих версиях Excel регулярное обновление данных требовало использования метода OnT ime . Сервер данных реального времени отправляет обновленную информацию автоматически . Ин­ тервал времени устанавливается на сервере или с помощью мeтoдa Heartbeatint erval объекта IRTDUpdat e Ev ent . Этот объект по своей сути напоминает функцию листа RTD, которая регулярно ото - бражает данные в ячейке листа . . Обратите внимание, что перед использованием необходимо создать экземпляр этого объекта с помощью ключевого слова Iшplement . . Методы объекта IRtdServer Имя ConnectData Тип возвращае- Параметры мого значения TopicID, Strings, Get- NewValu es Описание Метод вызывается п р и открытии фа й­ ла, который содержит функции данных реального времени, или при вводе формулы , содержащей фун кцию RTD
Имя Disconnect- Data Тип возвращае- Параметры мого Значения TopicID Объектная модель Excel 2003 785 Описание Применяется для уведомления серве­ ра данных реального времени о том, что тема больше не используется Heartbeat Long Проверяет активность сервера данных реального времени. Отрицательное значение или ноль указывают на не­ удачную попытку подключения к сер­ веру. Положительное значение под­ тверждает успешность попытки под­ ключения RefreshData ByRef Topic- Вызывается для получения новых дaн­ Count As Long ных после уведомления от сервера данных реального времени о наличии обновлений ServerStart Long CallbackObject Вызывается сразу после создания эк­ земпляра сервера данных реального времени. Отрицательное значение или ноль указывают на неудачную попытку подключения к серверу. Положитель­ ное значение подтверждает успеш­ ность попытки подключения Server- Termina te Объект IRTDUpdateEvent Используется для завершения под­ ключения к серверу Этот объект представляет события обновления в реальном времени. Объект IRTDUp - da teEvent используется для установки интервала между обновлениями для объекта IRtdServer. Интервал устанавливается с помощью свойства Heartbeatinterval . Объект IRTDUpdateEvent возвращается в результате использования метода Server- Start объекта IRtdServer для Подключения к серверу данных реального времени . . Свойства объекта IRTDUpdateEvent Имя Heartbeat- Interval Тип возвращае- Описание мого значения Long. Устанавливает/возвращает интервал между обновления­ ми данных реального времени Методы объекта IRTDUpdateEvent Имя Disconnect UpdateNotify Тип возвращае- Параметры Описание мого значения Заставляет сервер данных реального вре­ мени отключиться от указанного объекта Приложение Excel получает уведомление от сервера данных реального времени о получении новых данных
786 Приложение А Объект LeaderLines В объекте LeaderLines хранятся атрибуты форматирования, связанные с линиями меток данных на диаграмме. Эти линии связывают метки данных с маркерами данных. Родительским для объекта LeaderLines является объект Series . Для создания объекта LeaderLines и проверки его существования используется свойство HasLeaderLines объекта Series. Общие свойства LeaderLines Определения свойств Application, Creator и ~arent приводились в начале при­ ложения. Свойства объекта LeaderLines Имя Тип возвращае- Описанце мого значения Border Border Только чтение. Возвращает свойства границы вокруг ли­ ний меток Методы объекта LeaderLines Имя Тип возвращае- Параметры Описание Delete Select мого значения Пример: объект LeaderLines Удаляет объект LeaderLines Выделяет метки данных на диаграмме (SUЪ ~:дddAn:dFO·pnaI:C~·aaerLi:ne::i' ()" ~~ · - .. ,~· ~· ,, ~·v-, ; Dim · oLL As .LeaderLines f ' Исподьзо:ВанИе первой последовательности круговой With Charts(l) .SeriesCollection(l) · . · ' ·· ДобавИть метки линиями мекто (при необх"одимости} ;лpplyDa taLabels ·нasLeaderLines: =True · · ' Р·а_сположить метки . DataLa.bels. Posi tion xlLabelPositionBes.tFit ' на. · принятых rio умоЛчанию позициях, будет ' об ошИбке . ·· , . SE\~ ot.L = . LeaderLines. ·End Wlth . ' . Отформатировать " линии мето.к )Yith oLL . . .... B .o rder·, LineStyle .= -xlContinuous . · ·;·B9r.der. ColorTndex 5 · · End. With :в;пq. $ЧР ,; ~·· .· - Объект Legend В объекте Legend хранятся параметры форматирования и записи легенды - для оп­ ределенной диаграммы. Родительским для объекта Legend является объект Chart. Для создания или проверки существования объекта Legend можно воспользоваться свойством HasLegend объекта Chart.
Объектная модель Excel 2003 787 Общие свойства объекта Legend Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Legend Имя Тип возвращае- Описание мого значения AutoScale- Font Border Fill Font Height Int e rior Left Name Position Shadow Тор Width Variant Border ChartFill - Format Font DouЫe Interior DouЫe String XlLegend- Pos ition Boolean DouЫe DouЫe Методы объекта Legend Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Только чтение. Возвращает свойства границы вокруг ле­ генды Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки легенды диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры шрифта для текста легенды Устанавливает/возвращает высоту п_оля легенды Только чтение . Возвращает объект, содержащий парамет­ ры форматирования внутренней области легенды · (например, цвет внутренней области) Устанавливает/во:Звращает расстояние от левого края по­ ля легенды до левого края родительской диаграммы · Только чтение . Возвращает имя объекта Legend Устанавливает/возвращает положение легенды на диa­ гpaммe (нaпpимep, xlLegendPosi t i onc orner, xlLe g- endPosi tionLeft) Устанавливает/возвращает необходимость отображения эффекта тени для легенды Устанавливает/в.озвращает расстояние от верхнего края поля легенды до верхнего края родительской диаграммы Устанавливает/возвращает ширину поля легенды Имя Тип возвращае- Параметры Описание Clear Del ete Legend- Entri es Select мого значения Vari a nt Var iant Object Variant Пример: объект Legend [Index] Очищает легенду Удаляет легенду Возвращает один объект L ege n dEntry или коллекцию LegendEn tries в зависи­ мости от наличия параметра Index. Со­ держит весь текст и маркеры легенды Выделяет легенду на диаграмме ГSUЪ~,..р1а~еLеgеПСГfГ' -~; s~·~,v·~:н~i· ~·-·v·~= -~~ , Dirn oLgnd As Le gend :~У809:t'О!'~РJ1.т.ь ~!'!_, - . ':!.i.9 .8!1.9.!'PA~··Щ .90.,FJ;~J?~..'E-"1~~;r~ндi"""
788 Приложение А '..ch.ari:.s (Л . нasLegend ",;; тrU:e • Подучить объект Legend Set oLgnd = Charts(l) .Legend " ·Расr.rоложить и отформатировать цегенду With oLgnd «Position = xlLegendPositionRight .Border.LineStyle = xlNone .AutoScaleFont False 1. EndWith [!";ПО . 9Усf>и~ _ Объект LegendEntry и коллекция Legei:idEntries В коллекции LegendEntries хранятся записи легенды. Каждый объект LegendEn- try представляет одну запись легенды. Запись состоит из текста и маркера. Текст всегда связан с именем последовательности или именем линии тренда. Родительским для кoл­ лeкции. LegendEntr ies является объект Legend. Кроме типичных атрибутов, коллекция LegendEntries предоставляет одно свойст­ во. Свойство Count возвращает количество объектов LegendEntry, которые хранятся в коллекции. Общие свойства объекта LegendEntry Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта LegendEntry Имя Тип возвращае- мого значения AutoScale- Variant Font Font Font Height DouЫe r .ndex Long Left DouЫe LegendKey LegendKey Тор DouЫe Wid th DouЫe Описание Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры шрифта для текста записи легенды Только чтение . Возвращает высоту записи легенды Только чтение. Возвращает положение объекта Leg- endEntry в колriекции LegendEntries \ Только чтение. Возвращает расстояние от левого края за­ писи легенды до левого края диаграммы Только чтение . Возвращает объект , содержащий форма­ тирование маркера записи легенды Только чтение. Возвращает расстояние от верхнего края записи легенды до верхнего края родительской диаграммы Только чтение. Возвращает ширину записи легенды Методы объекта LegendEntry Имя Delete Select Тип возвращае- Параметры Описание мого значения Variant Variant Удаляет объект LegendEntry Выделяет запись легенды на диаграмме
Объектная модель Excel 2003 789 Пример: объект LegendEntry и коллекция LegendEntries Объект LegendKey В объекте LegendKey хранятся свойства и методы, позволяющие управлять форма­ тированием ключевого маркера записи легенды. Ключевой маркер является визуальным представлением, например цветом , который идентифицирует определенную последова­ тельность или линию тренда. Общие свойства объекта LegendKey Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта LegendKey Имя Border Fill Height Interior Invertlf- Negative Left Marker- Background- Color Marker - Background- Colorlndex Тип возвращае- мого значения Border ChartFill- Format DouЫe Interior Boolean DouЫe Long XlColorindex Описание Только чтение. Возвращает свойства границы вокруг клю­ ча легенды Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки для ключа легенды последо­ вательности или линии тренда Только чтение . Возвращает высоту ключа легенды Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области ключа легенды (например, цвета енутренней области) Устанавливает/возвращает необходимость инвертирова­ ния цвета ключа легенды, если значение цвета является отрицательным Только чтение . Возвращает расстояние от левого края ключа легенды до левого края родительской диаграммы Устанавливает/возвращает цвет фона ключа легенды. В данном случае для создания значения цвета должна ис­ пользоваться функция RGB Устанавливает/возвращает цвет фона ключа легенды. В данном случае для установки значения свойства могут использоваться константы XlColorindex или значение индекса цвета в текущей цветовой палитре
790 Приложение А Имя Тип возвращае- Описание мого значения Marker- Long Foreground- ' Color Marker- XlColorindex Foreground- Colorindex MarkerSize Long MarkerStyle XlMark erStyl e PictureType Long PictureUnit Long Shadow Boolean Smooth Boolean Тор DouЫe Width DouЫe Методы объекта LegendKey Устанавливает/возвращает основной цвет ключа легенды. В данном случае для создания значения цвета долж.J:lа ис­ пользоваться функция RGB Устанавливает/возвращает основной цвет ключа легенды. В данном случае для установки значения свойства могут использоваться константы XlColorindex или значение индекса цвета в текущей цветовой палитре Устанавливает/возвращает размер маркера ключа легенды Устанавливает/возвращает тип маркера, который будет использоваться в качестве ключа легенды (например, квадрат, ромб, треугольник, рисунок и т.д . ) Устанавливает/возвращает способ отображения связан­ ного рисунка в легенде (например , со сжатием, в виде мо­ заики). Для установки значения этого свойства можно воспользоваться константами XlPictureType Устанавливает/возвращает количество единиц, которые представлены рисунком, если свойство Picture Type ус­ тановлено в значение xlScal e Устанавливает/возвращает необходимость отображения эффекта тени вокруг ключа записи легенды Устанавливает/возвращает необходимость сглаживания кривы х при отображении ключа легенды Только чтение . Возвращает расстояние от верхнего края ключа записи легенды до верхнего края родительской ди а граммы Только чтение. Возвращает ширину ключа записи легенды Имя Тип возвращае- Параметры Описание мого значения ClearFormats Vari ant Delete Select Variant Variant Пример: объект LegendKey '·sU.Ъ F:.or!nai:LegenCiкeys·( 1· Dim oLE As Legend.Eritry Dim oLK As LegendKey ' Добавить легенду в диаг р амму Charts(l) .HasLegend .= True Очищает форматирование, установленное с помощью объекта L e gendKey Удаляет объект LegendKey Выделяет ключ легенды на родительской диаграмме ' ·перебрать ' все залиси .:легенды • . , . For Ea ch.. oLE In Char ts (1. ). Le g.erid"Lege ndEntries ·• · : Получи-rь ключ ле генды для залI-1сИ . s.ё t oLK = o LE.LegendKey ·
Объектная модель Excel 2003 791 Объект LineFormat Объект LineFormat описывает форматирование лини.и родительского объекта Shape. Для получения доступа к объекту LineFormat применяется свойство Line объ­ екта Shape. Обычно объект LineFormat используется для изменения таких свойств ли­ нии, как стили конечной стрелки и направление стрелки. Общие свойства объекта LineFormat Определения свойств Appl ication, Creator и Parent приводились в начале при­ ложения. Свойства объекта LineFormat Имя BackColor BeginArrowhead- Length BeginArrowhead- Style BeginArrowhead- Width DashStyle EndArrowhead- Length EndArrowhead- Style EndArrowhead- Width ForeColor Pattern Style Transparency VisiЫe Weight Тип возвращаемо- Описание го значения ColorFormat MsoArrowhead::- Length MsoArrowhead- Style MsoArrowhead- Width MsoLineDash- Style MsoArrowhead- Length MsoArrowhead- Style MsoArrowhead- Width ColorFormat MsoPatternType MsoLineStyle Single MsoTriState Single Только чтение. Возвращает объект, позволяющий управлять цветом фона линии Устанавливает/возвращает длину наконечника стрелки в начале линии Устанавливает/возвращает внешний вид наконеч­ ника стрелки в начале линии Устанавливает/возвращает ширину наконечника стрелки в начале линии Устанавливает/возвращает стиль линии Устанавливает/возвращает длину наконечника стрелки в конце линии Устанавливает/возвращает .внешний вид наконеч­ ника стрелки в конце линии Устанавливает/возвращает ширину наконечника стрелки в конце линии Только чтение . Возвращает объект, поддерживаю­ щий управление цветом фона линии Устанавливает/возвращает шаблон, который ис­ пользуется для рисования линии Устанавливает/возвращает стиль линии Устанавливает/возвращает прозрачность (1) . или непрозрачность (О) линии Устанавливает/возвращает возвращает видимость ' линии Устанавливает/возвращает толщину линии
792 Приложение А Пример: объект LineForтat [S:Ц:b '~d···cJJill. •*CJ.F '6rmat.Ll!J.e () , ~ DiJ!l\ OShp As Shape ~ D~Щ oLF As LineFormat i ' Добавить лини!Ь . Set oShp = ActiveSheet . Shapes .AddLin'e (10 0, ', Получить .об'Ъекта формата линии · $et oLF ·= oShp. Line · »' · Установить формат . линии With oLF .BeginArrowheadStyle = msoAr:towheadOval .EndArrowheadStyle = msoArrowheadTriangle .EndArrowbeadLerigth = msoArrowheadLong· .EndArrowheadWidth = msoArrowheadWide · .Style = msoLin,~Single ~ 'БndWith . 1J;:!'lci ..ев&, ·= · ; ., ... ... . -".о.>.~.. • ... " , : Объект LinkFormat Объект LinkFormat описывает атрибуты связывания для объекта OLE или рисунка. Объект LinkFormat связан с объектом Shape. Только объекты Shape, которые являют­ ся действительными объектами OLE, могут получать доступ к oбъeктyLineFormat. Общие свойства объекта LinkFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта LinkFormat Имя Тип возвращае- Описание мого значения AutoUpdate Boolean Устанавливает/возвращает необходимость обновления родительского объекта Shape при каждом изменении файла источника или при открытии родительского объекта Locke d Boolea n Устанав ливает/возвра щает отказ от обновления объекта Shape из исходного файла Методы LinkFormat Имя Тип возвращае- Параметры Описание мого значения Update, Пример: объект LinkForтat rsuБ .pdaEёsfiape-Cini<s ()" 1 Pim oShp As Shape ! Dirn ' oLnkForm As LinkFormat ' ~,.: Перебрать все :Ге.ометрическИе фигуры . Обновляет родительский объект Shape из ИСХОДНЫХ данных f f'or'< Each oShp In: ActiveSheet. Shapes i' · ' • Яв.rуЯетсЯ <nи , фигура объект.ом · о1~.? . .. ~. . . If osh,P . ТуРе =, msoL inkedQLEQbj ect .Ох\ oShp. Туре ~T_h~;g J ·~~~v -~ ,, ( · '4"·'~~"J{i_~:. ,,,$~?~:·~·~ , ~k>~~-~,· '# ·'
Объектная модель Excel 2003 793 ~· ·'Ч'""р;•~ ;";Б·сли· ::д а:, · 'ука зать Ф ормат связи !: s .et(. ciLnkForm = 0SJ1p . LinkFormat · ·,:: и: обнов!1ть <связь . · oI'.nkForm. Uj;Jda te., 'IfА ;/ , Объект ListColumn Этот объект описывает столбец в списке. В коллекции ListColumns хранятся все столбцы списка, каждый из которых имеет собственный oбъeктListColumn. Общие свойства объекта ListColumn Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ListColumn Имя Тип возвращае - Описание мого значения Index ListData- Format Name Range Integer ListData- FormatObj ect String SharePoint- String Formula Totals- Calculation XPath Методы объекта LlstColumn Номер объекта ListColumn в списке Возвращает объект ListDataFormat для объекта List- Column Возвращает имя объекта Возвращает диапазон, к которому относится объект List - Column из текущего списка Возвращает строку, которая используется в качестве формулы ВЫЧИСЛИМОГО поля Определяет тип расчетов в строке итогов Возвращает объект ХРа th для элемента, связанно го с оп­ ределенным диапазоном Имя Тип возвращае- Параметры . Описание мого значения Delete Удаляет столбец данных из списка Объект ListDataFormat В oбъeктe, ListDataForrnat хранятся все свойства типа данных для объекта List- Column. Общие свойства ListDataFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложен:,ия.
794 Приложение А Свойства объекта ListDataFormat Имя AllowFillin Choices Decimal- Places DefaultValue IsPercent LCID Max - Characters Тип возвращае- мого значения Boolean StringArray Long Variant Boolean Long Long Variant Variant Boolean Boolean Описание Определяет возможность ввода значений пользователем или выбор определенных значений из списка Содержит строковый массив возможных вариантов Определяет количество отображаемых десятичных знаков Принятое по умолчанию значение Определяет необход~мость отображения этого свойства в виде процентного значения Определяет используемый символ валюты Максимальное количество вводимых символов Наибольшее используемое число Наименьшее используемое число Определяет возможность изменения значения элемента Определяет, является ли элемент обязательным MaxNumber MinNumber ReadOnl y Required Туре XlListDataType Исполt>зуется при связывании элемента с сайтом SharePoint Объект ListObject Этот объект соответствует списку в пределах листа. Свойства объекта ListObject Имя Тип возвращае- Описание мого значения App'lication Object Count Integer Creator Long Item Object Parent Object Методы объекта ListObject Возвращает объект Application, представляющий при­ ложение Excel Возвращает количеств о элементов в коллекции Возвращает значение типа Long, которое описывает соз­ давшее объект приложение. Это значение может быть пре­ образовано в шестнадцатеричную строку и в строку ASCll Возвращает один объект из коллекции объектов Возвращает ссылку на родительский объект Имя · Тип возвращае- Параметры мого значения Описание Delete PuЬlish String [Target - StringArray] [Linksource - Boolean] Удаляет элемент из коллекции Публикует объект на сервере W indows Sharepoint. Строковый массив Target должен содержать следующие элемен­ ты: О - адрес URL сервера SharePoint; 1 - имя списка; 2 - описание списка
Объектная модель Excel 2003 795 Имя Тип возвращае- Параметры мого значения Описание Refresh Resize Unlink UpdateChange Объект ListRow Range Обновляет текущие данные с помо­ щью сервера Windows Sharepoint Позволяет изменить размер объекта ListObj ect до размера определенно­ го диапазона Удаляет текущую связь с сервером Windows Sharepoint Обновляет всю информацию с сервера Windows Sharepoint с помощью син­ хронизации всех изменений Как подсказывает имя, этот объект представляет строку в списке. Свойства объекта ListRow Имя Тип возвращае- Описание мого значения Application Object Creator Long Index Long InvalidData Boolean Parent Object Range Range Методы объекта ListRow Возвращает объект Application, представляющий при­ ложение Excel Возвращает значение типа Long, которое описывает соз­ давшее объект приложение . Это значение может быть пре­ образовано в шестнадцатеричную строку и в строку ASCll Возвращает номер объекта в коллекции Возвращает значение типа Boolean, которое определяет, прошла ли строка проверку на действительность значения Возвращает ссылку на родительский объект Возвращает диапазон, к которому относится текущий объект Имя Тип возвращае- Параметры Описание / мого значения Delete Удаляет элемент из коллекции Объект Mailer Объект Mailer используется на компьютерах MacintosЬ для отправки файлов Ехсе! средствами Powe1Talk Mailer. Общие свойства объекта Mailer Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
796 Приложение А Свойства объекта Mailer Имя Тип возвращае- Описание мого значения BCCRecipients CCRecipients Enclosures Received SendDateTime Sender Subject ToRecipients WhichAddress Variant Variant Variant Boolean Date String String Variant Variant Устанавливает/возвращает список скрытых копий Устанавливает/возвращает список копий Устанавливает/возвращает список вложений Только чтение. Указывает, было ли получено сооб­ щение Только чтение. Возвращает дату и время отправки сообщения Только чтение. Возвращает имя отправителя сооб­ щения электронной почты Устанавливает/возвращает строку темы сообщения электронной почты Устанавливает/возвра щает массив имен получателей Устанавливает/возвращает адрес, с которого было отправлено сообщение электронной почты Объект Name и коллекция Names В коллекции Names хранится список именованных диапазонов в пределах книги. Каж­ дый объект Narne описывает диапазон ячеек в пределах книги, доступ к которому возмо­ жен по имени. Некоторые объекты Name являются встроенными (например, Print_ Area). Остальные объекты определяются пользователем . В качестве родительского объ­ екта коллекции Names ·может выступать объект Workbook, Application и Worksheet. Кроме этого, доступ к объектуNаmе можно получить через объектRаngе. Кроме типичных атрибутов, коллекция Names предоставляет метод Add. Этот метод добавляет в коллекцию объект Narne. Параметры метода Add соответствуют свойствам объекта Narne. Общие свойства объекта Name Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Name Имя Category Category- Local Тип возвращае- Описание мого значения String String Устанавливает/возвращает категорию объекта Name на языке, который использовался для создания макроса. Это свойство действительно только для объектов Name, кото­ рые являются определенной пользователем функцией или командой Устанавливает/возвращает категорию объекта Name на языке конечного пользователя. Это свойство действи­ тельно только для объектов Name, которые являются оп­ ределенной пользователем функцией или командой
Имя Index MacroType Name NameLocal RefersTo RefersTo- Local Тип возвращае- мого значения Long XlXLММacroType String String Variant Variant RefersToRlCl Variant RefersTo- RlClLocal RefersTo- Range Range ShortcutKey String Value String VisiЫe Boolean Методы объекта Name Объектная модель Excel 2003 797 Описание Только чтение. Возвращает положение объекта Name в коллекции Names Устанавливает/возвращает, ссылается ли объект Name на команду, функцию или просто на диапазон Устанавливает/возвращает имя объе.кта Name на языке макроса Устанавливает/возвращает имя объекта Name на языке конечного пользователя Устанавливает/возвращает текстовую ссыл ку на диапа ­ зон, на который ссылается объект Name , на языке макроса в формате А1 ' Устанавливает/возвращает текстовую ссылку на диапа­ зон, на который ссылается объект Name, на языке пользо ­ вателя в формате А1 Устанавливает/возвращает текстовую ссылку на диапа­ зон , на который ссылается объект Name, на языке макроса в формате R1C1 Устанавливает/возвращает текстовую ссылку на диапа­ зон, на который ссылается объект · Nаmе, на языке пользо­ вателя в формате R1C1 Только чтение . Возвращает диапазон, на который ссыла­ ется объект Range Устанавливает/возвращает комбинацию клавиш, которая запускает макрос Microsoft Excel 4.0, связанный с объек­ том Name Устанавливает/возвращает текстовую ссылку на диапа­ зон , на который ссылается объект Name, на язы ке макроса в формате А1 Устанавливает/возвращает необходимость отображения имени объекта Name в диалоговом окне Имена (Names) Имя Тип возвращае- Параметры Описание мого значения Delete Пример: объект Name и коллекция Names v.ь·~tie:i':eГeiЛ:viПidNamёs сг·· D'im oName As Name · Удаляет объект Name из коллекц и и ' . nеребi?ать все .имена в а ктивной книг е For Each oName InActiveWorkbook.Names ' · Является ли· и~я действительным? If 'rristr(l, oName.RefersTo, "#REF")'>ОThen имя jl об ошибке oName.Name ,•.
798 Приложение А Объект ODBCError и коллекция ODBCErrors В каждой коллекции ODBCErrors хранится список ошибок, которые возникли в ре- · зультате последнего запроса через подключение ODBC. В каждом объекте ODBCError содержится информация об ошибке, которая возникла в результате последнего запроса через подключение ODBC. Если в результате последнего запроса через подключение ODBC не возникло ни одной ошибки, коллекция окажется пустой. Кроме типичных атрибутов, коллекция ODBCErrors предоставляет свойство Count. Свойство Count возвращает количество объектов ODBCError, которые хранятся в кол­ лекции. Общие свойства ODBCError Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ODBCError Имя · Тип возвращае- Описание мого значения ErrorString String SqlState String Только чтение. Возвращает строку ошибки, сгенерирован­ ную подключением ODBC Только чтение. Возвращает ошибку состояния SQL, сгене ­ рированную подключением ODBC Пример: объект ODBCError и коллекция ODBCErrors
Объектная модель Excel 2003 799 Объект OLEDBError и коллекция OLEDBErrors В коллекции OLEDBErrors хранится список ошибок, которые возникли в результате последнего запроса через поставщика OLE DB. В каждом объекте OLEDBError хранится информация о последней ошибке, которая возникла в результате последнего запроса че­ рез поставщика OLE DB. Если в результате последнего запроса ч ерез поставщика OLE DB не возникло ни одной ошибки, коллекцияОLЕDВЕrrоrs окажется пустой . Кроме типичных атрибутов, коллекция OLEDBErrors предоставляет свойство Count. Это свойство возвращает количество объектов OLEDBE:i;тor, которые хранятся в коллекции. Общие свойства объекта OLEDBError qпределения свойств Application, Creator и Parent прив одились в начале при­ ложения. Свойства объекта OLEDBError Имя Тип возвращае- Описание мого значения ErrorString String Native Long Number Long SqlState String Stage · Long Только чтение. Возвращает строку ошибки , сгенерирован­ ную поставщиком OLE DB Только чтение. Возвращает специфичный для поставщика номер ошибки, характеризующий ошибку Только чтение. Возвращает номер ошибки , характери­ зующий ошибку Только чтение . Возвращает ошибку состояния SQL, сгене­ рированную поставщиком OLE DB Только чтение . Возвращает стадию ошибки, сгенериро­ ванной поставщиком OLE DB Пример: объект OLEDBError и коллекция OLEDBErrors ;stiБ" cfi~cкot'Eьь:Erro"E;T i ? ····- -· ·. · r Diф o Er r As OLEDBError ~'·· ;, Diпi sM9g As S tririg \. ·' " .'eontihue after err'ors .. k· ,On;Error Resume Next · r: ", ~ · Не " вы.сiавать заriросов на ре:ГИс трацию ~ ·, 'A:ppli c ation.Display:l\lerts = Fa1se f,' : Обновить сводную таблицу bLE DB о.Then 1 ~:;;, ActiveSh~et•. PivotTables {1) : Refres];l ~~:··· ' · Возникли ошибки? · · k , I f J1.pplicat ion. OLEDBErrors. Count ' ·· Нет, все в Порядке . . · ' MsgBo x " Обновление зав.ершено " Else · · '..Да, поэтому · переЧислить ошибки ' sMs g = " В процессе обновления nроизошли следующие · ошибки " For cEach oErr Ih Application.OLEDBErrors .·. s.Msg ~ sMsg & vbCrLf & oErr.БrrorString & " (" & oErr.SqlState & ·· •.·•· Noxt • Ms. Q-Bqx sMsg " ·вnd'·If.··· .. \Е"Цq,pUb~, . ·-·• - ·'- ·"
800 Приложение А Объект OLEFormat В этом объекте хранятся все атрибуты объектов OLE или ActiveX, необходимые для связывания. Характеристики связывания описываются объектом LinkFormat. Роди­ тельским объектом в данном случае является объект Shape. Для использования этого объекта родительский объект Shape должен быть связан или внедрен. Общие свойства объекта OLEFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства OLEFormat Имя Тип возвращае - Описание мого значения Object Object Progid String Методы объекта OLEFormat Только чтение. Возвращает ссылку на родительский объ­ ект OLE Только чтение. Возвращает программный идентификатор родительского объекта OLE Имя Тип возвращае- Параметры Описание мого значения Activate Verb Пример: объект OLEFormat [Verb] Активизирует и открывает родительский объект OLE Выполняет операцию над родительским объектом OLE. При этом вызывается ре­ акция со стороны объекта OLE (например, x l Open) ~sьь 4Pr1nt ЁmЬed.dedwordDocument s1 o- Dim oShp As Shape .k ! ! 1 ' Dim oOF As OLEFormat .· . ·"' " Перебрать все геометрИческие фигуры на листе For Each oShp I n Act iveSheet.Shapes. ' Является' ли объек·т внедренным · I f oShp. Туре = r risoEmbeddedOLEObj ect T.hen ' Получить формат внедренноГо о'бъекта Set oOF = o.Shp . OLEForma t · ' Является ли этот объект документом Word? . I f oOF. Prog!d Li ke "Word ; Docuni.ent*" Then ' Да, поэтому .распечатать дс;жумент Wo r d : ' ПервыйвыЗов .ОЬjесt . возвращает универсаль ный OLEObject, ко торый хранит с я в объект е . Shаре. ' Второй вы:Зо;в .Object возвращает объект Word, ' который храни тся внутри OLEObject oOF . Object.Object.PrintOut End rf · · · ··;•· i .: ~exf~d If !.J?!? -0 ., Sy_b """'~
Объектная модель Excel 2003 801 Объект OLEObject и коллекция OLEObjects В коллекции OLEObjects хранятся все элементы управления ActiveX, связанные объекты OLE и внедренные объекты OLE из лист~ или диаграммы. Объект OLEObj ect предоставляет элемент управления ActiveX, связанный объект OLE или внедренный объект OLE из листа или диаграммы. Кроме типичных атрибутов, коллекция OLEObj ects предоставляет множество свойств и методов. Эти свойства и методы перечислены в следующей таблице. Свойства и методы коллекции OLEObjects Имя AutoLoad Border Count EnaЫed Height Interior Left Locked Placernent Тип возвращае- Описание мого значения Boolean Border Long Boolean DouЫe Interior DouЫe Boolean Variant Устанавливает/возвращает необходимость автоматиче­ ской загрузки объекта OLE при открытии книги. С объек­ тами ActiveX это свойство не применяется . Обычно оно установлено в значение False. Используется, если в кол­ лекции хранится только один объект OLEObj ect Только чтение. Возвращает свойства границы вокруг объ­ екта OLE. Используется, если в коллекции хранится тол ь­ ко ОДИН объект OLEObj ее t Только чтение. Возвращает количество объектов OLEOb- j ect, которые хранятся в коллекции Устанавливает/возвращает, включен ли объект OLEOb- j ec t. Используется, если в коллекции хра н ится тол ько ОДИН объект OLEObj ect Устанавливает/возвращает высоту фрейма OLEObj ect. Используется, если в коллекции хранится только один объект OLEObj ect То л ько чтение . Возвращает объект, содержащий парамет­ ры форматирования внутренней област·и объекта OLE (например, цвет внутренней области). Используется, если в коллекции хранится только один объект OLEObj ect Устанавливает/возвращает расстояние от левого края фрейма объекта OLEObj ect до левого края листа. Ис­ пользуется, если в коллекции хранится только один объ­ ект OLEObject Устанавливает/возвращает возможность редактирования оqъекта при защите родительского листа . Используется, если в коллекции хранится только один объект OLEObj ect Устанавливает/возвращает способ привязки объекта OLEObj ect к листу (например, произвольное размеще- 1 ние, перемещение вместе с ячейками). Для установки это­ го свойства можно воспользоваться константами XlPlacernent. Используется, если в коллекции хранится только ОДИН объект OLEObj ect PrintObject Boolean Устанавливает/возвращает необходимость печати объек­ та OLEObj ect при печати листа. Используется, если в коллекции хранится только один объект OLEObj ect
802 Приложение А Имя Shadow ShapeRange SourceName Тор VisiЫe Width ZOrder Add Тип возвращае- Описание мого значения Boo lean Устанавливает/возвращает необходимость отображения эффекта тени вокруг объекта OLE. Используется , если в коллекции хранится только один объект OLEObj eet ShapeRange Только чтение . Возвращает объект OLE в виде объекта Shape. Используется, если в коллекции хранится только один объект OLEObj eet String Устанавли'вает/возвращает имя источника ссылки для объекта OLE. Используется, если в J<Оллекции хранится только ОДИН объект OLEObj eet DouЫe Устанавливает/возвращает расстояние от верхнего края объекта OLE до верхнего края родительс кого листа . Ис­ пользуется, если в коллекции хранится только один объ­ ект OLEObjееt Boolean Устанавливает/возвращает видимость всех объектов OLEObj eet в коллекции DouЫe Устанавливает/возвращает ширину фрейма объекта OLE. Long OLEObjeet Используется, есл и в коллекции хранится только один объект OLEObj ее t Только чтение . Возвращает положение объекта OLE отно­ сительно других объе кто в на листе . Используется , если в коллекции хран ится только один объект OL EObj eet Метод. Параметры : [ClassType], [Filen ame], [LinkJ, [Displ ayAs ieon], [ IeonFileName ], [ Ieonindex], [IeonLabel ], [Left], [Тор ], [Width], [Не ight].До­ бавляет в коллекцию объект OLE. Положени е нового объ­ екта OLE определяется значением параметров L eft, Тор, Width и нeight. Кроме этого, можно указать тип объекта OLEObj eet (параметр ClassType) и его расположение (параметр FileName). Остальные параметры являются аналогами существующих свойств объекта OLEObj eet BringToFront Variant Метод. Перемещает все объекты OLE из коллекции на пе­ редний план поверх остальных объектов Сору Variant CopyPieture Variant Cut Variant Delete Variant Seleet Variant SendToBaek Variant Метод. Копирует все объекты OLE из коллекции в буфер обмена Метод. П араметр ы :Арреаrаnее As XlPietureAppear- anee, Format As XlCopyPietureFormat. Копирует объекты OLE из коллекции в буфер обмена в виде изо­ бражений. Параметр Appearanee позволяет выбрать ко­ пирование экранного представления или представления для печати. Параметр Format позволяет выбрать тип изображения, которое копируется в буфер обмена Метод . Вырезает все объекты OLE из коллекции в буфер обмена Метод. Удаляет все объекты OLE из коллекции Метод. Параметры: [Rep laeeJ . Выделяет все объекты OLEObj eet из колле кции Метод. Перемещает объект OLEObj eet на заднИй план за другими объектами из коллекции
Объектная модель Excel 2003 803 Общие свойства объекра OLEObject Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта OLEObject Имя AltHTML AutoLoad AutoUpdate Border Bottom- RightCell EnaЫed Height Index Interior Left LinkedCell ListFill- Range Locked Na me Obj ect OLEType Тип возвращае- Описание мого значения String Boolean Boolean Border Range Boolean DouЫe Long Interior DouЫe Str ing String Boolean S tring Variant Устанавливает/возвращает тип кода HTML, который ис­ пользуется вместо встраивания элемента управления OLE при сохранении документа в виде WеЬ-страницы Устанавливает/возвращает необходимость автоматиче­ ской загрузки объекта OLE при открытии книги. С объек­ тами ActiveX это свойство не применяется . Обычно это свойство установлено в значение False Устанавливает/возвращает необходимость автоматиче­ ского обновления объекта OLE при изменении исходного объекта. Применяется только со связанными объектами (OLEType=xlOLELink) Только чтение. Возвращает свойства траницы вокруг объ­ екта OLE Только чтение. Возвращает диапазон, состоящий из одной ячейки и расположенный под левым нижним углом объек­ та OLE Устанавливает/возвращает, включен ли объект OLEOb- j ect Устанавливает/возвращает высоту фрейма объекта OLEObject Только чтение . Возвращает положение текущего объекта OLEObj ect в коллекции Только чтение. Возвращает объект с параметрами фор­ матирования внутренней области объекта OLE (например, внутреннего цвета) Устанавливает/возвращает расстояние от левого края фрейма объекта OLEObj e ct до левого края листа УстанавлИвает/возвращает диапазон, в который записы­ вается результат работы объекта OLE Устанавливает/возвращает диапазон, в котором хранятся значения для списка ActiveX Устанавливает/возвращает . возможность редакт и рования объекта в пределах защищенного листа Устанавливает/возвращает имя объекта OLE Только чтение. Предоставляет доступ к некоторым свой­ ствам и методам объекта внутри объекта OLE Только чтение. Возвращает тип объекта OLE: xlOLELink или xl OLEEmЬed. Для установки значения этого свойства можно воспользоваться константами Xl OLEType
804 Приложение А Имя Тип возвращае- Описание мого значения Placement Variant PrintObject Boolean Progid String Shadow Boolean ShapeRange ShapeRange SourceName String Тор DouЫe TopLeftCell Range VisiЫe Boolean Width DouЫe ZOrder Long Методы объекта OLEObject Устанавливает/возвращает тип привязки объекта OLEOb- j ect к листу (например, произвольное положение, пере­ мещение вместе с ячейками). Для установки этого свойст­ ва можно воспользоваться константами XlPlacement Устанавливает/возвращает необходимость печати объек­ та OLEObj ect при печати листа Только чтение. Возвращает программный идентификатор, связанный с объектом OLE (например, "Excel.Applicatioп") Устанавливает/возвращает необходимость отображения эффекта тени вокруг· объекта OLE Только чтение . Возвращает объект OLE в виде объекта Shape ,- Устанавливает/возвращает исходное имя связи объекта OLE Устанавливает/возвращает расстояние от верхнего края объекта OLE до верхнего края родительского листа Только чтение . Возвращает диапазон, состоящий из един­ ственной ячейки и расположенный над левым верхним уг­ лом объекта OLE Устанавливает/возвращает необходимость отображения объекта OLEObj ect на экране Устанавливает/возвращает ширину фрейма объекта OLE Только чтение. Возвращает положение объекта OLE отно­ сительно других обьектов на листе Имя Тип возвращае- Параметры мого значения Описание Activate Variant BringToFront Variant Сору Variant CopyPicture Variant Cut Variant Delete Duplicate Select Variant Variant Appearance As XlPicture Ар- . pearance, For- mat As XlCopyPicture Format [Replace] Устанавливает фокус и активизирует объект OLE Размещает объект OLE на переднем плане поверх остальных объектов Копирует объект OLE в буфер обмена Копирует изображение объекта OLE в буфер обмена. Параметр Appar- ance позволяет выбрать копирова­ ние экранного представления или представления для печати. Пара­ метр Format позволяет указать тип изображения, которое будет скопи­ ровано в буфер обмена Вырезает объект OLE в буфер обмена Удаляет объект OLEObj ect Дублирует объект OLEObj ect на ро­ дительском листе Выделяет объект OLEObj ect
Имя Тип возвращае- мого значения SendToBack Variant Update Variant Verb Variant f События объекта OLEObject Имя Параметры GotFocus LostFocus Параметры Verb As XlOLEVerb Описание Объектная модель Excel 2003 805 Описание Размещает объект OLEObj ect п оза­ ди остальных объектов Обновляет связь объекта OLE (если такая связь существует) Вызывает операцию родительского объекта OLE, которая провоцирует реакцию объекта OLE (например, xlOpen) . Возникает при получении фокуса объеkтом OLE Возникает при потере фокуса объектом OLE Пример: объект OLEObject и коллекция OLEObjects ~·S"uь ···· pri·ntвn1Ьedde·ctWo·rdiSO'C:Urnen'ts2 ~() ~·· · · ." · ····.-~· ~-·"· ., _'~ '. Dim .oOLE AS OLEObject . . . !-. ' Перебрать все геометрические Фигуры на . Листе ~- For Each oOLE In Act:i\тeSheet. OLEObj ects !' ' Это . документ word? 1 н ' ooLE.Progid Lij<e "Word.Document*" Then f. ' Да, поэтому напечатать документ Word'. . oOLE.Object.PrintOut End -If . . Next \.?я4. ~чь" . Объект Outline Объект Outline предоставляет возможность управления структурой Excel. Роди­ тельским для oбъeктaOutline является oбъeктWorksheet. Общие свойства объекта Outline Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Outline Имя Тип возвращае- Описание мого значения Automatic- Boolean Styles Summary- XlSummary- Col umn Column SummaryRow XlSummaryRow Устанавливает/возвращает необходимость автоматиче­ ского назначения стилей Устанавливает/возвращает расположение итогового столбца: справа (xlRight) или слева (xlLeft) Устанавливает/возвращает расположение итогового столбца: выше (xlAЬove) или ниже (xlBelow)
806 Приложение А Методы объекта Outline Имя Тип возвращае- Параметры мого значения Описание ShowLevel Variant Пример: объект Outline 'sub ·showoutl.Ine.STГ? [RowLevels], [ColumnLevels] Показывает информацию о строках и столбцах более высокого уровня, на к оторые указывают параметры RowLeve l s и ColumnLevels соответ­ ственно . Информация об остальных уровнях остается скрытой ; -Dirn oOutl As Outline ' Сгруппировать. не.которые строки Activesheet.Range("4:5") .Group ' Получить объект Outline Set oOutl " =. Act i veSheet.Outline ' Отформат~ровать отображение структуры With oOutl · ' t· . S howLevels ·1 . Surnrnar:yRow · End With xlSurnrnaryAbove End Sub Объект PageSetup Объект PageSetup предоставляет доступ к функциональности диалогового окна Пар аметры страницы (Page Setup). Возможными родительскими объектами могут быть объект Chart и объект Worksheet. Общие свойства объекта PageSetup Определения свойств Application, Creato r и Parent приводились в начале при· ложения. Свойства объекта PageSetup Имя BlackAnd- Whi te BottomМargin CenterFooter CenterFooter- Picture Center- Horizontally Center- Ver tically Тип возвращае- Описание мого значения Boo l ean DouЫe String Graphic Boolean Boo l ean Устанавливает/возвращает необходимость печати эле­ ментов л и ста в черно-белом режиме. Если родительским объектом является Chart, это свойство не применяется Устана вливает/возвращает нижнее поле страницы в пунктах Уста навливает/воз вращает текст центральной части верхнего кол онт итула Только чтение. Возвращает изображение, которое рас­ положен о в центральной части колонтитула Устанавливает/возвращает необходимо~ть расположе­ ния л и ста или диаграммы в центре листа по горизонтали Устанавливает/возвращает необходимость расположе­ ния листа или диаграммы в центре листа по вертикали
Имя ChartSize Draf t FirstPage- NumЬer FitToPages - Tall FitToPages- Wide FooterMargin HeaderMargin Le f t Footer LeftFooter- Picture t. e ftHeader LeftHea der - P icture LeftMargin Order Orientation PaperSize PrintArea Объектная модель Excel 2003 807 Тип возвращае- Описание мого значения XlObj ectsize Устанавливает/возвращает необходимость масштабиро­ вания диаграммы для размещения на одной странице (xlFullPage или xlFitToPage) или печати с теми же размерами, что и на экране (xlScreenSize). Это свой­ ство не применяется, если родительским объектом явля­ ется Worksheet Bool ean Long Variant Variant DouЫe DouЫe St ring Graphic String Gr aphic DouЫe XlOrder Xl P age- Orienta t i on XlPaperSize String Устанавливает/возвращает необходимость печати гра­ фических элементов. Значение True означает, что гра­ фические изображения печататься не будут Устанавливает/возвращает номер первой страницы. Для автоматической установки номера воспользуйтесь кон­ стантой xlAutomatic (это поведение, принятое по умолчанию) Устанавливает/возвращает количество страниц в высоту, на которые будет распечатан лист. Если установить это свойство в значение False, будет использовано свойст­ во Fi tToPagesWide Устанавливает/возвращает количество страниц в шири­ ну, на которые будет распечатан лист. Если установить это свойство в значение False, будет использовано свойство Fi tToPagesTall Устанавливает/возвращает расстояние от нижнего края страницы до н ижнего колонтитула (в пункта х) Устанавливает/возвращает расстояние от верхнего края страницы до верхнего колонтитула (в пунктах) Устанавливает/возвращает текст левой части нижнего колонти тула Только чтение . Возвращает изображение для левой час­ ти нижнего колонтитула Устанавливает/возвращает текст левой части верхнего колонтитула Только чтение. Возвращает изображение для левой час­ ти верхнего колонтитула Устанавливает/возвращает левое поле страницы в пунктах Устанавливает/возвращает способ нумерации страниц при печати больших листов (например, xlDownTh e OVer, xlOverThe nDown). Это свойство не используется, если родительским объектом является Chart Устанавливает/возвращает ориентацию страницы: xlLandscape или x l Portrai t Устанавливает/возвращает размер бумаги (например, xlPaperLette~,xlPaperLegal) Устанавливает/возвращает печатаемый диапазон листа . Если это свойство установлено в значение False , будет напечатан весь лист. Это свойство не используется, если родительским объектом является объект Chart
808 Приложение А Имя Тип возвращае- Описание мого значения PrintCoппnents XlPrintErrors Устанавливает/возвращает тип отображаемых ошибок печати. Это позволяет подавлять сообщения об ошибках Print- Gridlines Boolean PriritHeadings Boolean PrintNotes Boolean PrintTitle - String Columns PrintTitle- String Rows RightFooter String RightFooter- Graphic P i cture RightHeader String RightHeader- Graphic Picture RightMargin DouЫe TopMargin DouЫ e Zoom Variant Методы объекта PageSetup при печати листа Устанавливает/возвращает необходимость печати на­ правляющих линий листа. Не используется, если роди­ тельским объектом является Chart Устанавливает/возвращает необходимость печати заго ­ ловков столбцов и строк Устанавливает/возвращает необходимость печати свя­ занных с ячейками заметок . Не используется, если роди­ тельским объектом является Chart Устанавливает/возвращает столбцы, которые необходи­ мо повторять в левой части каждой страницы Устанавливает/возвращает строки, которые необходимо повторять в верхней части каждой страницы Устанавливает/возвращает текст правой части нижнего колонтитула Только чтение . Возвращает изображение для правой части нижнего колонтитула Устанавливает/возвращает текст правой части верхнего колонтитула Только чтение . Возвращает изображение для правой части верхнего колонтитула Устанавливает/возвращает размер правого поля страни­ цы в пунктах Устанавливает/возвращает размер верхнего поля стра ­ ницы в пунктах Устанавливает/возвращает степень масштабирования листа (в процентах от 10 до 400}. Не используётся, если родительским объектом является Chart Имя Тип возвращае- Параметры Описание мого значения PrintQuality Variant [Index] Пример: объект PageSetиp siiЬ }зetui)iiagi{{ Г' ' Diпi oPS .As . PageSetup , • Т!олучить объект PageSetup для листа Set .• pPS =· Act .i veSheet . Pa geSetup 'Настроит ь страниЦу Устанавливает/возвращает качество печа­ ти. Параметр Index позволяет указать ка­ чество печати по горизонтали (1) и верти­ кали (2) Wit~ oPS . . · Ус;тановитЬ раЗмер страницы в соответствии с ~· JlРш:!Ять~ ~ д?!iJiОЙ ~1::1еС_Т 1}9С~И. требОJ?а!iИ.f!МИ'
Объектная модель Excel 2003 809 ·7P~J?e:~S1~ze:··~··.- f.Il"L·o~a]j?~p~er ·~_r ,z·e-·~~ ,·ч;··,~ г·,~.- ~ бr i eptation = ' xlPortraiti /' >Вернуть · •. ра,змер . ' "·. \ . . fnLocalPap.erSiz·e \ f_yJ;j;c t .ioJ;l ., ... ~- Объект Рапе и коллекция Panes Коллекция Panes поддерживает управление различными панелями окна. Объект Pane является эквивалентом единственной панели окна. Родительским для коллекции Panes является объект Window. Кроме типичных атрибутов, коллекция Panes предоставляет свойство Count. Это свойство возвращает количество объектов Pane в коллекции. Общие свойства коллекции Рапе Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Рапе Имя Тип возвращае- Описание мого значения Index Long ScrollColшnn Long ScrollRow Long VisiЬleRange Range Методы объекта Рапе Только чтение. Возвр.ащает положение объекта Pane в коллекции Устанавливает/возвращает номер самого левого столбца в панели окна Устанавливает/возвращает номер самой верхней строки iэ панели окна Только чтение . Возвращает диапазон ячеек, видимых в панели окна Имя Тип возвращае- Параметры мого значения Описание Activate Boolean LangeScroll Variant [Down], [Up]' [ToRight], [ToLeft] · Активизирует панель Выполняет прокрутку документа в ука­ занном направлении на целый экран
810 Приложение А Имя Тип возвращае- Параметры мого значения Описание Scrollinto- View SrnallScroll Variant Left As Long, Тор As Long, Width As Long, Height As Long, [Start] [Down], [Up]' [ToRight], [ToLe ,ftJ Прокручивает документ для отображе­ ния то ч ки, которая определяется пара­ метрами Left, Тор, Width и Height. Указанная точка располагается в верх­ нем левом углу панели (start = True) или в нижнем правом углу панели (start = False). Параметры Left, Тор, Width и нeight указываются в пунктах Прокручивает документ в указанном на­ правлении на одну строку Пример: объект Рапе и коллекция Panes ~ ·····-~"'· ., . ."~..., \_... ".~ .. ··~ "' .." ' Sub Sc:tollActivePane () Dim oPane As Pane . Dirn oRNg As Rang.e ; ' Диапазо1:1, который · будет показан Set oRNg = Range("GЗ:JlO") " ' Получить . активную па.нель . . . . . Set oPane ·;, , Application.Act.iveWindow.!\.ctivePiнie ' Прокрутить панель для отображения диапазона в oPane. ScrollColurnn = .oRNg. Colu.пill :.. ·· · · oPane. ScrollRow ; oRNg. Row .· t)3!1d.. 81tJ.? : ,·: . -· . .w .. Объект Parameter и коллекция Parameters В коллекции Parameter~ хранится список пара..\1етров, связанных с таблицей запросов . Если ни одного параметра не сущ~ствует, в коллекции отсутствуют объекты Parameter. Каждый объект Parameter соответствует одному параметру таблицы запроса . Родитель­ ским для коллекции Parameters является объект QueryТaЬle. Кроме типичных атрибутов, коллекция· Parameters предоставляет несколько до­ полнитеЛьных свойств. Все они перечислены в следующей таблице. Свойства и методы коллекции Parameters Имя Count Add Delete Тип возвращае- Описание мого значения Long Pararneter Только чтение . Возвращает количество объектов Pararne- ters в коллекции Метод. Параметры: Narne As String, [ iDataType J . До­ бавляет параметр в коллекцию, создавая новый параметр запроса для родительской таблицы запроса. Тип создавае­ мого параметра указывается через параметр iDataType (для этого можно воспользоваться константами Xl PararneterDataType) Метод . Удаляет объекты Pararneter из коллекции
Объектная модель Excel 2003 811 Общие свойства объекта Parameter Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Parameter Имя Тип возвращае- Описание мого значения DataType Name XlParameter- DataType String PromptString String RefreshOn- Boolean Change · SourceRange Range Туре Value XlParameter- Type Var i ant Методы объекта Parameter Устанавливает/возвращает тип данных параметра Устанавливает/возвращает имя параметра Толь ко чтение. Возвращает вопрос, который задается пользователю для получен ия значения параметра Устанавливает/возвращает необходимость обновления результатов таблицы запроса при изменении значения параметра Только чтение. Возвращает диапазон, в котором хранится значение параметра Толь ко чтение. Возвращает тип параметра (например, xlConstant, xlPrompt или xlRange). xlConstant оз­ начает, что значение параметра храни тся в свойстве Value. xlPrompt означает, что значение запрашивается у пользователя. xlRange означает, что в свойстве Value определяется диапазон ячеек, в которых хранится значе­ ние параметра Только чтение. Возвращает значение параметра Имя Тип возвращае- Параметры мого значения Описание SetParam Туре As XlParameterType, Value _ Пример: объект Parameter и коллекция Parameters rsu:ь,"' upcla·t:eQuerY-<)~ ·- --~. · · - ,' D,im oPararn As Parameter -"' ' ' :' йспользуетс.s:r таблица · запроса? Wi th<'дcti:veSheet. QueryTaЬles (1) ·· ' :• ; получить первый параметр · ' Set oParam =. ., Parameters ( 1) ;, ' . Установить его значение ·_oParam. se~Param · xlCohstant, зaripoc " Company" Устанавливает/возвращает тип па­ раметра и значение параметра -r:·
812 ПриложениеА Объект Phonetic и коллекция Phonetics В коллекции Phonetics хранится весь фонетический текст диапазона. Объект Pho- netic соответствует единственной строке фонетического текста. Родительским для кол­ лекции Phonetics является объектRаngе. Кроме типичных атрибутов, коллекция Phonetics предоставляет несколько свойств и методов. Они перечислены в следующей таблице. Свойства и методы коллекции Phonetics Имя Тип возвращае- мого значения Alignrnent Long Character- Long Туре Count Long Font Fonc Length Long Start Long Text String VisiЫe Boolean Add Delete Описание Устанавливает/возвращает выравнивание фонетического текста. Для установки этого свойства используются кон ­ станты XlPhoneticAignment Устанавливает/возвращает тиri используемого фонетиче­ ского текста. Для установки этого свойства используются константы XlPhoneticCharacterType Только чтение . Возвращает количество объектов Pho- netic, хранящихся в коллекции Только чтение. Возвращает объект, в котором хранятся параметры шрифта для текста в коллекции Phonetics Только чтение. Возвращает количество символов фонети­ ческого текста начиная с точки, определенной свойством Start Только чтение. Возвращает положение перво'го символа строки фонетического те кста. Свойство используется, только если в коллекции существуют объекты Phonetic Устанавливает/возвращае т фонетический текст. Свойство используется, только если в коллекции существуют объ­ екты Phonetic Уста навливает/возвра щает видимость фонетического тек­ ста для пользователя . Свойство применяется, только если в коллекции существуют объекты Phonetic Метод . Параметры: Start As Long, Length As Long, техt As String. Добавляет в коллекцию объект Pho - netic, расположенный в ячейке родительского объекта Range Метод . Удаляет все объекты Phonetic из коллекции Общие свойства объекта Phonetic Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 813 Свойства объекта Phonetic Имя Alignrnent Character- Type Font Text VisiЫe Тип возвращае- Описание мого значения Long Long Font String Boolean Устанавливает/возвращает выравнивание фонетического текста. Для установки свойства используются константы XlPhoneticAlignrnent Устанавливает/возвращает тип используемого фонетиче­ ского текста. Для установки свойства применяются кoн­ cтaнты xlPhoneticCharacterType Только чтение. Возвращает объект, содержащий парамет­ ры шрифта для фонетического текста Устанавливает/возвращает фонетический текст Устанавливает/возвращает видимость фонетического тек­ ста для конечного пользователя Объект PictureFormat Этот объект предоставляет возможность управления свойствами рисунка в пределах родительского объекта Shape. Общие свойства объекта PictureFormat ' Определения свойств Application, Creator и Parent приводились в начале при- ложения. Свойства объекта PictureFormat Имя Brightnes·s ColorType Contrast CropBottom CropLeft CropRight CropTop Transparency- Color ' Transparent- Background Тип возвращае- мого значения Single MsoPicture- ColorType Single Single Single Single Single Long MsoTriState Описание Устанавливает/возвращает яркость родительской гео­ метрической фигуры (от О до 1, где 1 соответствует мак­ симальной яркости) Устанавливает/возвращает тип цвета родительской гео­ метрической фигуры Устанавливает/возвращает контраст родительской гео­ метрической фигуры (от О до 1, где 1 соответствует мак­ симальному контрасту) .Устанавливает/возвращает размер удаляемого фрагмен­ та в нижней части рисунка Устанавливает/возвращает размер удаляемого фрагмен­ та в левой части рисунка Устанавливает/возвращает размер удаляемого фрагмен­ та в правой части рисунка Устанавливает/возвращает размер удаляемого фрагмен­ та в верхней части рисунка Устанавливает/возвращает цвет, который используется для обозначения прозрачности Устанавливает/возвращает необходимость включения прозрачности для прозрачного цвета
814 Приложение А Методы объекта PictureFormat Имя Тип возвращае- Параметры Описание мого значения Increment- Brightness Increment·- Contrast Пример: объект PictureForтat · sиь - set.Pl'ct'U.reform'atT J · · · ' D·im o$hp лs sЬ:a]:Je . Dim oPF As Pi·cttireFbrmat Increment As Single Increment As Single For Each 6Shp In•· ActiveSheet. Shapes If. oShp.Type = .msoPicture Theri Увеличивает яркость на значение пара­ метра Increment Увеличивает контраст на значение пара ­ метра Increment ' . ПоJ~учить объект · PictureFo'rmat Set . ·OPF = oShp. PictureFormat . ' • Установить формат рИсунка With oPF ·· · ;тri;ihsparentBackground msoTrue . тr·9.nsparencycolor = RGB(25s·., О , О} . ColorType msoPictureWa termar.k End 0With , EndIf, ; . Next. · ;End sчJ;> ;;. Объект PivotCache и коллекция PivotCaches В коллекции PivotCaches хранятся области памяти с данными отчетов сводной таблицы. Каждый объект PivotCache соответствует одному фрагменту памяти для от­ чета сводной таблицы. Родительским объектом коллекции PivotCaches является объ­ ект Workbook. Кроме этого, для объекта PivotCache родительским может быть объект PivotTaЬle. Кроме типичных атрибутов, коллекция PivotCaches предоставляет свойство Count и метод Add. Свойство Count возвращает количество объектов в коллекции. Метод Add принимает параметр SourceType (значением этого параметра может быть одна из кон­ стант XlPivotTaЬleSourceType) и параметр SourceData и добавляет объект Pivot- Cache в коллекцию. Общие свойства объекта PivotCache Определения свойств Application, Creator и Pare~t приводились в начале при­ ложения. Свойства объекта PivotCache Имя ADO- Connec t ion Тип возвращае- Описание мого значения Object Только чтение. Возвращает объект подключения ADO, ес­ ли объект Pivotcache подключается к источнику данных OLE DB
Объектная модель Excel 2003 815 Имя Тип возвращае- Описание мого значения Background- Boolean Query ComrnandText Variant ComrnandType XlCmdType Connection Variant ЕnаЫе - Boolean Refresh Index Long IsConnected Boolean Local- String Connection Maintain- Boolean Connection MemoryUsed Long Missing- XlPivotTaЬle- ItemsLimit Missingitems OLAP Boolean Optimiz e- Bool e an Cache QueryType xlQueryType Re cordCount Long Recordset RefreshDate Date Устанавливает/возвращает необходимость асинхронной обработки запросов в отчете сводной таблицы. Значение False используется для источников данных OLAP Устанавливает/возвращает команду SQL, которая исполь­ зуется для получения данных Устанавливает/возвращает тип свойства commandText (например, xlCmdSQL, xlCmdTaЬle) Устанавливает/возвращает строку подключения OLE DB, строку ODBC, источник данных в Web, путь к текстовому файлу или путь к базе данных 1 Устанавливает/возвращает возможность обновления дан­ ных в кэше сводной таблицы. Для источников данных OLAP это свойство всегда установлено в значение False Только чтение. Возвращает положение объекта в коллекции Только чтение. Возвращает состояние подключения объ­ екта Pivotcache к источнику данных Устанавливает/возвращает строку подключения для авто­ номного файла куба. Для источников данных , отличных от OLAP, эт.о свойство не устанавливается . Используется совместно со свойством UseLocalConnection Устанавливает/возвращает необходимость сохранения подключения к источнику данных до закрытия книги. Ис­ пользуется только для, источнИков данных OLE DB Только чтение. Возвращает объем памяти (в байтах), вы­ деленной для объекта PivotCache Устанавливает/возвращает максимальное количество уникальных элементов, которые сохраняются для поля сводной таблицы, даже если в записях кэша отсутствуют соответствующие данные Только чтение. Возвращает состояние подключения объ­ екта Pi votCa che к серверу OLAP Устанавливает/возвращает необходимость оптимизации кэша сводной таблицы при построении. Для источников данных OLE DB это свойство всегда установлено в значе­ ние False Только чтение. Возвращает тип подключения, связанного с таблицей запроса (например, x l OLED BQu ery, x lDAO - Qu e ry, x l Textimport) Только чтение. Возвращает количество записей в кэше сводной таблицы Устанавливает/возвращает набор записей, который ис­ пользуется в качест-ве источника данных для кэша свод­ ной таблицы Только чтение. Возвращает дату последнего обновления кэш а
816 ПриложениеА Имя Тип возвращае- Описание мого значения RefreshOn- FileOpen Refresh- Period Robust- Connect Save- Password Source- Connection- File SourceDat_a SourceData- F ile Sou rceType UseLocal- Connection Boolean Long XlRobust- Connect Bool ean String Variant String XlPivotT aЬle - SourceType Boolean Методы объекта PivotCache Уста навливает/возвращает необход имость обновления кэша сводной та блицы п ри открытии книги Устанавливает/возвращает длительность интервала (в ми н утах) автоматического обновления из источника данных. Для отключения автоматичес ко го обновления ус­ тановите свойство . в значение О Уста навливает/воз вращает метод, с помощью которого объект Piv otcache подключается к источ нику данных Устанавливает/воз вра.щает необходимость сохранения пароля подключения ODBC в табли це запроса Уста~а вливает/возвращает имя файла, который исполь­ зовался для создания сводной таблицы Устанав ливает/возвращает источник данных для отчета свод н qй таблицы Только чтение. Возвращает имя файла с исходными дан ­ ными для объекта P ivotcache Тол ько чтени е . Возвращает значение, идентиф ицирующее тип публикуемого элемента Уста навливает/воз вращает необходи мость применения свойства Localco nnec t ion для установки и сточника данных. Значение F al s e означает, что используется свойство Co nnec tion. Это свойство по з воляет автоном­ но работать с некоторыми источниками данн ы х Имя Тип возвращае- Параметры мого значения Описание CreatePivot- PivotTaЬle ТаЫе Make- Conne c t ion TaЬleDes t inati on As Variant, [TaЬl eName ], [Read Data ], [Defaul tVe rsion] Создает отчет сводной таблицы, ко­ торый основа н на текущем объекте PivotCach e . Параметр TaЬleDes­ t ination указывает на расположе­ ние нового отчета сводной таблицы. Кроме этого, можно указать значение парам етра TaЬleName. Для заполне­ ния кэша всеми записями из внешней баз ы данных параметр ReadData ус­ танавливается в значение Tr u e . Для получения только части данных па­ ра метр ReadData устанавливается в значение Fa l se. Параметр De - faul tVersion позволяет указать принятую по умолчанию версию от­ чета сводной таблицы Уста навли вает подключение для указанного объекта P i votCache
Объектная модель Excel 2003 817 Имя Refresh ResetTimer SaveAsODC Тип возвращае- Параметры мого значения ODCFileName As String, [Description], [Keywords] Описание Обновляет данные в кэше сводной таблицы из последней копии внеш­ них данных. Для асинхронного об­ новления данных параметр Back- groundQuery устанавливается в значение True Сбрасывает таймер автоматиче­ ского обновления, который уста­ навливается с помощью свойства RefreshPeriod Сохраняет источник объекта Piv- otcache в файле Office Data Соп­ песtiоп (ODC). Параметр ODCFile- Name указывает на положение со­ храняемого файла. Параметр De- scription содержит описание содержимого файла. Через пара­ метр Keywords передается разде­ ленный пробелами список ключе­ вых слов, которые можно исполь­ зовать при поиске этого файла Пример: объект PivotCache и коллекция PivotCaches_ ' sч.ti' R.etreshi?:tv6tcaC:Ьe( > · , ..•. · . Dim ОРС дs ' PivotCache . , ...· >, Set . oF'C = ActiveWorkЬ66k.Eivo1;C~ches(l) Wi th оРС . . ·, '' , ·~· '. '. {: . ::: ,;:> ' Обновл~н11е в.. интера к тищ~ом режиме :8ackgrouцdQueiy " ~ · F·a ·1 $е " J:·~ -х; -. -~-:,;+><' ,' '->• ' Обнов.rrЯТЬ ;. т.Оль'ко фе Д~~ные, которьtе старwе '· 1 :raca · . If .RefreshDate· < :Now , тimeValue( "01: оо: 00") тhen ·· . Refresh .>· - . ·ic :'·· · End If EndWith iErlQ_; Sl,l]:) Объект PivotCell Этот объект соответствует ячейке в пределах сводной таблицы. Для доступа к объекту Р i votCel 1 используется объект Range. После этого свойства объекта Р i votCel 1 при­ меняются для извлечения данных из сводной таблицы. Например, свойства Pivot- CellType, Columnitems и RowI.tems позволяют получить объем продаж, сделанных конкретным продавцом по заданному региону. Функциональность этого объекта дублирует функциональность- функции листа GETPIVOTDATA и метода PivotTaЬle. GetPivotDa ta. Но при этом объект PivotCell предоставляет информацию о положении ячейки в отчете. Функция GETPIVOTDATA и метод GetPivotDa ta обеспечивают обратную функциональность. Они возвращают значение, связанное с предоставленными заголовками строки и столбца .
818 Приложение А Общие свойства объекта PivotCell Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта PivotCell Имя Columnitems Тип возвращаемо- Описание го значения PivotitemList Только чтение . Возвращает элементы, которые со­ ответствуют выделенному диапазону на оси столбцов CustomSubtotal- XlConsolidation- Только чтение. Возвращает собственную функцию Function Function итогов для объекта PivotCell DataField PivotCellType PivotField Pivotitem PivotTaЬle Range Rowitems PivotField Тоilько чтение. Возвращает выделенное поле данных XlPivotCellType Только чтение . Возвращает сущность сводной таб­ лицы, которой соответствует выделенная ячейка PivotField Pivotitem PivotTaЬle Range . PivotitemList Только чтение. Возвращает поле сводной таблицы, содержащее верхний левый угол указанного диапа- зона Только чтение. Возвращает элемент сводной таб­ лицы, содержащий верхний левый угол указанного диапазона Только чтение. Возвращает отчет сводной табли­ цы, в котором содержится верхний левый угол ука­ занного диапазона, или отчет сводной таблицы, связанный с отчетом сводной диаграммы Только чтение. Возвращает диапазон, к которому относится указанный объект PivotCell Только чтение. Возвращает элементы, представ­ ляющие выделенный диапазон на оси строк Объект PivotField, коллекция PivotFields и коллекция Calcu latedFields В коллекции PivotFields хранятся поля, связанные с родительским отчетом свод­ ной таблицы. В коллекции CalculatedFields хранятся вычисляемые поля, связанные с родительским отчетом сводной таблицы. Каждый объект PivotField соответствует одному полю в отчете сводной таблицы . Родительским объектом для коллекций Pivot- Fields и CalculatedFields является объект PivotTaЬle. Кроме типичных атрибутов, коллекции PivotFields и CalculatedFields пре­ доставляют одно дополнительное свойство Count, возвращающее количество полей в родительской коллекции. Кроме этого, коллекция CalculatedFields предоставляет метод Add, который добавляет в коллекцию новое вычислимое поле с использованием параметров Name и Formula. Общие свойства объекта PivotField Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Excel 2003 819 Свойства объекта PivotField Имя AutoShow- Count AutoShow- Field AutoShow- Range AutoShow- Туре Aut o Soft- Field AutoSort - Order Ba seField Baseit em Тип возвращае- Описание мого значения Long String Long Long St ring Long Variant Variant Только чтение . Возвращает количество верхних или ниж­ них элементов, которые автоматически отображаются в поле сводной таблицы Только чтение. Возвращает имя поля с данными, которое • используется для определения списка верхних или нижних элементов, отображаемых автоматически в поле сводной таблицы Только чтение. Возвращает значение .xlТор , если авто­ матически отображаются верхние элементы, или x lBot- tom, если отображаются н и жние элементы Только чтение. Возвращает xlAutomatic, если свойство AutoShow установлено в значение True, или xlManual, если свойство AutoShow отключено Только чтение. Возвращает имя поля данных, которое ис­ пользуется для автоматической сортировки полей свод­ ной таблицы Только чтение. Возвращает одну из констант XLSortor- der, описывающих тип автоматического порядка сорти ­ ровки полей Устанавливает/возвращает базовое поле, которое исполь­ зуется для расчетов . Относится только к полям данных Устанавливает/возвращает базовый элемент в базовом поле, который используется для расчетов. Относится только к полям данных Calculation XlPivotField- Устанавливает/возвращает тип расчетов, которые выпoл- Calcula tion няются по отношению к полю данных Ca ption String Устанавливает/возвращает, текстовую метку, которая ис­ пользуются для обозначения поля Chi l dFiel d PivotFiel d Только чтение. Возвращает дочернее поле текущего поля (если такое поле существует) Ch i l ditems Varian t Только чтен viе . Параметры: [ Index ]. Возвращает объект или коллекцию, содержащую один (Pivotitem) или груп­ пу элементов сводной табл ицы (Pivotitems), связанных с полем CubeField Cu rren tPage Current- PageList Cu rrent- PageName DataRan ge CubeFi eld Variant St ring Ran ge Только чтение. Возвращает поле куба, на основе которого создавалось текущее поле сводной таблицы Устанавливает/возвращает текущую стран и цу , на которой показано поле страницы. Относится только к полям страниц Устанавливает/возвращает массив строк, которые соот­ ветствуют списку элементов, входящих в многоэлемент­ ное поле страницы отчета сводной таблицы Устанавливает/возвращает отображаемую страницу отче­ та сводной таблицы Только ч~ние. Возвращает диапазон, содержащий дан­ ные или элементы поля
820 Приложение А Имя DataType Тип возвращае- Описание мого значения XlPiv otField- Только чтение. Возвращает тип данных поля сводной таб- DataType DatabaseSort Boolean лицы Устанавливает/возвращает возможность ручного переме­ щения элементов внутри поля сводной таблицы. Если DragToColшnn DragToData DragToHide DragToPage DragToRow Dri l l edDown EnaЬleitem- Selection Formula Func'ti on GroupLevel Hiddenitems Hiddehitems - List IsCalculated IsMemЬer- Proper t y Labe l Range Layout- BlankLine LayoutForm La y o utPage- Break Boolean Boolean Boolean Boolean Boolean Boo l ean Boolean S tring XlCon solida- tionF unction Variant Variant Variant Boo lean Bool ean Ran ge Boolean XlLayoutForm- Тур е Bool ean в поле отсутствуют перемещенные вручную элементы, это свойство возвращает значение True Устанавливает/возвращает возможность перетаскивания поля в позицию столбца Устанавливает/возвра'щает возможность перетаскивания поля в позицию данных \ Устанавливает/возвращает возможность перетаскивания поля за пределы отчета сводной таблицы с последующим сокрытием Устанавливает/возвращает возможность перетаскивания поля в позицию страницы Устанавливает/возвращает возможность перетаскивания поля в позицию строки Устанавливает/возвращает возможность разворачивания поля Устанавливает/возвращает возможность использования раскрывающегося списка поля через пользовательский интерфейс Устанавливает/возвращает формулу , связанную с полем сводной таблицы Устанавливает/возвращает тип функции, которая исполь ­ зуется для получения итогов поля сводной таблицы Только чтение. Возвращает размещение поля в группе по­ лей Только чтение. Параметры: [ Index J. Возвращает объект или коллекцию, содержащие один (P i votI tem) или группу (Pivotite ms ) скрытых элементов сводной таблицы, свя ­ занных с полем Устанавливает/возвращает массив строк, которые явля­ ются скрытыми элементами поля сводной таблицы Только чтение. Воз~ащает информацию о том, является ли поле сводной таблицы вычислимым Только чтение . Возвращает наличие свойств внутри поля сводной таблицы Тол ько чтение . Возвращает диапазон ячеек , содержащий метку поля Устанавливает/возвращает необходимость добавления пустой строки после текущей строки поля Устанавливает/возвращает способ отображения элемен­ тов в пределах поля Устанавливает/возвращает необходимость вставки раз­ рыва страницы после каждого поля
Имя Layout- Subtotal- Locatio n MemoryUsed Name NumЬerFormat Orientation ParentField Parentitems Position Property- Order Prope rty- Pare ntFie l ·d ServerBased ShowAllitems SourceName Standard- Formula SubtotalName Subtotals TotalLevel s Value VisiЬlei tems Тип возвращае- мого значения XlSubtotal- Locat ionType Long String String XlPivotField- Orientation PivotField Variant Variant Long PivotField Boolean Boolean String String String Variant Varian t String Vari ant Объектная модель Excel 2003 821 Описание Устанавливает/возвращает расположен~е итогов полей относительно те кущего поля Только чтение. Возвращает выделенную для хранения по­ ля память в байтах Устанавливает/возвращает имя поля Устанавливает/возвращает формат, который использует­ ся для отображения чисел Устанавливает/возвращает расположен ие полs;1 в отчете сводной таблицы Только чтение. Возвращает родительское поле текущего поля Толь ко чтение. Параметры : [ Index]. Возвращает объект или коллекцию, содержащую один (Pivotitem) или груп­ пу (Pi vo tI tems) родительских злементов сводной табли­ цы , связанных с полем Устанав лив ает/возвращает положение поля среди други х поле й с такой же ориентацией Устанавливает/возвращает положение свойства на экране внутри поля куба, которому свойство принадле жит (установка этого свойства пр иведет к изменению поряд­ ка) . Используется только вместе с объектам И Pivot- Field, которые являются полями свойств-членов Только чтение . Возвращает поле, с которым связаны свойства в этом поле Устанавливает/возвращает необходимость извлечения из внешнего источника данных только тех эле ментов , кото­ рые соответствуют выделен ным полям страницы Устанавливает/возвращает необходимость отображения всех элеме нтов поля Только чте ни е. Возвращает имя и сточн ика данных для этого поля Устанавливает/возвращает формулы с использованием ' региональны х стандартов США Устанавливает/возвращает метку, которая используется для столбца или строки итогов для этого пол я Параметры: [ Index J. Устанавлив ает/возвращает итоги, п оказан ны е для_ этого поля Только чте ни е. Возв ра щает общее количество полей в те­ кущей группе полей Устанавливает возвращает имя поля Только чтение . Параметры: [ rndexJ. Возвращает объект или коллекцию, содержа щую один (Pivotrtem) или груп­ пу (Pivot.rtems) видимы х элементов сводной таблицы, связанных с полем
822 Приложение А Методы объекта PivotField Имя Тип возвращае- Параметры мого значения Описание AddPageitem AutoShow AutoSort Calculated- Calculated- . Items Items Delete Pivotitems Variant Item As String, [ClearList] Туре As Long, Range As Long, Count As Long, Field As String Добавляет дополнительные элемен­ ты в поле страницы, состоящее из нескольких элементов . Параметр Item содержит имя исходного объек­ та Pivotitem, соответствующего уникальному имени конкретного чле­ на OLAP. Параметр ClearList ука­ зывает на необходимость удаления существующих элементов перед до­ бавлением нового элемента Устанавливает количество верхних или нижних элементов, которые должны отображаться для поля стро­ ки, страницы или столбца. Параметр Туре описывает автоматическое или ручное расположение элементов (xlAutomatic или xlManual ). Па­ раметр Range указывает на распо­ ложение начала списка элементов. Параметр Count содержит количест­ во отображаемых элементов поля . Параметр Field содержит базовое имя поля данных Order As Long, Устанавливает автоматическую cop- Field As String тировку поля в зависимости от со­ держимого параметра Order (для [Index] установки параметра используются константы XlSortOrder) и базовых данных, на которые указывает пара­ метр Field Возвращает группу вычислимых элементов сводной таблицы, связан­ ных с полем Удаляет объект PivotField Возвращает объект или коллекцию, содержащие один (Pivotitem) или группу (Pivotitems) элементов сводной таблицы, связанных с полем Пример: объект PivotField, коллекция PivotFields и коллекция CalculatedFields '· ГSЦБ"fflfi:dd:FJ. ei<Г(J ~~""'"":~: Dim ОРТ As PivotTable Dim''" oPF As. PivotField· · . 's et;' oPT ~ Activ:esheet.i?ivotтab1es(l) / · YcтaнaвлИsaeт ' apГ:{Мeнт · useStandardFormula' !} значение ' При. э.Тоt,1 ' имеяа .Полей в' формуле будут отформатированы : в ·; соот.ветств,,ш с региона:Пь ными стандартамИ сшА, а не . с ; ~.1:~~у~~ pe:ГиOH?,Jl~1:!~ · 11'3.P.i3.M~.'I'Ri3.~.: .. .Q.бр~[г,1'1'!'.ем. А.I:!~§-11~~; ;''"""·. ,
Объектная модель Excel 2003 823 Объект PivotFormula и коллекция PivotFormulas В коллекции PivotFormulas хранятся формулы, связанные со сводной таблицей. Каждый объект PivotF'ormula соответствует формуле, которая используется в отчете сводной таблицы. Родительским объектом коллекции PivotFormulas является объект PivotTaЬle. Кроме типичных атрибутов, коллекция PivotFormulas предоставляет метод Add и свойство Count. Свойство Count возвращает количество элементов в коллекции . Ме­ тод Add принимает в качестве параметра строку Formula и добавляет объект Pivot- Formula в коллекцию. Общие свойства объекта PivotFormula Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта PivotFormula Имя Тип возвращае- мого значения Formula String Index Long Standard- String Formula Value String Описание Устанавливает/возвращает формулу, связанную с табли­ цей. В формуле должны использоваться ссылки в форма- те А1 · Только чтение. Возвращает порядок обработки формулы в родительской коллекции Устанавливает/возвращает формулы с использованием региональных стандартов США Устанавливает/возвращает формулу, связанную с таблицей Методы объекта PivotFormula 1 Имя Тип возвращае- Парамfры Описание мого значения Delete Удаляет формулу из родительской коллекции Объект Pivotltem, коллекция Pivotltems и коллекция Calculatedltems В коллекции Pivotitems хранятся записи данных из поля. В коллекции Calculat - editems хранятся вычислимые записи поля. Каждый объект Pivotitem соответствует одной записи в поле данных. Родительским объектом коллекций Pivotitems и Calcu- lateditems является объект PivotField. Кроме типичных атрибутов, коллекции Pivotitems и Calculate ditems предо­ ставляют одно дополнительное свойство . Свойство Count возвращает количество обЪ­ ектов в коллекции. Кроме этого, метод Add коллекции Pivotitems позволяет добавлять
824 Приложение А новый элемент в коллекцию (при этом необходимо указать значение параметраNаmе). Метод Add коллекции Calculateditems также позволяет добавлять элементы в кол­ лекцию, но требует значений параметровNаmе и Formula. Общие свойства объекта Pivotltem Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Pivotltem Имя Caption Childitems DataRange DrilledDown Formula IsCalculated Labe l Rang e Name Parentitem ParentShow- Detail Position RecordCount ShowDe t a il S o u rceName Sou rce Na me- Standard Standard- Formula Value Vis ib],e Тип возвращае- Описание мого значения String Variant Range Boolean String Boolean Range String Pivotitem Bool ean Long Long Bool e an Vari ant Strin g String String Bool ean Устанавливает/возвращает текстовую метку, связанную с элементом Только чтение. Параметры: [ IndexJ. Возвращает объект или коллекцию, в которых содержится один (Pivotitem) или группа (Pivotitems) элементов сводной таблицы, связанных с этим элементом Только чтение . Возвращает диапазон, в котором содер­ жатся данные или элементы из этого элемента Устанавливает/возвращает возможность разворачивания элемента сводной таблицы Устанавливает/возвращает формулу, связанную с эле­ ментом Только чтение. Возвращает информацию о том, является ли элемент вычисляемым полем данных Только чтение. Возвращает диапазон ячеек , в котором расположен элемент поля Устанавливает/возвращает имя элемента Только чтение. Возвращает родительский элемент теку­ щего элемента Только. чтение . Возвращает информацию о том, отобра­ жается ли текущий элемент в результате отображения подробной структуры родительского объекта Устанавливает/возвращает положение элемента среди других элементов с такой же ориентацией Только чтение . Возвращает количество записей в кэше сводной таблицы , содержащих данный элемент Устанавливает/возвращает необходимость отображения подробной структуры элемента Только чтение . Возвращает имя исходных данных элемента Только чтение . Возвращает исходное имя элемента сводной таблицы, соответствующее региональным стандартам США Устанавливает/возвращает формулы с использованием региональных стандартов США Устанавливает/возвращает имя указанного элемента Устанавливает/возвращает видимость элемента
Объектная модель Excel 2003 825 Методы объекта Pivotltem Имя Тип возвращае- Параметры Описание мого значения Delete Удаляет элемент из колле кции Пример: объект Pivotltem, коллекция Pivotltems и коллекция Calcиlatedltems Объект PivotltemList Данный объект представляет список элементов, связанных с определенной ячейкой сводной таблицы. Доступ к этому списку осуществляется через объект PivotCell. Объ­ ект PivotitemList доступен через свойство Colшnnitems или Rowitems объекта PivotCell. Количество элементов строк или столбцов в составе об:Ьекта Pivotitem- List зависит от структуры сводной таблицы. Например, ячейка D5 в сводной таблице называется WroxSales1. В области строк слева от ячейки D5 находится заголовок строки OR (Oгego n). Слева от заголовка OR на­ ходится еще одна метка строки, которая называется Region1. На основе этой информа­ ции код выдаст значение 2: !flй.§~.9%:3;!1\:~Г~Jy'f>~~T.~J?{§·, R@g~~c~.i2~2:T:i:~x9~~eiJ~.>!fi:lw.J:·j:·§~.~.:; C()ttl1.~ ·. =:.~".·~· .="···········'""'"' '"" •'""'"' Следующий код выдаст Regionl . Это самая левая метка в строке ячейки D5. !М.i.9~91<:~.~-J\:~!:iiti(Т.~!?.~.~j~o-.~я~EiI~ 12.$ ••1.~-_i'i,Y.9 t.f§i.:t~::J<,9;&-(ц:,yn5 (1 i " Наконец, следующий код выдаст OR. Это вторая метка слева в строке ячейки D5 . 1~~9~q;.x··y;R~l\'.\i.9:fi'@JiЗ.~~iiЯ'e._(~::I"'"""'''-·":""'""="'"''~ "'~"·"~"'-'c="-"'··'= Практическое применение объектов PivotitemList и PivotCel l еще не придума­ но . Обычно нужна обратная функциональность. Необходимо получить информацию , со­ ответствующую определенным заголовкам строки и столбца. Такая функциональность обеспечивается методом GetPivotData и функцией листа GE TP IVOTDATA. Общие свойства объекта PivotltemList Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта PivotltemList Имя Count Тип возвращае- · Описание мого значения Long Возвращает количество объектов в коллекции
826 Приложение А Методы объекта PivotltemList Имя Item Тип возвращае- Параметры Описание мого значения Pivotitem Index As Variant Возвращает единственный объект Pivotitem из списка PivotitemList Объект PivotLayout Этот объект описывает расположение полей сводной диаграммы в родительской диа­ грамме . Объекты Chart и ChartGroup могут выступать в роли родительских объектов PivotChart. Общие свойства объекта PivotLayout Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта PivotLayout Имя ColumnFields CubeFields DataFields HiddenFields Тип возвращае- Описание мого значения CubeFields Только чтение. Параметры: [lпdex]. Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (PivotFields) сводной таблицы, соответствующие столбцам сводной диаграммы Только чтение. Возвращает коллекцию полей куба, свя­ занных со сводной диаграммой Только чтение . Параметры: [ I ndex] . Возвращает объект или коллекцию, содержащие поле (Pivo tField) или поля (PivotFields) сводной таблицы, соответствующие по­ лям данных сводной диаграммы Только чтение. Параметры: [ Index]. Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (Piv otFields) сводной таблицы, соответствующие скры­ тым полям сводной диаграммы InnerDetail String Устанавливает/возвращает имя поля, которое будет ото­ бражаться при установке свойства ShowDetail в значе­ ние True PageFields PivotCache PivotFields PivotTaЬle PivotCache PivotTaЬle Только чтение. Параметры: [ Index]. Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (Pi v otFields) сводной таблицы, соответствующие по­ лям страницы сводной диаграммы Только чтение. Возвращает кзш данных сводной диаграммы Только чтение. Параметры: [ IndexJ. Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (PivotFields) сводной таблицы, соответствующие по­ лям страницы сводной диаграммы Только чтение. Возвращает сводную таблицу, связанную со сводной диаграммой
Имя RowFields VisiЫe ­ Fields Тип возвращае- Описание мого значения Объектная модель Excel 2003 827 Только чтение . Параметры: [ IndexJ . Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (PivotFields) сводной таблицы, соответствующие стро­ кам сводной диаграммы Только чтение. Параметры : [ IndexJ. Возвращает объект или коллекцию, содержащие поле (PivotField} или поля (PivotFields) сводной таблицы, соответствующие ви­ димым полям сводной диаграммы Методы объекта PivotLayout Имя AddFields Тип возвращае- Параметры мого значения [RowFields], [ColumnFields], [ PageFields] , [AppendField] Пример: объект PivotLayoиt Описание Добавляет поля строк, столбцов и страниц в отчет сводно й диаграм­ мы . Параметрам RowFields, Col- umnFields и PageFields присваи­ вается одно строковое имя поля или массив строковы х имен полей. Для добавления поля к диа грамме пара ­ метр AppendField устанавливается в значение True. Для замещения поля н~ диагра\мме параметр Ap - pendField устанавливается в зна­ чение False Объект PivotTaЫe и коллекция PivotTaЫes В коллекции PivotTaЬles хранятся сводные таблицы из родительского листа. Каж­ дый объект PivotTaЬle в коллекции поддерживает создание и управление сводными таблицами Excel. Родительским объектом коллекции PivotTaЬles является объект Worksheet. Кроме типичных атрибуто13, коллекция PivotTaЬles предоставляет свойство Count и метод Add. Свойство Count возвращает количество объектов Pi vo tTaЬle в коллек­ ции. Метод Add принимает в качестве параметров новый кэш сводной таблицы (содержащий данные) и диапазон ячейки назначения , который определяет верхний ле­ вый угол отчета сводной таблицы и создает новый отчет сводной таблицы . Кроме этого, метод Add поддерживает указание имени нового отчета сводной таблицы .
828 Приложение А Общие свойства объекта PivotТaЫe Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта PivotТaЫe Имя Тип возвращае- Описание мого значения Cacheindex Long Calculated- Calculated- Members MemЬers ColumnFields Object ColumnGrand Boolean ColumnRange Range CubeFields CubeFields DataBody- Range Range DataFields Object DataLabel- Range Range DataPivot - PivotField Field Display- Boolean EmptyColumn Display- Boolean EmptyRow Display- Boolean ErrorString Display- Boolean Immediate- Items Display- Boolean NullString EnaЬleValue- Boolean Editing Устанав л ивает/возвращает номер кэша тек ущей сводной таблицы Только чтение. Возвращает все вычислимые поля и вы­ числимые элементы rекущей сводной таблицы Только чтение. Параметры: [ Index] . Возвращает объект или коллекцию, содержащие поле (Pi votField) или поля (PivotFields) сводной таблицы, соответствующие столбцам сводной таблицы Устан авливает/возвращает необходимость отображения итогов для столбцов сводной таблицы Только чтение. Возвращает диапазон ячеек, содержащих область столбцов из отчета сводной таблицы Только чтение. Возвращает коллекцию поле й куба, свя­ занных с отчетом сводной таблицы Только чтение. Возвращает диапазон ячеек, в котором расположена область данных отчета сводной таблицы Только чтение. Параметры: [ Index]. Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (Pi votFields) сводной таблицы, соответствующие по­ лям данных сводной таблицы Только чтение. Возвращает диапазон ячеек , в котором хранятся метки полей данных отчета сводной таблицы Тоriько чтение. Возвращает все поля данных из сводной таблицы Только чтение. Возвращает наличие непустого ключевого слова многомерного выражения в запросе к поставщику OLAP для оси значений ' Только чтение. Возвращает наличие непустого ключевого слова многомерного выражения в запросе к поставщику OLAP для оси кате гор ий Устанавливает/возвращает необходимость отображения строки из свойства ErrorString в ячейках, содержащих ошибки Устанавливает/возвращает необходимость отображения областей строк и столбцов, когда область данных сводной таблицы пуста Устанавливает/возвращает необходимость вывода строки из свойства NullString в ячейках, содержащих значение null Устанавливает/возвращает необходимость вывода преду­ преждения при перезаписи значений в области данных сводной таблицы
Имя Тип возвращае- мого значения ЕnаЫе- Bo1olean Drilldown ЕnаЫе- Boolean FieldDialog ЕnаЫе- Boolean FieldList EnaЬleWizard Boolean ErrorString String GrandTp tal - String Name HasAuto - Boolean Format HiddenFields ·оьj ect InnerDetail String МОХ String ManualUpdate Boolean MergeLabels Boolean Name String NullString String PageField- Long Order PageFields Object Объектная модель Excel 2003 829 Описание Устанавливает/возвращает возможность развертывания отчета сводной таблицы Устанавливает/возвращает необходимость отображения диалогового окна для поля сводной таблицы после двой­ ного щелчка на поле сводной таблицы Устанавливает/возвращает необходимость отключения списка полей сводной таблицы. Если на момент изменения свойства список показан на экране, то список исчезает Устанавливает/возвращает доступность мастера сводной таблицы Устанавливает/возвращает строку, которая отображается в ячейках с ошибками. Используется вместе со свойством DisplayErrorString Устанавливает/возвращает строку, которая отображается в заголовке столбца или строки итогов отчета сводной таблицы. По умолчанию принято значение "Graпd Total" Устанавливает/возвращает необходимость автоматиче­ ского переформатирования отче т а сводной таблицы при обновлении данных или перемещении полей Только чтение. Параметры: [ Index]. Возвра'щает объект или коллекцию, содержащие поле (PivotField) или поля (PivotFields) сводной таблицы, соответствующие скры­ тым полям сводной таблицы Устанавливает/возвращает имя поля, в котором будет по­ казана дополнительная информация при установке свой­ ства ShowDetail в значение True Только чтение. Возвращает многомерное выражение, ко­ торое отправляется поставщику для наполнения текущего представления сводной таблицы Устанавливает/возвращает необходимость ручного пере­ счета отчета сводной таблицы Устанавливает/возвращает необходимость использования объединенных ячеек в элементах внешней строки, эле­ ментах столбцов, итогах и метках общей суммы отчета сводной таблицы -устанавливает/возвращает имя отчета сводной таблицы Устанавливает/возвращает строку, которая отображается в ячейке со значением null. Используется совместно со свойством DisplayNullString Устанавливает/возвращает способ добавления новых по­ лей страницы в макет отчета сводной таблицы. Для уста­ новки этого свойства используются константы XLOrder Только чтение. Параметры: [ IndexJ . Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (PivotFields) сводной таблицы, соответствующие по­ лям страницы сводной таблицы
830 Приложение А Имя PageField- Style PageField- WrapCount PageRange PageRange- Cells Pivot- Formulas Pivot- Selection Pivot- Selection- Standard · Preserv e- Formatting PrintTitles RefreshDate RefreshName Repeatitems- OnE a ch- PrintedPage ,. RowFields RowGrand RowRange SaveData Selection- Mode ShowCell- Backgroud- FromOLAP Тип возвращае- мого значения String Long Range Range PivotFormulas String String Boolean Boolean Date String Boolean Boolean Range Bool ean XlPTSelection- Mode Boolean Описание Устанавливает/возвращает стиль, который используется в области полей страницы сводной таблицы Устанавливает/возвращает количество полей страницы в каждом столбце или строке отчета сводной таблицы Только чтение . Возвращает диапазон, в котором содер­ жится область страницы из отчета сводной таблицы Только чтение. Возвращает диапазон, в котором содер­ жатся поля страниц и раскрывающиеся списки с элемен­ тами отчета сводной таблицы Только чтение . Возвращает коллекцию формул, которые используются в отчете сводной таблицы Устанавливает/возвращает выделение данных и меток в сводной таблице с использованием стандартного фор­ мата выделения в отчете сводной таблицы. Например, для выделения данных и метки для страны (country) "Сапаdа" строка должна выглядеть как "Соuпtгу [Сапаdа]" Устанавливает/возвращает выделение сводной таблицы в стандартном формате отчета сводной таблицы с ис­ пользованием региональных стандартов США Устанавливает/возвращает необходимость сохранения форматирования отчета сводной таблицы при модифика­ ции, сортировке, повороте, обновлении или пересчете Устанавливает/возвращает необходимость печати заго­ ловка отчета сводной таблицы при печати родительского листа Только чтение . Возвращает дату последнего обновления данных в отчете сводной таблицы Только чтение. Возвращает имя по.льзователя, который по­ следний раз обновлял данные в отчете сводной таблицы .Устанавливает/возвращает необходимость отображения меток строк, столбцов и элементов в первой строке каж­ дой страницы при печати отчета сводной таблицы Только чтение. Параметры : [ Index J. Возвращает объект или коллекцию, содержащие поле (PivotField) или поля (Pivo tFields) сводной таблицы, соответствующие стро­ кам сводной таблицы Устанавливает/возвращает необходимость отображения общей суммы для строк сводной таблицы Только чтение. Возвращает диапазон ячее к, в котором · расположена область строк отчета сводной таблицы Устанавливает/возвращает необходимость сохранения данных отчета сводной таблицы вместе с книгой Устанавливает/возвращает способ установки выделения в отчете сводной таблицы (например , x lLab elOnly) Устанавливает/возвращает необходимость включения в запрашиваемое Excel многомерное выраже ние свойства BackColor для каждой ячейки области данных, соответ­ ствующей ячейке в наборе данны х OLAP
Объектная модель Excel 2003 831 Имя Тип возвращае- Описание мого значения SrnallGrid Boolean SourceData Variant Subtotal- Boolean HiddenPage- Iterns TaЬleRangel Range TaЬleRange2 Range TaЬleStyle String Tag String VacatedStyle String Value String Version XlPivotTaЬle- VersionList View- Boolean Calculated- Mernbers VisiЬle- Fields VisualTotals Boolean Методы объекта PivotТaЫe Устанавливает/возвращает необходимость использования таблицы 2х2 для созданного отчета сводной таблицы (тrue). В противном случае будет использоваться пустой контур (False) Устанавливает/возвращает источник данных отчета свод­ ной таблицы. Это может быть ссылка на ячейку, массив, несколько ячеек или другой отчет сводной таблицы . Не используется с источниками данных OLE DB Устанавливает/возвращает необходимость включения скрытых полей страницы в итоги строки и столбца, итоги блоков и общие суммы Только чтение . Возвращает диапазон, содержащий весь отчет сводной таблицы, не включая поля страницы Только чтение. Возвращает диапазон, содержащий · весь отчет сводной таблицы вместе с полями страницы Устанавливает/возвращает стиль тела таблицы отчета Устанавливает/возвращает строку, которая будет сохра­ нена вместе с отчетом сводной таблицы (например, опи­ сание отчета сводной таблицы) Устанавливает/возвращает используемый стиль аннули­ рованных· ячеек при обновлении отчета сводной таблицы Устанавливает/возвращает имя отчета сводной таблицы Только чтение . Возвращает номер версии Excel Устанавливает/возвращает возможность просмотра вы­ числимых полей сводных таблиц OLAP Только чтение. Параметры : [ Index]. Возвращает объект или коллекцию, содержащие поле (Piv otField) или поля (Pi vo tFields) сводной таблицы, соответствующие ви­ димым полям сводной таблицы Устанавливает/возвращает необходимость пересчета сумм при сокрытии элеме~ltта сводной таблицы Имя Тип возвращае- Параметры мого значенtiя Описание AddDataField PivotField Field As Object, [Caption], [Function] Добавляет поле данных в отчет сводной таблицы. Параметр Field содержит уникальное поле на серве­ ре . Параметр Captio n содержит метку, и спользуемую для идентифи­ кации поля данных . Параметр Func- tion содержит функцию , которая выполняется в добавленном поле данных
\ 832 Приложение А Имя Тип возвращае- Параметры мого значения Описание AddFields Calculated- Fields Variant Calculated- Fields CreateCube- String File Format GetData DouЫe [RowFields], [ColumnFieldsJ, [ PageFields] , [AddToTaЬle] File As String, [Measures], [Levels], [MemЬers], [Properties] Format As xlPivot- FormatType Добавляет поле строки, столбца и страницы в отчет сводной таблицы . ПapaмeтpыRowFields,Col­ urnnFields и PageFields могут со- держать одну строку с именем поля или массив строк с именами полей. Для добавления полей в отчет пара­ метр AddToTaЫe устанавливается в значение True. Для замещения по­ !lей в отчете параметр AddToTaЫe устанавливается в значение False Возвращает коллекцию вычислимых полей отчета сводной таблицы Создает файл куба на основе отчета сводной таблицы , связанного с источ­ ником данных OLAP. Параметр File содержит имя создаваемого файла куба. Параметр Measures содержит массив уникальных имен измерений, которые будут частью среза. Пара­ метр Levels содержит массив строк, в котором каждый элемент является уникальным именем уровня. Пара­ метр MemЬers содержит массив стро­ ковых массивов, в котором каждый элемент соответствует иерархиям, описанным в массиве из параметра Levels. Если свойства MemЬers не ДОЛЖНЫ быть ВКЛЮЧеНЫ В срез, пара­ метр Properties устанавливается в значение False Выбирает предопределенный стиль форматирования отчета сводной таблицы , указанный в параметре Format Name As String Устанавливает значение конкретной ячейки отчета сводной таблицы. Значение параметра Name должно соответствовать стандартному формату выделения отчета сводной таблицы
Имя Тип возвращае- маго значения GetPivotData Range ListFormulas PivotCache PivotCache PivotFields Object PivotSelect Объектная модель Excel 2003 833 Параметры [DataField], [Fieldl], [Iteml], [Field 2], [Item2 ] , [FieldЗ], [ItemЗ], [Field4], [Item4J , [Field5], [Item5] , [Fieldб], [Itemб], [Field7], [Item7] , [Field8 ], [Item8], [Field9] , [Item9], [FieldlO], [ItemlO], [Fie ldll] , [Itemll ], [Field12], [Item12], [Fie ldB] , [It emlЗJ , [Field14], [ Item14 ] [ Index] Name As String, [Mode As XlPTSelection- Mode J, [UseStandard- Name ] Описание Возвращает информацию об элемен­ те данных отчета сводной таблицы . Параметр FieldN содержит имя поля столбца или строки в отчете сводной таблицы, а параметр ItemN содержит имя элемента в поле Field14 Создает отдельный лист со списком всех вычислимых элементов и полей сводной таблицы Возвращает кэш данны х, связанных с текущей сводной таблицей Возвращает объект или коллек цию , содержащие поле (PivotField) или поля (PivotFields) сводной табли ­ цы, соответствующие полям сводной таблицы Выделяет фрагмент сводной табли­ цы , на который указывает параметр Name. Этот параметр должен соот­ ветствовать стандартному формату выделения отчета сводной таблицы . П а раметр Mode определяет выде ­ ляемую ч асть сводной таблицы (например, x lBlanks). Для записи макросов, которые будут работать с другими региональными парамет­ рами, параметр UseStandardName устанавливается в значение True
834 Приложение А Имя PivotTaЬle­ Wiz ard Тип возвращае- Параметры мого значения [SourceType], [SourceData], [TaЬle ­ Destination] , [TaЬleName ], [RowGrand], [ColumnGrand], [SaveData], [HasAutoFormat], [AutoPage], [Reserved ], [Background- Query], [OptimizeCache] , · [ PageField- Order J, [PageFieldWrap- Count], [ReadData], [Connection] RefreshTaЬle Boolean ShowPages Variant [PageField] Update Описание Создает отчет сводно й таблицы. С помощью констант XL PivotTa- ЬleSourceType параметр Source- Type определяет тип и сточника дан­ ных, который используется для по­ строения сводной диаграммы. В па­ раметре TaЬleDest ination передается диапазон родительского листа, в котором будет размещен .создаваемый отчет. В п араметре TaЬleName содержится имя созда­ ваемого отчета. Для отображения общей суммы для строк или столб ­ цов в значение True устанавливают­ ся пара метр RowGrand или Col- umnGrand . Для автоматического форм атирования отчета при обнов­ лении или изменении параметр HasAu toForma t устан авливается в. значение True. Параметр Auto- Page позволяет включить автомати­ ческое создание поля страницы для консолидации. Для ас и нхронной ра­ бот ы с источ нико м данных свойство BackgroundQuery уст анавливается в значение True. Для о птимизации кэша при построении па раметр Op- timi z eCache .устанавливается в значе ние True. Присвоение кон­ стант XLOrder параметру Page - FieldOrder позволяет настроить способ добавления полей в отчет. Параметр PageFieldWrapCount по­ зволяет установить коли чество по­ лей страницы в каждом столбце или в каждой строке. Установка парамет­ ра ReadDa ta в значение True по­ зволяет копиро вать данные из внеш- . ней базы данных в кэш. Наконец, па­ раметр Connection позволяет ука­ зать строку подключения ODBC для кэша сводной таблицы Обновляет отчет сводн ой таблицы на основе исходных дан ных. При ус­ пешном обновлении воз вр а щает значение True Создает новый отчет сводной табли­ цы на новом листе для каждого эле­ мента в поле страницы (PageField) Обновляет отч ет сводной таблицы
Объектная модель E~cel 2003 835 Пример: объект PivotTaЬ/e и коллекция PivotTaЬ/es Объект PlotArea В . объекте PlotArea хранятся параметры форматирования, связанные с областью построения родительской диаграммы . Для двумерных диаграмм в объекте PlotArea хранятся линии тренда, маркеры данных, направляющие , метки данных и метки осей (но не заголовки) . Для трехмерных диаграмм в объекте PlotArea ·хранятся вертикаль­ ные плоскости, базовые уровни, заголовки осей, маркеры и все элементы, хранящие ся для двумерных диаграмм" Вокруг области построения расположена область диаграммы. Дополнительная информация о параметрах форматирования области диаграммы рас: сматривается в разделе, посвященном объекту ChartArea. Объект Chart всегда являет­ ся родительским объектом объектаРlоtАrеа. Общие свойства объекта PlotArea Определения свойств Application, Creator и Parent ~риводились в начале при­ ложения. Свойства объекта PlotArea Имя Тип возвращае- мого значения Border Border Fill ChartFill- Format Height DouЫe InsideHeight DouЫe InsideLeft DouЫe InsideTop DouЫe InsideWidth DouЬle Описание Только чтение. Возвращает свойства границы вокруг об­ ласти построения Только чтение. Возвращает объект с параметрами фор­ матирования заливки области построения Устанавливает/возвращает высоту области построения диаграммы Только чтение . Возвращает высоту внутренней части об­ ласти построения без меток осей Только чтение. Возвращает расстояние от левого края об­ ласти построения, не включая метки. осей, до левого края диаграммы Только чтение. Возвращает расстояние от верхнего края области построения, не включая метки осей , до верхнего края диаграммы Только чтение. Возвращает ширину внутренней части об­ ласти построения без меток осей
836 Приложение А Имя Тип возвращае- Описание мого значения Interior Interior Только чтение. Возвращает объект, содержа щ ий парамет­ ры форматирования в нутренней части области построе­ ния (напри мер, цвет внутренней области) Left Name Тор Width DouЫe String DouЫe DouЫe Устанавливает/возвращает расстояние от левого края об­ ласти построения до левого края диаграммы Только чтение. Возвращает имя области построения Уста навливает/возвращает расстояние от верхнего края области постр оения до верхнего края диагра м мы Устан авливает/возвращает ш и рину области построения Методы объекта PlotArea Имя Тип возвращае- Параметры Описание мого значения ClearFormats Variant Select Variant Пример: объект PlotArea Очищает форматирование области по­ строения Выде л яет область построен ия диаграммы В этом примере объект PlotArea используется для настройки одинакового размера .и положения области построения для всех диаграмм в пределах книги в независимости от форматирования: осей (например, оси могут использовать разные шрифты или еди­ ницы измерения). ' sub MakeChartAreasSarneSizeAsFirst () Dim oCht As Chart, оРА As PlotArea Dim dWidth As DouЬle, dHeight As DouЫe Dim dTop As DouЫe, dLeft As DouЫe ' Получ11ть размеры внутренней части области ·по.строения ' первой диаграммЬr With Charts(l) .PlotArea dWidth = .InsideWidth dHeight = .InsideHeight dLeft = .InsideLeft dтор = .InsideTop End With ' Перебрать все диаграммы в книге For Each oCht In Charts ' Получить объект PlotArea Set оРА = oCht.PlotArea ' Изменить размер и по.тrожение области построения With оРА If .InsideWidth > dWidth Then ' Слишком большая . Сделать меньше . . Width = . W idth - ( . InsideWidth - dWidt.q) Else • ' с.Лишком маленькая . Переместить левее · и .гсделать . Left'= .Left - (dWidth - . InsideWidth) . W idth = .Width + (dWidth - . InsideWidth) End If . If .InsideHeight > dHeight Then ' .Слищюм большая. Сдел9ть меньще
Объектная модель Excel 2003 837 . нeight ·· - ( . InsideHeight - dнe:lght) ;• · ' Слиinком маленькая. Переместить выше и сделат5 больше . . Тор = .Тор - (dНeight - .InsideHeight) . Height = . Height + ( dHeight - . Insi.deHeight) ' End If ' Установить положение внутрен.ней части области по'строения .Lef~ = .Left + (dLeft - . InsideLeft) .Тор = .Тор + (dTop - .InsideTop) En d .With f· 1 Next cEJl,d . Sl)Q, Объект Point и коллекция Points В коллекции Points хранятся все точки данных определенного ряда на диаграмме. На самом деле диаграмма (объект Chart) может содержать несколько групп диаграммы (Cha rtGroup s/ChartGroup), в которьLх хранятся несколько рядов (SeriesCollect i on/ Series). В свою очередь, ряды содержат множество точек (Points/Point). Объект Po int описывает определенную точк~' ряда. Родительским для коллекции Points является объект Series. Кроме типичных атрибутов, коллекция Points предоставляет свойство Count. Это свойство возвращает количество объектов Point в коллекции . Общие свойства объекта Point Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Point Имя Appl yPicTo - End ApplyPicTo- Front ApplyPicTo- Sides Bor der DataL abel Explosion Fill Тип возвращае- мого значения Boolean Boolean Boolean Border DataLabel Long ChartFill- Format HasDataLabel Boolean Описание Устанавливает/возвращает необходимость добавле н и я рисунка в конец точки Устанавливает/возвращает необходимость добавле н ия рисунка в начало точки Устанавливает/возвращает необходимость добавления рисунка по сторонам точки Тол ько чтение. Возвращает свойст ва гра н и цы вокруг точ ки Тол ько чтение. Возвращает объект, поддерживаю щий управление атрибутами метки дан н ых (например, форма ­ тиr:юванием, текстом). Используется совместно со свойст­ вом HasDa taLabel Устанавливает/возвращает расстояние, на которое вы­ двигается доля (точка) круговой или кольцевой диаграм­ мы. Для отключения выдвижения свойство устана влива­ ется в значение О Только чтение. Возвращает объект, содержащий пара м ет­ ры форматирования заливки дл я точки Устанавливает/возвращает необходимость отображе н ия метки данных вместе с точкой . Используется совместно со свойством DataLabe l
838 Приложение А Имя Interior Invertif- Negative Marker- Background- Color Marker- Background- Colorindex MarkerS i z e мarkerstyle PictureType PictureUni t SecondaYy- Plot Shadow Тип возвращае- Описание маго значения Interior Bool ean Long XlColorindex Long XlMarkerStyle XlChart - P i ctureType Lo ng Boo lean Boolean Только чтение. Возвращает объект , содержащий парамет­ ры форматирования внутренней области точки (например, цвет внутренней области) Устанавливает/возвращает необходимость инвертирова­ ния цвета при отрицательном значении точки Устанавливает/возвращает цвет фона маркера точки. Для создания значения цвета используется функция RGB Устанавливает/возвращает цвет фона маркера точки . Для установки этого свойства используются константы XlCol- o r i n dex или значен и е индекса цвета в текущей палитре Устана вливает/возвращает размер маркера ключа то чки Устанавливает/возвращает тип маркера, который исполь­ зуется в качестве ключа (например, квадрат, ромб, тре­ угольник, рисуно к и т.д.) Устанавливает/возвращает способ отображения рисунка возле точ ки (напр и ме р, с растягиванием, в виде мозаики). Дл я уста нов ки этого свойства используются констант ы XlPictureType Устана вли вает/возвращает количество единиЦ, которые представляет рисунок, если свойство PictureType уста ­ новлено в значение xl S cale Устанавливает/возвращает расположение точки на второй части диаграммы "круговая в круговой " или "гистограмма в круговой " Устанавливает/возвращает необходимость отображения эффекта тени вокруг точки Методы объекта Point Имя ApplyDa t a- La bels Тип возвращае- Параметры маго значения Varia nt [Туре As XlDataLa- belsType ] , [Leg endKey] , [AutoText ] , · [HasLeaderLines ] , [ShowSeriesName] , [Sh o wCa tegoryName], [ShowValue], [ShowPer c e n tage] , [ShowBubЬleS i ze], [Separator] Описание Применяет к точ.ке свойства метки данных, описанные параметрами метода . Параметр Туре определя­ ет отсутствие метки, вывод значе­ ния, вывод доли целого в процен­ тах или вывод метки категории. Возле точки может отображаться ключ легенды. Для этого параметр LegendКey необходимо установить в значение Tr u e . Если объект ав­ томатически генерирует соответ­ ствующий текст на основе содер­ жимого, параметр Autoтext уста­ навливается в значение True. Если ряд содержит линии меток, пара­ метр HasLeaderLines должен быть установлен в значение True. Все остальные параметры являют­ ся свойствами описываемой . метки данных
Имя Тип возвращае- мого значения ClearFormats Variant Сору Variant Delete Variant Paste Variant Select Variant Параметры Объектная модель Excel 2003 839 Описание Очищает форматирование точки Копирует точку в буфер обмена Удаляет точку Вставляет рисунок из буфера обмена в текущую точку, превра­ щая рисунок в маркер Выделяет точку на диаграмме Пример: объект Point и коллекция Points 1 suъ ~xp :i~qd~P~. e· <) ·~ · ~~?'!".~~~- ··-·· , · ~ ~, r ; .:,. pi,Цi; ,?Rt<As Point . . ' · ., ,: .. ,<' !~ .·. ,~ . · ,· ПQ,,цу~ить' · первую ~очку данных на круговой ., диаграмме l'<set 'oPt : = .. charts (1) . seriesCoПection Ц) ' . Points (1) ёt~ · ·:"'доб.;э.вИть метkу · к первой · тоЧке И · отф:\~Инуть ее от диаграммы t.· ·~ith _oPt ·: '"' . , .,, .," .ApplyDataLabels ' xlDataL;abelsShowLabelAridPercent ·- - ~ "~-~- ~- Exp.losio'n = 20 , ·," ·' . ~ ' Enci wit:h ·.. · ' · !t ·- <-- ' ·. t?):з.g .§.ЧР ~,.. ........ ··" '· Объект Protection Этот объект предоставляет доступ к группе параметров защиты листа, появившихся в Excel 2003. При защите листа можно указать такие возможности: выделение незаблоки· рованных ячеек, форматирование ячеек, столбцов и строк , вставка и удаление строк и столбцов, сортировка и т.д. Установка параметров защиты выполняется с помощью метода Protect объекта Worksheet. Для проверки текущих параметров защиты можно воспользоваться свой­ ством Protecti.on объекта Worksheet. il:i§:9!}<?:.x:: t;,~Ц;{i§hёet~::Efo'I:~2t lё;?П;;h,!Iovig§±;~it!1.Ii§<':;.~JI~ ' :::. . ··· Свойства объекта Protection Имя Allow- Deleting- Columns Allow- Del e tingRows AllowEdit- Ranges Allow- Filtering Allow- Formatting- Cells Тип возвращае- мого значения Boolean Boolean AllowEditRang es Boolean Boolean Описание Только чтение. Возвращает возможность удаления столб­ ,цов на защищенном листе Только чтение. Возвращает возможность удаления строк на защищенном листе Только чтение. Возвращает объект Al l owEditRanges Только чтение. Возвращает возможность использования автофильтра, который создавался до установки защиты на ЛИСТ Только чтение . Возвращает возможность форматирования ячеек на защищенном листе
840 Приложение А Имя Тип возвращае- мого значения Allow- Boolean Forrnating- Colurnns Allow- Boolean Forrnating- Rows Allow - Boolean Inserting- Colurnns Allow- Boolean Inserting- Hyperlinks Al low- Boolean Inserting- Rows AllowSorting Boolean Al l owUsing- Boolean PivotTaЬles Пример: объект Protection Описание То ль ко чтение. Возвращает возможность форматирования сто лбцов на защищенном листе Только чтение. Возвращает возможность форматирования строк на защи щенно м листе Только чтение. Возвращает возможность вставки столб ­ цов в защищенный лист Только чтение. Возвращает возможность вставки гипер­ ссы ло к в защищенный лист Только чтение. Возвращает возможность вставки строк в защищенн ый лист Толь ко чтение . Возвращает возможность сортировки за ­ щищенного листа Только чтение. Возвращает возможность управления сводными таблиц ам и на защищенном листе В следующей подпрограмме параметры защиты устанавливаются на основе имени пользователя с вкладки Общие (Geneгal) в диалоговом окне Сервис<=>Параметры (Tools<=>Options), а также на основе параметров пользователя, указанных в таблице на листе . Если пользователь не найден, об этом выдается со_общение и применяются приня­ тые по умолчанию параметры. :sub Protectionsettings () • · Dirn rngUsers As Range, rngUser As Range Dirn sCurrentUser As String ' Получить текущее имя пользователя sCurrentUser = Application.UserNarne ' Определить список пользователей в таблице With ,wksAllowEditRange Set rngUsers = . Range (. Range ( "Users") , . ~. Range ( "Users" ) . End (xlToRight) ) . End With ' Найти текущего пользователя в таблице Application.FindForrnat.Clear Set rngUser = rngUsers.Find(What:=sCurrentUser, ~MatchCase:=False, SearcbForrnat:=False) ' Присутствует ли пользователь в таблице? If Not rngUser Is Nothing Then · ' Установить свойства объекта Protection ' в сответствии с параметрами в таблице wksAllowEditRange.Protect Password:="wroxl", DrawingObjects:=True, _ Contents:=True, _ AllowForrnattingCells:=rngUser.Offset(l, 0) . Value, _ AllowForrnattingColurnns: =rngUser .OffsE;?t (2, . р) ,Value, ·-- ,
Объектная модель Excel 2003 841 · дiiowJforiiiatПngR.ows: =rnguser. of:Eset (3, 6) . va.1i .ie, AllowSorting: = rngUser. Of fset ( 4, О) . Value, _ ' UserinterfaceOnly:=True ·· , · Выд~ление незаблокированных ячеек, заблокированных ; и ' незаблокированных и выключение обеих возможностей ' не являютсЯ частью объекта Protection If rng1Jser.Offset(5, 0) .Value = True Then . / wksAllowEditRange.EnaЬleSelection xlUnlockedCells Else wksAllowEditRange.EnaЬleSelection xlNoRestrictions End If ' . [ ' Текущий пользователь отсутствует в таблице { ' МsgBox "Польз ователь не найден в таблице. Используются ;l:Ь " принятые · по умолчанию параметры.", vbExclamation, "Protection ! t:Ь Settings" · ~ wksAllowEditRange.Protect ~~ ,> ' ~о f . True, True, False, False, False, False, Faise, False, False, False, False, False, False, False, False · wksAllowEdi tRange. EnaЬleSelection = · xlNoRes·trictions Объект PuЫishObject и коллекция PuЫishObjects В коллекции PuЬlishObj ects хранятся все сохраненные на WеЬ-странице элементы . книги. В каждом объекте PuЬlishObject хранится элемент книги , который был сохра­ нен на WеЬ-странице и может потребоваться для обновления значений на WеЬ-странице. \ Родительским объектом коллекции РuЫ i shObj ее ts является объект Workbook. Кроме типичных атрибутов, коллекция РuЫ ishObj ects предоставляет несколько свойств и методов. Уникальные атрибуты перечислены в следующих таблицах. Свойства и методы коллекции PuЫishObjects Имя AutoRepub- lish Count Add Delete PuЬlish Тип возвращае- Описание мого значения Boolean Устанавливает/возвращает необходимость повторной публикации элементов коллекции PuЬlishObj ects при сохранении книги Long Только чтение. Возвращает количество объектов Pub- lishObj ect в коллекции PuЬlishObj ect Метод. Параметры: SourceType As XlSourceType, Filename As String, [Sheet], [Source], [HtmlType], [DivIDJ, [Title]. Добавляет в коллекцию объект PuЬlishObj ect Метод. Удаляет объект PuЬlishObject из коллекции Метод. Публикует на WеЬ-странице все элементы, с кото­ рыми связаны объекты РuЫ ishObj ect
842 Приложение А Общие свойства объекта PuЫishObject Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта PuЫishObject Имя Тип возвращае- Описание мого значения DivID String Только чтение. Возвращает идентификатор, который ис­ пользуется в теге <DIV> в коде WеЬ-страницы . Filename String Устанавливает/возвращает адрес URL или путь, по кото­ рому объект будет сохранен в виде WеЬ-страницы HtmlТуре XlHtmlТуре Устанавливает/возвращает тип сохраняемой WеЬ­ страницы (например, xlHtmIStatic, xlHtmlChart). Все страницы, кроме типа xlHtmlStatic, нуждаются в осо­ бых компонентах ActiveX Sheet String Только чтение. Возвращает лист Excel, который сохраня­ ется в виде WеЬ-страницы source String Только чтение. возвращает конкретный элемент, напри­ мер имя диапазона, имя диаграммы или имя отчета из ба­ зового типа, указанного в свойстве SourceType Source'Гype XlSourceType Только чтение. Возвращает тип публикуемого источника (например, xlSourceChart, xlSou.rcePrintArea и т.д.) Ti tle String Устанавливает/возвращает заголовок публи куемой WеЬ­ страницы Методы объекта PuЫishObject Имя Тип возвращае- Параметры Описание Delete PuЬlish мого значения [Create] Удаляет объект РuЫ i shObj ее t 1 Публи кует исходные элементы объекта PuЫishObject на WеЬ-странице. Для перезаписи существующих файлов пара­ метр Crea te устанавливается в значение True. При установке параметра в значение False публикуемые элементы будут до­ бавлены к одноименной WеЬ-странице Пример: объект PиЬ/ishObject и коллекция PиЬ/ishObjects 1 suь ~ui;)datePubl.ish.ё.dcharfs () __,,. ..,, . --~"-· •· ··· Dim оРО As PuЬlishObject · . · . . · ! For Each оРО In ActiveWorkbook.PuЬlishObjects '' · I f оРО. SourceType x l SourceChart Then " · oPO.Publish · ' '' End If ' Next . .. 0 EI1<i, xS,t!:Ь. : ~' .
Объектная модель Excel 2003 843 Объект QueryTaЫe и коллекция QueryTaЫes В колле'кции QueryTaЬles хранятся таблицы данных, созданные на основе внешних источников данных. Каждому объекту QueryTaЬle соответствует одна таблица на листе, содержащая данные из внешнего источника, в качестве которого могут выступать источ­ ники ODBC, OLE DB, текстовые файлы, Data Findei-, WеЬ-запрос или набор записей DAO / ADO. Родительским для коллекции QueryTaЬles является объект Worksheet. Кроме типичных атрибутов, коллекция QueryTaЬles предоставляет несколько свойств и методов. Уникальные атрибуты показаны ниже. Свойства и методы коллекции QueryTaЫes Имя Тип возвращае- Описание мого значения Count Long Add QueryTaЬle Только чтение. Возвра_щает количество элементов коллекции Метод. Параметры: Connection, Des tination As Range, [ Sql]. Добавляет в коллекцию объект QueryТaЬle. В качестве значения параметра Connection можно указать строку подключения ODBC или OLE DB, другой объект QueryТaЬle, объект набора записей ОАО или ADO, WеЬ-запрос, строку Data Fiпder или имя текстового файла. Значение параметра Destination определяет положение верхнего левого угла результатов таблицы запроса . Параметр SQL может содержать запрос SQL для подключения Общие свойства объекта QueryTaЫe Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта QueryTaЫe Имя Тип возвращае- мого значения Adjust- 'Вoolean ColumnWidth Background - Boolean Query CommandText Variant CommandType XlCmdType Connection Variant Destination Range EditWebPage Variant ЕnаЫе - Boolean Editing Описание Устанавливает/возвращает необходимость автоматиче­ ского изменения ширины столбцов в соответствии с объ­ емом данных при каждом обновлении таблицы · Устанавливает/возвращает необходимость асинхронной обработки таблицы запросов Устанавливает/возвращает запрос SQL, который исполь­ зуется для получения данных Устанавливает/возвращает тип значения свойства Com- mandText (нaпpимep, xlCmdSQL, xlCmdтaЫe) Устанавливает/возвращает строку подключения OLE DB, ODBC, источник данных в Web, путь к текстовому файлу или к базе данных Только чтение. Возвращает ячейку, в которой будет распо­ ложен верхний левый угол результатов таблицы запроса Устанавливает/возвращает адрес URL для WеЬ-запроса Устанавливает/возвращает возможность редактирования таблицы запроса. При установке свойства в значение False таблица может только обновляться
844 Приложение А Имя Тип возвращае- Описание мого значения ЕnаЫе- Boolean Refresh FetchedRow- Boolean Overf low FieldNarnes Boolean FillAdjac- Boolean · entForrnulas ListObjet Range Maintain- Boolean Connection Narne String Pararneters Pararneters PostText String Preserve- Boolean Colurnninfo Preserve- Boolean Forrnatting QueryType xlQueryType Recordset Refreshing Boolean RefreshOn- Boolean FileOpen Refresh- Long Period Устанав ливает/возвращает возможность обновления дан­ ных в таблице запроса Только чтение. Возвращает информацию о том, было ли в результате последнего обновления таблицы запроса получено больше строк , чем доступно на листе Уста навливает/возвращает необходимость использования названий полей из источника данных в виде заголовков столбцов в таблице запроса Уста навливает/возвращ ает необходимость автоматиче­ ского обновления расположенных справа от таблицы за­ проса формул при обновлении данных в таблице запроса Возвращает объект Range Устанавливает/возвращает необходимость сохранения от­ крытым подключения к источнику данных до закрытия л ис­ та. Используется только с источниками данных OLE DB Устанав ливает/возвращает имя таблицы запроса Только чтение . Возвращает параметры таблицы запроса Устанавливает/возвращает текст запроса POST, который отправляется на WеЬ-сервер для получения данных в ре­ зультате WеЬ-запроса Устанавливает/возвращает необходимость сохранения расположения, порядка сортировки и фильтрации при об­ новлении запроса данных Устанавливает/возвращает необходимость применения к новым строкам таблицы запроса форматирования, свя­ занного с первыми пят~ю строками данных Только чтение . Возвращает тип подключения, связанного с таблицей запроса (например, xlOLEDBQuery, xlDAO- Query, xlTextirnport) Только чтение. Возвращает набор записей, связанный · с запросом к источнику данных Только чтение. Возвращает состоя ние асинхронного за­ проса Устанавливает/возвращает не.обходимость обновления таблицы запроса при открытии книги Устанавливает/возвращает длИтельность (в минутах) ме­ жду автоматическим обновлением данных из источника . Для отключения обновления зто свойство устанавливает­ ся в значение О RefreshStyle XlCell- Устанавливает/возвращает способ обработки строк при InsertionMode извлечении данных из источника. Ячейки листа могут быть перезаписаны (xlOverwriteCells), строки могут частично вставляться/удаляться по необходимости (xlinsertDeleteCells) или добавляться (x linsertEntireRows) Resul tRange Range Только чтение. Возвращает диапазон ячеек, содержащий результат таблицы запроса
Имя Тип возвращае- маго значения RobustCon- XlRobustCon- nect nect RowNumЬers Boolean SaveData Boolean SavePassword Boolean Source- String Connection- File SourceData- String File TextFile- Variant ColumnData- Types TextFile- Boolean Comma- Delimi ter TextFile- Boolean Consecutive - Delimiter TextFile- String Decimal- Separator TextFile- Variant FixedColumn- Width TextFile - String Other- Delimi ter TextFile- ParseType TextFile- P lat form TextFile- PromptOn- Refresh XlTextParsing- Type XlPlatform Boolean Объектная модель Excel 2003 845 Описание Устанавливает/возвращает способ подключения кэша сводной таблицы к источнику данных Устанавливает/возвращает необходимость добавления столбца с номерами строк слева от таблицы запроса Устанавливает/возвращает необходимость сохранения данных таблицы запроса вместе с книгой Устанавливает/возвращает необходимость сохранения пароля подключения ODBC вместе с таблицей запроса Устанавливает/возвращает имя файла, который исполь­ зовался для создания сводной таблицы Только чтение. Возвращает имя файла с исходными дан­ ны ми для кэша сводной таблицы Устанавливает/возвращает массив строковых констант, опи­ сывающих типы данных каждого столбца. Для этого приме­ няются константы XlColumnDataТype. Используется, когда свойство QueryТype установлено в значение xlTextimport Устанавли~ает/возвращает использование запятой в ка­ честве разделителя данных. Применяется, если свойство QueryType установлено в значение x1Textimport и для текстовых файлов с разделителями Устанавливает/возвращает необходимость интерпретации идущих подряд разделителей (например, "",")в качестве одного разделителя. Используется, если свойство Que- ryType установлено в значение xlTextimport Устанавл ивает/возвращает тип используемого разделите­ ля десятичной дроби. Применяется, если свойство Que- ryType установлено в значение xl тextimport Устанавливает/возвращает массив значений ширины, со­ ответствующих столбцам. Используется, если свойство QueryType установлено в значение xlTextimport и для текстовых файлов· с фиксированным размером полей Устанавливает/возвращает символ, который будет ис­ пользоваться в качестве разделителя столбцов в тексто­ вом файле. Применяется, если свойство QueryType ус­ тановлено в значение xlтextimport и для текстовых файлов с разделител_ями Устанавливает/возвращает тип импортируемого текстово­ го файла: xlDelimi ted или xlFixedWidth. Использует­ ся, если свойство QueryType установлено в значение xlTextimport Устанавливает/возвращает кодовые страницы, исполь­ зуемые при импорте текстового файла (например, xlMSDOS, xlWindows). Применяется, если свойство Que - ryType установлено в значение xlTextimport Устанавливает/возвращает необходимость запроса у поль­ зователя текстового файла, импортируемого в таблицу за­ проса при каждом обновлении данных. Применяется, если свойство QueryType установлено в значение xlTextim- port. Запрос не выдается при первом обновлении данных
846 Приложение А Имя TextFile- Semic o lon- Delimiter TextFile- Space- Delimiter TextFile- StartRow TextFile- Tab- Delimiter TextFile - Text- Qualifier TextFile- Thousands - Separator TextFile- Trailing- MinusNumЬers TextFile- VisualLayout Web - Consecutive- Delimiters- AsOne WebDisaЫe- Date- Recognition WebDisaЫe - Redirections Web- Formatting WebPre - Format ted- Textтo­ Columns Тип возвращае- Описание мого значения Bo'olean Boolean Long Boolean , XlText- Qualifier String Boolean Long Boolean Boolean Boolean xlWebFormat - ting Boolean Устанавливает/возвращает необходимость использования точки с запятой в качестве разделителя при . импорте тек­ стового файла. Применяется, если свойство QueryType установлено в значение xlTextimport Устанавливает/возвращает необходимость использования пробела в качестве разделителя при импорте текстового файла. Применяется, если свойство QueryType установ­ лено в значение xlтехt Import и файл является тексто­ вым файлом с разделителями Устанавливает/возвращает номер строки, с которой начи­ нается импорт текстового файла. Используется, если свой­ ство QueryТype установлено в значение xlTextimport Устанавливает/возвращает необходимость использования символа табуляции при импорте текстового файла. При­ меняется, если свойство QueryType установлено в зна­ чение xlтextimport и файл является текстовым фай­ лом с разделителями Устанавливает/возвращает символ, используемый для определения данных строки при импорте данных из тек­ стового файла. Применяется, если свойство QueryType установлено в значение xlTextimport Устанавливает/возвращает символ, используемый в каче­ стве разделителя тысяч при импорте из текстового файла (например, ',') Устанавливает/возвращает необходимость интерпретации чисел, импортированных в виде текста, который начина­ ется со знака '-' , в виде отрицательных чисел Возвращает 1 или 2 в зависимости от визуального пред­ ставления файла. Значение 1 соответствует направлению слева направо, а значение 2 - направлению справа налево Устанавливает/возвращает необходимость интерпретации нескольких разделителей подряд как одного разделителя при импорте данных из WеЬ-страницы . Используется, если свойство QueryТype установлено в значение xlWebQu ery Устанавливает/возвращает необходимость разбора дан­ ных, выглядящих как дата, при импорте данных из WеЬ­ страницы. Используется, если свойство QueryType уста­ новлено в значение xlWebQuery Устанавливает/возвращает отключение перенаправлений в WеЬ-запросе для объекта QueryTaЬle Устанавливает/возвращает необходимость сохранения форматирования при импорте данных из WеЬ-страницы (например, x lAll, xlNone). Используется, если свойство QueryType установлено в значение xlWebQuery Устанавливает/возвращает необходимость разбора в столбцы текста из тегов < PRE>. Используется, если свойство QueryType установлено в значение xlWe- bQuery
Объектная модель Excel 2003 847 Объект Range Это один из самых разносторонних объектов в Excel. Диапазон может содержать единственную ячейку, ст6лбец, строку, непрерывный блок ячеек или несмежные блоки ячеек. Основным родительским объектом для объекта Range является объект Work- sheet . Но большинство объектов из объектной модеJ!И Excel обращаются к объекту Range. Свойство Range объекта Worksheet используется для выбора определенного диапазона ячеек с помощью параметров Celll и Cell2. Общие свойства объекта Range Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Range Имя Тип возвращае - Описание мого значения Addindent Variant Address String AddressLocal String Al lowEdit Boolean Areas Areas Borders Borders Cells Range Characters Characters Column Long Columns Range Устанавливает возвращает необходимость автомати ч е­ ского выравнивания текста в ячейке, если включено рав­ номерное распределение текста Только чтение. Параметры : RowAbsolute, CoumnAbso- lute, ReferenceStyle As XlReferenceStyle, [ External], [ Rela tiveTo]. Возвращает адрес текуще­ го диапазона в виде строки на языке макроса. Тип адреса (относительный, абсолютный, в формате А1, в формате R1C1) указывается с помощью параметров Только чтение. Параметры: RowAbsolute, ColumnAbso- lute, ReferenceStyle As XlReferenceStyle, [External], [Relativeтo]. Возвращает адрес текуще ­ го диапазона в виде строки на языке пользователя. Тип адреса (относительный, абсолютный, в формате А 1, в формате R1C1) указывается с помощью параметров Только чтение. Возвращает значение True, если диапазон можно редактировать на защищенном листе Только чтение. Возвращает объект, содержащий различные несмежные диапазоны в пределах текущего диапазона Только чтение. Возвращает отдельные границы вокруг . диапазона . Каждую границу можно извлечь из коллекции по отдельности Только чтение. Возвращает ячейки из текущего диапазо­ на. Свойство Cells возвращает диапазон, совпадающий с текущим Только чтение. Параметры: [ Start], [Length]. Возвра­ щает все символы из текущего диапазона Только чтение. Возвращает номер первого столбца диа­ пазона Только чтение. Возвращает диапазон столбцов текущего диапазона
848 /Приложение А Имя Тип возвращае- Описание мого значения ColumnWidth Variant Comment Comment Count Long CurrentArray Range Current- Range Region Dependents Range Direct- Range Dependents Direct- Range Precedents End Range EntireColumn Range EntireRow Range Errors Errors Font Font Format - Format- Conditions Conditions Formula Variant FormulaArray Variant Formula- Variant Hidden Formula- XlFormula- Label Label Formula- Variant Local FormuiaRlCl Variant Formula- Variant RlClLoca l Устанавливает/возвращает ширину всех столбцов диапа­ зона. Возвращает значение Null, если столбцы диапазо­ на имеют разную ширину Только чтение. Возвращает объект, соответствующий комментарию к диапазону Только чтение. Возвращает количество ячеек в текущем диапазоне Только чтение. Возвр9щает объект Range, который соот­ ветствует массиву, связанному с определенным диапазо­ ном ячеек, если ячейка является частью массива Только чтение. Возвращает текущий диапазон, в котором содержится объект Range. Диапазон определяется как область, окруженная пустыми ячейками Только чтение . Возвращает зависящие от ячейки объекты в пределах листа Только чтение. Возвращает непосредственно зависящие от ячейки объекты в пределах листа Только чтение. Возвращает объекты в пределах листа, от которых зависит ячейка Только чтение. Параметры: Direction As XlDirec - tion. Возвращает ячейку в конце диапазона, содержаще ­ го объект Range. Направление к концу. диапазона опреде­ ляется параметром Direction Только чтение. Во.звращает полные столбцы листа, заня­ тые текущим диапазоном Возвращает полные строки листа , занятые текущим диа­ пазоном Только чтение. Возвращает коллекцию Errors , связан­ ную с объектом Range Только чтение. Возвращает объект с параметрами шриф­ та для текста в диапазоне Только чтение. Возвращает объект, в котором содержатся параметры условного форматирования текущего диапазона Устанавливает/возвращает формулу для ячеек диапазона Устанавливает/возвращает формулу массива ячеек диа­ пазона Устанавливает/возвращает необходимость сокрытия формулы при защите книги/листа Устанавливает/возвращает тип метки формулы, которая используется в указанном диапазоне Устанавливает/возвращает формулу диапазона на языке пользователя с применением ссылок в формате А1 Устанавливает/возвращает формулу диапазона на языке макроса с использованием формата ссылок R1 С1 Устанавливает/возвращает формулу диапазона на языке пользователя с применением ссылок в формате R1C1
Имя HasArray Объектная модель Excel 2003 849 Тип возвращае- Описание мого значения Variant Только чтение. Возвращает информацию о том, является ли состоящий из одн_ой ячейки диапазон частью формулы массива HasFormula Variant Только чтение. Возвращает наличие формул во всех ячейках диапазона (тrue) . Если формулы присутствуют только в некоторых ячейках, свойство возвращает значе­ ние Null Height Hidden Horizontal- Alignment Hyperlinks ID IndentLevel Interior Lef t ListHeader- Rows ListObjects Location- ТаЫ е Locked MergeArea Me rgeCelJ.s Na me Next NumЬerFormat NumЬ e r- For ma tLocal Variant Variant Variant Hyperlinks String Variant Interior Variant Long Range XlLo cat ionin- ТаЫе Vari ant Range Vari a nt Variant Range Variant Vari ant Только чтение. Возвращает высоту диапазона Устанавливает/возвращает необходимость сокрытия яче­ ек в диапазоне. Работает, если диапазон включает в себ~ полные строки или столбцы Устанавливает/возвращает параметры горизонтального выравнивания ячеек. Для установки свойства используют· ся константы XLHAlign Только чтение. Возвращает коллекцию гиперссылок, на· ходящихся в диапазоне Устанавливает/возвращает значение параметра ID для диапазона, если лист сохраняется в виде WеЬ-страницы Устанавливает/возвращает уровень смещения влево для диапазона Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области диапазона (например, цвет внутренней области) Только чтение. Возвращает расстояние от лево го края са­ мого левого столбца диапазона до левого края столбца А Только чтение. Возвращает количество строк заголовков в диапазоне Возвращает объект Range Только чтение. Возвращает расположение верхнего лево­ го угла диапазона Устанавливает/возвращает возможность модификации ячеек при защите листа . Возвращает значение Null, если некоторые ячейки диапазона заблокированы Только чтение . Возвращает диапазон, содержащий qбъединенный диапазон текущего диапазона ячеек Устанавливает/возвращает присутствие в текущем диапа ­ зоне объединенных ячеек Устанавливает/возвращает объект Na me , в котором со· держится имя диапазона Только чтение. Возвращает следующий диапазон на листе Устанавливает/возвращает формат чисел, связанный ячейками диапазона . Если в ячейках используется разный формат чисел, свойство возвращает значение Null Устанавливает/возвращает формат чисел, связанный ячейками диапаз0на. Формат возвращается на языке пользователя. Если в ячейках используется разный фор­ мат чисел, свойство возвращает зн ачение Nu ll
850 Приложение А Имя Тип возвращае- Описание мого значения Offset Range Orientation Variant OutlineLevel Variant PageBreak Long Phonetic Phonetic Phonetics Phonetics Piv otCell Pivo t Cell PivotFie ld Pivot Field Pivotitem Pivo titem PivotTaЬle PivotTaЬle Preced ents Ran ge Prefix - Variant Character Previous Range QueryTaЬle Qu eryTaЬl e Range Ran ge Read ingOr d e r Long.' Только чтение . Параметры: [RowOffs e t ] , [ColumnOffset]. Возвращает ячейку в виде объекта Range. Расположение возвращаемой ячейки относитель­ но текущей ячейки определяется параметрами. Положи­ тельное значение параметра RowO ffset соответствует смещению вниз . Отрицательное значение параметра Rowof fset соответствует смещению вверх . Положитель­ ное значение параметра columnOffset соответствует смещению вправо. Отрицательное значение параметра Col umnOff set соответствует смещению влево Устанавливает/возвращает ориентацию текста в ячейке. Значение. может находиться в диапазоне от -90 до 90 гра­ дусов. Вместо этого для установки свойства могут исполь ­ зоваться константы Xl Orientation Устанавливает/возвращает уровень сокрытия для диапа­ зона строки или столбца Устанавливает/возвращает разрыв строки , расположен­ ный в диапазоне. Для установки свойства и спользуются константы Xl PageBreak Только чтение. Возвращает объект Phonetic, связанный с диапазоном ячеек Только чтение . Возвращает объекты Pho netic из диапа­ зона Только чтение . Возвращает объект PivotCell, который соответствует яче йке из отчета сводной таблицы Только чтение . Возвращает поле сводной таблицы, свя­ занное с верхним левым углом текущего диапазона Только чтение. Возвращает элемент сводной таблицы, связанный с верхним левым углом текущего диапазона Только чтение. Возвращает отчет сводной таблицы, свя­ з анный с верхним левым углом те кущего ди апазона Только чте ние. Возвращает диапазон ра сположенны х на л исте ячеек, от которых .за в и сит текущий ди апазон ячеек Только чтение . Возвращает символ, который использо­ вался для определения типа данных в диа пазоне ячеек . Например , для текстовой метки используется символ "' Только чтение. Возвращает предыдущий д и апазон на листе Только чтение. Возвращает таблицу запроса , связанную с верхним левым углом текущего диапазо н а Только чтение. П а раметры : Celll , [ Се112 J . Возвращает объект Range , определяемый п а раметрами Cel ll и Се112 . В параметрах используются относительные ссылки на· ячейки . Например, вызов Ra n g e. Range ("Al") возвращает первый столбец родительского диапазона , но это не обязательно первый столqец листа Устанавливает/возвращает направл е ние те кста : справа налево (xlRTL), слева направо (xlLTR) ил и в зависимо­ сти от контекста (x l Context}
Имя Resize Row RowHeight ShowDetail Объектная модель Excel 2003 . 851 Тип возвращае- Описание мого значения Range Long Variant Variant ' Только чтение. Параметры : [RowSize], [ColumnSize] , Возвращает диапазон указанного размера , Размер указы­ вается с помощью свойств RowSize и ColumnSize Только чтение. Возвращает номер строки, в к13торой рас­ положена первая строка диапазона Устанавливает/возвращает высоту строк в диапазоне. Ес­ ли строки диапазона имеют разную высоту , свойство воз ­ вращает значение Null Устанавливает/возвращает необходимость развертыва­ ния всех уровней диапазона , Используется только с диа­ пазонами, которые являются итоговыми столбцо м или строкой ShrinkToFit Variant Устанавливает/возвращает необходимость авто м атиче­ ского уменьшения размера шрифта в соответств ии с ши­ риной столбца, Если ячейки в диапазоне имеют различ­ ные значения свойства ShrinkToFit, свойство возвра­ щает значение Null SmartTags SoundNote Style Summary Text Тор UseStandard- Height UseStandard- Width Validation Value Value2 Vertical- Alignment Width SmartTags SoundNote Variant Variant Variant Variant Variant Variant Validation Variant Variant Variant Variant Только чтение. Возвращает объект SmartTag, соответст­ вующий идентификатору в указанной ячейке Существует для сохранения обратной совместимости Только чтение. Возвращает объект Style, связанны~ с диапазоном Только чтение . Возвращает и нформацию о том, является ли диапазон итоговой строкой или итоговым столбЦом Только чтение. Возвращает текст ячейки диапазона Только чтение. Возвращает расстояние от верхне го края верхней строки диапазона до верхнего края строк и А Устанавливает/возвращает необходимость использования стандартной высоты строк. Если строки в пределах диа­ пазона и меют разную высоту, свойство возвращает зна­ чение Null Устанавливает/возвращает необходимость использования " стандартной шИрины столбцов, Если столбцы в пределах диапазона имеют разную ширину, свойство возвращает значение Null ТоЛько чтение , Возвращает результат проверки данных Для текущего диапазона Параметры: [RangeVal ueDataType ], Устанавлива­ ет/возвращает значени е яч ей ки или массива ячеек в за­ висимости от содержимо го объекта Ra:nge Устанавливает/возвращает значение ячейки или массива ячеек в зависимости от содержимого объекта Range, Свойство Value2 не возвращает типы данных Date и Currency Устана вл ивает/возвращает вертикальное выравнивание ячеек в диапазоне. Для установки Этого свойства исполь­ зуются константы XLVAlign Только чтение. Возвращает ширину диапазона
852 Приложение А Имя Worksheet WrapText XPath ' Тип возвращае- Описание мого значенщl Worksheet Variant Object Только чтение . Возвращает лист, в котором хранится объ­ ект Range Устанавливает/возвращает необходимость переноса тек­ ста внутри ячейки . Возвращает значение Null, если ячей­ ки в диапазоне содержат различные свойства " переноса текста Предоставляет доступ к элементу XPath объекта _в теку­ щем диапазоне Методы объекта Range Имя Activate AddComment Advanced- Fil ter ApplyNames Apply- Ou tl ine- Styl es Auto- Compl e te Тип возвращае- Параметры мого значения Variant Comment Variant Variant Variant [ Text] Ac tion As XlFil- terAction, [CriteriaRange], [CopyToRange] , [Unique] Names, IgnoreRe- . lativeAbsolute, UseRowColumn- Names, Omi t Col- umn, OmitRow, Order As XlAp- plyNamesOrder , [AppendLast] Описание Выделяет диапазон ячеек Добавляет текст и з параметра в ячейку диапазона. Диапазон дол­ жен состоять из одной ячейки Копирует или фильтрует данные о текущем диапазоне. Параметр Ac- tion указывает операцию: копиро­ вание или фильтрация. Параметр Cri teriaRange описывает диапа­ зон с критериям и . Параметр Copy- T oRange описывает диапазон, куда должны быть скопированы от­ фильтрованные данные (если па­ раметр Action установлен в зна­ чение xlFil terCopy) Применяет определенные имена к формулам в диапазоне. Например, если в ячейке содержится формула =$А$1 * 100 и ячей ке $А$1 было при­ своено имя ''Тopleft" , его можно применить к диапазону, и формула изменится на =Topleft*100. Обрати ­ те внимание, что метода UnApply- Names не существует Применяет к диапазону стили структуры String String As Stf ing Возвращает и пытается автомати­ чески завершить слово, указанное в параметре String. Возвращает целое слово, если оно существует. Возвращает пустую строку, если та­ кого слова не существует или су­ ществует более одного слова
Объектная модель Excel 2003 853 Имя Тип возвраЩае- Параметры Описание мого значения AutoFill Variant Destination As Использует текущий диапазон в ка- Range, Туре As честве источника данных для авто- XlAutoFillType матического заполнения диапазона, на который указывает параметр Destination. Кроме этого, пара- метр Туре используется для опре- деления типа заполнения (нaпpимep,xlFillCopy,xlFill- Days) Au toFilter Variant Fie ld , Crite- Создает автофильтр для данных rial, Operator в диапазоне. Дополнительная ин- As XlAutoFil- формация о параметрах приводит- terOperator, ся в разделе, посвященном объекту [Criteria2], AutoFilter [VisiЬleDropDown] AutoFit Variant Меняет ширину столбцов в соот- ветствии с объемом данных в диа - пазоне . Диапазон должен содер- жать полные строки или столбцы AutoFormat Variant Format As Форматирует диапазон в соответ- XlRangeAu to- ствии с выбранным форматом Format, (параметр Format). Остальные па- [Number], раметры являются индикаторами, [Font], включающими формат и рование чи- [Alignment] , сел (Number), шр ифтов (Font), вы- [Border], [Pattern ], равнивания (Alignment), границ [Width] (Border) и шаблонов (Pattern). Кроме этого, указывается способ изменения ширины столбцов в со- ответств14и с применяемым форма- тированием Autooutl i ne Variant Создает структуру для диапазона BorderAround Variant LineStyle, Создает границу вокру г диапазона Weight As с соответствующим стиле м линии XlBorderWeight, (L ineStyle), тол щиной (Weigh t ) Co l orindex As и цветом (co lorindex) XlColorindex, [Col or ] Calculat e Variant Вычисляет значение всех формул в диапазоне Check- Variant [Custom- Проверяет орфографию текста Spelling ' Dictionary] , в диапазоне. При этом можно ука - [ Ignore - зать собственный словарь Uppercase] , (Cust o mDi ctionary ), отключить [AlwaysSuggest], проверку слов, СОСТОЯЩИХ ИЗ [SpellLang] ЗАГЛАВНЫХ букв (IgnoreUppercase), и включить вывод списка предложе нных вари- антов замен ~:.1 (AlwaysSugges t) Clear Variant Очищает ячейки диапазона от текста
854 Приложение А Имя Тип возвращае- Параметры мого значения Clear- Comments Clear- Contents Variant ClearFormats Variant ClearNotes Variant Clear- Variant Outline Column- Range Differences Conso l idate Variant Сору CopyFrom- Recordset Variant Long CopyPicture Variant CreateNames Variant Comparison [Sources], [Function], [TopRow] , [Left Column], [CreateLinks ] [Destination] Data As Recordset, [MaxRows], [MaxColumns] Appearance As XlPioture- Appearanc e, Format As XlCopy- PictureFormat [Тор], [Left], [Bottom], [R i ght] Описание Очищает ячейки диапазона от ком­ ментариев Очищает ячейки диапазона от формул и значений Очищает ячейки диапазона от форматирования Очищает ячейки диапазона от за­ меток · Удал яет outline из текущего диа­ пазона Возвращает диапазон ячеек, кото­ рые отличаются от диапазона, пе­ редаваемого в качестве значения параметра Comparison Консолидирует исходный массив строк ссылок на диапазоны из па­ раметра sources и возвращает ре­ зультат в текущий диапазон. Пара­ метр Function используется для установки функции консолидации. Для установки этого параметра применяются константы XLCon- solidationFunction Копирует текущий диапазон в указан­ ный диапазон или в буфер обмена, если диапазон назначения не указан Копирует в текущий диапазон записи из набора записей ADO или ОАО, указанного в качестве значения па­ раметра Data. Набор записей не может содержать объекты OLE Копирует изображение диапазона в буфер обмена. Параметр Appear - a nc e используется для выбора эк­ ранного представления или пред­ ставления для печати. Параметр Format определяет тип изображения , которое копируется в буфер обмена Создает именованный диапазон для элементов из текущего диапазона. Для отображения имен диапазонов в верхней строке параметр Тор ус­ танавливается в значение True. Для отображения имен диапазонов в нижней строке параметр Bottom ус­ танавливается в значение True. Ус­ тановка параметров Left или Right в значение True приведет к отобра­ жению имен в левом или правом столбце соответственно
Имя Create- . PuЬlisher Cut DataSeries Delete DialogBox Dirty Edition- Options FillDown FillLeft FillUp Объектная модель Excel 2003 855 Тип возвращае- Параметры мого значения Variant Variant Variant Variant Variant Variant Variant Variant Variant Edition, Appear- ance As XlPic- tureAppearance, [ContainsPICT], [ContainsВIFF], [ContainsRTF], [ContainsVALU] [Destination] Rowcol, Туре As XlDataSeries- Type, Date As XlData- SeriesDate, [Step], [Stop], [Trend] [Shift] Туре As XlEdi- tionType, Option As XlEditionOp- tionsOption, Narne, Reference, Appearance As XlPicture- Appearance, CЦartSize As XlPictureAp- pearance, [Forrnat] Описание Создает публикатор на основе диа­ пазона. Метод доступен только на платформе Maciпtosh в операцион­ ной системе System 7 и в более поздних версиях Вр1резает текущий диапазон в диа­ пазон, указанный в параметре Des- tination. Если диапазон назначе­ ния не указан, диапазон вырезается в буфер обмена Создает последовательность дан­ ных на месте текущего диапазона Удаляет ячейки в текущем диапазо­ не и, при необходимости, смещает ячейки в указанном направлении (направление указывается через па­ раметр Shift). Для установки пара­ метра Shi f t используются кoнcтaн­ ты XlDel eteShi f tDi rection Выводит диалоговое окно, опреде­ ленное на листе макросов Excel 4.0 Включает пересчет диапазона при следующей операции пересчета Используется на платформе Mac- intosh. Устанавливает реакцию диапазона на использование в ка­ честве источника (публикатора) или цели (подписчика) ссылки. Объекты Editions примерно соответствуют связям DDE на платформе Windows Копирует содержимое и формати­ рование из верхней строки в ос­ тальные строки диапазона Копирует содержимое и формати­ рование из самого правого столбца в остальне1е столбцы диапазона Копирует содержимое и формати­ рование из самой нижней строки в остальные строки диапазона
856 Приложение А Имя Тип возвращае- Параметры мого значения Find Range FindNext Range FindPrevious Range Function- Wizard GoalSeek Group Insert Insertindent Justify ListNames Merge Navigate- Arrow Variant Boolean Variant Variant Variant Variant Variant What As Variant, [After], [Lookin], [LookAt], [ SearchOrder] , [SearchDirection As XlSearchDi- rection] , [MatchCase], [MatchByte], [Search Format] [After] [After] Goal, Changing- Cell As Range [Start], [End], [Ву], [Periods] [Shift], [CopyOrigin] InsertAmount As Long [Across] [Toward- Precedent], [ArrowNumЬer], [LinkNumber] Описание Просматривает текущий диапазон в поисках текста или типа данных, указанного в качестве значения па­ раметра What . Для выбора началь­ ной позиции параметру After при­ сваивается диапазон, состоящий из одной ячейки. Параметр Lookin определяет область поиска Находит следующее соответствие критерию поиска, определенное с помощью метода Find Находит предыдущее соответствие критерию поиска, определенное с помощью метода Find Запускает мастер функций для верхней левой ячейки текущего диапазона Возвращает значение True, если значение параметра Goal возвра­ щается в результате модификации диапазона ячеек ChangingCell Снижает уровень структуры в диа­ пазоне или группирует несмежные диапазоны в текущем объекте Range Вставляет эквивалентные строки или столбцы из диапазона в другой диапазон листа Выравнивает диапазон в соответ­ ствии со значением параметра In- sertAmount Равномерно распределяет текст в ячейках текущего диапазона Вставляет все имена в пределах ' текущего диапазона начиная с верхней левой ячейки диапазона Объединяет ячейки в диапазоне. Для слияния каждой строки в виде отдельной ячейки параметр Across устанавливается в значение True Перемещает стрелки зависимости в книге из текущего диапазона, воз­ вращая диапазон назначения. Стрелки зависимости должны быть включены. Для этого используются методы ShowDependents и Show- Precendents
Объектная модель Excel 2003 857 Имя NoteText Parse Тип возвращае- Параметры мого значения String [Text], [Start], [Length] Variant [ParseLine], [Destination] PasteSpecial Va~iant Paste As XlPaste- Type, Operation As XlPasteSpecial- Operation, PrintOut Variant PrintPreview Variant Replace- Subtotal Replace Variant Boo'lean [ SkipBlanks] , [Transpose] [From], [То], [Copies], [Preview], [Active Printer], [PrintToFile], [Collate], [PrToFileName] [ EnaЬleChanges] What As Variant, Replacement As Variant, [LookAt], [ SearchOrder] , [MatchCase], [MatchByte], [ SearchForma t] , [ReplaceFormat] Описание Устанавливает/возвращает за­ метки ячеек из текущего диапа­ зона Разбирает строку, указанную с помощью параметра ParseLine, и возвращает ее в текущий диапазон, разделен­ ную на столбцы. Параметр Destination определяет диа­ пазон назначения. Строка ParseLine должна иметь фор­ мат "[ColumnA] [ColumnB]" Вставляет диапазон из буфера обмена в текущий диапазон. Для выбора вставляемых эле­ ментов (например, формулы, значения) используется пара­ метр Paste. Параметр Opera- tion определяет дальнейшие действия над вставляемым диапазоном. Для отказа от ко­ пирования пустых ячеек пара­ метр SkipBlanks устанавли­ вается в значение True. Для транспонирования диапазона параметр Transpose также ус­ танавливается в значение .frrue Печатает диаграммы из коллек­ ции. Параметры определяют принтер, количество копий, по­ рядок сортировки и необходи­ мость предварительного про­ смотра Включает предварительный про­ смотр текущего диапазона . Для отключения кнопок Параметры страницы и Поля параметр En- aЫeChanges нужно установить в значение False. В результате пользователь не сможет изме­ нить параметры печати Удаляет итоговые значения из списка в текущем диапазоне Находит текст, указанный в ка­ честве значения параметра What, и заменяет его на содер­ жимое параметра Replace- ment. Параметр searchOrder вместе с константами XLSear- chOrder позволяет выбрать поиск в строках и в столбцах
858 Приложение А Имя Тип возвращае- Параметры мого значения Row- Range Differences Run Variant Select SetPhonetic Show Show- Dependents ShowErrors Show- Precedents Sort Variant Variant Variant Variant Variant Variant Comparison [Argl] , [Arg2] , ... [ArgЗO] [Remove] [Remove] [Keyl], [Orderl As XlSortOrder], [Кеу2 ], [Туре ], [Order2 As XlSort - Order], [КеуЗ], [OrderЗ As XlSor- tOrder], [Header As XlYesNoGuess] , [OrderC ustom] , [MatchCase], [Orientation As XlSortOrientation ], [SortMethod As XlSortMethod] , [DataOp tionl As XlSortDataOption] , [Data0ption2 As XlSortDataOption] , [DataOptionЗ As XlSortDataOpt ion] Описание Возвращает диапазон ячеек, отличающийся от значения па­ раметра Comparison Запускает макрос Excel 4.0, рас­ положенный в текущем диапазо­ не . Потенциальные аргументы макроса передаются через па­ раметры метода Выделяет ячейки в диапазоне Создает объект Phonetic для каждой ячейки диапазона Прокручивает окно Excel для отображения текущего диапа ­ зона . Используется только с диапазонами , которые состо­ ят из одной ячейки Выводит зависимые ячейки те­ кущего диапазона, состоящего из одной ячейки Выводит источник ошибок в те­ кущем диапазоне Показывает ячейки, от которых зависит текущий диапазон, со­ стоящий из одной ячейки Сортирует ячейки в диапазоне . Если диапазон содержит только одну ячейку, выполняется поиск в активном диапазоне. Параметры Keyl, Кеу2 и КеуЗ определяют столбцы для сортировки. Пара­ метры Orderl , Order2 и OrderЗ устанавливают порядок сорти­ ровки. Параметр Header указы ­ вает на присутствие заголовков в первой строке . Параметр Match- Case определяет учет регистра при сортировке . Параметр Ori - entation определяет сортиров­ ку строк или столбцов. Наконец, параметр SortMethod опреде­ ляет метод сортировки для дру­ гих языков (например, x l Stroke или xlPinYin). Метод SortSpe- cial предназначен для сорти­ ровки языков Дальнего Востока
Имя SortSpecial Speak Тип возвращае­ мого значения Variant SpecialCells Range SubscribeTo Variant Subtotal Variant Объектная модель Excel 2003 859 Параметры [SortMethod As XlSortMethod], [Keyl], [Orderl As XlSortOrder], [Туре], [Кеу2], [Order2 As XlSortOr- der], [КеуЗ], [OrderЗ As XlSort- Order], [Header As XlYesNoGuess], [OrderCustom], [MatchCaseJ, [Orientation As XlSortOrientation], [DataOptionl As XlSortDataOptionJ, [Data0ption2 As Xl- SortDataOptionJ, [DataOptionЗ As XlSortDataOption] [SpeakDirection], [SpeakFormulas ] Туре As XlCellType, [Value] Edition As String, Format As XlSub- scribeToFormat GroupBy As Long, Function As XlCon- solidationFunction, TotalList, Replace, PageBreaks, Sum- maryBelowData As :X:lSummaryRow Описание Сортирует диапазон с использо­ ванием методов сортировки дпя языков Дальнего Востока. Пара­ метры совпадают с параметрам и метода Sort Включает произнесение вслух содержимого диапазона по строкам или столбцам Возвращает ячейки из текущего диапазона, содержащие специ­ альные атрибуты, которые оп­ ределеньrпараметром Туре. Например, если параметр Туре установлен в значение xlCellTypeBlanks, возвра­ щается диапазон, содержащий все пустые ячейки Метод используется только на платформе Maciпtosh С,оздает поле итогов дпя диапа­ зона. Если диапазон состоит из одной ячейки, то ячейка итогов создается дпя активного диапа­ зона. Параметр GroupBy опреде­ ляет группируемое поле (дпя под­ счета итогов) . Параметр Functi- on описывает группировку полей . r:Jараметр TotalList содержит массив смещений полей, которые описывают суммируемые поля. Для замены существующих ито­ гов параметр Replace устанав­ ливается в значение True. Для добавления разрыва страницы после каждой группы параметр PageBreaks устанавливается в значение True. Параметр sum- maryBelowData позволяет ука­ зать расположение строки итогов
860 Приложение А Имя ТаЫе Textтo­ Col umns UnGroup UnMerge Тип возвращае- Параметры мого значения Variant Var:i:ant Variant [Rowinput], [Columninput] [Destination], [DataType As XlTextParsingType], [TextQualifier As XlTextQualifier], [ConsecutiveDelimit er], [ТаЬ], [Semicolon], [Comma], [Space], [Other], [OtherChar], [ Fieldinfo] , [DecimalSeparator], [ThousandsSeparator], [TrailingMinus- Numbers] Пример:объектRапgе Описание Создает новую таблицу данных в текущем диапазоне Разбирает текст в ячейках на несколько столбцов. Параметр Destination определяет точку назначения текста после раз­ бора. Параметр DataType ис­ пользуется для выбора разде­ лителя или фиксированной длины полей. Параметр тext­ Quali f ier определяет символ определения строковых данных при разборе. Параметр Con- secutiveDelimi ter нужно ус­ тановить в з1;1ачение тrue для интерпретации нескольких по­ ~ледовательных разделителей в качестве одного разделителя. Для использования другого разделителя параметр Other устанавливается в значение True и в качестве значения па­ раметра OtherChar передает­ ся новый символ разделителя. Параметру Fieldinfo при­ сваивается двумерный массив, содержащий дополнительную информацию для разбора. Па­ раметры DecimalSeparator и ThousandsSeparator позво­ ляют определить обработку чи­ сел при разборе Повышает уровень структуры в диапазоне или снимает груп­ пировку диапазона в отчете сводной таблицы Разделяет объединенные ячейки Дополнительная информация и примеры работы с объектом Range приводятся в главе 5. Объект RecentFile и коллекция RecentFiles В коллекции RecentFiles хранится список модифицировавшихся в последнее вре­ мя файлов. Коллекция является эквивалентом списка в меню Файл (File) в Excel. Каж­ дый объект RecentFile соответствует одному из модифицированных файлов .
Объектная модель Excel 2003 861 Кроме типичных атрибутов, коллекция RecentFiles предоставляет несколько свойств и метод. Свойство Maxirnum позволяет установить или получить количество элементов в списке файлов. Значение этого свойства должно находиться в пределах от О до 9. Свойст­ во Count возвращает количество объектов RecentFile в коллекции. Метод Add использу­ ется для добавления файла в коллекцию (с указанием параметра Name). Общие свойства объекта RecentFile Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта RecentFile Имя Тип возвращае- Описание мого значения Index Long Name String Path String Методы объекта RecentFile Только чтение. Возвращает положение текущего объекта в коллекции Только чтение. Возвращает имя модифицированного файла Только чтение. Возвращает путь к недавно модифициро­ ванному файлу Имя Тип возвращае- Параметры Описание Delete Open мого значения Workbook Удаляет объект из коллекции Открывает недавно модифицированный файл и возвращает объект книги Пример: объект ReceпtFile и коллекция RecentFiles Объект RoutingSlip Объект RoutingSlip предоставляет доступ к свойствам и методам бланка маршрута документа Excel. Родительским для объекта RoutingSlip является объект Workbook. Перед работой с объектом RoutingSlip свойство HasRoutingSlip объекта Workbook должно быть установлено в значение True. Общие свойства объекта RoutingSlip Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
862 Приложение А Свойства объекта RoutingSlip Имя Тип возвращае- мого значения Delivery XlRouting- SlipDelivery Message Variant Recipients Variant ReturnWhen- Boolean Done Status XlRouting- SlipStatus Subject Variant TrackStatus Boolean Методы объекта RoutingSlip Описание Устанавливает/возвращает способ обработки доставки Устанавливает/возвращает текст тела сообщения на бланке маршрута Параметры: [ IndexJ . Возвращает список имен получате­ лей, которым отправляется родительская книга Устанавливает/возвращает необходимость отправки уве­ домления исходному отправителю Только чтение . Возвращает текущее состояние бланка маршрута Устанавливает/возвращает текст темы сообщения на бланке маршрута Устанавливает/возвращает необходимость отправки уве­ домлений исходному отправителю при каждой пересылке сообщения Имя Тип возвращае- Параметры Описание мого значения Reset Variant Сбрасывает бланк маршрута Объект RTD . Представляет объект данных реального времени , похожий на тот, на который ссыла­ ется объект IrtdServer. На момент написания этой книги доступная документация имела минимальный объем. Свойства объекта RTD Имя Тип возвращае- Описание мого значения Throttle- Interv al Long Устанавливает/возвращает интервал времени между об­ новлениями Методы объекта RTD Имя Тип возвращае- Параметры Описание мого значения RefreshDa t a RTD Restart- RTD Servers Запрашивает у сервера обновление дан­ ных реального времени Восстанавливает подключение к серверам данных реального времени
Объектная модель Excel 2003 863 Объект Scenario и коллекция Scenarios В коллекции Scenarios хранится список всех сценариев, связанных с листом. Каж­ дый объект Scenario соответствует одному сценарию, связанному с листом. Сценарий представляет собой список сохраненных значений ячеек, которые могут быть подставле­ ны в ячейки листа. Родительским объектом коллекции Scenarios является объект Worksheet. Кроме типичных атрибутов, коллекция Scenarios предоставляет несколько свойств и методов. Они перечислены в следующей таблице. Свойства и методы коллекции Scenarios Имя Count Add Create- Suпunary Merge Тип возвращае- Описание мого значения Long Scenario Values Values Только чтение. Возвращает количество объектов Sce- nario в коллекции Метод. Параметры: Name As String, ChangingCells, [Values], [Coпunent] , [ Locked], [НiddеnJ.Добавляет сценарий в коллекцию. Параметр Name указывает имя сценария. Описание параметров приводится в разделе, посвященном свойствам объекта scenario Метод . Параметры: ReportType As XlSuпunaryReport­ Type, [ResultCells]. Создает лист, содержащий итого­ вую информацию по всем сценариям из родительского листа. Параметр ReportType позволяет определить тип отчета . Параметр ResultCells содержит диапазон яче­ ек, в которых хранятся формулы для меняющихся ячеек Метод . Параметры: source. Объединяет сценарии из па­ раметра Source на текущем листе Общие свойства объекта Scenario Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта Scenario Имя Changing- Ce lls Coпunent Hidden Locked Name Va lues Тип возвращае- Описание мого значения Range String Boolean Boolean String Variant }"олько чтение. Возвращает диапазон ячеек на листе, в ко­ торые вставляются значения из определенного сценария Устанавливает/возвращает комментарий сценария Устанавливает/возвращает необходимость сокрытия сце­ нария Устанавлив?,ет/возвращает возможность модификации сценария при защите листа Устанавливает/возвращает имя сценария Только чтение. Параметры : [ Index] . Возвращает массив значений, которые вставляются в ячейки для этого сценария
864 Приложение А Методы объекта Scenario Имя Тип возвращае- Параметры мого значения Change- Scenario Delete Show Va.riant Variant Variant ChangingCells, [Values] Пример: объект Scenario и коллекция Scenarios 'si.iь o/Gefвestscёnarl.oП··~··· rii~ oScen is Scenario Dim oBestScen As Scenario Dim dBestSoFar As DouЫe ' П'еребрать сценарии на листе ForEach oscen In Activesheet.scenarios · ' пьказать сЦенарий · . .oScen. Show · ' Является ли сценарий лучшим? . Описание Меняет набор ячеек на листе, кото­ рые меняют значения в соответствии со сценарием. При необходимости можно выбрать новые значения для сценария Удаляет объект Scenario из кол­ лекции .Отображает результаты сценария , размещая значения сценария на листе If Range("Resu1t") .Value > dВestSoFar Then dBes tSoFar = Range ( "Result" ) .VaJ:ue ·' Да - сохранить его Set · ·oBestScen · oScen · End If Ne;xt ·· ' Показать. луч·шИй сц.енарий ··oвestScen. Show · ~ MsgBox 11 ЛуЧшим - сцеНарием Является 11 & oBe.stSCen. Nam~ tE.lJ.f'l~ .S;..{p ·"• . "'·'~ ~··-"''· ·-"'ж"..• - ". •~ • • " ."~.". """·•··~. • "~. .=- = · Объект Series и коллекция SeriesCollection В коллекции SeriesCollection хранятся ряды из группы диаграммы. Каждый объ· ект Series содержит коллекцию точек для группы диаграммы. Например, простая диа­ грамма графика содержит ряд (Series) точек, извлеченных из исходных данных. Так как на некоторых диаграммах выполняется построение нескольких рядов точек, эта ин­ формация хранится в коллекции SeriesCollection. Родительским объектом для кол­ лекции Seri е sCo11ее t i on является объект ChartGroup. Кроме типичных атрибутов , коллекция SeriesCollection предоставляет несколь­ ко свойств и методов, показанных в следующей таблице.
Об'!>ектная модель Excel 2003 865 Свойства и методы коллекции SeriesCollection Имя Add Count Extend Paste NewSeries Тип возвращае- Описание мого значения Series Long Variant Variant Series Метод . Параметры : Source, Rowcol As XlRowCol, [SeriesLabels], [Catego ryLabels], [Replace]. До­ бавляет в коллекцию объект Series. Параметр Source определяет диапазон или массив с точками данных, опи­ сывающими новую последовательность (и все точки в пределах ряда) Параметр Rowcol позволяет выбрать расположение рядов точек в строках или столбцах диапа­ зона из параметра Source. Если первая строка или стол­ бец диапазона из параметра Source содержат метки ряда и категории, параметры S e riesLabel s и CategoryLa- bels устанавливаются в значение True Только чтение . Возвращает количество объектов Series в коллекции Метод. Параметры: Source, [Rowcol], [Са teg oryLabels J . Добавляет в коллекцию Series- Collection точки из диапазона или массива, на которые указывает параметр source . Дополнительная информация о других параметрах приводится в описании метода Add Метод . Параметры: Rowcol As XlRowCol, [SeriesLabels], [CategoryLabels], [Replace], [NewSeriesJ . Вставляет данные из буфера обмена в коллекцию Seri e sCollection в виде нового объекта series. Дополнительная информация об остальных па­ раметрах приводится в описании метода Add Метод . Создает новый ряд и возвращает созданный объект Общие tвойства объекта Series Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекте Series Имя ApplyPict- ToEnd App lyPict - ToFr ont Appl y Pict- ToSides AxisGroup BarSha pe Тип возвращае- Описание мого значения Boolean Boo l ean Boolean Xl AxisGroup Xl BarSh ape Ус;танавливает/возвращает необходимость добавления рисунка в конце точек ряда Устанавливает/возвращает необходимость добавления рисунка в нач але точе к ряда Уст а навливает/возвращает необходимость добавления ри сунка по бокам точек ряда Устанавливает/возвращает тип оси, используемой для ряда (основная или дополнительная) Устанавливает/возвращает тип геометрическо й фигуры, котора я используется в трехмерной диаграмме или гисто­ грамме (например, хlвох)
866 Приложение А Имя · Тип возвращав- Описание мого значения Border Border BubЬleSizes Variant ChartType XlChartType ErrorBars ErrorBars Explosion Long Fill ChartFill- Format Formula String FormulaLocal String FormulaRlCl String Formula- String RlClLocal HasЗDEf fect Boolean HasData- Boolean Labels HasErroтBars Boolean HasLeader- Boolean Lines Interior Interior Invertif- Boolean Negative LeaderLines LeaderLines Marker- Long Background- Color Только чтение. Возвращает коллекцию границ (сторон) во­ круг ряда . Атрибуты каждой границы могут меняться по отдельности Устанавливает/возвращает ссылки на ячейки (в формате А 1), содержащие данные о размере пузырьков на пузырь­ ковой диаграмме Устанавливает/возвращает тип диаграммы, в которой ис­ пользуется ряд Только чтение. Возвf:Jащает полосы ошибки для ряда. Ис­ пользуется вместе со свойством HasErrorBars Уетанавливает/возвращает расстояние, на которое доли (точки) круговой или кольцевой диаграммы выдвигаются наружу. Для отказа от выдвижения нужно установить свойство в значение О Только чтение. Возвращает объект с параметрами фор­ матирования заливки для ряда точек на диаграмме Устанавливает/возвращает тип метки формулы, которая используется для ряда Устанавливает/возвращает формулу ряда на языке поль­ зователя с использованием формата ссылок А 1 Устанавливает/возвращает формулу ряда на языке мак ­ роса с применением формата ссылок R1C1 Устанавливает/возвращает формулу ряда на языке поль­ зователя с применением формата ссылок R1C1 Устанавливает/возвращает необходимость использования трехмерных эффектов для пузырьковой диаграммы Устанавливает/возвращает необходимость отображения меток данных для точек последовательности Устанавливает/возвращает необходимость отображения полос ошибки для ряда. Используется вместе со свойст­ вом ErrorBars Устанавливает/возвращает необходимость отображения линий меток для ряда. ИспользуетсЯ вместе со свойством LeaderLines Только чтение. Возвращает объект с параметрами фор­ матирования внутренней области ряда (например , цветом внутренней области) Устанавливает/возвращает необходимость инвертирова­ ния цвета точек ряда для отрицательных значений Устанавливает/возвращает необходимость отображения линий меток для точек диаграммы · Устанавливает/возвращает цвет фона маркера точки. Для создания значения цвета используется функция RGB
Объектная модель Excel 2003 867 Имя Тип возвращае- Описание мого значения Marker- XlColorindex Background- Color!ndex Marker- Long Foreground- Color Marker- XlColorindex Foreground- Colorindex MarkerSize Long MarkerStyle XlMarkerStyle Name String PictureType XlChart- PictureType PictureUni t Long PlotOrder Shadow Smooth Туре Values XValues Long Boolean Boolean Long Variant Variant Методы объекта Series Устанавливает/возвращает цвет фона маркера точки. Для установки этого свойства используются константы XlCol- orindex или значение индекса цвета в текущей палитре Устанавливает/возвращает основной цвет маркера точки. Для создания значения цвета используется функция RGB Устанавливает/возвращает основной цвет маркера точки. Для создания значения цвета испо!!ьзуются константы XlColor- Index или значение индекса цвета в текущей палитре Устанавливает/возвращает размер маркера точки Устанавливает/возвращает тип маркера, который исполь­ зуется в качестве кЛюча (например, квадрат, ромб, тре­ угольник, рисунок и т.д.) Устанавливает/возвращает имя ряда Устанавливает/возвращает способ отображения рисунка возле точки из ряда (например, с растягиванием, в виде мозаики). Для установки этого свойства используются константы XlPictureType Устанавливает/возвращает количество единиц, которое представляет рисунок, если свойство PictureType уста­ новлено в значение xlScale Устанавливает/возвращает порядок построения для этого ряда в коллекции SeriesCollection Устанавливает/возвращает необходимость отображения эффекта тени для точек ряда Устанавливает/возвращает необходимость сглаживания кривых на диаграммах графика и рассеивания Устанавливает/возвращает тип ряда Устанавливает/возвращает диапазон, в котором хранятся значения ряда или массив фиксированных значений, со­ держащий значения ряда Устанавливает/возвращает массив значений по оси Х, хранящийся в диапазоне или . в массиве фиксированных значений Имя Тип возвращае- Параметры мого значения Описание Apply- Cus tomType ChartType . As XlChartType Меняет тип диаграммы в соот­ ветствии со значением пара­ метра chartType
868 Приложение А Имя Тип возвращае- Параметры мого значения ApplyData - Labels Variant ClearForrnats Variant Сору DataLaЬles Delete ErrorBar Variant Object Variant Variant Paste Variant [Туре As XlDataLa- belsType], [LegendKey] , [AutoText], [HasLeaderLines], [ShowSeriesName], [ShowCategoryName], [ShowValue], [Show Percentage], [ShowBubЬleSize], [Separator] [Index] [Direction As XlEr - rorBarDirection] , [Include As XlEr - rorBarinclude] , [Туре As XlError - BarType], [Amount], [MinusValues] Points [Index] Select Variant Trendl ines [Index] Описание Устанавливает свойства меток данных в рядах, указанные с помощью параметров . Пара­ метр Туре определяет необхо­ димость сокрытия метки или отображения значения, процен­ та от целого или метки катего­ рии. Возле точки может ото­ бражаться ключ легенды . Для этого параметр LegendKey не­ обходимо установить в значе­ ние True. Для добавления ли­ ний меток параметр HasLead- _ erLines устанавливается в значение True Удаляет форматирование ряда Копирует ряды в буфер обмена Возвращает коллекцию меток данных ряда. Параметр Index позволяет получить одну метку данных Удаляет ряд из коллекции Добавляет в ряд оолосы ошибки. Параметр Direction позволяет выбрать отображения полосы на оси Х или У. Параметр Include определяет включаемые компо­ ненты ошибки. Параметр Туре определяет тип используемых полос ошибки. Параметр Amount определяет сумму ошибки. Параметр MinusVal- ues принимает отрицательную сумму ошибки, если параметр Туре установлен в значение xlErrorBarTypeCustom Использует рисунок из буфера обмена в качестве маркера для точек последовательности Возвращает коллекцию точек, связанных с последовательно ­ стью, или одну точку, если ука­ зано значение параметра Index Выделяет точки последова­ тельности на диаграмме Возвращает коллекцию линий тренда, связанных с последо­ вательностью, или одну линию тренда, если указано значения параметра Index
Объектная модель Excel 2003 869 Пример: 061:1ект Series и коллекция SeriesCol/ection Дополнительная информация и пример использования объе.ктаSеriеs приводится в разделе, посвященном объекту Da taLabe l . Объект SeriesLines Объект SeriesLines позволяет получать доступ к линиям рядов, связывающим зна­ чения данных в пределах каждого ряда. Этот объект относится только к группам двумер­ ных диаграмм с областями или гистограмм . Родительским для объекта SeriesLi nes яв­ ляется объект ChartGroup. Общие свойства объекта SeriesLines Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта SeriesLines Имя Тип возвращае- Описание мого значения Border Bord er Name String Только чтение . Возвращает свойства границы вокруг линий ряда Только чтение. Возвращает имя объекта SeriesLines Методы объекта SeriesLines Имя Тип возвращае- Параметры Описание мого значения Delete Sel ect Varian t Varian t Пример: объект SeriesLines Объект ShadowFormat Удаляет объект Seri esLines Выделяет л инии ряда на диа грамме Объект Sh adowForrnat поддерживает управление свой ствами фор матирования эф­ фекта тени для родительского объекта Shape. Для получения доступа к объекту Sh a d ow- Forrna t нужно воспользоваться свойством Sh adow объекта Shape.
870 Приложение А Общие свойства ShadowFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ShadowFormat Имя ForeColor Obscured Of f setX OffsetY Transparency Туре VisiЫe Тип возвращае~ мого значения ColorFormat MsoTriState Single Single Single MsoShadowТype MsoTriState Описание Только чтение. Поддерживает управление основным цве­ том тени Устанавливает/возвращает перекрытие тени геометриче­ ской фигурой Устанавливает/возвращает горизонтальное смещение тени Устанавливает/во'звращает вертикальное смещение тени . Устанавливает/возвращает прозрачность тени (от О до 1, где 1 соответствует полной прозрачности) Устанавливает/возвращает тип тени Устанавливает/возвращает необходимость отображения тени Методы объекта ShadowFormat . Имя Тип возвращае- Параметры Описание Increment- OffsetX Increment- Of f setY мого значения Пример: объект ShadowFormat Increment As Single Increment As Single ГsuБ:с·ла.аsЪаСiо°*'ТГ" ·~·. ·. '~ 1 Dim oSF As ShadowForma·t , -.в'еt oSF =·. Ас tiveSJ;1~et. Shapes . Range ( Wi:th 'oSF ' . ~·..... . . :,Г уре. = msoS.hadowб .'Qffsetx. =f ·5· · ,QffsetY = 5 '--=;. t . . FOreColor. SchemeColor . . ·visiьl'e = тrue ,.: ~End.With . . , . ~ •.8-.цf? ~;(_,,.,_,,._, . . . .""".:.....Ji~~.• Объект Shape и коллекция Shapes Меняет горизонтальное смещение тени Меняет вертикальное смещение тени В коллекции Shapes хранится список геометрических фиrур на листе. Объект Shape соответствует одной геометрической фигуре, например AutoShape, фигуре произволь­ ной формы, объекту OLE (например, изображению), элементу управления ActiveX или рисунку. В качестве родительских объектов коллекции Shapes могут выступать объекты Worksheet и объект Chart. Кроме типичных атрибутов, коллекция Shapes предоставляет несколько методов и свойств, которые рассматриваются в следующей таблице.
Объектная модель Excel 2003 871 Свойства и методы коллекции Shapes Имя Тип возвращае- Описание мого значения Count Range AddCallout Long ShapeRange Shape AddConnector Shape AddCurve Shape AddDiagram Shape AddForm- Shape Control AddLabel Shape AddLine Shape AddOLEObject Shape AddPicture Shape AddPolyline Shape AddShape Shape AddTextbox Shape Только чтение. Возвращает количество фигур в коллекции Только чтение. Параметры: Index. Возвраlцает объект ShapeRange, содержащий часть геометрических фигур из коллекции Shapes Метод. Параметры: Туре As MsoCalloutType, Left As Single,Top As Single,Width As Single,Height As Single. Добавляет в коллекцию выноску Метод. Параметры: Туре As MsoConnectorType, Be- ginX As Single,BeginY As Single,EndX As Sin- gle, EndY As Single. Добавляет в коллекцию соедини­ тель Метод. Параметры: SafeArrayOfpoints. Добавляет в коллекцию кривую Безье Метод . Параметры : Туре As MsoDiagramType, Left As Single,Top As Single,Width As Single,Height As Single. Добавляет на лист объект AutoShape Метод. Параметры: Туре As XlFormCont.rol, Left As Long,Top As Long,Width.As Long,Height, As Long. Добавляет в коллекцию элемент управления Excel Метод. Параметры : Orientation As MsoтextOrienta­ tion, Left As Single,Top As Single,Width As Single, Height As Single. Добавляет в коллекцию метку Метод. Параметры: BeginX As Single, BeginY As Single,EndX As Single, EndY As Singlе.Добавляет в коллекцию линию Метод. Параметры: [ClassTypeJ, [Filename], [Link], [ DisplayAsicon], [ IconFileName] , [ Iconindex], [IconLabel], [LeftJ, [Тор], [Width], [HeightJ.дo: бавляет в коллекцию элемент управления OLE Метод. Параметры : Filename As String, LinkToFile As MsoTriState, SaveWithDocument As MsoTriS- tate, Left As Single,Top As Single,Width As !Ding1e, Height As Single . Добавляет в коллекцию ри­ сунок Метод. Параметры : SafeArrayOfPoints. Добавляет в коллекцию ломаную линию или замкнутый многоугольник Метод . Параметры: Туре As MsoAutoshapeType, Left As Single,Top As Single,Width As Single, Height As single. Добавляет в коллекцию фигуру, со­ ответствующую значению параметра Туре Метод. Параметры: ·orientation As MsoтextOrienta­ tion, Left As 'single,Top As Single,Width As Single, нeight As Single. Добавляет в коллекцию текстовое поле
872 Приложение А Имя Тип возвращае- Описание мого значения AddText - Effect Build- Freeform SelectAll Shape Freeform- Bui l der Метод. Параметры: PresetTextEffect As MsoPreset - TextEffect, Text As String,FontName As String, FontSize As Single,FontBold As MsoTriState, Fontitalic As MsoTriState, Left As Single,Top As single. Добавляет в коллекцию объект WordArt Метод. Параметры: Edi tingType As MsoEdi tingType, Xl As Single, Yl As Single. Предоставляет доступ к объекту, поддерживающему создание новой фигуры на основе о~ъекта Shap.eNode Метод . Выделяет все фигуры в коллекции Общие свойства объекта Shape Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Shape Имя Тип возвращае- Описание мого значения Adjustments Adjustments Alternative- String Text AutoShape- Type Bl ackWhite - Mode Bottom- RightCell Callout Child Connection- Si teCount Connector Connec to r- Format Control- Format Diagram Diagra mNode MsoAutoShape - Type MsoBlack- WhiteMode Range CalloutFormat MsoTriState Long MsoTriSta: t e Conne ctor - Format ControlFormat Diagram Diagra mNod e Только чтение. Возвращает объект, обеспечивающий дос­ туп к изменению размеров геометрической фигуры Устанавливает/возвращает альтернативный текст, кото­ рый отображ~ется при невозможности загрузки изображе­ ния. Используется вместе с WеЬ-страницами Устанавливает/возвращает тип объекта AutoShape Свойство используется для совместимости с другими па­ кетами рисования . Полезных функций не имеет Только чтение. Возвращает диапазон, состоящий из одной ячейки и соответствующий ячейке под нижним правым уг­ лом геометрической фигуры Только чтение. Возвращает объект, предоставляющий доступ к свойствам выноски Только чтение. Возвращает, является ли текущая геомет­ рическая фигура дочерней или имеют ли все фигуры в пределах диапазона одну родительскую фигуру Только чтение. Возвращает количество потенциаль н ых точек подключения на геометрической фигуре Только чтение . Возвращает информацию о том, является ли фигура соединителем Только чтение. Возвращает объ ект, содержащий парамет­ ры форматирования соединителя. Используется только вместе с фигурами-соединителями Только чтение . Возвращает объект, содержащий парамет­ ры форматирования элемента уп равления Excel Только чтение. Возвращает объект Diagram Только чтение. Возвращает узел на диаграмме
Имя Fill Formcontrol- Туре Groupitems HasDiagram HasDiagram- Node Height Horizontal- Flip Hyperlink ID Left Line LinkFormat LockAspect- Ratio Locked Name Nodes OLEFormat OnAction ParentGroup Picture- Format Placement Rotation Script Тип возвращае- мого значения FillFormat XlFormControl GroupShapes MsoTriState MsoTriState Single MsoTriState Hyperlink Long Single LineFormat LinkFormat MsoTriState Boolean String ShapeNodes OLEFormat String Shape PictureFormat XlPlacement Single Script Объектная модель Excel 2003 873 Описание Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки для объекта Shape Только чтение. Возвращает тип элемента управления, ко­ торым является текущая фигура (например, xlCheckBox). Фигура должна быть элементом управления Excel Только чтение. Возвращает фигуры, из которых состоит текущая фигура Только чтение. Возвращает наличие диаграммы в фигуре или в диапазоне фигур Только чтение. Возвращает существование узла диаграм­ мы в фигуре или в диапазоне фигур УстанавЛивает/возвращает высоту геометрической фигуры Только чтение. Возвращает информацию о том, выпол: нялся ли горизонтальный поворот фигуры Только чтение. Возвращает гиперссылку для фигуры Только чтение. Возвращает тип указанного объекта Устанавливает/возвращает горизонтальное положение геометрической фигуры Только чтение . Возвращает объект с параметрами фор­ матирования линии геометрической фигуры Только чтение. Возвращает объект с параметрами связи OLE Устанавливает/возвр·ащает необходимость сохранения соотношения между размерами геометрической формы при изменении размера Устанавливает/возвращает возможность модификации фигуры при блокировании листа (значение True соответ­ ствует запрету на модификацию) Устанавливает/возвращает имя объекта Shape Только чтение. Возвращает объект с узлами фигуры про­ извольной формы Только чтение. Возвращает объект, предоставляющий доступ к своИствам объекта OLE Устанавливает/возвращает макрос, который необходимо ;запустить при щелчке на геометрической фигуре Только Чтение . Возвращает общую родительскую геомет­ рическую фигуру для дочерней геометрической фигуры или диапазона дочерних геометрических фигур Только чтение. Возвращает объект, предоставляющий доступ к параметрам форматирования рисунка Устанавливает/возвращает взаимодействие объекта на ячейки вокруг Устанавливает/возвращает поворот фигуры в градусах Только чтение. Возвращает сценарий vвscript, связан ­ ный с геометрической фигурой
874 Приложение А Имя Тип возвращае- маго значения Shadow ShadowFormat TextEf fect TextEffect- Format TextFrame Text,Frame ThreeD ThreeDFormat Описание Только чтение . Возвращает объект, предоставляющий доступ к параметрам форматирования тени Только чтение. Возвращает объект, предоставляющий доступ к параметрам эффектов текста Только чтение. Возвращает объект, предоставляющий доступ к параметрам текстового фрейма Только чтение. Возвращает объект, предоставляющий доступ к параметрам форматирования трехмерных эф- фектов Тор Single Устанавливает/возвращает вертикальное положение фи­ гуры TopLeftCell Range Только чтение. Возвращает диапазон, состоящий из одной ячейки и соответствующий положению верхнего левого угла геометрической фигуры 1 Туре MsoShapeType Только чтение. Возвращает тип геометрической фигуры VerticalFlip MsoTriState Vertices Width ZOrder- Posi t ion Variant Single Long Методы объекта Shape Имя Тип возвращае- маго значения Apply Сору CopyPictur e Cut Duplicate Shape Increment- Left Только чтение . Возвращает информацию о том, выпол­ нялся ли вертикальный поворот фигуры Только чтение . Возвращает последовательность пар ко­ ординат, описывающих вершины фигуры произвольной формы Только чтение. Возвращает ширину геометрической фигуры Только чтение. Возвращает положение фигуры относи­ тельно других фигур в коллекции (например, на переднем плане, на заднем плане) Параметры Описание Активизирует геометрическую фигуру Копирует геометрическую фигуру в буфер обмена [Appearance As Копирует изображение диапазона XLPicture- в буфер обмена . Параметр Appear- Appearance], ance используется для выбора экран- [Format As ного представления или представле- XlCopyPicture- ния для печати. Параметр Format оп- Format] ределяет тип изображения, копируемо- го в буфер обмена Вырезает геометрическую фигуру и помещает ее в буфер обмена Дублирует геометрическую фигуру, возвращая дубликат Inc rement Ai;; Перемещает геометрическую фигуру Single по горизонтали
Объектная модель Excel 2003 - 875 Имя Тип возвращав- Параметры Описание мого значения Increment - Increment As Вращает геометрическую фигуру. По- Rotation Single ворот в градусах указывается в каче- стве значения параметра Increment IncrementTop Increment As Перемещает геометрическую фигуру Single по вертикали PickUp Копирует формат текущей геометриче- екай фигуры. После этого формат можно применить к другой геометри- ческой фигуре Reroute- Оптимизирует маршрут текущей гео- Connections метрической фигуры-соединителя ме- жду двумя геометрическими фигурами . Кроме этого, метод может использо- ваться для оптимизации всех соедини- телей, связанных с текущей геометри- ческой фигурой ScaleHeight Factor As Sin- Масштабирует высоту геометрической gle, Relative- фигуры на значение параметра Factor ToOriginalSize As MsoTri - State, [Scale] ScaleWidth Factor As Sin- Масштабирует ширину геометрической gle, Relative- фигуры на значение параметра Factor ToOriginalSize As MsoTri- State, [Scale] Select [Replace] Выделяет геометрическую фигуру в документе Setshapes- Делает форматирование текущей гео- Default- метрической фигуры принятым по Properties умолчанию Ungroup ShapeRange . Делит объект Shape на составные геометрические фигуры ZOrder ZOrderCmd As Меняет порядок объектов Shape MsoZOrderCmd в коллекции Пример: объект Shape и коллекция Shapes Объект Shape является универсальным контейнером для объектов других типов. Примеры использования объекта Shape и коллекции Shapes приводятся в разделах, по­ священных соответствующим объектам . Объект ShapeNode и коллекция ShapeNode$ В коллекции ShapeNodes хранится список узлов и кривых, составляющих геометри­ ческую фигуру произвольной формы . Объект ShapeNode описывает один узел или сег­ мент кривой. Свойство Nodes объекта Shape используется для получения доступа к кол­ лекции ShapeNodes. Кроме типичных атрибутов, коллекция ShapeNodes предоставляет несколько мето­ дов, описанных в следующей таблице.
876 Приложение А Свойства и методы коллекции ShapeNodes Имя Count Delete · Insert SetEditing- Type SetPosition SetSegment- Type Тип возвращае- Описание мого значения Integer Только чтение. Возвращает количество объектов Shape- Node в коллекции Метод. Параметры: Iщlex As Integer . Удаляет узел, указанный с помощью параметра Index Метод. Параметры: Index As Integer, SegmentType As MsoSegmentType, EditingType As MsoEdit- ingType, Xl As Single, Yl As Single,X2 As Sin - gle,Y2 As Single,XЗ As Single, УЗ As Single. Вставляет узел или сегмент кривой в коллекцию Nodes Метод . Параметры: Index As Integer, EditingType As MsoEdi tingType . Устанавливает тип редактирования узла Метод. Параметры: Index As Integer, Xl As Single, Yl As Single. Перемещает указанный узел Метод . Параметры: Index As Integer, SegmentType As MsoSegmentType . Меняет тип сегмента после узла Общие свойства объекта ShapeNode Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта ShapeNode Имя Тип возвращае- Описанμе маго значения EditingType MsoEditingType Только чтение. Возвращает тип редактирования узла P6ints Variant Только чтение. Возвращает пару позиционных координат SegrnentType MsoSegrnentType Только чтение. Возвращает тип сегмента, следующего за углом Пример: объект ShapeNode и коллекция ShapeNodes -~тьg·g.1еАrСБ''(·>7~~:т~~·· :·~с~,'···,··-,:~··:'·":· , ~·r··-~.r­ ·:Lm, oshp д9· sha:P~ '·, / · . 9 SN А$ S}iapeNode·s . pSJ:lp i = ·ActiveSheet ,:s ,hapes (1) rеом~трическаяфигура произвольной формы? hJ?.· т у р е ; . r;isofreeforrn Then узлов
Объектная модель Excel 2003 877 Коллекция ShapeRange В коллекции ShapeRange хранятся объекты Shape для определенного диапазона или выделения в документе . В качестве возможных родительских объектов могут выступать Range и Selection. Кроме типичных атрибутов, колл е кция ShapeRange предоставля­ ет множество свойств и методов, пере~исленных в следующей таблице. Но некоторые операции при использовании вместе с коллекцией ShapeRange, со­ держащей несколько геометрических фигур , могут приводить к появлению ошибки . Свойства коллекции ShapeRange Имя Adjustments Alternative- Text AutoShape- Туре BlackWhite - Mode Callout Child Connection- SiteCount Connector Connect or- Format Count Diagram Diagr .amNode Fill Groupit ems HasDiagram HasDi a g ram- Node Height Тип возвращае- мого значения Adjustments String MsoAuto Shape- Туре MsoBlack- WhiteMode CalloutFormat MsoTriSta t e Long Ms oTriState Conn ecto r- Forma t Long Diagram ·Diag ramNod e FillFormat GroupSh ap es MsoTriState MsoTr i St ate Singl e Описание Только чтение. Возвращает объект, поддерживающий из­ менение формы геометрической фигуры Устанавливает/возвращает альтернативный текст, кото­ рый отображается вместо изображения. Используется вместе с WеЬ-страницами Устанавливает/возвращает тип используемого объекта Aut o Shape Применяется для совместимости с другими пакетами ри­ сования. Полезных функций не имеет Только чтение . Возвращает объект, предоставляющий доступ к свойствам выноски Только чтение. Возвращает информацию о том, является ли текущая геометрическая фигура дочерней, или имеют ли все фигуры в пределах диапазона одну родительскую фигуру Только чтение. Возвращает количество потенциальных точек подключения на геометрической фигуре , ТоЛько чтение. Возвращает информацию о том, является ли фигура соединителем Только чтение. Возвращает объект, содержащий парамет­ ры форматирования соединителя . Используется только - вместе с фигурами-соединителями Только чтение. Возвращает количество геометрических фигур в коллекции Только чтение. Возвращает объект Diagram Только чтение. Возвращает узел диаграммы Только чтение . Возвращает объект, содержащий свойства зал ивки для геометрической фигуры Только чтени е . Возвращает геометрические фигуры, из которых состоит текущая геометрическая фигура Только чтение. Возвращает присутствие диаграммы в пределах объекта Shape или ShapeRange Только чтение. Возвращает существование узла диаграм­ мы в объекте Sh ape или ShapeRange Устанавливает/возвращает высоту геометрической фигуры
878 Приложение А Имя Horizontal- Flip ID Left Line LockAspect- Ratio Name Nodes ParentGroup Picture- Format Rotation Shadow TextEffect TextFrame ThreeD Тор Туре VerticalFlip Vertices VisiЫe Width ZOrder- Posi tion Тип возвращае- мого значения MsoTriState Long Single LineFormat MsoTriState String ShapeNodes Shape PictureFormat Single ShadowFormat TextEf f ect - Format TextFrame ThreeDFormat Single MsoShapeType MsoTriState Variant MsoTriState Single Long Описание Только чтение. Возвращает информацию о том, выпол­ нялся ли горизонтальный поворот геометрической фигуры Только чтение. Возвращает тип указанного объекта Устанавливает/возвращает горизонтальное положение геометрической фигуры Только чтение. Возвращает объект с параметрами фор­ матирования линии геометрической фигуры Устанавливает/возвращает сохранение соотношения ме­ жДу размерами геометрической фигуры при их изменении Устанавливает/возвращает имя геометрической фигуры Только чтение . Возвращает узлы геометрической фигуры Только чтение. Возвращает общую родительскую фигуру дочерней фигуры или диапазона дочерних фигур Только чтение . Возвращает объект с параметрами фор­ матирования рисунка Устанавливает/возвращает угол поворота геометрической фигуры (в градусах) Только чтение. Возвращает объект с параметрами эффек­ та тени Только чтение . Возвращает объект с параметрами эффек­ тов текста Только чтение . Возвращает объект с параметрами тексто­ вого фрейма Только чтение . Возвращает объект с параметрами фор­ матирования трехмерных эффектов Устанавливает/возвращает вертикальное положение гео­ метрической фигуры Только чтение. Возвращает тип геометрической фигуры. Только чтение. Указывает на выполнение вертикального поворота фигуры Только чтение . Возвращает последовательность пар ко­ ординат, описывающих вершины фигуры произвольной формы Устанавливает/возвращает видимость геометрической фигуры Устанавливает/возвращает ширину геометрической фигу­ ры Только чтение. Меняет порядок объектов в коллекции
Объектная модель Excel 2003 879 Методы объекта ShapeRange Имя Align Apply Delete Distribute Duplicate FЦр Group Increment- Lef t Increment- Rotation I n crement- Top PickUp Regroup Reroute- Connections ScaleHeight ScaleWidth Sel ect Тип возвращае- Параметры Описание мого значения ShapeRange Shape Shape AlignCmd As MsoAlignCmd, RelativeTo As MsoTriState Выравнивает фигуры в коллекции. Критерии выравнивания передаются в качестве значений параметров Применяет форматирование, установ­ ленное с помощью метода PickUp Удаляет геометрическую фигуру Distribut eCmd Равномерно распределяет фигуры из As MsoDistrib- коллекции по горизонтали или вepти­ uteCmd, Rela- кали tiveTo As Mso - TriState FlipCmd As MsoFlipCmd Increment As Single Increment As Single Increment As Single Дублирует фигуру и возвращает новый объект ShapeRange ' Выполняет поворот фигуры в соответ- ствии со значением параметра FlipCmd Группирует фигуры в коллекции Перемещает фигуру по горизонтали Поворачивает фигуру. Угол поворота (в градусах) передается в качестве значения параметра Incr e ment Перемещает фигуру по вертикали Копирует формат текущей фигуры, ко­ торый можно применять к другим фи­ гурам Повторно группирует сгруппированные ранее фигуры Оптимизирует маршрут текущей фигу­ ры- соединителя между двумя геомет­ рическими фигурами . Может исполь­ зоваться для оптимизации всех мар­ шрутов соединителей, связанных с те­ кущей фигурой Factor As Sin- Масштабирует высоту фигуры в cooт­ gle , Relative- ветствии со значением параметра ToOriginalSi zё Factor As MsoTriS - tate, [Scale] Fact or As Sin- Масштабирует ширину фигуры в cooт­ g l e , Relative- ветствии со значением параметра ToOriginalSize Factor As MsoTri- State , [Scale] [Replace J Выделяет фигуру в документе ·
880 Приложение А Имя Тип возвращае- Параметры мого значения Описание SetShapes- Def autl- Properties Upgroup ZOrder ShapeRange ZOrderCmd As MsoZOrderCmd Устанавливает форматирование теку­ щей фигуры в качестве принятого по умолчанию Разбивает фигуру, которая состоит из объектов Shape Меняет положение объекта Shape в коллекции Пример: коллекция ShapeRaпge · ·rд.цg.n:sБ:iiJ;JeR'д:nges'( :) ·•'· j ;\ji gSR As ShapeRange ' · . . ; ' ' J1с).riучить первые две Фигуры на Листе .·. · Set' oSR < 1',Cti,Jesheet . Shapes . Range (Array:(:i, : '/ !3ыРо}внЯть> левые ~ края. фигУР . ·' · i;>$R ..Al:j.,gц ;msoAlignl,e.ft.s, · insoFalse -§~PJii~.Gf1~~)~~l.r.::~c.;:,i ,_::·"··~-:;. :.~.~'·-~~-~~ы : ... ~·"·'·,;;-~,~' .~:А~ .~.w~>.~.--~,. • . ~. ) < .~·~ - a~ k( ,'>J iJ< ~ ~ Коллекция Sheets В коллекции Sheets хранятся все листы родительской книги. В книге могут присут­ ствовать листы диаграмм , и листы электронных таблиц, поэтому в коллекции Sheets хранятся объекты Chart и объекты Worksheet из родительской книги. Родительским для коллекции Sheets является объектWоrkЬооk . Общие свойства коллекции Sheets Определения свойств Application, Creator и Parent приводились в начале при­ ложения Свойства коллекции Sheets Имя Тип возвращае- Описание мого значения Count Long HPageBreaks HPageBreaks VPageBreaks VPageBreaks VisiЫe Variant Только чтение. Возвращает количество листов в коллек­ ции (а значит и в книге) Только чтение . Возвращает коллекцию горизонтальных разрывов страницы, связанных с коллекцией Sheets Только чтение. Возвращает коллекцию вертикальных раз­ рывов страницы, связанных с коллекцией Sheets Устан;;~вливает/возвращает необходимость отображения листов из коллекции. Свойство можно установить в зна­ чение xlVeryHidden. В результате пользователь не сможет сделать листы видимыми
Объектная модель Excel 2003 881 Мето~ы коллекции Sheets Имя Add Сору Delete FillAcross- Sheets Move PrintOut PrintPreview Select Тип возвращае- Параметры мого значения [Before], [ After], [Count], [Туре ] [Before], [After] Range As Range, Type . As XlFill- With [Before ], [ After ] [From], [ Т о], [ Copies], [Preview] , [Acti v ePri nter], [ PrintToFile ] , [Collate], [PrToFileName ] [ EnaЫeChanges ] [ Replace ] Описание Добавляет лист в коллекцию. Мож­ но выбрать точку назначения лис­ та, указав объект перед новым объектом листа (параметр Before) или после нового объекта листа (параметр After). Параметр Count определяет количество соз­ даваемых листов . Параме~:р Туре определяет тип листа с помощью констант XLSh eetType Добавляет новую копию активного листа. Положение нового листа оп­ ределяется параметрам и Before и After Удаляет все листы в коллекции. Помните, что книга должна иметь как минимум один лист Копирует значения параметра Range во все остальные листы в тот же диапазон. Пара м етр Туре позволяет выбрать коп и рова ние содержимо го ячеек , формул или всех компонентов ячеек Перемещает текущи й лист на но­ вое место . Новое положе ние опре ­ деляется значениями параметров. Дополнительная информация при­ водилась в описании метода Add Печатает листы в кол ле кции. Прин­ тер, количество копий, сортировка и необходимость предварительного просмотра определяются значе­ ниями параметров. Кроме того, пе ­ чать листов может быть перена­ правлена в файл с помощью пара­ метров PrintToFile и PrToFileName. ПараметрыFrоm и то определяют диапазон пе~а­ таемых страниц Вы водит текущий лист из коллек­ ции в режиме предварительного просмотра. Установка параметра EnaЬleChanges в значение Fa lse отключает кнопки Поля и Параметры страницы. В результате пользователь н е сможет модифи ­ цировать параметры страницы Выделяет теку щий ли ст в коллекции
882 Приложение А Объект SmartТag и коллекция SmartTags Объект SmartTag соответствует присвоенному ячейке идентификатору. В составе Excel предоставляется множество встроенных смарт-тегов, например Stock Ticke1· или распознаватель дат. Кроме того, можно написать собственные смарт-теги на языке Visual Basic. Более подробно смарт-теги рассматриваются в главе 18, но для работы с ними не­ обходимо обладать определенными знаниями по XML. Коллекция SmartTags описывает все смарт-теги, назначенные ячейкам в пределах приложения. Общие свойства объекта SmartTag Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта SmartTag Имя Тип возвращае- Описание мого значения DownloadURL String Только чтение. Возвращает адрес URL, который сохраня­ ется вместе с соответствующим смарт-тегом Name String Только чтение . Возвращает имя смарт-тега Properties CustomPrqper- Только чтение . Возвращает свойства смарт-тега ties Range Range Только чтение . Возвращает диапазон, к которому относит­ ся указанный смарт-тег . SmartTag- Actions XML SmartTagActi- ons String Методы объекта SmartTag Только чтение. Возвращает тип операции для выделенно­ го смарт-тега Только чтение. Возвращает пример кода XML, который передается процедуре с реализацией операции Имя Тип возвращае- Параметры Описание мого значения Delete Удаляет объект Пример: объект SmartTag Обратите внимание, что этот пример уже рассматривался в главе 18, в разделе "Удаление тега из диапазона". Ощюй из негативных особенностей смарт-тегов являются ложные срабатывания, когда тег помещается в ячейку в результате ошибки. В качестве примера можно привести смарт-тег Stock Tickeг, который распознает последовательность "TRUE" в качестве действительного биржевого символа, даже если эта последовательность соответствует значению True типа Boolean. Следующий код обнаруживает все ложные срабатывания и удаляет теги из яЧ:еек: f8U.J3 ' R'ernoveвoqleaiiтrue () ~ t Diп( oSht As · Worksheet Dim oTag ·As smartTag ', 'е Это. ~казатель на смарт-тег StockTicker m: ! corist;, sTicker As -9.tring = {:__} · .. .· , · L"=~:_""" .~"~,u;i.;I1_: .9.cJ:l§щas {- },mi_c;ro,s2 ~ t:J ;... .C;om.:.~J.fise ~§rn~i;'t t;'?-gi;;#,sJ;:o_c_k~t,i g]с~ж:.":."'
Объектная модель Excel 2003 883 Объект SmartТagAction и коллекция SmartTagActions Объект SmartTagAction соответствует операции, поддерживаемой смарт-те гом . Операцией может быть отображение последней цены биржевого символа или назначе­ ние встречи на определенную дату. _ Коллекция SmartTagActions соответствует всем объектам SmartTagAction в пределах приложения . Общие свойства объекта SmartTagAction Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта SmartTagAction Имя Active- XControl Checkbox- State ExpandHelp List- Selection Narne Presentln- Pane RadioGroup- Selection TextboxText Тип возвращае- мого значения Object Boolean Boolean Long String Boolean Long String Описание Возвращает ссылку на элемент управления ActiveX, кото­ рый в данный момент находится в панели задач Documeпt Actioпs Возвращает значение True, если флажок установлен . В противном случае свойство возвращает значение False Возвращает значение True, если в данный момент раз­ вернут элемент управления Smart Documeпt Help. В про­ тивном случае возвращается значение False Возвращает номер пункта в элементе управления List · Только чтение. Возвращает имя смарт-тега Возвращает значение типа Boolean, которое указывает, отображается ли элемент управления Smart Documeпt в панели задач Documeпt Actioпs Возвращает номер выделенного переключателя в преде­ лах элемента управления RadioGroup Возвращает текст из элемента управления TextBox
884 Приложение А Методы объекта SmartTagAction Имя Тип возвращае- Параметры Описание ' мого значения Execute Активизирует операцию смарт-тега Коллекция SmartTagOptions Коллекция SmartTagOptions соответствует всем параметрам смарт-тега. Например, в коллекции хранится информация о необходимости внедрения смарт-тега в лист или о необходимости отображения смарт-тегов. Свойства коллекции SmartTagOptions Имя Display- SmartTags EmЬedSmart­ Tags Тип возвращае- Параметры Описание мого значения XlSmartTag- DisplayMode Boolean Устанавливает/возвращает параметры отображения смарт-тегов Устанавливает/возвращает не,рбходимость внедрения смарт-тегов в указанную книгу Объект SmartTagRecongnizer и коллекция SmartTagRecongnizers Объект Smartтa'gRecongnizer п~едоставляет доступ к механизмам распознавания, которые обрабатывают данные на листе. Эти механизмы могут определяться пользовате­ лем , поэтому смарт-теги распознают информацию любого рода. Дополнительная инфор­ мация приводилась в главе 18. В коллекции SmartTagRecongnizers хранятся все объекты SmartTagRecong- nizer в пределах приложения. Свойства коллекции SmartTagRecongnizers Имя Recog ni ze Тип возвращае- Описание мого значения Boolea n Устанавливает/возвращает возможность распознавания данных с помощью смарт-тегов Общие свойства объекта SmartTagRecongnizer Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта SmartTagRecongnizer Имя EnaЫed FullName Prog id Тип возвращае- Описание мого значения Boolean String String Устанавливает/возвращ~ет результат распознавания объекта Только чтение . Возвращает имя объекта, включая путь к файлу Только чтение. Возвращает программные идентиф'икато­ ры объекта
Объектная модель Excel 2003 885 Объект SoundNote В современных версиях Excel объект SoundNote не используется. Он сохранился в целях обратной совместимости. Список методов этого объекта приводится ниже. Методы объекта SoundNote Имя Тип возвращае- Параметры мого значения Delete Variant Import Variant Filename As String Play Variant Record Variant Объект Speech Предоставляет доступ к приложению распознавания речи, которое предоставляется вместе с пакетом Office ХР. Новая версия механизма распознавания речи дает возмож­ ность чтения вслух текста по требованию или при вводе данных в документ. Для Excel предоставлена возможность чтения содержимого всех ячеек в процессе ввода. Для вклю­ чения этой возможности воспользуйтесь cвoйcтвoмSpeakCellOnEnter. Объект Sреесhдоступен из oбъeктaApplication. Свойства объекта Speech Имя Тип возвращае- Описание мого значения Direction XlSpeak- Direc tion Устанавливает/возвращает порядок чтения ячеек SpeakCell - OnEnter Boolean Методы объекта Speech Устанавливает/возвращает необходимость чтения содер­ жимого активной ячейки при нажатии клавиши <Eпter> или при завершении редактирования активной ячейки Имя Тип возвращае- Параметры Описание мого значения Speak Пример:объектSреесh Text As String, [SpeakAsync] , [ Spe~kXML] , [Purge] Значение параметра техt читается вслух приложением. Если параметр Purge установлен в значен ие True, те­ кущая операция чтения будет прервана с удалением из буферов всего текста Следующая подпрограмма читает вслух итоговы е значения, превышающие установ­ ленный минимум (минимум устанавливается в другой ячейке листа). 1sиs R.e~d~i.~hБ)cl)~ses (}"'"~=·=" ~ ··ьim -lTotai(i~ ' tong ·'. Dim lLimit 'As·, Lorig ". • - i,'_ ,)>_,. , . -- ,-- . . -~-' J:)im rng As , Range ··.
886 Приложение А , F<1:tirnit"'i"2::'wl<s.Ai owЁdi.tRange ~ Range (''L:i..mi't ,; ) · - · ':..- ·"'\>; ' .. :;:/!:';";_ /' ~"$ " " • ' Перебрать итоговые значения For .Each rng In wksAllowEditRange.Range("Expenses") 7' ~ Сохранить · текуЩее итогове значение . J~9tal ~ rng;Offset(o, · 5) .Value . •' Е.сли текущее значение больше установленного ' nрочитатъ его всцух If lTotal > · 1Lirnit Ther): . , Application.Speech.Speak rng.Text Application.Speech.Speak lTotal End If ' Коллекция SpellingOptions Данная коллекция предоставляет доступ к параметрам проверки орфографии в Excel. Эти параметры также доступны на вкладке Орфография (Spelling) в диалоговом окне Сервисс::>Параметры (Too!si:::>Options). Коллекция SpellingOptions доступна через oбъeкт Application. Свойства коллекции SpellingOptions . Имя AraЬicModes DictLang GermanPost- Perform HebrewModes IgnoreCaps IgnoreFile- Names Ignore- MixedDigits Korean- ComЬineAux Korean- Process- Compound KoreanUse- AutoChange- List Suggest- MainOnly UserDict Тип возвращае- мого значения XlArаЬi cModes· Long Boolean XlHebrewModes Boolean Boolean Boolean Boolean Boolean Boolean Boolean String Описание Устанавливает/возвращает режим проверки орфографии арабских языков Устанавливает/возвращает язык словаря, который ис­ пользуется в Excel при проверке орфографии Устанавливает/возвращает проверку орфографии слов с использованием постреформенных правил немецкого языка Устанавливает/возвращает режим проверки орфографии еврейских языков Устанавливает/возвращает необходимость проверки слов в верхнем или нижнем регистре Устанавливает/возвращает необходимость проверки ор­ фографии сетевых адресов lпterпet или имен файлов Устанавливает/возвращает необходимость проверки ор­ фографии для слов, содержащих цифры Устанав ливает/возвращает необходимость комбинир ова­ ния вспомогательных глаголов и прилагательных при про­ верке орфографии для корейского языка Устанавливает/возвращает необходимость обработки со­ ставных существительных при проверке орфографии для корейского языка Устанавливает/возвращает необходимость использования автоматически меняющегося списка слов при проверке орфографии для корейского языка Устанавливает/возвращает необходимость извлечения предложенных слрв только из. основного словаря Устанавливает/возвращает необходимость создания соб­ ственного словаря, в который добавляются новые слова
Объектная модель Excel 2003 887 Пример: коллекция Spe/lingOptions . . \ Следующая подпрограмма устанавливает параметры проверки орфографии и создает собственный словарь, слова в который добавляются в процессе проверки орфографии. Объект Style и коллекция Styles В коллекции Styles хранятся определенные пользователем и встроенные . стили форматирования, например Currency и Normal, для книги или диапазона. Кажды й объект Style предоставляет доступ к атрибугам форматирования, связанным с роди­ тельским объектом. Существует несколько встроенных в Excel объектов Style, напри­ мер Currency. Кроме э того, можно создавать собственные стили . Возможными роди­ тельскими объектам·и коллекции Styles являются объекты Range и WorkЬЬok . Для доступа к стилям через пользовательский интерфейс можно воспользоваться диалоговым окном СТ\'1ЛЬ (Style), выбрав командуФорматqСтиль (FormatqStyle) . . Кроме типичных атрибугов , коллекция Styles предоставляет три дополнительных ат­ рибута. Свойство Count возвращает количество объектов Style в коллекции. Метод Add до­ бавляет новый стиль в коллекцию. Параметр Name определяет имя нового стиля . Параметр BasedOn позволяет выбрать диапазон, на котором будет основан новый стиль. МетодМеrgе объединяет стили текущей книги и книги, на которую указывает параметр Wor kЬook. Общие свойства объекта Style Определения свойств Application, Creator и Parent приводились в начале при­ ложения : . Свойства объекта Style Имя Addindex Borders Builtin Тип возвращае- Описание мого значения Boolean Borders Boolean Устанавливает/в.озвращает необходимость автоматиче­ ского смещения связанного со стилем текста, если для ячейки включено равномерное распределение текста Только чтение . Возвращает связанную со стилем коллекцию границ . Доступ предоставляется к каждой границе отдельно Только чтение . Возвращает информацию о том, является ли стиль встроенным
888 Приложение А Имя Тип возвращае- мого значения Font Font Formula- Boolean Hidden Horizontal- XlHAlign Alignment Include- Boolean Alignment IncJ.ude- Boolean Border IncludeFont Boolean Inc lude- Boolean Number Include- Boolean Patterns Include- Boolean Protection IndentLevel Long Interior Interior Locked Boolean MergeCells Variant Name String NameLocal String NumЬerFormat String Numher- String FormatLocal Ori e ntation XlOrientation ReadingOrder Long Описание Только чтение. Возвращает объект , содержащий парамет­ ры шрифта для соответствующего стиля Устанавливает/возвращает возможность сокрытия свя­ занных со стилем формул при установке защиты для кни­ ги и ли листа Устанавливает/возвр~щает горизонтальное выравнивание для связанных со стилем ячеек. Для установки значения свойства используются константы XlHAlign Устанавливает/возвращает включение в стиль свойств, свя­ занны х с выравнивание м (Addindent, HorizontalAlign- ment, VerticalAlignment, WrapText и Orientation) ' Устанавливает/возвращает включение в стиль атрибутов границ (Color, Colorindex, LineStyle и Weight) Устанавливает/возвращает включение в стиль атрибутов wpифтa(Background,Bo ld,C o lor , Colorindex,Font ­ Style, Italic,Name,OutlineFont, Shadow,Size, Strikethrough, Subscript, Superscript и Und erline) Устанавливает/возвращает включение в стиль свойства NumherFormat Устанавливает/возвращает включение в стиль свойств waблoнoв(Color,C olor ind~x. Inv ertifNegativ e, Pattern, PatternColor и PatternColorindex) Устанавливает/возвращает включение в стиль свойств защиты (FormulaHidden и Locked) Устанавливает/возвращает уровень смещения для стиля Только чтен ие. Возвращает объект, содержащий парамет­ ры форматирования внутренней области стиля (например, цвета внутренней области) Устанавливает/возвращает возможность изменения свойств стиля пр и включении защиты книги Уста навливает/возвращает присутствие в те кущем стиле объединенных ячеек Только чтени е. Возвращает имя стиля Только чтение. Возвращает имя стиля на !i!ЗЫке пользова­ тельского интерфейса Уста навливает/возвращает связанный со стилем формат чисел Уста навли вает/возвращает связанный со сти лем формат чисел на языке пользовательского интерфейса Уста навливает/возвращает ориентацию текста в связан­ ной со стилем ячейке. Свойство может устанавливаться в значение от -90 до 90 (в градусах) . Кроме этого, для ус­ тановки значения сво йст ва можно использовать кoнcтaн­ TQl XlOrien ta tion Устанав ливает/возвр ащает направление чтения текста: справа налево (x l RTL ), слева направо (xlLTR) или в за­ висимости от контекста (xlContext)
Объектная модель Excel 2003 889 Имя Тип возвращае- Описание мого значения ShrinkToFit Boolean Value Vertical - Aligrunent WrapText String XlVAlign Boolean Методы объекта Style Устанавливает/возвращаЕ!Т необходимость автоматиче­ ского изменения ширины связанного со стилем текста в соответствии с шириной столбца Только чтение. Возвращает имя стиля Устанавливает/возвращает вертикальное выравнивание для связанных со стилем ячеек. Для установки свойства используются константы XlVAl ign. Устанавливает/возвращает перенос текста по словам для связанных со стилем ячеек Имя Тип возвращае- Параметры Описание мого значения Delete Variant Удаляет стиль из коллекции Пример: объект Style и коллекция Styles ~su.ь··. ~pCiat~estyl:esT} """''&· -· · · ~· --~- ··• с·-··с>:о···· ,, ··-· .., •;гг ·~""" "' . 1 Dцn ,oStyle As Style ~., . ., . ·. < se1:: oStyle = ActiveWorkbook. Styles ('':Editing'') .·· . ; ' ·· обновить · и разблокировать Editing R1. • · цве~ом фона · · · With oStyle ' .. . includeP'a:tterns True . r ncludeProtection = тrue .Lock~~ = ., False · .Interior l Pa.ttern xlNone En'd With ОбъектТаЬ Этот объект соответствует вкладке в нижней части листа диаграммы или листа элек­ тронной таблицы. Excel 2003 предоставляет возможность модификации цвета вкладки листа. Для этого используются свойстваСоlоr и Colorindex этого объекта. Обратите внимание , что установка свойства Colorindex в значение xlColorin- dexAutomatic (это значение отображается в списке автоматического дополнения ввода для свойства) приводит к ошибке: Общие свойства объекта ТаЬ · Имя Color Color;rndex Тип возвращае- Описание мого значения Variant XlColorindex Устанавливает/возвращает основной цвет объекта таь. Для создания значения цвета используется функция RGB Устанавливает/возвращает цвет внутренней области Пример: объект ТаЬ Следующая подпрограмма меняет цвет вкладки для всех бюджетных листов · в соот­ ветствии со значением дополнительного свойства каждого листа .
890 Приложение А Объект TextEffectFormat Объект содержит все свойства и методы, связанные с объектом Word.Art. Родитель­ ским для объекта TextEffectFormat всегда является объект Shape. Общие свойства объекта TextEffectFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта TextEffectFormat Имя Aligrunent FontBold Fontitalic FontName FontSize KernedPairs Normalized- Height PresetShape PresetText- Effect Тип возвращае- мого значения MsoTextEf fect- Aligrunent MsoTriState MsoTriState String Single MsoTriState MsoTriState MsoPresetText- EffectShape MsoPreset- TextEf f ect Описание Устанавливает/возвращает выравнивание объекта wordArt Устанавливает/в~звращает использование полужирного шрифта Устанавливает/возвращает использование курсива Устанавливает/возвращает шрифт, который используется объектом WordArt · Устанавливает/возвращает размер шрифта Устанавливает/возвращает кернинг в объекте wordArt Устанавливает/возвращает необходимость приведения заглавных и прописных букв к одному размеру Устанавливает/возвращает форму объекта wordArt Устанавливает/возвращает эффект, связанный с объек­ том WordArt
Имя Тип возвращае- Описание мого значения Объектная модель Excel 2003 891 RotatedChars MsoTriState Устанавливает/возвращает поворот объекта WordArt на 90 градусов Text Tracking String Single Устанавливает/возвращает текст для объекта wordArt Устанавливает/возвращает интервал между символами Методы объекта TextEffectFormat Имя Тип возвращае- Параметры Описание Toggle- VerticalText мого значения Пример: объект TextEffec!Format rвиь~' E'orihafтё)CFAFt-tYP~-~~ "~""·!. 7t;+.-· ' · Dim ·· &TEF As ' TextEffect'Fol:'mat Dim oshp As shape , ., Set oShp = Act.iv:eSheet.. shapes (1·) ·i f oShp. Туре "" ' пisoтextEffec t Then • ' Set oTEF =· o·shp.«rext'Effect· .. /,:_· ..... , ' •·· h ' -,~ :• .. '/-..' Объект TextFrame Переключает вертикальное и горизон­ тальное отображение текста В этом объекте хранятся свойства и методы, позволяющие управлять формой тексто­ вого фрейма . В качестве возможных родительских объектов могут выступать Shape и ShapeRange. Общие свойства объекта TextFrame Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта TextFrame Имя Тип возвращае- Описание мого значения AutoMargins Boolean AutoSize Boolean Устанавливает/возвращает необходимость автоматическо­ го вычисления полей текстового фрейма. Устанавливается в значение False для использования свойств MarginLeft, MarginRight, MarginTop и MarginBottom Устанавливает/возвращает автоматическое изменение размера текстового фрейма в соответствии с текстом внутри фрейма
892 Приложение А Имя Horizontal- Alignment MarginBottom MarginLeft MarginRight MarginTop Orientation ReadingOrder Vertical- Alignment Тип возвращае- мого значения XlHAlign Sirigle Single Single Single MsoTextOrien- tation Long XlVAlign Методы объекта TextFrame Описание Устанавливает/возвращает горизонтальное выравнивание для текстового фрейма. Для установки этого свойства ис­ пользуются константы XlHAlign Устанавливает/возвращает размер нижнего поля тексто­ вого фрейма Устанавливает/возвращает размер левого поля текстово­ го фрейма Устанавливает/возвращает размер правого поля текстово­ го фрейма Устанавливает/возвращает размер верхнего поля тексто­ вого фрейма Устанавливает/возвращает ориентацию текста в тексто­ вом фрейме Устанавливает/возвращает направление чтения текста в текстовом фрейме: слева направо (xlLTR), справа налево (xlRTL) или в зависимости от контекста (xlContext) Устанавливает/возвращает вертикальное выравнивание для текстового фрейма. Для установки этого свойства ис­ пользуются константы Xl VA lign Имя Тип возвращае- Параметры Описание мого значения Characters Characters Пример: объект TextFrame [sU.i:Гsei:sh:apeAuEosizeCiЛ"" · Dim oTF As TextFrame ·' [Start], [Length] ! , Dim·· oShp As Shape . ~' ' Set , oShp = ActiveSheet. Shapes (1) Set oTF =, oShp. TextFrame , f · oTF.AutoSize = True r~Цcs{.9μJ?. .""' .••••. . " .... .".".,".:.. Объект ThreeDFormat Возвращает объект, содержащий все сим­ волы из текстового фрейма. Позволяет управлять каждым символом в отдельно­ сти и извлекать фрагмент текста из тек­ стового фрейма В этом объекте хранятся все параметры трехмерного форматирования для родитель­ ского объекта Shape. Для доступа к объекту ThreeDFormat используется свойство ThreeD родительского объекта Shape. Общие свойства объекта ThreeDFormat Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
' Объектная модель Excel 2003 893 Свойства объекта ThreeDFormat Имя Depth Extrusion- Color Extrusion- ColorType Perspective Preset- Extrusion- Direction Preset - Lighting- Direction Preset - Lighting- Softness Preset- Material Preset - ThreeDFormat RotationX RotationY VisiЫe Тип возвращае- мого значения Single ColorFormat MsoExtrusion - ColorType MsoTriState MsoPreset- Extrusion- Direction MsoPreset- Lighting - Direction MsoPreset- Lighting- Softness MsoP) eset- Material MsoPreset- ThreeD Single Single MsoTriState Описание Устанавливает/возвращает "глубину" трехмерной фигуры Только чтение . Возвращает объект, поддерживающий . у п равление цветом экструзии Устанавливает/возвращает способ установки цвета экс­ трузии Устанавливает/возвращает наличие перспективы в экс­ трузии Только чтение . Возвращает направление экструзии Устанавливает/возвращает направление источника света Устанавливает/возвращает мя гкость источника света Устанавливает/возвращает материал поверхности экструзии Только чтение . Возвращает предопределенный формат экструзии Устанавливает/возвращает поворот экструзии (в градусах) Устанавливает/возвращаеТ< поворот экструзии (в градусах) Устанавливает/возвращает необходимость отображения трехмерной ф_игуры Методы объекта ThreeDFormat Имя Тип возвращае- Параметры мого значения Описание Increment - Rota tionX Increment- Rota tionY Reset- Rotation Set- Extrusion- Direction SetThreeD- Forma t Пример: объект ThreeDFormat (suБ ··s.eE§n~i).ёЗrГ(·) ""~IF'··,~· i(. , Dirn oЗDF As · ThreeDFormat · Increment As Single Меняет значение свойства Ro- tationX Increment .As Single Меняет значение свойства Ro- tationY Сбрасывает свойства RotationX и RotationY в значение О PresetExtrusionDire- Меняет направление экструзии ction As MsoPreset- ExtrusionDirection PresetThreeDFormat As MsoPresetThreeD- Format Устанавливает предопределен­ ный формат экструзии Г' <D:i,щ oShp · f1.s Shape . i. ·:L§i! ~.§l!ы~,..f:tg}:;,,:i,yЩ!f15!.§!.t_. EJ:12.Q .§!!".J .11 _.__ .
894 Приложение А "' sёt"'' oЗDF"·;. oshp. TЬ:reeD ·-With o3Df· . . ':Dep,th=10 , . / " . :Se'tExtrusionPirection msoExtrusionBottomRight End Witn " "_1}9, ~цр""'";;.__~;;.;....,....,;.....:;o..,.;.;.:;...Q,,,;~.......-, ; ;.o. .; .::. . , . ., ; ., . . ". ; ., . . -. .. . "• . ., , ".. .,_ ; .:" ,, ,,. .. ., ,. - .;:, Объект TickLabels Объект содержит параметры форматирования, связанные с метками делений на оси диаграммы. Родительским для объекта TickLabels является объект Axis. Общие свойства объекта TickLabels Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта TickLabels Имя Тип возвращае- Описание мого значения Alignment Autoscale- Font Depth Font Name Long Variant Long Font String NumЬerFormat String NumЬer- Boolean FormatLinked NumЬ er- Variant FormatLocal Off set Long Orientation XlTickLabel- Orientation ReadingOrder Long Устанавливает/возвращает выравнивание меток делений . Для установки этого свойства используются константы XlHAlign Устанавливает/возвращает необходимость автоматиче­ ского изменения размера шрифта при изменении размера родительской диаграммы Только чтение . Возвращает количество уровней меток де­ лений категорий на диаграмме Только чтение . Возвращает объект с параметрами шриф­ та текста меток делений Только чтение. Возвращает имя объекта тickLabels Устанавливает/возвращает формат чисел для меток де­ лений, содержащих числа или даты Устанавливает/возвращает необходимость использования метками делений того же формата чисел, который приме­ няется в ячейках с исходными данными диаграммы Устанавливает/возвращает формат чисел для меток де­ лений, содержащих числа и даты. Формат возвращается на языке пользовательского интерфейса Устанавливает/возвращает расстояние между уровнями меток в сравнении с размером шрифта метки оси Устанавливает/возвращает угол расположения текста в метках делений. Значение может указываться в градусах (от -90 ДО 90). Кроме этого, можно воспользоваться кон­ стантами XlTickLabelOrientation Устанавливает/возвращает направление чтения текста (слева направо или справа налево). Свойство использует­ ся с соответствующими языками
Объектная модель Excel 2003 895 Методы объекта TickLabels Имя Тип возвращав- Параметры Описание Delete Select мого значения Variant Variant Пример: объект TickLabels Объект TreeviewControl Удаляет метки делений из меток оси Выделяет метки делений на диаграмме Данный объект обеспечивает управление иерархическим выделением в пределах поля куба. Обычно этот объект используется механизмом записи макросов и не применяется при самостоятельном создании кода VBA. Родительским для объекта TreeviewControl является объект CubeField. Общие свойства объекта TreeviewControl Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства TreeviewControl Имя Drilled Hidden Тип возвращав- Описание мого · значения Variant Variant Устанавливает/возвращает строковый массив, описы­ вающий состояние (развернут/свернут) членов родитель­ скогЬ поля куба Устанавливает/возвращает необходимость сокрытия чле­ на поля куба Объект Trendline и коллекция Trendlines В коллекции Trendlines хранятся линии трендов в пределах диаграммы. Каждый объект Trendl ine соответствует одной линии тренда для определенной последователь­ ности. Объекты Trendl ine используются для графического представления трендов и позволяют прогнозировать значения в будущем . Родительским объектом коллекции Trendlines является объект Series. Кроме типичных атрибутов, коллекция Trendlines предоставляет одно свойство и один метод. Свойство Count возвращает количество объектов Trendline в коллек­ ции. Метод Add добавляет линию тренда на текущую диаграмму. Метод Add принимает параметры Туре, Order, Period, Forward, Backward, Intercept, DisplayEqua- tion, DispayRSquared и Name . Дополнительная информация об этих свойствах при­ водится в разделе "Свойства объекта Trendl ine" .
896 Приложение А Общие свойства объекта Trendline Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Trendline Имя Backward Border DataLa bel Display- Equation DisplayR- Squared Forward Index In.tercept I nterc e pt- IsAuto Тип возвращае- мого значенtiя Long Border DataLabel Boolean Boolean Long Long DouЫe Boo l ean Name String NameisAuto Boolean Order Lo ng Pe riod Long Туре XlTrendline- Type Методы объекта Trendline Описание Устанавливает/возвращает количество периодов, для ко­ торых рассчитывается линия тренда Только чтение. Возвращает свойства границы вокруг ли­ нии тренда Только чтение. Возвращает объект, поддерживающий управление метками данных линии тренда Устанавливает/возвращает необходимость вывода в пре­ делах диаграммы уравнения, на основе которо го создает­ ся линия тренда Устанавливает/возвращает необходимость отображения квадратичного значения линии тренда в пределах диаграммы Устанавливает/возвращает количество периодов в буду­ щем, для которых вычисляется линия тренда Только чтение. Возвращает положение текуще го объекта в коллекции Устанавливает/возвращает точку, в которой линия тренда пересекает ось значений (у) Устанавливает/возвращает необходимость автоматиче­ ского вычисления точки пересечения л и нии тренда с осью значений с помощью регрессии Устанавливает/возвращает имя объекта Trendline Устанавливает/возвращает необходимость автоматиче­ ского выбора имени для линии тренда Устанавливает/возвращает порядок полиномиальной ли­ нии тренда . При этом свойство Тур е должно быть уста­ новлено в значение x l Polyno mi al Устанавливает/возвращает период линии тренда для средних значений Устанав л ивает/возвращает тип линии тренда (например, x lEx ponential, xlLinear и т.д.) Имя Тип возвращае- Параметры Описание мого значения ClearFormats Variant Delete Select Variant Va r iant Очищает форматирование линий тренда Удаляет линию тренда Выделяет линию тренда на диаграмме /
Объектная модель Excel 2003 897 Пример: объект Trendline и коллекция Trendlines Объект UpBars Этот объект содержит параметры форматирования для полос повышения на диа­ грамме. Родительским для объекта UpBars является объект ChartGroup. Для проверки существования этого объекта можно воспользоваться свойством HasUpDownBars объек­ та ChartGroup. Общие свойства объекта UpBars Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта UpBars Имя Тип возвращае- Описание мого -значения Border Fill Interior Name Border ChartFill- Format Interior String Методы объекта UpBars Толь ко чтение. Возвращает свойства границы вокруг по­ лос повышения Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки полос . повышения Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области полос повыше­ ния (например, цвет внутренней области) Только чтение. Возвращает имя полос повышен и я Имя Тип возвращае- Параметры Описание Delete Select мого значения Variant Variant Пример: объект UpBars · Удаляет полосы повышения · Вь1деляет полосы повышения на диаграмме rsu:e· ia:RAfid.P,§ri'iiaJui3вa:iil(')···т•·;:~"'·~:·"""-"""":ц5·•:··.._, , .. ,. k Di.m 'oupвar$ As upвar,~ < . . _;::.. , , .. lf· .' .!ЩбавитЬ,,;• .I'J_G{IОСЫ • ;Повышения/пони~ения , на. ди~тр: i. r · Cha~ts (1) .Ch!1r-tQrou];!s ( 1) , · J1a5UpDownBars .. 7' True у f I · ' '; ПОдуЧ/'!ТЬ ' ко.rr.це1щию . объектов UpBars: . 5:" >set/ oupвars " =Js-ьiЭ.rts (}j.: .c?artGroups ( ~?· .1··:·Отформати.ро13ащь> лольсы. повышеJ:iИ~<. ~~;<-:~.~.:I~~~:f.~~·.-9:.i~~J.чc1~~~="_3~·:._:~..~-~~-~.:~
898 Приложение А Г··Ч·E~J;~~nt'er?-'or:i'atferri ·~,; ~§p.q~;§y Коллекция UsedObjects Эта коллекция предоставляет доступ ко всем объектам, используемым в данный момент во всех открытых книгах. В качестве таких объектов могут выступать листы, листы диа­ грамм и сами книги, а также любые элементы управления ActiveX, размещенные в книгах. Доступ к объекту предоставляется через oбъeкт Application. Обратите внимание , что кроме типичных свойств, коллекция UsedObj ects предос· тавляет свойства Item и Count. Пример: коллекция UsedObjects Следующая подпрограмма перечисляет все родительские объекты коллекции Used- Objects: )ЗU.Ь ... c?:urii::useifb?Jёct s .<· г:.::~у;:::~~1;.:'~;;·~·:··,- ,. ' Dim . lco.unt As Long>+:,,"••::•~·· • · · ; Dim ·ousedobjs As Useд;oь]ects ;·· · отклк\чи~ь обнОвле;~и.е;kЭкрана . Application~ScreeriUpdatirig =False · ' .. ., /,· ''о . ,.,. , .., ' . сохранить . ~~~Й~ · используемых обЪектов .Set oUsedOЬj s·.,·= ~Applica tibn. Щ;ed6bj ects · ' у, ,: - __.. ·:,·•..>~',·: .·_ -/~~~~rt - . . '?, ~ •. ' ОчистИть /старыи пи сок ;vksUsedQbj.e~ts..лsedRange. Offset (1, О) . Resi.ze (, .>·.._ .-. ,- _:•_".,-.-:·- ~- - · _-'-'· ·:~·-· ·, . _ "_· .,_:·/'.:,'. ··--~--- ~- ._ . .•,•:..,, ··'.· · ,-. ' • : • • . ·' ' ·.- _ ._, • .,'.· П~р,ебрать sпиС:ок роди'l'еЛЬ ских объектов Для всех .· объектов··· . ' не : лолу<i<1.~т"с;'J. 1' иЗвлечь ЙМ.f(/загоЛовок/. : . самого объект·.а. "' For· .icoun~)~ ;,, 1 то ousedObj s. count ' ~·· ··. .w k sU s e . d oЬ j ects. Range· ( "Liststart" J .Cells (lcount, : ~ ·;u~e<ioьj ~·': rtem ( icoun't) .' Parent: Narne , · "· · ;· ~ ·Next l 'c 'ount ·. ~119- ~E...Y:f? "h~h~~~" ·r . ";)ir . . . . .йi'Ьt". . . . ~Кli.~~,x,.",~.._""""N""'""""""""'~~~~:...i.~,,.;,,;.. Коллекция UserAccess Описывает одного пользователя из группы пользователей, которым разрешен доступ к диапазону, на который указывает объект AllowEditRange. На пользователя можно ссылаться через свойство Item объекта UserAccessList. После получения ссылки свойства этого объекта позволяют поменять параметры пользователя. Свойства коллекции UserAccess Имя AllowEdit Name Тип возвращае - Описание мого значения Boolean String Устанавливает/возвращает разрешение на доступ к ука­ занному диапазону на защищенном листе Только чтение. Возвращает имя объекта UserAccess
Объектная модель Excel 2003 899 Методы коллекции UserAccess Имя Тип возвращае- Параметры Описание мого значения Delete Удаляет объект Коллекция UserAccessList Описывает список пользователей, которым предоставлен доступ к защищенному диа­ пазону листа . Доступ к этому объекту предоставляется через объект Al lowEdi tRange (после его создания). Для добавления пользователя в список воспользуйтесь методом Add. Параметры метода Add позволяют указать необходимость получения пароля при предоставлении доступа. Обратите внимание, что пароль устанавливается с помощью метода ChangePass- word объекта AllowEdi tRange. Это значит, что все пользователи из списка объекта AllowEditRange будут вводить один и тот же пароль. Обратите внимание, что эта кол­ лекция предоставляет только свойстваСоunt и Item. Методы коллекции UserAccessList Имя Add DeleteAll Тип возвращае- Параметры маго значения UserAccess Name As String, AllowEdit As Boolean Пример: коллекция UserAccessList Описание Добавляет в коллекцию список доступа пользователей. Список передается в ка­ честве значения параметра Name. Если параметр AllowEdit установл ен в зна­ чение True, пользователи из списка дос­ тупа получают право редактирования диапазонов на защищенном листе Удаляет всех пользователей из списка управления доступом к защищенному диапазону на листе Следующая подпрограмма перебирает все объекты AllowEditRange на указанном листе и удаляет всех пользователей, кроме пользователей, имеющих до с туп к диапазону pcNetSales. t~uЬ'": J?eT~t:~eдi Шsё-r:s:~-, · , · ,t • ' ' '
900 Приложение А Объект Validation Объект Validation содержит свойства и методы для проверки действительности введенных в диапазон значений. Родительским для объекта Validation является объ­ ект Rаngе . Общие свойства объекта Validation Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Validation Имя · AlertStyle Тип возвращае- Описание маго значения Long Только ч:rение. Возвращает тип предупреждения, которое выдается пользователю при вводе некорректных данных. Для установки этого свойства использую тся константы XlDVAlertStyle ErrorMessage s .tring Устанавливает/возвращает сообщение об ошибке, кото­ рое выдается при неудачной проверке действительности введенных данных ErrorTitle Formulal Formula2 IgnoreBlank IMEM ode InCell- Dropdown InputMessage Operator ShowError String String Stril)g Boolean Long Boolean String Long Boolean Устанавливает/возвращает заголовок диалогового окна с сообщением об ошибке Только чтение. Возвращает значение, ссылку на ячейку или формулу, которые используются для проверки дейст­ вительности данных Только чтение . Возвращает вторую часть значения, ссыл­ ки на ячейку или формулу, котор ые используются для проверки действительности данных. Свойство Operator должно быть установлено в значение xlBetween или xlNotBetween · Устанавливает/возвращает автоматически положитель­ ный результат проверки для пустых ячеек Устанавливает/возвращает описание пра,вил ввода для японского языка . Для установки этого свойства использу ­ ются константы XlIMEMode Устанавливает/возвращает отображения раскрывающего­ ся списка с действительными значениями в родительском диапазоне. Используется, если свойство Туре установле­ но в значение xlValidateList Устанавливает/возвращает сообщение, которое выдается при запросе действительных данных у пользователя Только чтение. Возвращает оператор, описывающий при­ менение свойств Formulal и Formula2 для проверки действительности введенных данных. Для установки этого свойства используются константы XlFormatCondition- Operator Устанавливает/возвращает отображение сообщения об ошибке при вводе некорректных данных в родительский диапазон
Имя Тип возвращае- Описание мого значения Объектная модель Excel 2003 901 Showinput Boolean Устанавливает/возвращает отображение запроса на ввод, когда пользователь выбирает одну из ячеек в родитель­ ском диапазоне Туре Long Value Boolean Только чтение. Возвращает тип проверки действительно­ сти данных для родительского диапазона. Для установки этого свойства используются константы XЦJVType (например, xlVal ida teDec imal, xlValida teTime) · Только чтение . Возвращает результаты проверки для диа­ пазона Методы объекта Validation Имя Add Delete Modify Тип возвращае- Параметры мого значения Туре As XlDVType , [AlertStyle], [Operator], [Formulal], [Formula2] [Туре], [AlertStyle], [Operator], [Formulal], [Formula2] Пример: объект Validation описание Добавляет проверку действительности . данных в родительский диапазон. При этом необходимо указать тип проверки (параметр Туре) . Тип предупреждения для проверки (параметр AlertStyle) устанавливается с помощью констант XlDVA lertStyle. Для установки значе­ ния параметра Operator используются константы XlForma tCondi tionOpera- tor. Параметры Formulal и Formula2 описывают формулу проверки действи­ тельности данных Удаляет объект Validation из диапа­ зона Модифицирует свойства объекта Vali- dation. Описание параметров приво­ дится в разделе, посвященном свойст­ вам объекта Va lidation
902 Приложение А Объект VPageBreak и коллекция VPageBreaks В коллекции VPageBreaks хранятся все вертикальные разрывы страницы печатае­ мой области родительского объекта. Каждый объект VPageBreak соответствует одному вертикальному разрыву страницы в печатаемой области родительского объекта. В каче­ стве возможных родительских объектов для коллекции VPageBreaks могут выступать объекты Worksheet и Chart. Кроме типичных атрибутов, коллекция VPageBreaks предоставляет одно свойство и один метод. Свойство Count возвращает количество объектов VPageBreak в коллекции. Метод Add позволяет добавить в коллекцию объект VPageBreak (при этом на странице появляется вертикальный разрыв) . МетодАdd принимает параметр Before, который опи­ сывает положение диапазона справа от вертикального разрыва страницы . Общие свойства объекта VPageBreak Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта VPageBreak Имя Extent Location Туре Тип возвращае- Описание мого значения XlPageBreak- Extent Range XlPageBreak Только чтение. {Зозвращает пр отяженность разрыва стра­ ницы на весь зкран. или в пределах области печати Устанавливает/возвращает ячейку, в которой расположен вертикальный разрыв страницы. Левый край ячейки сов­ падает с вертикальным разрывом страницы Устанавливает/возвращает тип разрыва страницы (автоматический или добавленный вручную) Методы объекта VPageBreak Имя Delete DragOff Тип возвращае- Параметры мого значения Direction As XlDirect ion, Regionindex As Long Описание Удаляет разрыв страницы Перемещает разрыв страницы за пределы области печати. Параметр Direction оп­ ределяет направление перемещения раз­ рыва страницы. Параметр Regionindex определяет диапазон печати, в который перемещается разрыв страницы Пример: объект VPageBreak и коллекция VPageBreaks 'sub AddVPageBrea :ks С) т ·- -····~-г~· · ",.. ,.~~-- ". Dim oCell As · Range ' Перебрать все ячей~ив первом столбЦе листа ' For Each oCell In ActiveSh.eet. UsedRange. Rows ( 1) . Cells ' Если размер шриф.та . установлен ~ .эанчение 16, , " добавить ра;>рыв страницы · сЛева от ячейки If oCell.Font,Size· = ·· 16 ' Then · · ActiveSh.eet ;yPageBreaks. Add oCell · End If· . . Next ... r:EI14..sчь " ..~ ~ · ,,,,..., .
ОбъектнаЯ модель Excel 2003 903 Объект Walls В этом объекте хранятся параметры форматирования для всех вертикальных плоско­ стей трехмерной диаграммы. Доступ к отдельным вертикальным плоскостям трехмерной диаграммы невозможен . Родительским для объектаWаlls является объект Chart. Общие свойства объекта Walls Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Walls Имя Тип возвращае- Описание мого значения Border Border Fill ChartFill- Forma t Interior Interior Name String PictureType Variant PictureUni t Variant Методы объекта Walls Только чтение. Возвращает свойства границы вокруг плоскостей трехмерной диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры форматирования заливки вертикальных плоскостей трехмерной диаграммы Только чтение. Возвращает объект, содержащий парамет­ ры форматирования внутренней области вертикальных плоскостей трехмерной диаграммы (например, цвета внутренней области) Только чтение. Возвращает имя объекта Walls Устанавливает/возвращает способ отображения рисунка, связанного с вертикальными плоскостями трехмерной диаграммы (например, растягивание, в виде мозаики). Для установки этого свойства используются константы XlPictureType Устанавливает/возвращает количество единиц измере­ ния, которое соответствует рисунку, когда свойство Pic- tureType установлено в значение xlScale Имя Тип возвращае- Параметры Описание мого значения ClearFormats Variant Delete Select Variant Пример: объект Walls rиь:r~r~~~~~~I~·(·~~~{~: .· . t . ::;e·t ?\'Jall = charts i1) . walls Очищает форматирование объектов walls Удаляет объект walls Выделяет в~ртикальные плоскости на ро­ дительской диаграмме k•H •With, oWall . " ·,; ,· r, •. F;ill. Preset';I'extured msoTextureCork t . .F~ll ~ VisiЬle True . \ EndWith . lE;!lr;i, .. J ?l !P "'"" м • ···~
904 Приложение А Объект Watch и коллекция Watches Объект Watch соответствует одному контрольному значению в окне Контрольные значения (Watch). Для доступа к этому окну выберите команду меню Видс:>Панели инструментовс:>Окно контрольного значения (Viewc:>Toolbai:sc:>Watch). Каждое контроль­ ное значение может описывать ячейку или диапазон ячеек, за которыми нужно следить в процессе изменения данных на листе. Объект Wa tch напоминает контрольные значения, которые создаются в редакторе VВЕ. Контрольные значения позволяют следить за измене­ ниями в ячейках или диапазонах ячеек в процессе изменения данных на листе. В колЛекции Watches хранятся все объекты Watch в пределах приложения. Методы коллекции Watches Имя Add Тип возвращае­ мого значения Watch Параметры Описание Source As Variant Добавляет диапазон, который отслеживается при пересчете содержимого листа Delete Удаляет объект из коллекции Общие свойства объекта Watch Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта Watch Имя Тип возвращае- Описание мого значения Source Va riant Только чтение . Возвращает уникальное имя , идентифици­ рующее элементы, свойство sourceType которых установ­ лено в значения xlSourceRange, xlSourceChart, xlSourcePrintArea,xlSourceAutoFilter,xlSource- PivotTaЬle или xlSourceQuery Методы . объекта Watch ИмЯ Тип возвращае- Параметры Описание мого значения Delete Удаляет объект из коллекции Пример: объект Watch Следующая подпрограмма запрашивает диапазон у пользователя. После этого она пе­ ребирает ячейки в диапазоне и добавляет их в Окно контрольного значения (Watch Window). После чего на экран выводится Окно контрольного значения (Watch Window). J..cЩwa:Ec:riёST) .·. ,.= 7' ·, Dim owatch'' As·\ -1.ai:c h Dim. :tng/ As - Rang.e -"· Dim': · ' r ngWa'tches ,As I;\ange ' ,- ', . ~ .;, \·\ ' ' ,,. Запроси.ть' · у '· подьзователя · диапазон ' ,, ПодаВИТЬ· со0:6UiенИ·е : 06 ОШИ6)<е ' при Щелчке Ъ.;с Error . Resume Next . :, ~$.§I ~ E!}Sf\'l~t.<:_h:§s =, App_+ica,t_ion, , _:J:r,ip,u_Щo_:s (,.,,, -- ~, "':•=
Объектная модель Excel 2003 905 Объект WebOptions Объект WebOptions содержит атрибуты открытия и сохранения WеЬ-документов. Ро­ дительским для объекта WebOptions является объект Workbook. Установленные свойства объекта WebOpt i ons переопределяют параметры объекта De f aul tWebOpt i ons. Общие свойства объекта WebOptions Определения свойств Application, Creator и ·Parent приводились в начале при­ ложения. Свойства объекта WebOptions Имя Тип возвращае- Описание мого значения AllowPNG Download- Components Encoding Folder- Suffix Boolean Boolean MsoEncoding String LocationOf- String Components Organizein- Boolean Folder Устанавливает/возвращает использование формата Port- aЫe Network Graphics Format (PNG) в качестве выходного формата изображений. Этот формат обеспечивает хоро­ шую степень сжатия без потерь и широкую совместимость Устанавливает/возвращает необходимость загрузки ком­ понентов Office на компьютер пользователя при просмо:r­ ре файлов Excel в окне WеЬ-обозревателя Устанавливает/возвращает тип кодовой страницы или на­ .бора символов, с использованием которых будет сохра­ няться документ Только чтение. Возвращает суффикс, который использу­ ется для создания имени каталога поддержки при сохра­ нении документа Excel в виде WеЬ-страницы. Значение этого свойства зависит от языка пользовательского ин­ терфейса Устанавливает/возвращает адрес URL или путь, по кото­ рому можно получить доступ к WеЬ-компонентам Office, необходимым для просмотра документов в · окне WеЬ­ обозревателя Устанавливает/возвращает необходимость сохранения файлов поддержки в отдельном каталоге
906 Приложение А Имя PixelsPer- Inch RelyOnCSS Re l yOnVМL ScreenSize Target - Browser UseLong- FileNames Тип возвращае- Описание мого значения Long Устанавливает/возвращает плотность изображений и яче­ ек таблицы при просмотре в окне WеЬ-обозревателя Boolean Устанавливает/возвращает использование каскадных листов стилей (CSS) для форматирования шрифта Boolean Устанавливает/возвращает отказ от сохранения файлов изображений при сохранении документа с векторными ри­ сунками . Для создания изображений на лету используется язык Vector Markup Laпguage. Язык VML основан на языке разметки XML и предназначен для описания векторных изображен1:1й на WеЬ-с!раницах Msoscreensize Устанавливает/возвращает размер экрана на интересую- щем мониторе Msoтarget - Устанав л ивает/возвращает версию обозревателя Browser Boolean Устанавливает/возвращает необходимость обновления ссылок при каждом сохранении документа Методы объекта WebOptions Имя Тип возвращае- Параметры Описание UseDefault- FolderSuffix мого значения Пример: объект WebOptions si.iБ : se"tweЬb})Ei.ons ( Г -· · · · Diш oWO As WebOpt:i.ons Set ·oWO = ActiveWorkbook.WebOptions Wi'th о\'10 . . .ScreenSize = msoScreensize800x600 . RelyOnCSS = True ·. UseDefaul tFolderSuf fix End With lEn<:l Sub". . ~-""""'' ,., . Заставляет Excel использовать принятую по умолчанию схему именования для соз­ дания каталогов поддержки Объект Window и коллекция Windows В коллекции Windows хранится список окон, которые используются в Excel или в пределах книги. Каждый объект Window соответствует одному окну Excel, содержащему полосы прокрутки и сетку направляющих. Родительским объектом коллекции Windows может быть объект Application или объект Workbook. Кроме типичных атрибутов, коллекция Windows предоставляет свойство Count и ме­ тод Arrange. Свойство Count возвращает количество объектов Window в коллекции. Метод Arrange выстраивает окна в коллекции в соответствии со значением параметра ArrangeStyle. Для установки параметра ArrangeStyle используются константы XlArrangeStyle. Установите параметр ActiveWorkbook в значение True для вы­ страивания только тех окон, которые связаны с открытой книгой. А параметр Sync- Horizontal или параметр SyncVertical установите в значение True для синхронной горизонтальной или вертикальной прокрутки окон .
Объектная модель Excel 2003 907 Общие свойства объекта Window Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Window Имя ActiveCell Тип возвращае- Описание мого значения Range Только чтение. Возвращает ячейку в окне, в котором рас­ положен курсор ActiveChart · Chart Только чтение. Возвращает текущую выделенную диа­ грамму в окне. Если не выделено ни одной диаграммы, свойство ничего не возвращает ActivePane ActiveSheet Caption Display- Formulas Display- Gridlines Display- Headings Display- Horizontal- ScrollBar Display- Outline Display- RightToLef t Display- Vertical- ScrollBar Display- WorkЬookTabs DisplayZeros EnaЬleResize FreezePanes Gridline- Color Gridline- Colorindex Height Pane Variant Boolean Boolean Boolean Boolean Boolean Boolean Boolean 1 Bool ean Boolean Boolean Boolean Long XlColorindex DouЫe Только чтение. Возвращает активную панель в пределах окна Только чтение. Возвращает активный лист в пределах окна Устанавливает/возвращает заголовок окна Устанавливает/возвращает необходимость отображения формул в окне. Не используется с листами диаграмм Устанавливает/возвращает необходимость отображения направляющих на листе Устанавливает/возвращает необходимость отображения за­ головков столбцов. Не используется с листами диаграмм Устанавливает/возвращает необходимость отображения ·горизонтальной полосы прокрутки Устанавливает/возвращает необходимость отображе н ия символов структуры Устанавливает/возвращает необход имость вывода со­ держимого окна справа налево. Используется только с языками, поддерживающими направление чтения спра­ ва налево Устанавливает/возвращает необходимость отображения вертикальной полосы прокрутки Устанавливает/возвращает необходимость отображения вкладок книг Устанавливает/возвращает необходимость вывода нуле- . вых значений. Не используется с листами диаграмм Устанавливает/возвращает возможность изме нения раз­ мера окна через пользовательский интерфейс Устанавливает/возвращает фиксацию разделенных пане­ лей . Не используется с листами диаграмм Устанавливает/возвращает цвет направляющих. Для соз­ дания значения цвета используется функция RGB Устанавливает/возвращает цвет направляющ их. Для ус­ тановки свойства используются константы XlColorindex или номер цвета в текущей цветовой палитре Устанавливает/возвращает высоту окна
908 Приложение А Имя Тип возвращае- мого значения Index Long Left DouЫe OnWindow String Panes Panes Range- Range Selection Scroll- Long Column ScrollRow Long Selected..: Sheets Sheets Seiection Object Split Boolean SplitColumn Long Split- DouЫe Horizontal SplitRow Long Split- DouЫe Vertical Sync- Boolean Scrolling- SideBySide TabRatio DouЫe Тор DouЫe ~ Туре XlWindowТype UsaЬleHeight DouЫe UsaЬleWidth DouЫe View XlWindowView VisiЫe Boolean VisiЬleRange Range Width DouЫe WindowNumЬer Long · Описание Только чтение. Возвращает положение текущего объекта в коллекции Устанавливает/возвращает расстояние от левого края клиентской области до левого края окна Устанавливает/возвращает имя процедуры, которая за­ пускается при активизации окна Только чтение. Возвращает панели в пределах окна Только чтение. Возвращает выделенный диапазон ячеек или объект в предела)!: окна Устанавливает/возвращает номер самого левого видимого столбца в пределах окна Устанавливает/возвращает номер самой верхней видимой строки в пределах окна Только чтение. Возвращает выделенные листы в преде­ лах окна Только чтение. Возвращает выделенный в пределах окна объект Устанавливает/возвращает разбиение окна на панели Устанавливает/возвращает номер столбца, разделяющей окно на панели Устанавливает/возвращает положение горизонтального разбиения окна (в пунктах) Устанавливает/возвращает номер строки, по которой окно было разбито на панели Устанавливает/возвращает положение вертикального разбиения окна (в пунктах) Устанавливает/возвращает одновременную прокрутку до­ кументов при сравнении Устанавливает/возвращает размер вкладки книги как от­ ношение ширины области вкладок к ширине горизонталь­ ной полосы прокрутки окна Устанавливает/возвращает расстояние от верхнего края клиентской области до верхнего края окна Только чтение. Возвращает тип окна Только чтение. Возвращает максимальную высоту окна Только чтение . Возвращает максимальную ширину окна Устанавливает/возвращает представление окна . (нaпpимep,xlNormalView,xlPageBreakPreview} Устанавливает/возвращает видимость окна Только чтение. Возвращает видимый в текущем окне диа­ пазон ячеек Устанавливает/возвращает ширину окна Только чтен111е. Возвращает номер окна. Обычно этот но­ мер используется при повторном открытии одной и той же книги (например, MyBook. xls: 1 и MyBook. xls: 2)
Объектная модель Excel 2003 909 Имя Тип возвращае- Описание мого значения WindowState XlWindowState Устанавливает/возвращает состояние окна (свернуто, развернуто или нормальное) Zoom Variant Устанавливает/возвращает масштаб содержимого окна Методы объекта Window Имя Тип возвращае- мого значения Activate Variant ActivateNext Variant Activate- Variant Previous BreakSide- Boolean BySide Close Boolean CompareSide- Boolean BySideWith LargeScroll Variant NewWindow PointsTo- ScreenPix - elsX PointsTo- ScreenPix- elsY WiщJ.ow Long Long Параметры [ SaveChanges] , [Filename], [RouteWorkbook] [Down], [Up], [ToRight], [ToLeftJ Points As Long Points As Long Описание Активизирует окно Активизирует следующее окно в соответствии с порядком выво­ да на экран Активизирует предыдущее окно в соответствии с порядком выво­ да на экран Отключает режим отображения бок о бок . Возвращаемое значение описывает результат операции Закрывает окно. Для автоматиче­ ского сохранения изменений свойство SaveChanges устанав­ ливается в значение True. Если параметр saveChanges установ­ лен в значение False, все изме­ нения будут потеряны . Параметр Filename используется для ука­ зания имени файла, в котором сохраняется окно. Параметр Routeworkbook позволяет авто­ матически передать книгу еле- ·' дующему получателю Открывает два окна в режиме отображения бок о бок Прокручивает документ на один экран в соответствующем на­ правлении (направление указь1- вается с помощью параметров) Создает и возвращает новое окно Выполняет преобразование гори­ зонтальной координаты докумен­ та из параметра Points в экран­ ные координаты (в пикселях) Выполняет преобразование вер­ тикальной координаты документа из параметра Points в экранные координаты (в пикселях)
910 Приложение А Имя Тип возвращае- Описание мого значения PrintOut Variant PrintPreview Variant RangeFrom- Point Reset- Posi tions- SideBySide Scrollinto- View Object Scroll- Va ~. iant WorkЬookTabs SmallScroll Variant [From], [То], [Copies], [Preview], [ActivePrinter], [PrintToFile], [Collate], [PrToFileName] [EnaЬleChangesJ хAsLong,уAs Long Left As Long, Тор As Long, Width As Long, Height As Long, [ Start] [Sheets], [Position] [Down], [Up], [ToRight], [ToLeft] Распечатывает документ в окне. Принтер, количество копий, по­ рядок сортировки и необходи­ мость предварительного про­ смотра определяются значения­ ми параметров. Кроме этого, пе­ чать листа можно перенаправить в файл. Для этого используются параметры PrintToFile и PrToFileName. Параметры From и то определяют диапазон печа­ таемых страниц Выводит текущую книгу в режиме предварительного просмотра. Для отключения кнопок Поля и Параметры страницы параметр EnaЬleChanges устанавливает­ ся в значение False. При этом пользователь не сможет моди­ фицировать параметры страницы в режиме предварительного про­ смотра Возвращает фигуру или диапа­ зон, расположенные в точке с ко­ ординатами х и у. Если по ука­ занным координатам объект от­ сутствует, метод ничего не воз­ вращает Сбрасывает положение двух окон, расположенных бок о бок Прокручивает окно в положение, определяемое параметрами Left, Тор, Width И Height. При этом параметры описывают верхний левый угол окна (start = True) или нижний правый угол окна (start = False). Значения параметров Left, Тор, Width и нeight указываются в пунктах Прокручивает список вкладок на указанное количество листов (параметр sheets) или до указан­ ного листа (параметр Posi tion) Прокручивает документ на одну строку в указанном направлении
Объектная модель Excel 2003 911 Пример: объект Window и коллекция Windows Объект Workbook и коллекция Workbooks В коллекции WorkЬooks хранится список всех открытых книг. Объект Wo rkЬook соот­ ветствует одной книге . Родительским для объекта WorkЬook является объект App l i саt i on. Свойства коллекции Workbooks Имя Тип возвращае- Описание мого значения Count Long Только чтение. Возвращает количество объектов Work- book в коллекции Displayink ~ Boolean Comments Document- Library- Versions Inactive- ListBorder- VisiЫe Permission Shared- Workspace Smart- Document Sync XmlMaps. Xml- Namespaces Boolean Установка этого свойства в значение True приведет к вы­ воду типографских комментариев ' Возвращает коллекцию всех версий общих книг, в которых включено отслеживание версий Устанавливает видимость границы элемента управления списка при деактивизации элемента управления Возвращает объект Per mission, описывающий парамет­ ры доступа Возвращает ссылку на рабочее пространство, в котором был создан документ Возвращает все параметры смарт-документа Предоставляет доступ ко всем методам и свойствам до­ кумента, входящего в рабочее пространство Предоставляет доступ ко всем отображениям схем, кото­ рые были добавле~ы в книгу Возвращает все пространства имен XML, которые были ·добавлены в книгу Методы коллекции Workbooks Имя Add Тип возвращае- Параметры мого значения Workbook [Template] Описание Добавляет новую книгу в кол­ лекцию. Параметру Templ'a te присваивается имя шаблона, на основе которого создается кни­ га. Кроме этого, для определе­ ния имени книги используются константы Xl WBATemp late
912 ПриложениеА Имя Тип возвращае- Параметры маго значения Описание CanCheckOut Boolean Close Discard - Conflict Offline- Conflict Open в'oolean Workbook OpenDatabase Workbook Filename As String Возвращает возможность полу­ чения указанной книги с сервера Закрывает книгу Filename As String Это ключевое слово зарезерви­ ровано дл я использования Filename As String Filename As String, [UpdateLinks], [ReadOnly] , [Format], [Password], [ WriteResPassword], [IgnoreReadOnlyRe - commended], [Origin], [Delimiter], [EditaЬle], [Notify]' [Converter], [AddToMru], [Local], [CorruptLoad], [OpenConflict Docu- ment] Filename As String, [ CommandText] , [ CommandType] , [Background Query], [ImportData As] в будущем Это ключевое слово зарезерви­ ровано для использования в будущем Открывает указанную книгу. Имя книги передается в качестве значения параметра Filename. Открытая книга добавляется в коллекцию . Параметр Update- Links позволяет выбрать спо­ соб обновления связей , храня­ щихся в файле . Для открытия книги в режиме только чтения параметр ReadOnly устанавли­ вается в значение True. Если файл требует предоставления пароля перед открытием, пароль можно присвоить параметру PasswordИЛИWriteResPass­ word. Для добавления книги в коллекцию недавно открытых файлов параметр Addтoмru не ­ обходимо установить в значение тrue. Если открываемый файл содержит текст с разделителя­ ми, можно воспользоваться со­ от ветствующими параметрами. Параметр Forma t позволяет оп­ ределить символ-разделитель. Параметр Origin определяет кодовую страницу открываемого файла . Параметр Delimiter позволяет указать символ­ разделитель, если параметру Forma t присвоено значение 6 (собственный формат) . Возвращает объект Workbook, соответствующий базе данных, на котЬрую указывает параметр Filename. Параметры Com- mandText и CommandType по­ зволяют определить текст и тип запроса
Имя OpenText OpenXML Объектная модель Excel 2003 913 Тип возвращае- Параметры мого значения Workbook Filename As String, [Origin], [StartRow], [Dat aType], [TextQualifier] , [Consecutive Delim- i ter ], [ТаЬ], [Semicolon] ,- [Comma], [Space], [O ther], [OtherChar] , [ Fieldinfo] , [TextVisual Lay- out], [DecimalSeparator], [ThousandsSepara - tor], [TrailingMinusNum- bers] , [ Local] Fi l ename As String, [ Stylesh eets ] Описание Открывает текстовый файл, имя которого указано в качест­ ве значениs;~ параметра File- name. Содержимое файла раз­ мещается на листах создавае­ мой книги. Параметр Origin поз воляет указать кодовую страницу для текста в файле (для установки значения пара­ метра используются п араметры XlP l atform) . Параметр startRow определяет первую разбираемую стро ку. Параметр DataType описывает ти п фай­ ла: с разделителями (xlDelimi ted) или с полями фиксированного размера (xlFixedWidth). Если пapa­ мeтp ConsecutiveDelimiter установить в значение True, последовательность раздели­ телей будет воспр и н и маться в качестве одного разделителя. Для выбора символа­ разделителя параметр ТаЬ, Semicol on, Comma, Space или Oth er уста навли вается в зна ­ чение True. Для ~ыбора число­ вых разделителей используют­ ся параметры DecimalSepa- rator И ThousandsSeparator Загружает в Microsoft Ехсе\ файл XML. Для определения страницы стилей XSLТ с инст­ рукциями обработки использу­ ется параметр Stylesheets Общие свойства объекта Workbook Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта Workbook Имя Тип возвращае- Описание мого значения AcceptLabel s- Boolean InFormulas ActiveCh art Chart Устанавливает/возвращает возможность использования мето к в формулах листа Только чтение . Возвращает активную диаграмму в пре­ делах ли ста
; 914 ПриложениеА Имя Тип возвращае- Описание мого значения ActiveSheet AutoUpdate- Frequency AutoUpdate- SaveChanges Builtin- Document- Properties Calculation- Version Change- History- Duration Charts CodeName Colors CommandBars Conflict- Resolution Container CreateBackup Custom- Document- Properties CustomViews Date1904 Display- Drawing- Objects EnaЬleAuto- Recover Envelope- VisiЫe Long Boolean Document- Properties Long Long Sheets String Variant comпiandBars XlSave- Conflict- Resolution · вoolean Document- Properties CustomViews Boolean xlDisplay- Drawing- Objects Boolean Boolean Только чтение . Возвращает активный лист (лист диа­ граммы или лист электронной таблицы) в пределах книги Устанавливает/возвращает частоту автоматического об­ новления общей книги (в минутах) Устанавливает/возвращает видимость изменений в об ­ щей книге для других пользователей при автоматическом обновлении Только чтение. Возвращает коллекцию, в которой хра­ нятся все встроенны'е свойства книги. Этот объект пре­ доставляет доступ к таким атрибутам, как заголовок, те­ ма, автор и количество слов в пределах книги Только чтение. Возвращает номер версии приложения Exdei, которое использовалось при последнем пересчете листа Устанавливает/возвращает длительность истории изме­ нений для совместно используемой книги Только чтение . Возвращает диаграммы, хранящиеся в книге Только чтение. Возвращает имя книги, установленное на этапе проектирования в редакторе VBE Параметры: [ Index J . Устанавливает/возвращает цвета для цветовой палитры книги. В палитре может присут­ ствовать до 56 цветов Только чтение . Возвращает объект, предоставляющий доступ к командным панелям в Excel Устанавливает/возвращает способ решения конфликтов при обновлении совместно используемой книги (напрИмер, xlLocalsessionChanges означает, что из­ менения локального пользователя принимаются всегда) Только чтение. Возвращает объект, содержащий книгу Только чтение. Возвращает необходимость созда н ия файла с резервной копией при сохранении книги Только чтение. Возвращает коллекцию, в которой хра­ нятся все определенные пользователем свойства книги Только чтение. Возвращает коллекцию созданных поль­ зователем представлений книги Устанавливает/возвращает необходимость использова­ ния в книге системы дат 1904 Устанавливает/возвращает необходимость вывода гео­ метрических фигур или шаблонов вместо геометрических фигур или сокрытия фигур Устанавливает/возвращает периодическое сохранение изменений в файлах всех форматов Устанавливает/возвращает видимость панели инстру­ ментов конверта и заголовка создания сообщений элек­ тронной почты
Имя Excel4Intl- MacroSheets Excel4Macro- Sheets FileFormat FullName FullName- URLEncoded HasPa ssword HasRouting- Slip Highlight- Changes- OnScreen HTMLProj e ct IsAddin Isinplace KeepChange - History ListChanges- OnNewSheet Maile r Multi User- Editing Name Names Pa sswor d Password- Encryption- Algorithm Password- Encryption- File- Properties Тип возвращае- мого значения Sheets Sheets XlFileFormat String String Boolean Boolean Boolean HTMLProject Boolean Boolean Boolean Boolean Ma iler Boolean String Names St ring St ring Boolean Объектная модель Excel 2003 915 Описание Только чтение . Возвращает коллекцию интернационали­ зированных листов макросов Excel 4.0 Только чтение. Возвращает коллекцию листов макросов Excel 4.0 Только чтение. Возвращает формат файла для книги Только чтение. Возвращает путь и имя файла , в котором хранится книга Только чтение. Возвращает имя объекта, включая его путь на диске Только чтение . Возвращает наличие парольной защиты книги Устанавливает/возвращает наличие бланка маршрута до­ кумента. Используется вместе с объектом RoutingSlip Устанавливает/возвращает видимое выделение измене­ ний . в совместно используемой книге Только чтение. Возвращает объект, предоставляющий доступ к окну проекта в редакторе сценар1:1ев Устанавливает/возвращает информацию, является ли текущая книга надстройкой Только чтение. Возвращает информацию о том , выпол­ няется ли редактирование книги в Microsoft Excel (False) или книга редактируется в виде внедренного объекта (True) Устанавливает/возвращает необходимость хранения списка . изменений в совместно используемой книге Устанавливает/возвращает необходимость вывода из­ менений в совместно используемой книге на отдельном листе Только чтение. Используется только на платформе Mac- iпtosh Только чтение. Возвращает информацию о том, исполь­ зуется ли книга совместно :Голько чтение. Возвращает имя файла книги Только чтение. Возвращает коллекцию имен диапазонов в пределах книги Устанавливает/возвращает пароль, который должен вво­ диться для открытия книги Только чтение. Возвращает алгоритм, который использо­ вался в Excel для шифрования паролей книги Только чтение. Возвращает информацию о шифровании свойств файла книги
Saved SaveL i nk- Values Sheets Bool ean Boolean Sheets ShowConflict- Boolean History Описание Только чтение . Возвращает длину ключа для алгоритма, которы й использовался в Excel для ш и фрования паролей кни ги Только чтение. Возвращает имя поставщи ка алгоритма шифрования, который использовался в Excel для шиф­ рования паролей книги Только чтение. Возвращает п уть к книге Устанавливает/возвращает присутствие в пользователь­ ском представлени и кни ги фильтров и параметров сор­ тировки для списков Устанав ливает/возвращает пр исутствие в пользователь­ ском представлен ии книги параметров печати Устанавливает/возвращает вывод точност и чисел в ячейках. Используется пр и расчетах Только чтение. Возвращает необходимость сохранен ия порядка листов в книге Только чтение. Возвращает наличие защиты окон Только чтение. Предоставляет доступ к объекту, который использова лся для публикации объектов кни ги в виде WеЬ-страниц Только чтение . Возвращает состояние режима "Только чтение" Только чтение . Возвращает необходимость запроса у пользователя режима ''Только чтение" при открытии книги Устанавливает/возвращает возможность удаления пер­ сональной информации из книги Только чтение. Возвращает количество сохранений со­ вместно используемой книги в процессе работы Тол ько чте ни е . Результат перенаправления книги сле­ дующему получателю , Только чтение. Предоставляет доступ к объекту Rout- ingSlip, котор ый используется для Добав ления бланка маршрута к книге . При менЯется вместе со свойством HasRoutingSlip Уста навлив ает/возвра щает наличи е измене н ий, требую­ щих сохранения Устанавливает/в оз вращает необходим ость сохранения значений , связанных с внешними источниками Только чтение . Возвращает коллекцию листов в книге (Chart или Worksheet) Устанавли вает/в озвращает необходимость вывода лис­ та, содержа щего конфликты из совместно используемой книги
Имя ShowPivot- TaЬleField­ List SmartTag- Options Styles Template- RemoveExtData UpdateLinks UpdateRemote- References UserStatus VBASigned VBProject WebOptions Windows Worksheets WritePassword WriteReserved Write - ReservedBy Объектная модель Excel 2003 917 Тип возвращае- Описание мого значения Boolean SmartTagOp- tions Styles Boolean XlUpdateLinks Boolean Variant Boolean VBProject WebOptions Windows Sheets S tring Boolean String Устанавливает/возвращает необходимость отображения списка полей сводной таблицы Только чтение . Возвращает операции, которые можно выполнять над смарт-тегами Только чтение. Возвращает коллекцию стилей, доступ­ ных в книге Устанавливает/возвращает необходимость удаления всех внешних ссылок при сохранении книги в виде шаб­ лона Устанавливает/возвращает параметры обновления вне ­ дренных ссылок OLE Устанавливает/возвращает необходимость обновления внешних ссылок Только чтение. Возвращает имя текущего пользователя Только чтение . Возвращает наличие цифровой подписи проекта VBA для книги Только чтение. Предоставляет доступ к проекту VBE и связанным с ним проектам Только чтение. Возвращает объект, предоставляющий доступ к свойствам WеЬ-документа книги Толь ко чтение . Возвращает коллекцию окон , составляю­ щи х книгу Толь ко чтение . Возвращает коллекцию листов , состав­ ляющих книгу Устанавливает/возвращает пароль защиты от запИси в книгу Только чтение. Возвращает возможность модификации книги Только чтение . Возвращает имя пользователя, имеюще­ го возможность модификации книги Методы объекта Workbook Имя Accept - Allchanges Act:lvate AddTo - Favori tes BreakLink Тип возвращае- Параметры мого значения [Wh en] , [Who], [Wh ere ] Name As String, Туре As XlLinkType Описание Принимает все изменения, вне­ сенные другими пользователями в совместно используемую книгу Активизирует книгу Добавляет книгу в папку Избранное (Favorites) Выполняет преобразование формул, связанных с другими источниками Excel или источни­ ками OLE, в значения
918 Приложение А Имя CanCheckin ChangeFile- Access ChangeLink Checkin Close Delete- NшnЬerForrnat EndReview Exclu sive- Access Тип возвращае- Параметры мого значения Boolean Bool ean Mo de As XlFileAc- cess, [ Write Pass- wo rd] , [Notify] Name As String, NewName As String , Туре As XlLink Type [Sa v eChanges] , [C o mments], [ MakePuЬlic] [ SaveChang e s] , [Fi l ename] , [Rou teWorkbook ] NumberForma t As String Описание Устанавливает/возвращает возможность передачи книги на сервер Меняет разрешения на доступ к книге. Разрешения определя­ ются значением параметра M9 de. При необходимости в ка­ честве значения параметра Wri tePasswo rd можно указать пароль на запись . Для уведом­ ления пользователя о невоз­ можности доступа к файлу па­ раметр Notify уста навл ивает­ ся в значение тrue Меняет связь, указывающую на книгу в параметре Name, на связь, указывающую на книгу в параметре NewN ame. Пара­ метр Туре определяет тип свя­ зи (например, OLE, Excel}. Включает или отменяет извле­ чение рабочей копии книги на сервере Закрывает книгу. Для автома­ тического сохранения измене­ ний параметр SaveCh a n ges устанавливается в значение True. Если параметр SaveChanges установлен в значение Fa l s e , все измене­ ния будут потеряны. В параметр Fi l ename вносится имя файла, в котором сохраня­ ется книга . Параметр Ro ut e- Workbook исп ользуется для автоматической передачи книги следующему получателю. Удаляет формат чисел (параметр NumЬerFormat} из книги Завершает рецензирование файла Предоставляет текущему поль ­ зователю исключительные пра­ ва на доступ к совместно ис­ пользуемой кни ге
Объектная модель Excel 2003 919 Имя Follow- Hyperlink Highlight- Changes- Options Linkinfo Тип возвращае- Параметры мого значения Variant Address As String, [SubAddress], [NewWindow] , [AddHistory] , [ Extrainfo ] , [Method], [Headerinfo] [When], [Who], [Where] Name As String, Linkinfo As XlLink- Info, [Туре], [EditionRef] LinkSources Variant 1Туре] Merge- Workbook Filename Описание Открывает соответствующее приложение с помощью адреса URL, который передается в ка­ честве значения параметра Ad- dress. Для открытия гипер ­ ссылки в новом окне параметр NewWindow устанавливается в значение True. Для отправки дополнительной информации по гиперссылке (например, для страниц ASP) нужно воспользо­ ваться параметрами Ex- trainfo и Method. Для уста­ новки параметра Method ис­ пользуются константы MsoEx- trainfoMethod Устанавливает/возвращает не­ обходимость отображения из­ менений в совместно исполь­ зуемой книге (When), а именно: какие изменения должны ото­ бражаться (who) и диапазон, в котором должны находиться изменения (Where). Для уста­ новки' значения параметра When используются константы XlHighlighChangesTime Возвращает дополнительную информацию о связи . Интере­ сующая информация выбира­ ется с помощью параметра Linkinfo. Ссылка выбирается с помощью параметра Name. · Для установки параметра Туре используются константы XlLinkinfoType (этот пара­ метр позволяет выбрать тип возвращаемой связи) Возвращает массив связанных документов, редакци й , серве- . ров DDE и OLE в пределах кни­ ги. Для установки свойства Туре используются константы XlLink infoType (этот пара­ метр позволяет выбрать тип возвращаемой связи) Объединяет изменен ия из книги, на которую указывает параметр F ilename , с текущей книгой
920 Приложение А Имя NewWindow OpenLinks Тип возвращае- Параметры мого значения Windows Name As String, [ReadOnly] , [Туре] PivotCaches PivotCaches Post PrintOut PrintPreview Protect [DestName] [From], [То], [Copies], [Preview], [ActivePrinter], [PrintToFile], [Collate], [PrToFileName] [EnaЬleChanges] [ Password] , [Structure], [Windows] Описание • Открывает новое окно с теку­ щей кни гой Открывает связь Name и под­ держивающие документы. Для открытия документа в режиме ''то ль ко чтения" параметр ReadOnly устанавливается в значение True. Для установки пара метра Туре используются ко нстанты XlLinkinfoType (этот параметр позволяет вы­ брать тип возвращаемой связи) Возвращает кол ле кцию кэшей сводной табл ицы Публикует книгу в общей пап ке на сервере Microsoft Exchaпge Печатает книгу. Принтер, ко ли ­ чество копий, пор ядок и необ­ ходимость режима пр едвари­ тельного просмотра определя­ ются с помощью параметров. Кроме этого, листы можно пе­ чатать в файл. Для этого ис­ пользуются пара метры PrintToFile и PrToFileName . Параметры From и то могут использовать­ ся для определения печата емо­ го диапазона Выводит текущую книгу в ре­ жиме предварительного про­ смотра. Для отключения кнопок Поля и Параметры страницы параметр EnaЬleChanges ус­ танавливается в значение False. При этом пользователь не сможет модифицировать па­ раметры страницы в режиме предварительного просмотра Защищает книгу от модифика­ ции пользователем. При этом параметру Password можно присвоить пароль для защиты книги. Для защиты относитель­ ного расположения листов па­ раметр Structure устанавли­ вается в значение Ture . Для защиты окон книги параметр Windows устанавливается в значение True
Имя Protect- Sharing PurgeChange- HistoryNow Recheck- SmartTags RefreshAll RejectAll- Changes ReloadAs RemoveUser ReplyAll ReplyWith- Changes Объектная модель Excel 2003 921 Тип возвращае- Параметры мого значения [Filename], [Password], [WriteResPassword], [ReadOnly- Recommended], [CreateBackup], [SharingPassword] Days As Long, [SharingPassword] [When], [Who], [Where] Encoding As MsoEn- coding Index As Long [ShowMessage] Описание Защищает и сохраняет книгу для совместного использова­ ния . Имя сохраняемого файла передается в качестве значения параметра Filename. Необяза­ тельный пароль можно указать в качестве значения парамет­ ров Password, Wri teRes- Password и SharingPassword . Для выво­ да сообщения при каждом от­ крытии книги параметр ReadOnlyRecommended уста­ навливается в значение True. Для создания резервной копии сохраняемого файла параметр Crea teBackup устанавливает­ ся в значение True Удаляет записи из журнала из­ менений совместно используе­ мой книги. Параметр Days оп­ ределяет давность удаляемых записей (в днях). При этом мо ­ жет потребоваться предостав­ ление значения параметра SharingPas.sword Выполняет проверку смарт­ тегов. Все нераспознанные ра­ нее данные распознаются в ре­ зультате этой проверки Обновляет все данные из внешних источников данных Отменяет все изменения в со­ вместно используемой книге Повторно открывает книгу из WеЬ-страницы . Кодировка страницы указывается в каче­ стве значения параметра En- coding Отключает пользователя (пользователD выбирается с помощью параметра Index) от совместно используемой книги Отвечает всем получателям совместно используемой книги. Используется только на плат­ форме Maciпtosh Отправляет по электронной поч­ те уведомление о завершении рецензирования автору книги
922 Приложение А Имя ResetColors Route RunAuto- Macros Save SaveAs SaveCopyAs SendFor- Review Тип возвращае- Параметры мого значения Which As XlRun - AutoMacro Filename, FileFor·- mat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, Ac- cessMode As XlSaveAsAccessMode, [ConflictResolution], [AddToMru], [TextCodepage], [TextVisualLayout] , [Local] [Filename] [Recipients], [Subject], [ShowMessage], [IncludeAttachment] Описание Сбрасывает цветовую палитру книги Передает книгу с использова­ нием бланка маршрута Запускает автоматический мак­ рос, на который указывает па­ раметр Which Сохраняет книгу Сохраняет книгу в файле, имя которого указывается в качестве значения параметра Filename. Тип сохраняемого файла определяется параметром FileFormat. Файл может быть сохранен с паро­ лем. Для этого указываются значения параметров Pass- word и Wri teResPassword. Для вывода рекомендации о доступе только для чтения при каждом открытии файла параметр ReadOnlyRecom- mended устанавливается в значение True. Для создания резервной копии сохраняемого файла параметр create- Backup устанавливается в значение True . Параметр Ac- cessMode позволяет указать тип доступа к книге (например, xlShared, xlExclusi ve}. Для выбора метода разрешения конфликтов можно воспользоваться параметром ConflictResolution.Для добавления книги в список недавно открывавшихся файлов параметр AddToMru устанавли­ вается в значение True Сохраняет копию книги в фай­ ле, имя которого указывается в качестве значения параметра Filename Отправляет книгу на адрес электронной почты указанных получателей для рецензирования
Имя SendМail SendMai l er SetLinkOn - Da ta SetPassword- Encryption- Options Unprotect Unprotect- Sharing UpdateFrom - File UpdateLink WebPage - Previ ew Объектная модель Excel 2003 923 Тип возвращае- Параметры мого значения Recipients, [Subject], [ ReturnReceipt] FileFormat, Prior- ity As XlPriority Name As String, [Procedure] Описание Отправляет книгу с помощью принятой по умолчанию системы электронной почты. Пол учател ь или получатели, а также тема сообщения с книгой, могут указываться в виде значений парамет ров. Для получения подтверждения о доставке параметр Return- Receipt устаl;iавливается в значение True Используется тол ько на платформе Macintosh Запускает процедуру из параметра Procedure при каждом обновлении связи DDE или OLE из параметра Name [ PasswordEncryption Устанавливает параметры Provider J , шифрования книги [ PasswordEncryption · с использованием пароля Algori thmJ , [PasswordEncryption KeyLength], [PasswordEncryption FilePrope:i;-ties] [Password] [SharingPassword] [Name], [Туре] Снимает с книги защиту с помощью пароля Снимает с книги защиту от совместного доступа и сохраняет книгу Повторно загружает текущую книгу из файла, если файл имеет более позднюю дату изменения, чем открытая книга Обновляет связь, указанную с помощью параметра Name. Параметр Туре и константы XlLinkinfoType позволяют выбрать тип возвращаемой связи Включает режим предварительного просмотра книги перед преобразованием в WеЬ-страницу
924 Приложение А События объекта Workbook Имя Activate Addininstall AddinUninstall Параметры Описание Возникает при активизации книги Возникает при открытии книги в виде надстройки Возникает при удалении книги, открытой в качестве надстройки BeforeClose cancel As Boolean Возникает перед закрытием книги. Для отмены закрытия параметр cancel устанавливается в значение True BeforePrint Cancel As Boolean Возникает перед печатью книги . Для отмены печати параметр Cancel устанавливается BeforeSave Deactivate NewSheet Open PivotTaЬle­ Close- Conn ec tion SaveAsUI As Boo - lean, Cancel As Boolean Sh As Object ByVal Target As PivotTaЬl e PivotTaЬle- ByVal T arge t As OpenConnec t ion Piv~ tTaЬle SheetActivate Sheet Before- DouЬleCli ck SheetBe f ore- RightCl ick Sh As Object Sh As Object, Tar- get As Range , Can- ce l As Boolean Sh As Object, Tar- get As Range, Can- cel As Boolean Shee tCalcul ate Sh As Obj ect в значение Tr ue Возникает перед сохранением книги. Для отмены сохранения параметр cancel устанавливается в значение тrue . Для · вывода диалогового окна Сохранить как (Save As) параметр SaveAsUI устанавливается в значение T r ue Возникает при потере фокуса Возникает при создании нового листа . Новый лист передается в процедуру обработки события в качестве значения параметР.а Sh Возникает при открытии книги Возникает пр и закрытии подключения отчета сводной таблицы к источнику данных. Параметр Target содержит выделенную сводную таблицу Возникает при открытии подключения отчета сводной таблицы к источнику данных. Параметр тarget содержит выделенную сводную таблицу Возникает при активизации листа в пределах книги. Лист передается в процедуру обработки события в качестве значения параметра Sh Возникает перед двойным щелчком на листе . Лист и потенциальная точка ДВОЙНОГО щелчка перед а ются Е3 процедуру обработки события в качестве значений параметров. Для отмены двойного щелчка параметр Canc el устанавлива­ ется в значение True Возникает перед щелчком право й кнопкой мыши на листе . Лист и потенциальная точка щелчком правой кнопкой мыши передаются в процедуру обработки события в качестве значений парам етров . Для отмены щелчка правой кнопкой мыши параметр Cancel устанавливается в значение T r ue Возникает при пересчете листа. Пересчитываемый лист передается в процедуру обработки события
Имя SheetChange Sheet- Deactivate SheetFollow- Hyperlink SheetPivot - TableUpdate Объектная модель Excel 2003 925 Параметры Описание Sh As Obj ec.t, Tar- Возникает при изменении содержимого ячейки на get As Range любом листе в пределах книги, например при вводе новых данных, очистке содержимого ячейки и удалении строк или столбцов . Не возникает при добавлении строк или столбцов Sh As Object Возникает при потере листом фокуса. Лист передается в процедуру обработки события в качестве значения параметра Sh As Obj ее t, Tar- Возникает при щелчке пользователя на get As Hyperlink гиперссылке в пределах листа. В процедуру обработки события передается лист и ги пер­ ссылка, на которой щелкнул пользователь ByVal Sh As Ob- j ec t, Target As PivotTaЬle Возникает при обновлении листа с отчетом сводной таблицы SheetSelection- Sh As Obj ect, таr,- Возникает при выделении другой ячейки на лиc­ Change get As Range те. В процедуру обработки события передается WindowActivate Wn As Window Window- Wn As Window Deac tivat e WindowResize Wn As Window новый диапазон и лист, на котором произошло событие · Возникает при активизации окна книги (окно размещается на переднем плане поверх остальных книг). Книга и окно передаются в процедуру обработки события Возникает при потере фокуса окном. Книга и окно передаются в процедуру обработки события Возникает при изменении размера окна книги . - Книга и окно передаются в процедуру обработки события Пример: объект Workbook и коллекция Workbooks Дополнительная информация об использовании этих объектов приводилась в главе 4. Объект Worksheet и коллекция Worksheets В коллекции Worksheets хранятся листы из книги. Объект WorkЬook всегда является родительским для коллекции Worksheets, в которой хранятся только листы электронных таблиц . Для доступа к объектам Worksheet в коллекции Worksheets можно воспользоваться свойством Item. В качестве параметра свойства It,em используется имя листа или номер, описывающий положение листа в к~ллекции (нумерация выполняется слева направо) . Объект Worksheet предоставляет доступ ко всем атрибутам листа в Excel. Это касается как форматирования листа, так и других его свойств . Кроме того, oбъeктWork ­ sheet предоставляет события, которые могут обрабатываться программно. Кроме типичных атрибутов, коллекция Wo rksheet предоставляет дополнительные свойства и методы, показанные в следующей таблице.
926 Приложение А Свойства и методы коллекции Worksheets Имя Тип возвращае- Описание мого значения Count Long HPageBreaks HPAgeBreaks VPageBreaks VPageBreaks VisiЫe Variant Add Сору Delete Fi l lAcross- Sheets Move PrintPreview PrintOut Select ' Только чтение. Возвращает количество листов в коллекции Только чтение. Возвращает коллекцию горизонтальных разрывов страницы, связанных с коллекцией Worksheets Только чтение . Возвращает коллекцию вертикальных разрывов страницы, связанных с коллекцией worksheets Устанавливает/возвращает видимость листов из коллекции. Если установить это свойство в значение xlveryHidden, пользователь не сможет сделать видимыми листы из коллекции Метод. Параметры: [Before], [After], [Count], [Туре]. Добавляет лист в коллекцию. Положение листа в коллекции определяется с помощью параметров. Можно указать лист перед новым листом (параметр Before) или лист после нового листа (параметр After) . Параметр Count позволяет указать количество создаваемых листов Метод. Параметры: [Before], [After]. Добавляет в коллекцию копию активного листа . Положение добавляемой копии определяется параметрами Метод . Удаляет все листы из коллекции Метод. Параметры: Range As Range, Туре As XlFill- Wi th. Копирует диапазон из параметра Range во все листы из коллекции. Параметр Туре позволяет определить копируемую часть диапазона (например, xlFillWithContents,xlFillWithFormulas) Метод. Параметры: [Before], [After]. Перемещает текущий лист в позицию, указанную с помощью параметров Метод . Параметры: [ EnaЬleChanges J . Выводит текущий лист в режиме предварительного просмотра. Для отключеrjия кнопок Поля и Параметры страницы параметр EnaЬleChanges устанавливается в значение True. При этом пользователь не сможет изменить параметры страницы Метод. Параметры: [FromJ, [То], [CopiesJ, [Preview], [ActivePrinter], [PrintToFileJ, [Collate], [ PrToFileName J. Печатает лиСты из коллекции. Принтер, количество копий, порядок и необходимость предварительного просмотра опредедяются с помощью параметров. Кроме этого, листы можно печатать в файл. Для этого нужно воспользоваться параметрами PrintToFile и PrToFileName. Параметры From и· то позволяют определить диапазон печатаемых страниц Метод. Параметры: [ReplaceJ. Выделяет текущий лист в коллекции
Объектная модель Excel 2003 927 Общие свойства объекта Worksheet Определения свойств Application, Creator и Parent л:риводились в начале приложения. Свойства объекта Worksheet Имя AutoFilter Тип возвращае­ мого значения AutoFilter AutoFilterMode Boolean Cells Range Circular- Range Reference CodeName String Columns Range Comments Comments Описание Только чтение. Возвращает объект AutoFil ter, ес­ ли включена фильтрация Устанавливает/возвращает вывод списка авто- фильтра на листе Только чтение. Возвращает ячейки текущего листа Только чтение. Возвращает диапазон ячеек, содер­ жащий первую циклическую ссылку в пределах листа Только чтение .. Возвращает имя листа, установленное на этапе проектирования в редакторе VBE Только чтение. Возвращает диапазон столбцов в те­ кущем листе Только чтение. Возвращает коллекцию комментари­ ев на листе Consolidation- XlConsolidation- Только чтение. Возвращает тип консолидации, кoтo- Function Function рая используется на листе (например, xlSum, xlMax, xlAverage) Consolidation- Variant Options Consolidation- Variant Sources Custom- Custom- Properties Properties DisplayPage- Boolean Breaks DisplayRight- Boolean ToLeft EnaЬleAuto- Boolean Filter ЕnаЫе- Boolean Calculation ЕnаЫе- Boolean Outlining Только чтение . Возвращает одномерный массив, со­ держащий три бинарных элемента. Первый элемент описывает необходимость использования меток . в верхней строке. Второй - необходимость исполь­ зования меток в левом столбце. Третий _: _ необхо­ димость создания ссылок на исходные данные Только чтение. Возвращает массив строк, описы­ вающий исход'ные листы для текущей консолидации Только чтение. Возвращает информацию идентифи­ катора, связанную с листом Устанавливает/возвращает необходимость отобра­ жения разрывов страницы Устанавливает/возвращает необходимость отобра­ жения содержимого листа справа налево. Использу­ ется только в языках, применяющих запись справа налево Устанавливает/возвращает необходимость вывода списков автофилыра при защите пользовательского интерфейса листа Устанавливает/возвращает возможность автомати­ ческого пересчета листа при необходимости Устанавливает/возвращает возможность использо­ . вания символов структуры при защите пользова­ тельского интерфейса листа
928 Приложение А Имя EnaЬlePivot­ TaЬle ЕnаЫе- Selection FilterMode HPageBreaks Hyperlinks Index ListObjects MailEnvelope Name Names Next Outline PageSetup Previous Protect - Contents Тип возвращае­ мого значения Boolean XlEnaЫe- Selection Boolean HPageBreaks Hyperlinks Long Range MsoEnvelope String Names Outline PageSetup Boolean Protect - Boolean DrawingObjects Protection Protection ProtectionMode Boolean Protect- Scenarios QueryTaЬles Boolean QueryTaЬles Описание Устанавливает/возвращает возможность отображе­ ния элеметнов управления сводной таблицы и свя­ занных с ними операций при защите пользовател_ь­ ского интерфейса листа Устанавливает/возвращает возможность выделения объектов при защите листа (например, xlNoSelection, xlNoRestrictions) Только чтение . Возвращает состояние режима фильтрации листа Только чтение . Возвращает коллекцию с горизон­ тальными разрывами страницы на листе Только чтение . Возвращает коллекцию гиперссылок на листе Только чтение. Возвращает положение текущего листа в родительской коллекции Возвращает объект Range Устанавливает/возвращает заголовок сообщения электронной почты для документа Устанавливает/возвращает имя листа Только чтение . Возвращает коллекцию именованных диапазонов на листе Только чтение. Возвращает следующий .гiист в книге (слева направо) в виде · объекта Только чтение . Возвращает объект, позволяющи й управлять структурой листа Только чтение. Возвращает объект, позволяющий управлять параметрами страницы для листа Только чтение. Возвращает предыдущий лист в кни­ ге (справа налево) в виде объекта Только чтение . Возвращает состояние защиты листа и всего его содержимого Только чтение. Возвращает возможность модифика­ ции фигур на листе (для модификации свойство ProtectDrawingObjects устанавливается в зна­ чение False) Только чтение. Возвращает параметры защиты листа ТQлько чтение . Возвращает состояние защиты поль­ зовательского интерфейса. Даже если на пользова­ тельский интерфейс листа установлена защита, ос­ тается возможность доступа к связанному с листом коду VBA Только чтение. Возвращает состояние защиты сце­ нариев на листе Только чтение. Возвращает коллекцию таблиц за­ проса, связанных с листом
Имя Range Rows Scripts ScrollArea Shapes SmartTags StandardHeight StandardWidth ТаЬ TransitionExp- Eva l Transition- FormEntry Туре UsedRange Vi siЫe VPageBreaks Тип возвращае- мого значения Range Range Scripts String Shapes SmartTags DouЫe DouЫe ТаЬ Boolean Boolean XlSheetType Rang e XlSh eet- Visibility VPageBreaks Объектная модель Excel 2003 929 Опи,сание Только чтение. Параметры: Celll, [Се112 J . Воз­ вращает объект Range, на который указывают пара­ метры Celll и Се112 Только чтение . Возвращает объект Range, содержа­ щий строки текущего листа Только чтение . Возвращает коллекцию связанных с листом сценариев VBScгipt (обычно эти сценарии используются в WеЬ-документах) Устанавливает строку ссылки в формате А1, описы ­ вающую прокручиваемый диапазон листа . Выделе­ ние ячеек за пределами этого диапазона невозможно Только чтение. Возвращает все геометрические фи­ гуры в пределах листа Только чтение . Возвращает идентификатор указан­ ной ячейки Только чтение. Возвращает принятую по умолчанию высоту строк на листе (в пунктах) · Только чтение . Возв~:>ащает принятую по умолчанию ширину столбцов на листе (в пунктах) Только чтение. Возвращает объект таЬ для выде­ ленной диаграммы или листа Устанавливает/возвращает необходимость оценки выражений на листе с помощью правил Lotus 1-2-3 Устанавливает/возвращает возможность ввода фор­ мул с помощью правил Lotus 1-2 -3 Только чтение. Возвращает тип листа (например, xlWorksheet,xlExcel4MacroSheet, x lEx cel4IntlMacroSheet} Только чтение. Возвращает _ используемый диапазон листа Устанавливает/возвращает видимость текущего лис­ та . Установка свойства в значение xlVeryHidden п риведет к невозможности включения видимости че­ рез пользовательский интерфейс Только чтение . Возвращает коллекцию всех верти­ кальных разрывов страниц1?1 на листе
930 Приложение А Методы листа Worksheet Имя Activate Calculate Chart- Obj ects Check- Spelling Circle- Invalid Clear- Arrows Clear- Circles Сору Delete Evaluate Move OLE- Object s Paste Paste- Special Тип возвра- Параметры щаемого значения Variant [Index] [Custom- Dictionary] , [Ignore- Uppercase] , [Always- Suggest], [ SpellLang] [Before], [After] Name [Before], [After] · [Index] [Destina - tion], [Link] [Format], [Link], [DisplayAs- Icon], [IconFile- Name], [Iconindex], [IconLabel], [NoHTML - Format ting] Описание Активизирует лист Вычисляет все формулы на листе Возвращает объект диаграммы (chartObj ect) или коллекцию объектов диаграммы (ChartObj ects) Проверяет орфографию текста на листе . Пapaмeтp.customDictionary позволяет выбрать собственный словарь. Параметр Ig- noreUppercase позволяет игнорировать слова, состоящие только из прописных букв . Параметр AlwaysSuggest заставляет Excel предлагать слова для замены Выделяет некорректные записи на листе Удаляет все стрелки зависимостей на листе Удаляет все выделения вокруг некорректных записей на листе Добавляет новую копию листа. Положение новой копии определяется параметрами вe­ f ore и After Удаляет лист рценивает выражение из параметра Name так же, как и при вводе выражения в ячейку листа Перемещает лист в положение, описанное параметрами Возвращает один объект OLE (OLEObject) Иf1И коллекцию объектов OLE (OLEObj ects), связанных с листом Вставляет в f1ИСТ содержимое буфера обмена. Диапазон назначения можно определить с помощью параметра Destination. Для создания связи с источником вставляемых данных параметр Link устанавливается в значение True. Может использоваться один из параметров Вставляет содержимое буфера обмена в текущий лист. Формат данных в буфере обмена определяется с помощью параметра Format. Для создания связи с исходными данными параметр Link устанавливается в значение True. Для отображения вставляемых данных в виде пиктограммы параметр Display- Asicon устанавливается в значение True. При этом параметры IconFileName, Iconindex и IconLabel позволяют определить пиктограмму и метку пиктограммы. Диапазон назначения уже должен присутствовать на листе
Имя Pivot- TaЬles Pi vot- TaЬle ­ Wizard Pri ntOut Тип возвра- Параметры щаемого значения Pivot- TaЬle [ Index] [SourceТype], [SourceData], [TaЬle­ Destination], [TaЬleName], [RowGrand) , [Column- Grand], [SaveData), [HasAuto- Forrnat), [AutoPage], [Reserved) , [Background- Query), [Optirnize- Cache], [PageField- OrQ.er], [PageField- WrapCount) , [ReadData) , [Connection) [Frorn), [То], [Copies], [Preview], [Active- Pr inter] , [Pr intTo- File ], [Co llate], [PrToFile- Narne] Объектная модель Excel 2003 931 Описание Возвращает один отчет сводной таблицы (PivotтaЫe) или коллекцию отчетов сводной таблицы (PivotTaЬles), связанных с листом Создает отчет сводной таблицы. Параметр sourceТype определяет тип используемых ис­ ходных данных, которые передаются в качестве значения параметра sourceData. Для установки значения параметра sourceТype используются константы XlPivotTaЬleSourceТype. В качест­ ве значения параметра TaЬleDestination ука­ зывается диапазон родительского листа, в кото­ ром будет расположен отчет сводной таблицы. П араметр таЫеNаmе содержит имя нового отче­ та.· Для вывода итогов для строк и столбцов пара­ метры RowGrand и ColumnGrand устанавливают­ ся в значение True. Для автоматического форма­ тирования отчета при обновлении или модифика­ ции параметр HasAutoForrna t устанавливается в значение True . Для автоматического создания полей страниц для консолидации необходимо воспользоваться параметром AutoPage. Для асинхронного опроса источников данных параметр BackgroundQuery устанавливается в значение True. Для оптимизации кэша при создании пара­ метр Optirni z ecache устанавливается в значе­ ние Tr ue. Параметр Page FieldOrd e r и констан­ ты XlOrder позволяют определить способ добав­ ления новых полей страниц. Параметр PageFieldWrapCount определяет количество полей страниц в каждом столбце и строке. Для ко­ пирования данных из внешнего источника в кэш сводной таблицы параметр ReadDa ta устанавли­ вается в значение True. И наконец, необходимо воспользоваться параметром Connection для определения строки подключения ODBC для кэша сводной таблицы Печатает лист . Принтер, количество копий, по­ рядок и необходимость предварительного про­ смотра задаютея с помощью параметров . Кро­ ме этого, лист можно напечатать в файл . Для этого используются параметрь1 PrintToFile и PrToFi,leNarne. Параметры Frorn и То опре­ деляют диапазон печатаемы х страниц
932 Приложение А Имя · Тип возвра- Параметры щаемого Print- Preview Protect ResetAll- Pag·eвre:aks :· SaveAs значения [EnaЫe ­ Changes] [ Passwo rd] , [Drawi ng- Object s ], [Contents], [Scenario s] , [Userinter- faceOnly] , [AllowFormat - tingCells] , ·[AllowF o rmat- tingC o lшnns] , [AllowFo rmat- tingRows] , [Al lowinser- tingColшnns ], [Allowinse- rtingRows] , [Allowinser- tingH}'per- links], [AllowDele- tingColшnns] , [AllowDele- tingRows ], [AllowSor - ting J, [AllowFilte - ring] , [AllowUsin g- PivotTaЬles J F ilename As String , [FileFormat], [Password] , [WriteRes- Password], [ReadOnly- Recommended] , [Create- Backup ] , [Ad dToMru ] , [T ext Code- page] , [TextVisual - Layout ] , [Local] Описание Выводит л и ст в режиме предвар ительного про­ смотра . Для отключения кно пок Поля и Парамет­ ры страницы параметр EnaЬl eChang es уста ­ навливается в значение Fa l se. П ри этом изме­ нение пара метров страницы через пользова­ тельски й и нтерфейс невозможно Защищает лист от внесения изменений. При этом можно у казать чувств итель н ый к регистру пароль. Кроме этого , можно выбрать защиту только геометрических фигур (Drawi ngObj e c ts) , все го содержимого (Con tents) или защиту только пользователь­ ского интерфейса (us erin t erfac eOnly ) Сбрасыв ает все разрывы стр а ни ц на листе Сохра няет лист в файле, и мя которого передается в качестве значения параметра F ile name. Тип сохраняемого файла определяется параметром F i l e F ormat. При необходи мости сохраняемый файл защ и щается паролем . Для этого можно вос­ пользов аться парам етрами Wri teResPassword и Password. Для в ывода рекоме ндаци.и о доступе толь ко дл я чтения при каждом открытии файла параметр ReadOnlyRecommended устанавли ва­ ется в значение Tr ue. Для создания резервной копии сохраняемого файла параметр Cr e a teBackup устанавливается в значение Tr u e . Для добавле ния листа в список недавно открытых файлов параметр AddToMru устанавливается в значение True
Имя Типвозвра- щаемого значения Scenarios Select SetBack- ground- Picture ShowAll- Data ShowData- Forrn Unprotect XrnlData-;- Range Query XrnlMap- Rang e Query Параметры [Index] [Replace] Filenarne As String [Password] [XPath ], [Selec tion- Narnespaces J , [Мар ] [ XPa th], [Selection- Narnespaces J , [Мар] Объектная модель Excel 2003 933 Описание Возвращает один сценарий (scenario) или коллекцию сценариев (scenarios) для листа Выделяет лист Устанавливает фоновый рисунок листа. Имя файла с рисунком указывается в качестве зна­ чения параметра Filenarne Отображает все отфильтрованные данные Выводит форму данных, которая является ча­ стью листа Снимает защиту с листа. Если лист был защи­ щен паролем, пароль передается в качестве значения параметра Представляет ячейки, отображающиеся на оп­ ределенный запрос XPath Представляет ячейки, отображающиеся на оп­ ределеннь1й запрос XPath События объекта Worksheet Имя Acti vate Before- DouЬleClick Before- RightClick Calculate Change Deac.tivate Follow- Hyperlink PivotTaЬle­ Update Тип параметры Описание 'rarget As Range, Cancel As Boolean Cancel As Boo l ean тarget As Range Target As Hy- perl ink ByVal T arget As PivotTaЬle Возникает при активизации листа Возникает перед двойным щелчком на листе. В качестве значения параметра тarget в пр.оцедуру обработки собы­ тия передается ячейка, ближайшая к точке двойного щелчка. Для отмены события двойного щелчка необходи­ мо установить параметр Cancel в значение True Возникает перед щелчком правой кнопкой мыши на листе . В качестве з начения параметра Target в процедуру об­ работки события передается ячейка, бли,жайшая к точке щелчка правой кнопкой мыши. Для отмены щелчка правой кнопкой мыши необходим о установить параметр cancel в значение True Возникает после пересчета листа Возникает при изменении значений в ячейках листа . Из­ мененный диапазон передается в процедуру обработки события в виде значения параметра Target Возникает при деактивизации листа Возникает при щелчке на гиперссылке в пределах листа. Гиперссылка передается в процедуру обработ ки события в качестве значения параметра тarget Возникает при обновлении отчета сводной таблицы
934 Приложение А Имя Тип параметры Описание s .election- Change Target As. Range Возникает при изменении выделения на листе. Диапазон нового выделения передается в процедуру обработки со­ бытия в виде значения параметра Target Пример: объект Worksheet и коллекция Worksheets Дополнительная информация об использовании объекта Worksheet приводится в главе 4. Объект WorksheetFunction В объекте ·warksheetFunction хранятся все функции листа Excel. Этот объект предоставляет доступ из кода VВА к функциям листа Excel. Родительским для объекта WorksheetFunction является oбъeкт Application. Общие свойства объекта WorksheetFunction Определения свойств Application, Creator и Parent привод ились в начале приложения . Методы объекта WorksheetFunction Имя Acos Ac osh And Asc Asin Asinh Тип возвращае- Параметры мого значения Описание DouЫe DouЫ e Boolean S tring DouЫ e DouЫe Argl As DouЫe Возвращает арккосинус значения ар­ гумента Argl. Значение аргумента Argl должно находиться в пределах от-1до1 Argl As DouЫe Возвращает обратный гиперболиче­ ский косинус значения аргумента Argl. Значение аргумента Argl должно быть больше или равно 1 Argl, [Arg2] , .. . [Arg30] Возвращает значение T rue, если все аргументы (от Ar g l до ArgЗO) равны Tr ue Argl As Stri ng Возвращает символ половинной длины, который соответствует сим­ волу полной длины в Строке Argl . Эта функция отличается от функции VBA Asc, которая возвращает код ASCll для первого символа в строке Argl As DouЫe Возвращает арксинус значения аргу­ мента Argl . Значение аргумента Argl должно находиться в пределах от - 1до1 Argl As DouЫe Возвращает обратный гиперболиче­ ский синус значения аргумента Argl
Имя Atan2 Atanh AveDev Average BahtText BetaDist Betainv BinomDist Объектная модель Excel 2003 935 Тип возвращае- Параметры мого значения DouЫe DouЫe DouЫe DouЫe String DouЫe DouЫe DouЫe Argl As DouЬle, Arg2 As DouЫe Argl As DouЫe Argl, [Arg2], ... [Arg30] Argl, [Arg2], ... [Arg30] Argl As DouЫe Argl As DouЫe, Arg2 As DouЬle, ArgЗ As DouЫe, [Arg4], [ArgS] Argl As DouЬle, Arg2 As DouЬle, ArgЗ As DouЫe, [Arg4] , [ArgS] · Argl As DouЬle, . l;\rg2 As DouЬle, ArgЗ As DouЬle, Arg4 As Boolean Описание Возвращает арктангенс координат Х и У, передаваемых с помощью аргу­ ментов Argl и Arg2 Возвращает обратный гиперболиче­ ский арктангенс значения аргумента Argl . Значение аргумента Argl долж­ но находиться в пределах от -1до1 Возвращает среднее абсолютных от­ клонений для числовы х параметров ОТ Argl ДО ArgЗО Возвращает среднее значение чисел из параметров от Argl до ArgЗ О Возвращает число на тайском языке с суффиксом "Baht." . Чиспо указывается в качестве значения параметра Argl Возвращает интегральную функцию бета-распределения. В аргументе Argl содержится оцениваемое число. В аргументе Arg2 - значение альфа­ параметра распределения . В аргумен­ те ArgЗ - значение бета-параметра распределения. В аргументах Arg4 и ArgS могут передаваться верняя и нижняя границы интервала для ар­ гумента Argl Возвращает обратную интегральную функцию бета-распределения. Аргу­ мент Argl содержит вероятность распределения . Аргумент Arg2 - значение альфа-параметра распре­ деления. Аргумент ArgЗ - значение бета-параметра распределения. В аргументах Arg4 и Arg5 могут пе­ редаваться верняя и нижняя границы интервала для оцениваемого числа Возвращает отдельное значение би­ номиального распределения вероят­ ности. В аргументе Argl передается количество успешных испытаний. В аргументе Arg2 содержится общее количество испытаний. В аргументе ArgЗ содержится вероятность ус­ пешности отдельного испытания. Ар­ гумент Arg4 определяет необходи­ мость возврата кумулятивной функ­ ции распределения (True) или мас­ совой функции вероятности (False)
936 Приложение А Имя Тип возвращае- Параметры Описание мого значения Ceiling DouЫe Argl As DouЬle, Возвращает ближайшее к значению Arg2 As DouЫe аргумента Argl число, кратное зна- чению аргумента Arg2 с округлением вверх ChiDist !5оuЫе Argl As DouЫe, Возвращает одностороннюю вероят- Arg2 As DouЫe ность распределения Хи-квадрат . В аргументе Argl содержится оце- ниваемое число. В аргументе Arg2 - количество степеней свобо- ды Chiinv DouЫe Argl As DouЬle, Возвращает значение, обратное од- Arg2 As DouЫe носторонней вероятности распреде- ления Хи-квадрат. В аргументе Argl содержится вероятность. В аргументе Arg2 - количество степеней свободы ChiTest DouЫe Argl, Arg2 Возвращает тест на независимость .для распределения Хи-квадрат. В ар- гументе Argl передается диапазон с данными , который будет сравни- ват ься с ожидаемыми значениями . В аргументе Arg2 передается диапазон с ожидаемыми значениями Choose Variant Argl, Arg2, Возвращает одно из значений аргу- [ArgЗ], ментов (с Arg2 по ArgЗ о). Номер ар- [Arg30] гумента указывается в качестве зна- чения аргумента Arg l . На п ример, если аргумент Argl равен 2, то воз- вращается значение аргумента ArgЗ Clean String Argl As String Возвращает строку из аргумента Argl без непечатаемых символов ComЬin DouЫe Argl As DouЬle, Возвращает общее количество ком- Arg2 As DouЫe бинаций группы элементов. Размер группы указывается в качестве зна- чения аргумента Arg2. Общее коли- чество элементов указывается в ка- честве значения аргумента Argl Confidence DouЫe Argl As DouЬle, Возвращает диапазон по одну сторону Arg2 As DouЫe, среднего значения выборки для задан- ArgЗ As DouЫe наго среднего значения всего множе- ства . Аргумент Argl содержит значе- ние параметра альфа для определения уровня уверенности. Аргумент Arg2 содержит стандартное отклонение для диапазона данных. Аргумент ArgЗ со- держит размер выборки Correl. DouЫe Argl, Arg2 Возвращает коэфициент корреляции для массивов из аргументов Argl и Arg2. В качестве параметров метода можно указывать диапазоны ячеек
Имя Cosh Count CountA CountBlank Countif Covar CritBinom DAverage Days360 Db Объектная модель Excel 2003 937 Тип возвращае- Параметры мого значения DouЫe DouЫe ' DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe Argl As DouЫe Argl, [Arg2] , ,,, [Arg30] Argl, [Arg2] , ,,, [ArgЗO] ' Argl As Range Argl As Range, Arg2 Argl, Arg2 Argl . As DouЬle, Arg2 As DouЬle, ArgЗ As DouЫe Argl As Range, Arg2, ArgЗ Argl, Arg2, [ArgЗ] Argl As DouЬle, Arg2 As DouЫe, ArgЗ As DouЬle, Arg4 As DouЬle, [ArgS] Описание Возвращает гиперболический коси­ нус значения Argl Возвращает количество числовых значений среди аргументов , Аргу­ ментам можно присваивать как зна­ чения, так и ссылки на диапазоны Возвращает количество непустых значений аргументов, Аргументам можно присваивать как значения, так и ссылки на диапазоны Возвращает количество пустых ячеек в диапазоне из аргумента Argl Подсчитывает количество ячеек в диапазоне Argl, удовлетворяющих критерий из аргумента Arg2 Возвращает ковариацию двух масси­ вов или диапазонов из аргументов Argl и Arg2 Возвращает наименьшее значение, для которого интегральное биноми­ альное распределение больше или равно заданному критерию , Аргумент Argl содержит количество испытаний Бернулли, Arg2 - вероятность успе­ ха в каждом испытании, Аргумент ArgЗ содержит значение критерия Возвращает среднее значение столбца, указанного с помощью ар­ гумента Arg2 в диапазоне ячеек из диапазона Argl, Аргумент ArgЗ со­ держит критерий для выбора строк при подсчете среднего значения Возвращает количество дней между датами в аргументах Argl и Arg2 (Argl -Arg2), Если аргумент ArgЗ ус­ тановлен в значение True, использу­ ется европейский метод подсчета, Ес­ ли аргумент ArgЗ установлен в значе­ ние False или отсутствует, использу­ ется американский метод подсчета . Возвращает амортизацию имущества за заданный период, используя метод постоянного учета амортизации, Ар­ гумент Argl содержит исходную стоимость амортизации. Аргумент Arg2 содержит финальную стоимость списания, Аргумент ArgЗ содержит количество периодов амортизации, Аргумент Arg4 указывает конкретный период из аргумента ArgЗ, Аргумент Arg5 содержит количество месяцев в первый год амортизации
938 Приложение А Имя Dbcs · DCount DCountA Ddb Degrees DevSq DGet DMax Тип возвращае- Параметры мого значения String DouЫe DouЫe DouЫe DouЫe Variant DouЫe Argl As String Argl As Range, Arg2, ArgЗ Argl As Range, Arg2, ArgЗ Argl As DouЬle, Arg2 As DouЫe, ArgЗ As DouЬle, Arg4 As DouЫe, [Arg5] Argl As DouЫe А rф, [Arg2], ... [ArgЗ О] Argl As Range, Arg2, ArgЗ Argl As Range, Arg2, ArgЗ Описание Возвращает строку двухбайтовых символов для заданной строки ASCll. Является противоположностью функции Asc Возвращает количество ячеек, соот­ ветствующих критерию из аргумента ArgЗ. Аргумент Argl содержит диа­ пазон строк и столбцов, а аргумент A~g2 - имя поля или подсчитывае­ мое количество Возвращает количество непустых ячеек, соответствующих критерию из аргумента ArgЗ. Аргумент Argl со­ держит диапазон строк и столбцов, а аргумент Arg2 - имя поля или подсчитываемое количество Возвращает ве·личину амортизации имущества для указанного периода при использовании метода двукрат­ ного учета амортизации. Аргумент Argl содержит исходную стоимость амортизации. Аргумент Arg2 содер­ жит стоимость списания (стоимость на момент завершения амортиза­ ции). Аргумент ArgЗ содержит коли­ чество периодов амортизации. Аргу­ мент Arg4 указывает на определен­ ный период из аргумента ArgЗ. Ар­ гумент Arg5 может содержать скорость амортизации Выполняет преобразование радиа­ нов из аргумента Argl в градусы Возвращает сумму квадратов откло­ нений для аргументов от Argl до ArgЗO Возвращает значение ячейки, соот­ ветствующее критерию из аргумента ArgЗ. Аргумент Argl содержит диа­ пазон подсчитываемых строк и столбцов, а аргумент Arg2 позволя­ ет выбрать имя поля или подсчиты­ ваемое количество. Критерий должен описывать единственную ячейку Возвращает максимальное значение, соответствующее критерию ArgЗ. Аргумент Argl содержит диапазон подсчитываемых строк и столбцов. Аргумент Arg2 используется для выбора имени поля или подсчиты­ ваемого количества
Объектная модель Excel 2003 939 Имя Тип возвращае- Параметры Описание мого значения DMin DouЫe Argl As Range, Возвращает минимальное значение, Arg2, ArgЗ соответствующее критерию ArgЗ. Аргумент Argl содержит диапазон подсчитываемых строк и столбцов. Аргумент Arg2 используется для выбора имени поля или подсчиты- ваемого количества Dollar String Argl As DouЬle, Преобразовывает число в текст, ис- [Arg2] пользуя денежный формат. Аргумент Argl содержит число. Аргумент Arg2 содержит количество десятич- ных знаков DProduct DouЫe Argl As Range, Возвращает произведение значений, Arg2, Arg3 соответствующих критерию из аргу- мента ArgЗ. Аргумент Argl содер- жит диапазон подсчитываемых строк и столбцов. Аргумент Arg2 исполь- зуется для выбора имени поля или подсчитываемого количества DStDev DouЫe Argl As Range, Возвращает прогноз стандартного Arg2, Arg3 отклонения для значений, соответст- вующих критерию из аргумента ArgЗ. Аргумент Argl содержит диа- пазон подсчитываемых строк и столбцов. Аргумент Arg2 использу- ется для выбора имени поля или подсчитываемого количества DStDevP DouЫe Argl As Range, Возвращает прогноз стандартного Arg2, Arg3 отклонения для значений, соответст- вующих критерию из аргумента ArgЗ в предположении о том, что предос- тавлено все множество значений. Аргумент Argl содержит диапазон подсчитываемых строк и столбцов. Аргумент Arg2 используется для выбора имени поля или подсчиты- ваемого количества DSum DouЫe Argl As Range, Возвращает сумму значений, соответ- Arg2, Arg3 ствующих критерию из аргумента ArgЗ. Аргумент Argl указывает диа- пазон подсчитываемых строк и столб- цов. Аргумент Arg2 содержит имя по- ля или подсчитываемое количество DVar DouЫe Argl As Range, Возвращает вариацию значений, со- Arg2, ArgЗ ответствующих критерию из аргу- мента ArgЗ. Аргумент Argl указы- вает диапазон подсчитываемых строк и столбцов. Аргумент Arg2 ис- пользуется для выбора имени поля или подсчитываемого количества
940 Приложени~ А Имя Тип возвращае- Параметры Описание мого значения DVarP DouЫe Argl As Range, Возвращает вариацию значений, со ~ · Arg2, ArgЗ ответствующих критерию из эргу- мента ArgЗ в предположении о том, что предоставлено все множество значений . Аргумент Argl указывает на диапазон подсчитываемых строк и столбцов. Аргумент Arg2 исполь- зуется для выбора имени поля или подсчитываемого количества Even DouЫe Argl As DouЫe Выполняет преобразование числа из аргумента Argl в ближайшее четное целое число с округлением вверх ExponDist DouЫe Argl As · ооuЫе, Возвращает экспоненциальное рас- Arg2 As DouЬle, пределение значения . Аргумент ArgЗ As Boolean Argl содержит значение функции. Аргумент Arg2 содержит значение параметра лямбда. Для возврата ин- тегрального распределения пара- метр ArgЗ устанавливается в значе- ние тrue. Для получения плотности · вероятности аргумент ArgЗ устанав- ливается в значение False Fact DouЫe Argl As DouЫe Возвращает факториал аргумента Argl FDist DouЫe Argl As DouЫe, Возвращает F-распределение вероят- Arg2 As DouЬle, ности. Аргумент Argl содержит зна- ArgЗ As DouЫe чение для оценки функции . Аргумент Arg2 содержит числитель степеней свободы. Аргумент ArgЗ содержит знаменатель степеней свободы Find ооuЫе Argl As String, Находит текст из аргумента Argl Arg2 As String, в тексте из аргумента Arg2. Возвра- [ArgЗ] щает положение первого символа найденного текста. Аргумент ArgЗ' указывает позицию начала поиска в значении аргумента Arg2 FindB DouЫe Argl As String, · Находит текст из аргумента Argl Arg2 As String, в тексте из аргумента Arg2 . Возвра- [ArgЗ] щает положение первого символа найденного текста. Аргумент ArgЗ указывает позицию начала поиска (в байтах) в значении аргумента Arg2 Finv DouЫe Argl As DouЬle, Возвращает обратное значение для Arg2 As DouЬle, F- распределения вероя~:ности. Аргу- ArgЗ As DouЫe мент Argl содержит вероятность, связанную с интегральным F- распределением. Аргумент Arg2 со- держит числитель степеней свободы. Аргумент ArgЗ содержит знамена- тель степеней свободы
Имя Тип возвращае- мого значения Fisher DouЫe Fisherinv DouЫe Fixed String Floor DouЫe DouЫe Frequency Variant FTest DouЫe Fv DouЫe Объектная модель Excel 2003 941 Параметры Argl As DouЫe Argl As DouЫe Argl As DouЫe, [Arg2], [ArgЗ] Argl As DouЫe, Arg2 As DouЫe Argl As DouЬle, Arg2, ArgЗ Argl, Arg2 Argl, Arg2 Argl As DouЬle, Arg2 As DouЫe, ArgЗ As DouЬle, [Arg4] ' [ArgS] Описание · Возвращает преобразование Фишера для значения из аргумента Argl Возвращает результат обратного преобразования Фишера для значе­ ния аргумента Argl Округляет число из аргумента Argl до количества десятичных знаков, указанных в аргументе Arg2, и воз­ вращает число в виде строки. дJ!я добавления запятых в возвращае­ мый текст аргумент ArgЗ устанавли­ вается в значение True . Если аргу­ мент ArgЗ установить в значение False, запятые в возвращаемый текст не добавляются Возвращает ближайшее к значению аргумента Argl кратное значению Arg2 число, округленное в сторону О Вычисляет будущее значение у по текущему значению х (аргумент Argl) на основе существующих пар значений. Аргумент Arg2 содержит массив или диапазон с известными значениями у. Аргумент ArgЗ со­ держит массив или диапазон с из­ вестными значениями х Возвращает распределение частот в виде вертИкального массива . Мас­ сив значений находится в аргументе Argl, а массив интервалов - в ар­ гументе Arg2. Кроме этого, аргумен­ ты Argl и Arg2 могут содержать ссылки на диапазоны Возвращает результат F-теста для массивов из аргументов Argl и Arg2. Кроме этого, аргументы Argl и Arg2 могут содержать ссылки на ди·апазоны Возвращает будущее значение вклада для заданного периода времени. Ар­ гумент Argl содержит процентную ставку для периода. Аргумент Arg2 - общее количество периодов выплат. Аргумент ArgЗ - р,азмер выплат за определенный период. Аргумент Arg4 - начальное значение. Аргу­ мент ArgS определяет необходимость выплат на конец (О) или на начало (1) периода
942 Приложение А Имя GamrnaDist Gamrnalnv GamrnaLn GeoMean Gr owth HarMean HLookup Тип возвращае­ мого значения DouЫe DouЫe DouЫe DouЫ e Variant DouЫe Vari a nt Параметры Argl As DouЫe, Arg2 As DouЬle, ArgЗ As Dou - Ыe, Arg4 As Boolean Argl As DouЬle, Arg2 As DouЫe, ArgЗ As DouЫe Argl As DouЫe Argl, [Arg2 ] , ... [ArgЗO ] Argl , [Arg2], [ ArgЗ ] ' [Arg4] Argl, [Arg2] , ... [ArgЗO] Argl, [Arg2 ] , [ArgЗ] , [Arg4 ] Описание Возвращает гамма-распределение. Аргумент Argl содержит оценивае­ мое значение. Аргумент f,rg2 - зна­ чение параметра альфа для распре­ деления. Аргумент ArgЗ - значение параметра бета для распределения . Для получения интегрального рас­ пределения аргумент Arg4 устанав­ ливается в значение True. Для по ­ лучения плотности вероятности ар­ гумент Arg4 устанавливается в зна­ чение False Возвращает обратное гамма­ распределение. Аргумент Argl содер­ жит вероятность , связанную с гамма­ распределением. Аргумент Arg2 - па­ раметр альфа для распределения . Ар­ гумент ArgЗ - параметр бета для рас­ пределения Возвращает значение натурального логарифма гамма-фун кции для зна­ чения аргумента Argl Возвращает среднее геометрическое для значений аргументов с Argl по ArgЗ О . Аргументы могут содержать ссылки н а диапазоны Возвращает прогнозируемые значе­ ния у (аргумент Argl) в соответствии с э кспоненциальным трендом новых значений х (аргумент ArgЗ ) . Аргу­ мент Arg2 може1 использоваться для предоставления последователь­ ности существующ их значений х. Если аргумент Arg4 установить в значение False, часть ' Ь' уравнения будет равна 1 Возвращает среднее гармоническое для значений аргументов с Argl по ArgЗO. Аргументы могут содержать ссылки на диапазоны Выполняет поиск значения аргумента Argl в массиве таблицы (или по ссылке на ди а пазон) . Ар гумент Arg2 указывает на первую стр оку . Аргу­ мент ArgЗ содержит номер строки массива, включающей и скомое зна­ чение . Для поиска похожих данных аргумент Arg4 устанавливается в значение True. Для поиска точного совпадения аргумент Arg4 уста нав­ ливается в значение False
Объектная модель Excel 2003 943 Имя Тип возвр.ащае- Параметры Описание мого значения HypGeomDist DouЫe Argl As DouЬle, Возвращает гипергеометрическое Arg2 As DouЬle , распределение вероятности. Аргу- ArgЗ As DouЫe, мент Argl содержит количество ус- Arg4 As DouЫe пешных испытаний в выборке. Аргу- мент Arg2 - размер выборки. Аргу- мент ArgЗ - количество успешных испытаний во всем множестве, а ар- гумент Arg4 - размер всего множе- ства Index Variant Argl, Arg2 As Возвращает ячейку или массив ячеек DouЬle, [ArgЗ ] , из аргумента Argl . Номер строки со- [Arg4] держится в аргументе Arg2. Номер столбца содержится в аргументе ArgЗ . Кроме того, может возвращать ячейку или диапазон ячее к из аргу- мента Argl . Номер строки содержит- ся в аргументе Arg2. Номер столбца содержится в аргументе Arg З . Если аргумент Argl состоит из несколь ких областей, аргумент Arg4 использует- ся для выбора области Intercept DouЫe Argl, Arg2 Возвращает точку пересечения коор- динат по оси х и оси у. Аргумент Argl содержит массив и звестнь1х значений у, а аргумент Arg 2 - из- вестны х значений х I pmt DouЫ e Arg l As Do uЬl e , Возвращает величину выплат при- Arg2 As DouЫe , были на вложения за данный период . ArgЗ As DouЫe, Аргумент Argl содержит процентную Arg4 As DouЫe, ставку за период. Аргумент Arg2 - [Ar gS], [Argб] период, за который производятся выплаты. Аргумент ArgЗ - общее количество периодов вы плат . Аргу- мент Ar g4 - начальное значение . Аргумент ArgS - значе н ие выплат , которое необходимо получить в бу - дущем. Аргумент Argб определяет необходимость выплат в конце (О) ил и в начале (1) периода Irr DouЫe Argl , [Arg2] Возвращает внутреннюю ставку до - ходности для массива з начений из аргумента Argl . Аргумент Arg2 со- держит предположительное значени е фун кции Irr IsErr Boolean Argl Сообщает , содержит ли ячейка из аргумента Argl ошибочное значение (#N/ A) I sError Boolean Argl Сообщает , содержит ли ячейка из ар гумента Argl любое ошибочное значение
944 Приложение А Имя Тип возвращае- мого значения IsLogical Boolean IsNA Boolean IsNonText ' Boolean IsNumЬer Boolean Ispmt DouЫ~ rsтext Boolean Kurt DouЫe Large DouЫe LinEst Variant Ln DouЫe Log DouЫe LoglO DouЫe Параметры Argl Argl Argl Argl Argl As DouЬle, Arg2 As DouЬle, ArgЗ As DouЬle, Arg4 As DouЫe Argl Argl, Arg2] , ... [ArgЗO] Argl, Arg2 As DouЫe Argl, [Arg], [ ArgЗ], [Arg4] Argl As DouЫe Argl As DouЫe, [Arg2] Argl As DouЫe описание . Сообщает, содержит ли ячейка из аргумента Argl логическое значение Сообщает, содержит ли ячейка из аргумента Argl значение #N/A Сообщает, содержит ли ячейка из ар­ гумента Argl нетекстовое значение Сообщает, содержит ли ячейка из аргумента Argl числовое значение Возвращает проценты, выплачивае­ мые за определенный инвестицион­ ный период. Используется для обес­ печения совместимости. Аргумент Argl содержит процентную ставку дляnериода. Аргумент Arg2 - пе­ риод, для которого необходимо под­ считать процент . Аргумент ArgЗ - общее количество периодов . Аргу­ мент Arg4 - начальное значение Сообlцает, содержит_ ли ячейка из аргумента Argl текстовое значение Возвращает эксцесс значений из ар­ гументов с Argl по ArgЗ О. Кроме этого, аргумент Argl может содер­ жать ссылку на диапазон ячеек Возвращает наибольшее значение из массива или диапазона ячеек, на кото­ рый указывает аргумент Argl. Аргу­ мент Arg2 содержит номер значения (например, второе наибольшее значе­ ние, третье наибольшее значение) Возвращает массив, описывающий прямую, которая лучше всего соот­ ветствует известным значениям у (аргумент Arg:).) их (Arg2 ). Для при­ своения значения о части уравнения 'Ь' аргумент ArgЗ устанавливается в значение False. Аргумент Arg4 ус­ танавливается в значение True для получения дополнительной статисти­ ки Возвращает натуральный логарифм значения аргумента Argl Возвращает логарифм числа Argl по основанию, указанному в качестве значения аргумента Arg2 . По умол ­ чанию аргумент Arg2 равен 1О Возвращает логарифм значения Argl по основанию 1О
Объектная модель Excel 2003 945 Имя Тип возвращае- Параметры Описанuе мого значения LogEst Variant Argl, [ Arg2], Возвра щает массив, описываю щ ий [ArgЗ], [Arg4] кривую, которая наилучшим образом описывает известные значения у (аргумент Argl) и х (аргумент Arg2). Для присвоения значения О части . уравнения 'Ь' аргумент ArgЗ уста- навливается в значение False. Ар- гумент Arg4 устанавливается в зна- чение True для получения до п олни- тельной статистики Loginv Doub1e Argl As DouЫe, Возвращает обратное логарифмиче- Arg2 As DouЫe, ское инте гральное распределение. ArgЗ As DouЫe Аргумент Argl содержит инверти- руемую вероятность. Аргумент Arg2 - среднее значение для ln (значение) . Аргумент Arg4 - стандартное отклонение для ln(значение) LogNormDist DouЫe Argl As DouЫ e, Возвращает интегральное логариф - ' Arg2 As DouЬle, мическое нормальное распределе- . ArgЗ As DouЫe ние для значения аргумента Argl. Аргумент Arg2 содержит среднее значение для ln (Argl). Аргумент ArgЗ содержит стандартное откло- нение для ln (Argl) Lookup Variant ' Argl, Arg2, Выполняет поиск значения аргумента [ArgЗ] Argl в строке или столбце из аргу- мента Arg2. Возвращает значение из той же пози ции массива из аргумен- та ArgЗ Match DouЫe Argl, Arg2, Возвращает относительное положе- [ ArgЗ] ние элемента в массиве из аргумен- та Arg2. Элемент должен совпадать со значением аргумента Argl . Для выбора типа совпадения использует- ся аргумент ArgЗ Мах DouЫe Argl , [Arg2], Возвращает максимальное значение -.. [Arg30] аргументов от Argl до ArgЗO. Кроме того, аргумент Argl может содер- жать диапазон ячеек MDeterm DouЫe Argl Возвращает определитель матрицы, которая описывается массивом из ар- гумента Argl. Кром е этого, аргумент Argl может содержать диапазон яче- ек. Ячейки не могут содержать текст или быть пустыми. Количество строк и стобцов должны совпадать Median DouЫe Argl, [Arg2], Возвращает значение медианы для ... [ArgЗO] чисел из аргументов с Argl по ArgЗO. Кроме этого, аргумент Argl может содержать диапазон ячеек
946 Приложение А Имя Min Minverse Mirr ММult Mode NegBinom- Dist NormDist Тип возвращае­ мого значения DouЫe Variant DouЫ e Variant _-DouЫ e . DouЫe ЬоuЫе Параметры Argl, { Arg2] , ... [Arg ЗO] Argl Argl, Arg2 As DouЬle, · дrgЗ As DouЫ e Argl , Arg2 Argl , [Arg2] , ... [Arg30] Argl· As Do uЬl e, Arg2 As DouЬle, ArgЗ As DouЫe Argl As DouЬle, Arg2 As DouЬle, ArgЗ As DouЬle, Arg4 As Boolean · Описание. Возвращает наименьшее значение среди аргументов с Argl по ArgЗ О. Кроме того , аргумент Argl может содержать диапазон ячеек Возвращает обратную матрицу для массива из аргумента Argl. Кроме этого, аргумент Argl может содер­ жать диапазон ячеек. Ячейки матри­ цы не могут содер жать текст и быть riустыми . Количество строк и столб­ цов должно совпадать Возвращает модифицированную ставку доходности для последова­ тельности значений из аргумента Argl . Аргумент Arg2 содержит раз­ м ер выплат . Аргумент ArgЗ содер­ жит размер выплат при реинвести­ ровании денежного потока . Возвращает произведение матриц из двух массивов Argl и Arg2. Количе­ ство столбцов в аргументе Argl должно совпадать с количеством строк в аргументе Arg2 . Аргументы Argl и 'дrg2 могут содержать диапа­ зон ячеек . Ячейки не мо гут содер­ жать текст и быть пустыми Возвращает наиболее часто встре­ чающееся число из значений аргу­ ментов с Argl по ArgЗ О. Кроме это­ го, аргумент Argl может содержать диапазон ячеек Возвращает отр ицатель ное биноми ­ альное распределе ни е аргументов. Аргумент/Аrgl содержит количество неудачных испытаний . Аргумент Arg2 - граничное количество ус­ пешных испытаний. Аргумент ArgЗ - вероятность успеха при еди­ ничном испытании Возвращает интегральное нормаль ­ ное распределени е для значения (аргумент Argl), среднего (аргумент Arg2) и ста ндартн ого отклонения (аргумент ArgЗ ) . Для получения ин­ тегрального распределения аргумент Arg4 устанавливается в значение тrue. Для получен ия плотности рас­ пределения аргумент Arg4 устанав­ ливается в значение Fal se
Объектная модель Excel 2003 947 Имя NormSDist NormSinv NPer Npv Odd Or Тип возвращае- Параметры мого значения · ооuЫе Argl As DouЫe DouЫe Argl As DouЫe DouЫe о'оuые DouЫe Boolean Argl As DouЬle, Arg2 As DouЬle, ArgЗ As DouЬle, [Arg4] , [Arg5] Argl As DouЬle, Arg2, [ArgЗ] , ... [ArgЗO] Argl As DouЫe Argl, [Arg2], ... [ArgЗO] Pearson DouЫe Argl, Arg2 Percentile DouЫe PercentRank DouЫe Argl, Arg2 As DouЫe Argl, Arg2 As DouЬle, [ArgЗJ Описание Возвращает стандартное нормальное интегральное распределение для ука­ занной вероятности {аргумент Argl) Возвращает обратное значение стандартного нормального распре­ деления для указанной вероятности {аргумент Argl) Возвращает общее количество пе­ риодов выплат для данного вклада . Аргумент Argl содержит процент для периода. Аргумент Arg2 - объ­ ем выплат за каждый период. Аргу­ мент ArgЗ - начальное значение . Аргумент Arg4 - интересующий размер вклада в будущем. Аргумент Arg5 определяет необходимость вы­ плат в конце (О} или в начале (1) пе­ риода Возвращает чистую приведенную стоимость инвестиции, используя ставку дисконтирования {аргумент Argl), а также стоимость будущих выплат и поступлений {аргументы CArg2 ПОАrgЗО) Выполняет округление в сторону увеличения значения аргумента Argl до ближайшего целого нечет­ ного числа Возвращает значение True, если любой из аргументов имеет значение True Возвращает коэффициент корреля­ ции Пирсона для массива значений. Аргумент Argl содержит массив не­ зависимых значений, а аргумент Arg2 - массив зависимых значений. Аргументы Argl и Arg2 могут со­ держать ссылки на диапазоны Возвращает k-тую персентиль для значений из диапазона ячеек или массива, хранящегося в аргументе Argl. Значение k предоставляется через аргумент Arg2 Возвращает процентную норму значе­ ния в множестве данных. Аргумент Argl содержит диапазон ячеек или массив с данными . Аргумент Arg2 со­ держит значение. Аргумент ArgЗ оп ­ ределяет количество значащих цифр возвращаемой процентной нормы
948 Приложение А Имя Тип возвращае- Параметры Описание мого значения Permut DouЫe Argl As DouЬle, Возвращает общее количество пере- Arg2 As DouЫe становок для заданного числа объек- тов. Аргумент Argl содержит общее число объектов. Аргумент Arg2 содер- жит число выбранных объектов Arg2 Phonetic String Argl As Range Возвращает фонетические символы для текстовой строки из аргументов Argl Pi DouЫe .Возвращает значение числа 7t (3, 14) с точностью до 15 десятичных знаков Pmt DouЫe Argl As DouЬle, Возвращает величину выплат по за- Arg2 As DouЬle, ему . Аргумент Argl содержит про- Arg3 As DouЫe, центную ставку за период . Аргумент [Arg4], [Arg5] Arg2 - количество выплат по заему. Аргумент ArgЗ - начальное значе- ние. Аргумент Arg4 - значение, ко~ торое необходимо достигнуть в бу- дущем . Аргумент Arg5 определяет необходимость выплат в конце (О) или в начале (1) периода Poisson DouЫe Argl As DouЬle, Возвращает распределение Пусас- Arg2 As DouЫe, сана. Аргумент Argl содержит коли- ArgЗ As Boolean чество событий. Аргумент Arg2 со- держит ожидаемое числовое значе- ние. Для получения интегральной вероятности аргумент ArgЗ устанав- ливается в значение True. Для по- лучения плотности вероятности ар- гумент ArgЗ устанавливается в зна- чение False Power DouЫe Argl As DouЫe, Возвращает степень для основания Arg2 As DouЫe Argl и показателя Arg2 Ppmt DouЫe Argl As DouЬle, Возвращает размер выплат по вкла- Arg2 As DouЫe, ду для заданного периода. Аргумент ArgЗ As DouЬle, Argl содержит процент за период. Arg4 As DouЬle, Аргумент Arg2 указывает на интере- [Arg5], [Argб] сующий период. Аргумент ArgЗ со- держит общее количество выплат. Аргумент Arg4 - начальное значе- ние. Аргумент Arg5 - интересую- щую стоимость в будущем. Аргумент Argб определяет необходимость вы- плат в конце (О) или в начале (1) пе- риода Prob DouЫe Argl, Arg2, Возвращает вероятность попадания ArgЗ As DouЬle, массива Argl и связанного с ним [Arg4] массива Arg2 между нижним (аргумент ArgЗ) и верхним (аргумент Аrg4)пределами
Объектная модель Excel 2003 949 Имя Тип возвращае- Параметры Описание мого значения Product DouЫe Argl, [Arg2], Возвращает произведение значений ... [ArgЗO] всех аргументов с Argl по ArgЗO Proper String Argl As String Делает первую букву каждого слова из аргумента Argl заглавной и все остальные буквы прописными Pv DouЫe Argl As DouЬle, Возвращает приведенную стоимость Arg2 As DouЬle, инвестиции. Аргумент Argl содержит ArgЗ As DouЬle, значение процента для периода . Ар- [Arg 4 ], [ArgS] гумент Arg2 - количество выплат по вкладу. Аргумент ArgЗ - размер вы - плат за период . Аргумент Arg4 - ин- тересующее в будущем значение. Ар- гумент ArgS определяет необходи- мость выплат на конец (О) или на на- чало (1) периода Quartile DouЫe Argl, Arg2 As Возвращает квартиль для массива из DouЫe аргумента Argl. Аргумент Arg2 мо- жет содержать о (минимальное зна- чение), 1 (первая квартиль), 2 (вторая квартиль), 3 (третья квар- тиль) или 4 (максимальное значение) Radians DouЫe Argl As DouЫe Выполняет преобразование значения аргумента Argl из градусов в радиа- ны и возвращает новое значение Rank DouЫe Argl As DouЫe, Возвращает ранг значения аргумента Arg2 As Range, Argl в диапазоне из аргумента [ArgЗ] Arg2. Аргумент ArgЗ описывает ранжировку диапазона из аргумента Argl Rate DouЫe Argl As DouЫe, Возвращает размер процента за пе- Arg2 As DouЬle , риод для достижения определенной ArgЗ As DouЬle, стоимости. Аргумент Argl содержит [Arg4 ], [ ArgS], общее количество выплат. Аргумент [ Argб] Arg2 - размер выплат за период. Ар- гумент ArgЗ - начальное значение . Аргумент Arg4 ·-стоимость в буду- щем, которой необходимо достичь. Аргумент ArgS определяет необходи- мость выплат в конЦе (О) или в начале (1) периода Replace String Argl As String, Заменяет фрагмент текста из аргу- Arg2 As DouЬle, мента Argl текстом из аргумента ArgЗ As DouЫe, Arg4. Аргумент Arg2 указывает на Arg4 As String начало заменяемого фрагмента. Ар- гумент ArgЗ определяет количество заменяемых символов
950. Приложение А Имя ReplaceB , Rept Roman Round RoundDown RoundUp RSq Тип возвращае- . Параметрьt мого значения String String String DouЫe DouЫe DouЫe DouЫ e Argl Arg2 ArgЗ Arg4 Argl Arg2 As S.tring , . As DouЫe, As DouЬle, As String As String, As DouЫe Ar gl As DouЬle, [Arg2] Argl As DouЬle, Arg2 As DouЫe Argl As DouЬle, Arg2 As DouЫe Argl As DouЬle, Ar_g2 As DouЫe Argl, Arg2 .-. Описание Заменяет фрагмент текста из аргу­ мента Argl текстом из аргумента Arg4 . Аргумент Arg2 указывает на начало заменяемого фрагмента. Ар­ гумент ArgЗ определяет количество заменяемых байтов Повторяет строку из аргумента Argl несколько раз (количество раз ука- зывается в качестве значения аргу- мента Arg2) Возвращает запись значения аргу- мента Argl римскими цифрами. Ар- · г ум е нт Arg2 определяет стиль рим- ских цифр. Значение О или True описывает классический стиль. Зна- чение 4 или False описывает упро- щенный стиль. Можно считать , что значения от О до 4 описывают раз- ные степени упрощения Возвращает значение Argl, округ- ленное до количества цифр, указан- наго с помощью аргумента Arg2 Возвращает значение Argl, округ- ленное до количества цифр, указан- на го с помощью аргумента Arg2. Значение округляется в сторону уменьшения Возвращает значение Argl, округ- ленное до количества цифр, указан- но го с помощью аргумента Arg2. Значение округляется в сторону уве- личения Возвращает квадрат коэффициента корреляции Пирсона . Аргумент Argl содержит массив значений у. Аргу- мент Arg2 содержит массив значе- ний х . Кроме этого, аргументы Argl и Arg2 также могут содержать ссыл- ки на диапазоны
Имя RTD Search SearchB Sinh Skew Объектная модель Excel 2003 951 Тип возвращае- "Г1араметры мого значения Variant · DouЫe DouЫe DouЫe DouЫe progID As Vari - ant, server As Variant, topicl .As Variant, [topic2] , [topicЗ ] , [topic4 ] , [topicS] , [topicб ] , [topic7], [topic8 ] , [topic9 ] , [topiclO ] , [topicll] , [topicl 2 ] , [topiclЗ J, [topicl4 J , [topiclS J , [topiclб ] , [topicl 7 ] , [topicl8 J , [topicl9 J , [topic20 ] , [topic21 J , [topic22 ] , [topic23 ] , [topic24 ] , [topic25 J , [topic26], [topic27J ~ [topic28 J Argl As Stri ng, Arg2 As Stri ng, [ArgЗ] Argl As String, Arg2 As String, [ArgЗ] Argl As DouЫe Argl , [Arg2] , ... [Arg30 ] Описание Подключается к источнику данных для получения данных реального времени . Аргуме нт progID содержит программный идентификатор серве­ ра реально го времени . Аргумент server - имя сервера. Аргумент topicl - интересующую тему Находит текст из аргумента Argl в строке из аргумента Arg2 . Метод возвращает положение на йденного текста в строке . Аргумент ArgЗ ука­ зывает пози цию начала поиска в ар ­ гументе Arg2 Находит текст из аргумента Argl в строке из аргумента Arg2. Метод возвращает положение найденного текста в строке . Аргумент ArgЗ ука­ зывает позицию начала nоиска (в байтах) в аргументе Arg2 Возвращает гипербол ический синус . аргумента Argl Возвращает ассиметрию распреде­ ления для чисел из аргументов с Argl по ArgЗ о. Аргументы могут содержать ссылки на диапазоны
952 Приложение А Имя Тип возвращае- мого значения Sln DouЫe Slope DouЫe Small DouЫe Standa rdi z e DouЫe StDev DouЫe StDev P DouЫe StEyx DouЫ e Subs t i tute Stri ng Параметры Argl As DouЫe, Arg2 As DouЬle , ArgЗ As DouЫe Argl, Arg2 Argl, Arg2 As DouЫe Argl As DouЬle, Arg2 As DouЬle , Arg З As DouЫe Argl, [A rg2] , ... [ ArgЗO ] Argl, [Arg2] , [ArgЗO] Argl, Arg2 Argl As St ring, Arg 2 As Strin g, ArgЗ As String , [Arg4] Описание Возвращает величину амортизации, рассчитанную линейным методом. Аргумент Argl содержит стоимость актива. Аргумент ArgЗ - остаточную стоимость. Аргумент Arg2 - коли­ чество периодов амортизации Возвращает наклон линии линейной регрессии, проходящей через точки данных, которые описываются зна­ чениями Х из аргумента Argl и У из аргумента Arg2 Возвращает k-тое наименьшее зна ­ чение массива или диапазона из ар­ гумента Argl (например, второе наименьшее, третье наименьшее). Аргумент Arg2 ,содержит значение k Возвращает нормализованное зна­ чение на основе распределения. Ар­ гумент Argl содерж1-1т интересую­ щее значение. Аргумент Arg2 - среднее значение. Аргумент ArgЗ - стандартное отклонение Возвращает прогноз и руемое стан­ дартное отклонение для значений с Argl по ArgЗ О. Кроме этого , аргу­ менты могут содержать ссылки на диапазоны Возвращает стандартное отклонение для всех значений с Argl по ArgЗO . Кроме этого, аргументы могут содер­ жать ссылки на диапазоны Возвращает стандартную ошибку прогнозируемы х значений у для каж­ дого значения х в регрессии. Аргу­ мент Argl содержит известные зна­ чения у. Аргумент Arg 2 содержит значениях Заменяет все экземпляры текста из аргумента Arg2 те кстом из аргумен­ та ArgЗ . Аргумент Arg l содержит модифицируемую_строку. Аргумент A·rg4 позволяет выбрать заменя е­ мый экземпляр текста
Имя SuЬtotal Sum Sumif SumProduct SumSq SumX2MY2 SumX2PY2 SumXMY2 Syd Объектная модель Excel 2003 953 Тип возвращае- Параметры мого значения DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe DouЫe Argl As· DouЫe, Arg2 As Range, [ArgЗ], , [Arg30] Argl, [Arg2 ] , .. . [Arg30] Argl As Range, Arg2, [ArgЗ] Argl, [Arg2] , [Arg30] Argl, [Arg2 ] , ... [ArgЗO] Argl, Arg2 Argl, Arg2 A~gl, Arg2 Argl As DouЬle, Arg2 As DouЫe, ArgЗ As DouЫe, Arg4 As DouЫe Описание Возвращает ито ги для диапазонов или ссы л ок на диапазоны, указанные в аргументах с Arg2 по ArgЗ о. Ар гу­ мент Argl содержит число, о п исы ­ вающее тип ис п ользуемой функции для подсч ета итогов. Действитель­ ные номера функций находятся в пределах от 1 до 1О . Эти числа представляют функции Average, Count,CountA, Max,Min, Product, StcDev, StDevP, Sum, Var И V·arP Возвращает сумму значений из ар­ гументов с Argl по ArgЗ о Возвращает сумму ячеек в диапазоне из аргумента Argl. Ячейки должны со­ ответствовать критерию из аргумента Arg2. Диа п азон для хранения суммы можно указать с помощью аргумента ArgЗ. Строки ил и столбцы в аргумен­ тах Argl и ArgЗ должны совпада ть Умножает соответствующие элемен­ ты из массивов с Argl по ArgЗO , и возвращает сумму произведений. Размерность массивов должна сов ­ падать Возвращает сумму квадратных кор­ ней значений аргументов с Argl по . ArgЗO Вычисляет разность квадратов соот­ ветствующих элементов массивов Argl и Arg2 и возвращает сумму всех новых элементов Вычисляет сумму квадратов соот­ ветствующих элементов массивов Argl и Arg2 и возвращает сумму всех новых элементов Вычисляет разность соответствующих элементов массивов Argl и Arg2, возводит разность в квадрат и воз­ вращает сумму новых элементов Возвращает величину амортизации актива за заданный период, рассчи­ танную по методу "сумма годовых чисел". Аргумент Argl содержит на­ чальную стоимость. Аргумент Arg2 - стоимость списания. Аргу­ мент ArgЗ - количество периодов амортизации. Аргумент Arg4 указы­ вает на интересующий период
954 Приложение А Имя Тип возвращае- мого значения Tanh DouЬle Tdist DouЫe Text String Tinv DouЫe Transpose Variant Tre nd Variant Tri m String TrirnМean DouЫe Параметры Argl As DouЫe Argl As DouЬle, Arg2 As DouЬle, ArgЗ As DouЫe Argl, Arg2 As String Argl As DouЫe , Arg2 As DouЫe Argl Argl, [Arg2J, [ArgЗ] ' [Arg4 ] Argl As S tring · Argl, Arg2 As DouЫe Описание Возвращает гиперболический тан­ генс аргумента Argl Возвращает вероятность !-распреде­ ления Стьюдента для значения из аргумента Argl. Аргумент Arg2 со­ держит количество степеней свобо­ ды. Аргумент ArgЗ устанавливается в значение 1 для получения односто­ роннего распределения. Аргумент ·ArgЗ устанавливается в значение 2 для получения двустороннего рас­ пределения Выполняет преобразование значения . аргумента Argl в текстовую строку с использованием формата из аргу­ мента Arg2 Возвращает обратное !-распреде­ ление Стьюдента для указанных ве­ роятности (аргумента Arg l ) и коли­ чества степеней свободы (аргумент Arg2) Выполняет транспон и рование диапа­ зона из аргумента Argl . Возвращает новый диапазон Возвращает значения в соответствии с линейным трендом. Метод аппрок­ симирует прямой линией известные значения у (аргумент Argl) их (аргумент Arg2), а также новые зна ­ чениях (аргумент Arg З). Аргумент Arg4 устанавливается в значение False для присвоения части урав­ нения 'Ь' значения О Возвращает строку из аргумента Argl без вступительных и завер­ шающих пробелов Возвращает среднее значение внут­ ренней области масси ва данных из аргумента Argl. Аргумент Ar g2 по ­ з~оляет указать исключаемую часть массива \..
Имя Ttest USDollar Var VarP Vdb \ Объектная модель Excel 2003 955 Тип возвращае- ·, Параметры маго значения DouЫe String' DouЫe DouЫe DouЫe Argl, Arg2, ArgЗ As DouЬle, Arg4 As DouЫe Argl As DouЫe, Arg2 As DouЫe ' Argl, [Arg2] , ... [ Arg30] Argl , [Arg2], [ArgЗO] Argl As DouЬle, Arg2 As DouЬle, ArgЗ As DouЬle, Arg4 As DouЫe, Arg5 As DouЫe, [Argб], [Ar g 7] ·· Описание . Возвращает вероятность, соответст­ вующую критерию Стьюдента, на ос­ новании двух наборов данных из ар­ гумента Argl и Arg2. Аргумент ArgЗ устанавливается в значение 1 для получения одностороннего расп ре­ деления. Аргумент ArgЗ устанавли­ вается в значение 2 для получения двустороннего распределения , Для выбора типа t-теста: парный, гомо­ скедастический и гетероскедастиче­ ский, аргумент Ar g4 устанавливает­ сявзначения1,2илиЗ Возвращает строку в валютном фор­ мате, соответствующую ч и слу из ар­ гумента Argl. Количество десятич­ ных знаков указывается в качестве значения аргумента Arg2 Возвращает прогнозируемую JЗариа­ цию на основании значений аргумен · тов с Argl по ArgЗ О. Кроме этого, v аргуме.~:~ты могут содщ:}жать ссыл~ на дt1апазоны '· " Возвращает вариацию на основе · значений аргументов с Argl по ,, Arg З о с использованием всего мно­ жества. Кроме этого., аргументы мо­ гут содержать ссылки на диапазоны Возвращает амортизацию с исполь­ зованием метода ее двукратного учета (если не выбран друr:рй метод) для указанных периодов. Арrу_мент Argl содержит начальную стои­ мость. Аргумент Arg2 - остаточную стоимость. Аргумент ArgЗ - колИ- .· чество периодов амортиэеции. Аргу­ мент Arg4 указывает на начальный период амортизации, а аргумент / Arg 5 - на конечны ~ . Аргумент Argб содержит скорость амортизац,ии. Для вычислен'1Я амортизации с помощью метода двукратного учета аргумент Arg7 устанавливается в значение True . Для переключения на,..метод Постоянного учета амортизации ар­ гумент Arg7 устанавливается в зна­ чение False
956 Приложение А Имя Vlookup Weekday Weibull Zte st Тип возвращае- Параметры мого значения Variant DouЫe DouЫe DouЫe Argl, Arg2 , ArgЗ, [Arg4] Argl, [ Arg2 ] Argl As DouЫe, Arg2 As DouЬle, Arg З As DouЫe-, Arg4 As Boolean Argl, Arg2 As DouЫe, [ArgЗ] Пример: объект WorksheetFunction ,suь Gёtвfggesf'(j""""'::'~:~~- .... 1 . Dim· oWSF As WorksheetFunction ( Diin ·VaArray As .·Var.iant / . Описание Выполняет поиск значения аргумента Argl в массиве таблицы (или в диа­ пазоне) из аргумента Arg2. Аргумент ArgЗ содержит номер столбца, включающего совпадающее значе­ ние. Для приблизительного поиска аргумент Arg4 устанавливается в значение True. Для поиска точных значений аргумент Arg4 устанавли­ вается в значение False Возвращает номер дня недели для ' даты из аргумента Argl. Аргумент Arg2 содержит день начала . недели Возвращает распределение Вейбула для значения аргумента Argl . Аргу­ мент Arg2 содержит значение пара­ метра распределения альфа.Аргу­ мент ArgЗ содержит значение пара­ метра распределения бета . Для по­ лучения интегральнрй вероятности аргумент Arg4 устанавливается в значение True. Для получения плотности распределения аргумент Arg4 устанавливается в значение False Возвращает двустороннее Р-значение z-теста . Аргумент Argl содержит массив или диапазон данных, которые тестируются относительно аргумента Arg2. Аргумент Arg2 - тестируемое значение. Аргумент ArgЗ - стандарт­ ное отклонение для общего множест­ ва данных · s et oWSF = . Application.WorksheetFunction . ; vaArray =".Array (lO , 20, 13, 15, S.б, 1:?, 8, 45)... r Msgвox " Наибольщее , зна'iение равно " &. ; qWS.F .. м<i.xJva}\.rrqy) [En(j"_E?.vb ..•..". -~··"-·~:;,,,·"·,:_· .w~.:....~-~.2 •.. - . :..•~ ·-· ··"'·""' . Объект XmlDataBinding Представляет подключение к источнику да!IНЫХ для карты XML. Имя Тип возвращае- Описание мого значения Applicat i on Obj ect Возвращает ссылку на п риложение Microsoft Excel Возвращает длинное целое число, которое указывает на пр иложе ни е, создавшее объект Cr e ator Long
Объектная модель Excel 2003 957 Имя Тип возвращае- Описание мого значения Parent SourceUrl Object String Возвращает ссылку на родительский объект Возвращает строку, представляющую содержимое файла данных XML Методы объекта XmlDataBinding Имя Тип возвращае- Параметры Описание мого значения Clear- Settings Load- Settings Refresh Boolean Boolean Объект XmlMap Очищает все параметры текущего объекта Загружает набор параметров Обновляет все данные Объект XMLMap описы вает карту XML, которая доб авляется к книге . Свойства объекта XmlMap Имя Тип возвращае- Описание мого значения 1 Adjust- Boo lean Co lumnWidth · AppendOn- Bool ean I mport Application Long Creatbr Long Устанавливается в значение True для автоматического изменения ширинь1 столбцов при обновлении данных Устанавливается в значение Tr ue для добавления импортируемы х данны х к уже существующим. В против­ ном случае импортируемые данные перезаписывают существующие Возвращает ссылку на приложение Excel Указывает на объект, создавший текущий объект Da taBinding XmlDa t a Binding Возвращает объект XmlDataBinding , описывающий привязку для указанной карты схемы IsExportaЫe Bool e an Name Strin g Parent Object Preserve - Boolean Co lumnFilter Preserve- Boolean NumЬ er - Forma t t ing RootEl eme n t - String Name RootEle ment- XmlName s p ace Namesp ace SaveData- Sou rce - Defini tion Boolean Определяет возможность э кспорта текущих данных Возвращает имя те кущего объекта Возвращает ссылку на родительский объект данного объекта Определяет необходимость сохранения фильтров столбцов Определяет необходимость сохранения форматов чисел Возвращает строку, описывающую им я корнево го элемента в дереве XML Возвращает объект XmlNamespace, соответствующий пространству имен текуще го корневого элемента Определяет необходимо сть сохранения информации об источнике данны х
958 Приложение А Имя Тип возвращае- Описание мого значения Schernas XrnlSchernas Showimport~ Boolean ExportVali- dationEr- rors Методы объекта XmlMap Возвращает коллекцию объектов XrnlSchema, использующихся в текущей книге Устанавливается во время импорта и экспорта в значение тrue для вывода всех ошибок проверки действительности документа Имя Тип возвращае- Параметры Описание Delete Export ExportXrnl Irnport ImportXrnl мого значения Удаляет текущий объект XrnlMap Экспортирует текущий объект XrnlMap Экспортирует текущий объект XrnlMap в виде кода XML, который можно сохранить в файле Импортирует объект XrnlMap Импортирует объект XrnlMap из кода XML
/ / Объектная модель VBE Объектная модель VВЕ официально называется "Microsoft Visual Basic fог Applications Extensibility 5.3". Эта библиотека предоставляет доступ к коду и формам внутри приложе­ ния, а также различным объектам, составляющим интегрированную среду разработки Visual .Basic ,(Visual Basic Integгated Development Environment- VВIDE). По умолчанию данная объектная библиотека отсутствует в списке ссылок нового проекта. Для использова­ ния рассмотренных здесь объектов в приложение необходимо добавить ссылку на библио­ теку Mic1·osoft Visual Basic for Applications ExtensiЬility 5.3 . Для этого можно воспользоваться командой меню TooJsqReferences (СервисqСсылки) в редакторе VВЕ. Опыт программи­ рования для Office ХР может оказаться Полезным при программировании в Office 2003, так как версия библиотеки не изменилась . Многие объекты из объектной модели VВЕ имеют те же имена, что и объекты из объ­ ектной модели Excel. Для явного выбора объектов из объектной модели VВЕ необходимо использовать имя VВIDE во всех oпepaтopaxDim: Все приложения из поставки Office 2003 применяют одну и ту же среду разработки - редактор VВЕ. Код и формы, принадлежащие книге Excel, документу W01·d , базе данных Access, презентации PoweгPoint (то есть, '.'документу"), группируются в проекты Visual Basic (объект VВProj ect). Для каждого документа существует свой проект. Приложения FrontPage и Outlook имеют собственные проекты, которые "принадлежат" приложению.
960 Приложение Б Связь между объектной моделью Excel · и объектной моделью VBE Существует несколько свойств объектов ·Excel, предоставляющих связи с объектной моделью VВЕ. Точно так же существует несколько свойств в объектной модели VBE, пре­ доставляющих связи с объектной моделью Excel. Эти связи используются во многих примерах кода в этом приложении и в главе 14. Свойство связи от Ехсе/ к VBE Application.VBE Workbook . VBProject Workbook.CodeName Worksheet.Codename, Chart.CodeName ' Результирующий элемент VBE Объект VBE Объект VBProj ect Имя объекта vвcomponent на уровне книги в проекте VВProject. Обычно это объект "ThisWo rkbook" в англоязычных версиях Excel Имя объекта vвcomponent на уровне листа в проекте VВProj ect. Обычно это объект" Sheetl ", "Chartl " в англоязычных версиях Excel Свойство связи от VBE к Ехсе/ Результирующий элемент Excel VBProject.FileName VBComponent . Properties ( "Name") VBComponent. Properties ("<другие свойства>") Полное имя книги, если объект VBProj ect является проектом книги Excel и книга была сохранена Имя файла книги, если обьект vвcomponent является эле­ ментом уровня книги (напр~мер, "Thisworkbook ").Для объ­ ектов vвcomponent уровн я: листа это свойство возвращает имя листа Возвращает свойства, связанные с объектом Exce l, к которым относится объект VBComponent Общие свойства и методы . Большинство объектов из объектной библиотеки VВЕ предоставляют ряд общих свойств. Для избежания избыточности эти свойства будут перечислены в описании каж­ дого объекта, но подробная информация приводиться не будет. Обычно, если объектьi обладают общими свойствами, они являются потомками одного базового класса. Базовые классы и наследование должны быть известны всем, кто знаком с разработкой на основе объектно-ориентиро~анной парадигмы. Дополнительная информация об объектно­ ориентированной разработке приводится на сайте Microsoft Development Network (http://msdn .microso ft.com).
Имя Collection Pareцt VBE Объектная модель VВЕ 961 Тип возвращае- Описание мого значения VBE Только чтение. Возвращает коллекцию, которой принад­ лежит объект. Например, объект Reference принадлежит коллекции References. Объекты, принадлежащие кол­ лекциям, предоставляют свойство Collection. Коллек­ ции являются средствами группировки одинаковых объек­ тов Только чтение. Возвращает объект, которому принадлежит коллекция. Например, коллекция References принадлежит объекту VBProj ect. Объекты, не принадлежащие коллек­ циям, предоставляют свойство Parent Только чтение. Возвращает объект редактора Visual Basic Editoг, аналогичный объекту Application в объектной модели Excel ·~;'-' i..:'·,~. · . ~~~.: .,>, · ---. ~"<·.4:CU~:f'':f4•"' t--- ·: .'<~/<""'\ , ~- ·' •,< ;;f ·t:_: . ~'.•'::,,· . #<t:' КоhлекЦии ;мо~нр :во~::прИнимать; ..как • средстцаГру~п~1ровкИ похоЖ~х ·объектов: НаnрИмер; < если ~~обхоNoмо хранить инФdР'маЦию из · теriе'фС:>нноrс; справо'!ника, ··можнЬ создать _класс' объектов, содержащИх всю контактную · инфор}\Л~~ик:j 'для ·одноrо . ч'е~Овека. Посh; . ~того коплек~иЮ мо~но испоЛь36вать дhя группироJ!ки··~сех ,записей ;·с 'контактной инфор~а~Йей. КоЛЛ~кЦ'ия .лозв9nЯет применять Цикл Fqr :Ea<::h для перебора. в нeii"~cex записей. · . 4 : ;· ' i~ ~ . /''.>О;. . ·-·""· "_·.;··- . ·,:o,:·.:i? , -.'· -: .·. ;·":;.·. , ' < , ~- •• Большинство объектов из объектной модели VВЕ хранятся в соответствующих коллек­ циях. Обычно название коллекции представляет собой множественное число от названия объекта в коллекции. Для простоты каждый объект и связанная с ним коллекция будут рас­ сматриваться в одном и том же разделе. Общие свойства и методы коллекций совпадают со свойствами и методами из коллекции Excel и характеризуются в приложении А. Для каждо­ го объекта будут описываться только уникальные свойства, методы или события . Объект Addln и коллекция Addlns Не стоит путать этот объект с объектом Addin из объектной модели Excel. Надстрой­ ки VВЕ представляют собой динамически загружаемые библиотеки, построенные в соот­ ветствии с архитектурой Micгosoft Component Object Model. Надстройки VВЕ более из­ вестны, как "надстройки СОМ". Обычно такие надстройки создаются с помощью С++, Visual Basic или любого из языков, основанных на инфраструктуре .NET Fгamewo1·k. Ус­ тановленные надстройки перечисл_ены в списке в окне VBE _Add-lns. Для загрузки и вы­ грузки надстроек VВЕ можно воспользоваться командой меню Add-lnsqAdd-ln Manager (НадстройкиqДиспетчер надстроек). Некоторые надстройки VBE используются в качестве инструментов для генерации кода, средств просмотра API с генерацией операторов Declare для методов Win32 API и т.д. Для редактора VВЕ созданы тысячи надстроек, многие из которых можно найти на сайте компании Micгosoft. Общие свойства объекта Addln Определения свойств Col l ection и VВЕ приводились в начале приложения.
962 Приложение Б Свойства объекта Addln Имя Connect Тип возвращае- Описание мого значения Boolean Сообщает, активизирована ли !"iадстройка СОМ. Для за­ пуска надстройки свойство устанавливается в значение True. Это свойство похоже на свойство Installed объ­ екта Excel Addin Description String Текстовая строка, которая отображается в поле Descriptioп (Описание) в окне VBE Addiп Мапаgег Guid String Только чтение. Возвращает глобально уни кальный иденти­ фикатор надстройки, 'создаваемый ExcelNisual Basic при компиляции надстройки . Глобально уникальный идентифи­ катор генерируется на основе нескольких параметров. Ге­ нерация двух одинаковых глобально уникальных идентифи­ каторов на одном компьютере практически невозможна Object Progid String Для предоставляения объекта в редактор VBE использу­ ется метод onconnection ·(обычно предоставляется кор­ невой класс собственной объектной модели, если такая модель существует) . После этого для доступа к объекту используется свойство Obj ect, посредством которого можно получить доступ к остальной объектной модели надстройки. На данный момент свойство Obj ect боль­ шинством надстроек не предоставляется Только чтение. Возвращает программный идентификатор надстройки, который состоит из имени проекта надстройки и имени класса подключения (обычно конструктора под­ ключения) . Например, если создается проект надстройки MyAddin и класс De.signer для надстройки называется dsrMyConnection, программный идентификатор будет выглядеть, как "MyAddin. dsrMyConnec tion" Методы коллекции Addlns Имя Item Updat e Тип возвращае- Описание мого значения Addin Только чтение. Параметры : I tem As variant . Возвра­ щает надстройку. В качестве параметра используется но­ мер или программный идентификатор надстройки (например MyAddin. dsrMyConnectio n) Метод. Обновляет список доступных надстроек СОМ на основе данных из системного реестра. Ис пользуется только при автоматической компиляции надстройки (например, с помощью метода VBProj ect.Ma k eCompil edFile) Примеры использования надстроек В следующем примере код перебирает надстройки, зарегистрированные для исполь­ зования в редакторе VВЕ, и выводит информацию об активных надстройках. 1 1
Объектная модель VВЕ 963 Обратите внимание, что надстройки для редактора VВЕ не предоставляют свойства для определения имени надстройки. Объект CodeModule Объект CodeModule содержит весь код для объекта VBComponent (например , моду­ ля, диалогового окна UserForm, модуля класса или листа Excel). Для каждого компонен­ та может существовать только один объект CodeModule. Методы и с войств а этого объ­ екта позволяют находить, идентифицировать, модифицировать и добавлять строки кода компонентов проекта. В модуле может существовать больше одной процедуры с одним и тем же именем, если эти процедуры являются процедурами свойств (Property). ~едовательно, для уникальной идентификации процедуры необходимо предоставить как ее имя (в данном случае "TheSelection"), так и тип интересующей процедуры (vbext_pk_ Get для процедуры P roperty Get, vbext_pk_Let для процедуры Prope rty Let, vbe xt_pk _Se t для процедуры P r ope rty Set или vbext_pk_proc для подпро­ грамм и функций). Функция ProcOfLine предоставляет эту информацию для указанного номера строки - имя процедуры во:;~вращается из функции, а тип процедуры возвращается в переменную, предоставляемую в качестве аргумента ProcKind. Это одно из нескольких свойств в Office 2002, модифицирующих предоставленные аргументы . Общие свойства объекта CodeModule Определения свойств Parent и VВЕ приводились в начале приложения.
964 Приложение Б Свойства объекта CodeModule Имя Тип *fОзвращае­ мого значения CodePane CodePane CountOf- Long Declaration- Lines CountOfLines Long Lines String Name String ProcBodyLine Long ProcCount- Lines Long Описание Только чтение. Возвращает активный объект CodePane для модуля . Если видимый объект CodePane не сущест­ вует , он создается и выводится на экран. Обратите вни­ мание, что объект CodeModule может содержать до двух панелей с кодом, но коллекция CodePanes не создается Только чтение. Возвращает количество строк в начале модуля, содержащих операторы Dim, Туре и Opt ion. Ее- · ли такие строки присутствуют в начале модуля, располо­ женные за ними комментарии рассматриваются как часть следующей процедуры. Следующий код содержИт две строки с объявлениям и: Option Explicit Dim msSelection As String 'Комментарий Sub ProcedureStart() Если такие операторы отсутствуют, комментарии в начале модуля перед пустой строкой считаются частью объявлений. Следующий код содержит только одну строку объявлений: 'Комментарий Sub ProcedureStart() Если после комментария немедленно следует определение процедуры, комментарий включается в состав процедуры, поэтому этот код не содержит строк объявления : 'Комментарий Sub ProcedureStart() Только чтение . Возвращает общее колйчество строк кода в модуле . Продолжен ие строк считается отдельными строками Только чтение. Параметры : startLine As Long, count As Long. Возвращает блок кода начиная от строки, на ко­ торую указывает параметр StartLine . Количество строк указывается в качестве значения параметра Count (Скрытое свойство) Только чтение. Возвращает имя свя ­ занного объекта vвcomponent Только чтение. Параметры: ProcName As String, ProcKind As vbext_ProcKind. Возвращает номер строки, н а которой расположено нач ало процедуры, не включая комментарии перед процедурой. Другими слова­ ми, свойство возвращает номер строки, в которой распо­ ложено ключевое слово Sub, Function или Property Только чтение . Параметры : ProcName As String, ProcKind As vbext_ProcKind. Возвращает количество строк, составляющих процедуру, от комментариев перед началом процедуры до оператора End· sub, End Function или End Property
Имя ProcOfLine Объектная модель VВЕ 965 Тип возвращае- Описание мого значения String Только чтение. Параметры Line As Long [ in], ProcKind As Long [outJ. Возвращает имя процедуры, в пределах которой находи:rся строка. Аргумент ProcKind модифицируется для предоставления информации о типе процедуры (SuЬ/Function, Property Let, Get или Set). Обычно это свойство вызывается в первую очередь, а полученные в результате вызова имя и тип процедуры используются для вызова других методов ProStartLine Long Только чтение. Параметры: ProcName As String, Procкind As vbext_ProcKind. Возвращает номер строки, в которой начинается процедура, включая коммен­ тарии. Разность ProcBodyLine-ProcStartLine равна количеству строк комментариев перед началом процедуры Методы объекта CodeModule Имя AddFromFile AddFrom- String Create- EventProc DeleteLines Тип возвращае- Параметры мого значения Описание Long FileName As String Читает код из текстового файла и добавляет его в конец модуля кода. Уникальность имен проце­ дур в пределах модуля кода не проверяется String As String Добавляет код из строки в конец модуля кода EventName As Создает в модуле пустую пpoцe­ String , Obj ectName дуру обработки события, автома- Аs String тически указывая параметры со­ бытия. Свойство не может ис­ пользоваться для стандартных модулей, так как они не поддер­ живают обработку событий. Па­ раметр Obj ectName должен со­ держать имя допустимого для модуля класса объекта. Пара­ метр EventName должен содер­ жать допустимое название собы­ тия для указанного объекта StartLine As Long, Count As Long Удаляет строки из модуля кода начиная со строки, на которую указывает параметр StartLine. Количество удаляемых строк ука, зывается в качестве значения параметра count . (
966 Приложение Б Имя Find InsertLines ReplaceLine Тип возвращае- Параметры мого значения Boolean Target As String , StartLine As Long, StartColumn As Long, EndLine As Long, EndColumn As Long, WholeWord As Boolean, MatchCase As Boolean, PatternSearch As Boolean Line As Long, String As String Line As Long, String As String Описание Находит строку в модуле кода или раздел модуля кода. Свойст­ во предоставляет ту же функцио­ нальность, что и диалоговое окно Fiпd (Найти) в редакторе VBE Добавляет код из строки внутрь модуля кода перед строкой, на которую указывает значение па­ раметра Line Добавляет код из строки внутрь модуля кода, за.меняя строку, на которую указывает значение па­ раметра Line Пример использования объекта CodeModule В главе 14 приводится нескольк? примеров использования объекта CoQ.eModule. В следующем примере выполняется идентификация процедуры, внутри которой распо­ ложена указанная строка. При этом выводится тип, имя и количество строк в процедуре. · 's'liь :Wtiiёfii?roc{Г ~:· ·: · Dim iLine As Long, iProcKind As Long, lLineCount As Dim .sP:r;oc As string, sMsg As String . · · Dim · oлctivecм· As VBIDE.codeмadule ' lLine = , CLng (Inputвox ( "Which lin~?"}} ·, .·~ ' Отменена? Ц11.ine=ОThenExitSub' · ' Получи'l'ь имЯ · и тип пр.оцедуры в уJ<<:(занно:Й строке , ! · пр'и' этом меняется значение Параметра iProcKind t." 4 sProc = o~cti veCM. P:r:o'cOfLine ( lLin·e, .' iProcKind) . ±f ·si'r~c =· "" Then ;, '\J1,Мя процедурь1 не предоставлено; ' · в · разделе "объЯв ленИй . . . , . , sMsg ":= "Стрсща , ра~сl!оложена . в .' разде.Пе объяв.riений " . . ' iLineCouht =; · • oActiveCM. CouritOfDeclarationLines Else " . · . . . . , sмsq = "Строка · расположена в " :1'-цqказать тиП 'процедуры ... ., . Se1ect . Case · iProcкind .} tase vbext_P,к~Pro·c · . •., . sMsg· '= sMsg & . ' .' По'дпрограмме ·case .vbext_pk. Get » • . . . .. • . · .• ·, !>l1в9:.1: -~~ё.i~~ -·>: прqц~дУР~-~ Prqp~rty ~GE!J " ; , ..•
Объектная модель VВЕ 967 Объект CodePane и коллекция CodePanes Объект CodePane является представлением объекта CodeModule, предоставляющим доступ к уровню интерактивности между разработчиком и редактируемым кодом. Боль­ шинство надстроек VBE используют этот код , для идентификации текущего объекта CodePane и редактируемой в данный момент строки. После этого код i! этой строке мо­ дифицируется с помощью методов и свойств объектаСоdеМоdulе. Обратите внимание, что для одного объекта CodeModule может существовать больше одного объекта CodePane (например, При разделении окна кода на две панели с помощью горизонталь­ ного разделителя) . Общие свойства объекта CodePane Определения свойств Collection и VВЕ приводились в начале приложения. Свойства объекта CodePane Имя Тип возвращае- Описание мого значения CodeModule CodeModul e CodePaneVi ew vbext_Code- Paneview CoutOfVi- siЬleLines TopLine Window Long Long Window Только чтение . Возвращает объект CodeModule, который содержит код, показанный в объекте CodePane Только чтение. Возвращает необходимость вывода с по­ мощью объекта CodePane одной процедуры или целого модуля с линиями разделителей между процедурами Только чтение . Возвращает количество строк, видимых в объекте CodePane. Это свойство и свойство TopLi ne может использоваться для центрирования строк в окне объекта CodePane (дополнительная информация приво­ дится в следующем примере) Возвращает номер первой строки объекта CodePane в объекте CodeModule Толь ко чтение. Возвращает объект Window, в котором расположен объект или объекты CodePane
968 Приложение Б Методы CodePane Имя Параметры GetSelection StartLine As Long, StartColumn As Long EndLine As Long, EndColurnn As Long SetSelection StartLine As Long, StartColurnn As Long, EndLine As Long, EndColurnn As Long Show Описание Используется для получения выделенного текста . Все ар­ гументы передаются по ссылке и модифицируются внутри процедуры для предоставления выделения . Все аргумен­ ты являются обязательными, но они необходимы только для передачи аргументов для извлекаемых элементов. Например , для получения только первой строки можно воспользоваться: Dirn lStart As Long Application . VBE . ActiveCodePane .Get Selection - lStart, О, О, О Используется для установки положения выделенного тек­ ста. Обычно программы получают текущее выделение с помощью метода GetSelection, модифицируют выде­ ление и устанавливают выделенный фрагмент обратно с помощью метода SetSelection. Дополнительная ин­ формация по использованию этого свойства приводится в главе 23 в разделе, описывающем процедуру PrintProcedure Открывает и выводит на экран объект CodePane. При этом объект активизируется Свойства коллекции CodePanes Коллекция CodePanes содержит все открытые объекты CodePane из редактора VBE. Имя Тип возвращае- Описание мого значения Current CodePane .Только чтение. Возвращает активный объектCodePane. Сов­ падает со свойством Application. VВЕ .ActiveCodePane Примеры использования объекта CodePane В главе 23 приводилось несколько примеров использования объекта CodePane. В сл~дующем примере идентифицируется текущее выделение и выполняется центриро­ вание окна CodePane. 's1.iЬ"centveri::>"eTect:l"Qnr·n:wlild.6w о ~' · Dirn оСР As V.BIDE. CodePane Е . Dirn lStartLine As Long, lEndLine As Long r Dim lVisiЬleLines As Long, lNeWТop As Long t 'i,"' Получить а. кти13ный объект СоdеРапе ~. ~~t о'СР = Д.pplication.VBE.ActiveCodePane г!,, r.~: ' <, .С riомощь~о объекта ,CbdeParie . .. With оСР " . •riолучи~ь . первУJО и последнЮю · строки выделения < 0 • .Getse.lection. lStartLine, о, ' JEndLine, · о ',·_, : ;, ·, ' . Сколько строк помещае-тс·я в .окне? lVisiЫeLine?,> "' .GountOfVisiЫeLines
Объектная м,одель VВЕ 969 Объект CommandBarEvents В пределах редактора VВЕ свойство OnAction кнопки командной панели не играет никакой роли. Подпрограмма, на которую указывает это свойство, не запускается при щелчке на кнопке. Вместо этого объектная модель VBE предоставляет объект CoпunandBarEvents, который подключается к любой кнопке, включая встроенные и собственные элементы . При этом объект вызывает процедуры обработки выбранных событий. В пакете Office 2002 этот объект обеспечивает обработку только события С 1 i ck. Следовательно, объект предоставляет функциональность свойства OnAc t i on. Основным отличием является наличие аргументов, позволяющих модифицировать по­ ведение события Click. Кроме этого, объект CoпunandBarEvents предоставляет рас­ ширенный интерфейс, тем самым позволяя компании Mic!'osoft реализовывать более бо­ гатую модель событий в будущих версиях редактора VВЕ (например, BeforePupUp, Bef~reRightClick и стандартные события мыши). События объекта CommandBarEvents Имя Click Параметрьi CommandBarContr ol As Object, handled As Boolean, CancelDefault · лs Boolean Описание Возникает при щелчке на связанной кнопке командной панели. Параметр CommandBarControl передае~;ся в процедуру обра­ ботки события в качестве параметра. К одному элементу управ­ ления можно подключиться с помощью нескольких объектов CommandBarControl. События возникают в обратном порядке (событие, настроенное позднее, возникает первым) . Процедура обработки события может устанавливать параметр Handled в значение тrue, сообщая последующим обработчикам, что со­ бытие уже обработано. Кроме этого, объект CommandBarControl используется для подключения к встро­ енным элементам меню. Если событие обрабатывается кодом, параметр CancelDefaul t должен быть установлен в значение True, Это приведет к отмене нормальной операции обработки события пункта меню · Примеры использования объекта CommandBarEvents Добавьте следующий код в модуль клaccaCBarEvents. rPul}i,·~c:-ww'''"' .. '"'' nts''OcвE:vents' ~д5·: ~IDE : Commandf!arEv~Ы;J "Ще.тr'~ок на " & ComпtandBar~ontт'a1. CaptiOЛ;
970 Приложение Б Следующий код добавьте в обычный модуль. ;•·· onpe.z:ieir"i1тЬ кол.iiеКi.r.ИЮ , в· которой-·буДут храниться все : • экземпляры класса событий :DJ.m ocolMenus As New Collection ,,. . ' Объявить элементы управ'ления CommandBar Dim oBar As coпimandBar :Dim oBtnl_ · As CommandBarButton,. oBtn2 As ' ДобавИть объект, содержащий экземпляр Diin оСВЕ As CBarEv.ents · ' Получить панель меню · VВЕ Set oBar = Application.VВE.CornmandBars("Menu ·ваr") ' Добавить пункт в панель меню Set oBtпl = oBar.Controls.Add(Type:=msoControlButton, oBtnl.Caption = "Menμl" · oBtnl. Style = msoButtonCaption ' Со~дать . новый 'экземпляр обработ~)1ка CommandBarEvent Set оСВЕ = New CBarEvents • Связать обработчик CommandBarEvent с созданным пунктом меню Set, o~J:iE . oCBEvents. = Appli~ation. VВЕ. Events. CommandBarEver'lts (_oBtnl ') . < ' И добавить Экзе},1пЛяр •; обработчика события , для коллекции ~ ~ осоlМерщ:;. Add· оСВЕ ' Повторi1ть . Для второго меню : • _ Set, oBtn2' = oBar . Controls . Add (Туре: =ms.os;ontro~Button, .. · ; ~ teпiporary: =True) . ·, · oBtn2. Caption = · "Menu2" 'oвtn2 ' . Style . = msoButtonCaption · s et оСВЕ = . New CBarEvents Set oCBE.oCBEvents AppHcation.VBE.Events.C6mmandBarEvents(oBtn2) r: oc61Menus. Add' оСВЕ :EI]. _ sl 'руЬ_.:.__,..,:_; ";- ., При запуске подпрограммы AddМenus в стандартную панель меню редактора VВЕ до­ бавляется два новых меню. Для обработки событий Click новых пунктов меню исполь­ зуется класс CommandBarEvents. При щелчке на каждом из пунктов меню в окне lmmediate (Проверка) выводится заголовок пункта меню. Объект Events Объект Events является контейнером верхнего уровня для модели событий в редак­ торе VВЕ. В Office 2002 в этом контейнере хранятся объекты событий, связанные со щелчком на кнопках командных панелей и с добавлением/удалением ссылок. Модель расширения редактора VBE основана на модели расширения Visual Basic, которая содер­ жит больший набор событий.
Объектная модель VВЕ 971 Свойства объекта Events Имя Тип возвращае- Описание мого значения ComrnandBar- ComrnandBar- Events Events References- References- Events Events Только чтение. Параметры: ComrnandBarControl. Выпол­ няет необходимое связывание для подключения объекта ComrnandBarEvents к конкретной кнопке командной панели Только чтение. Параметры: VBProj ect. Выполняет необ­ ходимое связывание для подключения объекта ReferencesEvents к конкретному проекту \ Примеры использования объекта Events Примеры использования объекта Events приводятся в разделах, посвященных объ­ ектам CommandBarEvents и ReferencesEvents. Коллекция LinkedWindows В коллекции LinkedWindows хранятся все связанные окна в рабочем пространстве редак­ тора VВЕ. Надстройки СОМ, написанные с помощью Visual Basic 5/ 6 (но не в Office 2002 Developeг Edition), могут добавлять собственные окна в эту коллекцию. В среде Office возможность связывания встроенных окон ограничена. Обратите внимание , что при разрыве связи · с последующим связыванием встроенных окон они не возвращаются вис­ ходную позицию . Методы коллекции LinkedWindows Имя Add Remove · Тип возвращае- Описание мого значения Метод. Параметры: Window As Window. Связывает ука­ занное окно Метод. Параметры: Window As Window. Разрывает связь для указанного окна Объект Property и коллекция Properties Все объекты VВComponent в пределах проекта обладают коллекцией Properties. Хранящиеся в коллекции свойства соответствуют элементам, показанным в окне Properties в редакторе VВЕ. Коллекция Properties содержит многи е свойства объ­ ектов Excel, соответствующих объектамVВСоmроnеnt. Общие свойства объекта Property Определения свойств Collection, Parent и VBE приводятся в начале приложения.
972 Приложение Б Свойства .объекта Property Имя Тип возвращае- Описание мого значения IndexedValue Variant Name String Numindices Integer Object Object Value Variant Параметры: Index l, [ I ndex2] , [ IndexЗ ] , [ Index4 J. Значение свойства v alue объекта Pr operty представляет собой массив размером до четырех индек­ сов. Свойство IndexedVa lue позволяет прочитать один элемент возвращаемого массива Только чтение. Возвращает имя свойства . Кроме этого, используется для обращения к конкретному свойству Только чтение. Если значением объекта Property явля­ ется массив, это свойство возвращает количество индек­ сов (размерностей) массива. Если значение не является массивом, это свойство возвращает значен ие О Сво й ство Obj ect используется для получен ия ссылки на объект, извлекаемый из объекта Property Значение объекта Property Свойство Name может легко ввести в заблуждение. Элемент Ссылается на Worksheet . CodeName . Кодовое им я объекта vвcomponent (только чтение) VBComponent.NArne Кодов ое им я объекта VBComponent (чтение/запись) VБC0111ponent. Properties ( " CodeNa.me" ) Кодовое имя объекта vвcompone nt (только чтение) VBComponent. Properties ( " _CodeName ") Кодовое имя об;оекта vвcompone nt (чтение/запись) vвcomponent. Proper'ties ( "Name") Имя листа (чтение/за пись) VBComponent. Properties ( "Name " ) . Name "Name" Примеры использования объекта Property В этом примере идентифицируется лист, содержащий указанный объектVВСоmроnеnt . . ~suь:~~e~~~fr:o~:~~~~~ · ~" ' получить книгу; содержащую указанный объект Vвcornponent . . Se\: oBk,. : . A p p l ication >VBE. ActiveVВProj ect . VBCornponents ( "Sheetl.'' ) .' ~~Pr?p'e:i:ties ( "Par.ent ") · · · · ~.. O~Je~t . !. ! . !1sgвщ pBk .·Name l&.ш'!:.fii»ь • Это еди:пствепный надежный способ из.м.енения кодово.го имени листа в Excel 97.
Объектная модель VВЕ 973 Объект Reference и коллекция References Объект Reference связывает проект VВProj ect и внешний файл, который может быть объектной библиотекой (например, при связывании с объектной библиотекой WoI"d), элементом управления (например, Windows Common Contl"ols), динамически подключаемой библиотекой ActiveX или еще одним проектом VBProj ect. Создание ссылки на внешний объкт позволяет осуществить раннюю привязку. Это значит, что объект, на который ссылается проект, будет находиться в той же области памяти, все связи будут проверяться на этапе компиляции, и Excel предоставит всплывающие под­ сказки при программировании с использованием связанных объектов. При запуске приложения на другом компьютере оно может не обнаружить всех необ­ ходимых объектов. Объект Reference и коллекция References предоставляю"I; доступ к таким ссылкам, позволяя проверить существование всех необходимых файлов перед их использованием. Общие свойства объекта Reference Определения свойств Collection и VВЕ приводились в начале приложения. Свойства объекта Reference Имя Builtin Description FullPath Guid IsBroken Major Minor Name Туре Тип возвращае- Описание мого значения Boolean String String String Boolean Long Long String RefKind vbext_ Только чтение . Указывает, является ли ссылка встроенной или она была добавлена разработчиком. Ссылки на биб­ лиотеки "Visual Basic for Applicatioпs" и "Microsoft Excel 1О .О Object Library" являются встроенными и не могут быть удалены Только чтение. Возвращает описание ссылки, текст которо­ го приводится в окне Object Browser (Просмотр объектов) Только чтение . Возвращает путь к книге, файлу DLL, фай­ лу осх, файлу TLB или файлу OLB, на который указывает ссылка Только чтение . Возвращает глобально уникальный иден­ тификатор ссылки Только чтение. Возвращает значение True, если ссылка . недействительна (соответствующий файл отсутствует на компьютере) Только чтение. Возвращает номер основной версии файла Только чтение. Возвращает номер дополнительной вер­ сии файла Только чтение. Возвращает короткое имя ссылки (например, "VBA" или "Excel ") Только чтение. Возвращает тип ссылки. vbext_rk_TypeLib для библиотек DLL, vbext_rk_Proj ect для других проектов VBProj ect
974 Приложение Б Методы коллекции References Имя Тип возвращае- Описание мого значения AddFromFile Reference Метод. Параметры: FileName As String. Добавляет в VBProj ect ссылку на конкретный файл. Этот метод ис­ пользуется только для создания ссылок на книги AddFromGuid Reference Метод. Параметры: Guid As String, Major As Long, Minor As Long. Добавляет в VBProj ect ссылку на кон­ кретную библиотеку DLL, библиотеку типов и т.д. Имя файла библиотеки, ра.сположение и номер версии могут измениться со временем, но постоянство глобально уни­ кального идентификатора гарантировано. Следовательно, глобально уникальный идентификатор должен использо­ ваться при добавлении ссылки на библиотеку DLL, биб­ лиотеку типов и т.д. Если интересует конкретная версия библиотеки DLL, можно запросить основной и дополни­ тельный номера версий Remove Метод. Параметры: Reference As Reference. Удаляет ССЬIЛКУ ИЗ проекта VBProj ect События коллекции References Коллекция References предоставляет два события, используемые для обнаружения добавления и удаления элементов коллекции . Например, данные события можно приме­ нять для создания диалогового окна "Десятка популярных ссылок" . Для этого события объекта Application используются для обнаружения открытия или создания книги, а события коллекции References . из объекта VВProj ect - для обнаружения добавления конкретной ссылки в проект. Список таких ссылок можно сохранить и выводить в диало­ говом окне, похожем на диалоговое окно Tools9References (Сервис9Ссылки) в редак­ торе VВЕ (но без ненужной дополнительной информации). Имя IteritA.dded Параметры Reference As VBIDE.Re f e rence ItemRemoved Reference As VBIDE.Reference \ Описание Возникает при добавлении ссылки в интересующий проект Возникает при удалении ссылки из интересующего проекта Примеры использования объекта Reference В этом примере выполняется проверка отсутствующих ссылок. При наличии таких ссылок выводится сообщение для пользователя . .Func'-f:t'Ъ·п· нasМ:i.ssing:~:fs { i~ AsAвooi ean ; Dim - oRef As VBIDE.Reference · •, Перебрать в~е ссылки в проекте · Eacli o:Re$ In· 'ThisWorkbook . VBProj.ect·. References. ··· от~утств~~Й файл?
Объе~тная модель VВЕ 975 В следующем примере показан основной код слежения за добавлением или удалением ссылок в проекты (этот код может использоваться для создания списка 10 популярных ссылок). Реализация кода состоит из четырех этапов: О вначале необходимо подключиться к событиям коллекции References объектов VВProj ect во всех открытых книгах; О далее подключиться к событиям объекта Application для обнаруже~ия откры­ тия или создания книги; О при создании или открытии книги подключиться к событиям коллекцииRеfеrеnсеs объекта VВProj ect; О при возникновении события References выполнить соответствующую опера­ цию (в данном случае просто вывести сообщение). Этот код добавляется в модуль класса CRe fEvent s ~ реализует четвертый этап. Следующий код добавляется в модуль клaccaCAppEvents и реализует третий этап .
976 Приложение Б su.ь· aд.:P.P_:N;iwwork:Ьook(вyvai "wь ii.s wo rJёbook.J " » обработчика со9ь1тий для коллекции References New CRefEvents ' Указ-ать, к какой книге подключается обработчик Set ·;· oRefEvents. oworkЬook = WЬ ~ ;:·Пред6стаI?ить объект References Set oRefEvents; oRefEvt .= \'Jb. VBProj ect. Refererices i·· ".. Добавить ·обработЧик событий в коллекцию обработчиков !\! oRef!-looks .Add oRefEvents ;End Sub ~ i ' Подключится к- событиям коллекции References от·крытых . книг !Private Sub oApp_WorkbookOpen ( ByVal wь , ·дs Workbook) · J?iin . oRefEvents · As . New CRefEvents Set oRefEvents.oWorkЬook = WЬ .Set oRefE.vents. oRefEvt = WЬ. Vf!Proj ect. References oRefHooks . .l}.dd o~efEvents . Данный код добавляется в нормальный модуль и реализует первый и второй этапы. f':' оДi:!н 'ЭкЗ'емiiiiЯр подключения к событиям об'ЬеК.та ' i\,ppll.ca,Цon i puЫic oAppHooks As New CAppEvents Е ' Б.олъшое количество экземпляров подключений к событиям ~ · коллекЦ11и References . . ' PuЬlic oRefHooks .As New Collection ~.. . .:: . ' fsub SetUpReferenceHooking () ! Dlm oRefEvents As CRefEvents 1· · Dim oBk As Workbook t set 6RefHooks = No.thing ~ / : 'Э'.\'ar'I 1: Перебрать все ; к ·. событиям . ссыЛо:к For<'Each oBk ·In· Workbooks суще _ствующие_ r:роекты и подключится. · If Not oBk Is Thi~Workbook Then Set oRefEveЪts ·= New CRefEvents s€t oRefEvents. oWorkbook = oBk :~ Set oRefEvents.oRefEvt = oBk.VBProject.Referehces i' oRefHooks.Add oRefEvents .~.·.. , Nex~nO ±f ~- ! . · этап · 2: Подключиться к со.бытия.м ·объекта ApP,lication и r·· ' за · добавлением новых проектов г. . Set, oAppHooks . оАрр - Application 1End Sub ' • ,._ '" ,,... '·~·.< Объект ReferencesEvents Так же, как объект CommandBarEvents предоставляет событие Click для команд­ ной панели, объект ReferencesEvents предоставляет два события для коллекции Reference s из объекта VВProj ect. Объект ReferencesEvents может показаться из­ быточным. Все обрабатываемые· им события предоставляются коллекцией References
Объектная модель VВЕ 977 из объекта VВProj ect. Единственным отличием (кроме определения) является работа объекта ReferencesEvents с объектом VВProj ect, а не с коллекцией References из объекта VBProj ect. Обратите внимание, что проект VВProj ect компилируется при добавлении или удалении объекта Reference, что приводит к потере всех переменных и экземпляров классов. Следовательно, объект VВProj ect не может контролировать собственные события для коллекции References. События объекта ReferencesEvents Имя Тип возвращае­ мого значения Описание / ItemAdded Reference As Возникает при добавлении объекта Reference в кoн­ VBIDE. Reference тролируемый проект VBProj ect ItemRemoved Reference As Возникает при удалении объекта Reference из контро- VВIDЕ. Reference лируемого проекта VBPro j ect Примеры использования объекта ReferencesEvents Примеры использования объекта ReferencesEvents не отличаются от примеров использования событий коллекции References. Единственное отличие · заключается в способе обработки событий (этот код выделен полужирным шрифтом). В класс CRefEvents необходимо добавить следующий код: бЪеi<·т ·wlthБvent.S'· п~0з·волЯе>.Г'-по:дкЛЮЧй~СЯ~к~ёобЫiИЯ " , ' , '. . .: . ··, .·>''·} ·::: ' ·<··. : ';. ' '',_ ., . к9ллекции Reference..s +" "' ", ,С·>,;.,."·, . ,:~ .. ubl'ic· Wit:hEy ents . оRеЦ: As VВIDE: Ri;ф;;X:erices Evi;!nts · .г : ··· .i• . ,;\, "' " "" .-~.,;f,<;.,~."h·<' ·,~-'"''у>,-. . ., .. . . .~ . ,. . ,.,.,,~;.,,,...", •• "'";·' ' · _,,· ' NNN,. .. . . . . .. .. - М .. " ... .... ...~-···•"''"•··'~- ,_, ,.., ; .v..;;;#,-.N _ . ., ".. . . "-~ ."...".,,,_,"_,,,,..-.-,,..,-.",,W;;.,",",,.,~,--;;#"~:~.W.-;.,>0<.~Л•ii;;:," В класс CAppEvents необходимо добавить такой код: ·-:пс;дключи;гс:я :.'к"·соеЫтИЯ!-.i".R'оЛiiекliиИ ''Rer··· rivate Sub . oApp_Workbo6kopen ( ByVa;l •' w Dim" oRefEvents As New . CRefEvents ' · --' ·' ;,_,..1~~ -:-'\- .,;: ' . Следующий код необходимо добавить в нормальный класс: tsеr~· бi:tё'П:vёПЪБ: oworkЬ,OOJ<? ;;; 'QБг ~· · ·:·,·:~·, ., \Set 9Re.f.Evepts. oRefEvt =· -:- '' · , , , . ... ~:'....~P~!:'?:~~~;:<?~::.YJЗE~~Y!з.~.t::~,~!t~~er!ЭE~.~~:itY~I?:~:~.(o~. Объект VBComponent и коллекция VBComponents В коллекции VВComponents хранятся все модули, модули классов (включая код листов) и диалоговые окна UserForm из проекта VВProj ect. Все эти компоненты являются различ­ ными типами объекта VВComponent . Каждый объект VВComponent хранит код в объекте Codeмodule, а некоторые объекты VВComponent (например, диалоговые окна UserForm)
978 Приложение Б обладают графическим интерфейсом , который называется конструктором (Designer). Кон­ структор предоставляет возможность модификации графических элементов объекта VВComponent, например, добавления элементов управления в диалоговое окно UserFoпn. Общие свойства объекта VBComponent Определения свойств Collection и VВЕ приводились в начале приложения. Свойства объекта VBComponent Имя CodeModule Designer DesignerID Designer- Window HasOpen- Designer Narne Properties Saved Туре Тип возвращаемого Описание значения CodeModule String Window Boolean String Prope rties Bo olean vbext_ Cornponen t- Type Только чтение. Возвращает объект CodeModule, в ко­ тором хранится код VBA Только чтение. Возвращает объект Designer, предо­ ставляющий доступ к граф ическим элементам на эта­ пе проектирования Только чтение. Возвращает идентификатор объекта Designer , что позволяет определить тип конструкто­ ра . Например, идентификатор конструктора для диало­ гового окна UserForrn равен Forrns. F orrn. Идентифи­ катор конструктора для AddinConnection в Office 2002 Developer Editioп равен MSAddnDr . AddinDesigner Только чтение. Возвращает объект Window, представ­ ляющий окно конструктора . (В окне Object Browser (Просмотр объектов) это свойство показано как метод, так как оно открывает окно Wi ndow, если оно еще не открыто) Только чтение. Указывает, открыт ли конструктор ком­ понента Имя объекта vвcornponent ' Только чтение. Возвращает коллекцию P rope rties, которая предоставляет доступ к свойствам из окна Property (Свойства) и свойствам связанных объектов • Excel, если объеКт vвcornpo nent содержит код для объекта Excel. Дополнительная информация приво­ дится в описании объекта Propert;y Только чтение . Возвращает присутствие несохранен­ ных изменений в объекте VB Co rnp o nent . Это свойство аналогично свойству Saved книги Excel, но применя ­ ется к каждому объекту vвcornponent по отдельности Только чтение. Возвращает тип объекта VBCornponent. vbext_ct_StdМodule - нормальный модуль vbext_ct_Cl a s sModule - модуль класса v b ext_ct_MS F orrn - диалоговое окно UserForrn v b ext c t _Docurnent - объект Excel v b e xt_ct_ ActiveXDesigner - все остальные типы
Объектная модель VВЕ 979 Методы объекта VBComponent Имя Activate Export Параметры FileName As String Описание Отображает основное окно (модуль кода или конструктор) объекта vвcomponent и делает его активным Сохраняет объект vвcomponent в файле отдельно от книги Методы коллекции VBComponent Имя Add AddCustom Import Remove Тип возвращае- Описание мого значения VBComponent VBComponent VBComponent Параметры: ComponentType . Добавляет в проект новый встроенный объект vвcomponent. Параметр componentType может иметь значение vbext_ct_StdМodule,vbext_ct_ClassModuleили vbext_ct_MSForm Параметры: Progid. Добавляет в проект новый невстро­ енный объект. В результате всегда возвращается тип vbext_ct_ActiveXDesigner. Похоже, что невстроенные компоненты Visual .Basic могут добавляться только в про­ екты ActiveX DLL, но не в проекты книг Excel Параметры: FileName. Добавляет в проект новый объект vвcomponent из файла (обычно это экспортированный ранее объект VBComponent) Параметры: vвcomponent. Удаляет объект vвcomponent из проекта Примеры использования объекта VBComponent Объект VВComponent и его свойства и методы используются во многих примерах в этом разделе и в главе 23. Следующий код экспортирует диалоговое окно UserForm из содержащей код книги, импортирует диалоговое окно в новую книгу и переименовывает диалоговое окно . После этого код добавляет стандартный модуль, код для вывода диало­ гового окна и вызывает подпрограмму, выводящую диалоговое окно в новой книге.
980 Приложение Б 9бlfJ3й·тЬ кбii ' о'тобр'ажёнИЯ диалогового окна в стандартнЬlй модуль cвo.'cq'deModu1e. AddFromstring _ ·~:.,;·; ; • SuЬ ShowMyForm() " . & vbCrLf· & ··4;-.,, '"\, :MyForm. Show" · & vbCrLf & _- . "End .Sub" & vbCrLf .Эакрь1ть панель кода ,с которую Excei · открыл при добавлении ' ··:·,k'ода в модуль .·· . oVEC.CodeModule.CodePane.Window.Close !·У·. ' Удалить эксцортИрованный , файл ('·,·~ill "с;: .\ temp. frm" ~i i · .. ' .~ызвать новую подпрограмму Для ото\)ражения импортированного f ' диалогового окна UserForm [ , · Ap pJ ,ic aЧ on. Ru n oNe.;,;Bk.Name & "! ShoW;;1YForm" l~!1"9~,;,.$~,!?.:l....AC . j.~A· ;М.•. .w. .~н: .... ~- ~~·:· ~- .r:~ ~N~ :,<Мi·~ ·::,.,_,A..$..:t;.,»:.:...И."~d.:-0:.. ~.\.;иЖ~ Объект VBE Объект VВЕ находится на вершине объектной библиотеки VВIDE и является анало· гом объектаАррliсаtiопиз объектной библиотеки Excel. Этот объект выступает в роли контейнера для командных панелей, надстроек, окон и других компоне_нтов среды разра· ботки Visual Basic. Кроме этого, объект VBE предоставляет информацию об объектах, ко· торые в данный момент модифицируются пользователем. К сожалению, этот объект не предоставляет доступ к параметрам среды разработки VВIDE (параметры кода, форма;.ы редактирования, обработка ошибок) и к событиям редактирования (например , выделе· ние различных проектов, добавление или удаление строк кода и т.д.) . Свойства объекта VBE Имя Тип возвращае- Описание мого значения ActiveCode- CodePane Pane ActiveVB- VBProject Project ActiveWindow Window · Addins Addins Устанавливает/возвращает объект CodePane, который в данный момент редактируется пользователем . Обычно это свойство используется для идентификации обрабаты­ ваемого объекта или для принудительного переключения пользователя на обработку конкретного объекта CodePane Устанавливает/возвращает выделенный в окне Project Exp lorer (Окно проекта) объект VВProj ect. Если в окне вы­ деле н объект vвcomponent, то это свойство возвращает объект VBProj ect, содержащий выделенный объект Только чтение. Возвращает активный объект Window, ко­ торый может соответствовать панели кода, конструктору или одн6му из окон VBIDE (например, окну Project Explorer, окну lmmediate и т.д.) Только чтение . Возвращает коллекцию всех надстроек СОМ, зарегистрированых для использования в среде раз­ работки VBIDE. Дополнительная информация приводится в описании объекта Addin
Имя CodePanes CommandBars Events MainWindow SelectedVB- Components VBProjects Version Windows Объектная модель VВЕ 981 Тип возвращае- Описание мого значения CodePanes CommandBars Events Window VBComponent VBProjects String Windows Только чтение . Возвращает коллекцию всех открытых объектов CodePane в среде разработки VBIDE. Дополни­ тельная информация приводится в описании объекта CodePane Только чтение. Возвращает коллекцию всех командных панелей в пределах среды разработки VBIDE Только чтение. Возвращает объект, содержащий все со­ бытия в среде разработки VBIDE. Дополнительная ин­ формация приводится в описании объекта Ev ents Только чтение . Возвращает объект Window, представ­ ляющий основное окно среды разработки VBIDE Только чтение. Возвращает объект vвcomponent, выде­ ленный в окне Project Explorer. Обратите внимание, что обычно (но не всегда) значение этого свойства совпадает со значением свойства ActiveCodePane Только чтение . Возвращает коллекцию всех объектов VBProject в пред~лах среды разработки VBIDE. Это ка­ сается как книг Excel, так и библиотек ActiveX DLL Только чтение . Возвращает номер версии библиотеки ExteпsiЬility (д:Пя пакета Office 2002 выводится номер вер­ сии 6.0) Только чтение . Возвращает коллекцию всех открытых . окон в среде разработки VBIDE. Дополнительная инфор­ мация приводится в описании объекта Windo ws П римеры использования объекта VBE Большинство примеров в этом разделе и в главе 23 используют свойства объекта VВЕ . Следующая строка кода запускает редактор VВЕ: [~pp~•i.ё.~fif>!l:,~YJЗ~~~·м;r~I:iй~P.119:~:.;.:y~ffi.!l5IEi~::;::~.:тI.Ч~~~;m~,~J21ilКЛ:':!Jl[;Sk121:~;ьv;::::;;r":;L~ТJ::;ьr:~:~rt Объект VBProject и коллекция VBProjects Объект VBProj ect предст авляет весь код в пределах книги, включая код листов, мо­ дулей, модулей классов и диалоговых окон UserForm. В п акете Office 2002 DevelopeI Edition объект VВProj ect может быть отдельным проектом и поддерживать компиля­ цию в виде библиотеки Activ eX DLL. Общие свойства объекта VBProject Определения свойств Collection и VВЕ приводились в начале приложения .
982 Приложение Б Свойства объекта VBProject Имя Тип возвращае- Описание мого значения BuildFile- Name String Description String FileName String Help- Long ContextID HelpFile String Mode Name Protection References Saved vbe x t_VBAМode String vbext Project Piotection References Boolean Используется только . для библиотек ActiveX DLL. Устанав­ ливает/возвращает имя файла DLL, в который компилиру­ ется проект Используется только для библиотек ActiveX qLL. Устанав­ ливает/возвращает описание библиотеки DLL, которое доступно в списке из диалогового окна Too l sc:>Refereпces (Сервисс:>Ссылки) Только чтение . Для проектов книг возвращает полное имя книги. Для проектов ActiveX DLL имя файла с исходным кодом проекта (*. vba). Если файл еще не сохранялся, при попытке чтения значения этого свойства возникает ошибка времени выполнения Идентифицирует пр инятый по умолчанию идентификатор контекста в файле справочного руководства для проекта Устанавливает/возвращает файл справочного руковод­ ства для проекта. Каждому диалоговому окну UserForm и элементу управле1-1ия в пределах проекта можно при­ своить собственный идентификатор контекста, что позво­ лит получить доступ к соответствующим разделам в фай ­ ле справочного руководства Только чтение. Возвращает режим работы объекта VBProj ect (проектирование, выполнен и е , остановка). Обратите вниман ие, что разные объекты VBProject мо­ гут работать в разных режима х выполнения одновременно (например, проект надстройки ActiveX СОМ может выпол ­ няться в то же время, когда другой проект находится в ре­ жиме проектирования) Возвращает имя проекта Только чтение. Возвращает необходимость блокИровки проекта для просмотра . Заблокированные проекты пре­ достав л яют доступ только к объекту VBPro j e ct. Любая попытка перемещения на уровни ниже VBProj ect приво ­ дит к появлению сообщения об ошибке . Обратите внима­ ние, что если на объект VBProj ect установлена защита, но во время пользовательского сеанса она была снята, свойство Protection возвращает значение ' vbext__pp _none на протяжении всего сеанса Только чтение . Возвращает коллекцию объектов Reference для объекта VBProj ect . Дополнительная информация приводится в описании коллекции Ref erences Только чтение. Указывает на присутствие в объекте VBPro j ect изменений, внесенных после последнего со­ хранения. Для проектов Excel значение это го свойства совпадает со значением свойства Saved объекта книги
Имя Туре Объектная модель VВЕ 983 Тип возвращае- Описание мого значения vbext_ ProjectType Только чтение. Возвращает тип проекта - собственный проект (книга Excel, документ Word, база данных Access) или.проект ActiveX DLL VВComponents VBComponents Только чтение . Возвращает коллекцию vвcomponents для проекта. Дополнительная информация приводится в описании коллекции vвcomponents Методы объекта VBProject Имя Make- Compi led- File SaveAs Тип возвращае- Параметры Описание мого значения Только для проектов ActiveX DLL. Компили­ рует проект и создает файл библиотеки DLL FileName As Только для проектов ActiveX DLL. Coxpa- String няет проект в файле Методы коллекции VBProjects Имя Add Remove Тип возвращае- Описание мого значения VBProject Метод. Параметры : Туре. Добавляет новый проект в сре­ ду разработки VBE. С помощью этого метода можно до­ бавлять только изолированные проекты (библ иотекИ ActiveX DLL) Метод. Параметры: lpc As VBProj ect. Удаляет объеКт VBProj ect из среды разработки VBE. Используется толь­ ко для проектов ActiveX DLL Примеры испсщьзования объектов VBProject Большинство примеров в этом разделе используют объектVВРrоj ect и его свойства. В этом примере перечисляются имена всех объектов VВCornponent для всех незаблоки­ рованных проектов в среде разработки VВЕ.
984 Приложение Б Объект Window и коллекция Windows Объект Window соответствует одному окну в редакторе VВЕ, включая основное окно редактора, встроенные окна Project Explorer (Окно проекта), lmmediate (Проверка), Debug (Отладка) и окно Watch (Контрольные значения ), а также диалоговые окна для объектов CodePane и Designer. Общие свойства объекта Window Определения свойств Collection и VВЕ приводятся в начале приложения. Свойства объекта Window Имя Тип возвращае- мого значения Captior'l String Height Long HWnd Long ,, Left Long Linked- Window WindowFrame Linked- LinkedWindows Windows Тор Long Туре vbext WindowType VisiЫe Boolean Width Long WindowState vbext WindowState Описание Только чтение . Возвращает заголовок окна, показанный в строке заголовка Устанавливает/возвращает высоту окна в твипах (1 твип = 1/20 пункта). Не оказывает влияния на связанные окна Возвращает дескриптор окна, который используется в вы­ зовах Windows API Устанавливает/возвращает положение левого края окна на экране в твипах (1 твип = 1/20 пункта). Не оказывает влияния на связанные окна Только чтение. В редакторе VBE поддерж ивается возмож­ ность связывания окон (например, во время присоедине­ ния). Это свойство возвращает еще один объект Window, который соответствует фрейму, вмещающему в себя окна. Если окно не является связанным, это свойство возвра­ щает значение Nothing Только чтение. Возвращает коллекцию окон, связанных с объектом window (например, при присоединении окон) Устанавливает/возвращает положение верхнего края окна на экране в твипах (1 твип = 1/20 пункта). Не оказыва ет влияния на связанные окна Только чтение. Возвращает тип окна, например CodePane, окно lmmediate, основное окно и т"д. Устанавливает/возвращает видимость окна на экране Устан авливает/возвращает ширину окна в твипах (1 твип = 1/20 пункта). Не оказывает влияния на связан­ ные окна Возвращает состояние окна - свернуто, развернуто, нор­ мальное
Объектная модель VВЕ 985 Методы объекта Window Имя Close SetFocus Тип возвращае- Описание мого значения Закрывает окно Открывает и активизирует окно, выводит его на экран и предоставляет фокус Методы коллекции Windows Имя Тип возвращае- Описание мого значения CreateTool - Window Window Параметры: Addininst, Progld, Caption, GuidPosi tion, DocObj. Этот метод используется только при создании надстроек СОМ в .среде разработки Visual Basic 5/6 при создании подцерживающего присоединения окна для редактора VBE Примеры использования объекта Window Код из этого примера закрывает все окна кода и окна конструктора в редакторе VВЕ. isuБ \ ::::ro seA. lic·c; dewindows () ~, · 1 . Dim ' owin .As VBIDE. WinsJ.9~ . ' Закрыть . о.к1tо Obj ect Browseг;< · конс:'l'рук~ора . ·· rielщg'. Print "Закрыто oWin.Close μase Else . ·,;·, . ' Не закрывать ' остальные . oebug. Print. .· ;·coxpaнeннo . Sele~t · ·
Объектная модель Office 2003 Общие свойства коллекций и связанных с ними объектов Большинство объектов из объ~ктной модели Office связаны с соответствующими кол­ лекциями. Обычно имя коллекции представляет собой множественное число от имени связанного объекта. Напри.мер, в коллекции ComrnandBars хранятся объекты ComrnandBar. Для простоты связанные коллекции и объекты будут описываться в ?дном разделе. В большинстве случаев назначением коллекции является хранение одинаковых объ­ ектов. Общие свойства коллекций перечислены в следующем разделе. В соответствую­ щих разделах будут рассматривать61, только уникальные свойства, методьr и события. Общие свойства коллекций Имя · Тип возвращае- Описание мого значения Application Application Только чтение. Возвращает ссылку на приложение, кото­ рому принадлежит текущий объект Count Long Только чтение. Возвращает количество объектов в кол­ лекции
988 Приложение В Имя Тип возвращае- Описание мого значения Creator Parent Long Object Только чтение. Возвращает число типа Long, которое описывает приложение , создавшее объект. Это свойство и спользуется только на платформе Maciпtosh Только чтение . Объект Parent является контейнером для объекта коллекци и. Например, Workbooks . Parent воз­ вращает ссылку на объект Application Общие свойства объектов Объекты также обладают общими свойствами. Ниже перечислены все общие свой­ ства объектов . В разделах с описаниями объектов эти свойства будут упоминаться, но их определения приводятся только здесь . Имя · - Тип возвращае- Описание мого значения Application Application Creator Long Parent Object Только чтение . Возвращает ссылку на приложение, кото­ рому принадлежит текущий объект Только чтение. Возвращает число типа Long, которое описывает приложен ие , создавшее объект. Это свойство используется только на платформе Maciпtosh Только чтение. Объект Parent является кон тейнером для текущего объекта . Например, в Excel вызов Shapes ( 1) . Parent может вернуть ссылку на объект Work s heet, так как объект Worksheet является одним из возможных кон те йнеров объекта Shapes Объекты пакета Office, их свойства и события Объекты перечислены в алфавитном порядке . Для каждого объекта приводится об­ щее описание и перечисляются возможные родительские объекты . После этого в таб­ личном формате перечислены свойства и методы объекта. В последнем разделе описа­ ния приведены прим еры использования объекта. Объект AnswerWizard Объект AnswerWizard Является частью коллекции AnswerWizardFiles. Этот объ" ект используется для управления файлами, на основе которых создается диалоговое окно Answer Wizard. Общие свойства объекта AnswerWizard Определения свойств Application, Creator и Parent приводил ись в начале при­ ложения .
Объектная модель Office 2003 989 Свойства объекта AnswerWizard Имя Files Тип возвращае- Описание мого значения Answe rWizard- Только . чтение. Возвращает список файлов, доступных тe - Files кущему объекту AnswerWizard Методы объекта AnswerWizard Имя Тип возвращае- Параметры Описание мого значения ClearFileList Очищает список файлов для текущего объекта AnswerWizard, включая список принятых по умолчанию файлов для те­ кущего приложения Microsoft Office ResetFileList Сбрасывает список файлов дл.я т~кущего объекта Answerwi.zard и заменяет его принятым по умолчанию списком файлов для текущего приложения Microsoft Office Коллекция AnswerWizard Files В этой коллекции хранятся ссылки на файлы мастера Answer Wizard. В коллекции находятся все файлы мастера Answer Wizard (это файлы с расширением . AW), доступ- ные активному приложению Mici·osoft Office. · Общие свойства коллекции AnswerWizardFiles Определения свойств Application, Count, Creator и Parent приводил~сь в на­ чале приложения . Свойства коллекции AnswerWizardFiles Имя Ite m Тип возвращае- Параметры Описание мого значения String Index As Long Только чтение. Возвращает строку с именем файла из коллекции AnswerWizardFiles : Методы коллекции AnswerWizardFiles Имя Add Delete Тип возвращае- Пара~етры Описание мого значения . FileName as String Создает новую ссылку (строковое зна чение) на файл мастера Aпswer Wizard и добавляет созданную ссь1л­ ку в коллекцию AnswerWi z ardFil es FileName as String Удаляет указанный файл мастера Aпswer Wizard из коллекции AnswerWizardFiles
990 Приложение В Объект Assistant Этот объект управляет внешним видом и содержанием помощника Office. Например, объект Assistant можно испоЛьзовать для вывода собственных сообщений вместо функции MsgBox. Многие свойства объекта Assistant соответствуют параметрам в диалоговом окне с параметрами помощника Office. Общие свойства объекта Assistant Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта Assistant Имя Animation AssistWith- Alerts AssistWith:. Help BallonError FeatureTips FileName GuessHelp High- PriorityТips Item Keyboard- ShortcutTips Left MouseTips Тип возвращае- Описание мого значения MsoAnimation- Type Boolean Boolean MsoBallon- ErrorType Boolean String Boolean Boolean String Boolean Long Boolean Устанавливает/возвращает анимацию для помощника Office Устанавливает/возвращает необходимость вывода преду­ преждений приложения через всплывающие подсказки помощника, когда помощник Office виден на экране. При установке этого свойства в значение False предупрежде­ ния будут выводиться в принятых по умолчанию диалога- ' вых окнах приложения Устанавливает/возвращает необходимость отображения помощника Office при нажатии клавиши <F1 > для доступа к справочному руководству. Если это свойство установле­ но в значение False, при нажатии клавиши <F1> выво­ дится окно справочного руководства Только чтение. Возвращает значение, соответствующее по­ следней записанной ошибке из всплывающего сообщения Устанавливает/возвращает необходимость предоставле­ ния информации о более эффективных методах исполь­ зования приложения через помощника Office Устанавливает/возвращает имя файла и расположение текущего помощника Office Устанавливает/возвращает список тем справочного руко ­ водства, соответствующих ключевым словам, выделен­ ным перед щелчком на окне помощника или нажатием клавиши <F1 >. Если помощник Office отключен (см. опи­ сание свойства On), темы справочного руководства пере­ числяются в стандартном окне справочного руководства Устанавливает/возвращает необходимость отображения высокоприоритетных подсказок через помощника Office Только чтение . Возвращает текст, связанный с объектом Устанавливает/возвращает необходимость вывода ин­ формации о комбинациях клавиш через помощника Office Устанавливает/возвращает горизонтальное положение окна помощника Office (в пунктах) от левого края экрана Устанавливает/возвращает необходимость вывода ин­ формации об эффективном использовании мыши
Объектная модель Office 2003 991 Имя Тип возвращае- Описание мого значения MoveWhenin- Boolean TheWay Narne String NewBalloon Balloon On Boolean Reduced Boolean SearchWhen- Boolean Prograrnrning Sounds Boolean TipOfDay Boolean Тор Long VisiЫe Boolean Методы объекта Assistant Устанавливает/возвращает необходимость автоматиче­ ского перемещения окна помощника Office при попадании в рабочую область пользователя Только чтение. Возвращает имя текущего помощника Office. Если помощник отключен с помощью одного из па­ раметров из диалогового окна Параметры помощника (Assistant Options) или с помощью свойства Assistant. on , свойство Narne возвращает значение Nothing Только чтение. Возвращает ссылку на объект вalloon. Хотя можно создавать несколько объектов Balloon, только один из них выводится на экран в определенный момент Устанавливает/возвращает состояние (включен/отключен) помощника Office Устанавливает/возвращает необходимость отображения уменьшенного окна помощника Office. Это свойство не оказывает никакого действия на приложения Office ХР Устанавливает/возвращает необходимость вывода спра­ вочных материалов по приложениям и программирова­ нию, пока пользователь работает в редакторе VBE Устанавливает/возвращает необходимость воспроизведе­ ния звуков вместе с соответствующей анимацией Устанавливает/возвращает необходимость отображения специальной подсказки при каждом открытии приложения Office · Устанавливает/возвращает расстояние (в пунктах) от верхнего края помощника Office до верхнего края экрана Устанавливает/возвращает видимость помощника Office на экране. Это свойство не оказывает видимого эффекта, если свойство Assistant. On установлено в значение False . Имя Тип возвращае- Параметры мого значения Описание Activate- Wizard WizardID as Long, Act as MsoWizard ActType, [Anirnation] Восстанавливает или приоста­ навливает работу справочного руководства помощника Office во время работы собственного мастера. Этот метод использу­ ется только вместе с методом StartWizard
992 Приложение В Имя DoAlert EndWizard Help Move ResetTips Тип возвращае- Параметры мого значения Long BstrAlertTitle as String, bstrAlertText as String, alb as MsoAlertButton Туре, alc as MsoAlerticon Туре, ald as MsoAlertDe- faul t Туре, alq as MsoAlert CancelType, varfSysAlert as Boolean WizardID as Long, varfSuc cess, Animation XLeft as Integer, уТор as Integer StartWizard Long On as Boolean, Callback as String, PrivateX as Long, [Animation] , [CustomTeaser], [Тор], [Left], [Bottom], [Right] Описание Выводит предупреждение через помощника Office или через обычное окно сообщения. Воз­ вращает значение типа Long, определяющее кнопку, на кото­ рой щелкнул пользователь. При включенном помощнике Office сообщение выводится в виде всплывающей подсказки. Если помощник Office отключен, со~ общение выглядит и ведет себя как обычное окно сообщения . Этот метод очень похож на свойство Balloon, которое вы­ водит сообщение только при включенном помощнике Office Освобождает переменную, ко­ торая возвращается методом StartWi z aid. Этот метод ис­ пользуется. только вместе с ме­ тодом Start;Wizard Выводит помощника Office и шаблонное сообщение "What would you like to do?" для стан­ дартного интерактивного спра ­ вочного руководства Office Перемещает помощника Office в указанную позицию. Помощ­ ник должен быть включен и ви­ дим на экране, но если одно из этих условий не выполняется, ошибки не возникает Сбрасывает советы приложе­ ния, которые выводятся в окне помощника Office Запускает помощника Office и возвращает значение типа Long, идентифицирующее се­ анс . Этот метод необходимо использовать только для запус­ ка помощника Office из собст­ венного мастера . Возвращае­ мое этим методом число ис­ пользуется методами ActivateWizard и EndWizard
Объектная модель Office 2003 993 Пример: объект Assistant В следующей подпрограмм~ некоторые свойства объекта Assistant используются для вывода помощника на экран, вывода вопроса к . пользователю и обработки ответа пользователя. f; 6ткрыть~й ~Пределенный польЗовате.Лем тиП, · который t ' хранения текущих свойств помощника Office \PuЬlic Туре Assistirifo ! bOn. д·s Boolean bVisiЫe As вoolean , sFileName As String ;впd Туре · · i1 [Sub Opening ( ) Dim lReturnValue As Long Dim oBalloon As Balloon Dim udAssistCurr As ' Сохранить текущие параметры по~ощник.а With udAssistCuri .bon. = Assistant.on ., . bV isiЫ e = Assistailt. Visibl: e ·y · .sFile Name Assi$tarit.Filename· End With ' ' МодифицИ:ровать · пщ1юЩника'' и соо\)щение With Assistar{t .Оп = True .VisiЫe = True . Filename = " C:\Program Office\Offic el O\dot.acs " ~У,. .· .... . Animation = msoAnimationCheckingSorriething ' . ;...~ '' '>> .'·· .. - , ' Создать всплывающее сообщение Set oBalloon ·"° .Ne.wBalloon . wo:rkbook?" .Button = msoButtonSetYesNo lReturnValue . . Show · · End With . If ' 1R·eturnvalue ' щелкнул на кнопке да ·.· . . . .. '' Открыть книгу и вывест и собственную :аi·щм,э.ЦИю . >1. , " Workb.ooks. Open " с: \Му Docum'?nts \WrO'x\Wrox • Exaщples. xl's " · ,Animation = msoAnimationGetTechy . ; •..· · · .-·. <<·:· · . . Animation = msoAnimationAppear · ...," ·· ··' ·· · Бl·se· · .. ; i . Сбросить свойства помощника Office If .udAssistCurr .bOn Then .Animation ·= 1f Len(udAssistCurr.sFileName) Then _ . Filename = udAssistCurr.sFileNaine .~ .VisiЫe tt.<:1]\.ss,i,st,.C:1,1:r:r ,.IJYis:ibl.1? ... .. ""
994 Приложение В · - ··: ::;····"·"": :~on ·=' u d.Ass:LstcU: rr ~Ъоn .. End'rf · · t ',. Efld With ,.:, Объект Balloon Этот объект используется для создания и вывода сообщений с помощью помощника Office. В большинстве случаев он применяется для создания собственного сообщения с текстом, метками, флажками и / или командными кнопками. Для этого объектной пере­ менной присваивается значение свойства NewBalloon. Дополнительная информация приводится в описании oбъeктaAssistant . Общие свойства объекта Balloon Определения свойств Application, Creator и Parent приводились в начале при­ ложен1'\я. Свойства объекта Balloon Имя Animation BalloonType Button · Callback Heading Icon Тип возвращае- Описание мого значения MsoAnimation- Type MsoBalloon- Type MsoButtonSet- Type String String MsoiconType Устанавливает/возвращает операцию анимации помощни­ ка Office. При установке этого свойства объекта Balloon анимация помощника включается только при выводе по­ мощника на экран УстанавЛивает/возвращает тип всплывающего сообще­ ния, которое исгюльзуется помощником Office. При созда­ нии объекта Balloon это свойство устанавливается в значение msoBalloonTypeButtons Устанавливает/возвращает тип и количество кнопок, кото­ рые выводятся в нижней части всплывающего сообщения помощника Office. При создании объекта Balloon это свойство устанавливается в значение msoButtonSetOK Устанавливает/возвращает имя процедуры, которая вы­ зывается из немодального всплывающего сообщения . При . использовании свойства Callback с немодальными всплывающими сообщениями необходимо создать проце­ дуру, принимающую три аргумента: объект Balloon, вы­ зывающий процедуру, целое число типа Long, имеющее значение msoBalloonButtonType и описывающее кноп­ ки, на которых щелкнул пользователь, а также целое чис­ ло типа Long, идентифицирующее всплывающее сообще­ ние, из которого была вызвана процедура (дополнительная информация приводится в описании свойства Private) Устанавливает/возвращает текст заголовка, который вы­ водится во всплывающем сообщении помощника Office Устанавливает/возвращает тип пиктограммы, которая вы­ водится в верхнем левом углу всплывающего сообщения помощника Office
Имя Labels Mode Name Private Tex t \ Объектная модель Office 2003 995 Тип возвращае- Описание мого значения BalloonLabels Только чтение. Возвращает коллекцию BalloonLabels, которая описывает метки кнопок, чисел и списков во всплывающем сообщении помощника Office MsoModeType String Long Устанавливает/возвращает модальное поведение всплы ­ вающего сообщения помощника Office. При создании объ­ екта Balloon зто свойство устанавливается в значение msoModeModal, поэтому перед продолжением работы с приложением пользователь должен закрыть всплываю­ щее сообщение Только чтение. Возвращает имя объекта вalloo n Устанавливает/возвращает целое число, идентиф ици­ рующее объект Balloon, вызвавший процедуру через свойство callback. Используется для идентификации немодальных объектов вalloon при запуске п ро цедуры через свойство Callback . Это свойство передается в процедуру в качестве одного из параметров Устанавливает/возвращает текст, который выводится на­ против флажка или метки во всплывающем сообщении помощника Office. Свойство относится к объектам Balloo nLabel и BalloonCheckBox Методы объекта Balloon Имя Close SetAvoid- Rectangle Show Тип возвращав- Параметры мого значения Balloon Assi stan t MsoBalloon- ButtonType Left as long , Тор as Long , Right as Long , Bottoin as Long Коллекция BalloonCheckBoxes Описание Закрывает активное немодальное всплывающее сообщен ие. Этот ме­ тод необходимо использовать толь­ ко в процедурах, которые вызыва­ ются через с~ойство Callback Запрещает вывод всплывающего· сообщения в пределах указанной области экрана Выводит указанный объект Balloon на экран В этой коллекции хранятся все флажки, которые выводятся в пределах окна объекта Balloon. Коллекция используется для пе р ебора всех об~ектов Bal l oonCheckBox и оп­ ределения состояния флажков на момент закрытия всплывающего сообщения. Общие свойства колл~кции BalloonCheckBoxes Определения свойств Application, Co unt , Creator и Parent приводились в на- . чале приложения.
996 Приложение В Свойства коллекции BalloonCheckBoxes Имя Тип возвращаемого Описание значения I tem BalloonCheckBox Name String Толь ко чтение. Возвращает эле м ент коллекции. Номер эле­ мента коллекции указывается через параметр Index Только чтение . Возвращает имя объекта BalloonCheckBox Объект BalloonCheckBox Объект описывает флажки из коллекции флажков в пределах объекта Balloon. Общие свойства объекта BalloonCheckBox Определения свойства Application, Creator и Parent приводились В· начале приложения. Свойства объекта BalloonCheckBox Имя Тип возвращае- Описание мого значения Checked Boolean Item String Name String Text Устанавливает/возвращает состо яние конкретного флажка во всплывающем сообщении помощника Office · Только чтение. Возвращает текст, связанный с объектом BalloonCheckBox Только чтение . Возвращает имя объекта BalloonCheckBox Устанавливает/возвращает те кст, который выводится рядом с флажком во всплывающем сообщении помощника Office Коллекция BalloonLabels В этой коллекции хранятся метки, отображаемые в пределах объекта Bal loon. Кол­ лекция используется для перебора объектов BalloonLabel с целью определения уста­ новленных меток на момент закрытия сообщения . Общие свойства коллекции BalloonLabels Определения свойств Application, Count, Creator и Parent приводились в на- - чале приложения. Свойства коллекции BalloonLabels Имя Item Name Тип возвращае­ мого значения Описание BalloonCheckBox Только чтение. Возвращает элемент коллекции, номер котор'ьго указ ы вается в качестве значения п араметра Index String Только чтение . Возвращает имя объекта BalloonLabel Объект BalloonLabel Представляет одну из меток, которые выводятся в пределах окна объекта Bal loon.
Объектная модель Office 20 03 997 Общие свойства объекта Balloonlabel Определения свойств Applic ation, Creat o r и Pare nt пр иво д или с ь в начале при ­ ложения . Свойства объекта Balloonlabel Имя Тип воз враща е- Описание мого значения Ch ecked I tem Name Text Boolean String String String Устанавливает/возв р ащает состояние фла жка в пред~лах ок­ на помощника Offi c e Только чтение . Возвращает текст, связанный с объектом Ba l loonLabe l Толь ко чтен и е . Возвраща ет имя объекта Ba lloonLabe l Устанавл и вает/возвращает текст, который выводится возле мет к и в предела х всплывающего сообщения помощни ка Office Пример: коллекция BalloonCheckBoxes В следующем примере коллекция Bal loon Che ckBoxes и объект BalloonChec kBox используются для вывода списка городов во всплывающем сообщении объекта Ваllооn. Результат выбора предоставляется с помощью мeтoдaDoAl ert обЪекта As s i s tant. 1suь " custorriвalloon (J ! Dim J.Item As Long Dim lReturnValue As Lohg Dim oBalloon As Bal1oon Dim oCheckBox As BalloonCheckbo'x Dim ~Message As String · .Dim vCi ties As Variant · '· Создать массив городов ·, ' ЕСПлывающем .сообщении -.~ . vCit ies = Array ( ".New .York" -, "London" ·, "Paris" ) • Вывести собственное With Assistant . .On=True ·.Vis i Ыe = True ' Создать ново е всплывающее Set oBalloon = . NewBalloon ' Модифицировать новое ,· всплывающее With oBalloon · · .' Добавить текст .заголовка с вьщелf:!нием ' подчеркив.анием · .Heading = "{"cf 252) {ul l}Wrox Pressfl.il ' Добавить изображение . . ' и зеленый те .кст инструкции двумя . строкащ .Text= ·' ' ·' "•·с: \P;rogram Посетить. {cf О}" ' Создать набор _ Фщt_ж~о.в, текст которых
998 Приложение В ·· ;·--на'званИям городов в .массиве 'Forlitem=1тоз .J ' По умолчанию нумерацИя массива начинается с . CheckBoxes (litem) .Text = vCities (litem - 1) . Next litein ' Вывести всплывающе.е сообщение . Show ' Перебрать коллекцию BalloonCheckboxes И ' установленные флажки . For Each oCheckBox In '"CheckBoxes If oCheckBox.Checked Then sMessage sMessage & oChec~Box.Text & Next oCheckBox End With ' Вывести результат с помощью метода . DoAlert If Len(sMessage) Then ·. ' Пользова'гель выбрал как минимум один город ·sMessage = Вьiбранные города:" , & vbCrLf. & vbCrLf Else ' Пользователь не выбрал ни одного города sMessage;; " Вы отшельник!" \EndIf . DoAlert "{cf 2}Wrox{cf 0}", "{cf 1}" & sMessage & · m soAlertButtonOK, . msoAlerticoninfo, _ msoAlert.Defaul tFirst, msoAlertCancel'Defaul t, t Ешj With ;J;'J;lel .)3~1;?.д./ . Коллекция COMAddins В этой коллекции хранится список объектов COМAddin для приложений пакета Microsoft Office (в ~анном случае Excel). Надстройки СОМ предназначены для использо­ вания в различных приложениях Office, например Excel, Access, Word и Outlook. Над­ стройки СОМ разрабатываются на любом языке (Visual Basic, С++ илИ ]++), поддержи­ вающем создание компонентов СОМ (Coшponent Object Model). Общие свойства коллекции COMAddins Определения свойств Application, Count, Creator и Parent приводились в на­ чале приложения. Методы коллекции COMAddins Имя Item Update Тип возвращае- Параметры мого значения COМAddin Index As Variant Описание Воз·вращает элемент коллекции COМAddins Обновляет содержимое коллекции COМAddins из списка надстроек, храня­ щегося в системном реестре Windows
Объектная модель Office 2003 999 Объект COMAddin Объект соответствует одной надстройке приложения Micгosoft Office и является чле­ ном коллекции COМAddins. Надстройки СОМ предназначены для использования в раз­ личных приложениях Offi~e, например Excel, Access, Woi-d и Outlook. Надстройки СОМ разрабатываются на любом языке (Visual Basic, С++ или]++), поддерживающем создание компонентов СОМ (Component Object Model). Общие свойства объекта COMAddin Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта COMAddin Имя Тип возвращае- Описание мого значения Connect Boolean Устанавливает/возвращает состояние подключенИя для объекта COМAddin Description String Устанавливает/возвращает строку описания для объекта COМAddin ' Guid String Только чтение . Возвращает глобально уникальный иден­ тификатор класса (GUID) для объекта COМAddin Ob ject Object Progid String Пример: объект COMAddin Устанавливает/возвращает объект, который лежит в осно­ ве объекта COМAddin. В основном это свойство использу ­ ется для связи с другими объектами COМAddin Только чтение . Возвращает программный идентификатор (ProgID) объекта COМAddin Следующая подпрограмма перебирает список надстроек СОМ и выводит информа­ цию о надстройках в таблице на листе Sheetl в книге, в которой находится код. [~U.ь''·c6МA<1d:Ciltд fo (У. : : \ ''" ,-" ,._ lRQW ' AS 6corn p.s ' . ., ' Установить · заго.тiовки'·t~ листе · with · sheeti .R .ange ( "Al: Dl" J Sheetl текущей ' книг~ ' .. . - - . ;.'; ~-\~ ~ ' ',Value = Array.(" 'G"uid", "Progid", \ . Fo_nt·,J3old = True · . HorizontalAli'gnment = xlCenter.' i. ~nd "w.ith · · ~'-crea,t~_~J'· , · ;} "'· ~. <Щ~ребратЬ · .к9.ллекL\ию .coМActdins и " под з·аголqвками 1 , , , If Appl'ication.COМAdd:tns.Couht Then' ," ... •• . F9;- ,Each ос.от rn. Appl,ica.tion. COw\.ddins, With sьe'etl. Range (·· А2") · . , :/ " •..~·4:»··· .. ' >offset (IRow, О} "value \ :: ''oCom. ~ULD i'. , ·:of.fset ClRow• 1) . Value = ocom,progID . . 9f fset{lRow, 2) .Value ;, ' oCqm.Creatoт . Offset (lRow, з) , value dCom .. Description ~R,ow,:=~ ±Eow + ,1_ ", _,; · ' ·
1000 Приложение В Коллекция CommandBars В коллекции CornmandВars хранится список всех объектов CornmandВar (большинство пользователей знают эти объекты как панели инструм~нтов) в пределах приложения. До­ полнительная информация приводится в описании объекта CornmandВar. Коллекция обе­ спечивает досrуп к параметрам, предоставленным на вкладке Параметры (Options) в диа­ логовом окне Настройка (Customize) . Общие .свойства коллекции CommandBars Определения свойств Application, Count, Creator и Parent приводились в на­ чале приложения. Свойства коллекции CommandBars Имя Тип возвращае- Описание мого значения Actionnewline- CommandBar- Control Control ActiveMenuBar CommandBar AdaptiveMenus Boolean Di saЬl eAsk­ AQu estion- Dxropdown DisaЫe­ Customize DisplayFonts Bool ean Boolean Boolean Только чтение. Возвращает объект CommandВarControl, свойство OnAction которого указывает на работающую процедуру . Если работающая процедура не была запу­ щена элементом управления командной панели, свойство возвращает значение No thing Только чтение . Возвращает объект CommandBar, кото­ рый соответствует активной панели меню в приложе­ нии. Практически всегда это свойство возвращает ме­ ню листа Устанавливает/возвращает необходимость использо­ вания адаптивных меню Устанавливает/возвращает состояние раскрывающе ­ гося меню мастера Aпswer Wizard, · которое выводится справа от меню листа в приложении. При установке этого свойства в значение True раскрывающийся спи ­ сок исчезает Q панели меню Устанавливает/возвращает необходимость отключения панели инструментов с параметрами настройкИ . Уста­ новка этого свойства в значение тrue. приводит к от­ ключению пункта Настрой ка (Customize) в меню Сервис (Tools} и в контекстом меню панелей управления Устанавливает/возвращает необходимость использо­ вания реальных шрифтов при заполнении раскры­ вающегося списка Шрифт (Font). На старых компьюте­ рах с ограниченным и _вычислительными ресурсами это свойство стоит установить в значение Fa ls e
Объектная модель Office 2003 1001 Имя Тип возвращае- Описание мого значения DisplayKeysin- Boolean Tooltips Display- Tool tips Item LargeButtons Bool ean CommandBar Boolean MenuAnimation- Mso - Устанавливает/возвращает необходимость вывода комбинаций клавиш в подсказках для элементов управления командных панелей. Это свойство не ока­ зывает влияния на командные панели Excel Устанавливает/возвращает необхо~имость вывода всплывающих подсказок при наведении указателя мыши на элементы управления командных панелей Только чтение. Возвращает объект commandBar из коллекции CommandBars. Номер объекта указывается в качестве значения параметра Index. Кроме этого, в качестве значения параметра Index можно указы­ вать имя командной панели Устанавливает/возвращает необходимость вывода больших кнопок на пан.елях инструментов _, Style MenuAnimation Устанавливает/возвращает тип анимации для всех элементов управления CommandвarPopup (меню) в коллекции CommandBars Методы коллекции CommandBars Имя Тип возвращае- Параметры маго значения Add CommandBar · FindControl CommandBar- Control FindControls CommandBar- Contro l s ReleaseFocus [Name], [Position ] , [MenuBar], [Temporary] [Туре], [Id], [Tag] , [ VisiЬle ] [Туре], [Id], [Tag], [ Vis iЬle] События коллекции CommandBars Имя Параметры Описание Описани_е · Создает новую командную па­ нель и добавляет ее в коллек­ цию CommandBars Возвращает один объект CommandBarControl, соответ­ ствующий описанному пара­ метрами критерию Возвращает из коллекции набор объектов CommandBarControl, соответствующих указанному с помощью параметров крите ­ рию Снимает фокус пользователь ­ ского интерфейса со всех ко­ мандных панелей OnUpdate Событие OnUpdate распознается объекто м CommandBar и все ­ ми элементами управления командных панелей. Из-за большого количества событий onupdate, возникающих в процессе нор ­ мальной работы, разработчики приложений для Excel должны использовать это событие с осторожностью
1002 Приложение В Пример: коллекция CommandBars Следующая подпрограмма устанавливает параметры всех объектов CommandBar. По­ сле этого выводится количество командных панелей в приложении, а также имя актив­ ной панели меню. : suЬ coun'tcomffiaridвars ( j ' ' Модифицировать некоторые параметры всех . командных панеJJей With CommandBars ' ВКJIЮчить адаптивные меню . A daptiveMenus = True ' ,Удал.:rть г:оле ' справка' которое вывод:Ится в правой, части " Обратите внимание: Этот параметр ·не. затрагивает поле ' справка в редакторе VBE · . Disa b1eAskAQU est ,i6nDro pdowц = . True . . ·, Запретить модификацию командных панеJJей. · '. Dis'ablecustomize = True · ' · Не цоказыват .Ь · внешний вид шрифт.св в раскрывающе'мся , спи'ске Шрифт ,' Эт. о позвоm!ет· сохранить ресурсы и повысить быс::С.роДейств.ие , DisplayFonts = Fals·e " "' ' Включить сJJучайную · анимацию . при щеJJчк·е на пункте , . . MenuAnimationStyle = ms .oMeпuAnimationRaцdom Выводить подсказку _ при наведении указателя мыill]!i " ; DisplayTooltips = True ' riоказьr.ва ть комбИri'ации клавиui' вместе . с rюдсказками ' _ оказывает • влияния на Excel) · c ЬisplayKeysinTdoltips = True ,· .. ' ·· Выводить'. большие · к·нопки на командных панелях . Large_BЦttons = True ' Вывести . КОЛ,Иtiество КОМаНдНЫХ панелей j назв:;;~Ие приложении " & , Paren~.Name & "· \~ . & " .командных Паliелей . ·· •. ". & · "в д_анный-момент активно меню · " . . ActiveM-enuBar.Name · & " " Объект CommandBar В этом объекте хранятся свойства и методы конкретной командной панели из коллек­ ции CommandВars . Свойства и методы этого объекта похожи на свойства и методы коллек­ ции CommandВars, но они относятся только к конкретной командной панели. Для получе­ ния объекта CommanBar воспользуйтесь вызовом CommandВars ( Index) , например: [~1:~~~~=~:~;=~~~~;::':wr~~·::~)
Объектная модель Office 2003 1003 Общие свойства объекта CommandBar Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта CommandBar Имя Тип возвращае- Описание маго значения AdaptiveMenu Boolean Только чтение. Возвращает объект Command Bar, который соответствует активной панели меню в пр иложении Builtln Context Controls EnaЫed Heigh t ID Index Left Na me NameLocal Position Protec tion Rowl n dex Тор Boolean String CommandBar - ControJ;s Boo lean Long Long Long Lo ng String String MsoBarPos i tion MsoBa r - P r otection Long Long Только чтение. Возвращает значение тru e, если указан­ ная панель меню или элемент панели меню являются встроенными. Возвращает значение False, если это соб ­ ственная командная панель или собственный элемент ко­ мандной панели. Кроме этого, значение False возвраща ­ ется для встроенных элементов управления с модифици­ рованным значением свойства OnAction Устанавливает/возвращает строку, которая определяет место сохранения командной панели . Строка определяет­ ся и интерпретируется приложением Толь ко чтение. Возвращает объект CommandBarCont r ol, представляющий все элементы управления на командной панели Устанавливает/возвращает состояние командной панели (включена/выключена) . Установка этого свойства в значе­ н ие Tru e приводит к поя влению имени ко м а ндной панели в списке доступны х командных п а нел е й Уста навлива ет/возвращает высоту ко м андной п анели Только чтение . Возвращает иде нтификатор встроенной командной панели Только чтение. Возвращает положение объекта Command Bar в коллекци и Comm andBars Устанавливает/воз вращает расстояние ( в п икселях) от левого края командной панели до левого края экрана Уст а навливает/возвращает имя объекта commandBar Устанавливает/возвращает имя встроенной командной пане­ ли, которое выводится в локализованной языковой версии ·приложения, а также имя собственной командной панели Устанавливает/возвращает положение командной панели Уста н авливает/возвращает способ за щиты командной па- нели от пользовательской модификации · Устанавливает/воз вращает порядок размещен ия ком анд­ но й панели относительно других командных панелей в предеhах одной области. Свойству можно присвоить це­ лое значение больше нул я или одну из констант MsoBarRo w: msoBarRowFirst или ms0iзarRowLa st Устанавливает/возвращает расстояние (в пун ктах) от верхнего края командной панели до верхнего края экрана
1004 Приложение В Имя Туре VisiЫe Width Тип sозвращае- Описание маго значения MsoBarType Boolean Long Только чтение. Возвращает тип командной па нели Устанавливает/возвращает видимость командной панели . Перед установкой этого свойства в значение True в это же значение должно быть установлено свойство EnaЫed Устанавливает/возвращает ширину (в пикселях) команд­ ной панели Методы объекта CommandBar Имя Delete FindControl Reset ShowPopup Тип возвращае- Параметры маго значения ComrnandBar- Contro l [Туре], [Id], [Tag] , [VisiЬle], [Recursive] [х]' [у] Пример: объект CoтmandBar Описание Уда ляет объект ComrnandBar из коллекции ComrnandBars Возвращает объект ComrnandBar, соответствующий указанному кри­ терию Сбрасывает объект comrnandBar в принятую по умолчанию конфигу­ рацию Выводит объект ComrnandBar в ви­ де контекстного меню по указан­ ным координатам или по текущим координатам указателя Следующая подпрограмма модифицирует собственную командную панель .(объект ComrnandBar), которая называется "Wгох" . .s\ iь · c\ J . s t offiizёwro:X :ВarТг - ·· 1 t..·.·. . Diш 6ваr A.s Comrna:n.dвar , / Ь);П) ' 'aмenu I>;s c6mrnandBarPopup ;··,r~.\::.·~ .·, -.. ·> ., -; ' "<. '-~.*/ ·(;~ ,;~ " Смести:гь ·панель · вправо • .Positicш / = msoBarRight панели. вьiполнить модификацию элементом управления True. ~ · Заriретить модификацию пользователем . .Protection = msoBarNoCustomize
Объектная модель Office 2003 1005 Объект CommandBarButton Объект CoпunandBarButton соответствует любой кнопке или пункту меню на каждой командной панели . Для получения доступа к конкретному объекту CoпunandBarButton необходимо идентифицировать объект CoпunandBar, в пределах которого находится кнопка, и воспользоваться свойством Controls ( Inde x). Параметру Inde x можно при­ своить порядковый номер объекта CoпunandBarButton в меню или на панели инстру­ ментов, или значение свойстваСарtiоn. Например, к первому элементу управления, который называется "Wгох", можно обра­ титься с помощью оператора: [~oliiiJr~ri.;il\iiШi'J "Wi:q~,1:L~9.:fft~Г~;i(I ~~~"""'"""'"'·,~;~i~IШ~~i!:~~'~J!!f!~~;:,~~1!t1J:,{i'i: ~~!iii{iJii;!$iii!l:';~uГilli или l~9ilifii%!l@?t:f:§~(f-Wf9~:~E:fionif9J:sT:;}ii:;ffiJ:?ii!J;-':-IiJ:1oIГ.'',-'''C-"''""'''"''""'::?Г''>1'l\Г;fc\)'t';')'\\~i/ Общие свойства объекта CommandBarButton Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
1006 Приложение В Свойства объекта CommandBarButton Имя Тип возвращае- Описание мого значения BeginGroup Boolean Builtin Boolean BuiltinFace Boolean Caption String Description- String Tex t EnaЫed Boolean Faceid Long Height Long Help- Long Contextid HelpFile String Hyperlink- MsoCommand- Туре BarButton- HyperlinkType Id Long Index Long IsPriority- Bool e an Dropped Устанавливает/возвращает информацию о том, располо­ жен ли объект CommandBarButton в начале группы эле­ ментов управления на командной панели Только чтение . Возвращает значение тrue, если указан­ ная командная панель или элементы управления команд­ ной панели являются встроенными. Возвращает значение False, если это собственная командная панель или эле­ мент управления. Кроме этого, значение False возвра­ щается для встроенных элементов управле н ия с модифи­ цированным значением свойства OnAction Устанавливает/возвращает информацию об использовании встроенной пиктограммы элемента управления Command- BarButton. Это свойство устанавливается только в значение True, что приводит к сбросу пиктограммы и использованию встроенной пиктограммы элемента управления . Устанавливает/возвращает текст заголовка элемента управления CommandBarBut ton Устанавливает/возвращает описание объекi-а CommandВarButton. Описание не предоставляется пользо­ вателю, но может применяться для документирования пове­ дения элемента управления для других разработчиков Устанавливает/возвращает состояние элемента управле­ ния CommandBarBut ton (включен/выключе н ) Уста навливает/возв ращает номер идентификатора пикто ­ граммы , которая используется объектом CommandBarButton Устанавливает/возвращает высоту объекта CommandBarButton Устанавливает/возвращает идентификатор контекста в спра­ вочном руководстве для объекта CommandВarButton Устанавливает/возвращает имя файла справочного руко ­ водства для объекта CommandBarButton Устанавливает/возвращает тип гиперссылки, связанной с объектом CommandBarBut ton Только чтение. Возвращает идентификатор встроенного объекта CommandBarButton Только чтение . Возвращает положение объекта CommandBarBut ton в коллекции Comm a ndBars Только чтение . Сообщает, что объекr commandBarButton исключен из меню или панели инструментов на основе статистики использования и площади макета . (Обратите внимание, что это свойство не идентично видимости эле­ мента управления , которая устанавливается с помощью свойства VisiЬle .) Если СВОЙСТВО IsPriorityDropped установлено в значение True, то установ ка свойств а visiЫ e в это же значение не прив едет к немедленному появлению эле мента упр авления н а экране
Объектная модель Office 2003 1007 Имя Тип возвращае- Описание мого значения Lef t Long Mask IPictureDisp OLEUsage мsoContro l - OLEUsage OnAction St ring Parameter String Picture IPictureDisp Priority Long Shortcut- String Text \ State MsoButton- State Style MsoButton- Style Tag String Tool tipText String VisiЫe Boolean Width Long Только чтение. Возвращает горизонтальное положение (в пикселях) объекта commandBarBut ton относительно левого края экрана. Расстояние отсчитывается от левого края области присоединения Возвращает объект IPictureDisp, соответствующий изображению маски объекта commandBarButton. Изо­ бражение маски определяет прозрачные фрагменты пик­ тограммы кнопки Устанавливает/возвращает роли клиента OLE и сервера OLE, в которых будет использоваться объект CommandBarButton при объединении двух приложений Microsoft Office · Устанавливает/возвращает имя процедуры Visual Basic, которая запускается при щелчке пользователя или при измен ении значения объекта commandBarBut ton Устанавливает/возвращает строку, которая может исполь­ зоваться приложением для выполнения команды Устанавливает/возвращает объект IPictureDisp, кото­ рый описывает пиктограмму объекта CommandBarBut ton Устанавливает/возвращает приоритет объекта CommandBarButton Устанавливает/возвращает текст комбинации клавиш, ко­ торый выводится напроти в элемента управления commandBarButton в меню, подменю или в контекстном меню Устанавливает/возвращает внешний вид объекта CommandBarButton Устанавливает/возвращает способ вывода объекта CommandBarButton на эkран Устанавливает/возвращает информацию об объекте commandBarButton. Например, значение этого свойства может использоваться в качестве аргумента при вызове процедур Уста навлива ет/возвращает текст, которы й выводится в виде всплывающей подсказки для объекта CommandBarButton · Устанавливает/возвращает видимость объекта CommandBarBut ton на экране Устанавливает/возвращает ширину (в пикселях) указанно­ го объекта CommandBarButton Метор.ы объекта CommandBarButton Имя Сору CopyFace Тип возвращае- Параметры Описание мого значения CommandBar- But ton [Bar], [Before] Копирует объект CommandBarButton на существующую командную панель Копирует пиктограмму объекта CommandBarBu tton в буфер обм е на
1008 Приложение В Имя Тип возвращае- Параметры Описание Delete Execute Move PasteFace Reset SetFocus мого значения CommanBar- Control [Temporary] Удаляет объект CommandBarButton из коллекции. Параметр Temporary уста­ навливается в значение True для удале­ ния элемента управления только в преде­ лах текущего сеанса. В следующем сеансе элемент управления опять будет показан на экране [Bar], [Before] Запускает процедуру или встроенную ко­ манду, связанную с объектом CommandBarBut ton. Для собственных элементов управления при выборе запус­ каемой процедуры можно воспользовать­ ся свойством OnAction Перемещает объект CommandBarBut ton на указанную командную панель Вставляет содержимое буфера обмена в объект CommandBarButton Сбрасывает встроенный объект CommandBarButton в принятую по умол­ чанию конфигурацию или устанавливает оригинальную функцию и пиктограмму объекта CommandBarBut ton Перемещает фокус клавиатуры на указан­ ный объект CommandBarButton. Если элемент управления отключен или не ви­ дим на. экране, вызов метода завершится ошибкой События объекта CommandBarButton Имя Click Параметры ByVal Ctrl As CommandBarBut- ton, ByVal CancelDefault As Boolean Описание Возникает при щелчке пользователя на объекте CommandBarButton. Параметр Ctrl указывает на эле­ мент управления, который сгенерировал событие. Если выполняется принятая по умолчанию связанная с элемен­ том управления операция, параметр Cancelbefaul t ус­ танавливается в значение False. Значение этого пара­ метра может измениться в результате работы другого процесса или надстройки Пример: обr:ект CommandBarButton Первая подпрограмма создает объект CommandВarButton на собственной ком~ной па­ нели Wrox. Элеменrу. управления назначается текст всплывающей подсказки и пиктограмма кнопки. После этого кнопка связывается с подпрограммой SelectNumericValues. ~s;~~:f.?Cic&mma:Iiёlвarв\.i t(on () " j',' Co~st sSELECT~NUMERJ:C As Stririg = "SelectNumericValues" ~;, _"=· CommandВar~~tton
.о Подавить со.обще~'!Ия ' ··. книги/листа) •. bn Error ResuПle <; • • · ; Убедит6.i~, что . выделен · диапазон ц тw~of selec.tion rs< Range , ,·& ':" ,. ---, ..,; Объектная модель Office 2003 1009 . ' r ·f s~.lect~p?'.9ei1~:couht = • 1 1 тhen .·· ' Если ; вьщелена · только. ·о\дна , ячейка ·.... получИть все· Числовые: константы лист.а . Activesheet. UsE;!clRange ·: Spec,i alCell s (. _:,, . . x;lpe:l,11'ype~qJ;ls tant;s, ;" ~i,;-;rumber.s) .·select Else · • · · · 1·· Объект CommandBarComboBox Данный объект соответствует раскрывающемуся списку, текстовому полю или комби­ нированному списку (комбинация первых двух вариантов). Эти элементы управления могут существовать только на командной панели. При этом командная панель присоеди­ няется к другим командным панелям либо находится в произвольном положении вверху или внизу окна приложения . Общие свойства объекта CommandBarCorrфoBox Определения свойств Application, Creator . и Parent приводились в начале при­ ложения.
1010 Приложение В Свойства объекта CommandBarComboBox Имя . Ти п возвр ащае- Описание мого значения BeginGroup Boolean Устанавливает/возвращает информацию о том, располо­ жен ли объект CommandBarComЬoвox в начале группы элементов управления на командной панели Builtin Boolean Caption Description- String Text DropDown- Lines DropDown- Width EnaЬled Heigh,t Help- Contextid HelpFile Index IsPriority- Dropped Long Long Boolean Long Long String Long Boolean Только чтение . Возвращает значение True, если указан­ ная командная панель или элементы управления команд­ ной панели являются встроенными. Возвращает значение False, если это собственная командная панель или эле­ мент управления. Кроме этого, значение False возвра­ щается для встроенных элементов управления с модифи­ цированным значением свойства OnAction Устанавriивает/возвращает текст заголовка элемента управления CommandBarComЬoBox Устанавливает/возвращает описание объекта commandВarComЬoBox. Описание не предоставляется поль­ зователю, но может применяться для документирования по­ ведения элемента управления для других разработчиков Устанавливает/возвращает количество строк в элементе управления CommandBarComЬoBox. ОбратИте внимание, что при попытке установить значение этого свойства для элемен­ та управления с полем ввода или для встроенного элемента управления комбинированного списка возникает сообщение об ошибке · Устанавливает/возвращает ширину (в пикселях) списка в элементе управления CommandВarComЬoBox. Обратите вни­ мание, что при попьггке установки этого свойства для встроен­ ного элемента управления возникает сообщение об ошибке Устанавливает/возвращает состояние элемента управле­ ния CommandBarComboBox (включен/выключен) Устанавливает/возвращает высоту объекта CommandBarComЬoBox Устанавливает/возвращает идентификатор контекста для раздела справочного руководства, связанного с элемен­ том управления CommandBarComЬoBox Устанавливает/возвращает имя файла справочного руко­ водства, связанного с элементом управления CommandBarComboBox Только чтение. Возвращает значение типа Long, описы­ вающее положение объекта CommandBarComЬoвox в кол­ лекции CommandBars Только чтение . Сообщает, что объект commandBarcomЬoBox исключен из меню или панели ин­ струментов на основе статистики использования и площади макета. (Обратите внимание, что это свойство не идентично видимости элемента . управления, которая устанавливается с помощью свойства visiЫe.) Если свойство IsPriori tyDropped установлено в значение True, уста­ новка свойства visiЫe в это же значение не приведет к неrу~едленному появлению элемента управления на экране
Имя Lef t List ListCount ListHeader- Count Listindex OLEUsage OnAction Parameter Priority Style Tag Text TooltipText Тор Туре VisiЫe Width Объектная модель Office 2003 1011 Тип возвращае- Описание мого значения Long Только чтение. Возвращает горизонтальное положение (в пикселях) элемента управления CommandBarComboBox относительно левого края экрана . Возвращает расстояние от левого края области присоединения String Устанавливает/возвращает указанный элемент из списка CommandBarComboBox. Для встроенных элементов управления CommandBarComboBox возможно только чте­ ние. Требует указания параметра: Index as Long Long Long Long MsoControl- OLEUsage String String Long MsoComboStyle String String String Long MsoControl- Туре Boolean Long Только чтение. Возвращает количество элементов в спи­ ске объекта CommandBarComboBox Устанавливает/возвращает количество элементов в спи­ ске объекта CommandBarComЬoBox, выводимых до разде­ лителя. Свойство предназначено для использования со встроенными элементами управления СоmЬоВох Устанавливает/возвращает номер выделенного элемента списка из объекта CommandBarcomЬoBox. Если не выделен ни один из элементов, свойство возвращает значение О Устанавливает/возвращает роли ОLЕ-клиента и ОLЕ-сервера, в которых будет использовщ~;ся объект CommandBarComЬo­ Box при объединении двух приложений Microsoft Office Устанавливает/возвращает имя процедуры Visual Basic, которая запускается при щелчке пользователя или изме­ нении значения объекта CommandBarComboBox Устанавливает/возвращает строку, которая используется приложением при вызове команд Устанавливает/возвращает приоритет объекта CommandBarComboBox Устанавливает/возвращает способ вывода элемента управления CommandBarComboBox на экран. Для установ- ки свойства используются константы MsoComЬoStyle: msoComboLabel и msoComboNormal Устанавливает/возвращает информацию об элементе управления CommandBarComboBox, например, свойство может содержать данные, которые передаются в процеду- ры в качестве значений аргументов Устанавливает/возвращает текст в поле выбора или поле ввода элемента управления CommandBarComЬoBox Устанавливает/возвращает текст всплывающей подсказки для элемента управления CommandBarComboBox Только чтение. Возвращает расстояние (в пикселях) от верхнего края элемента управления CommandBarComЬoBox до верхнего края экрана Только чтение. Возвращает тип элемента управления CommandBarComЬoBox Устанавливает/возвращает видимость элемента управле­ ния CommandBarComboBox Устанавливает/возвращает ширину (в пикселях) элемента управления CommandBarComЬoвox
1012 Приложение В Методы объекта CommandBarComboBox Имя Additem Clear Сору Delete Execute Move Removeitem Reset SetFocus Тип возвращае- Параметры мого значения Object CommandBar- Control Text as String, [Index as Variant] [Bar], [Before] [Temporary] [Bar], [Before] Index As Long Описание Добавляет элемент списка в указанный объект CommandBarComЬoBox. Это дол­ жен быть собственный раскрывающийся список или комбинированный список. При вызове этого метода для поля ввода или встроенного элемента управления работа метода завершится ошибкой Уда.riяет все элементы из объекта CommandВarComЬoBox (раскрывающегося списка или комбинированного списка) или очищает содержимое текстового поля (поля ввода или комбинированного спи­ ска). При вызове этого метода для встро­ енного элемента управления работа мето­ да завершится ошибкой Копирует элемент управления CommandBarComboBox в существующую командную панель Удаляет указанный объект CommandBarComЬoBox из коллекции. Параметр Temporary устанавливается в значение True для удаления элемента управления только на время текущего сеанса. После начала следующего сеан­ са элемент управления опять будет при­ сутствовать на командной панели Вызывает процедуру или встроенную команду, назначенную указанному эле­ менту управления CommandBarComboBox. Для собствен­ ных элементов управления выбор про­ цедуры осуществляется с помощью свойства OnAction Перемещает указанный элемент управ­ ления CommandBarComboBox на суще­ ствующую командную панель Удаляет указанный элемент из элемента управления CommandBarComЬoBox Сбрасывает встроенный элемент управ­ ления CommandBarComboBox в приня­ тую по умолчанию конфигурацию, вос­ станавливая функцию и пиктограмму Перемещает фокус клавиатуры на указан­ ный элемент управления CommandВar ­ ComЬoBox. Если элемент управления от­ ключен или не показан на экране, вызов метода завершится ошибкой
Объектная модель Office 2003 1013 События объекта CommandBarComboBox Имя _ Change Параметры ByVal Ctrl As CommandBarCornЬoBox Описание В.озникает при изменении выделения в элементе , управления CommandBarCornЬoBox Пример: объект CommandBarComboBox Следующая подпрограмма добавляет элемент управления CornrnandBarComЬoBox в собственную командную панель, которая называется Wrox. Список элемента управле­ ния заполняется адресами электронной почты, которые хранятся на листе книги, содер­ жащей код. Подпрограмма Ма i 1То связывается с комбинированным списком и исполь­ зуется для отправки активной книги выбранному из списка адресату.
1014 Приложение В 1Ch6ice Then ' Пользователь выбрал адресата. Отправи.ть выбранному ' адресату активную книгу · ActiveWorkbook.SendМail · Recipients:=ctlCombo.List(lChoice), Subj ect :·=ActiveWorkbook. Name, ReturnReceipt: =<True. If ;~" \EЦd:. i:;u)? ~<-', Коллекция Command BarControls В этой коллекции хранятся все элементы управления командной панели. Имя коллек­ ции используется ТО{!ЬКО при определении типа переменной. Для непосредственного дос­ тупа ко всем элементам управления командной панели можно воспользоваться строкой ~f>.ЩO~i1.~~ar~.I~i1aвeГ !.Ц.4e?,<:J ~::~o~IiCit§ :~·-~ -~. '" --~· · - ~--" где Index является числом, описывающим положение командной панели в коллекции, или строкой, содержащей имя командной панели. Общие свойства коллекции CommandBarControls Определения свойств Application, Count, Creator и Parent приводились в на­ чале приложения. Свойства коллекции CommandBarControls Имя Item Тип возвращае­ мого значения Object Параметры Index As Variant Методы коллекции CommandBarControls Имя Add Тип возвращаемого значения CommandBarControl Параметры [Туре] , [Id], [Parameter], [Before ], [Te mporary] Пример: коллекция CommandBarControls Описание Возвращает объект CommandBarControl из коллекции CommandBarControls Описание Создает новый объект CommandBarControl и добавляет его в коллекцию элемен~ов управления ука­ занной командной панели Следующая подпрограмма перечисляет все элементы управления на собственной ко­ мандной панели, которая ·называется W rox. Кроме списка, на листе выводится · информа­ ция о свойствах. isuJ:?"-~i'S_t:л11cёrit:i-0 1s'i>""'~-,:"~ "_ f. , . ' Dim ; cti' As CommandBarControl r,~.•.- - .Ri rn. ·"pt:;J~p, __As .f.9111IТ\.~I1dJ3p.x:c_9nt:;E,9J_s .:
Объектная модель Office 2003 1015 .-,, . -< ' Сохранить J3Ce элементы управления .командной панели Wrox Set ctlA11 = CofumandBars ("Wrox") .Contro.ls '< ИнициалиЗИроватЬ сЧ'етчик ·.JRoi.:_, = 2 ·. кни.ге ; :. ·:. " i Удалить старый сГ:Йсок .usedRange.Clearco~tents ·• ' РазместИ'Ilь · заr~оловки на листе .Cells(l, 1) .Value .= ''CA~TION " ~ Cells(l, 2}'.VaJ;ue ·.,; . " BUI 0 LTIN"; .. ..Cells(1, 3).Value: = · " I~·" ,. ;Cells(l, 4.) .Value :;J!'.TAG" ' Cells (1 , 5) .Valu:e " TOOLTrP!' .Cells(l. , 6) .Value. = "ТУРЕ'' ' Перебр~ть вс~ Элементы управления, вывощr J:1НформацИю а ; .• каждом элемент\:~. упраБЛе~ЩЯ в . COOTBE!TCTByjQщJ1x . С0ТОЛ6цах . ЛИСТа For Each ctl .In ctlAll " . Cells(lRow, 1) .Value = ctl.Caption .. Celis(lRow; 2) _ . N:a,lue> = ctl.вu iltin . , c ells(lRow, 3) .Value ctl.iD , . CellsORow, 4) .Value ctl.Tag' . Cells(lRow, 5) . Value ctl.TooltipText , . cells(1Row, 6 °).Value ctl.Type . ', lRow lRow·t '1 ' Увещ1чить 'значение счетчика строк . . '' f · ", Автом:атическИ • уста новит ь · ширину сто·лбцов . UsedRange. Entireco.lumn. дutoFi t . End With ' ~]:ng $Ч.Р.. ··~ Объект CommandBarControl j• Этот объект представляет универсальный элемент управления на командной панели. Обычно в качестве элемента управления выступает CommandBarBut ton, CommandBar- ComЬoBox или CommandBarPopup. При использовании одного из этих элементов управления с ним можно работать .через отдельную объектную ссылку. При этом будут доступны все свойства и методы конкретного элемента управления. Объект CommandВarControl применяется тогда, когда нет информации о типе исполь­ зуемого элемента управления или когда используется элемент управления, отличный от пере­ численных выше. Большинство методов и свойств объекта CommandВarControl доступны для объектов CommandВarBut ton, CommandВarBut ton и CommandВarComЬoBox. Общие свойства объекта CommandBarControl Определения свойств Application, Creator и Pare nt приводились в начале при­ ложения.
1016 Приложение В Свойства объекта CommandBarControl Имя Тип возвращае- Описание мого значения BeginGroup Boolean Builtin Boolean Caption String Description- String Text EnaЫed Boolean Height Long 1 Help- Long Co n textid HelpFile String Id Long Index Long IsPriority- Boolean Dropped Left Long Устанавливает/возвращает информацию о том, располо­ жен ли объект CommandBarControl в начале группы элементов управления на командной панели Только чтение. Возвращает значение True, если указан­ ная командная панель или элементы управления команд­ но й панели являются встроенными . Возвращает значение False, если это собственная командная панель или эле­ мент управления. Кроме этого, значение False возвра­ щается для встроенных элементов управления с модифи­ цированным значением свойства OnAction Устанавливает/возвращает текст заголовка элемента управления CommandBarContro1 Устанавливает/возвращает описание объекта CommandBarCo ntrol . Описание не предоставляется пользователю, но может применяться для документирова­ ния поведения элемента управления для других разра­ ботчиков Устанавливает/возвращает состояние объекта CommandBarControl (включен/выключен) Устанавливает/возвращает высоту элемента управления CommandBarControl Устанавливает/возвращает идентификатор контекста для раздела справочного руководства , связанного с элемен­ том управления CommandB arControl Устанавливает/возвращает имя файла справочного руко­ водства, связанного с элементом управления CommandBarControl Только чтение . Возвращает идентификатор встроенного элемента управления cщnrnandBarC on trol Только чтение . Возвращает число типа Lon g , являющееся номером объекта CommandBarCont rol в коллекции Comma n dBarCo nt rols Только чтение. Сообщает, что объект commandBarcontrol исключен из меню или панели инструментов на Ьснове ста- ,· тистики использования и площади макета . (Обратите вни­ мание, что это свойство не идентично видимости элемента . у п равления, которая устанавливается с помощью свойства ,,.. Vis i Ыe .) Если сво йство IsPriori tyDropped установле­ но в значение тrue, установка свойства Visi Ы e в значе­ ние True н е приведет к немедленному п ояв л ению элемента управления на экране # Только чтение . Возвращает горизонтальное положение (в пикселях) элемента управления Comma ndBarContro l относительно левого края экрана. Возвращается расстоя­ ние от левого края области присоединения
Имя Тип возвращае- мого значения OLEUsage MsoControl - OLEUsage OnAction String Parameter String Priority Long Tag String TooI.tipText String Тор Long Туре Msocontrol- Type VisiЫe Boolean Width Long Объектная модель Office 2003 1017 Описание Устанавливает/возвращает роли ОLЕ-клиента и ОLЕ­ сервера, в которых будет использоваться объект CommandBarControl при объединении двух приложений Microsoft Office · Устанавливает/возвращает имя процедуры Visual Basic, которая запускается при щелчке пользователя или изме­ нении значения объекта CommandBarControl Устанавливает/возвращает строку, которая может исполь­ зоваться приложением при вызове команд Устанавливает/возвращает приоритет объекта CommandBarControl Устанавливает/возвращает информацию об элементе управления CommandBarControl. Например, свойство может содержать данные, которые передаются в процеду­ ры в качестве значений аргументов Устанавливает/возвращает текст всплывающей подсказки для элемента управления CommandBarControl Только чтение. Возвращает расстояние (в пикселях) от верхнего края элемента управления commandBarControl до верхнего края :экрана Только чтение. Возвращает тип элемента управления CommandBarControl Устанавливает/возвращает видимость элемента управле­ НL-\Я CommandBarContr ol Устанавливает/возвращает ширину (в пикселях) элемента управления CommandBar Control Методы объекта CommandBarControl Имя Сору Delete Execute Тип возвращае- Параметры Ощ1сание мого значения CommandBar - Control [ Bar], [Before ] Копирует элемент управления CommandBarControl на существующую командную панель [TemporaryJ Удаляет указанный объект CommandBarControl из коллекции. Па- раметр Temporary устанавливается в значение True для удаления элемента управления только на время текущего се­ анса. После начала следующего сеанса элемент управления о,_пять будет присут­ ствовать на команднои панели Вызывает процедуру или встроенную ко­ манду, назначенную указанному элементу управления CommandBarControl. Для собственных элементов управления вы­ бор процедуры осуществляется с помо- · щью свойства OnAction
1018 Приложение В Имя Тип возвращае - Параметры Описание Move Reset SetFocus мого значения CommandBar - Control [Bar], [Before] Перемещает указанный элемент управле­ ния CommandBarcontrol на существую­ щую командную панель Сбрасывает встроенный элемент управ­ ления CommandBarControl в принятую по умолчанию конфигурацию, восстанав­ ливая функцию и пиктогра мму Перемещает фокус клав иатуры на указан­ ный элемент управления CommandBar - Control. Если элемент управления отклю­ чен или не показан на экране, вызов метода за.вершится ошибкой Пример: объект CommandBarControl Следующая подпрограмма выполняет поиск элементов управления Comm andBar- Control по значению свойства Tag. В зависимости от типа найденного элемент?- управ­ ления применяются его уникальные свойства. Свойства State и CommandBar, а также методы Clear, которые испол ьзуются ниже, отсутств уют в списке свойств и методов универсального объекта Co mmandBa rControl, но они будут работать, е сли элемент управления имеет правильный тип. rsub . F:f.ndi::olrmiafidвarёont r o1.( ) ]. . 1· t~: i ! Dim .ctl As . CommandBarControl .': ' _i Найти элемент ·управлен11я из ко~ан.nной · панели Wrox, учитыв ая . 1 зна<iение свойства Tag. ' Пара метр .,Recurs;i.ve ' =Tr 'ue означает, что "поиск выполняется ' п одменю (Comma.ndBarPopup) Set ctl = CommandBars( "Wrox") .FindCont'rol(Tag :=" MailTo", _ · Recursive: =T rue) If Not. ctl Is Nothing Then 'We found the control ' Получить -доступ к уни кальному свой ству или методу элемент а ' управ ле ния . Select Case ctl. Type Case msoCoцtrolBut t on ' Кнопка должна выгл яде1ь нажатой ctl.State = msoButtonDown Case ms oContro lC ombo Box ' Очис тить список комби ни рованно г о списка ctl . Clear Case msoContro l ButtonPopup ' Получить доступ ко второму элементу управления в ' меню/подменю с помощью уникального свойства CommandBar ctl .CommandBar . Controls ( 2 ) .EnaЫed = False Case Else Msg Box . ctl . .Туре End .Sel e ct End If fE_!ld Sub ,·- , . '
Объектная модель Office 2003 1019 Объект CommandBarPopup Этот объект описывает меню или подменю на командной панели. Меню и подменю моrуг содержать вложенные элементы управления командных панелей. Например, меню Файл (File) и Правка (Edit) на панели меню являются элементами управления CommandВarPopup. Подменю Отправить (SendTo) в меню Файл (File) и подменю Заполнение (Fill) в меню Правка (Edit) также являются элементами управленияСоmmаndВаrРорuр. Так как элементы управления CommandBarPopup могут содержать другие элементы управления, по сути они являются отдельными командными панелями . Если предполо­ жить, что первый на собственной командной панели W rox - элемент управления .co mma ndBarPopup, следующий код можно использовать для обращения к элементу управления и применению его в качестве еще одной командной панели: ",,..." 't' · "<,(."~<~'"'"·;~· ~·on> •;<·>;'·v-н· · ."<"С No"' · , " " · . _ ,,_ ,.•.". ., ,:.:,.;': >:':' :'~.- ·_ -." ;:,--~ ~" ··'$:JY "" ~'" ' Ф;i_m 0В1ц· · as CommandBar •!\ : ·. .· :§.§t ,~oв:<i!.:f.""':: . G:9,rnrt)P,J1clJ?a.,r9 (.~ Wf<:>?C::J,,,, c;:.q.r:i t,roJ§J}J ._C,OJ11ПlandBar ..~.··· ....•. .•.•.. . Для обращения к элементу управлен;ия в качестве объекта ComrnandBarPopup необ­ ходимо использовать такой код: !Dim е: t.:1 дs"" corornandвarJ:>o:P11P ;"· • " ,.,•":•·•• ~s~t · .f~t::J, '=.; :.c::.ol))Щ_a,ц§J?aE~"c·:\i:i;:,._ox;•) -.~2.!1t.J;:я1i.:i.(1 J. =·~· Общие свойства объекта CommandBarPopup Определения. свойств Application, Creator и Parent приводилисL в начале при­ ложения. Свойства объекта CommandBarPopup Имя Тип возвращае- Описание мого значения BeginGroup Boolean Builtiri Boolean Caption String CommandBar CommandBar ! Controls CommandBar- Controls Description- String Text Устанавливает/возвращает информацию о том, располо­ жен ли объект CommandBarPopup в начале группы эле­ ментов управления на командной панели Только чтение. Возвращает значение True, если указан­ ная командная панель или элементы управления команд­ ной панели являются встроенными. Возвращает значение False, если это собственная командная панель или эле­ мент управления. Кроме того, значение False возвраща­ ется для встроенных элементов управления с модифици- .. рованным значением свойства OnAction Уьтанавливает/возвращает текст заголовка элемента управления CommandBarPopup Толь ко чтение. Возвращает объект commandBa r , который представляет меню соответствующего всплывающего элемента управлени я Только чтение. Возвращает коллекцию CommandBarControls, в которой содержатся все эле­ менты управления всплывающего меню Устанавливает/возвращает описание объекта CommandBarPopup. Описание 1не предоставляется пользо­ вателю, но может применяться для документирования по­ ведения элемента управления для других разработчиков
1020 Приложение В Имя Тип возвращае- Описание мого значения EnaЫed Boolean Height Long• Help - Long Contextid HelpFile String Id Long Index Long IsPriority- Boolean Dropped Left OLEMenu- Group OLEUsag e OnAction Paramet er Priority Tag Long MsoOLEMenu- Group Ms oC ontro l- OLEUsage St ring S tring Long String Устанавливает/возвращает состояние объекта comrnandBarPopup (включен/выключен) Устанавливает/возвращает высоту элемента управления ComrnandBarPopup Устанавливает/возвращает идентификатор контекста для раздела справочного руководства, связанного с элемен­ том управления ComrnandBarPopup Устанавливает/возвращает имя файла справочного рука-· водства, связанного с ~лементом управления ComrnandBarPopup Только чтение. Возвращает идентификатор встроенного элемента управления ComrnandBarPopup Только чтение. Возвращает число типа Long, являющееся номером объекта ComrnandBarPopup в коллекции ComrnandBars · Только чтение . Сообщает, что объект comrnandBa·rPopцp · исключен из меню или панели инструментов на основе статистики использования и площади макета. (Обратите внимание, что это свойство не идентично видимости эле­ мента управления, которая устанавливается с помощью свойства VisiЬle.) Если свойство IsPriorityDropped установлено в значение True, установка свойства VisiЫe в значение True не приведет к немедленному появлению элемента управления на экране Только чтение . Возвращает горизонтальное положение (в пикселях) элемента управления Comrnand BarPopu p от­ носительно левого края экрана. Возвращается расстояние от левого края области присоединения Устанавливает/возвращает группу меню, которой принад­ лежит объект ComrnandBarPopup при слиянии групп меню сервера OLE с группами меню клиента OLE. Для встроен­ ных элементов управления это свойство доступно только для чтения Устанавливает/возвращает роли ОLЕ-клиента и ОLЕ­ сервера, в которых будет использоваться объект ComrnandBarPopup при объединении двух приложений -v c Microsoft Office Устанавливает/возвращает имя процедуры Visual Basic, которая запускается при щелчке пользователя или изме­ нении значения объекта ComrnandBa r Pop цp Устанавливает/возвращает строку, которая может исполь­ зоваться приложением при вызове команд Устанавливает/возвращает приоритет объекта ComrnandBarPopup Устанавливает/возвращает информацию об элементе управления ComrnandBarPopup, например, свойство мо­ жет содержать данные, которые передаются в процедуры в качестве значений аргументов
Имя Тип возвращае- мого значения TooltipText String Тор Long Туре MsoControl- Туре VisiЫe Boolean Width Long Объектная модель Office 2003 1021 Описание Устанавливает/возвращает текст всплывающей подс~азки для элемента управления CommandBarPopup Только чтение. Возвращает расстояние (в пикселях) от верхнего края элемента управления CommandBarPopup до верхнего края экрана Только чтение . Возвращает тип элемента управления CommandBarPopup Устанавливает/возвращает видимость эле'мента управле­ ния CommandBarPopup Устанавливает/возвращает ширину (в пикселях) элемента управления CommandBarPopup Методы объекта CommandBarPopup Имя Сору Delete Execute Move Reset SetFocus Тип возвращае- Параметры Описание мого значения CommandBar- Con trol CommandBar - Control [Bar] , [Before] Копирует элемент управления CommandBarPopup в существующую ко- мандную панель [ Temporary ] Удаляет указанный объект CommandBarPopup из коллекции. Пара­ метр Temporary устанавливается в зн.а­ чение True для уда л ения элемента управления только на время текущего се­ анса. После начала следующего сеанса элемент управления опять будет присут­ ствовать на командной панели [ Bar], [ Before ] Вызывает процедуру или встроенную ко­ манду, назначенную указанному элементу управления CommandBarPopup. Для соб­ ственных элементов управления выбор процедуры осуществляется с помощью свойства OnAction Перемещает указанный элемент управле­ ния CommandBarPopup на существующую командную панель Сбрасывает встроенный элемент управ­ ления CommandBarPopup в принятую по умолчанию конфигурацию, восстанавли­ вая функцию и пиктограмму Перемещает фокус клавиатуры на указан­ ный элемент управления com!nandBarPopup. Если элемент управ­ ления отключен или не показан на экране, вызов метода завершится ошибкой
1022 Приложение В Пример: объект CommandBarPopup Следующая подпрограмма добавляет собственное всплывающее меню с тремя элемен­ тами управления Comrnand.ВarButton. Меню добавляется в существующее меню собствен­ ной командной панели Wrox. Информация для добавления трех элементов управления Comrnand.ВarButton извлекается из таблицы на листе книги, в которой расположен код. : sиь .Aadcomrnanciвari?opu'PO'"'·~- · · i Dim · ctl.Button А~ CornmandBarButton · Dim ctlPopup As· CornmaiidBarPopup Dim ctlMenuPopup As CommandBarPopup Dim rngControls As Rащ)е, rngControl As Range , ·· • Найти · меню Special . на командной панели Wrox · · · Set ctlMenuPopup - CommandBars ( "Wrox") . FindControl ( · Туре: =tosoControlPopup, Tag: =" PopupSpecial '', · Recursive .: =T _rue) ' Продо.пжать, если меню найдено. Not . c~iмenuPopup Is Nothing Then ' Добавить . элемеf!Т управления меню в найденно~ меню Special~ ' разместив его на первом ме,сте .... < Set ctlPopup = <;:tlMenuPopup.Coдtrols.Add( _ · · Type:~msocontrolPopup, _ Before: =ctlMenuPopup. Gontrols ( 1 ). " Index) . ' .Выбрать диапазон с . Т!J.блriщей, . содержащей описание ' добавцяемых " элемен'l'ов управления · With wksPopup '· Set' rngControls .Range( .Ralige( ''А2"), " ) . End (xlDown) ): _ with ' · .Установить , загоцовок нощJго пункта' меню (с ' буквы Е)' ctlPopup.caption = " "&Edit'' ' Перебра'I'ь · таблицу, Добавляя эл.ементы управления For ' Each rngControl In rngControls . ' Дли встроенных ··элементов управления : ' используе'l'ся' параметр ID методаАdd I f ·Len ( rngCont:ro,1. Offset (О, З) . Value) тhen " Else Set ctlButton ctlPopup.Controls : Add( Set ctlButton Type:;rngControl.Offset(O, 1) .Value, · ID:=rngControl . .Offset(O, З) .Value) ctlpopup.Controls.Add( _ Type:=rngcontrol.Offset(O, End If• . ' Установить ·свойства нового элемента; управления With ctlButton ' Если в столбце BeginGroup таблицы есть значеН:Ие, · добави'ть разделитеЛь · . ·· . BeginGroup" = (Len(rngControl ';Offset(O, 2) .Value) > ' Установить пщстограмму элемента у:прав.riения, .· ' если в столбце · таблицы FaceTD присутс·твует значение; ' Для встроенных элементов управления в этом с'толбце ' НИЧеГО Не ДОЛЖНО бЫТЬ . .•: . rf ..L~.IJ.(E!.1992r1!.:r:.()1 .<9H"9fi_t _ LQ.1 ,;J)~Y~:J:ч~L ./I'he!} · -
Объектная модель Office 2003 1023 '· . Установить значени~ свойства таg · для поиска.• ', э.rieмeri').'i:\ управления : в ~ будущем . If . I:,en(rngControl.Offset(O, 6) .Value} Then _ . Tag = . r ngcontrol.Offset (0, .6} .т~хt ·;, ,. Использовать текст из столбца . '1;~~1Tip для , 1 свойств Caption и ToolTip · . . If ;t;en (ingControl. Offset (о, 7} . Value) Then : .Caption .= . r ngControl. Offset (О, 7} :техt с ; т'ооi tipText · · ingcontrol. Offset: (о : 7} • техt ... nd If .., . ./. ЕГ.d; Wi th ' Nl?xt . ~ngControl Ниже показана таблица, на основе которой генерируются три элемента управления CommandBarBut tons . SиЬМепи Туре BeginGroиp ID Face ID Оп Action Tag Тоо/Тiр Text &Select 441 Select Select Select Numeric Numeric Numeric Numeric Values Values Values Values Paste Special TRUE 370 &Values Paste Special 5836 &Formulas Объект DocumentLibraryVersion Объект DocumentLibraryVersion представляет одну сохраненную версию содер­ жащегося в серверной библиотеке документа с поддержкой совместного доступа и вклю­ ченным управлением версиями. Каждый объект DocumentLibraryVersion является членом коллекции DocumentLibraryVersions, принадлежащей активному документу. Свойства объекта DocumentLibraryVersion Имя Comrnents Тип возвращае- Описание маго значения String Возвращает необязательные комментарии, связанные с указанной версией документа, поддерживающего совме­ стный доступ
1024 Приложение В Имя Тип возвращае- Описание мого значения Index Long . Modified Date/Time ModifiedBy String Только чтение . Возвращает значение типа Long, описы­ вающее положение объекта в коллекции Возвращает дату модификации документа Только чтение. Возвращает имя пользователя, который · последним сохранял на сервере указанную версию доку­ мента, поддерживающего совместный доступ Методы объекта DocumentLibraryVersion Имя Тип возвращае- Параметры Описание мого значения Delete Open Restore Удаляет объект DocumentLibraryVersion иЗ коллекции DocumentLibraryVersions Открывает указанную версию поддержи­ вающего совместный доступ документа в режиме только чтения Восстанавливает предварительно сохра­ ненную версию поддерживаю щего совме­ стный доступ документа Коллекция DocumentLibraryVersions Хранит список объектов DocumentLibraryVersion. Коллекция DocumentProperties Представляет все свойства документа, перечисленные на вкладках Общие (Summaгy) и Custom в диалоговом окне Свойства (Poгpeгties), доступном по команде меню Файл (File). В Excel Документ представлен объектомWоrkЬооk. В Woгd - объектом Document. В коллекции DocumentProperties хранятся два различнf~IХ типа объектов . Одни со­ ответствуют встроенным свойства~'.1, другие - собственным . Встроенные свойства харак­ терны для приложения и доступны на вкладке Общие (Summa1y) диалогового окна Свой­ ства (Pгopeгties) . Собственые свойства создаются пользователем для определенного доку­ мента и предоставляются на вкладке Custom диалогового окна Свойства (Pгopeгties). Важно обратить внимание, что при доступе к коллекции DocumentProperties не­ обходимо использовать свойство BuiltinDocumentProperties для встроенных свQ_йств приложения или свойство CustomDocumentProperties для свойств, создан­ ных пользователем. Странно, но свойства Buil t i nDocumentProperties и Custom- DocumentProperties не описываются в объектной модели Office, хотя являются ч а­ стью объектной модели приложения. Другими словами, эти свойства отсутствуют в опи- сании объектной модели Micгosoft Office ХР. · Для получения доступа к встроенным свойствам документа можно воспользоваться следующим кодом: !~,S:gв2~!~§:!ive\1R,rk"J?1?9~::7J>iiJit.i:@2"CWТ\§:nЪf.i9i5 eJ:Д~es·("~Щ:fNr или
Объектная модель Office 2003 1025 f,til§~_вo,~;:~дti~ИCi:з;ЪI?oSi)s;i~\i}i~J.IJ;t)?ЗI:iЯlii§ri.@.i:.oJ?ert ~~~~ ~Г~&4;,\,v~~,:··J1~ii;Щj?J:~Q?;iri.;Ji''~i1;.·:,::;: . ' Стоит знать, что значение Index для свойства Author равно 3. Дополнительная ин- формация приводится ниже в описании кoллeкцииDocurnentProperties . Для доступа к собственным свойствам документа воспользуйтесь следующим кодом: ~J·9:1$.9~..~;[1;;~:5f,!%ШiiJs:J::!9QJS~~~cЫ~'fJ?ШR'Jk11fu§t1!:J?f:ori'f'i$);~~s.·c:~; :r;;i..rIIg~ill@?'§JiwJliX7i'JJ~ШШ,:r111J1t~;~t;~ или Предполагается, что BillingNumЬer является первым собственным свойством. На вкладке Custom в окне Свойства (P1·opeгties) в Excel предоставляется несколько вариантов собственных свойств, но в список CustomDocurnentProperties попадают только те, которым присвоено значение . Несколько встроенных свойств используются в конкретных приложениях. Например, свойство NurnЬerof Paragraphs используется только в Micгosoft Woгd и любая попытка его применения в других приложениях приводит к появлению ошибки времени выполнения. Общие свойства коллекции DocumentProperties Определения свойств Application, Count, Creator и Parent приводились в на­ чал е приложения. Свойства коллекции DocumentProperties · имя Тип возвращае­ мого значения Параметры Описание Item DocumentProperty Index As Variant Возвращает элемент коллекции. Пара­ метр Index может содержать строковое имя объекта DocumentProperty Методы коллекции DocumentProperties Имя Add Тип возвращае­ мого значения Параметры DocumentProperty Name As String, LinkToContent As Boolean, [Туре], [Value], [LinkSource] Пример: коллекция DocиmentProperties Описание Создает новое собственное свойство. · В кол лекц ию DocumentProperties можно добавлять только новые собст­ венные свойства документа Следующая подпрограмма создает список всех свойств документа. Указывается имя свойства, источник (встроенное или собственное), тип, номер и значение. Номер свойства определяется с помощью переменной counter. Параметр Index определяет положение в списке и может использоваться для доступа к свойству без информации о его имени. На­ пример, в предыдущем коде для встроенного свойства Author использовался номер 3.
1026 Приложение В ',',~' ' Инициализировать счетчики lindex 1 · lRow=2 ' Полу4ить ' доступ •· к листу в ' пределах · книги. · ' неrrосредственный ·., доступ к листу возможен через св6йство Name (в окне .. VBE) • . ,Это возможно, если код и лист находятся:· . With wksBuil tinProperties ' О';J:истить Лист кроме ·заголовков в первой строке . UsedRange. Offset ( 1·, О) . ClearContents ' Подавить вывод сообщений оiuибок при невозможности ' к значению св6йства ··· из Excel On Error Resume Next ' Перёбрать встроещ1ые свойства For Each oProperty In · .Parent.ВuiltinDocumentProperties . Cells(lRow, 1) oProperty.Na:me . . Cells(lRow, · 2) ;, Вс.троенное '" . Cells(lRow, 3) oPrope-rty.TYЬJe • . Cells(lRow, 4) lindex . Cells ( lRow, 5) oPr6p,erty. Value lindex : lindex + 1 lRow =lRow.+ 1 Next oProperty ' Сбросить з1:1аче11ие счетчика ' сi>ойства . l.Index = 1 For Each o 'Property.,1n \ .ceils(lRow, 1) · ·· . cells(lRow, 21 · = , Cells(lRow, 3) = . Cells(lRow, · 4) = . Cells ( lRow, 5) lindex = lindex + lF,_ow '= .. lRow .+ 1 · Next oPropEi!rty ' Выделить Первую >1чейку· 1) . Sel,ect End With End .,su.b Объект DocumentProperty Представляет одно свойство в коллекции DocurnentProperties . Свойство может быть встроенным или собственным. Для обращения к объекrу DocurnentProperty используют­ ся свойства CustomDocurnentProperties или BuiltinDocurnentProperties. Общие свойства объекта DocumentProperty Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Office 2003 1027 Свойства объекта DocumentProperty Имя Тип возвращае· Описание мого значения LinkSource String Устанавливает/возвращает ИСТОЧНИК СВЯЗанноrо собст­ ВеННОГО свойства LinkToContent Boolean Возвращает информацию о том, связано ли собствен­ ное свойство документа с содержимым документа Name Туре Value String Устанавливает/возвращает имя свойства документа MsoDocProper- Устанавливает/возвращает тип свойства документа. ties Для встроенных свойств возможно только чтение. Для собственных свойств возможно чтение и запись Variant. Устанавливает/возвращает значение свойства доку- · мента. Если приложение не определяет значение одно­ го из встроенных свойств документа, чтение значения свойства Value для этого документа приводит к появ­ лению сообщения об ошибке Методы объекта DocumentProperty Имя Тип возвращае- Параметры Описание мого значения Delete Result Удаляет собственное свойство документа Пример: объект DocumentProperty Следующая Подпрограмма добавляет собственное свойство документа, которое назы­ вается Bi l l ingNшnЬer. Пользователю предоставляется возможность ввести значение свойства Value. •'. ~· ..• с<:=>~· ЗаЪро<::йть у Пользователя выделение ячейки или ввод числа . '.}Если · пользqватель 'вьiделяет диапазон, может быть ' ис.пользована · только первая ячейка ' диапазона · y,lfnswer =· Applic.ation. InpμtBox (" .Введите з,!iачение .вц;цri.g:N'i;lmЬe:f? "'-' ")3il ling NurnЬer" , , · , , , , 1)' . ' ':>~.::/> ,.{ }' > ;.• '·· '' <" ,_>· , .
1028 Приложение В ,~,'i Е'Сли свойство не существуе<r, созда<rь его • : r :C.oProperty: Is Nothing Then ' ··Set oProperty = ActiveWork!::>ook. l~custombocumentProperti.es. Add (Name: = "BillingNumber·" , ~. . ··~.- ,,. : . , Li1:1kT.oConteц~· : =Fal.se, _ .;rype: =msoPropertyТypeN\J.mЬer, ' УстановИт1;> · значение свойства· vаluе равным • знаЧ.ению ·функции InputBox ,oJ' rop_erty. Value = vAnswer' ., . ! •, мsgво~к;;~::0:к::~~~Й· ;~~~:~;;~ ;~ · .свойства" · ·.· · ~- ··· End· IГ f~n~•i§~~~~~.ы.. - . .. . .~. . · .. Объект FileDialog об этом пользвоателю vbCritical, "Добавление Этот объект является более структурированной и 'гибкой альтернативой методам GetSaveAsFilename и GetOpenFilename. Он предоставляет возможность модифика­ ции кнопки операции (например кнопки Сохранить (Save) в диалоговом окне Сохранить Как (Save As)) и возможность выбора различных типов .диалоговых окон (кроме Открыть (Open) и Сохранить Как (Save As) ). Кроме этого, предоставляется большая гибкость при определении собственных типов файлов и фильтров (например, "*.Ьil") и возможность ус­ тановки принятого по умолчанию представления, к которому получает доступ пользователь при появлении диалогового окна на экране (например, представления Подробно (Detail) или Крупные значки (Large Icon)). Обратите внимание, что некоторые свойства и методы этого объекта зависят от значения свойства. FileDialogТype, которому присваиваются константы MsoFileDialogТype. На­ пример, запуск следующего кода приведет к появлению сообщения об ошибке при попытке использования методаАdd свойства Filters, если в качестве типа диалогового окна выбран msoFi leDialogSaveAs. Общие свойства объекта FileDialog Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Свойства оъекта FileDialog Имя AllowMulti- Select ButtonName DialogType Filterlndex F ilters Тип возвращае­ мого ·значения Booleдn String MsoFileDialog- Type Long FileDialog- F ilters Initia lFile- String Na me InitialView MsoFileDialog- View Item String Selected- FileDialog- Items Select e d ltems Title String Методы объекта FileDialog Объектная модель Office 2003 1029 Описание Устанавливает/возвращает возможность выбора несколь­ ких файлов из списка Устанавливает/возвращает текст, который выводится на кнопке операции в диалоговом окне. Ло умолчанию этому свойству присваивается стандартный текст в соответст­ вии с типом диалогового окна Только чтение . Возвращает константу MsoFileDialogТype, описывающую тип диалогового окна, которое выводится с помощью объекта F ileDialog Устанавливает/возвращает принятый по умолчанию фильтр для диалогового окна выбора файла . Принятый по умолчанию фильтр определяет тип файлов , которые при­ сутствуют в списке при открытии диалогового окна Возвращает коллекцию F ileDialogFilters Устанавливает/возвращает путь и/или имя файла , кото­ рые показаны в диалоговом окне в момент открытия Устанавливает/возвращает константу MsoFileDialogView, описывающую исходное представ­ ление файлов и папок в диалоговом окне Только чтение. Возвращает текст, связанный с окном FileDialog · Возвращает коллекцию FileDi a logSel ected i tems. В этой коллекции хранится список путей к файлам, кото­ рые пользователь выбрал в диалоговом окне, показанном с помощью метода Show объекта FileDialog Устанавливает/возвращает заголовок диалогового окна, созданного с помощью объекта FileDialog Имя Тип возвращае­ мого значения Параметры Описание Exe cute For Show Long Выполняет операцию пользователя после вы­ зова метода Show. Используется для объектов File Dialog, свойство Туре которых установ- лено в значение msoFile Dia l ogOpen или · msoFil e DialogSaveAs Выводит ди алоговое окно на экран. Возвраща­ ет значени е типа Long, указывающее , щелкнул ли пользователь на кнопке операци и (- 1) или кнопке отмены (О) . При вызове метода Show выполнение кода приостанавливается , пока пользователь не закроет диалоговое окно. Для выполнени я пользовательской операции сразу после вызова метода Sh ow диалоговых окон Open и SaveAs необходимо воспользоваться методом Exe cute
1030 Приложение В Пример: объект FileDialog Следующая подпрограмма запрашивает у пользователя разрешение на сохранение ак­ тивной кни ги с помощью объекта FileDialog. После закрытия диалогового окна Сохранить Как (Save As) подпрограмма выполняет преобразование книги с формулами и именами диапазонов в значения без сохранения имен диапазонов. Sub Converti3illing$tatement() ' . Воспользуйтесь этой константой для обеспечения однородности ' Пределах всей процедуры · Const SNAME_BILLING As String Dim nm As .Excel.Name Dim sPath As String Dim wks As Excel.Worksheet Dim .wkb As Excel.Workbook "Billing'! ' Убедится в том,. что это книга учета, проверив существование · ; скрыт.ого имени On Error Resume Next ·Setwkb;, _ ActiveWorkbook : On Ец:оr GOTo · О ' . Если книга . является активной ... If ' Not wkb . Is Nothing Then On Error Resume Next Set nm = wkb.Names (sNAME_ВILLING) ; Если это файл учета: .. If Not nm rs, Nothing. Then ' Сdхрани~ь текущий путь sI-;ath = CurDir ·' Установить свойства диало.говоrо окна Сохранить. With Application.filebialog(msoFileDialogSaveAs) '. Изменить · принятый .по умолчанию заголовок окна . Title = "Save " & sN'AME~BILLING & " Number'! ' . Изменить текст на кнопке Сохранить ' · пределах диалогового окна . ButtonName = "'Sav'e . " & sNAМE_EП,LING · Лерейти · в папку Billing . _ .IilitialFileName ="С:\" &SNAМEc,_BILLING & ' Переключится на представление Подробно . Initi<J.lView = msoFHeDialo.g -yiewDetails ·• Выве .сти д Иалоговое окно. Е!озвращаемое · означает, · что по.льзователь · не Щелкнул . ' Отмена (Cahcel) If .show = -1 тh.en , · Преобразова~ь . sсе фopмy:Jihi в значения ·For , Бach wks · In wkb.Worksheets ' wks. UsedRange. Сору ". · . . · wks. UsedRange. Pastespeci9-l xlPa.steValues __ ·, .:~;w ;е. )~{~,?S.t .."7.kS . .. ": • ." :.,,"" .• м. ":. ".:7~ ""'- "·• ~"" ·.ш.<.-".~ · "' ·"'
r . , !''' ·, '' fu~ · s t::a t~meni" ~·:. . End If' [. EndIf. ( l~дg .$,μh ;' ..:'' Объектная модель Office 2003 1031 ди,э.пазонов . кроме имени, : · идентИфицИрующего .. книгу · ·· ' ·· · I:'o~r ' .Each nm rn wkb.Names · J'\ If nm. Name ' <> . sNAМE BILLING "J;hen nm. Delete .Next .nm'. · i· - текущий B~ll·ing отсутствует, поэтому это друго.й wkb.дame: & . " is not а " & sNAМE_ВILLING & " vЫnformation, ''Cori.vert " . & sNAME_)ПtLING .& " Коллекция FileDialogFilters Представляет все фильтры, доступные в диалоговом окне FileDialog, вюiючая фильтры, созданные с помощью методаАdd свойства Fil ters объекта FileDialog. Обратите внимание, что фильтры, созданные с помощью метода Add свойства Filters, не отображаются в стандартном диалоговом окне Открыть (Open) и Сохранить Как (Save As). Общие свойства коллекции FileDialogFilters Опреде.Ления свойств Application, Count, Creator и Parent приводились в на· чале этого приложения . Методы коллекции FileDialogFilters Имя Тип возвращае- Пара":fетры мого значения Add FileDialog- Description As Filters String, Extensions As String , [Position] Clear Delete [filter] Item FileDialog- [Index As Filter Long] Описание Добавляет новый фильтр в список фильтров из раскрывающегося списка Файлы типа (Files of type) в диалоговом окне Файл (File). Возвращает объект FileDialogFilter, ко· торый соответствует добавленному фильтру Удаляет все фильтры файлов из коллекции FileDialogFilters Удаляет указанный фильтр из коллекции FileDialogFilters Возвращает указ анный объект FileDi alog- Filter из коллекции Fil eDialogFilters ,; "
1032 Приложение В При~ер: коллекция FileDialogFilters В следующей подпрограмме объект F i leDi alog используется для вывода диалогово­ го окна Открыть (Open). В подпрограмме применяется методАdd свойства Filters для добавления фильтра для собственного типа файла. Обратите внимание, что фильтр со­ храняется в коллекции и после завершения р;~боты подпрограммы, поэтому подпрограм­ ма удаляет фильтр из списка после закрытия диалогового окна. ~·s·u1>:7tJs1~n~gR11eь~a·1agop~nт) '"\···т · ·-~·~ --,_ , ~-- ~ ' '' - . As ,Long ''· ~становить свойства диалоГоЕ\ого окна ОткрЫть файл ;i.t .h . ,, ,.p pl icati on. FileDJ.alog (msoFileDialogOpen) ,'.· Изменить принятый · по умолчанию заголовок :·::: : тi tle , = " Откры,:'ь файлы ' учета" > }._ _ . . . .>, ' • ' ' .Разрешить пользователю ,вьr(SИрать нескол ько Фай.Л ов .' A llowMul tiSelect = True описание и положение филь тра В · списке "Файлы учета", "* . Ьil"' lFILTER~POSITION )3ь~брать 'до(51?в.пенный филЬтр перед выводом диалогового ,i l terindex ;= : l 'FILTER_POSITION :Пs:жазать диалоговое окно ; Значение - 1 означает, что nол?зовате~ь . . щелкн у.ri Н.~ кнопке Отмена (c'ance l) Sh?w =А';;Т:, ;rhen ,.. · ';~Инициали зирова ть с троку сробще ни я sChoseμ ,,;;;,," БьiЛи . вь1браны следующие файлы: " & = · sChose.n ·& ' . Показать список выбранных 'файлов sChosen , vЫn f ormat i on Объект FileDialogFilter Представляет один фильтр в коллекции FileDialog Filters . Для обращения к не­ му воспользуйтесь следующим кодом: fЖi?i;JJ;J~<йtt,1'oii:;:ffi :(ё.JSJ,,§.;1,§§. Crili?siiiJ:eJ5!~10g.Qp~i;iJ: ~.ft :t ~t",ё~§ :11:i;p.<J:~~J :~
Объектная модель Office 2003 1033 Общие свойства объекта FileDialogFilter Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта FileDialogFilter Имя Тип возвращае- Описание мого значения Description String Extenstions String Пример: объект FileDialogFilter Только чтение. Возвращает описание каждого фильтра в диалоговом окне в виде значения типа String Только чтение. Возвращает значение типа string, в ко­ тором перечислены расширения, определяющие список файлов в диалоговом окне В следующей подпрограмме из списка фильтров удаляются все собственные фильтры типов учета из объекта FileDialog типа msoFi leDialogSaveAs. Коллекция FileDialogSelectedltems Эта коллекция содержит выбранные элементы из диалогового окна, доступного через объект FileDialog. Коллекция. будет содержать больше одного элемента, если устано­ вить в значение True свойство AllowMultiSelect объекта FileDialog. При исполь­ зовании диалогового окна типа msoFileDialogSaveAs коллекция всегда содержит один элемент. В кoллeкцииFileDialogSelecteditems хранятся строки. Общие свойства коллекции FileDialogSelectedltems Определения свойств Application, Count, Creator и Parent приводились в на­ чале приложения. 1
1034 Приложение В Методы коллекции FileDialogSelectedltems Имя Тип возвращае- Параметры мого значения Описание Item String Index As Long Возвращает путь к одному из выделенных пользователем файлов . Список файлов пре­ доставляется пользователю с помощью диало­ гового окна, которое выводится с помощью ме­ тода Show объекта FileDialog Пример: коллекция FileDialogSe/ectedltems Следующая подпрограмма является модификаци~й процедуры ConvertBilling- Statement. В этой версии для получения пути и имени файла из диалогового окна типа msoFileDialogSaveAs используется коллекция Select~ditems. После этого возвра­ щаемое значение проверяется на наличие фразы "Wrox Billing" . В случае ее отсутствия диалоговое окно FileDialog выводится повторно. ,Sub ConvertBillingStatement2 () ' · Эта константа используется . для об.еспечения ' ключевого слова в Пределах процедуры Cons~ sNAМE_BILLING As String = "Billing" Dirn bBillName As .Boolean Dim nm As Excel .. Name Dirn sPath As String Dim wks As Excel.Worksheet Dirn wkb As Excel ..workbook ' . Убедится, что это книга учета, · имени проверив су-.цествование скрытого , On Error Resurne Next Set wkb = Active\vorkbook On Error GoTo О ' Если книга активна ... If Not wkb Is Nothing Then On Error Resume Next Set nm = wkb.Names(sNAМE_BILLING) . • Если это книга учета . .. If Not nm Is Nothing Then ' Сохранить текуи.тий путь sPath = CurDiro ,. ' Установить свойства диалогового окна Сохранить With Applicati6n.FileDialog(rnsoFileDialogSaveAs) ' Изменить принятый по :(МОлчанйю ' окна cTitle = "Save '' & sNAМE_BILLING & " 'NurnЬer" Изменить надпись на кнопке Сохранить .ButtonNarne· = "Сохра.нитъ " & sNAМE_BILLING : ' Перейти в папку Billing .InitialFileNarne = "С:\" & .AllowMultiSelect = ' I '.r ue ., sNA-111E.: _J?J;LLING & 11 \ 11
Объектная модель Office 2003 1035 ··· ,:\')J~J,JnTE~'a'7y~;~~ ·· ff) m~oF. ~}ebi.~?!og ~~~~D,fi~~11~ · ··· · . nока J'1уть рiли ИМf фаfjла не , будут . " Wrox Bi11in:g" (илu · пользователь onie Ьтм_еliа / (С:а~с,е1 k · · ' ·· книr~и" ' Вер11утЬ ,'~~ходный · путь qh6i:z:: ;sPdth . Billing отсутствует, поэтому это не файл ·& " отсутствует в книГе " & sNAМE~BILLING, & sNAME_BILLING & " Statement" , ',.; 1
1036 Приложение В Объект FileSearch Объект FileSearch программно имитирует возможность поиска из диалогового ок­ на Открыть (Open) (команда СервисqПоиск (ToolsqSeaгch)). Эта - возможность позво­ ляет искать файлы всех типов в каждой группе папок на основе любого набора критери­ ев. Обратите внимание, ч~о параметры поиска сохраняются между обращениями к объ­ екту и должны сбрасываться с помощью метода NewSearch при каждом использовании объекта FileSearch. Кроме этого , обратите внимание , что метод NewSearch не сбра­ сывает значение свойства Lookln. Общие свойства объекта FileSearch Определения свойств Application, Creator и Parent приводились в начале при­ ложения. Свойства объекта FileSearch Имя FileName FileType FileTypes FoundFiles LastModified Lookin MatchAll- WordForms MatchText- Exac tly Property- Tests Search- Folders Search- Scopes SearchSub- Folders TextOr- Property Тип возвращае- Описание мого значения String' MsoFileType Fi.le'rypes FoundFiles MsoLast- Modified String Boolean Boolean Property Tests SearchFolders SearchScopes Boolean String Устанавливает/возвращает имя искомого файла. Имя мо­ жет содержать символы шаблонов * или ? Устанавливает/возвращает тип искомого .файла Возвращает коллекцию FileTypes Только чтен11~- Возвращает объект FoundFiles, соДер­ жащий имена всех найденных файлов Устанавливает/возвращает константу, которая определяет время с момента последней модификации и сохранения файла Устанавливает/возвращает папку, в которой будет выпол ­ няться поиск файлов Устанавливает/возвращает необходимость расширения поиска с использованием всех словоформ ключевого сло­ ва в содержимом файла или в его свойствах Устанавливает/возвращает необходимость поиска только тех файлов, в содержимом или свойствах которых присут­ ствуют точное слово или фраза Только чтение . Возвращает коллекцию PropertyTests, в которой хранятся все критерии поиска Возвращает коллекцию SearchFolders . Возвращает коллекцию searchscopes Устанавливает/возвращает необходимость поиска в под­ папках текущей папки, указанной с помощью свойства Lookin Устанавливает/возвращает слово или фразу, которую не­ обходимо найти в теле или в свойствах файла. Слово или фраза могут содержать символы шаблона * или ?
Объек:гная модель Office 2003 1037 Методы объекта FileSearch Имя Ex ecu te NewSearch RefreshScopes Тип возвращае- "Параметры мого значения Long [SortBy], [ SortOrder] , [AlwaysAccurate] Пример: объект FileSearch Оiшсание Начинает поиск указанного файла или файлов . Возвраща­ ет значение О, если ни один файл не найден. Положитель­ ное возвращаемое значение указывает , что найден один или больше файлов Сбрасывает критерии поиска в принятые по умолчанию значения Обновляет список доступных объектов ScopeFqlder В следующей подпрограмме выполняется поиск всех файлов, содержащих слово 'Ъilling" в папке с файлами учета. Поиск выполняется среди файлов, которые были мо­ дифицированы в течение последних семи дней. Результат выводится в окне сообщения. {s·иь"""'s e·arch.FO:rR:ec entвiiнnci~i) ~ . . . . As Long As .String пр е дыдущие riараме.тры i · Искать Файлы : xis ~ · содержащие слово . Filename' = " *Bil ling*.xls" модифицированные в течение msoLas tModi.f i edтhisWeek ИС!\ать в rianкe и подпапках ookin = " с : \ Billirig" e archSubFolders = True резуль т ат vЫn;Eormation, " Файлы
1038 Приложение В Коллекция FileTypes Представляет набор типов файлов, поиск которых осуществляется с помощью объек­ та FileSearch. Типы файлов в этой коллекции сохраняются между операциями поиска, поэтому при поиске файлов другого типа важно удалить все типы файлов из коллекции FileTypes. Для этого используется метод Remove объекта коллекции. Новый тип фай­ ла устанавливается с помощью свойстваFilеТуре . Общие свойства коллекции FileTypes Определения свойств Application, Count и Creator приводились в начале при­ ложения. Свойства коллекции FileTypes Имя Тип возвращае- Параметры маго значения Item MsoFileType Index As Lohg Методы коллекции FileTypes Имя Add Remove Тип возвращае- Параметры маго значения FileType As MsoFileType Index As Long Пример: коллекция FileTypes Описание Только чтение . Возвращает значение, опре­ деляющее тип искомого файла Описание · Добавляет новый тип файла в критерии по­ иска Удаляет указанный тип файла из коллекции FileTypes Следующая функция сбрасывает объект FileSearch, вызывая метод NewSearch. Свойство Lookin сбрасывается в принятый по умолчанию путь С: \. Для удаления объ­ ектов FileType из коллекции FileTypes используется цикл, перебирающий элементы коллекции в обратном порядке . · , suь l\fews·ea.:r·c:ьo· ·· ··~ .., . ·•· - ~-- ·· -~ ·-~ --- · ' · Сбросить объект FileSearch ResetFileSearch With Application.FileSearch ' · Здесь . необходимо добавить код для определения · . ' поиска End With End Sub 1Function ResetFileSearch() · Dim lCount As Long · Dim oFileTypes As FileTypes , Dim oPropertyTests As PropertyТests . t -{ith Appl{cation : FileSearch
Объектная модель Office 2003 1039 !~<':~·]';'{' ·':~~~i~~~~~;, iiр~дыдущИi/ Пар~ме'т~)Ы" ПЪiГска: · ' "' '<: Сбросит;'Ь свой ~ тв' о LoQkI.n, ., установои.в его в принятое по , , ·:!'• ~ ' ~· у,МоЛЧ..ЭниЮ з»ачение ·> ' ' ' Вьrзов . ме.тода NewSearch не, ~ nриводJdт к срросу этого свойства /Gookin =' ·:'С: \ .~· ' {: '/Уд~лить . все..,обЪект~r Fll'eт~e Fi1eTypes Set oFileT}'pes = .Fi:teт,,:Pes ,," , ..,.:,i~ ,~. '. . ,. ,,-~_:•': '.':·x;z:,::.:". ':'·:~ >~~1:-'{~=--~ . ~- '.~;~ ·:'' 0 ·· ~ ::· При удалении · Сdдержи~ого коллекции FileTypes, Property'J'ests · ' · и. $'earchFp1ders Н:омер Элемента после удаляемо .го уменьшается tia .\ ? еДЙЪ~йцу}f~ · . . .· ·.J ,:, по~~рму.' коллекцию необходимо перебирать в обратном порядке : .; :;длЯ: , Избежания сообщен ия об ошибке Subscript Out of Ra nge . ; For'' 1count = oFileTypes, Count то 1 Step - 1 oFileTypes.Remove lCount Next lCount .' Очистить ' коллекцию Proper:tyTests Set 0Pr,ope5tyTests = "< . Property~e:;ts i•;, : For ,: 1c;ount ·"' oJ;>ropertyTests ..coun\::. то'' г );.i t: oPr.opeft:Yтeiits:: R.eroo ve . 1caU:nt ; ' · · ··~Next' icount. · ' · ' ' ··· · ' · , оЧистить ~щллекЦию Bear~hFolder~ , For lCoiint = . SearchFolders.Count· то i Step -1 ,' ,~ : searchFo.lders. Remove· lCount · •Ne.xt lCdunt Объект FoundFiles Объект FoundFiles содержит список файлов, найденных в результате поиска, Общие свойства объекта FoundFiles Определения свойств Application, Creat:or и Parent приводились в начале при­ ложения. Свойства объекта FileTypes Имя Тип возвращае- Парамеiпры мого значения Описание Item String Index As Long Только чтение. Возвращает имя файла из списка Объект HTMLProject Этот объект представляет код HTML, который используется для вывода документа Office в виде документа HTML. Для доступа к НТМL-версии документа Office можно воспользоваться редактором Micгosoft Scгipt Editoг .
1040 Приложение В Информация об управлении объектами и параметрами с помощью Mic1·osoft Scгipt Editor выходит за пределы тематики этой книги. Но здесь приводится краткое описание перед использованием объектов HTML из объектной модели Office. Редактор Scгipt Editor похож на редактор Visual Basic Editor. В нем доступно окно Project Explorer (Окно проекта), окно Properties (Сво!;ства) , панель Toolbox (Элементы управления) для добавления элементов управления и окно Code (Код) для создания кода HTML. Модификация параметров и содержимого документа в редакторе Script Edito1· приводит к модификации документа Office. В Excel данные выводятся в формате элек­ тронной таблицы с использованием технологии WYSIWYG (What You See Is What You Get), то есть представление на экране совпадает с конечным результатом . Редактор Scгipt Editor предоставляет доступ ко всем элементам форматирования, параметрам, данным и коду HTML в одном окне. Форматирование не выводится, но предоставляется доступ к коду HTML, составляющему форматирование. Редактор Scгipt Editor позволяет модифицировать НТМL-версию документа Office через добавление и модификацию кода HTML, изменение параметров объектов , добав­ ление событий и т.д . Редактирование параметров и кода HTML в редакторе Scгipt Editor чаще всего приводит к J;iЗМенению документа Office. Объект HTMLPi-oject содержит объекты так же , как объект VВProject хранит объекты книги. Например, в объекте VВPгoject для книги хранятся объекты Sheet для каждого листа в ее пределах . Редактор Script Editoг позволяет редактиров.ать свойства объекта HTML в окне Properties (Свойства) , похожее на окно Properties (Свойства) · в редакторе VВЕ, хотя большинство свойств не совпадают со свойствами в редакторе VВЕ. Напри­ мер, в редакторе Sc1·ipt Editoг можно выполнить двойной щелчок на объекте Sheet и в окне Properties (Свойства) изменить значение свойства Background, указывая на рисунок, хранящийся на жестком диске . Если проект сохранить на диске и открыть в окне Excel , фоновый рисунок будет показан на экране . В редакторе VBE такого свойства объекта Sheet не существует, но для доступа к этому параметру можно воспользоваться командой меню Excel Формат~Лист~Подложка (Foгmat~Sheet~Backgгound) . Кроме того, свой­ ство можно изменить программным образом из кода VВА., Объекты HTML в объектной модели Office поддерживают доступ и управление кодом HTML документа Office . Это похоже на возможности объектной модели VBE по предо- ставлению доступа к VВProject и его объектам. · Общие свойства объекта HTMLProject Определения свойств Application, Creator и Parent приводились в начале при­ ложения . Свойства объекта HTMLProject Имя Тип возвращае- Описание мого значения HTМLProject- HTMLProject- Iterns Items State MsoHTML - Proj ectState Только чтение . Возвращает кол лекц ию HTMLProjectitems, которая включена в указанный про­ ект HTML Только чтение. Возвращает текущее состояние объекта HTMLProject
Объектная модель Office 2003 1041 Методы объекта HTMLProject Имя Тип возвращае- Параметры Описание мого значения Open [OpenKind As Открывает указанный проект HTML MsoHTMLProj ectOpenJ в редакторе Microsoft Script Editor с использованием одного из пред­ ставлений, выбранных с помощью константы MsoHTMLProj ectOpen. Если не указана ни одна из кон­ стант, проект открывается с ис­ пользованием принятого по умол­ чанию представления Refresh- Document Refresh As Boolean Обновляет указанный проект HTML = True в приложении Microsoft Off ice. При установке параметра в значение True все внесенные изменения со­ храняют.ся. При установке пара­ метра в значение False все изме­ нения игнорируются Refresh- Proj ect Refresh As Boolean Использование этого метода эквива- Тruе лентно щелчку на кнопке Refresh на панели ·инструментов Refresh в ре­ дакторе Microsoft Script Editor. Если при обновлении документа параметр Refresh установить в значение True, все изменения в исходном ко­ де' НТМL будут сохранены в проекте HTML в редакторе Microsoft Script Editor. Если пар аметр установить в значение False, все изменения кода HTML будут проигнорированы Пример: объект HTMLProject Следующая подпрограмма устанавливает ссылку на объект HTMLProj ее t из активной книги и использует эту ссылку для предоставления количества элементов и состояния блокировки проекта. После этого проект выводится в редакторе Script Editor. , suь нтМL'Рrо) eё't.int'o'<T':- .= ·,,- ., · т • • ~·· .,.".~~· '"""'"" '" ·-~- • ., =--- · . Diпi oHTМLProj ect As HTМLProj ect ' · Сохранить ссылку на проект НТМL Set .oHTMLProject = ActiveWorkЬook.HTMLP;r:oject Wi.th oHTМLProj ect ·: , ' Вывест·и количест ,во · элементов проекта· И состояние блокировки " Документа или проекта k,,... MsgBox " Количество элементов проекта: " & _ 1:H'ri1LPro j ectltems . Count &· vbCrLf & :_ ~:· . . "С()стояние блокировк~: " & .~tate, yЫnformation, !f, · : Инфор1;1ация о проекте НТЩ," ~·r,,,;.: i· ' ~' ,, ' .· .. . •< Показ ать · проект в редакторе Script · , Open (nisoHTMLProj ectOpenSo.urceView) With . lgnq .S1,lb:,, · . ,. Editor
1042 Приложение В Коллекция HTMLProjectltems Представляет все объекты (элементы) проекта HTML. Проекты содержат объект StyleSheet, в котором хранятся стили для всего проекта (это напоминает возможность стилевой разметки в Excel и Woгd). Все проекты содержат объект, представляющий до­ кумент (книгу) . Например, книга Wrox Examples. xls будет содержать элемент HТМLProj ectitem, который называется WroxExamples. xls. Этот объект будет храниться в коллекции HTML Projectitems, принадлежащей объекту HТМLProj ect из этой книги. В этом эле­ менте проекта хранится информация о текущем приложении, объектах внутри проекта (например, листах книги), а также о свойствах доь.тмента (встроенных и собственных; та­ кие свойства рассматривались ранее в разделе, посвященном коллекции Docшnent­ Properties). Кроме этого, каждый лист в Excel является объектом из коллекции HТМLProjectitems. Общие свойства коллекции HTMLProjectltems Определения свойств Application, Count, Cr~ator и Parent приводились в на- чале приложения. Методы коллекции HTMLProjectltems Имя Тип возвращае­ мого значения Параметры ' Описание Item HTMLProjectitem Index As Variant Возвращает объект HTMLProjectitem, Объект HTMLProjectltem представляющий определенный проект в редакторе Microsoft Script Editor Представляет один элемент коллекции HTMLPro j ее t I t ems . Общие свойства объекта HTMLProjectltem Имя Тип возвращае- Описание мого значения IsOpen Boolean Только чтение. Возвращает информацию о том, открыт ли ука­ занный элемент проекта HTML в редакторе Microsoft Script Editor Name String Text String Только чтение. Возвращает имя объекта HTMLProj ectitem Устанавливает/возвращает текст кода HTML в редакторе HTML Методы объекта HTMLProjectltem Имя LoadFrom- File Тип возвращае- Параметры мого значения FileName As String Описание Обновляет текст в редакторе Microsoft Script Editor на основе содержимого файла
Объектная модель Office 2003 1043 Имя Open Sav e- CopyAs Тип возвращае- Параметры мого значения [OpenKind As MsoHTMLProj~ctOpen] FileName As St r ing Пример: объект HTMLProjectlteт Описание Открывает указанный элемент лро­ екта HTML в редакторе Microsoft Script Editor с использованием од­ ного из указанных с помощью кон­ стант MsoHTМLProj ectOpen пред­ ставлений. Если значение пара­ метра не указано, элемент проекта открывается с использованием принятого по умолчанию представ­ ления Сохраняет указанный элемент проекта HTML в файле с новым именем Следующая подпрограмма сохраняет код HTML для элемента Workbook из колл ек­ ции HTMLPro j ectitems в те кстовом файле и выводит код в редактор е Script Editoг . Объект LanguageSettings Возвращает информацию о языковых параметрах, которые в -данный момент исполь­ зуются в приложении . Эти параметры доступны только для чтения и управляют отобра­ жением и редактированием данных в некоторых приложениях. Общие свойства объекта LanguageSettings Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
1044 Приложение В Свойства объекта LanguageSettings Имя LanguageID Language - Preferred- ForEditing Тип возвращае- Описание мого значения Long Boolean rолько чтение. Возвращает идентификатор региональных параметров (LCID) для языков программы установки, поль­ зовательского интерфейса или справочного руководства Только чтение. Возвращает значение True, если значение константы msoLanguageID указано в системном реестре Windows в качестве идент ификатора предпочтительного языка редактирования Пример: объект LanguageSettings Следующая подпрограмма выводит сообщение при недоступности дополнительных · языковых режимов. В Access и Excel дополнительные языковые режимы . могут оказывать влияние на внешний вид и поведение приложения. [su.ь·:-cьa:пg.ёL<щQ-UageID( J ! Dim oLanguage As LanguageSettings ·· полуЧи..Г:Ь ссЬUiку на об.:Ьект LanguageSettlngs Set oLanguage = Applicatioq.LanguageSettings • ' Проверить наличие поддержки дополнительных ' ·, результат при их отсутствии ·· ."_ f· If oLanguage . LanguageID(riisoLanguageIDExeMode) = О Then 1 MsgJ?ox " 0Поддержка многоя·зыкового просмотра и редактировани>L" '· ·· "отсутствует. Установите дополнител~,ные языковые ·пакетЫ" ' & k " '' ДОI]ОЛни'т.,;льнаЯ информация приводится в справочном . ! ~ руkовЪдстве в раsделе поис~а" · & _ · ·.· . t - , "идентификатора LanQ-uageID. 1' ' , l vЫnformation, "La-nguage ID'' i Erid If ~.' .,' LEt:i_d. , S!iJ:>,,K-'- Объект MsoEnvelope Это новый объект, позволяющий отправлять данные из приложения с помощью поч­ тового агента Outlook без использования объектной модели Outlook. Свойство Index этого объекта обеспечивает доступ к возможностям агента Outlook, недоступным через функцию SendМail , например, к полям Voting Options, СС и ВСС. Кроме этого, предо­ ставляется доступ к параметрам форматирования тела сообщения (HTML, Richtext и простой текст) и другим параметрам сообщения . Обратите внимание, что объект MsoEnvelope отправляет документ внутри тела сооб­ щения в виде отформатированного текста, а не присоединяет документ к сообщению. При этом существует возможность создания вложений с помощью cвoйcтвaAttachrnents объ­ екта Maiitem, доступного через свойство Index. В Excel этот объект доступен только через объекты Worksheet или Chart, а значит отправляются только эти объекты, а не вся книга. Данный объект напоминает функцию SendМail в Excel, но он предоставляет объект CommandВar и поддерживает добавление текста вступления (lntroduction). Установленные свойства сохраняются в документе/книге и используются в дальнейшем.
Объектная модель Office 2003 1045 Общие свойства объекта MsoEnvelope Определение свойства Parent приводилось в начале приложения. Свойства объекта MsoEnvelope Имя Тип возвращае- Описание мого значения CornmandBars CornmandBars Introduction String Item Object Возвращает коллекцию cornmandBars Устанавливает/возвращает вступительный текст, кото­ рый отправляется вместе с документом с помощью объ­ екта Ms oEnvelope. Вступительный текст добавляется в начало документа в сообщении электронной почты Возвращает объект Mailitem, ко торый мож ет использо­ ваться для отправки документа в в ид е сообщения эле к­ тронно й почты События объекта MsoEnvelope Имя Параметры Описание EnvelopeHide Возникает при сокрытии пользовательского интерфейса, связанного с объектом MsoEnvelope EnvelopeShow Возникает при отображении пользовательского интер­ фейса, связанного с объектом MsoEnvelope Пример\ объект MsoEnve/ope Следующая подпрограмма создает сообщение (Outlook Mailitem) для листа (для этого используется свойство Name из окна Properties (Свойства) в редакторе VBE) и устанав­ ливает тему, вступительный текст и получателя. После этого вся книга добавляется в ка­ честве включения и подпрограмма отправляет сообщение . ;stiь>sencfshё"et' () , t";;J Seri'dМsoMail ;''Robe):'t Rosenberg" fEhd Sub .' г>. ,..._ [~lliil~tior:i SendMsoMa11 (ВyVal ' -... ~ ;'.'-~·-_, -~ "-:'/ Di;n' ciмafiE:nv·. ~s ·м'sciEnv~lope ·.. Dim oмailrtem · A:s мailitem >'"':' '. ,:' .. <;'~" ·; . ' - ' . • · h~л;,;,{.rи'I'Ь -~СЬ!J]КУ .·. на . объект MsoE11velo~e ' set . oMailEnv = v1ksincome .MailEnvelope , ' . ,_. -· ·,_ .. .-. ' ~- '~- ' Настроhт·ь :р)нвЕ?рт " Wi t,h oMail.Env 1 ' доба. ви~ь ·· встуш.1т~льный текст i который добавляется над ' фак-rиЧескими · Данными в сообщении . оutlооk Mai1Item "' Introduction = · •вот цифры, котарьrе Вы просили." & _ . •:·для удобства в сообщение· вкЛ'iочена вся кн"ига _ " полУчить /ссылку на: объект Mai1Iterri, поддерживающий доступ к · ~етодам outlook' M~ilitem · ·.. · . . J;tern i.l.J!_4f.~P.<.m2-'Je:. 2.9j~_к,т: f-!~(lr_t_ern .... ""' · ~- ... ... ·.
1046 Приложение В w:Ltь oмaiiiteт · ' ВкЛючить книгу в сообщение · !'ttachrnf>nts . Add ThisWorkbook.FullName ' Выбрать форматирование с помощъю ' НТМL . ·BodyFormat = olFormatHTML ' Д9бавить имя получателя и проверить ' · функции Outlook Check Name .Recipients.Add strRecipient . Recipients.ResolveAll ' Добавить тему сообщения . Subj ect = "Вот· до.кумент. " ' . Отправить сообщение . .Метод Di~play не .Send End With End With i' . iJ';IJ:cl..Function Объект NewFile Соответствует новому документу в панели задач приложения. В Excel Этот объект по­ зволяет добавлять книги в любой из пяти разделов области задач: Открыть книгу, Чистая книга, На основе имеющейся книги, На основе шаблона или в нижний раздел (без имени). При щ'елчке на добавленной книге в разделах Чистая книга, Из имеющейся кни­ ги или На основе шаблона Excel по умолчанию создаст копию файла, если не переопре­ делить это поведение с помощью параметраАсtiоn методаАdd. Общие свойства объекта NewFile Определения свойств Application и Crea tor приводились в начале приложения. Методы объекта NewFile Имя Add Remove Тип возвращае- Параметры мого значения Boolean Boolean FileName As String, [Section], [DisplayNameJ, [A,ction] FileName As String, [Section], [ DisplayName] , [Action] Пример: объект NewFile Описание Добавляет новый элемент в область задач Удаляет элемент из области задач Следующая подпрограмма добавляет новый файл в раздел Из имеющейся книги. В области задач этот пункт будет называться Новая книга учета, но при щелчке будет выполняться копирование книги NewFile. xls, расположенной на жестком диске в ка­ талоге Billing.
Объектная модель Office 2003 1047 Коллекция ODSOColumns , Соответствует набору полей данных (столбцов) из источника данных Mail Merge. Общие свойства коллекции ODSOColumns 1 Опреде.Ления свойств Application, Count, Creator и Parent приводились в на- чале приложения. Методы коллекции ODSOColumns Имя Тип возвращае- Параметры мого значения Описание Item ODSOColumn Index As Integer Возвращает объ~кт ODSOColumn из кол­ лекции Объект ODSOColumn Соответствует одному полю ист·очника данных Mail Mel'ge . Общие свойства объекта ODSOColumn О~ределения свойств Application, Creator и Parent приводились в начале при­ ложения. •В обоектноймодели Office 2003 этот обоект появился. - Примеч. ред.
1048 Приложение В Свойства объекта ODSOC.olumn Имя Тип возвращае- Описание мого значения Index Na me Value . Long String String Только чтение . Возвращает положение объекта в ко ллекции Устанав л ивает/возвращает имя текущего объекта Устанавливает/возвра щает значение текущего объекта Коллекция ODSOFilters Представляет набор фильтров , применяемых к источнику данных M ail Mei-ge. Фак­ тически фильтры являются запросами, ограничиваю'щими множество возвращаемых за­ писей при использовании источника данных Mail Me1·ge. н~···~анНь1й момент не моЖ~т быть реализована. Требует ссылки на · объек~ Offlc'eDat~~ . ·.,SourёeObject через .объект Application текущего приложения. В объ~ктной .: модеh.~ · . 9ff i<:e ХР oб.ъeкт ,OfficeDat;aSourceObj~ct, oтcyтcтвyeт~ Общие свойства коллекции ODSOFilters Определения свойств Application, Count, Creator и Parent приводились в на­ чале приложения. Методы коллекции ODSOFilters Имя Тип возвращае- Параметры Описание мого значения Add Remove Item Объект ODSOFilter Добавляет новый фильтр в коллекцию . Допол­ нительная информация доступна в справочном руководстве Уда ляет фильтр из коллекции. Дополнительная информация доступна в справочном руковод­ стве Возвращает объект ODSOFil ter из коллекции Соответствует одному фильтру из коллекцииОDSОFil ters. На Данный · мо~е~; не моЖет; бьiть р~алиЗован.• Требует. ссы~ки н~ ~бъ~кт Off-J. Je~'~t{a_.:tf';: So1frceObj ec:t Через , объект ·Applicatiori текущего приложения. В объектной ~-?f"eI)?(; . . Qffice ХР. c?бъeкгQffi'ceDataSoui:ceObj ect отсутст~ует. . ". ',;;;,. •;\\!(/М •." . ' ·, ' ., ; ' ·.- ·.<' Общие свойства объекта ODSOFilter Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Office 2003 1049 Свойства объекта ODSOFilter Имя Тип возвращае- Описание мого значения Column String Устанавливает/возвращает имя поля в источнике данных Mail Merge, для которого используется фильтр CompareTo String Устанавливает/возвращает текст для сравнения в крите­ рии фильтра Conjunction MsoFil terCon- Устанавливает/возвращает константу junction MsoFilterConjunction, определяющую соединЕ!ние фильтра с другими фильтрами из коллекции ODSOFilters Index Long Только чтение . Возвращает положение объекта в коллекции Объект OfficeDataSourceObject Представляет источник данных при операциях Mail Meige. Позволяет получать на­ бор записей, которые удовлетворяют определенному критерию. Свойства объекта OfficeDataSourceObject Имя Тип возвращае- Описание мого значения Columns ODSOColumns ConnectString String DataSource String RowCount Long ТаЫе String Объект Permission Возвращает коллекцию ODSOColumns, предоставляю­ щую доступ к полям источника данных Устанавливает/возвращает строку подключения к ука­ занному источнику данных Mail Merge Устанавливает/возвращает имя связанного источника данных Только чтение. Возвращает количество записей в ука­ занном источнике данных Только чтение. Возвращает имя таблицы из источника данных, содержащей записи Mail Merge Объект Permission используется для ограничения доступа к активному документу, а также для получения или установки определенных параметров этого ограничения. Свойства объекта Permission Имя Тип возвращае- Описание мого значения Application Object Count Long Возвращает объект Application, соответствующий при­ ложению, в котором хранится текущий объект Устанавливает/возвращает значение типа Long, описы­ вающее количество элементов в коллекции
1050 Приложение В Имя Тип возвращае- мого значения Creator Long Document- String Author EnaЫed Boolean ЕnаЫеа- Boolean Trusted- Browser Ttem UserPermission Parent Object Permission- Boolean FromPolicy Policy- String Description PolicyName String Request- String Permission- URL Store - Boolean Licenses Методы объекта Permission Описание Возвращает значение типа Long, указывающее на прило­ жение, создавшее текущий объект Устанавливает/возвращает имя автора акfивного доку­ мента Устанавливает/возвращает состояние ограничения досту­ па для активного документа (включено/выключено) Qпределяет возмоЖность просмотра документа в WеЬ­ обозревателе с огран~ченными разрешениями, если при­ ложение не установлено Возвращает объект UserPermission, входящий в кол­ лекцию Permission. Объект UserPermission связыва­ ет набор разрешений доступа к активному документу с одним пользователем и датой истечения действитель­ ности разрешений на доступ Возвращает ссылку на родительский объект текущего объекта Возвращает значение типа Boolean, указывающее на применение разрешений доступа к активному документу Возвращает описание политики разрешений, применяе­ мой к активному документу Возвращает имя политики разрешений, применяемой как­ тивному документу Возвращает WеЬ-адрес или адрес электронной почты от­ ветственного лица, к которому можно обратиться для по­ лучения разрешения на доступ к документу Возвращает значение Boolean, указывающее на необхо­ димость кэширования пользовательской лицензии для под- держки автономного просмотра документа при невозможно­ сти подключения к серверу управления правами доступа Имя Тип возвращае- Парflметры мого значения Описание Add UserPermission [UserID] , [Perпiission], [ExpirationDate] ApplyPolicy [Filename] RemoveAll Коллекция PropertyTests Создает новый набор разреwений доступа к активному документу для указанного пользователя Применяет указанную политику к активному документу Удаляет все объекты UserPermission из коллекции Permission активного документа Эта коллекция содержит список критериев поиска, которые используются объектом FileSearch. Коллекция аналогична вкладке Расширенный (Advanced) диалогового ок­ на Поиск файлов (Seaгch). Для доступа к этому диалоговому окну выберите команду
Объектная модель Office 2003 1051 СервисqНайти (ToolsqSeaгch) в диалоговом окне ФайлqОткрыть (FileqOpen). Дщшая коллекция используется для установки нескольких критериев поиска файлов. · Для добавления расширенных критериев поиска применяется метод Add коллекции PropertyТests. Общие свойства коллекции PropertyTests Определения cвoйcтв, Application, Count и Creator приводились в начале при­ ложения. Свойства коллекции PropertyTests Имя . Тип возвращае- Параметры мого значения Описание Item PropertyTest Index As Long Возвращает объект PropertyТest из коллек ­ ции РrореrtуТеsts Методы коллекции PropertyTests Имя Тип возвращае- Параметры · Описание мого значения Add Name As String, Condition As MsoCondition, [Value], [SecondValue], [Connector] Добавляет объект PropertyTest в ко л­ лекцию PropertyTests Remove Index As Long Удаляет объект PropertyTest из кол­ лекции PropertyTests Пример: коллекция PropertyTests Следующая подпрограмма запрашивает у пользователя учетный номер и находит все книги Excel в указанной папке, у которых значение свойства дoкyмeнтaBillingNumЬer больше или равно ответу пользователя. rstiь .·searcьвп.11n.9&u.1nьer · 1 ~.' 't ,- " ~.~ )': ,, ' ~. бim ICount As Long, lNumЬer As Long .,' . ·Dii;n "i:Jiiiles Ai;;" Foun,dFiles bim sF±lesAs str:ing :i':·" · }\ ~а:просИть ниЖнюю . гrаниЦу - 1;ющ:ка :по учетному номеру lNЧmher · Applicatio& Inputвox ( _ · .. "С какого учетного номера (начиная с 1) " & ,- 11 начинать · поис-к? 11 , _ "Поиск учетного номера" , , 1) ни одного · файла ·,:/~ ~: ,·;. ' . ' . . .. . ', _· BocПoльзoвaтьcя . фyнкцl!!eйReturnBillingNumЬers для получения списка файлов учета с номером больше· , чем значение · INumЬer set; o·Files ·= ReturnBillingNцmЬers (lNumЬer) ' '"'_,..''" . . ··-1
1052 Приложение В ' с66бщИir;Ь реsультат If Not o.Files Is Nothing Then sfiles = "Найдено файлов:" & vbCrLf For lCount = 1 То oFiles.Count sFiles = sFiles & vbCrLf & oFiles(lCount) Next lCount EndЦ · · показать результаты nоиска MsgBox sFiles, vЫnformation, "Billing 'Files" End If ·End Sub :Function ReturnBillingNumbers(lNUтber As Long) As FoundFiles · Wi th Appli_catiqn. FileSearch Сбросить предыдV!ЦИЙ поиск, включая значения . свойств FileTypes и Lookin, а также условия свойс тв. ' Пример э т ой подпрогра!v!.МЫ показан в раздел е с описанием · ' коллекции FileTypes ResetF.ileSearch ' Добавить первое условие: только книги Excel. . ' Воспользоваться значением And параметра Connector· для удовлетворения обоих . условий · .PropertyTests.Add _ Name ·: ="Files of Туре", _ Conditiori:=msoConditionFileTypeExcelWo'rkbooks, Connector:=msoConnectorAnd ' Добавить второе условие: значение свойства ' боЛьше, чем значение INumЬer .PropertyTests .Add _ Name:="BillingNumber", _ . . Condition:=msoConditionMoreThan, Value: =lNumber Поиск в папке Billing .Lookin "C:\Billing" ' Выполнить поиск и вернуть результаты If .Execute > О Then. Set ReturnBil.lingNumЬers = . FoundFiles End If End With , }. EI1d yunction Объект PropertyTest Соответствует единственному критерию в коллекцииРrореrtуТеsts . Общие свойства объекта PropertyTest Определения свойств Application, Creator и Parent приводились в начале при­ ложения.
Объектная модель Office 2003 1053 Свойства объекта PropertyTest Имя Тип возвращае- мого значения Condition MsoCondition Connector MsoConnector Name String SecondValue Variant Value Variant Пример: объект PropertyTest Описание Только чтение. Возвращает условие указанного критерия поиска Только чтение. Возвращает соединитель между двумя по­ хожими значениями условиями. По умолчанию это свой­ ство установлено в значение msoConnectorAnd Только чтение. Возвращает имя объекта PropertyTest Только чтение. Возвращает необязательное второе усло ­ вие для поиска файлов Только чтение. Возвращает значение условия для поиска файлов Следующая подпрограмма удаляет объект PropertyTest, предназначенный для по­ иска книг Excel. :/~Irn lrtt;!in As Lond .. · D i ЦJ oProperty P:r::operty:r'E::!i'/t ' ..·J )," • ' i ' 1;11;iиЦиад11зировать счеt;<ик l1'tem ~ 1 Коллекция ScopeFolders· В этой коллекции хранится список подпапок для объекта ScopeFolder. Данная кол ­ лекция используется коллекцией SearchFolders объекта FileSearch для определе­ ния списка папок и подпапок, в которых выполняется поиск. Каждый элемент коллекции ScopeFolders является объектом ScopeFolder и может использоваться (но не обяза­ тельно) в процессе поиска. Каждый объект ScopeFolder с подпапками содержит собст­ венный экземпляр коллекции ScopeFolders (как подпапки, в которых присутствуют другие подпапки).
io54 Приложение В Общие свойства коллекции ScopeFolders Определения свойств Application, Count и Creator приводились в начале при­ ложения. Свойства коллекции ScopeFolders Имя Тип возвраЩае- Параметры мого значения Item ScopeFolder Index As Long Объект ScopeFolder Описание Возвращает объект scopeFolder, соответ­ ствующий подпапкам родительского объекта Соответствует одной папке из коллекции ScopeFolders. Каждый объект ScopeFolder содержит собственную коллекцию ScopeFolders, которая соответствует подпапкам папки из объекта ScopeFolder. И объект ScopeFolder, и коллекцию ScopeFolders можно ана­ лизировать для определения их применимости в процессе поиска с помощью объекта FileSearch. Любой интересующий во время поиска объект ScopeFolder добавляется в коллекцию SearchFolders с помощью метода AddToSearchFolders объекта Scope- Folder. Общие свойства объекта ScopeFolder Определения свойств Application и Creator приводились в начале приложения. Свойства объекта ScopeFolder Имя Name Path Тип возвращае- Описание мого значения String Только чтение . Возвращает имя объекта scopeFolder String Только чтение. Возвращает полный путь из объекта ScopeFolder ScopeFolders Scop.eFolders Возвращает коллекцию scopeFolders. Элементы этой коллекции соответствуют подпапкам родительского объ­ екта ScopeFolder Методы объекта ScopeFolder Имя Тип возвращае- Параметры Описание AddToSearch- Folders мого значения Пример: объект ScopeFo/der Добавляет объект scopeFolder в кол­ лекцию searchFolders . Сл ед ую щи е подпро граммы выводят список книг Excel из всех папок на жестком дис­ ке, имя которых содержит слово 'Ъilling" .
Объектная модель Office 2003 1055 что файлы не найдены не найдены" ' Если файлы найдены, вывести их список If .Execu.te > О Then . . sFiles.. = · "Файлы найдены:" & vbCrLf · ,. For lCount· = .';J. ' то ..FoundFiles·. Count , sF,iles ::; , SFiles & vbCrLf & . : FoundFiles ( lCount) l(Coupt .. ,: ' вьiвести результаОJО работы подпрогра!v".мьi MsgВox sFiles, vЫnformc:tion, " Файлы учета" i+?_n.g _p;i.i!?, _, _ . " . Данная функция вызывается основной подпрограммой FindBillingFiles и созда­ ет коллекцию S e archFolders для объекта FileSearch. ГFunc.t :Lon ~osetsearGhF'oi'ders Csбrive As ' str:Lrig, ·_ ·· '.' , .·· · · · · sKeyName .As Striilg) 0 . As SearchFolders Dim lCount As. Long D'im oSearchScope As 'searchscope bim osp.opeFo.lder As scopeFolder ., With Applicatibn .FileSearch ' Иt.катЬ толъко на локальном компьютере (не включая Сетевое ' окружени~ )· · For E,aoh oSearchScope In . SearchScopes ' Искать толь ко на локальном жестком диске . If oSearchScope.Type = msoSearchinMyComputer Then ' Перебрать все объекты ScopeFolder из коллекции ' ScopeFolders, находящейся в объекте SearchScope Fo,r" Each oscopeFolde.r In _ · · oSearchScope.ScopeFolder.ScopeFolders If oScopeFolder.Name = sDrive Then ' Эта функция добавляет в коллекцию SearchFolders ' все папки , имя которых содержит слово "Bi lling ~· AddFolders oscopeFolder.ScopeFolders, sKeyName · End .I 'f oscopeFolder
1056 Приложение В Next oS~a'rchscope :· . ' Если найдена хотя бы одна папка учета , передать ' папок в вызвавшую подпрограмму If .SearchFolders.Count > О Then Set oSetSearchFolders = . SearchFol·ders End If End With End .Functi.on Эта подпрограмма вызывается функцией oSetSearchFolders и добавляет объект ScopeFolder в коллекцию SearchFolders. Sub AddFolders (ByVal oScop'eFoldёrs As ' scopёFoldёrs, ·. ByRef String) ',Объявить nеременнуЮ .типа ScopeFolder Dim oScopeFold.er As ScopeFolder ' Перебрать вс;е объекты scopeFolder в коллекции ScopeFold.ers For Each oScopeFolde~ In oScopeFolders. · ' Не искать в каталогах WINNT и Windows If LCase(oScopeFolder.Name) <> "winnt" And LCase (oScopeFolde.r . Name) <> "windows" Then ' Сравнить· имя пап:Ки ИЗ объекта ScopeFolder СО ЗНа'JеНием ' переменной sFolder . . Воспользоваться функцией LCase ' дл>! обеспеЧения нечувствительности к регистру имени · If InStr(l, LCase(oScopeFolder.Name), _ ' · L<;ase(sFolder.), 'IТbTextCompare) > О Then. .добавить объект ScopeFolder в коллекцию ·ScopeFolders oScopeFolder.AddToSearchFolders End If ' Разрешить обработку событий DoE'IТents ' Если текущий объект ScopeFolder содержит коллекцию . ScopeFolders (nодпапки) •.. Подавить сообщения об ошибках, возникающие при ' обработ ке папок, · которы~ ·не ·воспрИнимаются как On Error Resume Next t· If oScopeFolder.ScopeFolders.Count > О Then ' Вызвать эту подпрограмму рекурсивно для обработки ' подпапок AddFolders oScopeFolder.ScopeFolders, sFolder End If On Error GoTo О End If N.ext oScopeFolder
Объектная модель Office 2003 1057 Коллекция Scripts Представляет все сценарии в пределах документа, например, в пределах листа Excel, слайда PoweгPoint или документа Woгd. Сценарии представляют собой блоки кода, напи­ санные на ASP, Jav.a, Visual Basic или любом другом языке программирования, работа ко­ торого поддерживается в среде HTML. Сценарии запускаются при отображении доку­ ментов в формате HTML. Описание создания сценариев HTML выходит за пределы тематики данной книги. Общие свойства коллекции Scripts Определения свойств Application, Count, Creator и Parent приводились в на­ чале приложения. Методы коллекции Scripts Имя Add Delete Item Тип возвращае- Параметры мого значения Script Script [Anchor], [Location], [Language], [Id], [Extended], [ScriptText] Index As variant Пример: коллекция Scripts Описание Добавляет объект Script в коллек­ цию Scripts, которая хранится в преде­ лах объекта Worksheet или Chart Удаляет все сценарии из указанного листа Возвращает указанный элемент кол­ лекции Scripts Следующая подпрограмма добавляет простой сценарий в тело листа (в ячейку Al) . Лист называется Income Repoгt. При отображении страницы в обозревателе или в режиме пред­ варительного просмота WеЬ-документа в Excel выводится простое окн_о сообщения, преду­ преждающее пользователя о том, что диаграммы построены на· прошлогодних данных. AddScriptToReport(} . \:Onst sSCRIPT_NAМE Лs String_ · Diпi oScript As -Script On Error Resume Next "DataWarning" ~,·,, , .~· Thi.sW6rkbook. Worksheets,( '1 Income :Report" ) , . Scripts ( sSCRIPT_NAME) . Delete ~ ·on ··ErrorGоть о " >. !- ThisWo:i:-kbook.Worksheets( " Income · Report") .Scripts . Add ( .\щi.chor : =:ГhisWorkbook. Worksheets ( " Income. Repo-rt ") . Range ( "Al") , . Location:=msoScriptLocationinBody, _ i: ID: =sSCRIPT_NAМE, _ i Sc:I"iptText: = "MsgBo?C " "'В этом · докум~нr,rе используюТся . [.~ .r~роцrлогодние даин~е 11 1' 'i j ;J?nd
1 1058 Приложение В Объект Script Объект Script соответствует одному блоку кода · HTML в пределах кол.Л~кции Scripts . Для обращения К объем у Script можно 1'J СПоль 13 овать метод Item коллекци1;1 Scr ipts , например: или ·.th~-~wc; ··кa9_qJS.'::Иc?l:~_f? il~t:s~ l·;i: ч ~ ~iii e : :В~ J?Pr.ГI7::s2E~J?:t.i3.,:J~~iii1:0:-.."·..-~.,~·.-".~-'\'~""'"""'''''""'"'"'"·;с.,ьсz1ш Кроме этого , для получения ссылки на объект Script можно воспользоваться иден- тификатором объекта (ID) . . • ·:i.P112ы~~oikьo:_okc:~w0Шili~gf~J:·::ir±s:2pi ~ · ·. R~il9.rt:· I~§.9F'Jii?.t.E( :·:!5-a: ~-~w~iii~iiЯ:'] 'г;::;:::;JL:::1·:i:~::J :l. Общие свойства объекта Script ·, _- .:...: .. Определения свойств Application, Creator и Parent приводились в начале при· ложения. Свойства объекта Script Имя Тип возвращае- Описание мого значения Ex tended String Id String Language MsoScript - Language Location MsoScript- Location ScriptText String Shape Obj ect Методы Script Устанавливает/возвращает атрибуты, добавленные в тег <SCRIP'I'>, за исключением атрибутов ID и LANGUAGE Устанавливает/возвращает идентификатор объекта Script . Идентификатор присваивается атрибуту ID в те­ ге <SGRIPT > в коде HTML. Если значение атрибута не указано, свойство возвраЩает пустую строку Устанавливает/возвращает язык программирования, на котором на п исан текущий сценарий \ Только чтение. Возвращает положение текущего сценария в указанном документе HTML Устанавливает/возвращает текст, содержащийся в блоке сценария Только ч.тение . Возвращает объект Shape Имя Тип возвращае- Параметры Описание мого значения Delete Удаляет указанный сце,нарий из коллекции scripts Пример : объект Script Следующая подпрограмма удаляет все сценарии со всех листов (листов диаграмм или листов электронных таблиц) в пределах активной книги . rsub"'R.emovescBpt s(('"~""- ., Pim' oscript As . sc:i;-ipt. · .; Din\ sh As Object.' · ·.. ~.1.:~~~-~:-~~
1 Объектная ~одель Office 2003 1061 Общие свойства коллекции SearchScopes Определения свойств Appl ication, Coun t и Creator приводились в начале при­ ложения. Свойства коллекции SearchScopes Имя Iten:i Тип возвращае- Параметры . мо го значения SearchScope Index As Long Описание Возвращает объект Searcbl3cope, соответ­ ствующий интересующей области по и ска , например , локальным дискам или пап кам Microsoft Outlook Пример: коллекция SearchScopes Следующая подпрограмма выводит список объектов SearchScope в пределах ис­ пользуемого компьютера. /Syb Firi~9~archscopes ( j i ,., :, . .·'А,, - (. ,&т .lRow As . L6.rш ' :.jt,o··.;· - •'С~,·,":- ' •о •.: . ' ''• '• __,,,' ·, ' '; Diril · ,?s~arch,Scope Удалить i::тарые результаты wksSearchScopes. Range ( ." Info '') . ClearContents ' Выбрать начальную строку , lRow = wksSearch?copes . Range ( "Info") . Cells ( 1, 1) . Row : Перебрать коллекr.iИю · SеаrсhSсореs ' в rioиcJia;{ об:riасти . му ' ccimpцter " For Each oSearchScope In .SearchScopes k Выв ести полученную информацию . на лист wksSearchScopes. Cells (lRow, 1) . Value ·= oSearchScope. ScopeFoider.. Name · wksSearchScopes.Cells(lRow, 2) .Valцe · = lRow = 'lRow ,+ 1 Next osearchScop~ ' Отсортировать список по . типу области ~ith wksSearchScopes. . Range( " Info") .Sort Keyl:= . CeJ.ls(l ·, 2), Orderl:=xlAscending . End With End With ;Бnd Su!;>, . Объект SearchScope Отдельная область верхнего уровня из коллекции SearchScopes, в которой может выпо.Лняться поиск с помощью объекта F i l eSearch. Общие свойства SearchScope Опр еделения cвoйcтвApp li cation и Creator приводились в начале приложения.
1062 Приложение В Свойства объекта SearchScope Имя Тип возвращае- Описание мого значения / ScopeFolder ScopeFolder Туре MsoSearchin Возвращает объект ScopeFolder Только чтение. Возвращает значение , соответствующее · ти п у объе кта SearchScope . Тип определяет область , в которой метод Execute объекта FileSearch будет вы­ полнять поиск файлов Объект SharedWorkspace Объект SharedWorkspace позволяет разработчику добавлять активный документ в рабочее пространство сервера Micгosoft Windows Shai-ePoint Seгvices, а также поддер­ живает управление другими объектами в совместном рабочем пространстве. Свойства объекта SharedWorkspace Имя Application Connected Creator Files Folders Last- Refreshed Links Members Name Parent SourceURL Tasks URL Тип возвращае- мого значения Object Boolean - Long Shared- Workspace- Files Shared- Workspace- Folders Date/Time Shared- Workspace - Links SharedWork- spaceMemЬers String Object String Shared- Wo rkspace- Tasks String Описание Возвращает объект App lica tion, соответствующий при­ ложению, в котором хранится текущий объект Только чтение. Возвращает информацию о состоянии под­ ключения текущего документа к рабочему пространству Возвращает значение типа Long, указывающее на прило­ жение, создавшее объект Только чтение . Возвращает коллекцию SharedWorkspaceFiles Только чтение. Возвращает коллекцию SharedWorkspaceFolders ' Только чтение. Возвращает дату и время последнего вы­ зова метода Refresh Только чтение. Возвращает коллекцию SharedWorkspaceLinks Только чтение . Возвращает коллекцию SharedWorkspaceMemЬers Устанавливает/возвращает имя объекта Возвращает ссьfлку на родительский объект текущего объекта Только чтение. Указывает расположение совместно ис­ пользуемого документа Только чтение. Возвращает коллекцию SharedWorkspaceTasks Только чтение. Возвращает адрес URL общего рабочего пространства
Объектная модель Office 2003 1063 Методы объекта SharedWorkspace Имя CreateNew Delete Disconnect Refresh Remove- Documen t Тип возвращае- параметры мого значения Описание [URLJ, [NameJ Создает новый объект SharedWorkspace Удаляет объект SharedWorkspace из коллекции Отключает объект от общего рабочего пространства Обновляет текущую копию документа на основе данных из общего рабочего пространства Удаляет текущий документ из общего рабочего пространства Объект SharedWorkspaceFile Объект SharedWorkspaceFile соответствует сохраненному файлу из общего рабо­ чего пространства, в качестве которого обычно выступает 'сервер Shaiepoint. Свойства объекта SharedWorkspaceFile Имя Application CreatedBy CreatedDate Creator ModifiedBy ModifiedDate Parent URL Тип возвращае- маго значения Object String Variant Long String Variant . Object String Описание Возвращает объект Application, соответствующий при­ ложению , в котором хранится текущий объект Только чтение. Возвращает имя автора Только чтение . Возвращает дату создания Возвращает значение типа Long , указывающее на прило­ жение, создавшее объект Только чтение . Возвращает автора изменений Только чтение. Возвращает дату модификации Возвращает ссылку на родительский объект этого объекта Только чтение . Возвращает адрес URL Методы объекта SharedWorkspaceFile Имя Тип возвращае- параметры Описание маго значения Delete Удаляет объект SharedWorkspaceFile Объект SharedWorkspaceFolder Представляет папку в общем рабочем пространстве.
1064 Приложение' В Свойства объекта SharedWorkspaceFolder Имя Тип возвращае- Описание мого значения Application Object Creator Long FolderName String Parent Object ВозвраЩает объект Appl ica tion, соответствующий при­ ложению, в котором хранится текущий объект . Возвращает значение типа Long, указывающее на прило­ жение , создавшее объект Только чтение . Возвращает имя пап·ки Возвращает ссылку на родительский объект этогЬ объекта Методы объекта SharedWorkspaceFolder Имя Тип возвращае­ мого значения Параметры Описание Delete Удаляет текущий объект Объект SharedWorkspaceLink 1 Представляет ссылку URL, которая сохраняется в общ е м р абочем пространстве. Свойства объекта SharedWorkspaceLink Имя Application CreatedBy CreatedDate Creator ModifiedBy ModifiedDate Description Notes Parent URL Тип возвращае- мого значения Object String Variant Long String Variant String String Object String Описание Возвращает объект Appl icat i o n , соответствующий приложению, в котором хранится текущий объект Только чтение. Возвращает имя автора Только чтение. Возвращает дату создания Возвращает значение типа Long, указыв·ающее на при­ ложение, создавшее объект Только чтение . Возвращает автора изменений Только . чтение . Возвращает дату модификации Устанавливает/возвращает описание текущего объекта Устанавливает/возвращает замечания, связанные с объ­ ектом Возвращает ссылку на родительский объект этого объек­ та Только чтение. Возвращает адрес URL Методы объекта SharedWorkspaceLink Имя Тип возвращае- Параметры Описание мого значения Delete Save Удаляет текущий объект Сохраняет текущий объект
Объектная модель Office 2003 1065 Объект SharedWorkspaceMember Представляет пользователя с правами доступа к общему рабочему пространству. Свойства объекта SharedWorkspaceMember Имя Application Creator DomainName Email Name Parent Тип возвращае- мого значения Object Long String String String Object Описание Возвращает объект Application, соответствующий при­ ложению, в котором хранится текущий объект Возвращает значение типа Long, указывающее на прило­ жение, создавшее объект Толь ко чтение . Возвращает имя доме н а Только чтение. Возвращает адрес злектронно й почты Только чтение. Возвращает имя пользователя Возвращает ссылку на родительский объект это го объекта Методы объекта SharedWorkspaceMember Имя Тип возвращае - Параметры Описание мого объекта Delete Удаляет текущий объект Коллекция SharedWorkspaceMembers Содержит объекты SharedWorkspa c eMemЬe r. \, Объект SharedWorkspaceTask Соответствует задаче , сохраненной в общем рабочем пространстве . Свойства SharedWorkspaceTask Имя Application AssignedTo Creat edBy Cr eatedDate Creator Description DueDate Mo difie d By Modifi e d Date Parent Тип возвращае- мого значения Ob ject String Strin g Vari ant Long String Variant Strin g Vari ant Object Описание Возвращает объе кт Appl i cat i on, соотв етствующий приложению , в котором хранится текущий объект Устанавливае;г/возвращает имя пользователя, которому назначена эта задача Только чтение . Возвращает имя автора Только чтение. Возвращает дату создания Возвращает значени е типа Lo n g , указывающее на при ­ ложе ние , создавш ее объект Устанавливает/возвращает описание текущего объекта Устанавливает/возвращает конечную дату выполнения задачи Только чтение. Возвращает автора изменений Только чтение. Возвращает дату мо,цификаци и Возвращает ссылку на родительский объект этого объекта
1066 Приложение В Имя Тип возвращае- Описание мого значения Priority msoShared- Workspace- TaskPriority Устанавливает/возвращает приоритет, присвоенный те­ кущей задаче Status msoShared- Workspace- TaskStatus Устанавливает/возвращает состояние текущей задачи Title String Устанавливает/возвращает название текущей задачи Методы объекта SharedWorkspaceTask Имя Тип возвращаемого значения Параметры Описание Delete Save Коллекция SharedWorkspaceTasks Содержит объекты SharedWorkspaceTask. Объект Signature Удаляет текущий рбъект Сохраняет текущий объект Этот объект представляе:r цифровую подпись ·документа. Она является электронным вариантом рукописной подписи. Цифровая подпись позволяет другим пользователям документа уникально идентифицировать и проверить источник документа. При открытии подписанного цифровой подписью документа, содержащего макросы, пользователи, открывающие документ, получают возможность доверять автору или ис­ точнику подписи. При установке высокой безопасности использования макросов в пакет Office включаются макросы только из доверенных источников. При этом пользователь мо~ет сам выбрать доверенные источники макросов и защитить себя от макровирусов. Кроме того, цифровая подпись позволяет защитить автора документа от модифика­ ции содержимого документа. При подписывании документа к подписи добавляется за­ шифрованный ключ . При попытке модификации документа другие пользователи полу­ чают запрос на предоставление ключа для разблокирования подписи. При этом цифро­ вая подпись с документа снимается. На даннъ~й момен:т этоrп обоек:т недоступен в Micmsofl Excel, хотя он и предоставляется 'ЧJJjleз объект Documen t в Microsoft Word и обоекrп Presen ta ti оп в Microsoft PowerPoiпt. Общие свойства объекта Signature Определения свойств Application, Creator и Parent приводились в начале этого приложения . Свойства объекта Signature Имя Тип возвращае- Описание мого значения Attach- Boolean Устанавливает/возвращает необходимость присоедине­ ния к документу цифрового сертификата, соответствую­ щего указанному объекту Signature Certi fica te
Объектная модель Office 2003 1067 Имя Тип возвращае- Описание мого значения ExpireDate IsCertifi- cateExpired IsCertifi- cateRevoked Issuer IsValid SignDate Signer Variant Boolean Boolean String Boolean Variant String Только чтение. Возвращает дату истечения срока действия цифровой подписи из объекта Signature Только чтение. Возвращает состояние сертификата, соот­ ветствующего объекту signature (истек ли срок действия сертификата) Только чтение. Возвращает состояние сертификата, соот­ ветствующего объекту Signature (отозван ли сертификат) Только чтение. Возвращает имя организации, выпустив­ шей цифровой сертификат, который соответствует объек- ту Signature · Только чтение. Возвращает результат проверки действи­ тельности цифрового сертификата , соответствующего объекту Signature. Сертификат может оказаться недей- . ствительным по ряду причин, начиная от истечения срока действия и заканчивая модификацией документа, содер­ жащего сертификат Только чтение. Возвращает дату и время присоединения цифрового сертификата к документу Только чтение. Возвращает имя лица, присоединившего цифровой сертификат к документу Методы объекта Signature Имя Тип возвращае- Параметры мого значения Delete Описание Удаляет указанную подпись из коллекции SignatureSet Коллекция SignatureSet Содержит все объекты Signature в пределах документа. Общие свойства коллекции SignatureSet Определения свойств Application , Count , Creator и Parent приводились в на­ чале приложения. Свойства коллекции SignatureSet Имя Item Тип возвращае­ мого значения Signature Параметры Описание iSig As Long Возвращает объект Signature, соответст­ вующий одной из цифровых подписей, кото­ рой подписан текущий документ
1068 Приложение В Методы коллекции SignatureSet Имя Тип возвращае- Параметры Описание мого значения Add Signature Возвращает объект Signature, соответствующий новой цифровой подписи Comrnit Сохраняет на диске все иЗменения текущей кол­ лекции SignatureSet. До вызова этого метода изменения коллекции не сохраняются Пример: коллекция SignatиreSet Следующая подпрограмма добавляет цифровую подпись к активной презентации Powei-Point. После этого подпрограмма выводит информацию, содержащуюся в выбран­ ной подписи. Обратите внимание, что метод Add предоставляет пользователю возмож­ ность выбора цифровой подписи из списка. :sU.Ь ; ACidsl'g~(} ' '7 · Dirn ·· licon As Long Dirn ppt As Presehtation Dirn e oSignature As . Signature · Dirn sin:fЬ . As .String презентации существует ..• Установить' Пиктограмму , · которая отображается в окне . '• ' сообщениЯ:' с информаци ей · · · lico:h !: , ,vЫnforrnation . " добавить подпись к презентации. При этом пользователю ' : приДет 'сЯ вьiбра т ь подп Й сь. Выбранна. я подпись ' объекта oSignature . · j ;isei: q:signature ·= ppt.Signatures.Add '· За писать из1;1енени·я на диск. При этом . к ИменИ ' ·. будет . доба.влена. строка "Signe<;l" ' p pt:Sign_atures.Comrnit ) • ИнИциализировать строку сообщения ~ sinfo = "Информация о подп и си: ~· & · vbCrLf & vbCrLf ··доб:Э.вить -• подпись к сообщению ' W:ith oSignature ' srnfo sinfo & "Источник подписи: ;, & . Issuer & sinfo = sI:nfo & "Владелец: " & . • S igner & vbCrLf sinfo = sihfo & "дата подnщ;ания: " & .signDate': & vbCrLf • '.S info =; · sinfo & "Дата.· истечения: ' " & . : ExpireDate · '· · End With ПОЭJI'ОМУ "Акт11вная · презентацИя отсутствует"
Объектная модель Office 2003 1069 Объект SmartDocument Этот объект используется для У?равления пакетом расширений XML, связанных с ак­ тивным документом. Свойства объекта SmartDocument Имя Тип возвращае- Описание мого значения Application Object Creator Long SolutionID String SolutionURL String Методы SmartDocument Возвращает объект App licati on , соответствующий при­ ложению, в котором хранится текущий объект Возвращает значение типа Long, указывающее на прило­ жение, создавшее объект Устанавливает/возвращает идентификатор решения Устанавливает/в~звращает адрес URL-решения Имя Тип возвращае- Параметры мого значения Описание PickSolution RefreshPane Объект Sync [ConsiderAl lSchernas] Выбирает решение Обновляет область задач Объект Sync применяется для управления синхронизацией локальной и серверной копий совместно используемого документа, хранящегося в рабочей области сервера Windows Shai:ePoint Seгvic ~s . Свойство Status возвраЩает важную информацию о текущем состоянии процесса синхронизации. Для оqновления состояния синхронизации необходимо воспользо­ ваться методом GetUpdate. Свойства LastSyncTime, ErrorТype и WorkspaceLast- ChangedВy применяются для получения дополнительной информации . Свойства Sync Имя Тип возвращае- Описание мого значения Application Obj ect Возвращает объект Applicat ion, соответствующий при­ ложению, в котором хранится текущий объект Creator Long Возвращает значение типа Long, указывающее на прило­ жение, создавшее объект ErrorType MsoSyncError- Только чтение. Возвращает тип последней ошибки син- Туре хронизации LastSyncTirne Variant Parent Object Только чтение . Возвращает время последней синхронизации Возвращает ссылку на родительский объект этого объекта
1070 Приложение В Имя Тип возвращае- Описание мого значения Status Msosyncstatus- Только чтение . Возвращает текущее состояние синхрони- Туре зации Workspace- Last- ChangedBy String Только чтение. Возвращает автора последней модификации Методы объекта Sync Имя Тип возвращае- Параметры маго значения . Описание Получает обновления с сервера GetUpdate OpenVersion [SyncVersionТype] Открывает указанную версию доку­ мента PutUpdate Resolve - Conflict Unsuspend Объект UserPermission [ SyncConflict- R~solution] Размещает обновление на сервере Запускает процедуру разрешения конфликта при обновлении документа Отключает приостановленное со­ стояние документа Представляет набор разрешений на доступ для одного пользователя. Свойства объекта UserPermission Имя Тип возвращае- Описание маго значения Expiration- Variant Date Устанавливает/возвращает дату истечения разрешения на доступ Permission Long Устанавливает/возвращает разрешение на доступ Userid String Только чтение . Возвращает идентификатор пользователя Методы объекта UserPermission Имя Тип возвращае- Параметры Описание мого значения Remove Коллекция WebPageFonts Удаляет текущий объект UserPermission из коллекции Permissions Представляет набор объектов WebPageFont, позволяющих устанавливать стили и размеры моноширинных и пропорциональных шрифтов при сохранении документа в виде WеЬ-страницы. Дополнительная информация приводится в разделе , посвященном объекту WebPageFont. К коллекции можно обращаться через свойство Fonts свойства DefaultWebOptions oбъeктaApplication, например: [se1;' o~~~ot~Я~to.nto·~ :~ .A1?!i~Js:~!~"i"ri.;p:[f;~Q:itweJ?.912.tJo~.s ~'[91.!ts::
Объектная модель Office 2003 1071 Обратите внимание, что на момент написания этой книги свойство Count коллекции WebPageFont всегда возвращает значение О, даже если в коллекции присугствует 12 объек­ тов WebPageFont. Общие свойства коллекции WebPageFonts Определения свойств Application, Count и Creator приводились в начале при­ ложения. Свойства коллекции WebPageFonts Имя Тип возвращае- Параметры Описание мого значения Item WebPageFont Index As Возвращает объект WebPageFont из кoл­ MsoCharacterSet лекции webPageFonts, соответствующий определенному набору символов Объект WebPageFont Этот объект описывает моноширинные и пропорциональные 'шрифты, используемые при сохранении документа в виде WеЬ-страницы. Microsoft Excel и Micгosoft Word приме­ няют данные параметры при открытии WеЬ-страниц в приложении, но эти параметры ис­ пользуются только при невозмож.ности применения собственных параметров шрифтов WеЬ-страницы или в коде HTML отсугствует информация о необходимых шрифтах. Обратите внимание, что свойства FixedWidthFont и ProportionalFont прини­ мают любое допустимое значение типа String, а свойства FixedWidthFontSize и ProportionalFontSize принимают любое допустимое значение типа Single. На­ пример, следующий код не приведет к появлению сообщения об ошибке, хотя присваи­ ваемые значения и не описывают допустимые имя и размер шрифта. :·zt];)P'rie:-~·i:Iбn : b?:fal.ti t.weьoJ;Jf:"J;ьris :·t9.nts :- • '"'" .. ,;%(msocliaracterSetEnglishWesternE1itopean .· < "i/ i91Xй'JJ:.~~t::Jii§<;~JJ?t.J_,, f:r;o,e.oJ:~Iori~Jf<:>it1:::"'~-·;·;~~~~x~~~ ;;: 2 iдi3i3 .iTcat10r-гь~!aiiifweь'Ojjt:T0пs:·: F:6nt.1г ·'-;,"""'~"~"-- 1.~ (msoC):J.aracterSetEnf:ilishWesternEμropeF-ri •· ·) • .... [Q_t; .h.§f:r;f~J;jr,t§.9EiPJ:J,,_E,r,0p2r.S:J2n9.±f9I;l!=.§J_~~ ·::.c~"';J,2.0~Q,._ . •.. При попытке использования этих значений в приложении будет выдано сообщение об ошибке. Общие свойства объекта WebPageFont Определения свойств Application и Creator приводились в начале приложения. Свойства объекта WebPageFont Имя Тип возвращае- Описание мого значения FixedWidth- String Font FixedWidth- Single FontSize Устанавливает/возвращает ~мя моноширинного шрифта Устанавливает/возвращает размер моноширинного шрифта (в пунктах)
1 ! 1072 Приложение В Имя Тип возвращае- Описание мого значения Proportional- String Font Proportional- Single FontSize Устанав ливает/возвращает имя пропорционального шрифта Устанавливает/возвращает размер пропорционального шрифта (в пунктах) Пример: объект WebPageFont Следующая подпрограмма перебирает коллекцию WebPageFonts и для каждого объ· екта WebPageFont указывает имя и размер пропqрционального и моноширинного шрифта. Информация · об имени и размере выбирается из диапазона Font Infо на листе wksWebPageFonts из текущей книги . 1:5у:13 · setwebi>a.geFonts О "" ~-. ,, !', i! _." f Const sRANGE_FONT_INFO As String '= "Fontinfo" Dim lCalc As Long Diin lCount .As Long, lRow As Long . bim oWebFont As WebPageFont · : ОткJiючить обно в ление экрана и п е р е счет листа ·With Application . • · ' Сохранит.ь режИм пересчета листа lCalc = .Calculation ' Отключит.ь пересчет листа . Calculation = xlCalculationManual ' · Отключить обно'Вление экрана " .ScreenUpdat~ng False En;d With ; , . Удалить старую информацию wksWebPageFonts.Range("InputRange").ClearContents (' :· _. :; ' ; Сущест вует 12 наборов · символов дЛя шрифтов . Приходится жестко ' зада вать · огранич ени е в 12 ' наборов·, · так .как свойство ' Application.DefaultWebOptions. Fonts .Count все гда возвраща ет ' значение О · · · · • Fbr lCount. .=. 1 то 12 ·. · , По.Лучить · ссьщку на объект WebPageFont se't oWebFont = Applicati6n; DefaultWebOptions.Fonts(lCount) . With ' oWeЬFb'nt ·• . ' Воспол Ь'зова ться параме трамИ · с ли ста wksWebPa geFonts и ' установи ть св ойства объекта WebPageFщ1t · · . ProportionalFont· = _ ·. wksW e bPage .Fonts . Rang e ($RANGE_FONT_INFO) . Cells ( 1, . Proportiona1FontSiie '=:.__ wksWebPageFont1> -:)'\ange (sRANGE_:FONТ_INFO) . Cel ls (1, 2. Р. Value · · "' Л"ixedWidthFont = wksWebPageFonts.Range (sRANGE_FONT_INFO) .Ce lls(l, , Fixe~WidthFontSize = _ ~~·"""''""''"···'""·-с'·'"' ·"~ wJ:ceW"eЬ,~o,gE:f<:J!f.!s , 1.3:a.q ge (s~GF;_FONT_J;;t1!9 ), ·.<::~JJ,e J 1_, 3) ;·value i
Объектная модель Office 2003 Выве6~~-i 'но.вьiе парамет wkswe):)P.ageFqnts ....· ·. . С.· wksWebPageFoдts.Cells(lRow, , 4 ) =·. lCount .. wksWebPёJ.geFoP.ts. Cells ( lRow , · ,з) .. . Prop ortio na1Font · wksWebPageFon'ts . ce'lls (lRow / 4) . Proportional FontSize " wksWebJ;iagef:on.ts. Cells ( lRow i ~\' • Fi'xedWidthFont ' 'ksWebP1>9'eF9n.ts.Cells(lRowi 6) · - . FixedWidthFontsi z e · .· , h~~ем~·~~~4~:~~ ~~ /одну ~тр~кi' вниз l:R,ow ·= lRow + 1 End1, With icciun't ВосЬтанов ить режим п ере счета листа , A,ppl~·cation . Calculation lCa l c -~pd ' §\lP 1073
П_редметный указатель А АР!, 366 1 IDTExtensiЬility2, интерфейс, 299 Inte1·net источник данных, 627 Передача данных, 636 публикация результатов, 633 · хранение книг, 626 м Micгosoft SQL Sегvег, 270 х XML,655 импорт данных, 658 XMLSS, 658 XSD, 656 Автофильтр, 519 Агрегация, 141 Аргументы, 133 А необязательные, .134 п ередача по значению, 133 передача по ссылке, 134 в Вирус, 361 Возвращаемые значения, 76 Всплывающие меню , 563 Диаграммы д ~ встроенные, 534 добавление из кода VВА, 533 использование массивов, 542 листы, 532 метки,544 определение диапазонов, 543 определение рядов чере-з массив, 540 редактирование рядов, 536 Ди~пазон сокращенные ссылки, 45 1 ссылка, 456 " Документ Woгd, 356; 357 и Имена диапазонов, 478 именованные диапазоны, 482 поиск,~83 сокрытие, 482 специальные, 479 хранениезначений,480 хранение массивов, 481 Инкапсуляция, 141 Интерфейс, 129; 299 определение, 131 реализация, 131; 300 Квалификаторы, 140 Класс, 129; 372 Actions, 610 Recognizeг, 607 Ключевое слово static, 108 Книга активизация, 434 к перезапись существующей, 437 получение имени файла, 435 создание, 433 сохранение,434;439 Коллекция,64;155 Addins, 666; 961 AllowEditRanges, 668 AпsweгWizaгdFiles, 989 Агеаs, 691 Axes, 697 BalloonCheckBoxes, 995
BalloonLabels, 996 Borders, 702 CalculatedFields, 506; 703; 818 Calculatedltems, 512; 704; 823 CalculatedMeшbers, 704 CЬartGгoups, 727 CЬaгtObjects, 730 CЬarts, 711 CodePaпes, 967 COМAddins, 998 CommandBarC011trols, 1014 CoшmandBars, 1000 Comments, 737 CubeFields, 743 CustomViews, 747 DataLabels, 748 DiagraшNodes, 758 Dialogs, 760 DocumentLibгaгyVersions, 1024 DocuшentProperties, 1024 ErrorCl1ecki11gOptio11s, 766 Errors, 764 · FileDialogFilters, 559; 1031 FileDialogSelectedlteшs, 559; 1033 FileTypes, 552; 1038 Filters, 770 FormatC011ditio11s, 773 GroнpSlыpes, 779 . HPageBreaks, 780 HTMLProjectitems, 1042 Hyperlinks, 781 LegendEntries, 788 LinkedWindows, 971 Naшes, 796 .ODBCEпors, 798 ODSOColuшns, 1047 ODSOFilters, 1048 OLEDBEпors, 799 OLEObjects, 801 Panes, 809 Paraшeters, 810 Plюnetics, 812 PivotCacЬes, 502; 814 PivotFields, 503; 818 PivotFormulas, 823 Pivotltems, 508; 823 PivotTaЬ!es, 503; 827 Points, 837 Properties, 971 Предметный указатель 1075 PгopertyTests, 1050 PuЬ!isЬObjects, 841 Qнet}'TaЬ!es, 843 RecentFiles, 860 References, 973 Sceпarios, 863 ScopeFolders, 1053 Scripts, 1057 Searcl1Folders, 555; 1059 SearcЬScopes, 553; 1060 SeriesCollectioп, 864 SЬapeNodes , 875 SЬapeRaпge , 877 Sl1apes , 870 SЬaredWorkspaceMeшbers, 1065 SЬaredWorkspaceTasks, 1066 SЬeets, 439; 880 SignatureSet, 1067 SшartTagActioпs, 883 SшartTagOptioпs, 884 SшartTagRecongпizers, 884 SmartTags, 882 SpelliпgOptioпs, 886 Styles, 887 Treпdlines, 895 UsedObjects, 898 UseгAccess, 898 UseгAccessList, 899 VВC0111po11e11ts, 977 VPageBгeaks, 902 WatcЬes, 904 WebPageF011ts, 1070 Windo,vs, 906; 984 Woгkbooks, 433; 911 WoгksЬeets, 925 в модуле класса, 156 Команда Add Watcl1, 196 Bookшark, 202 Call Stack, 204 Coшplete Word, 202 Defiпitioп, 203 Edit WatcЬ, 196 List Constants, 202 List Properties/MetЬods, 202 ObjectBrowser, 203 Paraшeter Info, 202 Quick Info, 200 Quick WatcЬ, 196
1076 Предметный указатель Run to cursor, 194 Set Next Statement, 195 SЬow Next Statement, 195 Step Into, 193 Step Out, 194 Step Over, 194 Командные панели , 566 Константы, 76; 84 Массив, 95 динамический, 98 многомерный, 97 Меню, 326 Метод, 67 Activate, 449 м Applicatio11.Evaluate, 405 Debug.Asseгt, 169 Debug.Pгint, 168 Evaluate, 118 Execute, 559 IпputBox, 120 Inteгsect, 469 О11Кеу, 124 OnTime, 123 Recognize, 623 Select, 449 Specia!Cells, 460 U11io11, 469 определение, 132 Модуль класса, 153; 374 н Надстройки закрытие, 289 модификация кода, 289 преобразование книги, 287 событие установки, 291 сохранение, 290 удале ние, 292 установки, 290 Надстройки Automation, 293 использование,298 регистрация, 295 создание, 294 Надстройки СОМ, 308 конструктор, 311 подключение к Ехсе!, 312 регистрация, 309 Область видимости, 81 Обработка ошибок, 99 Объект, 63 Addin, 666; 961 Adjustments, 667 Allo.wEditRange, 668 Aпswe~·Wizard, 988 Application, 11 5; 670 Assistant, 990 AutoCorгect, 693 AutoFilter, 694 AutoRecover, 696 Axis, 697 AxisTitle, 700 Balloon,994 Balloo11Cl1eckBox, 996 Balloo11Label, 996 Bordeг, 702 Calc~ilatedMembeг, 704 CalloutFormat, 706 CellFoпnat, 707 Clыracte гs , 710 Сlыгt, 711 Cl1artAгea, 723 ClыгtColoгFormat, 725 Cl1aгtFil1Foгmat, 725 Cl1aгtGroup, 727 CЬaгtObject, 730 ClыгtTitle, 735 CodeModule, 324; 963 CodePane,324;967 ColoгFormat, 736 COМAddi11, 999 Command, 258 CommandBaг, 1002 Comшa11dBaгButto11, 1005 Com111a11dBaгC0111boBox, 1009 Co111ma11dBarC.011trol, 1015 CommaпdBaгPopup, 1019 Commeпt, 737 Co1111ection, 244 ConnectoгFoгmat, 738 Contro!Format, 740 Соrпегs, 742
CubeField, 743 CustoшView, 747 DataLabel, 7'48 DataTaЬ!e, 752 Debug, 168 DefaultWebOptio11s, 753 Desig11eг, 324 Diagгaш, 755 DiagгaшNode, 758 DiagгaшNodeCilildгe11, 760 Dialog, 760 DisplayU11itLabel, 761 Docuшe11tLibгaгyVers io11, 1023 Docuшe11tPгopeгty, 1026 Dow11Baгs, 763 DгopLines, 763 Err, 186 Error, 764 ErroгBai·s, 765 Eveпts, 970 FileDi alog, 557; 1028 FileDialogFilteг, 1032 FileSearch, 548; 1036 Fil!Forшat, 768 Filteг, 770 Flooг, 771 Foпt, 772 ForшatC011ditio11, 773 Fou11dFiles, 1039 FreeforшBuilder, 775 Grapl1ic, 776 Gridli11es, 778 HiLoLiпes, 779 HPageBгeak, 780 HTMLPгoject, 1039 HTMLPгojectlteш, 1042 Hypeгlink, 781 Iпtегiог, 783 IRtdSeгver, 784 IRTDUpdateEve11t, 785 LanguageSettiпgs, 1043 LeadeгLiпes, 786 · Legeпd, 786 Lege11dE11tгy, 788 LegeпdKey, 789 LiЦ.t}forшat, 791 LiпkFoгшat, 792 ListColuпш, 793 ListDataFoгmat, 793 Предметный указатель 1077 ListObject, 794 ListRow, 795 Maileг, 795 MsoE11velo pe , 1044 Name, 796 NewFile, 1046 ODBCErroг, 798 ODSOColuшn, 1047 ODSOFilteг, 1048 OfficeDataSo uгc eObject, 1049 ОLЕDВЕпог, 799 OLEFoгшat, 800 OLEObject, 801 Outliпe, 805 PageSetup, 806 Pane,809 Parameteг, 810 Peгшissio п , 1049 P l1011etic, 812 PictuгeFиm1at, 813 PivotCacЬe, 8 14 PivotCell, 8 17 PivotField, 8 18 PivotFoгmula, 823 Pivotlteш, 823 PivotlteшList, 825 PivotLayo ut, 826 PivotTaЬ!e, 827 P lotAгea, 835 Poiпt , 837 Propeгty , 971 Pгotectioп, 839 PuЬ!isl10bject, 841 QнегуТаЬ!е, 843 Raпge, 847 ReceпtFile, 860 Recoгdset, 253 Rеfегепсе, 973 RefeгeпcesEveпts, 976 RoнtiпgSli р, 861 RTD, 862 Sсепагiо, 863 ScopeFoldeг, 1054 Scгipt , 1058 SеагсЬSсоре, 1061 Seri es, 864 SeriesLiпes, 869 SЬadowFormat, 869 SЬаре,870 SЬapeNode, 875
1078 Предметный указатель ShaгedWoгkspace , 1062 SЬaгedWoгkspaceFile , 1063 SЬaredWoгkspaceFolder, 1063 SЬaredWoгkspaceLink , !064 SЬaгedWorkspaceMembeг, 1065 SlыгedWorkspaceTask, 1065 Signatuгe, 1066 SmaгtDocument , 1069 SmartTag, 882 SmartTagActioп, 883 · SmaгtTagRecoпgпizer , 884 SoundNote , 885 SреесЬ , 885 Style, 887 Sупс , 1069 ТаЬ, 889 TextEffectFoгmat, 890 TextFгame, 891 TЬгeeDFoгmat , 892 TickLabels , 894 TгeeviewCoпtrol, 895 Trendline, 895 UpBaгs , 897 UserPeгmissioп, 1070 Validatioп, 900 VВСоmропепt, 323; 977 VBE, 322; 980 VВPгoject , 322 VPageBгeak, 902 Walls, 903 WatcЬ, 904 WebOptioпs , 905 WebPageFont, 1071 WindoW, 444; 906; 984 Woгkbook 911 Worksl1eet , 925 Worksl1eetFtшctioп, 934 Xm!DataBi11di11g , 956 Xm!Map, 957 создание, 154 Объектные переменные, 85 Объявления в сти.Ле С , 367 Окно Call Stack , 113 Contгol Toolbox, 107 Immediate, 71; 200 Locals, 112; 199 Object Browser, 70; 113 Pгoject Ехрlогег , 51; 106 Properties, 51; 109 WatcЬ, 112 Окно UseгFoпn немодальные окна, 221 отображение, 207 создание , 209 Оператор Call, 79 CREAТЕ ТАВLЕ, 242 DROP ТАВLЕ , 243 If, 87 б.~ючный, 88 INSERT, 240 New, 108 Оп Еггог СоТо, 183 On Е1тог СоТо О, 186 Оп Еrгог Resнme Next , 101; 184 . Option Explicit , 79 SELECT , 239 Select Case, 89 Set , 108 UPDATE, 241 Wit\1 ... End WitЬ, 86 Отключенные наборы записей, 277 Отладка , 170 вывод сообщений об ошибках, 181 журнал событий, 188 контрольные значения , 196 обработчики ошибок , 183 перехват , 176 последовательность выполнения, 173 пошаговое выполнение кода, 192 создание обвязки, 186 точки останова, 195 п Панели инструментов , 223; 563 Панели меню, 563 Передача параметров по имени , 74 по позиции , 74 Позднее связывание , 352 Поле , 65 определение, 135 Процедура , 50 р Раннее связывание, 349; 354 Раскрывающийся список, 520
Расширенный фильтр , 527 Региональные параметры идентификация, 399 изменение, 398 обработка,398 функции преобразования, 399 Рекурсия методы, 134 отказ от рекурсии, 135 Рефакторинг, 106 с Сводная диаграмма, 512 Сводная таблица отчет,500 Свойства определение, 136 только запись, 137 только чтение, 137 Свойство,66 ActiveCell, 116 ActiveC!ыгt, 116 ActivePrinter, 116 ActiveShee.t, 117 ActiveWindow, 117 ActiveWoгkbook, 117 . Caller, 126 Cell s, 453; 454 Columns, 466 CштentRegion, 462 End,464;465 FoundFiles, 550 MultiSelect, 560 Nаше , 479 Offset, 457; 458 OnAction, 5 75 PгopeгtyTests, 551 Range, 451 Rows, 466 ScopeFoldeгs , 554 Scгeen Updating, 118 Selection, 1 17 SendKeys, 122 StatusBar, 122 VisiЫe, 511 Смарт-тег добавление, 622 проблемы, 623 регистрация, 618 структура, 605 Предметный указатель 1079 удаление, 622 уникальный идентификатор, 605 управление из VВА, 621 Событие, 68 BeforeDouЬ!eC!ick, 147 Worksheet <:;a!culate, 145 События включение, 145 диаграмм, 146; 160 книги, 149 листа, 144 обработка, 140 ' определение, 137 определение в классах, 138 перехват, 158 создание, 139 Сокрытие кода, 286 Списки изменение размера, 492 преобразование в диапазон, 493 публикация, 493 создание, 489 создание окна UserFoгm, 491 сортировка,490 сумма элементов, 492 фильтрация, 490 Ссылки, 163; 348 · Структура, 371 Тип переменной, 82 определение, 84 Функция CBool, 402 CByte, 402 ССuг, 402 CDate, 402 СDЫ, 402 CDec, 402 Cint, 402 CLng, 402 CSng, 402 CStг, 402 т ф DateValue, 402 DateValueUS, 405 Format, 402 FormatCurrency, 403
1080 Предметный указатель FoгmatDateTime, 403 FoгmatNumber, 403 FoгmatPerce11t, 403 I11putBox, 120 IsDate, 401 IsDateUS, 405 IsNumeгic, 401 NнmberT0Stгi11g, 403 Stг, 403 Val, 404 х Хранимые процедуры, 272 Цикл, 90 Do ... Loop, 91 Fог Eacl1 ... Next, 95 For... Next, 93 While ... Wend, 91 Элемент управления Cl1eckBox, 227 OptioпButton , 227 Sсгоl!Ваг , 225 SpiпButton, 226 э Элементы управления ActiveX, 224
Научно-популярное издшние Пол Киммел, Джон Грин, Стивен Буллен, Роб Боуви, Роберт Розенберг и др. Excel 2003 и VBA Справочник программиста Литературный редактор Верстка Художественный редактор Корректоры Т.Г. Оковородни'Кова О.В. Muiuyrnuнa В.Г. Павлюrпин Л.А. Гордиен'Ко, Т.А. К&рзуп, А.В. Луцен'Ко, О.В. Мишуrпина Издательский дом "Вильяме". 101509, Москnа, ул. Лесная, д. 43, стр. 1. Подпис ано в печать 23 .11.2005. Формат 70Х 100/16. Гарнитура Tiines. Печать офсетная . Усл. печ. л. 87,72. Уч .-изд. л. 56,6. Тираж 3000 экз . Заказ No 6844. Отпечатано с диапозитивов в ФГУП " П ечатный двор" им. А. М. Горького Федерального агентства по печати и массовым коммун икациям . 197110, Санкт-Петербург, Чкаловский пр" 15 .
,. 1• " #' '.... ., \• " ,• " '.. ,.· .·, ·.·~.~. . .... ~ ··.' -•' . ,. · ! .1\llОДfЛИРQВАНИЕ С ПОМОЩЬЮ · ;-M-JCROSOFT EXCEL И VBA . РАЗР .дБ'ОТК Д СИ С ТЕ М ПОДДЕ РЖКИ · ПРИНЯТИЯ РЕШЕНИЙ о. , :._ Кристиан Олбрайт t• 1 fd(')ДfUf"fJOUН.Иe с;' ltQMQЩ/)JQ< AfJ'(;;.fosдtt•' Qf;,eJ"-' VВА •' ~q~r"'c.w;t:11Мr1Щ1Д.11/IЖКl!i irl}"llМИfl!-.l/lllilj www.williamspuЬlishing.com ISBN 5-845.9-0858 -2 В этой книге рассказывается о том, как эффективно пр именя ть методш моделирования в приложениях электронных таблиц для решения повседневных экономических задач. Книга состоит из двух частей. В первой из них изложены основные концепции и принципы программ ирования на языке VБА (Visual Basic fог Applications), во второй части рассматриваются конкретные приложения и детально анализируется их исходный код. В конце каждой главы приводится ряд упражнений по программированию, которые призв аны зак репить или расширить полученны е знания и лучше усвоить изученные в главе концепции. Прилагаемый к книге компакт-диск содержит все рабочие книги Excel и другие файлы, о которых речь идет в примерах (в том числе файлы, используемые в упражнениях). Все рабочие книги открываются в Excel 97 или более .поздней версии программы. Настоящая книга будет полезна как студентам, так и профессионалам, которые хотят создавать системы поддержки принятия решений с помощью электронных таблиц на основе Micгosoft Excel . • ·в продаже
- ~ Профессиональное-. программировани .е на r VBA в Excel 2003 Дж. Уокенбах ., п о Excel написано немало 1sвN 5-8459-0771-З книГ. Но книга, которую вы в продаже . держите в руках, является особенной - в ней разработка при- ложений электронных таблиц рас­ сматривается в широком контексте. VBA - это всего лишь один из ком­ понентов среды разработки поль­ зовательских приложений, хотя и довольно существенный. Данная книга поможет вам разобраться в тонкостях разработки приложений с помощью VBA. В ней описаны многочисленные средства языка VBA, его возможности и среда использования. Вначале вашему вниманию будет предложен обзор возможностей программы, далее вы перейдете к определению концепций VВА­ программирования, а затем позна­ комитесь с самим языком. Если вы начинающий программист на VBA, то в да,нном издании вы найдете всю необходимую информацию, которая потребуется для дальней­ шей работы. Если вы уже обладае­ те завидным опытом работы с VBA, то эта книга обогатит и приумно­ жит ваши знания, пополнив их новыми методиками и примерами из реально й жизни. httр://www.diа1еktikа..соm
11 ... •• 7/ • / " / r '" f' ·. ' -t - . ПRОГРАММ·ИРОВАНИЕ Нд Vвд · ·с~ДМОУЧИТЕЛЬ Слеrщова Л.Д. • ' - - .,; роrраммированиtГ наязыке VBA <=-•ю::;;..> """' f'У""'М""'° ;,~"' и •..,""".... ,.,..,.-.".уч.п..." :i,"l<-fJNUН.'Jfl- 1•·<,)'"i•...1"'~ ""';;;.и'n"(v6..-1»t''1'*" ...;:....'1·•t" E~~~:=';_j'.~::~·" ·-·-- -··--- . ==-~"';""'~"i:::-=~.c =:.::----... ·=.:=..:...~'"::-'~- . ....._._..._______ , .,,,_._ ц,-._. ...,__ , __ ...,.._.... __ ·-· --·-- .,...,..,....___,,,__.......". .... ..... -- ."__ -~- ·-··--.. ,. ".. .... ----·-·· ·- ·--_..."._..... -""'·--·-·-- =-..-:--·--· - л.д - С11сnцоаn. www.dialektika.com ISBN 5-8459-0608-3 ·, "' 1•;- ,Q • Книга пре4назначен а"д:11я индив~;дуа.Льног,р обуЧе,ия, написана простым, доступным языком и рассчитана на. пользователей с любым уровнем компьютерных знаний. Единственно , что действительно необходимо читателю - это наличие под рукой ~ мпьютера с установле1-iными программами Micюsoft ~ffice (~отя бы одной!) и искреннее ~тр еt1ление н~учиться программирgв а\ь на языке VBA. Книгаlвполне может стать настольнf>1м спр.авочнйком, к которому можно будет обратиться в любой момент, столкнувшись со сложной или непонятной: ситуацией. Благодаря лаконичному и, одновременно, исчерпывающему описанию существующих в языке VBA средств и методов работы с нимн, вы найдете здесь ответы на любые вопросы. которые могут возникнуть в . r . 1. практ~ке прогRаммирования · ··: офисных приложений. В этой книге рассмотрены также темы без проработки которых (хотя формально они , и не относятся к самому языку) освоение программирования на VBA и создание реальных программ в среде Office будет просто невозможно. Книга содержит множ ество практиче ских прим е ров . в продаже • - -