Advertisement
cepbl4

Various VBA scripts

Oct 14th, 2013
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Глава 1. Макросы    8
  2. Запуск макроса с поиском ячейки 8
  3. Запуск макроса при открытии книги   8
  4. Запуск макроса при вводе в ячейку «2»   8
  5. Запуск макроса при нажатии «Ентер»  9
  6. Добавить в панель свою вкладку «Надстройки» (Формат ячейки) 9
  7. Глава 2. Работа с файлами (т.е.обмен данными с ТХТ, RTF, XLS и т.д.)    11
  8. Проверка наличия файла по указанному пути_1 11
  9. Проверка наличия файла по указанному пути_2 11
  10. Проверка наличия файла по указанному пути_3 11
  11. Поиск нужного файла_1   12
  12. Поиск нужного файла_2   12
  13. Поиск нужного файла_3   13
  14. Поиск нужного файла_4   13
  15. Автоматизация удаления файлов   13
  16. Произвольный текст в строке состояния   14
  17. Восстановление строки состояния 14
  18. Бегущая строка в строке состояния   14
  19. Быстрое изменение заголовка окна    14
  20. Быстрое изменение заголовка окна_2  14
  21. Изменение заголовка окна (со скрытием названия файла)   14
  22. Возврат к первоначальному заголовку 15
  23. Что открыто в данный момент 15
  24. Работа с текстовыми файлами 15
  25. Запись и чтение текстового файла    15
  26. Обработка нескольких текстовых файлов   16
  27. Определение конца строки текстового файла   17
  28. Копирование из текстового файла в эксель    18
  29. Копирование содержимого в текстовый файл_1  18
  30. Копирование содержимого в текстовый файл_2  18
  31. Экспорт данных в txt    18
  32. Экспорт данных в HТМL   20
  33. Импорт данных, для которых нужно более 256 столбцов 22
  34. Создание резервных копий ценных файлов  25
  35. Подсчет количества открытий файла   25
  36. Вывод пути к файлу в активную ячейку    26
  37. Копирование содержимого файла RTF в эксель  26
  38. Копирование данных из закрытой книги    27
  39. Извлечение данных из закрытого файла    27
  40. Поиск слова в файлах    28
  41. Создание текстового файла и ввод текста в файл  29
  42. Создание текстового файла и ввод текста (определение конца файла)   30
  43. Создание документов Word на основе таблицы Excel    30
  44. Команды создания и удаления каталогов   32
  45. Получение  текущего каталога    32
  46. Смена каталога  32
  47. Посмотреть все файлы в каталоге_1   32
  48. Посмотреть все файлы в каталоге_2   33
  49. Посмотреть все файлы в каталоге_3   35
  50. Глава 3. Рабочая область Microsoft Excel    37
  51. Рабочая книга   37
  52. Количество имен рабочей книги   37
  53. Защита рабочей книги    37
  54. Запрет печати книги 38
  55. Открытие книги (или текстовых файлов)   38
  56. Открытие книги и добавление в ячейку А1 текста  38
  57. Сколько книг открыто    38
  58. Закрытие всех книг  39
  59. Закрытие рабочей книги только при выполнении условия    39
  60. Сохранение рабочей книги с именем, представляющим собой текущую дату    39
  61. Сохранена ли рабочая книга  39
  62. Создать книгу с одним листом    39
  63. Создать книгу   39
  64. Удаление ненужных имен  40
  65. Быстрое размножение рабочей книги   40
  66. Сортировка листов   40
  67. Поиск максимального значения на всех листах книги   42
  68. Рабочий лист    43
  69. Проверка наличия защиты рабочего листа  43
  70. Список отсортированных листов   43
  71. Создать новый лист_1    45
  72. Создать новый лист_2    45
  73. Удаление листов в зависимости от даты   45
  74. Копирование листа в книге   46
  75. Копирование листа в новую книгу (создается) 46
  76. Перемещение листа в книге   46
  77. Перемещение нескольких листов в новую книгу 46
  78. Заменить существующий файл  46
  79. «Перелистывание» книги  46
  80. Вставка колонтитула с именем книги, листа и текущей датой   47
  81. Существует ли лист  47
  82. Существует ли лист_2    47
  83. Вывод количества листов в активной книге    48
  84. Вывод количества листов в активной книге в виде гиперссылок 48
  85. Вывод имен активных листов по очереди   48
  86. Вывод имени и номеров листов текущей книги  48
  87. Сделать лист невидимым  49
  88. Сколько страниц на всех листах? 49
  89. Ячейка и диапазон (столбцы и строки)    49
  90. Копирование строк на другой лист    49
  91. Копирование столбцов на другой лист 49
  92. Подсчет количества ячеек, содержащих указанные значения_1   50
  93. Подсчет количества ячеек в диапазоне, содержащих указанные значения_2   50
  94. Подсчет количества видимых ячеек в диапазоне    51
  95. Определение количества ячеек в диапазоне и суммы их значений    51
  96. Подсчет количества ячеек    51
  97. Автоматический пересчет данных таблицы при изменении ее значений    51
  98. Ввод данных в ячейки    53
  99. Ввод данных с использованием формул 53
  100. Последовательный ввод данных    53
  101. Ввод текстоввых данных в ячейки 53
  102. Вывод в ячейки названия книги, листа и количества листов    54
  103. Удаление пустых строк_1 54
  104. Удаление пустых строк_2 54
  105. Удаление пустых строк_3 55
  106. Удаление строки по условию  55
  107. Удаление скрытых строк  56
  108. Удаление используемых скрытых строк или строк с нулевой высотой 56
  109. Удаление дубликатов по маске    56
  110. Выделение диапазона над текущей ячейкой 57
  111. Выделение диапазона над текущей ячейкой_2   57
  112. Выделить ячейку и поместить туда число  58
  113. Выделение отрицательных значений    58
  114. Выделение диапазона и использование абсолютных адресов  58
  115. Выделение ячеек через интервал_1    59
  116. Выделение ячеек через интервал_2    59
  117. Выделение нескольких диапазонов 60
  118. Движение по ячейкам 60
  119. Поиск ближайшей пустой ячейки столбца   61
  120. Поиск максимального значения    61
  121. Поиск и замена по шаблону   61
  122. Поиск значения с отображением результата в отдельном окне   62
  123. Поиск с выделением найденных данных_1   62
  124. Поиск с выделением найденных данных_2   62
  125. Поиск по условию в диапазоне    63
  126. Поиск последней непустой ячейки диапазона   64
  127. Поиск последней непустой ячейки столбца 64
  128. Поиск последней непустой ячейки строки  64
  129. Поиск ячейки синего цвета в диапазоне   65
  130. Поиск отрицательного значения в диапазоне и выделения синим цветом  65
  131. Поиск наличия значения в столбце    65
  132. Поиск совпадений в диапазоне    66
  133. Поиск ячейки в диапазоне_1  67
  134. Поиск  ячейки в диапазоне_2 67
  135. Поиск приближенного значения в диапазоне    67
  136. Поиск начала и окончания диапазона, содержащего данные  68
  137. Поиск начала данных 68
  138. Автоматическая замена значений  68
  139. Быстрое заполнение диапазона (массив)   69
  140. Заполнение через интервал(массив)   69
  141. Заполнение указанного диапазона(массив) 70
  142. Заполнение диапазона(массив)    70
  143. Расчет суммы первых значений диапазона  71
  144. Размещение в ячейке электронных часов   72
  145. «Будильник» 72
  146. Оформление верхней и нижней границ диапазона    72
  147. Адрес активной ячейки   73
  148. Координаты активной ячейки  73
  149. Формула активной ячейки 73
  150. Получение из ячейки формулы 73
  151. Тип данных ячейки   73
  152. Вывод адреса конца диапазона    74
  153. Получение информации о выделенном диапазоне 74
  154. Взять слово с 13 символа в ячейке   76
  155. Создание изменяемого списка (таблица)   77
  156. Проверка на пустое значение 77
  157. Пересечение ячеек   77
  158. Умножение выделенного диапазона на 2    77
  159. Одновременное умножение всех данных диапазона   78
  160. Деление диапазона на 100    78
  161. Возведение каждой ячейки диапазона в квадрат    78
  162. Суммирование данных только видимых ячеек    78
  163. Сумма ячеек с числовыми значениями  79
  164. При суммировании — курсор внутри диапазона  79
  165. Начисление процентов в зависимости от суммы_1   80
  166. Начисление процентов в зависимости от суммы_2   80
  167. Начисление процентов в зависимости от суммы_3   81
  168. Сводный пример расчета комиссионного вознаграждения 81
  169. Движение по диапазону   83
  170. Сдвиг от выделенной ячейки  83
  171. Перебор ячеек вниз по колонне   83
  172. Создание заливки диапазона  84
  173. Подбор параметра ячейки 84
  174. Разбиение диапазона 84
  175. Объединение данных диапазона    85
  176. Объединение данных диапазона_2  85
  177. Узнать максимальную колонку или строку. 86
  178. Ограничение возможных значений диапазона    86
  179. Тестирование скорости чтения и записи диапазонов    88
  180. Открыть MsgBox при выборе ячейки    89
  181. Скрытие строки  89
  182. Скрытие нескольких строк    89
  183. Скрытие столбца 89
  184. Скрытие нескольких столбцов 89
  185. Скрытие строки по имени ячейки  89
  186. Скрытие нескольких строк по адресам ячеек   89
  187. Скрытие столбца по имени ячейки 89
  188. Скрытие нескольких столбцов по адресам ячеек    90
  189. Мигание ячейки  90
  190. Глава 4. Работа с примечаниями  91
  191. Вывод на экран всех примечаний рабочего листа   91
  192. Функция извлечения комментария  91
  193. Список примечаний защищенных листов 91
  194. Перечень примечаний в отдельном списке_1    92
  195. Перечень примечаний в отдельном списке_2    93
  196. Перечень примечаний в отдельном списке_3    93
  197. Подсчет количества примечаний_1 94
  198. Подсчет количества примечаний_2 95
  199. Подсчет примечаний_3    95
  200. Выделение ячеек с примечаниями  95
  201. Отображение всех примечаний 95
  202. Изменение цвета примечаний  96
  203. Добавление примечаний   96
  204. Добавление примечаний в диапазон по условию 96
  205. Перенос комментария в ячейку и обратно  96
  206. Перенос значений из ячейки в комментарий_1  97
  207. Перенос значений из ячейки в комментарий_2  98
  208. Глава . Пользовательские вкладки на ленте   99
  209. Дополнение панели инструментов  99
  210. Добавление кнопки на панель инструментов    99
  211. Панель с одной кнопкой  99
  212. Панель с двумя кнопками 99
  213. Создание панели справа  100
  214. Вызов предварительного просмотра    100
  215. Создание пользовательского меню (вариант 1) 100
  216. Создание пользовательского меню (вариант 2) 101
  217. Создание пользовательского меню (вариант 3) 102
  218. Создание пользовательского меню (вариант 4) 102
  219. Создание пользовательского меню (вариант 5) 102
  220. Создание пользовательского меню (вариант 6) 106
  221. Создание списка пунктов главного меню Excel 108
  222. Создание списка пунктов контекстных меню    108
  223. Отображение панели инструментов при определенном условии    109
  224. Скрытие и отображение панелей инструментов  111
  225. Создать подсказку к моим кнопкам    112
  226. Создание меню на основе данных рабочего листа   112
  227. Создание контекстного меню  115
  228. Блокировка контекстного меню    117
  229. Добавление команды в меню Сервис    118
  230. Добавление команды в меню Вид   119
  231. Создание панели со списком  120
  232. Мультфильм с помощником в главной роли  122
  233. Дополнение помощника текстом, заголовком, кнопкой и значком 123
  234. Новые параметры помощника   124
  235. Использование помощника для выбора цвета заливки    125
  236. Глава . ДИАЛОГОВЫЕ ОКНА 127
  237. Функция INPUTBOX (через ввод значения)  127
  238. Вызов предварительного просмотра    127
  239. Настройка ввода данных в диалоговом окне    127
  240. Открытие диалогового окна (“Открыть файл”)_1    128
  241. Открытие диалогового окна (“Открыть файл”)_2    128
  242. Открытие диалогового окна (“Печать”)    128
  243. Другие диалоговые окна  128
  244. Вызов броузера из Экселя    129
  245. Диалоговое окно ввода данных    129
  246. Диалоговое окно настройки шрифта    129
  247. Значения по умолчанию   129
  248. Глава .Форматирование текста. Таблицы. ГРАНИЦЫ И ЗАЛИВКА.   130
  249. Вывод списка доступных шрифтов  130
  250. Выбор из текста всех чисел  130
  251. Прописная буква только в начале текста  131
  252. Подсчет количества повторов искомого текста 131
  253. Выделение из текста произвольного элемента  132
  254. Отображение текста «задом наперед»  133
  255. Англоязычный текст — заглавными буквами 133
  256. Запуск таблицы символов из Excel    134
  257. глава информация о пользователе, компьютере, принтере и т.д.    136
  258. Получить имя пользователя   136
  259. Вывод разрешения монитора   137
  260. Получение информации об используемом принтере   137
  261. Просмотр информации о дисках компьютера 138
  262. ГЛАВА . ЮЗЕРФОРМЫ   140
  263. Глава . ДИАГРАММЫ   142
  264. Построение диаграммы с помощью макроса  142
  265. Сохранение диаграммы в отдельном файле  143
  266. Построение и удаление диаграммы нажатием одной кнопки   144
  267. Вывод списка диаграмм в отдельном окне  145
  268. Применение случайной цветовой палитры   146
  269. Эффект прозрачности диаграммы   146
  270. Построение диаграммы на основе данных нескольких рабочих листов 148
  271. Создание подписей к данным диаграммы    150
  272. ГлаВА . РАЗНЫЕ ПРОГРАММЫ.   151
  273. Программа для составления кроссвордов   151
  274. Создать обложку DVD 155
  275. Игра «Минное поле»  156
  276. Игра «Угадай животное»  158
  277. Расчет на основании ячеек определенного цвета   161
  278. ГЛАВА .ДРУГИЕ ФУНКЦИИ И МАКРОСЫ 175
  279. Вызов функциональных клавиш 175
  280. Расчет среднего арифметического значения    175
  281. Перевод чисел в «деньги»    175
  282. Поиск ближайшего понедельника   176
  283. Подсчет количества полных лет   177
  284. Расчет средневзвешенного значения   177
  285. Преобразование номера месяца в его название 178
  286. Использование относительных ссылок  178
  287. Преобразование таблицы Excel в HТМL-формат  179
  288. Генератор случайных чисел   181
  289. Случайные числа — на основании диапазона    182
  290. Применение функции без ввода ее в ячейку    183
  291. Подсчет именованных объектов    183
  292. Включение автофильтра с помощью макроса 183
  293. Создание бегущей строки 183
  294. Создание бегущей картинки   184
  295. Вращающиеся автофигуры  185
  296. Вызов таблицы цветов    187
  297. Создание калькулятора   188
  298. Склонение фамилии, имени и отчества 188
  299. ГЛАВА . ДАТА И ВРЕМЯ    194
  300. Вывод даты и времени_1  194
  301. Вывод даты и времени_2  194
  302. Получение системной даты    195
  303. Извлечение даты и часов 195
  304. Функция ДатаПолная  195
  305.  
  306.  
  307.  
  308. ГЛАВА 1. МАКРОСЫ
  309. Запуск макроса с поиском ячейки
  310. ' Sub  GotoFixedCell:
  311. ' Делает активной ячейку, содержащую значение vVariant на
  312. ' рабочем листе sSheetName в активной рабочей книге.
  313. '
  314. ' Note: Содержимое ячеек интерпретируется как 'значение'!
  315. '
  316. Public Sub GotoFixedCell(vValue As Variant, sSheetName As String)
  317.   Dim c As Range, cStart As Range, cForFind As Range
  318.   Dim i As Integer
  319.  
  320.   On Error GoTo errHandle:
  321.  
  322.   Set cForFind = Worksheets(sSheetName).Cells   ' Диапазон поиска
  323.     With cForFind
  324.        Set c = .Find(What:=vValue, After:=ActiveCell, LookIn:=xlValues, _
  325.                 LookAt:= xlРart, SearchOrder:=xlByRows,_
  326.                 SearchDirection:=xlNext, MatchCase:=False)
  327.        Set cStart = c
  328.        While Not c Is Nothing
  329.          Set c = .FindNext(c)
  330.          If c.Address = cStart.Address Then
  331.            c.Select
  332.            Exit Sub
  333.          End If
  334.        Wend
  335.      End With
  336.   Exit Sub
  337. errНandle:
  338.     MsgBox Err.Descriрtion, vbExclamation, "Error #" & Err.Number
  339. End Sub
  340. Запуск макроса при открытии книги
  341. Sub Auto_Oрen()
  342. Запуск макроса при вводе в ячейку «2»
  343. Private Sub Worksheet_Change(ByVal Target As Range)
  344.     Dim w As Object
  345.     'On Error Resume Next
  346.    If Range("A1").Value = 2 Then
  347.         MsgBox "Ох! Значение ячейки стало равным 2-м!"
  348.         MsgBox "Я попробую сейчас открыть модуль с процедурой, которая все это делает!"
  349.         Application.VBE.MainWindow.SetFocus
  350.         Application.VBE.Windows(1).SetFocus
  351.         SendKeys "{F7}", True
  352.     End If
  353. End Sub
  354. Запуск макроса при нажатии «Ентер»
  355. в модуле листа
  356. Private Sub Worksheet_Selectiоnchange(ByVal Target As Range)
  357. Application.OnKey "{~}", "StartEnter"
  358. End Sub
  359.  
  360. в модуле книги
  361. Sub StartEnter()
  362. MsgBox ("sadfsdfsf")
  363. End Sub
  364. Добавить в панель свою вкладку «Надстройки» (Формат ячейки)
  365. Код в модуле рабочего листа
  366. Sub Worksheet_Change(ByVal Target As Excel.Range)
  367.    Call updаtеToolbar
  368. End Sub
  369.  
  370. Sub Worksheet_Selectiоnchange(ByVal Target As Excel.Range)
  371.    Call updаtеToolbar
  372. End Sub
  373. Листинг 2.43. Код в стандартном модуле
  374. Sub FastChangeNumberFormat()
  375.    Dim bar As CommandBar
  376.    Dim button As CommandBarButton
  377.  
  378.    ' Удаление существующей панели инструментов (если она есть)
  379.   On Error Resume Next
  380.    CommandBars("Числовой формат").Delete
  381.    On Error GoTo 0
  382.  
  383.    ' Формирование новой панели
  384.   Set bar = CommandBars.Add
  385.    With bar
  386.       .Name = "Числовой формат"
  387.       .Visible = True
  388.    End With
  389.    ' Создание кнопки
  390.   Set button = CommandBars("Числовой формат").Controls.Add _
  391.     (Type:=msoControlButton)
  392.    With button
  393.       .Caption = ""
  394.       .OnAction = "ChangeNumFormat"
  395.       .TooltipText = "Щелкните для изменения числового формата"
  396.       .Style = msoButtonCaption
  397.    End With
  398.    ' Обновление созданной панели инструментов
  399.   Call updаtеToolbar
  400. End Sub
  401.  
  402. Sub updаtеToolbar()
  403.    ' Обновление панели инструментов (если она создана)
  404.   On Error Resume Next
  405.    ' Изменение заголовка кнопки (на название формата выделенной ячейки)
  406.   CommandBars("Числовой формат").Controls(1).Caption = _
  407.     ActiveCell.NumberFormat
  408. End Sub
  409.  
  410. Sub ChangeNumFormat()
  411.    ' Отображение диалогового окна изменения формата ячейки
  412.   Application.Dialogs(xlDialogFormatNumber).Show
  413.    Call updаtеToolbar
  414. End Sub
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424. ГЛАВА 2. РАБОТА С ФАЙЛАМИ (Т.Е.ОБМЕН ДАННЫМИ С ТХТ, RTF, XLS И Т.Д.)
  425. Проверка наличия файла по указанному пути_1
  426. Sub VerifyFileLocation()
  427.    Dim strFileName As String
  428.    Dim strFileTitle As String
  429.    ' Имя и путь искомого файла
  430.   strFileTitle = "primer.xls"
  431.    strFileName = "C:\Документы\primer.xls"
  432.    ' Проверка наличия файла (функция Dir возвращает пустую _
  433.     строку, если по указанному пути файл обнаружить не удалось)
  434.   If Dir(strFileName) <> "" Then
  435.       MsgBox "Файл " & strFileTitle & " найден"
  436.    Else
  437.       MsgBox "Файл " & strFileTitle & " не найден"
  438.    End If
  439. End Sub
  440. Проверка наличия файла по указанному пути_2
  441. Sub VerifyFileLocation1()
  442.    Dim strFileName As String
  443.    ' Имя искомого файла
  444.   strFileName = "C:\Документы\primer.xls"
  445.    ' Проверка наличия файла (функция Dir возвращает пустую _
  446.     строку, если по указанному пути файл обнаружить не удалось)
  447.   If Dir(strFileName) <> "" Then
  448.       MsgBox "Файл " & strFileName & " найден"
  449.    Else
  450.       MsgBox "Файл " & strFileName & " не найден"
  451.    End If
  452. End Sub
  453. Проверка наличия файла по указанному пути_3
  454. Sub Check_Disk()
  455. On Error Resume Next
  456. If Dir("\\192.168.1.200\c\", vbSystem) <> "" Then
  457. If Err = 52 Then
  458. Err.Clear
  459. MsgBox "Диска нет!", 48, "Ошибка"
  460. Exit Sub
  461. End If
  462. If Err <> 0 Then
  463. MsgBox "Произошло ошибка!", 48, "Ошибка"
  464. Exit Sub
  465. Else
  466. On Error GoTo 0
  467. MsgBox "Диск есть!", 64, ""
  468. End If
  469. End If
  470. End Sub
  471.  
  472. Поиск нужного файла_1
  473. Sub FileSearch()
  474.    Dim strFileName As String
  475.    Dim strFolder As String
  476.    Dim strFullPath As String
  477.  
  478.    ' Задание имени папки для поиска
  479.   strFolder = InputBox("Определите папку:")
  480.    If strFolder = "" Then Exit Sub
  481.    ' Задание имени файла для поиска
  482.   strFileName = Application.InputBox("Введите имя файла:")
  483.    If strFileName = "" Then Exit Sub
  484.    ' При необходимости дополняем имя папки "\"
  485.   If Right(strFolder, 1) <> "\" Then strFolder = strFolder & "\"
  486.  
  487.    ' Полный путь файла
  488.   strFullPath = strFolder & strFileName
  489.  
  490.    ' Вывод окна с отчетом о поиске средствами VBA
  491.   MsgBox "Использование команды VBA..." & vbCrLf & vbCrLf & _
  492.     dhSearchVBA(strFullPath), vbInformation, strFullPath
  493.    ' Вывод окна с отчетом о поиске средствами объекта FileSearch
  494.   MsgBox "Использование объекта FileSearch..." & vbCrLf & _
  495.     vbCrLf & dhSearchFileSearch(strFolder, strFileName), vbInformation, _
  496.     strFullPath
  497.    ' Вывод окна с отчетом о поиске средствами объекта _
  498.     FileSystemObject
  499.   MsgBox "Использование объекта FileSystemObject..." & vbCrLf & _
  500.     vbCrLf & dhSearchFileSystemObject(strFullPath), vbInformation, _
  501.     strFullPath
  502. End Sub
  503. Поиск нужного файла_2
  504.  
  505. Function dhSearchVBA(varFullPath As Variant) As Boolean
  506.    ' Использование команды VBA
  507.   dhSearchVBA = Dir(varFullPath) <> ""
  508. End Function
  509. Поиск нужного файла_3
  510.  
  511. Function dhSearchFileSearch(varFolder As Variant, varFileName _
  512.  As Variant) As Boolean
  513.    ' Использование объекта FileSearch
  514.   With Application.FileSearch
  515.       ' Создание нового поиска
  516.      .NewSearch
  517.       ' Имя для поиска
  518.      .FileName = varFileName
  519.       ' Папка поиска
  520.      .LookIn = varFolder
  521.       ' Собственно поиск
  522.      .Execute
  523.       dhSearchFileSearch = .FoundFiles.Count <> 0
  524.    End With
  525. End Function
  526. Поиск нужного файла_4
  527.  
  528. Function dhSearchFileSystemObject(varFullPath As Variant) As Boolean
  529.    Dim objFSObject As Object
  530.    ' Использование объекта FileSystemObject
  531.   Set objFSObject = CreateObject("sсriрting.FileSystemObject")
  532.    dhSearchFileSystemObject = objFSObject.FileExists(varFullPath)
  533. End Function
  534. Автоматизация удаления файлов
  535. Листинг 3.51. Удаление файла
  536. Sub DeleteFile()
  537.    Kill "C:\Документы\primer.xls"
  538. End Sub
  539. Листинг 3.52. Удаление группы файлов
  540. Sub DeleteFiles()
  541.    ' Удаление всех файлов с расширением XLS из заданной папки
  542.   Kill "C:\Документы" & "*.xls"
  543. End Sub
  544.  
  545. Произвольный текст в строке состояния
  546. Sub ChangeStatusBarText()
  547.    Application.StatusBar = "Как надоело работать!!!"
  548. End Sub
  549. Восстановление строки состояния
  550. Sub ReturnStatusBarText()
  551.    Application.StatusBar = False
  552. End Sub
  553. Бегущая строка в строке состояния
  554. Sub MovingTextInStatusBar()
  555.    Dim intSpaces As Integer
  556.    ' Изменение количества пробелов в начале строки (от 20 до 0) - _
  557.     строка бежит (скорее, ползет) влево
  558.   For intSpaces = 20 To 0 Step -1
  559.       ' Запись текста в строку состояния
  560.      Application.StatusBar = Space(intSpaces) & "Как надоело работать!!!"
  561.       ' Выдерживаем паузу
  562.      Application.Wait Now + TimeValue("00:00:01")
  563.       ' Дадим Excel обработать пользовательский ввод
  564.      DoEvents
  565.    Next
  566.  
  567.    Application.StatusBar = False
  568. End Sub
  569. Быстрое изменение заголовка окна
  570. Sub NewTitle()
  571.    Application.Caption = "Какая хорошая погода"
  572. End Sub
  573. Быстрое изменение заголовка окна_2
  574.  
  575. Sub NewTitle()
  576.    Application.Caption = "Какая хорошая погода"
  577.    ActiveWindow.Caption = "А завтра будет дождь"
  578. End Sub
  579.  
  580. Изменение заголовка окна (со скрытием названия файла)
  581. Sub NewTitle()
  582.    Application.Caption = "Какая хорошая погода"
  583.    ActiveWindow.Caption = ""
  584. End Sub
  585. Возврат к первоначальному заголовку
  586. Sub ReturnTitle()
  587.    ' Возвращение заголовка приложения (то есть Excel)
  588.   Application.Caption = Empty
  589.    ' Указание правильного названия открытого файла (книги)
  590.   ActiveWindow.Caption = ThisWorkbook.Name
  591. End Sub
  592. Что открыто в данный момент
  593. Sub WorkBooksList()
  594.    Dim book As Object
  595.    ' Вывод имени каждой рабочей книги
  596.   For Each book In Workbooks
  597.       MsgBox (book.Name)
  598.    Next
  599. End Sub
  600.  
  601. Работа с текстовыми файлами
  602.  
  603. Открываются файлы командой Open, а закрываются - командой Close.
  604. Sub Test()
  605.    Open "file.txt" For Input As #1
  606.    Close #1
  607. End Sub
  608. Запись и чтение текстового файла
  609. Sub Test()
  610.    Open "file.txt" For Output As #1
  611.    Print #1, "Этот текст будет записан в файл"
  612.    Close #1
  613.  
  614.    Open "file.txt" For Input As #1
  615.    Dim s As String
  616.    Input #1, s
  617.    MsgBox s
  618.    Close #1
  619. End Sub
  620.  
  621. Для записи используется оператор Print, а для чтения - Input. У этих операторов есть свои особенности.
  622. Print #1, "Hello , File"
  623.  
  624. Оператор Input #1 прочитает только Hello и все. Запятая воспринимается как разделитеть. Чтобы прочитать строку целиком, используется оператор Line Input.
  625.  
  626. Sub Test()
  627.    Open "file.txt" For Output As #1
  628.    Print #1, "Hello , File"
  629.    Close #1
  630.  
  631.    Open "file.txt" For Input As #1
  632.    Dim s As String
  633.    Line Input #1, s
  634.    MsgBox s
  635.    Close #1
  636. End Sub
  637.  
  638. Обработка нескольких текстовых файлов
  639. Sub ImportTextFiles()
  640.    Dim fsSearch As FileSearch
  641.    Dim strFileName As String
  642.    Dim strPath As String
  643.    Dim i As Integer
  644.  
  645.    ' Задание пути и возможного имени файла
  646.   strFileName = ThisWorkbook.Path & "\"
  647.    strPath = "text??.txt"
  648.  
  649.    ' Создание объекта FileSearch
  650.   Set fsSearch = Application.FileSearch
  651.    ' Настройка объекта для поиска
  652.   With fsSearch
  653.       ' Маска для поиска
  654.      .LookIn = strFileName
  655.       ' Путь для поиска
  656.      .FileName = strPath
  657.       ' Поиск всех файлов, удовлетворяющих маске
  658.      .Execute
  659.       ' Выход, если файлы не существуют
  660.      If .FoundFiles.Count = 0 Then
  661.          MsgBox "Файлы не обнаружены"
  662.          Exit Sub
  663.       End If
  664.    End With
  665.    ' Обработка найденных файлов
  666.   For i = 1 To fsSearch.FoundFiles.Count
  667.       Call ImportTextFile(fsSearch.FoundFiles(i))
  668.    Next i
  669. End Sub
  670.  
  671. Sub ImportTextFile(FileName As String)
  672.    ' Импорт файла
  673.   Workbooks.OpenText FileName:=FileName, _
  674.     Origin:=xlWindows, _
  675.     StartRow:=1, _
  676.     DataType:=xlFixedWidth, _
  677.     FieldInfo:= _
  678.     Array(Array(0, 1), Array(3, 1), Array(12, 1))
  679.    ' Ввод формул суммирования
  680.   Range("D1").Value = "A"
  681.    Range("D2").Value = "B"
  682.    Range("D3").Value = "C"
  683.    Range("E1:E3").Formula = "=COUNTIF(B:B,D1)"
  684.    Range("F1:F3").Formula = "=SUMIF(B:B,D1,C:C)"
  685. End Sub
  686.  
  687.  
  688. Определение конца строки текстового файла
  689. Sub Test()
  690.    Open "file.txt" For Output As #1
  691.    Print #1, "Hello , File"
  692.    Close #1
  693.    Open "file.txt" For Input As #1
  694.    Dim s As String
  695.    While Not EOF(1)
  696.      Input #1, s
  697.      MsgBox s
  698.    Wend
  699.    Close #1
  700. End Sub
  701.  
  702. Копирование из текстового файла в эксель
  703. Dim TextLine
  704. i = 1
  705. Open "C:\MyFile.txt" For Input As #1
  706. Do While Not EOF(1)
  707. Line Input #1, TextLine
  708. ThisWorkbook.Worksheets("Лист1").Cells(i, 1).Value = TextLine
  709. i = i + 1
  710. Loop
  711. Close #1
  712. Копирование содержимого в текстовый файл_1
  713. Sub Range2TXT()
  714.   MyFile = "C:\File.txt" 'путь к файлу
  715.  Open MyFile For Output As #1 'открыли для записи
  716.  For Each i In Selection 'листаем ячейки выделенного диапазона
  717.    Print #1, i 'пишем (с начала)
  718.  Next
  719.   Close #1 'закрываем
  720. End Sub
  721. Копирование содержимого в текстовый файл_2
  722. Sub SaveAsText()
  723.    Dim cell As Range
  724.    ' Открытие файла для сохранения (имя файла соответствует имени _
  725.     рабочей книги, но отличается расширением - TXT)
  726.   Open ThisWorkbook.Path & "\" & ThisWorkbook.Name & ".txt" _
  727.     For Output As #1
  728.    ' Запись содержимого заполненных ячеек таблицы в файл
  729.   For Each cell In ActiveSheet.UsedRange
  730.       If Not IsEmpty(cell) Then
  731.          Print #1, cell.Address, cell.Formula
  732.       End If
  733.    Next
  734.    ' Не забываем закрывать файл
  735.   Close #1
  736. End Sub
  737. Экспорт данных в txt
  738. Sub ExportAsText()
  739.    Dim lngRow As ****
  740.    Dim intCol As Integer
  741.  
  742.    ' Открытие файла для сохранения
  743.   Open "C:\primer.txt" For Output As #1
  744.    ' Запись выделенной части таблицы в файл (построчно)
  745.   For lngRow = 1 To Selection.Rows.Count
  746.       ' Запись содержимого всех столбцов строки lngRow
  747.      For intCol = 1 To Selection.Columns.Count
  748.          Write #1, Selection.Cells(lngRow, intCol).Value;
  749.       Next intCol
  750.       ' Начнем новую строку в файле
  751.      Print #1, ""
  752.    Next lngRow
  753.    ' Не забываем закрыть файл
  754.   Close #1
  755. End Sub
  756.  
  757. Sub ImportText()
  758.    Dim strLine As String         ' Одна строка файла
  759.   Dim strCurChar As String * 1  ' Анализируемый символ строки файла
  760.   Dim strValue As String        ' Значение для записи в ячейку
  761.   Dim lngRow As ****            ' Номер текущей строки
  762.   Dim intCol As Integer         ' Номер текущего столбца
  763.   Dim i As Integer
  764.  
  765.    ' Открытие импортируемого файла
  766.   Open "C:\primer.txt" For Input As #1
  767.    ' Считываем все строки файла и записываем данные, разделенные _
  768.     запятой, в ячейки таблицы (начиная с текущей ячейки)
  769.   Do Until EOF(1)
  770.       ' Считываем строку из файла
  771.      Line Input #1, strLine
  772.       ' Разбираем считанную строку
  773.      For i = 1 To Len(strLine)
  774.          strCurChar = Mid(strLine, i, 1)
  775.          If strCurChar = "," Then
  776.             ' Найден разделитель столбцов - запятая. Запишем _
  777.              сформированное значение в ячейку
  778.            ActiveCell.offset(lngRow, intCol) = strValue
  779.             intCol = intCol + 1
  780.             strValue = ""
  781.          ElseIf i = Len(strLine) Then
  782.             ' Конец строки - запишем в таблицу последнее _
  783.              значение в строке (перед этим дополним его последним _
  784.              символом строки, кроме кавычки)
  785.            If strCurChar <> Chr(34) Then
  786.                strValue = strValue & strCurChar
  787.             End If
  788.             ' Запись в таблицу
  789.            ActiveCell.offset(lngRow, intCol) = strValue
  790.             strValue = ""
  791.          ElseIf strCurChar <> Chr(34) Then
  792.             ' Добавление символа в формируемое значение ячейки _
  793.              (кавычки игнорируются)
  794.            strValue = strValue & strCurChar
  795.          End If
  796.       Next i
  797.       ' Переход к новой строке таблицы
  798.      intCol = 0
  799.       lngRow = lngRow + 1
  800.    Loop
  801.    ' Закрываем файл
  802.   Close #1
  803. End Sub
  804. Экспорт данных в HТМL
  805. Sub ExportAsHТМLFile()
  806.    Dim strStyle As String     ' Параметры стиля отображения ячейки
  807.   Dim strAlign As String     ' Параметры выравнивания ячейки
  808.   Dim strOut As String       ' Выходная строка с HТМL-кодом
  809.   Dim cell As Object         ' Обрабатываемая ячейка
  810.   Dim strCellText As String  ' Текст обрабатываемой ячейки
  811.   Dim lngRow As ****         ' Номер строки обрабатываемой ячейки
  812.   Dim lngLastRow As ****     ' Номер строки предыдущей ячейки
  813.   Dim strTemp As String
  814.    Dim strFileName As String  ' Имя файла для сохранения HТМL-кода
  815.   Dim i As ****
  816.  
  817.    ' Запрос у пользователя имени файла для сохранения
  818.   strFileName = Application.GetSaveAsFilename( _
  819.     InitialFileName:="Primer.htm", _
  820.     fileFilter:="HТМL Files(*.htm), *.htm")
  821.    ' Проверка, задал ли пользователь имя файла (если нет, _
  822.     то можно выходить)
  823.   If strFileName = "" Then Exit Sub
  824.  
  825.    lngLastRow = Selection.Row
  826.    ' Просмотр всех выделенных ячеек
  827.   For Each cell In Selection
  828.       ' Значение строки для рассматриваемой ячейки
  829.      lngRow = cell.Row
  830.       ' Если перешли на другую строку, то вставляем <tr>
  831.      If lngRow <> lngLastRow Then
  832.          strOut = strOut & vbTab & "</tr>" & vbCrLf & vbTab & _
  833.           "<tr>" & vbCrLf
  834.          ' Переход на следующую сроку
  835.         lngLastRow = lngRow
  836.       End If
  837.  
  838.       ' Задание шрифта ячейки
  839.      If Not IsNull(cell.Font.Size) Then
  840.          strStyle = " style=" & "font-size: " & Int(100 * _
  841.           cell.Font.Size / 19) & "%;"
  842.       End If
  843.       ' Для полужирного шрифта вставляем <b>
  844.      If cell.Font.Bold Then
  845.          strCellText = "<b>" & strCellText & "</b>"
  846.       End If
  847.  
  848.       ' Задание выравнивания
  849.      If cell.HorizontalAlignment = xlRight Then
  850.          ' По правому краю
  851.         strAlign = " align=" & "right"
  852.       ElseIf cell.HorizontalAlignment = xlCenter Then
  853.          ' По центру
  854.         strAlign = " align=" & "center"
  855.       Else
  856.          ' По левому краю (по умолчанию)
  857.         strAlign = ""
  858.       End If
  859.  
  860.       ' Чтение текста в ячейке
  861.      strCellText = cell.Text
  862.       ' Если нужно, то вертикальный вывод текста (в строку strTemp _
  863.        с последующим перенесением обратно в strCellText)
  864.      If cell.Orientation <> xlHorizontal Then
  865.          strTemp = ""
  866.          ' Печать после каждого символа специального _
  867.           разделителя - <br>
  868.         For i = 1 To Len(strCellText)
  869.             strTemp = strTemp & Mid$(strCellText, i, 1) & "<br>"
  870.          Next i
  871.          strCellText = strTemp
  872.          strStyle = ""
  873.       End If
  874.  
  875.       strOut = strOut & vbTab & vbTab & "<td" & strStyle & _
  876.        strAlign & ">" & strCellText & "</td>" & vbCrLf
  877.    Next
  878.    ' Вставка <tr> для первой строки и </tr> - для последней
  879.   strOut = vbTab & "<tr>" & vbCrLf & strOut & vbTab & "</tr>" & vbCrLf
  880.    ' Вставка дескриптора <table>
  881.   strOut = "<table border=1 cellpadding=3 cellspacing=1>" _
  882.     & vbCrLf & strOut & vbCrLf & "</table>"
  883.  
  884.    ' Сохранение HТМL-кода в файл
  885.   Open strFileName For Output As 1
  886.    Print #1, strOut
  887.    Close 1
  888.  
  889.    ' Вывод окна с информационным сообщением о результатах работы
  890.   MsgBox Selection.Count & " ячеек экспортировано в файл " & _
  891.     strFileName
  892. End Sub
  893.  
  894.  
  895.  
  896. Импорт данных, для которых нужно более 256 столбцов
  897. Sub ImportWideSheet()
  898.    Dim rgRange As Range              ' Хранит заполняемую ячейку
  899.   Dim lngRow As ****                ' Хранит номер текущей строки
  900.   Dim intCol As Integer             ' Хранит номер текущего столбца
  901.   Dim i As Integer
  902.    Dim strLine As String             ' Обрабатываемая строка (из файла)
  903.   Dim strCurChar As String * 1
  904.    Dim strCellValue As String        ' В этой строке формируется значение _
  905.                                        заполняемой ячейки таблицы
  906.   Dim wshtCurrentSheet As Worksheet ' Лист, на котором находится _
  907.                                        заполняемая ячейка
  908.  
  909.    ' Отключение обновления изображения
  910.   Application.ScreenUpdating = False
  911.  
  912.    ' Создание книги с одним листом
  913.   Workbooks.Add xlWorksheet
  914.    Set rgRange = ActiveWorkbook.Sheets(1).Range("A1")
  915.  
  916.    ' Чтение первой строки из файла (по этой строке определяется _
  917.     ширина таблицы)
  918.    Open ThisWorkbook.Path & "\Primer.txt" For Input As #1
  919.    Line Input #1, strLine
  920.    ' Обработка первой строки с добавлением новых листов по мере _
  921.     необходимости
  922.   For i = 1 To Len(strLine)
  923.       strCurChar = Mid(strLine, i, 1)
  924.       ' Проверка - закончились столбцы или нет
  925.      If intCol <> 0 And intCol Mod 256 = 0 Then
  926.          ' Столбцы текущего листа закончились - добавим новый лист _
  927.           и перейдем к его первому столбцу
  928.         Set wshtCurrentSheet = ActiveWorkbook.Sheets.Add(, _
  929.           ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))
  930.          Set rgRange = wshtCurrentSheet.Range("A1")
  931.          intCol = 0
  932.       End If
  933.  
  934.       ' Проверка - закончилось поле или нет
  935.      If strCurChar = "," Then
  936.          ' Запишем данные в таблицу
  937.         rgRange.offset(lngRow, intCol) = strCellValue
  938.          intCol = intCol + 1
  939.          strCellValue = ""
  940.       Else
  941.          ' Добавляем очередной символ в строку со значением текущей _
  942.           ячейки
  943.         strCellValue = strCellValue & Mid(strLine, i, 1)
  944.  
  945.          ' Проверка - конец строки или нет
  946.         If i = Len(strLine) Then
  947.             ' Дошли до конца строки - запишем значение последней ячейки
  948.            rgRange.offset(lngRow, intCol) = strCellValue
  949.             intCol = 0
  950.             strCellValue = ""
  951.          End If
  952.       End If
  953.    Next i
  954.  
  955.    ' Чтение остальных строк файла
  956.   Do Until EOF(1)
  957.       Set rgRange = ActiveWorkbook.Sheets(1).Range("A1")
  958.       lngRow = lngRow + 1
  959.       intCol = 0
  960.       Line Input #1, strLine
  961.  
  962.       ' Обработка считанной строки
  963.      For i = 1 To Len(strLine)
  964.          strCurChar = Mid(strLine, i, 1)
  965.          ' Проверка - закончились столбцы или нет
  966.         If intCol <> 0 And intCol Mod 256 = 0 Then
  967.             ' Столбцы текущего листа закончились - добавим новый лист _
  968.              и перейдем к его первому столбцу
  969.            Set wshtCurrentSheet = ActiveWorkbook.Sheets.Add(, _
  970.              ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))
  971.             Set rgRange = wshtCurrentSheet.Range("A1")
  972.             intCol = 0
  973.          End If
  974.  
  975.          ' Проверка - закончилось поле или нет
  976.         If strCurChar = "," Then
  977.             ' Запишем данные в таблицу
  978.            rgRange.offset(lngRow, intCol) = strCellValue
  979.             intCol = intCol + 1
  980.             strCellValue = ""
  981.          Else
  982.             ' Добавляем очередной символ в строку со значением текущей _
  983.              ячейки
  984.            strCellValue = strCellValue & Mid(strLine, i, 1)
  985.  
  986.             ' Проверка - конец строки или нет
  987.            If i = Len(strLine) Then
  988.                ' Дошли до конца строки - запишем значение последней _
  989.                 ячейки
  990.               rgRange.offset(lngRow, intCol) = strCellValue
  991.                strCellValue = ""
  992.             End If
  993.          End If
  994.       Next i
  995.    Loop
  996.  
  997.    ' Не забываем закрыть входной файл
  998.   Close #1
  999.    ' и разрешить обновление изображения
  1000.   Application.ScreenUpdating = True
  1001. End Sub
  1002.  
  1003. Создание резервных копий ценных файлов
  1004.  
  1005.  Этот макрос сохраняет текущую книгу в папку C:\TEMP, добавляя к имени книги текущее время и дату.
  1006. Sub Backup_Active_Workbook()
  1007.     Dim x As String
  1008.     strPath = "c:\TEMP"
  1009.     On Error Resume Next
  1010.     x = GetAttr(strPath) And 0
  1011.     If Err = 0 Then ' если путь существует - сохраняем копию книги
  1012.        strDate = Format(Now, "dd/mm/yy hh-mm")
  1013.         FileNameXls = strPath & "\" & Left(ActiveWorkbook.Name, _
  1014.              Len(ActiveWorkbook.Name) - 4) & " " & strDate & ".xls"
  1015.         ActiveWorkbook.SaveCopyAs FileName:=FileNameXls
  1016.     Else 'если путь не существует - выводим сообщение
  1017.        MsgBox "Папка " & strPath & " недоступна или не существует!", vbCritical
  1018.     End If
  1019. End Sub
  1020.  
  1021. При желании можно заменить первую строку на:
  1022.  
  1023. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  1024. и поместить этот макрос не в Module1 как обычно, а в модуль ЭтаКнига (ThisWorkbook) - тогда автоматическое сохранение резервной копии будет происходить каждый раз перед закрытием файла.
  1025. Подсчет количества открытий файла
  1026. Количество открытий файла (вариант 1)
  1027. Sub Auto_Open()
  1028.    Worksheets(1).Cells(1) = Worksheets(1).Cells(1) + 1
  1029. End Sub
  1030. Количество открытий файла (вариант 2)
  1031. Sub Auto_Open()
  1032.    Worksheets(1).Cells(1, 1) = Worksheets(1).Cells(1, 1) + 1
  1033. End Sub
  1034. Количество открытий файла (вариант 3)
  1035. Sub Auto_Open()
  1036.    Worksheets(1).Range("A1") = Worksheets(1).Range("A1") + 1
  1037. End Sub
  1038.  
  1039. Вывод пути к файлу в активную ячейку
  1040. Sub ExcelSearch()
  1041.  
  1042. Dim fname As String
  1043. Dim result As Integer
  1044. With Application.FileDialog(1) ' ?????? : With Application.FileDialog(msoFileDialogOpen) '
  1045. .Title = "Select Excel file"
  1046.  
  1047. .InitialFileName = "C:\" 'default path'
  1048. .AllowMultiSelect = False
  1049. .Filters.Clear
  1050. .Filters.Add "Pack files", "*.xls", 1
  1051. result = .Show
  1052.  
  1053. If result = 0 Then Exit Sub
  1054. fname = Trim(.SelectedItems.Item(1))
  1055. End With
  1056.  
  1057. 'On Error Resume Next
  1058.  
  1059. ActiveCell = fname
  1060.  
  1061.  
  1062. End Sub
  1063. Копирование содержимого файла RTF в эксель
  1064. Sub OpenRtfAndPasteToSheets()
  1065. Dim wd As Object
  1066. Dim ns As Worksheet
  1067.  
  1068. On Error Resume Next
  1069. 'запустим Ворд
  1070. Set wd = GetObject("", "Word.Application")
  1071. If Err.Number <> 0 Then
  1072. Err.Clear
  1073. Set wd = CreateObject("Word.Application")
  1074. If Err.Number <> 0 Then Exit Sub
  1075. End If
  1076.  
  1077. On Error GoTo BAD
  1078.  
  1079. Do
  1080. 'получим имя очередного файла
  1081. f = Application.GetOpenFilename("Файлы RTF, *.rtf,Все файлы, *.*")
  1082. If TypeName(f) = "Boolean" Then Exit Do 'если Отмена - выход
  1083. 'откроем выбранный очередной файл
  1084. Set wdd = wd.documents.Open(f)
  1085. ' wd.Visible = True
  1086. 'скопируем содержимое документа
  1087. t = wdd.Content.Copy
  1088. 'создадим лист для этого документа
  1089. Set ns = ActiveWorkbook.Worksheets.Add
  1090. 'вставим скопированное в новый лист
  1091. ns.Paste Destination:=ns.Cells(1, 1)
  1092. 'немного выравним вид
  1093. ns.Cells.WrapText = False
  1094. ns.Columns.AutoFit
  1095. ns.Rows.AutoFit
  1096. wdd.Close
  1097. Loop
  1098. wd.Quit
  1099. Set wd = Nothing
  1100. Exit Sub
  1101. BAD:
  1102. MsgBox Err.Desсriрtion
  1103. On Error Resume Next
  1104. wd.Quit
  1105. Set wd = Nothing
  1106. End
  1107. End Sub
  1108. Копирование данных из закрытой книги
  1109. ActiveCell.FormulaR1C1 = "='D:\contacts\zakaz\[zakaz.xls]Лист1'!R1C1"
  1110. Извлечение данных из закрытого файла
  1111. Sub GetDataFromFile()
  1112.    Range("A1").Formula = "='C:\[Example.xls]Лист1'!A1"
  1113. End Sub
  1114.  
  1115. Поиск слова в файлах
  1116. Option Explicit
  1117.  
  1118. Sub Поиск_во_всех_файлах()
  1119. Dim iShtName$, iPath$, iFileName$, firstAddress$
  1120. Dim iSheet As Worksheet, iFoundSht As Worksheet
  1121. Dim iTempWB As Workbook, iBazaWB As Workbook
  1122. Dim TextToFind As Variant, iFoundRng As Range
  1123. Dim FD As FileDialog, iLastRow&
  1124. Dim FoundAny As Boolean
  1125.  
  1126.     TextToFind = Application.InputBox("Введите текст для поиска:", "Поиск")
  1127.     If TextToFind = "" Or TextToFind = False Then Exit Sub
  1128.     TextToFind = Trim(TextToFind)
  1129.     Set FD = Application.FileDialog(msoFileDialogFilePicker)
  1130.     With FD
  1131.         .AllowMultiSelect = False
  1132.         .Title = "Укажите любой файл в папке"
  1133.         .ButtonName = "Выбрать папку"
  1134.         If .Show = False Then Exit Sub Else iPath = Mid(.SelectedItems(1), 1, InStrRev(.SelectedItems(1), "\"))
  1135.     End With
  1136.     Set FD = Nothing
  1137.     Workbooks.Add
  1138.     Sheets.Add.Name = "Поиск"
  1139.     Set iFoundSht = ActiveSheet
  1140.     iFoundSht.Cells(1, 1) = "Ищем: " & TextToFind
  1141.     iFoundSht.Cells(1, 1).Font.Bold = True
  1142.     With Application
  1143.         .ScreenUpdating = False
  1144.         .Calculation = xlManual
  1145.         .StatusBar = "Идёт поиск..."
  1146.         .ShowWindowsInTaskbar = False
  1147.         iFileName = Dir(iPath & "*.xls")
  1148.         Do While iFileName$ <> ""
  1149.             Set iTempWB = Workbooks.Open(FileName:=iPath & iFileName, updаtеLinks:=False, ReadOnly:=True)
  1150.             For Each iSheet In iTempWB.Sheets
  1151.                 If iSheet.FilterMode = True Then iSheet.ShowAllData
  1152.                 Set iFoundRng = iSheet.Cells.Find(What:=TextToFind, LookIn:=xlFormulas, LookAt:=xlPart)
  1153.                 If Not iFoundRng Is Nothing Then
  1154.                     FoundAny = True
  1155.                     firstAddress = iFoundRng.Address
  1156.                     Do
  1157.                         With iFoundSht
  1158.                             iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
  1159.                             If iLastRow = 1 Then iLastRow = 2
  1160.                             If iShtName <> iSheet.Name Then    'если новый файл
  1161.                                With .Cells(iLastRow + 2, 1)
  1162.                                     .Value = "Файл: " & iTempWB.Name & ", Лист: " & iSheet.Name
  1163.                                     .Font.Bold = True
  1164.                                 End With
  1165.                             End If
  1166.                             iFoundRng.EntireRow.Copy Destination:=.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)    'копируем всю строку
  1167.                            iShtName = iSheet.Name
  1168.                         End With
  1169.                         Set iFoundRng = iSheet.Cells.FindNext(iFoundRng)
  1170.                     Loop While iFoundRng.Address <> firstAddress
  1171.                 Else
  1172.                 End If
  1173.             Next
  1174.             iTempWB.Close SaveChanges:=False
  1175.             iFileName = Dir
  1176.         Loop
  1177.         .StatusBar = False
  1178.         .ShowWindowsInTaskbar = True
  1179.         .EnableEvents = True
  1180.         .Calculation = xlCalculationAutomatic
  1181.         .ScreenUpdating = True
  1182.     End With
  1183.     If FoundAny = False Then
  1184.         MsgBox "Текст '" & TextToFind & "' ни в одном из файлов в папке:" & Chr(10) & iPath & Chr(10) & " не был найден!", 48, "Отчёт"
  1185.         iFoundSht.Parent.Close SaveChanges:=False
  1186.         Exit Sub
  1187.     End If
  1188.     MsgBox "Поиск " & TextToFind & " завершён!", 64, "Поиск"
  1189. End Sub
  1190. Создание текстового файла и ввод текста в файл
  1191. Sub Test()
  1192.  Open "c:\2.txt" For Output As #1
  1193.  Print #1, "Hello File"
  1194.  Close #1
  1195.  Open "c:\1.txt" For Input As #1
  1196.  Dim s As String
  1197.  Input #1, s
  1198.  MsgBox s
  1199.  Close #1
  1200. End Sub
  1201. Создание текстового файла и ввод текста (определение конца файла)
  1202. Sub Test()
  1203. Open "c:\1.txt" For Output As #1
  1204.  Print #1, "Hello , File"
  1205. Close #1
  1206. Open "c:\1.txt" For Input As #1
  1207.  Dim s As String
  1208.  While Not EOF(1)
  1209.   Input #1, s
  1210.   MsgBox s
  1211.  Wend
  1212. Close #1
  1213. End Sub
  1214. Создание документов Word на основе таблицы Excel
  1215. Sub ReportToWord()
  1216.    Dim intReportCount As Integer  ' Количество сообщений
  1217.   Dim strForWho As String        ' Получатель сообщения
  1218.   Dim strSum As String           ' Сумма за товар
  1219.   Dim strProduct As String       ' Название товара
  1220.   Dim strOutFileName As String   ' Имя файла для сохранения сообщения
  1221.   Dim strMessage As String       ' Текст дополнительного сообщения
  1222.   Dim rgData As Range            ' Обрабатываемые ячейки
  1223.   Dim objWord As Object
  1224.    Dim i As Integer
  1225.  
  1226.    ' Создание объекта Word
  1227.   Set objWord = CreateObject("Word.Application")
  1228.    ' Информация с рабочего листа
  1229.   Set rgData = Range("A1")
  1230.    strMessage = Range("E6")
  1231.  
  1232.    ' Просмотр записей на листе Лист1
  1233.   intReportCount = Application.CountA(Range("A:A"))
  1234.    For i = 1 To intReportCount
  1235.       ' Динамические сообщения в строке состояния
  1236.      Application.StatusBar = "Создание сообщения " & i
  1237.  
  1238.       ' Назначение данных переменным
  1239.      strForWho = rgData.Cells(i, 1).Value
  1240.       strProduct = rgData.Cells(i, 2).Value
  1241.       strSum = Format(rgData.Cells(i, 3).Value, "#,000")
  1242.  
  1243.       ' Имя файла для сохранения отчета
  1244.      strOutFileName = ThisWorkbook.Path & "\" & strForWho & ".doc"
  1245.       ' Передача команд в Word
  1246.      With objWord
  1247.          .documents.Add
  1248.          With .Selection
  1249.             ' Заголовок сообщения
  1250.            .Font.Size = 14
  1251.             .Font.Bold = True
  1252.             .ParagraphFormat.Alignment = 1
  1253.             .TypeText Text:="О Т Ч Е Т"
  1254.             ' Дата
  1255.            .TypeParagraph
  1256.             .TypeParagraph
  1257.             .Font.Size = 12
  1258.             .ParagraphFormat.Alignment = 0
  1259.             .Font.Bold = False
  1260.             .TypeText Text:="Дата:" & vbTab & _
  1261.              Format(Date, "mmmm d, yyyy")
  1262.             ' Получатель сообщения
  1263.            .TypeParagraph
  1264.             .TypeText Text:="Кому: менеджеру " & vbTab & strForWho
  1265.             ' Отправитель
  1266.            .TypeParagraph
  1267.             .TypeText Text:="От:" & vbTab & Application.UserName
  1268.             ' Сообщение
  1269.            .TypeParagraph
  1270.             .TypeParagraph
  1271.             .TypeText strMessage
  1272.  
  1273.             .TypeParagraph
  1274.             .TypeParagraph
  1275.             ' Название товара
  1276.            .TypeText Text:="Продано товара:" & vbTab & strProduct
  1277.             .TypeParagraph
  1278.             ' Сумма за товар
  1279.            .TypeText Text:="На сумму:" & vbTab & _
  1280.              Format(strSum, "$#,##0")
  1281.          End With
  1282.          ' Сохранение документа
  1283.         .ActiveDocument.SaveAs FileName:=strOutFileName
  1284.       End With
  1285.    Next i
  1286.  
  1287.    ' Удаление объекта Word
  1288.   objWord.Quit
  1289.    Set objWord = Nothing
  1290.  
  1291.    ' Обновление строки состояния
  1292.   Application.StatusBar = False
  1293.    ' Вывод на экран информационного сообщения
  1294.   MsgBox intReportCount & " заметки создано и сохранено в папке " _
  1295.     & ThisWorkbook.Path
  1296. End Sub
  1297.  
  1298. Команды создания и удаления каталогов
  1299. Sub Test()
  1300.  MkDir ("c:\test")
  1301. End Sub
  1302. И удаляем.
  1303. Sub Test()
  1304.  RmDir ("c:\test")
  1305. End Sub
  1306. Получение  текущего каталога
  1307. Sub Test()
  1308.  MsgBox (CurDir)
  1309. End Sub
  1310. Смена каталога
  1311. Sub Test()
  1312.  ChDir ("c:\windows")
  1313.  MsgBox (CurDir)
  1314. End Sub
  1315. Посмотреть все файлы в каталоге_1
  1316. Sub Test()
  1317.  Dim s As String
  1318.  s = Dir("c:\windows\inf\*.*")
  1319.  Debug.Print s
  1320.  Do While s <> ""
  1321.    s = Dir
  1322.    Debug.Print s
  1323.  Loop
  1324. End Sub
  1325. Посмотреть все файлы в каталоге_2
  1326. ' Объявление API-функции для отображения стандартного окна _
  1327.  просмотра папок
  1328. Declare Function SHBrowseForFolder Lib "shell32.dll" _
  1329.  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As ****
  1330. ' Объявление API-функции для преобразования данных, возвращаемых _
  1331.  функцией SHBrowseForFolder, в строку
  1332. Declare Function SHGetPathFromIDList Lib "shell32.dll" _
  1333.  Alias "SHGetPathFromIDListA" (ByVal pidl As ****, ByVal _
  1334.  pszPath As String) As ****
  1335.  
  1336. ' Структура используется функцией SHBrowseForFolder
  1337. Type BROWSEINFO
  1338.    hwndOwner As ****     ' Родительское окно (для диалога)
  1339.   pidlRoot As ****      ' Корневая папка для просмотра
  1340.   strDisplayName As String
  1341.    strTitle As String    ' Заголовок окна
  1342.   ulFlags As ****       ' Флаги для окна
  1343.   ' Следующие три параметра в VBA не используются
  1344.   lpfn As ****
  1345.    lParam As ****
  1346.    iImage As ****
  1347. End Type
  1348.  
  1349. Sub BrowseFolder()
  1350.    Dim strPath As String  ' Папка, список файлов которой выводится
  1351.   Dim strFile As String
  1352.    Dim intRow As ****     ' Текущая строка таблицы
  1353.  
  1354.    ' Выбор папки
  1355.   strPath = dhBrowseForFolder()
  1356.    If strPath = "" Then Exit Sub
  1357.    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
  1358.  
  1359.    ' Оформление заголовка отчета
  1360.   ActiveSheet.Cells.ClearContents
  1361.    ActiveSheet.Cells(1, 1) = "Имя файла"
  1362.    ActiveSheet.Cells(1, 2) = "Размер"
  1363.    ActiveSheet.Cells(1, 3) = "Дата/время"
  1364.    ActiveSheet.Range("A1:C1").Font.Bold = True
  1365.  
  1366.    ' Просмотр объектов в папке...
  1367.   ' Первый объект папки
  1368.   strFile = Dir(strPath, 7)
  1369.    intRow = 2
  1370.    Do While strFile <> ""
  1371.       ' Запись в столбец "A" имени файла
  1372.      ActiveSheet.Cells(intRow, 1) = strFile
  1373.       ' Запись в столбец "B" размера файла
  1374.      ActiveSheet.Cells(intRow, 2) = FileLen(strPath & strFile)
  1375.       ' Запись в столбец "C" времени изменения файла
  1376.      ActiveSheet.Cells(intRow, 3) = FileDateTime(strPath & strFile)
  1377.       ' Следующий объект папки
  1378.      strFile = Dir
  1379.       intRow = intRow + 1
  1380.    Loop
  1381. End Sub
  1382.  
  1383. Function dhBrowseForFolder() As String
  1384.    Dim biBrowse As BROWSEINFO
  1385.    Dim strPath As String
  1386.    Dim lngResult As ****
  1387.    Dim intLen As Integer
  1388.  
  1389.    ' Заполнение полей структуры BROWSEINFO
  1390.   ' Корневая папка - Рабочий стол
  1391.   biBrowse.pidlRoot = 0&
  1392.    ' Заголовок окна
  1393.   biBrowse.strTitle = "Выбор папки"
  1394.    ' Тип возвращаемой папки
  1395.   biBrowse.ulFlags = &H1
  1396.    ' Вывод стандартного окна просмотра папок
  1397.   lngResult = SHBrowseForFolder(biBrowse)
  1398.  
  1399.    ' Обработка результата работы окна
  1400.   If lngResult Then
  1401.       ' Получение пути (по возвращенным данным)
  1402.      strPath = Space$(512)
  1403.       If SHGetPathFromIDList(ByVal lngResult, ByVal strPath) Then
  1404.          ' Строка пути заканчивается символом Chr(0)
  1405.         intLen = InStr(strPath, Chr$(0))
  1406.          ' Выделение и возврат пути
  1407.         dhBrowseForFolder = Left(strPath, intLen - 1)
  1408.       Else
  1409.          ' Не удалось получить путь
  1410.         dhBrowseForFolder = ""
  1411.       End If
  1412.    Else
  1413.       ' Пользователь нажал кнопку "Отмена"
  1414.      dhBrowseForFolder = ""
  1415.    End If
  1416. End Function
  1417. Посмотреть все файлы в каталоге_3
  1418. ' Объявление API-функции для отображения стандартного окна _
  1419.  просмотра папок
  1420. Declare Function SHBrowseForFolder Lib "shell32.dll" _
  1421.  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As ****
  1422. ' Объявление API-функции для преобразования данных, возвращаемых _
  1423.  функцией SHBrowseForFolder, в строку
  1424. Declare Function SHGetPathFromIDList Lib "shell32.dll" _
  1425.  Alias "SHGetPathFromIDListA" (ByVal pidl As ****, ByVal _
  1426.  pszPath As String) As ****
  1427.  
  1428. ' Структура используется функцией SHBrowseForFolder
  1429. Type BROWSEINFO
  1430.    hwndOwner As ****     ' Родительское окно (для диалога)
  1431.   pidlRoot As ****      ' Корневая папка для просмотра
  1432.   strDisplayName As String
  1433.    strTitle As String    ' Заголовок окна
  1434.   ulFlags As ****       ' Флаги для окна
  1435.   ' Следующие три параметра в VBA не используются
  1436.   lpfn As ****
  1437.    lParam As ****
  1438.    iImage As ****
  1439. End Type
  1440.  
  1441. Sub BrowseFolder1()
  1442.    Dim strPath As String  ' Папка, список файлов которой выводится
  1443.   Dim strFile As String
  1444.    Dim intRow As ****     ' Текущая строка таблицы
  1445.  
  1446.    ' Выбор папки
  1447.   strPath = dhBrowseForFolder()
  1448.    If strPath = "" Then Exit Sub
  1449.    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
  1450.  
  1451.    ' Оформление заголовка отчета
  1452.   ActiveSheet.Cells.ClearContents
  1453.    ActiveSheet.Cells(1, 1) = "Имя файла"
  1454.    ActiveSheet.Cells(1, 2) = "Размер"
  1455.    ActiveSheet.Cells(1, 3) = "Дата/время"
  1456.    ActiveSheet.Range("A1:C1").Font.Bold = True
  1457.  
  1458.    ' Просмотр объектов в папке...
  1459.   ' Первый объект папки
  1460.   strFile = Dir(strPath, 7)
  1461.    intRow = 2
  1462.    Do While strFile <> ""
  1463.       ' Запись в столбец "A" имени файла
  1464.      ActiveSheet.Cells(intRow, 1) = strPath & strFile
  1465.       ' Запись в столбец "B" размера файла
  1466.      ActiveSheet.Cells(intRow, 2) = FileLen(strPath & strFile)
  1467.       ' Запись в столбец "C" времени изменения файла
  1468.      ActiveSheet.Cells(intRow, 3) = FileDateTime(strPath & strFile)
  1469.       ' Следующий объект папки
  1470.      strFile = Dir
  1471.       intRow = intRow + 1
  1472.    Loop
  1473. End Sub
  1474.  
  1475. Function dhBrowseForFolder() As String
  1476.    Dim biBrowse As BROWSEINFO
  1477.    Dim strPath As String
  1478.    Dim lngResult As ****
  1479.    Dim intLen As Integer
  1480.  
  1481.    ' Заполнение полей структуры BROWSEINFO
  1482.   ' Корневая папка - Рабочий стол
  1483.   biBrowse.pidlRoot = 0&
  1484.    ' Заголовок окна
  1485.   biBrowse.strTitle = "Выбор папки"
  1486.    ' Тип возвращаемой папки
  1487.   biBrowse.ulFlags = &H1
  1488.    ' Выводим стандартное окно просмотра папок
  1489.   lngResult = SHBrowseForFolder(biBrowse)
  1490.  
  1491.    ' Обработка результата работы окна
  1492.   If lngResult Then
  1493.       ' Получение пути (по возвращенным данным)
  1494.      strPath = Space$(512)
  1495.       If SHGetPathFromIDList(ByVal lngResult, ByVal strPath) Then
  1496.          ' Строка пути заканчивается символом Chr(0)
  1497.         intLen = InStr(strPath, Chr$(0))
  1498.          ' Выделение и возврат пути
  1499.         dhBrowseForFolder = Left(strPath, intLen - 1)
  1500.       Else
  1501.          ' Не удалось получить путь
  1502.         dhBrowseForFolder = ""
  1503.       End If
  1504.    Else
  1505.       ' Пользователь нажал кнопку "Отмена" в окне
  1506.      dhBrowseForFolder = ""
  1507.    End If
  1508. End Function
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514. ГЛАВА 3. РАБОЧАЯ ОБЛАСТЬ MICROSOFT EXCEL
  1515. рабочая книга
  1516. Количество имен рабочей книги
  1517. Sub CountNames()
  1518.    Dim intNamesCount As Integer
  1519.    ' Получаем и отображаем количество имен на активном _
  1520.     листе рабочей книги
  1521.   intNamesCount = Names.Count
  1522.    If intNamesCount = 0 Then
  1523.       MsgBox "Имен нет"
  1524.    Else
  1525.       MsgBox "Имен: " & intNamesCount & " шт."
  1526.    End If
  1527. End Sub
  1528. Защита рабочей книги
  1529. Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
  1530.  Cancel As Boolean)
  1531.    If Target.Address = "$D$2" Then
  1532.       ' Установка защиты рабочей книги (с паролем "123", _
  1533.        включенной защитой структуры книги и защитой расположения _
  1534.        окон)
  1535.      ThisWorkbook.Protect "123", True, True
  1536.       ' Указание не обрабатывать нажатие кнопки мыши _
  1537.        в этой ячейке
  1538.      Cancel = True
  1539.    ElseIf Target.Address = "$E$5" Then
  1540.       ' Снятие защиты с книги (необходимо указать ранее установленный _
  1541.        пароль)
  1542.      ThisWorkbook.Unprotect "123"
  1543.       Cancel = True
  1544.    End If
  1545. End Sub
  1546. Запрет печати книги
  1547. Sub Workbook_BeforePrint(Cancel As Boolean)
  1548.    ' Установка флага в True заставляет Exсel игнорировать команду _
  1549.     отправки книги на печать
  1550.   Cancel = True
  1551. End Sub
  1552. Открытие книги (или текстовых файлов)
  1553. Sub Test()
  1554.  Application.Workbooks.Open ("c:\file_03.txt")
  1555. End Sub
  1556. Открытие книги и добавление в ячейку А1 текста
  1557. Dim Ex As New Excel.Application
  1558. Ex.Workbooks.Open "Путь к Файлу"
  1559. Ex.Visible = False
  1560. 'В ячейку "A2" добавляем "Visual Basic"
  1561. Ex.ActiveWorkbook.Sheets.Application.Range("A2") = "Visual Basic"
  1562. Ex.ActiveWorkbook.Save
  1563. Ex.ActiveWorkbook.Close
  1564. Сколько книг открыто
  1565. Sub Test()
  1566.  MsgBox (Str(Application.Workbooks.Count))
  1567. End Sub
  1568. Закрытие всех книг
  1569. Sub Test()
  1570.  Application.Workbooks.Item(1).Close  ‘(еxprеssion.Close(SaveChanges, FileName, RouteWorkbook)
  1571. End Sub
  1572.  
  1573. Закрытие рабочей книги только при выполнении условия
  1574. Sub Workbook_BeforeClose(Cancel As Boolean)
  1575.    If Range("A1").Value <> "Можно закрывать" Then
  1576.       ' Условие закрытия не выполнено. Укажем Exсel игнорировать _
  1577.        команду
  1578.      Cancel = True
  1579.    End If
  1580. End Sub
  1581. Сохранение рабочей книги с именем, представляющим собой текущую дату
  1582. Sub SaveAsDate()
  1583.    Dim strDate As String
  1584.    ' Получение текущей даты и представление ее в формате "ддммгг"
  1585.   strDate = Format(Now(), "ddmmyy")
  1586.    ' Сохранение книги в текущую папку под новым именем
  1587.   ActiveWorkbook.SaveAs ActiveWorkbook.Path & "\" & strDate
  1588. End Sub
  1589. Сохранена ли рабочая книга
  1590. Function dhBookIsSaved() As Boolean
  1591.    ' Если путь файла рабочей книги не задан, то она _
  1592.     не сохранена (ThisWorkbook.path равняется "")
  1593.   dhBookIsSaved = ThisWorkbook.Path <> ""
  1594. End Function
  1595.  
  1596. Создать книгу с одним листом
  1597. Sub NewOneSheetBook()
  1598.    Workbooks.Add xlWBATWorksheet
  1599. End Sub
  1600. Создать книгу
  1601. Sub Test()
  1602.  Application.Workbooks.Add ("E^i'e`a~a`")
  1603. End Sub
  1604. Удаление ненужных имен
  1605. Sub EraseNames()
  1606.    Dim nmName As Name
  1607.    Dim strMessage As String
  1608.    ' Проверка наличия в книге определенных имен
  1609.   If ThisWorkbook.Names.Count = 0 Then
  1610.       ' В книге нет определенных имен
  1611.      MsgBox "Имена не определены"
  1612.       Exit Sub
  1613.    End If
  1614.  
  1615.    ' Просмотр всей коллекции определенных имен и удаление тех, _
  1616.     которые пользователю не нужны
  1617.   For Each nmName In ThisWorkbook.Names
  1618.       With nmName
  1619.          ' Спрашиваем пользователя о необходимости удалить _
  1620.           найденное имя
  1621.         strMessage = "Удалить имя " & .Name & " ? " & vbCr & _
  1622.           "относящееся к " & .RefersTo
  1623.          If MsgBox(strMessage, vbYesNo + vbQuestion) = vbYes Then
  1624.             ' Имя можно удалить
  1625.            .Delete
  1626.          End If
  1627.       End With
  1628.    Next
  1629. End Sub
  1630. Быстрое размножение рабочей книги
  1631. Sub DuplicateBook()
  1632.    Dim avarFileNames As Variant
  1633.    ' Формирование массива из путей для копий книги
  1634.   avarFileNames = Array("C:\" & _
  1635.    ActiveWorkbook.Name, "D:\" & ActiveWorkbook.Name)
  1636.    ' Сохранение книги
  1637.   ActiveWorkbook.SaveAs avarFileNames
  1638. End Sub
  1639.  
  1640. Сортировка листов
  1641. Sub SortSheets()
  1642.     Dim astrSheetNames() As String ' Массив для хранения имен листов
  1643.    Dim intSheetCount As Integer
  1644.     Dim i As Integer
  1645.     Dim objActiveSheet As Object
  1646.  
  1647.     ' Если нет активной рабочей книги - закрыть процедуру
  1648.    If ActiveWorkbook Is Nothing Then Exit Sub
  1649.  
  1650.     ' Проверка защищенности структуры рабочей книги
  1651.    If ActiveWorkbook.ProtectStructure Then
  1652.         ' Сортировка листов защищенной рабочей книги невозможна
  1653.        MsgBox "Структура книги " & ActiveWorkbook.Name & _
  1654.          " защищена. Сортировка листов невозможна.", _
  1655.          vbCritical
  1656.         Exit Sub
  1657.     End If
  1658.  
  1659.     ' Сохраняем ссылку на активный лист книги
  1660.    Set objActiveSheet = ActiveSheet
  1661.  
  1662.     ' Отключение сочетания клавиш Ctrl+Pause Break
  1663.    Application.EnableCancelKey = xlDisabled
  1664.     ' Отключение обновления экрана
  1665.    Application.ScreenUpdating = False
  1666.  
  1667.     intSheetCount = ActiveWorkbook.Sheets.Count
  1668.     ' Заполнение массива astrSheetNames именами листов книги
  1669.    ReDim astrSheetNames(1 To intSheetCount)
  1670.     For i = 1 To intSheetCount
  1671.         astrSheetNames(i) = ActiveWorkbook.Sheets(i).Name
  1672.     Next i
  1673.  
  1674.     ' Сортировка массива имен в порядке возрастания
  1675.    Call Sort(astrSheetNames)
  1676.     ' Перемещение листов книги
  1677.    For i = 1 To intSheetCount
  1678.         ActiveWorkbook.Sheets(astrSheetNames(i)).Move _
  1679.          ActiveWorkbook.Sheets(i)
  1680.     Next i
  1681.  
  1682.     ' Переход на исходный рабочий лист
  1683.    objActiveSheet.Activate
  1684.     ' Включение обновления экрана
  1685.    Application.ScreenUpdating = True
  1686.     ' Включение сочетания клавиш Ctrl+Pause Break
  1687.    Application.EnableCancelKey = xlInterrupt
  1688. End Sub
  1689.  
  1690. Sub Sort(astrNames() As String)
  1691.     ' Сортировка массива строк по алфавиту (в порядке возрастания)
  1692.    Dim i As Integer, j As Integer
  1693.     Dim strBuffer As String
  1694.     Dim fBuffer As Boolean
  1695.  
  1696.     For i = LBound(astrNames) To UBound(astrNames) - 1
  1697.         For j = i + 1 To UBound(astrNames)
  1698.             If astrNames(i) > astrNames(j) Then
  1699.                 ' Меняем i-й и j-й элементы массива местами
  1700.                strBuffer = astrNames(i)
  1701.                 astrNames(i) = astrNames(j)
  1702.                 astrNames(j) = strBuffer
  1703.             End If
  1704.         Next j
  1705.     Next i
  1706. End Sub
  1707. Поиск максимального значения на всех листах книги
  1708. Function dhMaxInBook(cell As Range) As Double
  1709.    Dim sheet As Worksheet
  1710.    Dim dblMax As Double
  1711.    Dim dblResult As Double
  1712.    Dim fFirst As Boolean
  1713.    fFirst = True
  1714.  
  1715.    ' Расчет максимальных значений на всех листах рабочей книги _
  1716.     и выбор наибольшего из них
  1717.   For Each sheet In cell.Parent.Parent.Worksheets
  1718.       ' Расчет максимального значения на листе
  1719.      dblResult = Application.WorksheetFunction.Max(sheet.UsedRange)
  1720.  
  1721.       If fFirst Then
  1722.          ' Найдено первое значение - его не с чем сравнивать
  1723.         dblMax = dblResult
  1724.          fFirst = False
  1725.       End If
  1726.       ' Выбираем большее из dblMax и dbmResult
  1727.      If dblResult > dblMax Then
  1728.          dblMax = dblResult
  1729.       End If
  1730.    Next sheet
  1731.    ' Возврат результата
  1732.   dhMaxInBook = dblMax
  1733. End Function
  1734.  
  1735.  
  1736. РАБОЧИЙ лист
  1737. Проверка наличия защиты рабочего листа
  1738. Sub IsSheetProtected()
  1739.    ' Проверка, установлена ли защита на содержимое листа
  1740.   If Worksheets(1).ProtectContents Then
  1741.       MsgBox "Защита листа включена"
  1742.    Else
  1743.       MsgBox "Защита листа не включена"
  1744.    End If
  1745. End Sub
  1746.  
  1747. Список отсортированных листов
  1748. Sub SortSheets2()
  1749.    Dim astrSheetNames() As String ' Массив для хранения имен листов
  1750.   Dim intSheetCount As Integer
  1751.    Dim i As Integer
  1752.    Dim objActiveSheet As Object
  1753.    ' Если нет активной рабочей книги - закрыть процедуру
  1754.   If ActiveWorkbook Is Nothing Then Exit Sub
  1755.    ' Проверка защищенности структуры рабочей книги
  1756.   If ActiveWorkbook.ProtectStructure Then
  1757.       ' Сортировка листов защищенной рабочей книги невозможна
  1758.      MsgBox "Структура книги " & ActiveWorkbook.Name & _
  1759.        " защищена. Сортировка листов невозможна.", _
  1760.        vbCritical
  1761.       Exit Sub
  1762.    End If
  1763.    ' Сохраняем ссылку на активный лист книги
  1764.   Set objActiveSheet = ActiveSheet
  1765.  
  1766.    ' Отключение сочетания клавиш Ctrl+Pause Break
  1767.   Application.EnableCancelKey = xlDisabled
  1768.    ' Функция обновления экрана отключается
  1769.   Application.ScreenUpdating = False
  1770.  
  1771.    With ActiveWorkbook
  1772.       ' Cоздаем новый лист "Сортировка" (если он еще не создан)
  1773.      On Error Resume Next
  1774.       If .Sheets("Сортировка") Is Nothing Then
  1775.          .Sheets.Add.Name = "Сортировка"
  1776.       End If
  1777.       On Error GoTo 0
  1778.  
  1779.       ' Размещение данных на листе "Сортировка" (в столбец "A")
  1780.      intSheetCount = .Sheets.Count
  1781.       For i = 1 To intSheetCount
  1782.          .Sheets("Сортировка").Cells(i, 1) = .Sheets(i).Name
  1783.       Next i
  1784.  
  1785.       ' Сортировка данных в ячейках листа "Сортировка" по содержимому _
  1786.        столбца A
  1787.      .Sheets("Сортировка").Range("A1").Sort _
  1788.        Key1:=.Sheets("Сортировка").Range("A1"), _
  1789.        Order1:=xlAscending
  1790.  
  1791.       ' Заполнение массива имен отсортированными строками
  1792.      ReDim astrSheetNames(1 To intSheetCount)
  1793.       For i = 1 To intSheetCount
  1794.          astrSheetNames(i) = .Sheets("Сортировка").Cells(i, 1)
  1795.       Next i
  1796.  
  1797.       ' Перемещение листов
  1798.      For i = 1 To intSheetCount
  1799.          .Sheets(astrSheetNames(i)).Move .Sheets(i)
  1800.       Next i
  1801.    End With
  1802.  
  1803.    ' Переход на исходный рабочий лист
  1804.   objActiveSheet.Activate
  1805.    ' Включаем обновление экрана
  1806.   Application.ScreenUpdating = True
  1807.    ' Включение сочетания клавиш Ctrl+Pause Break
  1808.   Application.EnableCancelKey = xlInterrupt
  1809. End Sub
  1810.  
  1811. Создать новый лист_1
  1812. Sub NewSheet()
  1813.    Worksheets.Add
  1814. End Sub
  1815.  
  1816. Sub Tes2t()
  1817. With Application.Workbooks.Item(ActiveWorkbook.Name)
  1818.  ‘Sheets.Add
  1819.  ‘End With
  1820. End Sub
  1821. Dim ExNew As Worksheet
  1822.  ‘Set ExNew = ActiveWorkbook.Worksheets.Add
  1823. ‘ExNew.Name = "Имя Листа"
  1824. Создать новый лист_2
  1825. Worksheets.Add.Name = "List12345.xls"
  1826. Удаление листов в зависимости от даты
  1827. ' Function DelSheetByDate
  1828. ' Удаляет рабочий лист sSheetName в активной рабочей книге,
  1829. ' если дата dDelDate уже наступила
  1830. ' В случае успеха возвращает True, иначе - False
  1831.  
  1832. Public Function DelSheetByDate(sSheetName As String, _
  1833.                                dDelDate As Date) As Boolean
  1834. On Error GoTo errHandle
  1835.  
  1836.   DelSheetByDate = False
  1837.   ' Проверка даты
  1838.  If dDelDate <= Date Then
  1839.    ' Не выводить подтверждение на удаление
  1840.   Application.DisplayAlerts = False
  1841.    ActiveWorkbook.Worksheets(sSheetName).Delete
  1842.    DelSheetByDate = True
  1843.    Application.DisplayAlerts = True
  1844.  End If
  1845.  
  1846. Exit Function
  1847. errHandle:
  1848.   MsgBox Err.Desсriрtion, vbCritical, "Ошибка №" & Err.Number
  1849. End Function
  1850.  
  1851. Копирование листа в книге
  1852. Sub Test()
  1853.  With Application.Workbooks.Item("Test.xls")
  1854.  Sheets("Test").Copy , After:=Sheets("Лист3")
  1855.  End With
  1856. End Sub
  1857. Копирование листа в новую книгу (создается)
  1858. Sub Test()
  1859.   With Application.Workbooks.Item("Test.xls")
  1860.   Sheets("Test").Copy
  1861.   End With
  1862. End Sub
  1863.  
  1864. Перемещение листа в книге
  1865. Sub Test()
  1866.  With Application.Workbooks.Item("Test.xls")
  1867.  Sheets("Test").Move , After:=Sheets("Лист3")
  1868.  End With
  1869. End Sub
  1870. Перемещение нескольких листов в новую книгу
  1871. Sheets(Array("Лист1", "Лист2", "Лист3")).Select
  1872. Sheets("Лист3").Activate
  1873. Sheets(Array("Лист1", "Лист2", "Лист3")).Copy
  1874. Заменить существующий файл
  1875.  
  1876. Sub copy_sheet()
  1877. ShName = ActiveSheet.Name
  1878. Sheets(ShName).Copy
  1879. ActiveWorkbook.SaveAs "c:\" & ShName & ".xls"
  1880. End Sub
  1881. Чтобы не вылезало диалоговое окно надо добавить
  1882. Application.DisplayAlerts = False ' вылючаем все предупреждения
  1883. ActiveWorkbook.SaveAs "c:\" & ShName & ".xls"
  1884. Application.DisplayAlerts = True 'обратно включаем предупреждения.
  1885. «Перелистывание» книги
  1886. Sub SheetsOfBook()
  1887.    Dim sheet As Object
  1888.    ' Отображение имен всех листов активной рабочей книги
  1889.   For Each sheet In ActiveWorkbook.Sheets
  1890.       MsgBox (sheet.Name)
  1891.    Next
  1892. End Sub
  1893. Вставка колонтитула с именем книги, листа и текущей датой
  1894. Sub AddPageHeader()
  1895.    Dim i As Integer
  1896.    With ThisWorkbook
  1897.       ' Вставка колонтитулов на все листы рабочей книги
  1898.      For i = 1 To .Worksheets.Count - 1
  1899.          .Worksheets(i).PageSetup.LeftHeader = .FullName
  1900.          .Worksheets(i).PageSetup.CenterHeader = Worksheets(i).Name
  1901.          .Worksheets(i).PageSetup.RightHeader = Now()
  1902.       Next
  1903.    End With
  1904. End Sub
  1905. Существует ли лист
  1906. Function dhSheetExist(strSheetName As String) As Boolean
  1907.    Dim objSheet As Object
  1908.  
  1909.    On Error GoTo HandleError ' При ошибке перейти на HandleError
  1910.   ' Пытаемся получить ссылку на заданный лист
  1911.   objSheet = ActiveWorkbook.Sheets(strSheetName)
  1912.    ' Ошибки не возникло - лист существует
  1913.   dhSheetExist = True
  1914.    Exit Function
  1915.  
  1916. HandleError:
  1917.    ' При попытке получить доступ к листу с заданным именем _
  1918.     возникла ошибка, значит, такого листа не существует
  1919.   dhSheetExist = False
  1920. End Function
  1921. Существует ли лист_2
  1922.    L = 0
  1923. For Each sheet In Worksheets
  1924. If sheet.Name = "List12" Then
  1925. L = 1
  1926. MsgBox "List12 совпадает с расчетным листом. Переименуйте свой List12 на какое нибудь другое имя!"
  1927. End If
  1928. Next
  1929.  
  1930. If L = 0 Then
  1931. Worksheets.Add.Name = "List12"
  1932. Worksheets(1).Visible = True
  1933. Worksheets("List12").Visible = True
  1934. Worksheets("List12").Activate
  1935. End If
  1936. Вывод количества листов в активной книге
  1937. Sub Test()
  1938.  MsgBox (Str(Application.Workbooks.Item(ActiveWorkbook.Name).Sheets.Count))
  1939. End Sub
  1940. Вывод количества листов в активной книге в виде гиперссылок
  1941. Sub SheetNamesAsHyperLinks()
  1942.    Dim sheet As Worksheet
  1943.    Dim cell As Range
  1944.  
  1945.    With ActiveWorkbook
  1946.       ' Просмотр всех листов книги и создание гиперссылок на них _
  1947.        на первом листе
  1948.      For Each sheet In ActiveWorkbook.Worksheets
  1949.          Set cell = Worksheets(1).Cells(sheet.Index, 1)
  1950.          .Worksheets(1).Hyperlinks.Add Anchor:=cell, Address:="", _
  1951.           SubAddress:="'" & sheet.Name & "'" & "!A1"
  1952.          cell.Formula = sheet.Name
  1953.       Next
  1954.    End With
  1955. End Sub
  1956.  
  1957. Вывод имен активных листов по очереди
  1958. Sub Test()
  1959. With Application.Workbooks.Item(ActiveWorkbook.Name)
  1960. For x = 1 To .Sheets.Count
  1961.  MsgBox (Sheets.Item(x).Name)
  1962. Next x
  1963. End With
  1964. End Sub
  1965. Вывод имени и номеров листов текущей книги
  1966. Sub ShowInfo()
  1967.    Dim i As Integer
  1968.  
  1969.    ' Выводим имя файла рабочей книги
  1970.   Range("A1") = ActiveWorkbook.Name
  1971.    ' Выводим имя текущего листа
  1972.   Range("B1") = ActiveSheet.Name
  1973.  
  1974.    ' Выводим номера листов
  1975.   For i = 1 To ActiveWorkbook.Sheets.Count
  1976.       ActiveSheet.Cells(i, 3) = i
  1977.    Next i
  1978. End Sub
  1979.  
  1980. Сделать лист невидимым
  1981. Sub Test()
  1982. With Application.Workbooks.Item("Test.xls")
  1983.  .Sheets.Item("Лист5").Visible = False
  1984. End With
  1985. End Sub
  1986. Сколько страниц на всех листах?
  1987. Sub GetPrintPagesCount()
  1988.    Dim wshtSheet As Worksheet
  1989.    Dim intPagesCount As Integer
  1990.    ' Суммирование количества страниц, необходимых для печати всех _
  1991.     листов книги
  1992.   For Each wshtSheet In Worksheets
  1993.       intPagesCount = intPagesCount + (wshtSheet.HPageBreaks.Count + 1) * _
  1994.        (wshtSheet.VPageBreaks.Count + 1)
  1995.    Next
  1996.    MsgBox "Всего страниц: " & intPagesCount
  1997. End Sub
  1998. Ячейка и диапазон (столбцы и строки)
  1999. Копирование строк на другой лист
  2000. Sub CopyRows2()
  2001. Dim iCells As Range
  2002.  
  2003. For Each iCells In Range("A2:A5")
  2004. Range(iCells, iCells.offset(, 7)).Copy
  2005. Workbooks.Add
  2006. ActiveSheet.Paste
  2007. ActiveWorkbook.SaveAs FileName:="C:\Temp\" & iCells & ".xls"
  2008. Next iCells
  2009. End Sub
  2010. Копирование столбцов на другой лист
  2011. On Error Resume Next
  2012. s = Names("sourcefilename").Value
  2013. On Error GoTo 0
  2014. If s = "" Then
  2015. sfile = "progcall234_56g"
  2016. Call get_file
  2017. s = sfile
  2018. Else
  2019. s = Mid(s, 3, Len(s) - 3)
  2020. End If
  2021. If s = "" Then Exit Sub
  2022.  
  2023. Workbooks.Open (s)
  2024. Dim snm As String
  2025. snm = ActiveWorkbook.Name
  2026. ncol = WorksheetFunction.CountA(Range("1:1")) ' Range("a1").SpecialCells(xlLastCell).Column
  2027. nrow = WorksheetFunction.CountA(Range("a:a")) 'Range("a1").SpecialCells(xlLastCell).Row
  2028. Range(Cells(1, 1), Cells(nrow, ncol)).Copy
  2029. Workbooks(s1).Activate
  2030. Range("a1").Activate
  2031. ActiveSheet.Paste
  2032. Application.DisplayAlerts = False
  2033. Workbooks(snm).Close
  2034. Подсчет количества ячеек, содержащих указанные значения_1
  2035. Function dhCount(rgn As Range, LowBound As Double, _
  2036.                 UpperBound As Double) As ****
  2037.    Dim cell As Range
  2038.    Dim lngCount As ****
  2039.    ' Проходим по всем ячейкам диапазона rgn и подсчитываем значения, _
  2040.     попадающие в интервал от LowBound до UpperBound
  2041.   For Each cell In rgn
  2042.       If cell.Value >= LowBound And cell.Value <= UpperBound Then
  2043.          ' Значение попадает в заданный интервал
  2044.         lngCount = lngCount + 1
  2045.       End If
  2046.    Next
  2047.    dhCount = lngCount
  2048. End Function
  2049. Подсчет количества ячеек в диапазоне, содержащих указанные значения_2
  2050. Function dhCountSomeCells(rgRange As Range, dblMin As Double, _
  2051.  dblMax As Double) As ****
  2052.    ' Расчет количества ячеек со значениями от dblMin до dblMax _
  2053.     с использованием стандартной функции CountIf
  2054.   With Application.WorksheetFunction
  2055.       dhCountSomeCells = .CountIf(rgRange, ">=" & dblMin) - _
  2056.        .CountIf(rgRange, ">" & dblMax)
  2057.    End With
  2058. End Function
  2059.  
  2060. Подсчет количества видимых ячеек в диапазоне
  2061. Function dhCountVisibleCells(rgRange As Range)
  2062.    Dim lngCount As ****
  2063.    Dim cell As Range
  2064.  
  2065.    ' Проходим по всему диапазону и подсчитываем непустые _
  2066.     видимые ячейки
  2067.   For Each cell In rgRange
  2068.       ' Проверка, есть ли данные в ячейке
  2069.      If Not IsEmpty(cell) Then
  2070.          ' Проверка, видима ли ячейка
  2071.         If Not cell.EntireRow.Hidden And Not _
  2072.           cell.EntireColumn.Hidden Then
  2073.             ' Еще одна видимая ячейка
  2074.            lngCount = lngCount + 1
  2075.          End If
  2076.       End If
  2077.    Next cell
  2078.    dhCountVisibleCells = lngCount
  2079. End Function
  2080. Определение количества ячеек в диапазоне и суммы их значений
  2081. Sub CalculateSum()
  2082.    Dim i As Integer
  2083.    Dim intSum As Integer
  2084.    ' Расчет суммы ячеек столбца "A" (с первой по пятую)
  2085.   For i = 1 To 5
  2086.       intSum = intSum + Cells(i, 1)
  2087.    Next
  2088.    MsgBox "Сумма ячеек: " & intSum
  2089. End Sub
  2090. Подсчет количества ячеек
  2091. Sub CountOfCells()
  2092.    MsgBox (Range("A1:A20, D1:D20").Count)
  2093. End Sub
  2094. Автоматический пересчет данных таблицы при изменении ее значений
  2095. Sub Worksheet_Change(ByVal Target As Range)
  2096.    Dim rgData As Range
  2097.    Dim cell As Range
  2098.    Dim dblMax As Double, dblMin As Double, dblAverage As Double
  2099.  
  2100.    ' Получение контролируемого диапазона ячеек
  2101.   Set rgData = Range("B2:B11")
  2102.    ' Проверка, не входит ли измененная ячейка в контролируемый _
  2103.     диапазон
  2104.   If Not (Application.Intersect(Target, rgData) Is Nothing) Then
  2105.       If Application.WorksheetFunction.CountA(rgData) > 0 Then
  2106.          ' Изменена ячейка из контролируемого диапазона
  2107.         ' Заново рассчитываем минимальное, максимальное и среднее _
  2108.           значения в контролируемом диапазоне ячеек
  2109.         dblMin = Application.WorksheetFunction.Min(rgData)
  2110.          dblMax = Application.WorksheetFunction.Max(rgData)
  2111.          dblAverage = Application.WorksheetFunction.Average(rgData)
  2112.  
  2113.          ' Проверяем каждую ячейку из контролируемого диапазона _
  2114.           и изменяем цвет шрифта ячеек с минимальным и максимальным _
  2115.           значениями, а также помечаем желтым цветом ячейки _
  2116.           со значениями больше среднего
  2117.         For Each cell In rgData
  2118.             If cell.Value = dblMax Then
  2119.                ' Ячейку с максимальным значением выделим красным цветом
  2120.               cell.Font.Bold = True
  2121.                cell.Font.Color = RGB(255, 0, 0)
  2122.             ElseIf cell.Value = dblMin Then
  2123.                ' Ячейку с минимальным значением выделим синим цветом
  2124.               cell.Font.Bold = False
  2125.                cell.Font.Color = RGB(0, 0, 255)
  2126.             Else
  2127.                cell.Font.Bold = False
  2128.                cell.Font.Color = RGB(0, 0, 0)
  2129.             End If
  2130.  
  2131.             If cell.Value > dblAverage Then
  2132.                ' Значение в ячейке больше среднего - выделим ее _
  2133.                 желтым цветом
  2134.               cell.Interior.Color = RGB(255, 255, 0)
  2135.             Else
  2136.                cell.Interior.ColorIndex = xlNone
  2137.             End If
  2138.          Next
  2139.       Else
  2140.          rgData.Interior.ColorIndex = xlNone
  2141.       End If
  2142.    End If
  2143. End Sub
  2144. Ввод данных в ячейки
  2145. Sub SetCellData()
  2146.    ' Заполнение значениями ячеек А3 и В4
  2147.   Range("A3") = "Данные для ячейки A3"
  2148.    Range("B4") = "Данные для ячейки B4"
  2149. End Sub
  2150. Ввод данных с использованием формул
  2151. Sub SetCellFormula()
  2152.    ' Запись в ячейку А6 формулы "=A5+B5"
  2153.   Range("A6") = "=A5+B5"
  2154. End Sub
  2155. Последовательный ввод данных
  2156. Sub StreamInput()
  2157.    Dim strDate As String
  2158.    Dim strSum As String
  2159.    Dim lngRow As ****
  2160.    ' Ввод данных в цикле (повторяется до тех пор, пока пользователь _
  2161.     не введет пустую строку или не нажмет "Отмена" в окне ввода)
  2162.   Do
  2163.       lngRow = Range("A65536").End(xlUp).Row + 1
  2164.       ' Ввод даты
  2165.      strDate = InputBox("Вводим дату")
  2166.       If strDate = "" Then Exit Sub
  2167.       ' Ввод выручки
  2168.      strSum = InputBox("Вводим выручку")
  2169.       If strSum = "" Then Exit Sub
  2170.       ' Запись данных в ячейки
  2171.      Cells(lngRow, 1) = strDate
  2172.       Cells(lngRow, 2) = strSum
  2173.    Loop
  2174. End Sub
  2175. Ввод текстоввых данных в ячейки
  2176. Sub insеrtCustomText()
  2177.    ' Заполнение текущей ячейки
  2178.   ActiveCell = "Генеральный директор"
  2179.    Selection.Font.Bold = True
  2180.    ' Фамилия на три столбца правее должности
  2181.   Cells(ActiveCell.Row, ActiveCell.Column + 3).Select
  2182.    ActiveCell.FormulaR1C1 = "А. Б. Рублев"
  2183.    Selection.Font.Bold = True
  2184.  
  2185.    ' Ячейка с "Главный бухгалтер" на три столбца левее _
  2186.     и на три строки ниже ячейки с фамилией директора
  2187.   Cells(ActiveCell.Row + 3, ActiveCell.Column - 3).Select
  2188.    ActiveCell = "Главный бухгалтер"
  2189.    Selection.Font.Bold = True
  2190.    ' Фамилия на три столбца правее должности
  2191.   Cells(ActiveCell.Row, ActiveCell.Column + 3).Select
  2192.    ActiveCell = "Т. С. Копейкин"
  2193.    Selection.Font.Bold = True
  2194. End Sub
  2195.  
  2196. Вывод в ячейки названия книги, листа и количества листов
  2197. Sub Test()
  2198.  Dim book As String
  2199.  Dim sheet As String
  2200.  Dim addr As String
  2201.  addr = "C"
  2202.  book = Application.ActiveWorkbook.Name
  2203.  sheet = Application.ActiveSheet.Name
  2204.  Workbooks(book).Activate
  2205.  Worksheets(sheet).Activate
  2206.  Range("A1") = book
  2207.  Range("B1") = sheet
  2208.  Dim xList As Integer
  2209.  xList = Application.Sheets.Count
  2210.  For x = 1 To xList
  2211.    Dim s As String
  2212.    s = addr + LTrim(Str(x))
  2213.    Range(s) = x
  2214.  Next x
  2215. End Sub
  2216. Удаление пустых строк_1
  2217. Selection.SpecialCells(xlCellTypeBlanks).Select
  2218. Selection.Delete Shift:=xlUp
  2219. Удаление пустых строк_2
  2220. Sub DeleteEmptyStrings()
  2221.    Dim intLastRow As Integer  ' Номер последней используемой строки
  2222.   Dim intRow As Integer      ' Номер проверяемой строки
  2223.  
  2224.    ' Получение номера последней используемой строки
  2225.   intLastRow = Worksheets(ActiveSheet.Index).UsedRange.Row + _
  2226.     Worksheets(ActiveSheet.Index).UsedRange.Rows.Count - 1
  2227.    ' Счетчик устанавливается на используемую первую строку
  2228.   intRow = Worksheets(ActiveSheet.Index).UsedRange.Row
  2229.    ' Удаление пустых строк
  2230.   Do While intRow <= intLastRow
  2231.       If ActiveSheet.Rows(intRow).Text = "" Then
  2232.          ' Удаление строки
  2233.         ActiveSheet.Rows(intRow).Delete
  2234.          ' Данные сдвинулись вверх, поэтому номер последней _
  2235.           строки уменьшился, а текущей - не изменился
  2236.         intLastRow = intLastRow - 1
  2237.       Else
  2238.          ' Текущая строка заполнена - переходим к следующей
  2239.         intRow = intRow + 1
  2240.       End If
  2241.    Loop
  2242. End Sub
  2243. Удаление пустых строк_3
  2244. Sub DeleteEmptyStrings1()
  2245.    Dim intRow As Integer
  2246.    Dim intLastRow As Integer
  2247.  
  2248.    ' Получение номера последней используемой строки
  2249.   intLastRow = ActiveSheet.UsedRange.Row + _
  2250.     ActiveSheet.UsedRange.Rows.Count - 1
  2251.  
  2252.    ' Удаление пустых строк
  2253.   For intRow = intLastRow To 1 Step -1
  2254.       If ActiveSheet.Rows(intRow).Text = "" Then
  2255.          ActiveSheet.Rows(intRow).Delete
  2256.       End If
  2257.    Next intRow
  2258. End Sub
  2259. Удаление строки по условию
  2260. Sub Макрос1()
  2261. Dim iRange As Range
  2262. Dim TextToFindArray As Variant
  2263. Dim i As ****
  2264.  
  2265. TextToFindArray = Array("Toyota", "ВАЗ")
  2266. With Application
  2267. .ScreenUpdating = False
  2268. .Calculation = xlCalculationManual
  2269. For i = 0 To 1
  2270. With ActiveSheet.Cells
  2271. Set iRange = .Find(What:=TextToFindArray(i), LookIn:=xlFormulas, LookAt:=xlPart)
  2272. If Not iRange Is Nothing Then
  2273. Do
  2274. iRange.EntireRow.Delete
  2275. Set iRange = .Find(What:=TextToFindArray(i), LookIn:=xlFormulas, LookAt:=xlPart)
  2276. Loop While Not iRange Is Nothing
  2277. End If
  2278. End With
  2279. Next i
  2280. .Calculation = xlCalculationAutomatic
  2281. .ScreenUpdating = True
  2282. End With
  2283. MsgBox "Строки с текстом " & TextToFindArray(0) & " и " & TextToFindArray(1) & " удалены!", 64, "Конец"
  2284. End Sub
  2285. Удаление скрытых строк
  2286. Sub KillHiddenRows()
  2287. For Each x In ActiveSheet.Rows
  2288. If x.Hidden Then x.Delete
  2289. Next
  2290. End Sub
  2291.  
  2292. Удаление используемых скрытых строк или строк с нулевой высотой
  2293.  
  2294. Sub KillUsedHiddenThinRows()
  2295. Dim x
  2296. For Each x In ActiveSheet.UsedRange.Rows
  2297. If x.Hidden Or x.Height = 0 Then x.EntireRow.Delete
  2298. Next
  2299. End Sub
  2300.  
  2301. Удаление дубликатов по маске
  2302.  
  2303. Function Two2One(Text As String) As String
  2304. Dim Polki, i As Byte, tmp As String
  2305. Application.Volatile
  2306. Polki = Split(Text, "@")
  2307. For i = 1 To UBound(Polki)
  2308. If InStr(1, Polki(i), ":") > 0 Then
  2309. If Polki(i) <> Polki(i - 1) Then tmp = tmp & "@" & Polki(i)
  2310. Else: tmp = tmp & "@" & Polki(i)
  2311. End If
  2312. Next
  2313. Two2One = Polki(0) & tmp
  2314. End Function
  2315. Выделение диапазона над текущей ячейкой
  2316. Sub SelectCellRange()
  2317.    Dim strSelTop As String, strSelBottom As String
  2318.    ' Получение адресов нижней и верхней ячеек диапазона для выделения
  2319.   strSelBottom = ActiveCell.Address
  2320.    strSelTop = Cells(1, ActiveCell.Column).Address
  2321.    ' Выделяем все ячейки выше текущей (вместе с текущей ячейкой)
  2322.   Range(strSelTop & ":" & strSelBottom).Select
  2323. End Sub
  2324. Выделение диапазона над текущей ячейкой_2
  2325. Sub SelectColumnData()
  2326. ' что делать при ошибке
  2327. On Error GoTo errors
  2328. ' нижний адрес
  2329. Dim a1 As String
  2330. ' верхний адрес
  2331. Dim a2 As String
  2332. ' диапазое
  2333. Dim ran As Range
  2334. ' если не верхнея ячейка
  2335. If (ActiveCell.Row <> 1) Then
  2336. ' пойти вверх
  2337. ActiveCell.offset(-1, 0).Select
  2338. ' взять адрес ячейки
  2339. a1 = ActiveCell.Address
  2340. ' будем подниматься
  2341. For x = 1 To (ActiveCell.Row - 1)
  2342. ' на одну вверх
  2343. ActiveCell.offset(-1, 0).Select
  2344. ' если не число выход
  2345. If IsNumeric(ActiveCell.Value) <> True Then
  2346. ' на одну вниз
  2347. ActiveCell.offset(1, 0).Select
  2348. ' выход
  2349. GoTo nexts
  2350. End If
  2351. ' если пустая
  2352. If IsEmpty(ActiveCell.Value) = True Then
  2353. ' на одну вниз
  2354. ActiveCell.offset(1, 0).Select
  2355. ' выход
  2356. GoTo nexts
  2357. End If
  2358. Next x
  2359. nexts:
  2360. ' получаем адрес вырехней
  2361. a2 = ActiveCell.Address
  2362. ' строим диапазон
  2363. Set ran = Range(a1 + ":" + a2)
  2364. ' выбеляем
  2365. ran.Select
  2366. End If
  2367. ' выходим из процедуры
  2368. Exit Sub
  2369. ' ошибка зовем на помощь
  2370. errors:
  2371. MsgBox "Ошибка сообщите разработчику"
  2372. End Sub
  2373. Выделить ячейку и поместить туда число
  2374. Sub Test()
  2375.  With Application.Workbooks.Item("Test.xls")
  2376.  Worksheets("Лист2").Activate
  2377.  Range("A2") = 2
  2378.  Range("A3") = 3
  2379.  End With
  2380. End Sub
  2381. Выделение отрицательных значений
  2382. Sub NegSelect()
  2383.    Dim cell As Range
  2384.    ' Просмотр всех ячеек выделенного диапазона и пометка тех, _
  2385.     которые содержат отрицательные значения
  2386.   For Each cell In Selection
  2387.       If cell.Value < 0 Then
  2388.          cell.Interior.Color = RGB(255, 0, 0)
  2389.       Else
  2390.          cell.Interior.ColorIndex = xlNone
  2391.       End If
  2392.    Next cell
  2393. End Sub
  2394.  
  2395. Выделение диапазона и использование абсолютных адресов
  2396. Sub Test()
  2397.  With Application.Workbooks.Item("Test.xls")
  2398.   Worksheets("Лист2").Activate
  2399.   Dim HelloRange As Range
  2400.   Set HelloRange = Range("D3:D10") ‘можно через запятую выделять несколько интервалов или яче
  2401.   HelloRange.Range("A1") = 3
  2402.  End With
  2403. End Sub
  2404. Выделение ячеек через интервал_1
  2405. Sub IntervalCellSelect()
  2406.    Dim intFirstRow As Integer  ' Первая строка для выделения
  2407.   Dim intLastRow As Integer   ' Последняя строка для выделения
  2408.   Dim rgCells As Range        ' Объединение выделяемых ячеек
  2409.   Dim intRow As Integer
  2410.  
  2411.    intFirstRow = 3
  2412.    intLastRow = 300
  2413.  
  2414.    ' Формирование объединения ячеек в столбце "B" от строки _
  2415.     intFirstRow до строки intLastRow с шагом 3
  2416.   For intRow = intFirstRow To intLastRow Step 3
  2417.       If rgCells Is Nothing Then
  2418.          ' Первая ячейка в объединении
  2419.         Set rgCells = Cells(intRow, 1)
  2420.       Else
  2421.          ' Добавление очередной ячейки в объединение
  2422.         Set rgCells = Union(rgCells, Cells(intRow, 1))
  2423.       End If
  2424.    Next
  2425.    ' Выделение всех ячеек в объединении
  2426.   rgCells.Select
  2427. End Sub
  2428. Выделение ячеек через интервал_2
  2429. Sub IntervalCellSelect()
  2430.    Dim intFirstRow As Integer  ' Первая строка для выделения
  2431.   Dim intLastRow As Integer   ' Последняя строка для выделения
  2432.   Dim rgCells As Range        ' Объединение выделяемых ячеек
  2433.   Dim cell As Range           ' Текущая ячейка
  2434.   Dim intRow As Integer
  2435.  
  2436.    intFirstRow = 3
  2437.    intLastRow = 300
  2438.    ' Формирование объединения ячеек в столбце "B" от строки _
  2439.     intFirstRow до строки intLastRow с шагом 3
  2440.   For intRow = intFirstRow To intLastRow Step 3
  2441.       Set cell = Cells(intRow, 1)
  2442.       Set rgCells = Union(cell, _
  2443.       IIf(intRow = intFirstRow, cell, rgCells))
  2444.    Next
  2445.    ' Выделение всех ячеек в объединении
  2446.   rgCells.Select
  2447. End Sub
  2448. Выделение нескольких диапазонов
  2449. Sub SelectRange()
  2450.    Range("D3:D10, A3:A10 , F3").Select
  2451. End Sub
  2452.  
  2453. Движение по ячейкам
  2454. переменная.Offset(RowOffset, ColumnOffset)
  2455. В качестве переменных может выступать как ячейка так и диапазон (Range) удобно пользоваться этой функцией для смещения относительно текущей ячейки.
  2456. Например, смещение ввниз на одну ячейку и выделение ее:
  2457. ActiveCell.offset(1, 0).Select
  2458. Если нужно двигаться вверх, то нужно использовать отрицательное число:
  2459. ActiveCell.offset(-1, 0).Select
  2460. Функция ниже использует эту возможность для того, чтобы пробежаться вниз до первой пустой ячейки.
  2461. Sub beg()
  2462.     Dim a As Boolean
  2463.     Dim d As Double
  2464.     Dim c As Range
  2465.     a = True
  2466.     Set c = Range(ActiveCell.Address)
  2467.     c.Select
  2468.     d = c.Value
  2469.     c.Value = d
  2470.     While (a = True)
  2471.         ActiveCell.offset(1, 0).Select
  2472.         If (IsEmpty(ActiveCell.Value) = False) Then
  2473.             Set c = Range(ActiveCell.Address)
  2474.             c.Select
  2475.             d = c.Value
  2476.             c.Value = d
  2477.         Else
  2478.             a = False
  2479.         End If
  2480.     Wend
  2481. End Sub
  2482.  
  2483. Поиск ближайшей пустой ячейки столбца
  2484. Sub FindEmptyCell()
  2485.    ' Поиск ближайшей пустой ячейки в текущем столбце
  2486.   Do While Not IsEmpty(ActiveCell.Value)
  2487.       ActiveCell.offset(1, 0).Select
  2488.    Loop
  2489. End Sub
  2490. Поиск максимального значения
  2491. Sub FindMaxValue()
  2492.    On Error GoTo NoCell
  2493.    If Selection.Count > 1 Then
  2494.       ' Поиск максимального значения в выделенных ячейках
  2495.      Selection.Find(Application.Max(Selection)).Select
  2496.    Else
  2497.       ' Поиск максимального значения во всех ячейках листа
  2498.      ActiveSheet.Cells.Find(Application.Max(ActiveSheet.Cells)).Select
  2499.    End If
  2500.    Exit Sub
  2501. NoCell:
  2502.    MsgBox "Максимальное значение не найдено"
  2503. End Sub
  2504. Поиск и замена по шаблону
  2505. Sub ReplaceCellsData()
  2506.    Dim cell As Range
  2507.    ' Просмотр всех ячеек диапазона G1:K20 и замена искомого текста
  2508.   For Each cell In [G1:K20]
  2509.       If cell.Value Like "*Доход*" Then
  2510.          cell.Value = "Выручка"
  2511.          cell.Interior.Color = RGB(255, 255, 0)
  2512.       Else
  2513.          cell.Interior.Color = RGB(255, 255, 255)
  2514.       End If
  2515.    Next
  2516. End Sub
  2517. Поиск значения с отображением результата в отдельном окне
  2518. Sub Search()
  2519.    Dim rgResult As Range
  2520.    ' Поиск заданного значения в диапазоне B1:B20 и вывод результата
  2521.   Set rgResult = Range("B1:B20").Find(9999, , xlValues)
  2522.    If rgResult Is Nothing Then
  2523.       MsgBox "Поиск не дал результатов"
  2524.    Else
  2525.       MsgBox rgResult.Address
  2526.    End If
  2527. End Sub
  2528. Поиск с выделением найденных данных_1
  2529. Sub FindAndSelect()
  2530.    Dim strStartAddr As String ' Хранит координаты первого найденного _
  2531.                                значения
  2532.   Dim rgResult As Range
  2533.  
  2534.    ' Поиск первого входжения искомого слова
  2535.   Set rgResult = Range("B1:B10").Find("Прибыль", , xlValues)
  2536.    If Not rgResult Is Nothing Then
  2537.       ' Сохраним адрес найденной ячейки (чтобы контролировать _
  2538.        зацикливание поиска)
  2539.      strStartAddr = rgResult.Address
  2540.    End If
  2541.    Do While Not rgResult Is Nothing
  2542.       ' Обработка результата поиска
  2543.      rgResult.Interior.Color = RGB(255, 255, 0)
  2544.  
  2545.       ' Новый поиск
  2546.      Set rgResult = Range("B1:B10").FindNext(rgResult)
  2547.       If rgResult.Address = strStartAddr Then
  2548.          ' Поиск завершен
  2549.         Exit Do
  2550.       End If
  2551.    Loop
  2552. End Sub
  2553. Поиск с выделением найденных данных_2
  2554. Sub CustomSearch()
  2555.    Dim strFindData As String
  2556.    Dim rgFound As Range
  2557.    Dim i As Integer
  2558.  
  2559.    ' Ввод строки для поиска
  2560.   strFindData = InputBox("Введите данные для поиска")
  2561.    ' Просмотр всех рабочих листов книги
  2562.   For i = 1 To Worksheets.Count
  2563.       With Worksheets(i).Cells
  2564.          ' Поиск на i-м листе
  2565.         Set rgFound = .Find(strFindData, LookIn:=xlValues)
  2566.          If Not rgFound Is Nothing Then
  2567.             ' Ячейка с заданным значением найдена - выделим ее
  2568.            Sheets(i).Select
  2569.             rgFound.Select
  2570.             Exit Sub
  2571.          End If
  2572.       End With
  2573.    Next
  2574.    ' Поиск завершен. Ячейка не найдена
  2575.   MsgBox ("Поиск не дал результатов")
  2576. End Sub
  2577.  
  2578. Поиск по условию в диапазоне
  2579. Option Explicit
  2580.  
  2581. Sub Поиск()
  2582. Dim iFoundRng As Range
  2583. Dim AutoNum As String
  2584. Dim firstAddress As String
  2585. Dim LastFoundRng As String
  2586.  
  2587.     AutoNum = Range("E5")
  2588.     If AutoNum = "" Then
  2589.         MsgBox "Вы не указали номер авто в ячейке Е5!", 48, "Ошибка"
  2590.         Exit Sub
  2591.     End If
  2592.     On Error Resume Next
  2593.     LastFoundRng = ActiveWorkbook.Names("LastFoundRngName").RefersToRange.Address
  2594.     If LastFoundRng = "" Then LastFoundRng = "$C$1"
  2595.     With Columns("C")
  2596.         Set iFoundRng = .Find(What:=AutoNum, After:=Range(LastFoundRng), LookIn:=xlFormulas, LookAt:=xlWhole)
  2597.         If iFoundRng Is Nothing Then
  2598.             MsgBox "Авто с номером " & AutoNum & " не найдено в столбце С!", "48", "Ошибка"
  2599.             Exit Sub
  2600.         End If
  2601.         ActiveWorkbook.Names.Add Name:="LastFoundRngName", RefersTo:="=" & ActiveSheet.Name & "!" & iFoundRng.Address, Visible:=False
  2602.     End With
  2603.     [E7] = iFoundRng.offset(0, 1)
  2604.     [F7] = iFoundRng.offset(0, 2)
  2605. End Sub
  2606. Поиск последней непустой ячейки диапазона
  2607. Function dhLastUsedCell(rgRange As Range) As ****
  2608.    Dim lngCell As ****
  2609.  
  2610.    ' Пойдем по диапазону с конца (тогда первая попавшаяся _
  2611.     заполненная ячейка и будет искомой)
  2612.   For lngCell = rgRange.Count To 1 Step -1
  2613.       If Not IsEmpty(rgRange(lngCell)) Then
  2614.          ' Нашли непустую ячейку
  2615.         dhLastUsedCell = lngCell
  2616.          Exit Function
  2617.       End If
  2618.    Next lngCell
  2619.    ' Непустую ячейку не нашли
  2620.   dhLastUsedCell = 0
  2621. End Function
  2622. Поиск последней непустой ячейки столбца
  2623. Function dhLastColUsedCell(rgColumn As Range) As Variant
  2624.    ' Вывод значения последней непустой ячейки столбца
  2625.   dhLastColUsedCell = rgColumn.Parent.Cells(Rows.Count, _
  2626.     rgColumn.Column).End(xlUp).Value
  2627. End Function
  2628. Поиск последней непустой ячейки строки
  2629. Function dhLastRowUsedCell(rgRow As Range) As Variant
  2630.    ' Вывод значения последней непустой ячейки строки
  2631.   dhLastRowUsedCell = rgRow.Parent.Cells(rgRow.Row, 256). _
  2632.     End(xlToLeft).Address
  2633. End Function
  2634.  
  2635. Поиск ячейки синего цвета в диапазоне
  2636. Sub Макрос1()
  2637. Dim myRange As Range 'диапазон для поиска
  2638. Dim FoundRng As Range 'найденная ячейка
  2639. Dim iRow As ****
  2640. Dim iColumn As ****
  2641.  
  2642. Set myRange = Range("B1:B100")
  2643. Application.FindFormat.Interior.ColorIndex = 5 'будем искать синий цвет
  2644. Set FoundRng = myRange.Find(What:="", SearchFormat:=True)
  2645. If Not FoundRng Is Nothing Then
  2646. iRow = FoundRng.Row
  2647. iColumn = FoundRng.Column
  2648. MsgBox "Ячейка найдена по адресу: " & Chr(13) & "Ряд: " & iRow & Chr(13) & "Столбец: " & iColumn, vbInformation, ""
  2649. Else
  2650. MsgBox "Ячейка не найдена!", vbExclamation, ""
  2651. End If
  2652. End Sub
  2653. Поиск отрицательного значения в диапазоне и выделения синим цветом
  2654.  
  2655. Поиск наличия значения в столбце
  2656. Sub Макрос1()
  2657. Dim iCell As Range
  2658. Set iCell = Columns(1).Find(What:="*", LookIn:=xlFormulas, SearchDirection:=xlPrevious)
  2659. If Not iCell Is Nothing Then
  2660. MsgBox "Номер последней заполненной строки в столбце A: " & iCell.Row, , ""
  2661. Else
  2662. MsgBox "Столбец ""A"" не содержит данных", vbExclamation, ""
  2663. End If
  2664. End Sub
  2665. Поиск совпадений в диапазоне
  2666. Option Explicit
  2667.  
  2668. Sub compare_areas()
  2669. Dim r As Range, ar As Range, nm As String, col As Range
  2670. Set r = Selection
  2671. If r.Count < 2 Then Exit Sub
  2672. 'Dim r_prog As Integer
  2673. 'r_prog = prog
  2674. 'prog = 1
  2675. Application.ScreenUpdating = False
  2676. nm = ActiveSheet.Name
  2677. Sheets.Add
  2678. For Each ar In r.Areas
  2679.    For Each col In ar.Columns
  2680.       col.Copy
  2681.       ActiveSheet.Paste
  2682.       ActiveCell.SpecialCells(xlLastCell).offset(1, 0).Select
  2683.    Next
  2684. Next
  2685. Range(Cells(1, 1), Cells(r.Cells.Count, 2)).Select
  2686. Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
  2687.     OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  2688.     DataOption1:=xlSortTextAsNumbers
  2689. Rows("1:1").Select
  2690. Selection.insеrt Shift:=xlDown
  2691. Cells(2, 2).FormulaR1C1 = "=IF((RC[-1]=R[-1]C[-1])+(RC[-1]=R[1]C[-1]),1,0)"
  2692. Range("b2").Select
  2693. Selection.AutoFill Destination:=Range(Cells(2, 2), Cells(r.Cells.Count + 1, 2)), Type:=xlFillDefault
  2694. Range(Cells(2, 2), Cells(r.Cells.Count + 1, 2)).Copy
  2695. Cells(2, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  2696.     :=False, Transpose:=False
  2697. Application.CutCopyMode = False
  2698. For Each ar In r.Cells
  2699.     If ar.Value <> Empty Then
  2700.         If WorksheetFunction.VLookup(ar.Value, Range(Cells(2, 1), Cells(r.Count + 1, 2)), 2, 0) Then
  2701.             ar.Interior.ColorIndex = 3
  2702.         End If
  2703.     End If
  2704. Next
  2705. Application.DisplayAlerts = False
  2706. ActiveSheet.Delete
  2707. Sheets(nm).Select
  2708. ActiveCell.Select
  2709. Application.DisplayAlerts = True
  2710. Application.ScreenUpdating = True
  2711. 'prog = r_prog
  2712. End Sub
  2713. Sub uncolor()
  2714.     Selection.Interior.ColorIndex = xlNone
  2715. End Sub
  2716. Поиск ячейки в диапазоне_1
  2717. Dim r As Range
  2718. Dim foundCell As Range
  2719.  
  2720. Set r = ActiveSheet.Range("A1:A6")
  2721. Set foundCell = r.Find("Ichiro", LookIn:=xlValues)
  2722. If Not foundCell Is Nothing Then
  2723.     foundCell.Select
  2724. Else
  2725.     MsgBox "String not found."
  2726. End If
  2727. Поиск  ячейки в диапазоне_2
  2728. Sub findtekst()
  2729. Dim c As Range
  2730. Set c = Range("c3:c98").Find("*ГКИ*", , , xlWhole)
  2731. If Not c Is Nothing Then c.Select
  2732. MsgBox (c)
  2733. End Sub
  2734. Также для финда по xlWhole вариации:
  2735. "*a" - заканчивается на a
  2736. "?a*" - 2-я буква a
  2737. "??a*" - 3-я буква а
  2738. "a?" - начинается на a и содержит ещё 1 любую букву
  2739. "a?*" - 2+ буквы минимум и начинается на a (например a1, a10, a12, a55, a55dd56 всё посчитается)
  2740. "*слово*" - находит слова содержащие "слово" в любой части строки (включая начало и конец)
  2741. "слово*" - находит ячейки начинающиеся со "слово" или просто ячейку "слово" без дополнительных букв
  2742. Поиск приближенного значения в диапазоне
  2743.  
  2744. Sub wwe()
  2745.  
  2746. Dim foundCell As Range
  2747.  
  2748.     ActiveWorkbook.Names.Add Name:="ev", RefersToR1C1:= _
  2749.         "=INDEX(Лист1!R11C2:R34C2,MATCH(MIN(ABS(Лист1!R36C2:R234C2-Лист1!R28C1)),ABS(Лист1!R36C2:R234C2-Лист1!R28C1),0))"
  2750.  
  2751. Set foundCell = [ev]
  2752. Names("ev").Delete
  2753. If Not foundCell Is Nothing Then
  2754. foundCell.Select
  2755. Else
  2756. MsgBox "String not found."
  2757. End If
  2758.  
  2759. End Sub
  2760.  
  2761. Поиск начала и окончания диапазона, содержащего данные
  2762. Sub FindSheetData()
  2763.    ' Выводим диапазон используемых ячеек листа
  2764.   MsgBox ActiveSheet.UsedRange.Address
  2765. End Sub
  2766. Поиск начала данных
  2767. Sub FindStartOfData()
  2768.    With ActiveSheet
  2769.       ' Заносим текст в ячейку, являющуюся левой верхней _
  2770.        ячейкой используемого диапазона
  2771.      .Cells(.UsedRange.Row, .UsedRange.Column).Value = _
  2772.        "Начало данных"
  2773.    End With
  2774. End Sub
  2775.  
  2776.  
  2777. Автоматическая замена значений
  2778. Sub ReplaceValues()
  2779.    Dim cell As Range
  2780.    ' Проверка каждой ячейки диапазона на возможность замены _
  2781.     значения в ней (отрицательные значения заменяются на -1, _
  2782.     положительные - на 1)
  2783.   For Each cell In Range("C1:C3").Cells
  2784.       If cell.Value < 0 Then
  2785.          cell.Value = -1
  2786.       ElseIf cell.Value > 0 Then
  2787.          cell.Value = 1
  2788.       End If
  2789.    Next
  2790. End Sub
  2791. Быстрое заполнение диапазона (массив)
  2792. Sub FillCells()
  2793.    Dim intStartVal As Integer   ' Начальное значение
  2794.   Dim intStep As Integer       ' Шаг при изменении значения
  2795.   Dim intEndVal As Integer     ' Конечное значение
  2796.   Dim intVal As Integer        ' Текущее значение
  2797.   Dim intCellOffset As Integer ' Смещение от начальной ячейки
  2798.  
  2799.    ' Установка параметров заполнения
  2800.   intStartVal = 1
  2801.    intStep = 1
  2802.    intEndVal = 100
  2803.  
  2804.    ' Заполнение ячеек текущего столбца значениями от 1 до 100
  2805.   For intVal = intStartVal To intEndVal Step intStep
  2806.       ActiveCell.offset(intCellOffset, 0).Value = intVal
  2807.       intCellOffset = intCellOffset + 1
  2808.    Next intVal
  2809. End Sub
  2810. Заполнение через интервал(массив)
  2811. Sub FillCells()
  2812.    Dim intStartVal As Integer   ' Начальное значение
  2813.   Dim intStep As Integer       ' Шаг при изменении значения
  2814.   Dim intEndVal As Integer     ' Конечное значение
  2815.   Dim intVal As Integer        ' Текущее значение
  2816.   Dim intCellOffset As Integer ' Смещение от начальной ячейки
  2817.   Dim intCellStep As Integer   ' Шаг при перемещении между _
  2818.                                  заполняемыми ячейками
  2819.  
  2820.    ' Установка параметров заполнения
  2821.   intStartVal = 3
  2822.    intStep = 3
  2823.    intEndVal = 30
  2824.    intCellStep = 3
  2825.  
  2826.    ' Заполнение ячеек текущего столбца значениями от 3 до 30
  2827.   For intVal = intStartVal To intEndVal Step intStep
  2828.       ActiveCell.offset(intCellOffset, 0).Value = intVal
  2829.       intCellOffset = intCellOffset + intCellStep
  2830.    Next intVal
  2831. End Sub
  2832. Заполнение указанного диапазона(массив)
  2833. Sub FillCellRect()
  2834.    Dim lngRows As ****, intCols As Integer ' Количество ячеек по _
  2835.                                             горизонтали и вертикали
  2836.   Dim lngRow As ****, intCol As Integer   ' Координаты текущей ячейки
  2837.   Dim lngStep As ****, lngVal As ****
  2838.  
  2839.    ' Установка начального значения и шага заполнения
  2840.   lngVal = 1
  2841.    lngStep = 1
  2842.  
  2843.    ' Ввод количества ячеек по горизонтали и вертикали, которое _
  2844.     необходимо заполнить
  2845.   lngRows = Val(InputBox("Количество ячеек в высоту"))
  2846.    intCols = Val(InputBox("Количество ячеек в ширину"))
  2847.  
  2848.    ' Отключение обновления экрана
  2849.   Application.ScreenUpdating = False
  2850.  
  2851.    ' Заполнение ячеек значениями
  2852.   For lngRow = 1 To lngRows
  2853.       For intCol = 1 To intCols
  2854.          ActiveCell.offset(lngRow, intCol).Value = lngVal
  2855.          lngVal = lngVal + lngStep
  2856.       Next intCol
  2857.    Next lngRow
  2858.  
  2859.    ' Включение обновления экрана
  2860.   Application.ScreenUpdating = True
  2861. End Sub
  2862. Заполнение диапазона(массив)
  2863. Sub FillCellRect1()
  2864.    Dim lngRows As ****, intCols As Integer
  2865.    Dim lngRow As ****, intCol As Integer
  2866.    Dim lngStep As ****, lngVal As ****
  2867.    Dim alngValues() As ****
  2868.    Dim rgRange As Range
  2869.  
  2870.    ' Установка начального значения и шага заполнения
  2871.   lngVal = 1
  2872.    lngStep = 1
  2873.  
  2874.    ' Ввод количества ячеек по горизонтали и вертикали, которое _
  2875.     необходимо заполнить
  2876.   lngRows = Val(InputBox("Количество ячеек в высоту"))
  2877.    intCols = Val(InputBox("Количество ячеек в ширину"))
  2878.  
  2879.    ReDim alngValues(1 To lngRows, 1 To intCols)
  2880.    Set rgRange = ActiveCell.Range(Cells(1, 1), _
  2881.     Cells(lngRows, intCols))
  2882.  
  2883.    ' Заполнение массива alngValues значениями
  2884.   For lngRow = 1 To lngRows
  2885.       For intCol = 1 To intCols
  2886.          alngValues(lngRow, intCol) = lngVal
  2887.          lngVal = lngVal + lngStep
  2888.       Next intCol
  2889.    Next lngRow
  2890.    ' Перенос значений из массива в таблицу
  2891.   rgRange.Value = alngValues
  2892. End Sub
  2893. Расчет суммы первых значений диапазона
  2894. Листинг 2.65. Функция dhNSum
  2895. Function dhNSum(ByVal intCount As Integer, _
  2896.  rgValues As Range) As Double
  2897.    Dim i As Integer
  2898.    Dim dblSum As Double
  2899.  
  2900.    If intCount > rgValues.Count Then
  2901.       ' Задано количество элементов большее, чем есть _
  2902.        в переданном диапазоне
  2903.      intCount = rgValues.Count
  2904.    End If
  2905.    ' Расчет суммы первых intCount элементов
  2906.   For i = 1 To intCount
  2907.       dblSum = dblSum + rgValues(i)
  2908.    Next i
  2909.    ' Возврат результата
  2910.   dhNSum = dblSum
  2911. End Function
  2912.  
  2913. Размещение в ячейке электронных часов
  2914. Sub updаtеTime()
  2915.    Dim varNextCall As Variant
  2916.    ' Записываем в ячейку текущее время
  2917.   Cells(1, 1).Value = Now
  2918.    ' Записываем в varNextCall время, когда вызвать этот макрос _
  2919.     в следующий раз (через 1 секунду)
  2920.   varNextCall = TimeSerial(Hour(Now), Minute(Now), Second(Now) + 1)
  2921.    ' Уведомляем Excel в необходимости вызова макроса
  2922.   Application.OnTime varNextCall, "updаtеTime"
  2923. End Sub
  2924.  «Будильник»
  2925. Sub Clock()
  2926.    ' Уведомляем Excel, что процедуру Alarm нужно вызвать в 20:55
  2927.   Application.OnTime TimeValue("20:55:00"), "Alarm"
  2928. End Sub
  2929. Sub Alarm()
  2930.    MsgBox "Пора ужинать!!!"
  2931. End Sub
  2932. Оформление верхней и нижней границ диапазона
  2933. Sub RangeBorder()
  2934.    Dim rgRange As Range
  2935.    Set rgRange = Range("B2:D5")
  2936.  
  2937.    ' Оформление верхней границы диапазона
  2938.   With rgRange.Borders(xlEdgeTop)
  2939.       .Weight = xlThick
  2940.       .LineStyle = xlContinuous
  2941.       .Color = RGB(0, 0, 255)
  2942.    End With
  2943.    ' Оформление нижней границы диапазона
  2944.   With rgRange.Borders(xlEdgeBottom)
  2945.       .Weight = xlMedium
  2946.       .LineStyle = xlDash
  2947.       .Color = RGB(255, 0, 255)
  2948.    End With
  2949. End Sub
  2950. Адрес активной ячейки
  2951. Sub Worksheet_Selectiоnchange(ByVal Target As Range)
  2952.    ' Вывод адреса ячейки в различных форматах
  2953.   MsgBox Target.Address() & vbCr & _
  2954.     Target.Address(rowabsolute:=False) & vbCr & _
  2955.     Target.Address(ReferenceStyle:=xlR1C1) & vbCr & _
  2956.     Target.Address(ReferenceStyle:=xlR1C1, _
  2957.      rowabsolute:=False, columnabsolute:=False, _
  2958.      RelativeTo:=Worksheets(1).Cells(2, 2))
  2959. End Sub
  2960. Координаты активной ячейки
  2961. ActiveCell.Row и ActiveCell.Column - покажут координаты активной ячейки.
  2962. Формула активной ячейки
  2963. s = Range("A3").Formula
  2964. Получение из ячейки формулы
  2965. Sub Test()
  2966.  With Application.Workbooks.Item("Test.xls")
  2967.   Worksheets("Лист2").Activate
  2968.   Range("A2") = 2
  2969.   Range("A3") = "=A2+2"
  2970.   MsgBox Range("A3").Formula + "  - " + Str(Range("A3").Value)
  2971.  End With
  2972. End Sub
  2973. Тип данных ячейки
  2974. Function dhCellType(rgRange As Range) As String
  2975.    ' Переходим к левой верхней ячейке, если rgRange - диапазон, _
  2976.     а не одна ячейка
  2977.   Set rgRange = rgRange.Range("A1")
  2978.    ' Определение типа значения в ячейке
  2979.   Select Case True
  2980.       Case IsEmpty(rgRange)
  2981.          ' Ячейка пуста
  2982.         dhCellType = "Пусто"
  2983.       Case Application.IsText(rgRange)
  2984.          ' В ячейке текст
  2985.         dhCellType = "Текст"
  2986.       Case Application.IsLogical(rgRange)
  2987.          ' В ячейке логическое значение (True или False)
  2988.         dhCellType = "Булево выражение"
  2989.       Case Application.IsErr(rgRange)
  2990.          ' При вычислении значения в ячейке произошла ошибка
  2991.         dhCellType = "Ошибка"
  2992.       Case IsDate(rgRange)
  2993.          ' В ячейке дата
  2994.         dhCellType = "Дата"
  2995.       Case InStr(1, rgRange.Text, ":") <> 0
  2996.          ' В ячейке время
  2997.         dhCellType = "Время"
  2998.       Case IsNumeric(rgRange)
  2999.          ' В ячейке числовое значение
  3000.         dhCellType = "Число"
  3001.    End Select
  3002. End Function
  3003.  
  3004. Вывод адреса конца диапазона
  3005. Sub TestRange()
  3006.     Dim r As Range
  3007.     Set r = Range("rrrrr")
  3008.     MsgBox (r.Columns.End(xlUp).Address)
  3009.     MsgBox (r.Columns.End(xlDown).Address)
  3010. End Sub
  3011. Получение информации о выделенном диапазоне
  3012. Sub TypeOfSelection()
  3013.    Dim rgSelUnion As Range         ' Объединение выделенных областей
  3014.   Dim strTitle As String          ' Заголовок сообщения
  3015.   Dim strMessage As String        ' Текст сообщения
  3016.   Dim strSelType As String        ' Тип выделения (простой или _
  3017.                                     множественный)
  3018.   Dim intBlockCount As Integer    ' Количество блоков в выделении
  3019.   Dim intCellCount As ****        ' Общее количество выделенных ячеек
  3020.   Dim intColCount As Integer      ' Количество выделенных столбцов
  3021.   Dim intRowCount As ****         ' Количество выделенных строк
  3022.   Dim intAreasCount As Integer    ' Количество выделенных областей
  3023.   Dim strCurSelType  As String
  3024.    Dim rgArea As Range
  3025.  
  3026.    ' Подсчет количества выделенных областей и определение типа выделения: _
  3027.     простое (одна область) или сложное(несколько областей)
  3028.   intAreasCount = Selection.Areas.Count
  3029.    If intAreasCount = 1 Then
  3030.       strTitle = "Простое выделение"
  3031.    Else
  3032.       strTitle = "Множественное выделение"
  3033.    End If
  3034.  
  3035.    ' Определение типа выделения первой области
  3036.   strSelType = dhGetAreaType(Selection.Areas(1))
  3037.  
  3038.    ' Создание объединения во избежание повторного учета _
  3039.     пересекающихся участков выделенных диапазонов
  3040.   Set rgSelUnion = Selection.Areas(1)
  3041.    For Each rgArea In Selection.Areas
  3042.       strCurSelType = dhGetAreaType(rgArea)
  3043.       ' Изменение надписи о типе всего выделения, если _
  3044.        есть выделения различного типа
  3045.      If strCurSelType <> strSelType Then
  3046.          strSelType = "Множественный"
  3047.       End If
  3048.  
  3049.       ' Определение количества блоков перед их добавлением в объединение
  3050.      If strCurSelType = "Block" Then
  3051.          intBlockCount = intBlockCount + 1
  3052.       End If
  3053.       ' Добавление в объединение
  3054.      Set rgSelUnion = Union(rgSelUnion, rgArea)
  3055.    Next rgArea
  3056.  
  3057.    ' Просматриваются элементы созданного объединения
  3058.   For Each rgArea In rgSelUnion.Areas
  3059.       Select Case dhGetAreaType(rgArea)
  3060.          Case "Строка"
  3061.             intRowCount = intRowCount + rgArea.Rows.Count
  3062.          Case "Столбец"
  3063.             intColCount = intColCount + rgArea.Columns.Count
  3064.          Case "Лист"
  3065.             intColCount = intColCount + rgArea.Columns.Count
  3066.             intRowCount = intRowCount + rgArea.Rows.Count
  3067.       End Select
  3068.    Next rgArea
  3069.    ' Определение количества неперекрывающихся ячеек
  3070.   intCellCount = rgSelUnion.Count
  3071.  
  3072.    ' Формирование и вывод итогового сообщения
  3073.   strMessage = "Тип выделения:" & vbTab & strSelType & vbCrLf & _
  3074.     "Количество областей:      " & vbTab & intAreasCount & vbCrLf & _
  3075.     "Полных столбцов:          " & vbTab & intColCount & vbCrLf & _
  3076.     "Полных строк:             " & vbTab & intRowCount & vbCrLf & _
  3077.     "Блоков ячеек:             " & vbTab & intBlockCount & vbCrLf & _
  3078.     "Всего ячеек:              " & vbTab & Format(intCellCount, "#,###")
  3079.    MsgBox strMessage, vbInformation, strTitle
  3080. End Sub
  3081.  
  3082. Function dhGetAreaType(rgRangeArea As Range) As String
  3083.    ' Определение типа диапазона
  3084.   If rgRangeArea.Count = Cells.Count Then
  3085.       ' Все ячейки рабочего листа
  3086.      dhGetAreaType = "Лист"
  3087.    ElseIf rgRangeArea.Cells.Count = 1 Then
  3088.       ' Одна ячейка
  3089.      dhGetAreaType = "Ячейка"
  3090.    ElseIf rgRangeArea.Rows.Count = Cells.Rows.Count Then
  3091.       ' Весь столбец
  3092.      dhGetAreaType = "Столбец"
  3093.    ElseIf rgRangeArea.Columns.Count = Cells.Columns.Count Then
  3094.       ' Вся строка
  3095.      dhGetAreaType = "Строка"
  3096.    Else
  3097.       ' Блок ячеек
  3098.      dhGetAreaType = "Блок"
  3099.    End If
  3100. End Function
  3101. Взять слово с 13 символа в ячейке
  3102. 'берём значение ячейка А4 из Отчёта
  3103. iMonth = "за период с Июль 2 008 по Июль 2 008 "
  3104. 'берём слово начиная с 13-го символа
  3105. iMonth = Evaluate("MID(TRIM(" & """" & iMonth & """" & "),13,(SEARCH("" "",TRIM(" & """" & iMonth & """" & "),13)-13))")
  3106.  
  3107. 'вставляем это слово в книгу Ведомость
  3108. AddressSht.Range("A1") = iMonth
  3109. Создание изменяемого списка (таблица)
  3110. Sub Макрос2()
  3111. With ActiveSheet
  3112. .ListObjects.Add(xlSrcRange, .Range("$A$8:$AR$" & .Cells(Rows.Count, 1).End(xlUp).Row), , xlYes).Name = _
  3113. "Список1"
  3114. End With
  3115. End Sub
  3116. Проверка на пустое значение
  3117. IsNull(выражение) - проверка на пустое значение
  3118. Пересечение ячеек
  3119. Sub Test()
  3120.   With ActiveWorkbook
  3121.    Worksheets("Лист1").Activate
  3122.    Dim Range1 As Range
  3123.    Set Range1 = Range("A1:A8 A8:D8")
  3124.    Range1.Value = "test"
  3125.   End With
  3126. End Sub
  3127.  
  3128. Умножение выделенного диапазона на 2
  3129.  
  3130. Sub Test()
  3131. Dim cur_range As Range
  3132.  With ActiveSheet
  3133.  Set cur_range = Selection
  3134.  cur_range.Activate
  3135.  
  3136.  For x = 1 To cur_range.Rows.Count
  3137.   For y = 1 To cur_range.Columns.Count
  3138.   ' значению ячейки присвоить значение умноженно на 2
  3139.  cur_range(x, y) = cur_range(x, y).Value * 2
  3140.   Next y
  3141.  Next x
  3142.  
  3143.  End With
  3144. End Sub
  3145. Одновременное умножение всех данных диапазона
  3146. Sub MultAllCells()
  3147.    Dim dblMult As Double
  3148.    Dim cell As Range
  3149.    ' Ввод коэффициента для умножения
  3150.   dblMult = InputBox("Введите коэффициент, на который следует умножать")
  3151.    ' Умножение содержимого на введенный коэффициент
  3152.   For Each cell In Selection
  3153.       If IsNumeric(cell.Value) And cell.Value <> "" Then
  3154.          ' Умножаются только ячейки, содержащие числовые данные
  3155.         cell.Value = cell.Value * dblMult
  3156.       Else
  3157.          MsgBox "В ячейке " & cell.Address & " нечисловое значение"
  3158.       End If
  3159.    Next
  3160. End Sub
  3161.  
  3162. Деление диапазона на 100
  3163. Sub Test23()
  3164. Dim iRange As Range
  3165. Dim kRange As Range
  3166. i = 1
  3167. j = 1
  3168. m = 5
  3169. n = 2
  3170. Set iRange = Range(Cells(i, j), Cells(m, n))
  3171. For Each kRange In iRange
  3172. kRange.Value = kRange.Value / 100
  3173. Next
  3174. End Sub
  3175. Возведение каждой ячейки диапазона в квадрат
  3176.  
  3177. Суммирование данных только видимых ячеек
  3178. Function СуммаВид(Диапазон) As Double
  3179.    ' Просмотр всех ячеек заданного диапазона
  3180.   For Each Ячейка In Диапазон
  3181.       ' Анализ только видимых ячеек
  3182.      If Not Ячейка.EntireRow.Hidden And Not _
  3183.        Ячейка.EntireColumn.Hidden Then
  3184.          ' При расчете учитываются только ячейки _
  3185.           с численными значениями
  3186.         If IsNumeric(Ячейка) = True Then
  3187.             СуммаВид = СуммаВид + Ячейка
  3188.          End If
  3189.       End If
  3190.    Next
  3191. End Function
  3192. Сумма ячеек с числовыми значениями
  3193. Sub CalculateSum()
  3194.    Dim i As Integer
  3195.    Dim intSum As Integer
  3196.    ' Расчет суммы ячеек столбца "A" (с первой по пятую)
  3197.   For i = 1 To 5
  3198.       If IsNumeric(Cells(i, 1)) Then
  3199.          intSum = intSum + Cells(i, 1)
  3200.       End If
  3201.    Next
  3202.    MsgBox "Сумма ячеек: " & intSum
  3203. End Sub
  3204.  
  3205. При суммировании — курсор внутри диапазона
  3206. Function Сумма(Диапазон, АдресЯчейки) As Double
  3207.    ' Просмотр всех ячеек диапазона
  3208.   For Each Ячейка In Диапазон
  3209.       ' Проверка, чтобы в суммировании не участвовала _
  3210.        ячейка с формулой
  3211.      If АдресЯчейки.Address <> Ячейка.Address Then
  3212.          ' В суммировании участвуют только ячейки _
  3213.           с численными значениями
  3214.         If IsNumeric(Ячейка) = True Then
  3215.             Сумма = Сумма + Ячейка
  3216.          End If
  3217.       End If
  3218.    Next
  3219. End Function
  3220. Начисление процентов в зависимости от суммы_1
  3221. Function dhCalculatePercent(lngSum As ****) As Double
  3222.    ' Процентные ставки (декларация констант)
  3223.   Const dblRate1 As Double = 0.09
  3224.    Const dblRate2 As Double = 0.11
  3225.    Const dblRate3 As Double = 0.15
  3226.    ' Граничные суммы вкладов (декларация констант)
  3227.   Const intSum1 As **** = 5000
  3228.    Const intSum2 As **** = 10000
  3229.  
  3230.    ' Возвращаем сумму, умноженную на соответствующую ставку
  3231.   If lngSum < intSum1 Then
  3232.       dhCalculatePercent = lngSum * dblRate1
  3233.    ElseIf lngSum < intSum2 Then
  3234.       dhCalculatePercent = lngSum * dblRate2
  3235.    Else
  3236.       dhCalculatePercent = lngSum * dblRate3
  3237.    End If
  3238. End Function
  3239. Начисление процентов в зависимости от суммы_2
  3240. Function dhCalculatePercent(lngSum As ****) As Double
  3241.    ' Процентные ставки (декларация констант)
  3242.   Const dblRate1 As Double = 0.09
  3243.    Const dblRate2 As Double = 0.11
  3244.    Const dblRate3 As Double = 0.15
  3245.    ' Граничные суммы вкладов (декларация констант)
  3246.   Const intSum1 As **** = 5000
  3247.    Const intSum2 As **** = 10000
  3248.  
  3249.    ' Возвращаем сумму, умноженную на соответствующую ставку
  3250.   Select Case lngSum
  3251.       Case Is < intSum1
  3252.          dhCalculatePercent = lngSum * dblRate1
  3253.       Case Is < intSum2
  3254.          dhCalculatePercent = lngSum * dblRate2
  3255.       Case Else
  3256.          dhCalculatePercent = lngSum * dblRate3
  3257.    End Select
  3258. End Function
  3259. Начисление процентов в зависимости от суммы_3
  3260. Function dhCalculatePercent(Sales As ****, IsTemporal As Boolean) As Double
  3261.    ' Процентные ставки (декларация констант)
  3262.   Const dblRate1 As Double = 0.09
  3263.    Const dblRate2 As Double = 0.11
  3264.    Const dblRate3 As Double = 0.15
  3265.    Const dblAdd As Double = 1.1
  3266.    ' Граничные суммы
  3267.   Const lngSum1 As **** = 5000
  3268.    Const lngSum2 As **** = 10000
  3269.  
  3270.    ' Расчет суммы для выплаты (как обычно)
  3271.   If Sales < lngSum1 Then
  3272.       dhCalculatePercent = Sales * dblRate1
  3273.    ElseIf Sales < lngSum2 Then
  3274.       dhCalculatePercent = Sales * dblRate2
  3275.    Else
  3276.       dhCalculatePercent = Sales * dblRate3
  3277.    End If
  3278.  
  3279.    If IsTemporal Then
  3280.       ' Для сторонних вкладчиков - надбавка
  3281.      dhCalculatePercent = dblAdd * dhCalculatePercent
  3282.    End If
  3283. End Function
  3284. Сводный пример расчета комиссионного вознаграждения
  3285. Function dhCalculateCom(dblSales As Double) As Double
  3286.    Const dblRate1 = 0.09
  3287.    Const dblRate2 = 0.11
  3288.    Const dblRate3 = 0.15
  3289.    ' Расчет комиссионных с продаж (без выслуги) в зависимости _
  3290.     от суммы
  3291.   Select Case dblSales
  3292.       Case 0 To 4999.99: dhCalculateCom = dblSales * dblRate1
  3293.       Case 5000 To 9999.99: dhCalculateCom = dblSales * dblRate2
  3294.       Case Is >= 10000: dhCalculateCom = dblSales * dblRate3
  3295.    End Select
  3296. End Function
  3297.  
  3298. Function dhCalculateCom2(dblSales As Double, intYears As Double) _
  3299.  As Double
  3300.    Const dblRate1 = 0.09
  3301.    Const dblRate2 = 0.11
  3302.    Const dblRate3 = 0.15
  3303.    ' Расчет комиссионных с продаж (без учета выслуги лет) _
  3304.     в зависимости от суммы
  3305.   Select Case dblSales
  3306.       Case 0 To 4999.99: dhCalculateCom2 = dblSales * dblRate1
  3307.       Case 5000 To 9999.99: dhCalculateCom2 = dblSales * dblRate2
  3308.       Case Is >= 10000: dhCalculateCom2 = dblSales * dblRate3
  3309.    End Select
  3310.    ' Надбавка за выслугу лет
  3311.   dhCalculateCom2 = dhCalculateCom2 + _
  3312.     (dhCalculateCom2 * intYears / 100)
  3313. End Function
  3314.  
  3315. Sub ComCalculator()
  3316.    Dim strMessage As String
  3317.    Dim dblSales As Double
  3318.    Dim ан As Integer
  3319.  
  3320. Calc:
  3321.    ' Отображение окна для ввода данных
  3322.   dblSales = Val(InputBox("Сумма реализации:", _
  3323.     "Расчет комиссионного вознаграждения"))
  3324.  
  3325.    ' Формирование сообщения (с одновременным расчетом _
  3326.     вознаграждения)
  3327.   strMessage = "Объем продаж:" & vbTab & Format(dblSales, "$#,##0") & _
  3328.     vbCrLf & "Сумма вознаграждения:" & vbTab & _
  3329.     Format(dhCalculateCom(dblSales), "$#,##0") & _
  3330.     vbCrLf & vbCrLf & "Считаем дальше?"
  3331.  
  3332.    ' Вывод окна с сообщением (о рассчитанной сумме и вопросом _
  3333.     о продолжении расчетов)
  3334.   If MsgBox(strMessage, vbYesNo, _
  3335.     "Расчет комиссионного вознаграждения") = vbYes Then
  3336.       ' Продолжение расчетов
  3337.      GoTo Calc
  3338.    End If
  3339. End Sub
  3340.  
  3341. Движение по диапазону
  3342. Sub FullShach()
  3343. For Each c In Range(addressdiap)
  3344.     If c.Value > yr1 Then
  3345.        c.Select
  3346.         With Selection.Interior
  3347.           .ColorIndex = 6
  3348.           .Pattern = xlSolid
  3349.         End With
  3350.        Selection.Font.ColorIndex = yrcolor1
  3351.        If c.Value > yr2 Then
  3352.        c.Select
  3353.        Selection.Font.ColorIndex = yrcolor2
  3354.             If c.Value > yr3 Then
  3355.             c.Select
  3356.             Selection.Font.ColorIndex = yrcolor3
  3357.             End If
  3358.        End If
  3359.     End If
  3360. Next c
  3361.  
  3362. End Sub
  3363. Сдвиг от выделенной ячейки
  3364. Sub Test()
  3365.  Dim cur_range As Range
  3366.  Set cur_range = Range("A1")
  3367.  Set cur_range = cur_range.offset(1, 0)
  3368.  Debug.Print cur_range.Address
  3369. End Sub
  3370. Перебор ячеек вниз по колонне
  3371. Sub beg()
  3372. Dim a As Boolean
  3373. Dim d As Double
  3374. Dim c As Range
  3375. a = False
  3376. Set c = Range(ActiveCell.Address)
  3377. c.Select
  3378. d = c.Value
  3379. c.Value = d
  3380. While (a = False)
  3381. ActiveCell.offset(1, 0).Select
  3382. If (IsEmpty(ActiveCell.Value) = False) Then
  3383. Set c = Range(ActiveCell.Address)
  3384. c.Select
  3385. d = c.Value
  3386. c.Value = d
  3387. Else
  3388. a = False
  3389. End If
  3390. Wend
  3391. End Sub
  3392. Создание заливки диапазона
  3393. Sub FillRange()
  3394.    ' Заливка диапазона
  3395.   With Range("B1:E10")
  3396.       ' Задаем узор - сетчатый
  3397.      .Interior.Pattern = xlPatternChecker
  3398.       ' Цвет узора - синий
  3399.      .Interior.PatternColor = RGB(0, 0, 255)
  3400.       ' Цвет ячейки - красный
  3401.      .Interior.Color = RGB(255, 0, 0)
  3402.    End With
  3403. End Sub
  3404. Подбор параметра ячейки
  3405. Sub Макрос1()
  3406. ' Сочетание клавиш: Ctrl+ф
  3407.    Range("G5").GoalSeek Goal:=4, ChangingCell:=Range("G4")
  3408. End Sub
  3409. Разбиение диапазона
  3410. Function ExtractElement(Txt, n, Separator) As String
  3411. '   Функция выдает n-ый элемент текстовой строки Txt, где
  3412. '   символ Separator используется как разделитель
  3413.  
  3414.     Dim Txt1 As String, TempElement As String
  3415.     Dim ElementCount As Integer, i As Integer
  3416.    
  3417.     Txt1 = Txt
  3418. '   Если в качестве разделителя используется пробел, то убираем лишние
  3419. '   и двойные пробелы
  3420.    If Separator = Chr(32) Then Txt1 = Application.Trim(Txt1)
  3421.    
  3422. '   Добавляем разделитель в конец строки (если необходимо)
  3423.    If Right(Txt1, 1) <> Separator Then Txt1 = Txt1 & Separator
  3424.    
  3425. '   Начальные значения
  3426.    ElementCount = 0
  3427.     TempElement = ""
  3428.    
  3429. '   Извлекаем элемент
  3430.    For i = 1 To Len(Txt1)
  3431.         If Mid(Txt1, i, 1) = Separator Then
  3432.             ElementCount = ElementCount + 1
  3433.             If ElementCount = n Then
  3434. '               Found it, so exit
  3435.                ExtractElement = TempElement
  3436.                 Exit Function
  3437.             Else
  3438.                 TempElement = ""
  3439.             End If
  3440.         Else
  3441.             TempElement = TempElement & Mid(Txt1, i, 1)
  3442.         End If
  3443.     Next i
  3444.     ExtractElement = ""
  3445. End Function
  3446. Закройте редактор и вернитесь в Excel командой File - Close and return to Microsoft Excel.
  3447. Теперь в любой ячейке листа Вы можете использовать эту функцию через меню Вставка - Функция - категория Определенные пользователем, где в аргументах:
  3448. •   Txt - ячейка с текстом, который надо разделить,
  3449. •   n - порядковый номер извлекаемого элемента,
  3450. •   Separator - символ-разделитель.
  3451. Объединение данных диапазона
  3452. Function Couple(Diapazon)
  3453.    ' Объединение данных, содержащихся в ячейках диапазона _
  3454.     Diapazon (разделитель между значениями - пробел)
  3455.   ' iCell - текущая ячейка
  3456.   For Each iCell In Diapazon
  3457.       ' Сцепляются данные только заполненных ячеек
  3458.      If IsEmpty(iCell) <> True Then
  3459.          ' Добавление значения ячейки в выходную строку
  3460.         If Couple = "" Then
  3461.             Couple = iCell
  3462.          Else
  3463.             Couple = Couple & " " & iCell
  3464.          End If
  3465.       End If
  3466.    Next
  3467. End Function
  3468. Объединение данных диапазона_2
  3469. Function CoupleFormat(Diapazon)
  3470.    ' Объединение текстовых данных, содержащихся в ячейках _
  3471.     диапазона Diapazon (разделитель между значениями - пробел)
  3472.   ' iCell - текущая ячейка
  3473.   For Each iCell In Diapazon
  3474.       ' Сцепляются данные только заполненных ячеек
  3475.      If IsEmpty(iCell) <> True Then
  3476.          ' Добавление текста ячейки в выходную строку
  3477.         If CoupleFormat = "" Then
  3478.             CoupleFormat = iCell.Text
  3479.          Else
  3480.             CoupleFormat = CoupleFormat & " " & iCell.Text
  3481.          End If
  3482.       End If
  3483.    Next
  3484. End Function
  3485.  
  3486. Узнать максимальную колонку или строку.
  3487. Sub Test()
  3488.  With ActiveSheet
  3489.   Dim cur_range As Range
  3490.   Set cur_range = .UsedRange
  3491.   Debug.Print cur_range.Address
  3492.  End With
  3493. End Sub
  3494. Ограничение возможных значений диапазона
  3495. Sub Worksheet_Change(ByVal Target As Excel.Range)
  3496.    Dim rgInputRange As Range
  3497.    Dim cell As Range
  3498.    Dim strMessage As String
  3499.    Dim varResult As Variant
  3500.  
  3501.    ' Диапазон, в котором контролируется ввод
  3502.   Set rgInputRange = Range("A1:E10")
  3503.    ' Просмотр всех измененных ячеек и контроль ввода в тех, которые _
  3504.     принадлежат заданному диапазону
  3505.   For Each cell In Target
  3506.       ' Проверка принадлежности диапазону
  3507.      If Union(cell, rgInputRange).Address = rgInputRange.Address Then
  3508.          ' Контроль правильности ввода
  3509.         varResult = IsCellDataValid(cell)
  3510.          If varResult = True Then
  3511.             ' Введено корректное значение
  3512.            Exit Sub
  3513.          Else
  3514.          ' Формирование и вывод сообщения об ошибке
  3515.         strMessage = "Ячейка " & cell.Address(False, False) & ":" _
  3516.           & vbCrLf & vbCrLf & varResult
  3517.          MsgBox strMessage, vbCritical, "Неправильное значение"
  3518.          ' Очистка ввода
  3519.         Application.EnableEvents = False
  3520.          cell.ClearContents
  3521.          cell.Activate
  3522.          Application.EnableEvents = True
  3523.          End If
  3524.       End If
  3525.    Next cell
  3526. End Sub
  3527.  
  3528. Function IsCellDataValid(cell As Range) As Variant
  3529.    ' Возвращает True, если в ячейку вводится целое число _
  3530.     в диапазоне от 1 до 12. В противном случае выдается _
  3531.     соответствующее сообщение
  3532.  
  3533.    ' Проверка, является ли содержимое ячейки числом
  3534.   If Not WorksheetFunction.IsNumber(cell.Value) Then
  3535.       IsCellDataValid = "Нечисловое значение"
  3536.       Exit Function
  3537.    End If
  3538.    ' Проверка, является ли введенное число целым
  3539.   If Int(cell.Value) <> cell.Value Then
  3540.       IsCellDataValid = "Введите целое число"
  3541.       Exit Function
  3542.    End If
  3543.    ' Проверка соответствия числа диапазону
  3544.   If cell.Value < 1 Or cell.Value > 12 Then
  3545.       IsCellDataValid = "Значение должно быть от 1 до 12"
  3546.       Exit Function
  3547.    End If
  3548.  
  3549.    ' В ячейку введено допустимое значение
  3550.   IsCellDataValid = True
  3551. End Function
  3552. Тестирование скорости чтения и записи диапазонов
  3553. Sub TableSpeedTest()
  3554.    Dim alngData() As ****        ' Массив с числами
  3555.   Dim lngCount As ****          ' Количество элементов в массиве
  3556.   Dim dtStart As Date           ' Хранит время (и даже дату) начала _
  3557.                                   тестирования
  3558.   Dim strArrayToTable As String ' Время записи в таблицу
  3559.   Dim strTableToArray As String ' Время чтения из таблицы
  3560.   Dim strMessage As String
  3561.    Dim i As ****
  3562.  
  3563.    ' Подготовка диапазона ячеек
  3564.   Range("A:A").ClearContents
  3565.  
  3566.    ' Ввод размера массива, формирование массива заданного размера
  3567.   lngCount = InputBox("Введите количество элементов")
  3568.    ReDim alngData(1 To lngCount)
  3569.    ' Заполнение массива данными
  3570.   For i = 1 To lngCount
  3571.       alngData(i) = i
  3572.    Next i
  3573.  
  3574.    ' Перенос массива в таблицу
  3575.   Application.ScreenUpdating = False
  3576.    dtStart = Timer
  3577.    For i = 1 To lngCount
  3578.       Cells(i, 1) = i
  3579.    Next i
  3580.    strArrayToTable = Format(Timer - dtStart, "00:00")
  3581.  
  3582.    ' Чтение данных из таблицы обратно в массив
  3583.   dtStart = Timer
  3584.    For i = 1 To lngCount
  3585.       alngData(i) = Cells(i, 1)
  3586.    Next i
  3587.    strTableToArray = Format(Timer - dtStart, "00:00")
  3588.    Application.ScreenUpdating = True
  3589.  
  3590.    ' Вывод на экран результатов тестирования
  3591.   strMessage = "Запись: " & strArrayToTable & vbCrLf & _
  3592.     "Чтение: " & strTableToArray
  3593.    MsgBox strMessage, , lngCount & " элементов"
  3594. End Sub
  3595.  
  3596. Открыть MsgBox при выборе ячейки
  3597. Private Sub Worksheet_Selectiоnchange(ByVal Target As Range)
  3598. If Target.Address = "$A$1" Then MsgBox "Hello world"
  3599. End Sub
  3600. Скрытие строки
  3601. Sub HideString()
  3602.    Rows(2).Hidden = True
  3603. End Sub
  3604. Скрытие нескольких строк
  3605. Sub HideStrings()
  3606.    Rows("3:5").Hidden = True
  3607. End Sub
  3608. Скрытие столбца
  3609. Sub HideCollumn()
  3610.    Columns(2).Hidden = True
  3611. End Sub
  3612. Скрытие нескольких столбцов
  3613. Sub HideCollumns()
  3614.    Columns("E:F").Hidden = True
  3615. End Sub
  3616. Скрытие строки по имени ячейки
  3617. Sub HideCell()
  3618.    Range("Секрет").EntireRow.Hidden = True
  3619. End Sub
  3620. Скрытие нескольких строк по адресам ячеек
  3621. Sub HideCell()
  3622.    Range("B3:D4").EntireRow.Hidden = True
  3623. End Sub
  3624. Скрытие столбца по имени ячейки
  3625. Sub HideCell()
  3626.    Range("Секрет").EntireColumn.Hidden = True
  3627. End Sub
  3628. Скрытие нескольких столбцов по адресам ячеек
  3629. Sub HideCell()
  3630.    Range("C2:D5").EntireColumn.Hidden = True
  3631. End Sub
  3632. Мигание ячейки
  3633. Sub BlinkingCell()
  3634.    Static intCalls As Integer  ' Счетчик количества миганий
  3635.  
  3636.    ' Если ячейка мигала менее 10 раз, то изменим _
  3637.     в очередной раз ее цвет
  3638.   If intCalls < 10 Then
  3639.       intCalls = intCalls + 1
  3640.       ' Определение, какой цвет необходимо установить
  3641.      If Range("A1").Interior.Color <> RGB(255, 0, 0) Then
  3642.          ' Цвет ячейки не красный, так что теперь назначим _
  3643.           именно красный цвет
  3644.         Range("A1").Interior.Color = RGB(255, 0, 0)
  3645.       Else
  3646.          ' Назначим ячейке зеленый цвет
  3647.         Range("A1").Interior.Color = RGB(0, 255, 0)
  3648.       End If
  3649.  
  3650.       ' Эту процедуру необходимо вызвать через 5 секунд
  3651.      Application.OnTime Now + TimeValue("00:00:05"), "BlinkingCell"
  3652.    Else
  3653.       ' Хватит мигать
  3654.      Range("A1").Interior.ColorIndex = xlNone
  3655.       intCalls = 0
  3656.    End If
  3657. End Sub
  3658.  
  3659.  
  3660.  
  3661.  
  3662.  
  3663.  
  3664.  
  3665.  
  3666.  
  3667.  
  3668.  
  3669.  
  3670.  
  3671.  
  3672.  
  3673.  
  3674.  
  3675.  
  3676. ГЛАВА 4. РАБОТА С ПРИМЕЧАНИЯМИ
  3677. Вывод на экран всех примечаний рабочего листа
  3678. Sub ShowComments()
  3679.    Dim cell As Range
  3680.    Dim rgCells As Range
  3681.  
  3682.    ' Получение всех ячеек с примечаниями
  3683.   Set rgCells = Selection.SpecialCells(xlComments)
  3684.    If rgCells Is Nothing Then
  3685.       ' Примечаний нет
  3686.      Exit Sub
  3687.    End If
  3688.    ' Проходим по всем ячейкам диапазона
  3689.   For Each cell In rgCells
  3690.       ' Вывод примечаний в соседнюю ячейку
  3691.      cell.Next.Value = cell.comment.Text
  3692.    Next
  3693. End Sub
  3694. Функция извлечения комментария
  3695. Function GetCommentText(rCommentCell As Range)
  3696. Dim strGotIt As String
  3697. On Error Resume Next
  3698. strGotIt = WorksheetFunction.Clean _
  3699. (rCommentCell.comment.Text)
  3700. GetCommentText = strGotIt
  3701. On Error GoTo 0
  3702. End Function
  3703. вставить в модуль эксель
  3704.  
  3705. Список примечаний защищенных листов
  3706. Sub ShowComments1()
  3707.    Dim cell As Range
  3708.    Dim strFirstAddress As String
  3709.    Dim strComments As String
  3710.  
  3711.    ' Получаем все ячейки выделения, в которых есть комментарий
  3712.   Set cell = Selection.Find("*", LookIn:=xlComments)
  3713.    If Not cell Is Nothing Then
  3714.       ' Сохранение адреса первой найденной ячейки _
  3715.        (для предотвращения зацикливания поиска)
  3716.      strFirstAddress = cell.Address
  3717.       Do
  3718.          ' Добавление текста примечания в выходную строку
  3719.         strComments = strComments & "Комментарий: " & _
  3720.           cell.comment.Text & Chr(13)
  3721.          ' Продолжение поиска
  3722.         Set cell = Selection.FindNext(cell)
  3723.       Loop While Not cell Is Nothing And _
  3724.        cell.Address <> strFirstAddress
  3725.    End If
  3726.    If strComments <> "" Then
  3727.       ' Отображение окна с текстом примечаний
  3728.      MsgBox strComments
  3729.    Else
  3730.       MsgBox "В выделенной ячейке/ячейках комментариев нет"
  3731.    End If
  3732. End Sub
  3733. Перечень примечаний в отдельном списке_1
  3734. Sub ListOfComments()
  3735.    Dim cell As Range
  3736.    Dim rgCells As Range
  3737.    Dim intRow As Integer
  3738.  
  3739.    ' Получение всех ячеек с примечаниями
  3740.   On Error Resume Next
  3741.    Set rgCells = Selection.SpecialCells(xlComments)
  3742.    If rgCells Is Nothing Then
  3743.       ' Примечаний нет
  3744.      Exit Sub
  3745.    End If
  3746.    ' Проходим по всем ячейкам диапазона
  3747.   For Each cell In rgCells
  3748.       ' Вывод примечаний в ячейку столбца "C"
  3749.      intRow = intRow + 1
  3750.       Cells(intRow, 3) = cell.comment.Text
  3751.    Next
  3752. End Sub
  3753. Перечень примечаний в отдельном списке_2
  3754. Sub ListOfComments1()
  3755.    Dim cell As Range
  3756.    Dim strFirstAddress As String
  3757.    Dim intRow As Integer
  3758.  
  3759.    ' Получение всех ячеек выделения, в которых есть примечания
  3760.   Set cell = Cells.Find("*", LookIn:=xlComments)
  3761.    If Not cell Is Nothing Then
  3762.       ' Сохранение адреса первой найденной ячейки _
  3763.        (для предотвращения зацикливания поиска)
  3764.      strFirstAddress = cell.Address
  3765.       Do
  3766.          ' Вывод текста в столбец "C"
  3767.         intRow = intRow + 1
  3768.          Cells(intRow, 3) = cell.comment.Text
  3769.          ' Продолжение поиска
  3770.         Set cell = Cells.FindNext(cell)
  3771.          Loop While Not cell Is Nothing And _
  3772.           cell.Address <> strFirstAddress
  3773.    End If
  3774. End Sub
  3775. Перечень примечаний в отдельном списке_3
  3776. Sub ListOfCommentsToFile()
  3777.    Dim rgCells As Range            ' Ячейки с примечаниями
  3778.   Dim intDefListCount As Integer  ' Используется для временного _
  3779.                    хранения количества листов в книге по умолчанию
  3780.   Dim strSheet As String          ' Имя анализируемого листа
  3781.   Dim strWorkBook As String       ' Имя книги с анализируемым листом
  3782.   Dim intRow As Integer
  3783.    Dim cell As Range
  3784.  
  3785.    ' Получение ячеек с примечаниями
  3786.   On Error Resume Next
  3787.    Set rgCells = ActiveSheet.Cells.SpecialCells(xlComments)
  3788.    On Error GoTo 0
  3789.    ' Если примечаний нет, то можно не продолжать
  3790.   If rgCells Is Nothing Then
  3791.       MsgBox "Текущая рабочая книга не содержит примечаний.", _
  3792.        vbInformation
  3793.       Exit Sub
  3794.    End If
  3795.  
  3796.    ' Сохранение имен анализируемого листа и книги
  3797.   strSheet = ActiveSheet.Name
  3798.    strWorkBook = ActiveWorkbook.Name
  3799.  
  3800.    ' Создание отдельной книги с одним листом _
  3801.     для отображения результатов
  3802.   intDefListCount = Application.SheetsInNewWorkbook
  3803.    Application.SheetsInNewWorkbook = 1
  3804.    Workbooks.Add
  3805.    Application.SheetsInNewWorkbook = intDefListCount
  3806.    ActiveWorkbook.Windows(1).Caption = "Comments for " & strSheet & _
  3807.     " in " & strWorkBook
  3808.  
  3809.    ' Создание списка примечаний
  3810.   Cells(1, 1) = "Адрес"
  3811.    Cells(1, 2) = "Содержимое"
  3812.    Cells(1, 3) = "Комментарий"
  3813.    Range(Cells(1, 1), Cells(1, 3)).Font.Bold = True
  3814.    intRow = 2  ' Данные начинаются со второй строки
  3815.   For Each cell In rgCells
  3816.       Cells(intRow, 1) = cell.Address(rowabsolute:=False, _
  3817.        columnabsolute:=False)
  3818.       Cells(intRow, 2) = " " & cell.Formula
  3819.       Cells(intRow, 3) = cell.comment.Text
  3820.       intRow = intRow + 1
  3821.    Next
  3822. End Sub
  3823.  
  3824. Подсчет количества примечаний_1
  3825. Sub CountOfComments()
  3826.    Dim intCommentCount As Integer
  3827.    ' Получение и отображение количества примечаний
  3828.   intCommentCount = ActiveSheet.Comments.Count
  3829.    If intCommentCount = 0 Then
  3830.       MsgBox "Текущая рабочая книга не содержит примечаний.", _
  3831.        vbInformation
  3832.    Else
  3833.       MsgBox "В текущей рабочей книге содержится " & intCommentCount _
  3834.        & " комментариев.", vbInformation
  3835.    End If
  3836. End Sub
  3837. Подсчет количества примечаний_2
  3838. ' Function IsCommentsPresent
  3839. ' Возвращает TRUE, если на активном рабочем листе имеется хотя бы
  3840. ' одна ячейка с комментарием, иначе возвращает FALSE
  3841. '
  3842. Public Function IsCommentsPresent() As Boolean
  3843.    IsCommentsPresent = (ActiveSheet.Comments.Count <> 0)
  3844.  End Function
  3845. Подсчет примечаний_3
  3846. Sub CountOfComment()
  3847.    Dim intCommentCount As Integer
  3848.    ' Получение и отображение количества примечаний _
  3849.     на текущем листе
  3850.   intCommentCount = ActiveSheet.Comments.Count
  3851.    If intCommentCount = 0 Then
  3852.       MsgBox "Примечаний нет"
  3853.    Else
  3854.       MsgBox "Примечаний: " & intCommentCount & " шт."
  3855.    End If
  3856. End Sub
  3857.  
  3858. Выделение ячеек с примечаниями
  3859. Sub SelectComments()
  3860.    ' Выделение всех ячеек с примечаниями
  3861.   Cells.SpecialCells(xlCellTypeComments).Select
  3862. End Sub
  3863. Отображение всех примечаний
  3864. Sub ShowComments()
  3865.    ' Отображение всех примечаний
  3866.   If Application.DisplayCommentIndicator = xlCommentAndIndicator Then
  3867.       Application.DisplayCommentIndicator = xlCommentIndicatorOnly
  3868.    Else
  3869.       Application.DisplayCommentIndicator = xlCommentAndIndicator
  3870.    End If
  3871. End Sub
  3872. Изменение цвета примечаний
  3873. Sub ChangeCommentColor()
  3874.    ' Автоматическое изменение цвета комментариев
  3875.   Dim comment As comment
  3876.    For Each comment In ActiveSheet.Comments
  3877.       ' Задаем случайные цвета заливки и шрифта комментариев
  3878.      comment.Shape.Fill.ForeColor.SchemeColor = Int((80) * Rnd + 1)
  3879.       comment.Shape.TextFrame.Characters.Font.ColorIndex = Int((56 _
  3880.        ) * Rnd + 1)
  3881.    Next
  3882. End Sub
  3883. Добавление примечаний
  3884. Dim r As Range
  3885. Dim rwIndex As Integer
  3886.  
  3887. For rwIndex = 1 To 3
  3888.     Set r = Worksheets("WombatBattingAverages").Cells(rwIndex, 2)
  3889.     With r
  3890.          If .Value >= 0.3 Then
  3891.               .AddComment "All Star!"
  3892.          End If
  3893.     End With
  3894. Next rwIndex
  3895.  
  3896. Добавление примечаний в диапазон по условию
  3897. Sub CreateComments()
  3898.    Dim cell As Range
  3899.    ' Производим поиск по всем ячейкам диапазона и добавляем примечания _
  3900.     ко всем ячейкам, содержащим слово "Выручка"
  3901.   For Each cell In Range("B1:B100")
  3902.       If cell.Value Like "*Выручка*" Then
  3903.          cell.ClearComments
  3904.          cell.AddComment "Неучтенная наличка"
  3905.       End If
  3906.    Next
  3907. End Sub
  3908. Перенос комментария в ячейку и обратно
  3909.  
  3910. Sub Комментарий_в_ячейку_в_диапазоне()
  3911. 'переносит комментарий в ячейку
  3912. Dim i As ****
  3913. Dim c As Range, cc As Range
  3914. Dim iCommment As Comments
  3915. Application.DisplayCommentIndicator = xlCommentIndicatorOnly
  3916. Application.ScreenUpdating = False
  3917. Application.Calculation = xlCalculationManual
  3918. Set cc = Selection
  3919. 'если выделили 1 ячейку, то выход
  3920. If cc.Rows.Count = 1 And cc.Columns.Count = 1 Then
  3921. MsgBox "Выделено слишком мало ячеек!", , "Ошибка"
  3922. End
  3923. End If
  3924. Set cc = Selection.SpecialCells(xlCellTypeVisible)
  3925. For Each c In cc
  3926. If Not c.comment Is Nothing Then
  3927. c.Value = c.comment.Text
  3928. 'c.ClearComments 'если надо удалить комментарий
  3929. i = i + 1
  3930. End If
  3931. End If
  3932. Next
  3933. Application.Calculation = xlCalculationAutomatic
  3934. Application.ScreenUpdating = True
  3935. MsgBox "Перенесено " & i & " комментариев!"
  3936. Exit Sub
  3937. End Sub
  3938.  
  3939. Перенос значений из ячейки в комментарий_1
  3940.  
  3941. Sub Добавить_комментарий_в_диапазоне()
  3942. 'копирует значение ячейки в комментарий в видемом диапазоне
  3943. Dim c As Range, cc As Range
  3944. Dim i As ****
  3945. On Error GoTo ErrorHandler
  3946. Application.DisplayCommentIndicator = xlCommentIndicatorOnly
  3947. Set cc = Selection
  3948. 'если выделили 1 ячейку, то выход
  3949. If cc.Rows.Count = 1 And cc.Columns.Count = 1 Then
  3950. MsgBox "Выделено слишком мало ячеек!", , "Ошибка"
  3951. End
  3952. End If
  3953. Set cc = Selection.SpecialCells(xlCellTypeVisible)
  3954. For Each c In cc
  3955. If c.Value <> Empty Then
  3956. c.AddComment CStr(c.Value)
  3957. i = i + 1
  3958. End If
  3959. Next
  3960. MsgBox "Добавлено " & i & " комментарий!"
  3961. Exit Sub
  3962. End Sub
  3963. Перенос значений из ячейки в комментарий_2
  3964.  
  3965. Sub Comment_in_Cell()
  3966. Dim c As Range
  3967. Dim r As Range
  3968. If ActiveSheet.Comments.Count = 0 Then MsgBox "Без комментариев!": Exit Sub
  3969. Set sh = ActiveSheet
  3970. Set shnew = Sheets.Add
  3971. sh.Select
  3972. Set r = Range(Cells(1, 1), Cells(Cells.Find("*", [a1], xlComments, , xlByRows, _
  3973. xlPrevious).Row, Cells.Find("*", [a1], xlComments, , xlColumns, _
  3974. xlPrevious).Column))
  3975. For Each c In r
  3976. If Not c.comment Is Nothing Then
  3977. shnew.Range(c.Address) = c.comment.Text
  3978. End If
  3979. Next
  3980. End Sub
  3981.  
  3982.  
  3983.  
  3984.  
  3985.  
  3986.  
  3987.  
  3988.  
  3989. ГЛАВА . ПОЛЬЗОВАТЕЛЬСКИЕ ВКЛАДКИ НА ЛЕНТЕ
  3990.  
  3991. Дополнение панели инструментов
  3992. Sub AddCustomCommandBar()
  3993.    ' Добавление кнопки на панель инструментов
  3994.   With Application.CommandBars(3).Controls.Add(Type:=msoControlButton)
  3995.       .FaceId = 42            ' Значок Word
  3996.      .Caption = "Кнопка"
  3997.       .OnAction = "Макрос"
  3998.    End With
  3999. End Sub
  4000. Добавление кнопки на панель инструментов
  4001. Sub AddCustomButton()
  4002.    ' Добавление кнопки на панель инструментов
  4003.   With Application.Toolbars(1).ToolbarButtons.Add(button:=222)
  4004.       .Name = "Кнопка"
  4005.       .OnAction = "Макрос"
  4006.    End With
  4007. End Sub
  4008. Панель с одной кнопкой
  4009. Sub CreateCustomControlBar()
  4010.    ' Создание панели инструментов
  4011.   With Application.CommandBars.Add(Name:="Панель", Temporary:=True)
  4012.       ' Создание и настройка кнопки
  4013.      With .Controls.Add(Type:=msoControlButton)
  4014.          .Style = msoButtonIconAndCaption
  4015.          .FaceId = 66
  4016.          .Caption = "Просто кнопка"
  4017.       End With
  4018.       ' Покажем панель
  4019.      .Visible = True
  4020.    End With
  4021. End Sub
  4022. Панель с двумя кнопками
  4023. Sub CreateCustomControlBar()
  4024.    ' Создание панели инструментов
  4025.   With Application.CommandBars.Add(Name:="Панель", Temporary:=True, _
  4026.     Position:=msoBarLeft)
  4027.       ' Создание и настройка первой кнопки
  4028.      With .Controls.Add(Type:=msoControlButton)
  4029.          .Style = msoButtonWrapCaption
  4030.          .Caption = "Просто кнопка"
  4031.       End With
  4032.       ' Создание и настройка второй кнопки
  4033.      With .Controls.Add(Type:=msoControlButton)
  4034.          .Style = msoButtonIconAndWrapCaption
  4035.          .Caption = "Кнопка"
  4036.          .FaceId = 225
  4037.       End With
  4038.       ' Покажем панель
  4039.      .Visible = True
  4040.    End With
  4041. End Sub
  4042. Создание панели справа
  4043. Sub CreateCustomControlBar()
  4044.    ' Создание панели инструментов
  4045.   With Application.CommandBars.Add(Name:="Правая панель", _
  4046.     Temporary:=True)
  4047.       ' Создание и настройка кнопки
  4048.      With .Controls.Add(Type:=msoControlButton)
  4049.          .Style = msoButtonWrapCaption
  4050.          .Caption = "Кнопка"
  4051.       End With
  4052.  
  4053.       ' Задание позиции - справа
  4054.      .Position = msoBarRight
  4055.       ' Покажем панель
  4056.      .Visible = True
  4057.    End With
  4058. End Sub
  4059. Вызов предварительного просмотра
  4060. Sub Test()
  4061.  With Application.Workbooks.Item("Test.xls")
  4062.  Sheets("Test").PrintPreview
  4063.  End With
  4064. End Sub
  4065.  
  4066. Создание пользовательского меню (вариант 1)
  4067. Sub AddCustomMenu()
  4068.    ' Добавление меню
  4069.   With Application.CommandBars(1).Controls.Add(Type:=msoControlPopup, _
  4070.     Temporary:=True)
  4071.       .Caption = "Архив"
  4072.       With .Controls
  4073.          ' Добавление и настройка первого пункта
  4074.         With .Add(Type:=msoControlButton)
  4075.             .FaceId = 280
  4076.             .Caption = "Просмотр"
  4077.             .OnAction = "Макрос1"
  4078.          End With
  4079.          ' Добавление вложенного меню
  4080.         With .Add(Type:=msoControlPopup)
  4081.             .Caption = "База данных"
  4082.             With .Controls
  4083.                ' Добавление и настройка первого пункта _
  4084.                 вложенного меню
  4085.               With .Add(Type:=msoControlButton)
  4086.                   .FaceId = 1643
  4087.                   .Caption = "Поставщики"
  4088.                   .OnAction = "Макрос2"
  4089.                End With
  4090.                ' Добавление и настройка второго пункта _
  4091.                 вложенного меню
  4092.               With .Add(Type:=msoControlButton)
  4093.                   .FaceId = 1000
  4094.                   .Caption = "Покупатели"
  4095.                   .OnAction = "Макрос3"
  4096.                End With
  4097.             End With
  4098.          End With
  4099.       End With
  4100.    End With
  4101. End Sub
  4102. Создание пользовательского меню (вариант 2)
  4103. Sub AddCustomMenu1()
  4104.    ' Добавление меню с названием "Архив" в часть меню, _
  4105.     относящуюся к рабочей книге
  4106.   With MenuBars("Worksheet").Menus.Add(Caption:="Архив")
  4107.       ' Добавление кнопки
  4108.      .MenuItems.Add Caption:="Просмотр", OnAction:="Макрос1"
  4109.       ' Добавление подменю
  4110.      With .MenuItems.AddMenu(Caption:="База данных")
  4111.          ' Добавление пунктов подменю
  4112.         .MenuItems.Add Caption:="Поставщики", OnAction:="Макрос2"
  4113.          .MenuItems.Add Caption:="Покупатели", OnAction:="Макрос3"
  4114.       End With
  4115.    End With
  4116. End Sub
  4117. Создание пользовательского меню (вариант 3)
  4118. Sub AddCustomMenu2()
  4119.    ' Добавление меню с названием "Архив" в часть меню, _
  4120.     относящуюся к рабочей книге
  4121.   With MenuBars("Worksheet").Menus.Add(Caption:="Архив")
  4122.       ' Добавление кнопки
  4123.      .MenuItems.Add Caption:="Просмотр", OnAction:="Макрос1"
  4124.       ' Добавление подменю
  4125.      With .MenuItems.AddMenu(Caption:="База данных")
  4126.          ' Добавление первого пункта подменю
  4127.         With .MenuItems.Add(Caption:="Поставщики")
  4128.             ' Настройка кнопки
  4129.            .OnAction = "Макрос2"
  4130.          End With
  4131.          ' Добавление второго пункта подменю
  4132.         With .MenuItems.Add(Caption:="Покупатели")
  4133.             ' Настройка кнопки
  4134.            .OnAction = "Макрос3"
  4135.          End With
  4136.       End With
  4137.    End With
  4138. End Sub
  4139. Создание пользовательского меню (вариант 4)
  4140.  
  4141. Sub Workbook_Open()
  4142.    ' Задание имени меню
  4143.   strMenuName = "MyCommandBarName"
  4144.    ' Создание меню
  4145.   CreateCustomMenu
  4146. End Sub
  4147. Создание пользовательского меню (вариант 5)
  4148.  
  4149. Sub Workbook_BeforeClose(Cancel As Boolean)
  4150.    ' Удаление меню перед закрытием книги
  4151.   DeleteCustomMenu
  4152. End Sub
  4153.  
  4154. Public strMenuName As String  ' Имя строки меню
  4155. Private cbrcBar As CommandBarControl
  4156.  
  4157. Sub CreateCustomMenu()
  4158.    Dim cbrMenu As CommandBar
  4159.    Dim cbrcMenu As CommandBarControl     ' Выпадающее меню "Меню"
  4160.   Dim cbrcSubMenu As CommandBarControl  ' Выпадающее меню "Дополнительно"
  4161.  
  4162.    ' Если уже есть пользовательское меню, то оно удаляется
  4163.   DeleteCustomMenu
  4164.  
  4165.    ' Создание меню вместо стандартного
  4166.   Set cbrMenu = Application.CommandBars.Add(strMenuName, msoBarTop, _
  4167.     True, True)
  4168.    ' Создание выпадающего меню с названием "Меню"
  4169.   Set cbrcMenu = cbrMenu.Controls.Add(msoControlPopup, , , , True)
  4170.    With cbrcMenu
  4171.       .Caption = "&Меню"
  4172.    End With
  4173.  
  4174.    ' Создание пункта меню
  4175.   With cbrcMenu.Controls.Add(Type:=msoControlButton, _
  4176.     Temporary:=True)
  4177.       .Caption = "&Меню1"
  4178.       .OnAction = "CallMenu1"
  4179.    End With
  4180.    ' Создание пункта меню
  4181.   With cbrcMenu.Controls.Add(Type:=msoControlButton, _
  4182.     Temporary:=True)
  4183.       .Caption = "Меню2"
  4184.       .OnAction = "CallMenu2"
  4185.    End With
  4186.    ' Создание подменю первого уровня
  4187.   Set cbrcSubMenu = cbrcMenu.Controls.Add(Type:=msoControlPopup, _
  4188.     Temporary:=True)
  4189.    With cbrcSubMenu
  4190.       .Caption = "Подменю1"
  4191.       .BeginGroup = True
  4192.    End With
  4193.    ' Создание пункта меню
  4194.   With cbrcMenu.Controls.Add(Type:=msoControlButton, _
  4195.     Temporary:=True)
  4196.       .Caption = "Вкл/Выкл"
  4197.       .OnAction = "MenuOnOff"
  4198.       .Style = msoButtonIconAndCaption
  4199.       .FaceId = 463
  4200.    End With
  4201.    ' Создание пункта меню в подменю первого уровня
  4202.   With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _
  4203.     Temporary:=True)
  4204.       .Caption = "Подменю1"
  4205.       .OnAction = "CallSubMenu1"
  4206.       .Style = msoButtonIconAndCaption
  4207.       .FaceId = 2950
  4208.       .State = msoButtonDown
  4209.    End With
  4210.    ' Cоздание пункта меню в подменю первого уровня (его состояние _
  4211.     изменяется посредством пункта "Вкл/Выкл"), для чего сохраним ссылку _
  4212.     на созданный пункт меню
  4213.   Set cbrcBar = cbrcSubMenu.Controls.Add(Type:=msoControlButton, _
  4214.     Temporary:=True)
  4215.    With cbrcBar
  4216.       .Caption = "Подменю2"
  4217.       .OnAction = "CallSubMenu2"
  4218.       ' Сначала меню деактивировано
  4219.      .Enabled = False
  4220.    End With
  4221.    ' Создание подменю второго уровня
  4222.   Set cbrcSubMenu = cbrcSubMenu.Controls.Add(Type:=msoControlPopup, _
  4223.     Temporary:=True)
  4224.    With cbrcSubMenu
  4225.       .Caption = "ПодчПодменю1"
  4226.       .BeginGroup = True
  4227.    End With
  4228.    ' Cоздание пункта меню в подменю второго уровня
  4229.   With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _
  4230.     Temporary:=True)
  4231.       .Caption = "ПослМеню1"
  4232.       .OnAction = "CallLastMenu1"
  4233.       .Style = msoButtonIconAndCaption
  4234.       .FaceId = 71
  4235.       .State = msoButtonDown
  4236.    End With
  4237.    ' Cоздание пункта меню в подменю второго уровня
  4238.   With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _
  4239.     Temporary:=True)
  4240.       .Caption = "ПослМеню2"
  4241.       .OnAction = "CallLastMenu2"
  4242.       .Style = msoButtonIconAndCaption
  4243.       .FaceId = 72
  4244.       .Enabled = True
  4245.    End With
  4246.  
  4247.    ' Отображение меню
  4248.   cbrMenu.Visible = True
  4249.    Set cbrcSubMenu = Nothing
  4250.    Set cbrcMenu = Nothing
  4251.    Set cbrMenu = Nothing
  4252. End Sub
  4253.  
  4254. Sub DeleteCustomMenu()
  4255.    ' Удаление строки меню
  4256.   On Error Resume Next
  4257.    Application.CommandBars(strMenuName).Delete
  4258.    On Error GoTo 0
  4259. End Sub
  4260.  
  4261. Sub CallMenu1()
  4262.    ' Обработка вызова Меню1
  4263.   MsgBox "Приветствует меню 1!", vbInformation, ThisWorkbook.Name
  4264. End Sub
  4265. Sub CallMenu2()
  4266.    ' Обработка вызова Меню2
  4267.   MsgBox "Приветствует меню 2!", vbInformation, ThisWorkbook.Name
  4268. End Sub
  4269.  
  4270. Sub CallSubMenu1()
  4271.    ' Обработка вызова Подменю1
  4272.   MsgBox "Приветствует подменю 1!", vbInformation, ThisWorkbook.Name
  4273. End Sub
  4274. Sub CallSubMenu2()
  4275.    ' Обработка вызова Подменю2
  4276.   MsgBox "Приветствует подменю 2!", vbInformation, ThisWorkbook.Name
  4277. End Sub
  4278.  
  4279. Sub CallLastMenu1()
  4280.    ' Обработка вызова Последнего меню1
  4281.   MsgBox "Приветствует последнее меню 1!", vbInformation, ThisWorkbook.Name
  4282. End Sub
  4283.  
  4284. Sub CallLastMenu2()
  4285.    ' Обработка вызова Последнего меню2
  4286.   MsgBox "Приветствует последнее меню 2!", vbInformation, ThisWorkbook.Name
  4287. End Sub
  4288.  
  4289. Sub MenuOnOff()
  4290.    ' Активация или деактивация пункта "Меню-Подменю1-Подменю2"
  4291.   cbrcBar.Enabled = Not cbrcBar.Enabled
  4292. End Sub
  4293. Создание пользовательского меню (вариант 6)
  4294. Sub CreateMenu()
  4295.    Dim cbrMenu As CommandBar
  4296.    Dim cbrcNewMenu As CommandBarControl
  4297.  
  4298.    ' Удаление меню, если оно уже есть
  4299.   Call DeleteMenu
  4300.    ' Добавление строки пользовательского меню
  4301.   Set cbrMenu = CommandBars.Add(MenuBar:=True)
  4302.    With cbrMenu
  4303.       .Name = "Моя строка меню"
  4304.       .Visible = True
  4305.    End With
  4306.  
  4307.    ' Копирование стандартного меню "Файл"
  4308.   CommandBars("Worksheet Menu Bar").FindControl(ID:=30002).Copy _
  4309.     CommandBars("Моя строка меню")
  4310.  
  4311.    ' Добавление нового меню - "Дополнительно"
  4312.   Set cbrcNewMenu = cbrMenu.Controls.Add(msoControlPopup)
  4313.    cbrcNewMenu.Caption = "&Дополнительно"
  4314.  
  4315.    ' Добавление команды в новое меню
  4316.   With cbrcNewMenu.Controls.Add(msoControlButton)
  4317.       .Caption = "&Восстановить обычную строку меню"
  4318.       .OnAction = "DeleteMenu"
  4319.    End With
  4320.    ' Добавление команды в новое меню
  4321.   With cbrcNewMenu.Controls.Add(Type:=msoControlButton)
  4322.       .Caption = "&Справка"
  4323.    End With
  4324. End Sub
  4325.  
  4326. Sub DeleteMenu()
  4327.    ' Пытаемся удалить меню (успешно, если оно ранее создано)
  4328.   On Error Resume Next
  4329.    CommandBars("Моя строка меню").Delete
  4330.    On Error GoTo 0
  4331. End Sub
  4332. Список панелей инструментов и контекстных меню
  4333. Sub ListOfMenues()
  4334.    Dim intRow As Integer    ' Хранит текущую строку
  4335.   Dim cbrBar As CommandBar
  4336.    ' Очистка всех ячеек текущего листа
  4337.   Cells.Clear
  4338.    intRow = 1  ' Начинаем запись с первой строки
  4339.   ' Просматриваем список панелей инструментов и меню _
  4340.     и записываем информацию о каждом элементе в таблицу
  4341.   For Each cbrBar In CommandBars
  4342.       ' Порядковый номер
  4343.      Cells(intRow, 1) = cbrBar.Index
  4344.       ' Название
  4345.      Cells(intRow, 2) = cbrBar.Name
  4346.       ' Тип
  4347.      Select Case cbrBar.Type
  4348.          Case msoBarTypeNormal
  4349.             Cells(intRow, 3) = "Панель инструментов"
  4350.          Case msoBarTypeMenuBar
  4351.             Cells(intRow, 3) = "Строка меню"
  4352.          Case msoBarTypePopup
  4353.             Cells(intRow, 3) = "Контекстное меню"
  4354.       End Select
  4355.       ' Встроенный элемент или созданный пользователем
  4356.      Cells(intRow, 4) = cbrBar.BuiltIn
  4357.  
  4358.       ' Переходим на следующую строку
  4359.      intRow = intRow + 1
  4360.    Next
  4361. End Sub
  4362. Создание списка пунктов главного меню Excel
  4363. Листинг 3.90. Список содержимого главного меню
  4364. Sub ListOfMenues()
  4365.    Dim intRow As Integer    ' Текущая строка, куда идет запись
  4366.   Dim cbrcMenu As CommandBarControl        ' Главное меню
  4367.   Dim cbrcSubMenu As CommandBarControl     ' Подменю
  4368.   Dim cbrcSubSubMenu As CommandBarControl  ' Подменю в подменю
  4369.  
  4370.    ' Очищаем ячейки текущего листа
  4371.   Cells.Clear
  4372.    ' Начинаем запись с первой строки
  4373.   intRow = 1
  4374.  
  4375.    ' Просматриваем все элементы строки меню
  4376.   On Error Resume Next    ' Игнорируем ошибки
  4377.   For Each cbrcMenu In CommandBars(1).Controls
  4378.       ' Просматриваем элементы выпадающего меню cbrcMenu
  4379.      For Each cbrcSubMenu In cbrcMenu.Controls
  4380.          ' Просматриваем элементы подменю cbrcSubMenu
  4381.         For Each cbrcSubSubMenu In cbrcSubMenu.Controls
  4382.             ' Выводим название главного меню
  4383.            Cells(intRow, 1) = cbrcMenu.Caption
  4384.             ' Выводим название подменю
  4385.            Cells(intRow, 2) = cbrcSubMenu.Caption
  4386.             ' Выводим название вложенного подменю
  4387.            Cells(intRow, 3) = cbrcSubSubMenu.Caption
  4388.  
  4389.             ' Переходим на следующую строку
  4390.            intRow = intRow + 1
  4391.          Next cbrcSubSubMenu
  4392.       Next cbrcSubMenu
  4393.    Next cbrcMenu
  4394. End Sub
  4395. Создание списка пунктов контекстных меню
  4396. Листинг 3.91. Список содержимого контекстных меню
  4397. Sub ListOfContextMenues()
  4398.    Dim intRow As ****
  4399.    Dim intControl As Integer
  4400.    Dim cbrBar As CommandBar
  4401.  
  4402.    ' Очистка ячеек активного листа
  4403.   Cells.Clear
  4404.    ' Начинаем вывод с первой строки
  4405.   intRow = 1
  4406.  
  4407.    ' Просмотр списка контекстных меню и вывод информации о них
  4408.   For Each cbrBar In CommandBars
  4409.       If cbrBar.Type = msoBarTypePopup Then
  4410.          ' Порядковый номер
  4411.         Cells(intRow, 1) = cbrBar.Index
  4412.          ' Название
  4413.         Cells(intRow, 2) = cbrBar.Name
  4414.          ' Просмотр всех элементов контекстного меню и вывод _
  4415.           названий этих элементов в ячейки текущей строки
  4416.         For intControl = 1 To cbrBar.Controls.Count
  4417.             Cells(intRow, intControl + 2) = _
  4418.              cbrBar.Controls(intControl).Caption
  4419.          Next intControl
  4420.          ' Переход на следующую строку таблицы
  4421.         intRow = intRow + 1
  4422.       End If
  4423.    Next cbrBar
  4424.  
  4425.    ' Делаем ширину ячеек таблицы оптимальной для просмотра
  4426.   Cells.EntireColumn.AutoFit
  4427. End Sub
  4428. Отображение панели инструментов при определенном условии
  4429. Листинг 3.92. Код в модуле рабочего листа
  4430. Sub Worksheet_Selectiоnchange(ByVal Target As Excel.Range)
  4431.    ' Проверка условия отображения
  4432.   If Union(Target, Range("A1:D5")).Address = _
  4433.     Range("A1:D5").Address Then
  4434.       ' Условие выполнено - можно показывать панель
  4435.      CommandBars("AutoSense").Visible = True
  4436.    Else
  4437.       ' Условие не выполнено - панель нужно скрыть
  4438.      CommandBars("AutoSense").Visible = False
  4439.    End If
  4440. End Sub
  4441. Листинг 3.93. Код в стандартном модуле
  4442. Sub CreatePanel()
  4443.    Dim cbrBar As CommandBar
  4444.    Dim button As CommandBarButton
  4445.    Dim i As Integer
  4446.  
  4447.    ' Удаление одноименной панели (при ее наличии)
  4448.   On Error Resume Next
  4449.    CommandBars("AutoSense").Delete
  4450.    On Error GoTo 0
  4451.  
  4452.    ' Создание панели инструментов
  4453.   Set cbrBar = CommandBars.Add
  4454.    ' Создание кнопок и их настройка
  4455.   For i = 1 To 4
  4456.       Set button = cbrBar.Controls.Add(msoControlButton)
  4457.       With button
  4458.          .OnAction = "Buttоnclick" & i
  4459.          .FaceId = i + 37
  4460.       End With
  4461.    Next i
  4462.    cbrBar.Name = "AutoSense"
  4463. End Sub
  4464.  
  4465. Sub Buttоnclick3()
  4466.    ' Перемещение вниз
  4467.   On Error Resume Next
  4468.    ActiveCell.offset(1, 0).Activate
  4469. End Sub
  4470.  
  4471. Sub Buttоnclick1()
  4472.    ' Перемещение вверх
  4473.   On Error Resume Next
  4474.    ActiveCell.offset(-1, 0).Activate
  4475. End Sub
  4476.  
  4477. Sub Buttоnclick2()
  4478.    ' Перемещение вправо
  4479.   On Error Resume Next
  4480.    ActiveCell.offset(0, 1).Activate
  4481. End Sub
  4482.  
  4483. Sub Buttоnclick4()
  4484.    ' Перемещение влево
  4485.   On Error Resume Next
  4486.    ActiveCell.offset(0, -1).Activate
  4487. End Sub
  4488. Скрытие и отображение панелей инструментов
  4489. Листинг 3.94. Управление отображением панелей инструментов
  4490. Sub HidePanels()
  4491.    Dim cbrBar As CommandBar
  4492.    Dim intRow As Integer       ' Номер текущей строки листа
  4493.  
  4494.    ' Отключение обновления экрана
  4495.   Application.ScreenUpdating = False
  4496.    ' Подготовка к сохранению
  4497.   Cells.Clear
  4498.  
  4499.    ' Скрытие видимых панелей и сохранение их названий
  4500.   intRow = 1       ' Запись имен с первой строки
  4501.   For Each cbrBar In CommandBars
  4502.       If cbrBar.Type = msoBarTypeNormal Then
  4503.          If cbrBar.Visible Then
  4504.             cbrBar.Visible = False
  4505.             Cells(intRow, 1) = cbrBar.Name
  4506.             intRow = intRow + 1
  4507.          End If
  4508.       End If
  4509.    Next
  4510.    ' Включение обновления экрана
  4511.   Application.ScreenUpdating = True
  4512. End Sub
  4513.  
  4514. Sub ShowPanels()
  4515.    Dim cell As Range       ' Текущая ячейка листа
  4516.  
  4517.    ' Отключение обновления экрана
  4518.   Application.ScreenUpdating = False
  4519.    ' Отображение скрытых панелей
  4520.   On Error Resume Next
  4521.    For Each cell In Range("A:A").SpecialCells( _
  4522.     xlCellTypeConstants)
  4523.       CommandBars(cell.Value).Visible = True
  4524.    Next cell
  4525.    ' Включение обновления экрана
  4526.   Application.ScreenUpdating = True
  4527. End Sub
  4528. Создать подсказку к моим кнопкам
  4529. ' Cоздаем тулбар
  4530. Рublic Sub InitToolBar()
  4531. Dim cmdbarSM As CommandBar
  4532. Dim ctlNewBtn As CommandBarButton
  4533.  
  4534.   Set cmdbarSM = CommandBars.Add(Name:="MyToolBar",
  4535.                                  Position:=msoBarFloating, _
  4536.                                  temporary:=True)
  4537.   With cmdbarSM
  4538.     ' 1) Добавляем кнопку
  4539.    Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
  4540.     With ctlNewBtn
  4541.       .FaceId = 26
  4542.       .OnAction = "OnButton1_Click"
  4543.      .TooltipText = "My tooltip message!"
  4544.     End With
  4545.     ' 2) Добавляем ещё кнопку
  4546.    Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
  4547.     With ctlNewBtn
  4548.       .FaceId = 44
  4549.       .OnAction = "OnButton2_Click"
  4550.      .TooltipText = "Another tooltip message!"
  4551.     End With
  4552.     .Visible = True
  4553.   End With
  4554. End Sub
  4555.  
  4556.  
  4557. Создание меню на основе данных рабочего листа
  4558. Листинг 3.95. Код в модуле ЭтаКнига
  4559. Sub Workbook_Open()
  4560.    ' Создание меню
  4561.   Call CreateCustomMenu
  4562. End Sub
  4563. Sub Workbook_BeforeClose(Cancel As Boolean)
  4564.    ' Удаление меню перед закрытием книги
  4565.   Call DeleteCustomMenu
  4566. End Sub
  4567. Листинг 3.96. Код в стандартном модуле
  4568. Sub CreateMenu()
  4569.    Dim sheet As Worksheet          ' Лист с описанием меню
  4570.   Dim intRow As Integer           ' Считываемая строка
  4571.   Dim cbrpBar As CommandBarPopup  ' Выпадающее меню
  4572.   Dim objNewItem As Object        ' Элемент меню cbrpBar
  4573.   Dim objNewSubItem As Object     ' Элемент подменю objNewItem
  4574.   Dim intMenuLevel As Integer     ' Уровень вложенности пункта меню
  4575.   Dim strCaption As String        ' Название пункта меню
  4576.   Dim strAction As String         ' Макрос пункта меню
  4577.   Dim fIsDevider As Boolean       ' Нужен разделитель
  4578.   Dim intNextLevel As Integer     ' Уровень вложенности следующего _
  4579.                                     пункта меню
  4580.   Dim strFaceID As String         ' Номер значка пункта меню
  4581.  
  4582.    ' Расположение данных для меню
  4583.   Set sheet = ThisWorkbook.Sheets("ЛистМеню")
  4584.  
  4585.    ' Удаление одноименного меню (при его наличии)
  4586.   Call DeleteMenu
  4587.  
  4588.    ' Данные считываем со второй строки
  4589.   intRow = 2
  4590.    ' Добавление меню
  4591.   Do Until IsEmpty(sheet.Cells(intRow, 1))
  4592.       ' Считываем информацию о пункте меню
  4593.      With sheet
  4594.          ' Уровень вложенности
  4595.         intMenuLevel = .Cells(intRow, 1)
  4596.          ' Название
  4597.         strCaption = .Cells(intRow, 2)
  4598.          ' Название макроса для меню
  4599.         strAction = .Cells(intRow, 3)
  4600.          ' Нужен ли разделитель перед меню?
  4601.         fIsDevider = .Cells(intRow, 4)
  4602.          ' Номер стандартного значка (если значок нужен)
  4603.         strFaceID = .Cells(intRow, 5)
  4604.          ' Уровень вложенности следующего меню
  4605.         intNextLevel = .Cells(intRow + 1, 1)
  4606.       End With
  4607.       ' Создаем меню в зависимости от уровня его вложенности
  4608.      Select Case intMenuLevel
  4609.          Case 1
  4610.             ' Создаем меню
  4611.            Set cbrpBar = Application.CommandBars(1). _
  4612.              Controls.Add(Type:=msoControlPopup, _
  4613.              Before:=strAction, _
  4614.              Temporary:=True)
  4615.             cbrpBar.Caption = strCaption
  4616.          Case 2
  4617.             ' Создаем элемент меню
  4618.            If intNextLevel = 3 Then
  4619.                ' Следующий элемент вложен в создаваемый, то есть _
  4620.                 создаем раскрывающееся подменю
  4621.               Set objNewItem = _
  4622.                 cbrpBar.Controls.Add(Type:=msoControlPopup)
  4623.             Else
  4624.                ' Создаем команду меню
  4625.               Set objNewItem = _
  4626.                 cbrpBar.Controls.Add(Type:=msoControlButton)
  4627.                objNewItem.OnAction = strAction
  4628.             End If
  4629.             ' Установка названия нового пункта меню
  4630.            objNewItem.Caption = strCaption
  4631.             ' Установка значка нового пункта меню (если нужно)
  4632.            If strFaceID <> "" Then
  4633.                objNewItem.FaceId = strFaceID
  4634.             End If
  4635.             ' Если нужно, то добавим разделитель
  4636.            If fIsDevider Then
  4637.                objNewItem.BeginGroup = True
  4638.             End If
  4639.          Case 3
  4640.             ' Создание элемента подменю
  4641.            Set objNewSubItem = _
  4642.              objNewItem.Controls.Add(Type:=msoControlButton)
  4643.             ' Установка его названия
  4644.            objNewSubItem.Caption = strCaption
  4645.             ' Назначение макроса (или команды)
  4646.            objNewSubItem.OnAction = strAction
  4647.             ' Установка значка (если нужно)
  4648.            If strFaceID <> "" Then
  4649.               objNewSubItem.FaceId = strFaceID
  4650.             End If
  4651.             ' Если нужно, то добавим разделитель
  4652.            If fIsDevider Then
  4653.                objNewSubItem.BeginGroup = True
  4654.             End If
  4655.       End Select
  4656.       ' Переход на следующую строку таблицы
  4657.      intRow = intRow + 1
  4658.    Loop
  4659. End Sub
  4660.  
  4661. Sub DeleteMenu()
  4662.    Dim sheet As Worksheet    ' Лист с описанием меню
  4663.   Dim intRow As Integer     ' Считываемая строка
  4664.   Dim strCaption As String  ' Название меню
  4665.  
  4666.    Set sheet = ThisWorkbook.Sheets("ЛистМеню")
  4667.    ' Данные начинаются со второй строки
  4668.   intRow = 2
  4669.    ' Считываем данные, пока есть значения в столбце "A", _
  4670.     и удаляем созданные ранее меню (с уровнем вложенности 1)
  4671.   On Error Resume Next
  4672.    Do Until IsEmpty(sheet.Cells(intRow, 1))
  4673.       If sheet.Cells(intRow, 1) = 1 Then
  4674.          strCaption = sheet.Cells(intRow, 2)
  4675.          Application.CommandBars(1).Controls(strCaption).Delete
  4676.       End If
  4677.       intRow = intRow + 1
  4678.    Loop
  4679.    On Error GoTo 0
  4680. End Sub
  4681. Создание контекстного меню
  4682. Листинг 3.97. Код в модуле рабочего листа
  4683. Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, _
  4684.  Cancel As Boolean)
  4685.    ' Проверка, попадает ли выделенная ячейка в диапазон
  4686.   If Union(Target.Range("A1"), Range("A2:D5")).Address = _
  4687.     Range("A2:D5").Address Then
  4688.       ' Показываем свое контекстное меню
  4689.      CommandBars("MyContextMenu").ShowPopup
  4690.       Cancel = True
  4691.    End If
  4692. End Sub
  4693. Листинг 3.98. Код в модуле ЭтаКнига
  4694. Sub Workbook_Open()
  4695.    ' Создание контекстного меню при открытии книги
  4696.   Call CreateCustomContextMenu
  4697. End Sub
  4698.  
  4699. Sub Workbook_BeforeClose(Cancel As Boolean)
  4700.    ' Удаление меню при закрытии книги
  4701.   Call DeleteCustomContextMenu
  4702. End Sub
  4703.  
  4704. Код в стандартном модуле
  4705. Sub CreateCustomContextMenu()
  4706.    ' Удаление одноименного меню
  4707.   Call DeleteCustomContextMenu
  4708.  
  4709.    ' Создание меню
  4710.   With CommandBars.Add("MyContextMenu", msoBarPopup, , True).Controls
  4711.       ' Создание и настройка кнопок меню
  4712.      ' Кнопка "Числовой формат"
  4713.      With .Add(msoControlButton)
  4714.          .Caption = "&Числовой формат..."
  4715.          .OnAction = "ShowFormatNumber"
  4716.          .FaceId = 1554
  4717.       End With
  4718.       ' Кнопка "Выравнивание"
  4719.      With .Add(msoControlButton)
  4720.          .Caption = "&Выравнивание..."
  4721.          .OnAction = "ShowFormatAlignment"
  4722.          .FaceId = 217
  4723.       End With
  4724.       ' Кнопка "Шрифт"
  4725.      With .Add(msoControlButton)
  4726.          .Caption = "&Шрифт..."
  4727.          .OnAction = "ShowFormatFont"
  4728.          .FaceId = 291
  4729.       End With
  4730.       ' Кнопка "Границы"
  4731.      With .Add(msoControlButton)
  4732.          .Caption = "&Границы..."
  4733.          .OnAction = "ShowFormatBorder"
  4734.          .FaceId = 149
  4735.          .BeginGroup = True
  4736.       End With
  4737.       ' Кнопка "Узор"
  4738.      With .Add(msoControlButton)
  4739.          .Caption = "&Узор..."
  4740.          .OnAction = "ShowFormatPatterns"
  4741.          .FaceId = 1550
  4742.       End With
  4743.       ' Кнопка "Защита"
  4744.      With .Add(msoControlButton)
  4745.          .Caption = "&Защита..."
  4746.          .OnAction = "ShowFormatProtection"
  4747.          .FaceId = 2654
  4748.       End With
  4749.    End With
  4750. End Sub
  4751. Блокировка контекстного меню
  4752. Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  4753.    Static intCount As Integer     ' Счетчик нажатий кнопки мыши
  4754.   Dim x As Integer, y As Integer
  4755.  
  4756.    ' Блокировать обработку щелчка правой кнопкой мыши
  4757.   Cancel = True
  4758.    ' Отображение текстового поля с количеством щелчков правой _
  4759.     кнопкой мыши
  4760.   x = Target.Left
  4761.    y = Target.Top
  4762.    intCount = intCount + 1
  4763.    ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _
  4764.     x, y, 35, 20).TextFrame.Characters.Text = intCount
  4765. End Sub
  4766.  
  4767. Добавление команды в меню Сервис
  4768. Sub AddMenuItem()
  4769.    Dim cbrpMenu As CommandBarPopup
  4770.  
  4771.    ' Удаление аналогичной команды (при ее наличии)
  4772.   Call DeleteMenuItem
  4773.    ' Получение доступа к меню "Сервис"
  4774.   Set cbrpMenu = CommandBars(1).FindControl(ID:=30007)
  4775.    If cbrpMenu Is Nothing Then
  4776.       ' Не удалось получить доступ
  4777.      MsgBox "Невозможно добавить элемент."
  4778.       Exit Sub
  4779.    Else
  4780.       ' Добавление новой команды в меню
  4781.      With cbrpMenu.Controls.Add(Type:=msoControlButton)
  4782.          ' Название команды
  4783.         .Caption = "Очистить в&се, кроме формул"
  4784.          ' Значок
  4785.         .FaceId = 348
  4786.          ' Сочетание клавиш (только надпись на кнопке)
  4787.         .ShortcutText = "Ctrl+Shift+C"
  4788.          ' Сопоставленный макрос
  4789.         .OnAction = "ExecuteCommand"
  4790.          ' Добавление разделителя перед командой
  4791.         .BeginGroup = True
  4792.       End With
  4793.    End If
  4794.    ' Сопоставление с макросом сочетания клавиш Ctrl+Shift+C
  4795.   Application.MacroOptions _
  4796.     Macro:="ExecuteCommand", _
  4797.     HasShortcutKey:=True, _
  4798.     ShortcutKey:="C"
  4799. End Sub
  4800.  
  4801. Sub ExecuteCommand()
  4802.    ' Очистка содержимого всех ячеек (кроме формул)
  4803.   On Error Resume Next
  4804.    Cells.SpecialCells(xlCellTypeConstants, 23).ClearContents
  4805. End Sub
  4806.  
  4807. Sub DeleteMenuItem()
  4808.    ' Удаление команды из меню
  4809.   On Error Resume Next
  4810.    CommandBars(1).FindControl(ID:=30007). _
  4811.     Controls("Очистить в&се, кроме формул").Delete
  4812. End Sub
  4813. Добавление команды в меню Вид
  4814. Листинг 3.110. Код в стандартном модуле
  4815. Dim AppObject As New Class1
  4816.  
  4817. Sub AddCommand()
  4818.    Dim cbrpBar As CommandBarPopup
  4819.  
  4820.    ' Удаление аналогичной команды (при ее наличии)
  4821.   Call DeleteCommand
  4822.    ' Получение доступа к меню "Вид"
  4823.   Set cbrpBar = CommandBars(1).FindControl(ID:=30004)
  4824.    If cbrpBar Is Nothing Then
  4825.       ' Не удалось получить доступ к меню
  4826.      MsgBox "Невозможно добавить элемент меню."
  4827.       Exit Sub
  4828.    Else
  4829.       ' Добавление команды
  4830.      With cbrpBar.Controls.Add(Type:=msoControlButton)
  4831.          .Caption = "&Линии сетки"
  4832.          .OnAction = "GhangeGridlinesState"
  4833.       End With
  4834.    End If
  4835.    ' Даем объекту AppObject обрабатывать события
  4836.   Set AppObject.AppEvents = Application
  4837. End Sub
  4838.  
  4839. Sub DeleteCommand()
  4840.    ' Удаление каманды из меню (если она там есть)
  4841.   On Error Resume Next
  4842.    CommandBars(1).FindControl(ID:=30004). _
  4843.     Controls("&Линии сетки").Delete
  4844. End Sub
  4845.  
  4846. Sub GhangeGridlinesState()
  4847.    ' Изменение состояния отображения линий сетки _
  4848.     на противоположное (если нет - покажем, если есть - скроем)
  4849.   If TypeName(ActiveSheet) = "Worksheet" Then
  4850.       ActiveWindow.DisplayGridlines = _
  4851.        Not ActiveWindow.DisplayGridlines
  4852.       ' Установка или снятие флажка в меню
  4853.      Call CheckGridlines
  4854.    End If
  4855. End Sub
  4856.  
  4857. Sub CheckGridlines()
  4858.    Dim button As CommandBarButton
  4859.    On Error Resume Next
  4860.    ' Поиск команды "Линии сетки" в меню "Вид"
  4861.   Set button = CommandBars(1).FindControl(ID:=30004). _
  4862.     Controls("&Линии сетки")
  4863.    ' Изменение состояния флажка на противоположное
  4864.   If ActiveWindow.DisplayGridlines Then
  4865.       ' Установка
  4866.      button.State = msoButtonDown
  4867.    Else
  4868.       ' Снятие
  4869.      button.State = msoButtonUp
  4870.    End If
  4871. End Sub
  4872.  
  4873.  
  4874. Создание панели со списком
  4875. Sub DeleteCustomContextMenu()
  4876.    ' Удаление меню
  4877.   On Error Resume Next
  4878.    CommandBars("MyContextMenu").Delete
  4879. End Sub
  4880.  
  4881. Sub ShowFormatNumber()
  4882.    ' Число
  4883.   Application.Dialogs(xlDialogFormatNumber).Show
  4884. End Sub
  4885. Sub ShowFormatAlignment()
  4886.    ' Выравнивание
  4887.   Application.Dialogs(xlDialogAlignment).Show
  4888. End Sub
  4889. Sub ShowFormatFont()
  4890.    ' Шрифт
  4891.   Application.Dialogs(xlDialogFormatFont).Show
  4892. End Sub
  4893. Sub ShowFormatBorder()
  4894.    ' Граница
  4895.   Application.Dialogs(xlDialogBorder).Show
  4896. End Sub
  4897. Sub ShowFormatPatterns()
  4898.    ' Вид (Узор)
  4899.   Application.Dialogs(xlDialogPatterns).Show
  4900. End Sub
  4901. Sub ShowFormatProtection()
  4902.    ' Защита
  4903.   Application.Dialogs(xlDialogCellProtection).Show
  4904. End Sub
  4905. Sub CreatePanel()
  4906.    Dim i As Integer
  4907.  
  4908.    On Error Resume Next
  4909.    ' Удаление одноименной панели (если есть)
  4910.   CommandBars("Список месяцев").Delete
  4911.    On Error GoTo 0
  4912.    ' Создание панели "Список месяцев"
  4913.   With CommandBars.Add
  4914.       .Name = "Список месяцев"
  4915.       ' Создание списка месяцев
  4916.      With .Controls.Add(Type:=msoControlDropdown)
  4917.          ' Настройка (имя, макрос, стиль)
  4918.         .Caption = "DateDD"
  4919.          .OnAction = "SetMonth"
  4920.          .Style = msoButtonAutomatic
  4921.          ' Добавление в список названий месяцев
  4922.         For i = 1 To 12
  4923.             .AddItem Format(DateSerial(1, i, 1), "mmmm")
  4924.          Next i
  4925.          ' Выделение первого месяца
  4926.         .ListIndex = 1
  4927.       End With
  4928.       ' Показываем созданную панель
  4929.      .Visible = True
  4930.    End With
  4931. End Sub
  4932.  
  4933. Sub SetMonth()
  4934.    ' Перенос названия выделенного месяца в ячейку
  4935.   On Error Resume Next
  4936.    With CommandBars("Список месяцев").Controls("DateDD")
  4937.       ActiveCell.Value = .List(.ListIndex)
  4938.    End With
  4939. End Sub
  4940. Мультфильм с помощником в главной роли
  4941. Листинг 4.1. «Танцующий» помощник
  4942. Sub RunAssistantDance()
  4943.    Static intAction As Integer
  4944.    ' Заставляем помощника выполнять действие (всего 16)
  4945.   DoAssistantAction intAction
  4946.    intAction = intAction + 1
  4947.    If intAction < 16 Then
  4948.       ' Следующее действие через 3 секунды
  4949.      Application.OnTime Time + TimeValue("00:00:3"), _
  4950.        "RunAssistantDance"
  4951.    End If
  4952. End Sub
  4953.  
  4954. Sub DoAssistantAction(intAction As Integer)
  4955.    Dim astAssistant As Assistant
  4956.    Set astAssistant = Application.Assistant
  4957.  
  4958.    ' Помещаем помощника в центр активного окна
  4959.   astAssistant.Top = Application.ActiveWindow.Top _
  4960.     + Application.ActiveWindow.Height / 2
  4961.    astAssistant.Left = Application.ActiveWindow.Left _
  4962.     + Application.ActiveWindow.Width / 2
  4963.    ' Показываем помощника
  4964.   astAssistant.On = True
  4965.    astAssistant.Visible = True
  4966.  
  4967.    ' Показываем заданное параметром intAction действие
  4968.   Select Case intAction
  4969.       Case 0
  4970.          astAssistant.Animation = msoAnimationAppear
  4971.       Case 1
  4972.          astAssistant.Animation = msoAnimationCheckingSomething
  4973.       Case 2
  4974.          astAssistant.Animation = msoAnimationBeginSpeaking
  4975.       Case 3
  4976.          astAssistant.Animation = msoAnimationCharacterSuccessMajor
  4977.       Case 4
  4978.          astAssistant.Animation = msoAnimationEmptyTrash
  4979.       Case 5
  4980.          astAssistant.Animation = msoAnimationGestureDown
  4981.       Case 5
  4982.          astAssistant.Animation = msoAnimationGestureLeft
  4983.       Case 6
  4984.          astAssistant.Animation = msoAnimationGestureRight
  4985.       Case 7
  4986.          astAssistant.Animation = msoAnimationGestureUp
  4987.       Case 8
  4988.          astAssistant.Animation = msoAnimationGetArtsy
  4989.       Case 9
  4990.          astAssistant.Animation = msoAnimationGetAttentionMajor
  4991.       Case 10
  4992.          astAssistant.Animation = msoAnimationGetAttentionMinor
  4993.       Case 11
  4994.          astAssistant.Animation = msoAnimationGetTechy
  4995.       Case 12
  4996.          astAssistant.Animation = msoAnimationGetWizardy
  4997.       Case 13
  4998.          astAssistant.Animation = msoAnimationGoodbye
  4999.       Case 14
  5000.          astAssistant.Animation = msoAnimationGreeting
  5001.       Case 15
  5002.          astAssistant.Animation = msoAnimationDisappear
  5003.    End Select
  5004. End Sub
  5005. Дополнение помощника текстом, заголовком, кнопкой и значком
  5006. Листинг 4.2. Настройка помощника
  5007. Sub AssistantMessage()
  5008.    Dim strTitle As String    ' Заголовок сообщения
  5009.   Dim strMessage As String  ' Текст сообщения
  5010.  
  5011.    ' Содержимое заголовка и текста в окне помощника
  5012.   strTitle = "Спрашивайте - ответим"
  5013.    strMessage = "{cf 249}{ul 1} Руки мыли{ul 0}?" _
  5014.     & vbCr & "{cf 6} Не забыть обновить антивирус!"
  5015.  
  5016.    ' Настраиваем помощника
  5017.   With Application.Assistant
  5018.       ' Включаем и показываем помощника
  5019.      .On = True
  5020.       .Visible = True
  5021.       ' Создаем окно сообщения
  5022.      With .NewBalloon
  5023.          .BalloonType = msoBalloonTypeButtons
  5024.          ' Кнопка "ОК" в окне помощника
  5025.         .button = msoButtonSetOK
  5026.          ' Значок в окне помощника
  5027.         .Icon = msoIconAlert
  5028.          ' Заголовок в окне помощника
  5029.         .Heading = strTitle
  5030.          ' Текст в окне помощника
  5031.         .Text = strMessage
  5032.          ' Отображение окна
  5033.         .Show
  5034.       End With
  5035.    End With
  5036. End Sub
  5037. Новые параметры помощника
  5038. Листинг 4.3. Новые параметры помощника
  5039. Sub AssistantCheckboxes()
  5040.    Dim i As Integer
  5041.    Dim strMessage As String
  5042.  
  5043.    With Assistant
  5044.       ' Включение и отображение помощника
  5045.      .On = True
  5046.       .Visible = True
  5047.       ' Создание окна сообщения
  5048.      With .NewBalloon
  5049.          ' Настройка окна...
  5050.         ' Тип окна
  5051.         .BalloonType = msoBalloonTypeButtons
  5052.          ' Заголовок
  5053.         .Heading = "Выберите страну"
  5054.          ' Добавление флажков
  5055.         .CheckBoxes(1).Text = "Россия"
  5056.          .CheckBoxes(2).Text = "США"
  5057.          .CheckBoxes(3).Text = "Южная Африка"
  5058.          .button = msoButtonSetOkCancel
  5059.  
  5060.          ' Отображение окна
  5061.         If .Show = msoBalloonButtonOK Then
  5062.             ' Вывод информационного окна в зависимости _
  5063.              от установленных флажков
  5064.            For i = 1 To 3
  5065.                If .CheckBoxes(i).Checked Then
  5066.                   strMessage = strMessage & _
  5067.                    .CheckBoxes(i).Text & vbCr
  5068.                End If
  5069.             Next
  5070.             ' Отображение окна сообщения (имеется в виду _
  5071.              стандартное окно)
  5072.            If Len(strMessage) = 0 Then
  5073.                MsgBox "No choice."
  5074.             Else
  5075.                MsgBox strMessage
  5076.             End If
  5077.          End If
  5078.       End With
  5079.    End With
  5080. End Sub
  5081. Использование помощника для выбора цвета заливки
  5082. Листинг 4.4. Выбор цвета заливки рабочего листа
  5083. Sub AssistantChooseColor()
  5084.    Dim intChoise As Integer
  5085.  
  5086.    With Assistant
  5087.       ' Включение и отображение помощника
  5088.      .On = True
  5089.       .Visible = True
  5090.       With .NewBalloon
  5091.          ' Настройка окна...
  5092.         ' Тип
  5093.         .BalloonType = msoBalloonTypeButtons
  5094.          ' Заголовок
  5095.         .Heading = "Какой нужен цвет?"
  5096.          ' Первый цвет
  5097.         .Labels(1).Text = "Красный"
  5098.          ' Второй цвет
  5099.         .Labels(2).Text = "Желтый"
  5100.          ' Третий цвет
  5101.         .Labels(3).Text = "Зеленый"
  5102.          ' Тип кнопок
  5103.         .button = msoButtonSetNone
  5104.          ' Оображение окна
  5105.         intChoise = .Show
  5106.  
  5107.          ' Информационное сообщение о выбранном цвете
  5108.         MsgBox "Выбран: " & .Labels(intChoise).Text
  5109.       End With
  5110.    End With
  5111.  
  5112.    ' Настройка цветов ячеек (присвоение выбранного цвета)
  5113.   Select Case intChoise
  5114.       Case 1
  5115.          ' Красный цвет
  5116.         ActiveSheet.Cells.Interior.Color = RGB(255, 0, 0)
  5117.       Case 2
  5118.          ' Желтый цвет
  5119.         ActiveSheet.Cells.Interior.Color = RGB(255, 255, 0)
  5120.       Case 3
  5121.          ' Зеленый цвет
  5122.         ActiveSheet.Cells.Interior.Color = RGB(0, 255, 0)
  5123.    End Select
  5124. End Sub
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.  
  5144.  
  5145.  
  5146.  
  5147. ГЛАВА . ДИАЛОГОВЫЕ ОКНА
  5148. Функция INPUTBOX (через ввод значения)
  5149. Public Sub ИнпутБокс()
  5150. Dim Текст As Variant
  5151. MsgBox "Если в InputBox нажать Отмена, в ячейке будут удалены все данные"
  5152. Текст = InputBox("Введите текст", "Окно ввода текста", "222")
  5153. MsgBox Текст
  5154.  
  5155. If Текст <> "" Then
  5156. Range("H7") = Текст
  5157. MsgBox "Как сделать так, чтобы при выборе пользователем в InputBox - Отмена он закрывался и прекращалось выполнение процедуры?"
  5158. Else
  5159. Exit Sub
  5160. End If
  5161. End Sub
  5162. Вызов предварительного просмотра
  5163. Sub Test()
  5164.  With Application.Workbooks.Item("Test.xls")
  5165.  Sheets("Test").PrintPreview
  5166.  End With
  5167. End Sub
  5168.  
  5169. Настройка ввода данных в диалоговом окне
  5170. Sub DialogInputData()
  5171.    Dim intMin As Integer, intMax As Integer ' Диапазон значений
  5172.   Dim strInput As String                   ' Введенная пользователем строка
  5173.   Dim strMessage As String
  5174.    Dim intValue As Integer
  5175.  
  5176.    intMin = 1    ' Минимальное значение
  5177.   intMax = 50   ' Максимальное значение
  5178.   strMessage = "Введите значение от " & intMin & " до " & intMax
  5179.    ' Ввод значения (цикл завершается, когда пользователь вводит _
  5180.     значение из заданного диапазона или отменяет ввод)
  5181.   Do
  5182.       strInput = InputBox(strMessage)
  5183.       If strInput = "" Then Exit Sub   ' Отмена ввода
  5184.      ' Проверка, содержит ли введенная пользователем строка число
  5185.      If IsNumeric(strInput) Then
  5186.          intValue = CInt(strInput)
  5187.          ' Проверка, удовлетворяет ли значение диапазону
  5188.         If intValue >= intMin And intValue <= intMax Then
  5189.             ' Все условия выполнены
  5190.            Exit Do
  5191.          End If
  5192.       End If
  5193.       ' Формирование сообщения с текстом ошибки
  5194.      strMessage = "Вы ввели некорректное значение." & vbNewLine & _
  5195.        "Введите число от " & intMin & " до " & intMax
  5196.    Loop
  5197.    ' Внесение данных в ячейку
  5198.   ActiveSheet.Range("A1").Value = strInput
  5199. End Sub
  5200. Открытие диалогового окна (“Открыть файл”)_1
  5201.  
  5202. Sub Test()
  5203.   Application.Dialogs(xlDialogOpen).Show "*.dbf"
  5204. End Sub
  5205. Открытие диалогового окна (“Открыть файл”)_2
  5206. fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
  5207. If fileToOpen <> False Then
  5208.   MsgBox "Open " & fileToOpen
  5209. End If
  5210. Открытие диалогового окна (“Печать”)
  5211. Application.Dialogs(xlDialogPrint).Show
  5212. Другие диалоговые окна
  5213. xlDialogClear - очистка ячейки или диапазона
  5214. xlDialogDisplay - параметры отображения ячеек
  5215. xlDialogFileDelete - удаление файла
  5216. xlDialogSaveWorkbook - сохранить книгу
  5217. xlDialogSearch - поиск в документе
  5218. xlDialogWorkbookName - переименование листа
  5219.  
  5220.  
  5221. Вызов броузера из Экселя
  5222. Надо создать кнопку которой добавить код:
  5223. Sub Button1_Click()
  5224.     Call ShellExecute(GetDesktopWindow, "Open", "www.armentel.com/avb", "", "c:\", SW_SHOWNORMAL)
  5225. End Sub
  5226.  
  5227. и Функция:
  5228.     Private Declare Function ShellExecute& Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As ****, ByVal _
  5229.     lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
  5230.     ByVal nShowCmd As ****)
  5231.    
  5232.     Private Declare Function GetDesktopWindow Lib "user32" () As ****
  5233.    
  5234.     Const SW_SHOWNORMAL = 1
  5235. Диалоговое окно ввода данных
  5236. Sub InputDialog()
  5237.    Dim strInput As String
  5238.    ' Вызов стандартного диалогового окна ввода данных
  5239.   strInput = InputBox("Введите данные", "Ввод данных")
  5240. End Sub
  5241. Диалоговое окно настройки шрифта
  5242. Sub ShowFontDialog()
  5243.    ' Вызов стандартного окна настройки шрифта текущей ячейки
  5244.   Application.Dialogs(xlDialogActiveCellFont).Show
  5245. End Sub
  5246.  
  5247. Значения по умолчанию
  5248. Sub NewInputDialog()
  5249.    Dim strInput As String
  5250.    ' Вызов стандартного диалогового окна ввода со значением _
  5251.     по умолчанию
  5252.   strInput = InputBox("Введите данные", "Ввод данных", _
  5253.     "Значение по умолчанию", 200, 200)
  5254. End Sub
  5255.  
  5256. ГЛАВА .ФОРМАТИРОВАНИЕ ТЕКСТА. ТАБЛИЦЫ. ГРАНИЦЫ И ЗАЛИВКА.
  5257. Вывод списка доступных шрифтов
  5258. Листинг 3.104. Список шрифтов
  5259. Sub ListOfFonts()
  5260.    Dim cbrcFonts As CommandBarControl
  5261.    Dim cbrBar As CommandBar
  5262.    Dim i As Integer
  5263.  
  5264.    ' Получение доступа к списку шрифтов (элемент управления в виде _
  5265.     раскрывающегося списка на панели инструментов "Форматирование")
  5266.   Set cbrcFonts = Application.CommandBars("Formatting"). _
  5267.     FindControl(ID:=1728)
  5268.    If cbrcFonts Is Nothing Then
  5269.       ' Панель "Форматирование" не открыта - откроем ее
  5270.      Set cbrBar = Application.CommandBars.Add
  5271.       Set cbrcFonts = cbrBar.Controls.Add(ID:=1728)
  5272.    End If
  5273.    ' Подготовка к выводу шрифтов (очистка ячеек)
  5274.   Range("A:A").ClearContents
  5275.    ' Вывод списка шрифтов в столбец "A" текущего листа
  5276.   For i = 0 To cbrcFonts.ListCount - 1
  5277.       Cells(i + 1, 1) = cbrcFonts.List(i + 1)
  5278.    Next i
  5279.    ' Закрытие панели инструментов "Форматирование", если мы были _
  5280.     вынуждены ее открывать
  5281.   On Error Resume Next
  5282.    cbrBar.Delete
  5283. End Sub
  5284. Выбор из текста всех чисел
  5285. Листинг 2.48. Функция ExtractNumeric
  5286. Function ExtractNumeric(iCell)
  5287.    ' Анализируется каждый символ входной строки iCell
  5288.   For iCount = 1 To Len(iCell)
  5289.       ' Проверка, является ли анализируемый символ числом
  5290.      If IsNumeric(Mid(iCell, iCount, 1)) = True Then
  5291.          ' Число добавляется в выходную строку
  5292.         ExtractNumeric = ExtractNumeric & Mid(iCell, iCount, 1)
  5293.       End If
  5294.    Next
  5295. End Function
  5296. Прописная буква только в начале текста
  5297. Листинг 2.49. Функция ПрописнНач
  5298. Function ПрописнНач(Текст)
  5299.    ' Пустой текст функция не обрабатывает
  5300.   If Текст = "" Then ПрописнНач = "<>": Exit Function
  5301.    ' Выделение первого символа и перевод его в верхний регистр
  5302.   ПервыйСимвол = UCase(Left(Текст, 1))
  5303.    ' Выделение остальной части строки и перевод _
  5304.     ее в нижний регистр
  5305.   Обрубок = LCase(Mid(Текст, 2))
  5306.    ' Соединение частей строки и возврат значения
  5307.   ПрописнНач = ПервыйСимвол & Обрубок
  5308. End Function
  5309.  
  5310. Подсчет количества повторов искомого текста
  5311. Листинг 2.51. Функция CoincideCount
  5312. Function CoincideCount(Text, Search)
  5313.    ' Проверка правильности входных данных _
  5314.     (аргумента Search)
  5315.   If IsArray(Search) = True Then Exit Function
  5316.    If IsError(Search) = True Then Exit Function
  5317.    If IsEmpty(Search) = True Then Exit Function
  5318.  
  5319.    ' Просмотр заданного в параметре Text диапазона
  5320.   For Each iCell In Text
  5321.       ' Анализируются только ячейки, содержащие _
  5322.        корректные значения
  5323.      If Not IsError(iCell) Then
  5324.          ' iText - строка для просмотра (в нижнем регистре)
  5325.         iText = LCase(iCell)
  5326.          ' iSearch - искомое значение (в нижнем регистре)
  5327.         iSearch = LCase(Search)
  5328.          ' Длина искомой строки
  5329.         iLen = Len(Search)
  5330.  
  5331.          ' Первый поиск строки iSearch в строке iText _
  5332.           (этот и последующий поиски производятся без _
  5333.           учета регистра символов)
  5334.         iNumber = InStr(iText, iSearch)
  5335.          While iNumber > 0
  5336.             ' Поиск следующего вхождения строки
  5337.            iNumber = InStr(iNumber + iLen, iText, iSearch)
  5338.             ' Подсчет количества вхождений
  5339.            CoincideCount = CoincideCount + vbNull
  5340.          Wend
  5341.       End If
  5342.    Next
  5343. End Function
  5344.  
  5345. Выделение из текста произвольного элемента
  5346. Листинг 2.76. Выделение элемента текста
  5347. Function dhGetTextItem(ByVal strTextIn As String, intItem As _
  5348.  Integer, strSeparator As String) As String
  5349.    Dim intStart As Integer ' Позиция начала текущего элемента
  5350.   Dim intEnd As Integer   ' Позиция конца текущего элемента
  5351.   Dim i As Integer        ' Номер текущего элемента
  5352.  
  5353.    ' Проверка корректности номера элемента
  5354.   If intItem < 1 Then Exit Function
  5355.  
  5356.    ' Убираются лишние пробелы, если разделитель - пробел
  5357.   If strSeparator = " " Then strTextIn = Application.Trim(strTextIn)
  5358.    ' Разделитель добавляется в конец строки
  5359.   If Right(strTextIn, Len(strTextIn)) <> strSeparator Then _
  5360.       strTextIn = strTextIn & strSeparator
  5361.  
  5362.    ' Поиск всех элементов в строке до нужного
  5363.   For i = 1 To intItem
  5364.       ' Начало элемента (перемещение вперед по строке)
  5365.      intStart = intEnd + 1
  5366.       ' Конец элемента
  5367.      intEnd = InStr(intStart, strTextIn, strSeparator)
  5368.  
  5369.       If (intEnd = 0) Then
  5370.          ' Дошли до конца строки, но элемент не нашли
  5371.         Exit Function
  5372.       End If
  5373.    Next i
  5374.    ' Выделение текста из входной строки
  5375.   dhGetTextItem = Mid(strTextIn, intStart, intEnd - intStart)
  5376. End Function
  5377. Отображение текста «задом наперед»
  5378. Листинг 2.71. Преобразование текста в обратном порядке
  5379. Function dhReverseText(strText As String) As String
  5380.    Dim i As Integer
  5381.    ' Переписываем символы из входной строки в выходную _
  5382.     в обратном порядке
  5383.   For i = Len(strText) To 1 Step -1
  5384.       dhReverseText = dhReverseText & Mid(strText, i, 1)
  5385.    Next i
  5386. End Function
  5387.  
  5388. Sub ReverseText()
  5389.    Dim strText As String
  5390.    ' Ввод строки посредством стандартного окна ввода
  5391.   strText = InputBox("Введите текст:")
  5392.    ' Реверсия строки и вывод результата
  5393.   MsgBox dhReverseText(strText), , strText
  5394. End Sub
  5395. Англоязычный текст — заглавными буквами
  5396. Листинг 2.70. Английский текст — в верхнем регистре
  5397. Function dhFormatEnglish(strText As String) As String
  5398.    Dim i As Integer
  5399.    Dim strCurChar As String * 1
  5400.    ' Анализируется каждый символ строки strText. Каждый символ _
  5401.     латинского алфавита преобразуется в верхний регистр
  5402.   For i = 1 To Len(strText)
  5403.       strCurChar = Mid(strText, i, 1)
  5404.       ' Код латинских строчных символов лежит в пределах _
  5405.        от 97 до 122
  5406.      If Asc(strCurChar) >= 97 And Asc(strCurChar) <= 122 Then
  5407.          ' Переводим символ в верхний регистр
  5408.         dhFormatEnglish = dhFormatEnglish & UCase(strCurChar)
  5409.       Else
  5410.          ' Просто добавляем символ в выходную строку
  5411.         dhFormatEnglish = dhFormatEnglish & strCurChar
  5412.       End If
  5413.    Next i
  5414. End Function
  5415.  
  5416. Запуск таблицы символов из Excel
  5417. Листинг 3.106. Вызов таблицы символов
  5418. Sub ShowSymbolTable()
  5419.    On Error Resume Next
  5420.    ' Запуск Charmap.exe - таблицы символов
  5421.   Shell "Charmap.exe", vbNormalFocus
  5422.    If Err <> 0 Then
  5423.       MsgBox "Невозможно запустить таблицу символов.", vbCritical
  5424.    End If
  5425. End Sub
  5426. Листинг 3.107. Таблица символов
  5427. ' Декларация API-функций:
  5428. ' для открытия процесса
  5429. Declare Function OpenProcess Lib "kernel32" _
  5430.  (ByVal dwDesiredAccess As ****, ByVal bInheritHandle As ****, _
  5431.  ByVal dwProcessId As ****) As ****
  5432. ' для получения кода завершения процесса
  5433. Declare Function GetExitCodeProcess Lib "kernel32" _
  5434.  (ByVal hProcess As ****, lpExitCode As ****) As ****
  5435. ' для закрытия процесса
  5436. Declare Function CloseHandle Lib "kernel32" _
  5437.  (hProcess) As ****
  5438.  
  5439. Sub ShowSymbolTable1()
  5440.    Dim lProcessID As ****
  5441.    Dim hProcess As ****
  5442.    Dim lExitCode As ****
  5443.  
  5444.    On Error Resume Next
  5445.    ' Запуск таблицы символов (Charman.exe). Функция возвращает _
  5446.     идентификатор созданного процесса
  5447.   lProcessID = Shell("Charmap.exe", 1)
  5448.    If Err <> 0 Then
  5449.       MsgBox "Нельзя запустить Charman.exe", vbCritical, "Ошибка"
  5450.       Exit Sub
  5451.    End If
  5452.    ' Открытие процесса по идентификатору (lProcessID). Функция _
  5453.     возвращает дескриптор процесса (handle)
  5454.   hProcess = OpenProcess(&H400, False, lProcessID)
  5455.    ' Ждем, пока процесс завершится, для этого периодически _
  5456.     получаем код завершения процесса (пока Charman.exe исполняется, _
  5457.     функция GetExitCodeProcess возвращает &H103)
  5458.   Do
  5459.       GetExitCodeProcess hProcess, lExitCode
  5460.       DoEvents
  5461.    Loop While lExitCode = &H103
  5462.    ' Закрытие процесса
  5463.   CloseHandle (hProcess)
  5464.    ' Вывод на экран информационного сообщения
  5465.   MsgBox "Charmap.exe завершает свою работу"
  5466. End Sub
  5467.  
  5468. Листинг 3.64. Формат «два знака после запятой»
  5469. Sub ChangeNumberFormat()
  5470.    Selection.NumberFormat = "0.00"
  5471. End Sub
  5472. Листинг 3.65. Использование разделителя по разрядам
  5473. Sub ThreeNullSepatator()
  5474.    Selection.NumberFormat = "#,##"
  5475. End Sub
  5476. Листинг 3.66. Изменение формата
  5477. Sub ChangeNumerFormatEx()
  5478.    Selection.NumberFormat = "#,##0.00"
  5479. End Sub
  5480. Листинг 3.67. Помещение последнего символа над строкой
  5481. Sub LastCharUp()
  5482.    ' Изменение расположения последнего символа ячейки
  5483.   With ActiveCell.Characters(Start:=Len(Selection), Length:=1).Font
  5484.       .Supersсriрt = True
  5485.    End With
  5486. End Sub
  5487. Листинг 3.68. Нестандартная рамка
  5488. Sub ChangeSelGrid()
  5489.    ' Оформление границ выделения
  5490.   ' Левая граница
  5491.   With Selection.Borders(xlEdgeLeft)
  5492.       .LineStyle = xlContinuous
  5493.       .Weight = xlThin
  5494.       .ColorIndex = xlAutomatic
  5495.    End With
  5496.    ' Правая граница
  5497.   With Selection.Borders(xlEdgeRight)
  5498.       .LineStyle = xlContinuous
  5499.       .Weight = xlThin
  5500.       .ColorIndex = xlAutomatic
  5501.    End With
  5502.    ' Верхняя граница
  5503.   With Selection.Borders(xlEdgeTop)
  5504.       .LineStyle = xlContinuous
  5505.       .Weight = xlThin
  5506.       .ColorIndex = xlAutomatic
  5507.    End With
  5508.    ' Нижняя граница
  5509.   With Selection.Borders(xlEdgeBottom)
  5510.       .LineStyle = xlContinuous
  5511.       .Weight = xlThin
  5512.       .ColorIndex = xlAutomatic
  5513.    End With
  5514.  
  5515.    ' Изменение сетки внутри выделения
  5516.   ' Вертикальные линии сетки
  5517.   With Selection.Borders(xlInsideVertical)
  5518.       .LineStyle = xlContinuous
  5519.       .Weight = xlHairline
  5520.       .ColorIndex = xlAutomatic
  5521.    End With
  5522.    ' Горизонтальные линии сетки
  5523.   With Selection.Borders(xlInsideHorizontal)
  5524.       .LineStyle = xlContinuous
  5525.       .Weight = xlHairline
  5526.       .ColorIndex = xlAutomatic
  5527.    End With
  5528. End Sub
  5529.  
  5530. ГЛАВА ИНФОРМАЦИЯ О ПОЛЬЗОВАТЕЛЕ, КОМПЬЮТЕРЕ, ПРИНТЕРЕ И Т.Д.
  5531. Получить имя пользователя
  5532. Логин юзера получить просто:
  5533. Dim UserName As String
  5534. UserName = CreateObject("Wsсriрt.Network").UserName
  5535. А как отслеживать - вариатнов много.
  5536. Я, например, просто не выполняю макрос, если логин не тот:
  5537. If ThisWorkbook.Sheets("Rules").Range("Admin").Find(CreateObject("Wsсriрt.Network").UserName, _
  5538. LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then Exit Sub
  5539. [ответить с цитированием]
  5540. Drony
  5541. 14.12.2007, 10:55
  5542. Спасибо, за ответ.
  5543. Я тоже нашел эту заветную строку
  5544. MsgBox "Имя пользователя : " & CreateObject("Wsсriрt.Network").UserNam
  5545.  
  5546. CreateObject("Wsсriрt.Network").UserName вместо Application.UserName
  5547. Вывод разрешения монитора
  5548. Листинг 3.73. Разрешение монитора
  5549. 'Объявление API-функции
  5550. Declare Function GetSystemMetrics Lib "user32" _
  5551.  (ByVal nIndex As ****) As ****
  5552. ' Константы, которые передаются в функцию для определения _
  5553.  горизонтального и вертикального размеров изображения
  5554. Const SM_CXSCREEN = 0
  5555. Const SM_CYSCREEN = 1
  5556.  
  5557. Sub GetMonitorResolution()
  5558.    Dim lngHorzRes As ****
  5559.    Dim lngVertRes As ****
  5560.  
  5561.    ' Получение ширины и высоты изображения на мониторе
  5562.   lngHorzRes = GetSystemMetrics(SM_CXSCREEN)
  5563.    lngVertRes = GetSystemMetrics(SM_CYSCREEN)
  5564.    ' Отображение сообщения
  5565.   MsgBox "Текущее разрешение: " & lngHorzRes & "x" & lngVertRes
  5566. End Sub
  5567.  
  5568. Получение информации об используемом принтере
  5569. Информация о принтере
  5570. ' Объявление API-функции
  5571. Declare Function GetProfileStringA Lib "kernel32" _
  5572.  (ByVal lpAppName As String, ByVal lpKeyName As String, _
  5573.  ByVal lpDefault As String, ByVal lpReturnedString As _
  5574.  String, ByVal nSize As ****) As ****
  5575.  
  5576. Sub Принтер()
  5577.    Dim strFullInfo As String * 255  ' Буфер для API-функции
  5578.   Dim strInfo As String            ' Строка с полной информацией
  5579.   Dim strPrinter As String         ' Название принтера
  5580.   Dim strDriver As String          ' Драйвер принтера
  5581.   Dim strPort As String            ' Порт принтера
  5582.   Dim strMessage As String
  5583.    Dim intPrinterEndPos As Integer
  5584.    Dim intDriverEndPos As Integer
  5585.  
  5586.    ' Заполнение буфера пробелами
  5587.   strFullInfo = Space(255)
  5588.    ' Получение полной информации о принтере
  5589.   Call GetProfileStringA("Windows", "Device", "", strFullInfo, 254)
  5590.  
  5591.    ' Удаление лишних символов из конца возвращенной строки
  5592.   ' Строка strInfo имеет формат <имя_принтера>,<драйвер>,<порт>:
  5593.   strInfo = Trim(strFullInfo)
  5594.  
  5595.    ' Поиск запятых в строке (окончаний названий принтера и драйвера)
  5596.   intPrinterEndPos = Application.Find(",", strInfo, 1)
  5597.    intDriverEndPos = Application.Find(",", strInfo, intPrinterEndPos + 1)
  5598.  
  5599.    ' Определение названия принтера
  5600.   strPrinter = Left(strInfo, intPrinterEndPos - 1)
  5601.    ' Определение драйвера
  5602.   strDriver = Mid(strInfo, intPrinterEndPos + 1, intDriverEndPos _
  5603.     - intPrinterEndPos - 1)
  5604.    ' Определение порта (его название заканчивается символом ":")
  5605.   strPort = Mid(strInfo, intDriverEndPos + 1, InStr(1, strInfo, ":") _
  5606.     - intDriverEndPos - 1)
  5607.  
  5608.    ' Формирование информационного сообщения
  5609.   strMessage = "Принтер:" & Chr(9) & strPrinter & Chr(13)
  5610.    strMessage = strMessage & "Драйвер:" & strDriver & Chr(13)
  5611.    strMessage = strMessage & "strPort:" & Chr(9) & strPort
  5612.    ' Вывод информационного сообщения
  5613.   MsgBox strMessage, vbInformation, "Сведения о принтере по умолчанию"
  5614. End Sub
  5615. Просмотр информации о дисках компьютера
  5616. Sub DrivesInfo()
  5617.    Dim objFileSysObject As Object  ' Объект для работы _
  5618.                                     с файловой системой
  5619.   Dim objDrive As Object          ' Анализируемый диск
  5620.   Dim intRow As Integer           ' Заполняемая строка листа
  5621.  
  5622.    ' Создание объекта для работы с файловой системой
  5623.   Set objFileSysObject = CreateObject("sсriрting.FileSystemObject")
  5624.    ' Очистка листа
  5625.   Cells.Clear
  5626.    ' Запись с первой строки
  5627.   intRow = 1
  5628.    ' Запись на лист информации о дисках компьютера
  5629.   On Error Resume Next
  5630.    For Each objDrive In objFileSysObject.Drives
  5631.       ' Буква диска
  5632.      Cells(intRow, 1) = objDrive.DriveLetter
  5633.       ' Готовность
  5634.      Cells(intRow, 2) = objDrive.IsReady
  5635.       ' Тип диска
  5636.      Select Case objDrive.DriveType
  5637.          Case 0
  5638.             Cells(intRow, 3) = "Неизвестно"
  5639.          Case 1
  5640.             Cells(intRow, 3) = "Съемный"
  5641.          Case 2
  5642.             Cells(intRow, 3) = "Жесткий"
  5643.          Case 3
  5644.             Cells(intRow, 3) = "Сетевой"
  5645.          Case 4
  5646.             Cells(intRow, 3) = "CD-ROM"
  5647.          Case 5
  5648.             Cells(intRow, 3) = "RAM"
  5649.       End Select
  5650.       ' Метка диска
  5651.      Cells(intRow, 4) = objDrive.VolumeName
  5652.       ' Общий размер
  5653.      Cells(intRow, 5) = objDrive.TotalSize
  5654.       ' Свободное место
  5655.      Cells(intRow, 6) = objDrive.AvailableSpace
  5656.  
  5657.       intRow = intRow + 1
  5658.    Next
  5659. End Sub
  5660.  
  5661.  
  5662.  
  5663.  
  5664.  
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.  
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.  
  5680.  
  5681.  
  5682.  
  5683.  
  5684.  
  5685.  
  5686.  
  5687.  
  5688.  
  5689.  
  5690. Глава .ЮЗЕРФОРМЫ
  5691.  
  5692. Мне кажется, наилучшим решениям для передачи данных штрихкода будет не TextBox, а Label, в него уже точно ничего руками не введешь
  5693.  
  5694. По поводу выполнения макросов по кнопке, Юрий вам уже пример макроса показал, как прявязать к конкертной кнопке, примерно так:
  5695. Private Sub TextBox10_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  5696.  
  5697. If KeyAscii = 27 Then Call Macros1 'выполнеие нужной процедуры по F1
  5698.  
  5699. End Sub
  5700.  
  5701. номера обозначения кнопок можно посмотреть по процедуре
  5702.  
  5703. Private Sub TextBox10_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  5704.  
  5705. MsgBox KeyAscii
  5706.  
  5707. End Sub
  5708.  
  5709.  
  5710. проверить введенное значение на соотвествие и пропустить или поставить дефолтное значение
  5711.  
  5712. Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  5713. If Val(TextBox1) > 10 And Val(TextBox1) < 10000 Then
  5714. Else
  5715. TextBox1 = 20 ' default value
  5716. End If
  5717. End Sub
  5718. Разрешенные символы
  5719. Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  5720. If KeyAscii > 47 And KeyAscii < 58 Or KeyAscii = 44 Or KeyAscii = 45 Or KeyAscii = 8 Then Else KeyAscii = 0
  5721. End Sub
  5722. ‘ 44 Это запятая
  5723. ‘ 46 точка
  5724. Автоматическая замена точки на запятую
  5725.  
  5726. Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  5727. If Chr(KeyAscii) = "," Then KeyAscii = Asc(".")
  5728. End Sub
  5729.  
  5730. Если нужно заблокировать ввод запятой, то:
  5731. ... Then KeyAscii = 0
  5732. Ввод в TextBox только цифр
  5733.  
  5734. Private Sub Text1_KeyPress(KeyAscii As Integer)
  5735. If KeyAscii < Asc(0) Or KeyAscii > Asc(9) Then
  5736. KeyAscii = 0
  5737. Beep ' звуковой сигнал при ошибке
  5738. End If
  5739. End Sub
  5740. при использовании события change брать последний введенный символ. Елси подходит оставлять его, если нет - присваивать полю последнее значение
  5741.  
  5742. Private Sub TextBox1_Change()
  5743. lc = Right(TextBox1, 1)
  5744. If lc < "0" And lc "9") Then TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
  5745. End Sub
  5746.  
  5747. при таком методе фсякие знаки, кроме цифр, в поле ввода даже не появляюцца! :)
  5748.  
  5749. Ввод только цифр
  5750. If Not IsNumeric(Me.TextBox1) Then
  5751. Me.Hide
  5752. MsgBox "Значение должно быть числом!"
  5753. Me.Show
  5754. End If
  5755. Далее текст самой программы
  5756. Exit Sub
  5757. Глава .диаграммы
  5758. Построение диаграммы с помощью макроса
  5759. Листинг 5.1. Макрос построения диаграммы
  5760. Sub CreateChart()
  5761.    ' Создание и настройка диаграммы
  5762.   With Charts.Add
  5763.       ' Данные из первого листа
  5764.      .SetSourceData Source:=Worksheets(1).Range("A1:E4")
  5765.       ' Заголовок
  5766.      .HasTitle = True
  5767.       .ChartTitle.Text = "Выручка по магазинам"
  5768.       ' Активизируем диаграмму
  5769.      .Activate
  5770.    End With
  5771. End Sub
  5772. Листинг 5.2. Построение внедренной диаграммы
  5773. Sub CreateеmbеddedChart()
  5774.    ' Создание и настройка внедренной диаграммы
  5775.   With Worksheets(1).ChartObjects.Add(100, 60, 250, 200)
  5776.       ' Объемная диаграмма
  5777.      .Chart.ChartType = xl3DArea
  5778.       ' Источник данных
  5779.      .Chart.SetSourceData Source:=Worksheets(1).Range("A1:E4")
  5780.    End With
  5781. End Sub
  5782. Листинг 5.3. Создание диаграммы на основе выделенных данных
  5783. Sub CreateCharOnSelection()
  5784.    ' Создание диаграммы (с заданием положения на листе)
  5785.   With ActiveSheet.ChartObjects.Add( _
  5786.     Selection.Left + Selection.Width, _
  5787.     Selection.Top + Selection.Height, 300, 200).Chart
  5788.       ' Тип диаграммы
  5789.      .ChartType = xlColumnClustered
  5790.       ' Источник данных - выделение
  5791.      .SetSourceData Source:=Selection, PlotBy:=xlColumns
  5792.       ' Без легенды
  5793.      .HasLegend = False
  5794.       ' Без заголовка
  5795.      .HasTitle = True
  5796.       .ChartTitle.Characters.Text = "Выручка за период"
  5797.       ' Выделение диаграммы
  5798.      .Parent.Select
  5799.    End With
  5800. End Sub
  5801. Сохранение диаграммы в отдельном файле
  5802. Листинг 5.4. Сохранение диаграммы
  5803. Sub SaveChart()
  5804.    ' Сохранение выделенной диаграммы в файл
  5805.   If ActiveChart Is Nothing Then
  5806.       ' Нет выделенных диаграмм
  5807.      MsgBox "Выделите диаграмму"
  5808.    Else
  5809.       ' Сохранение...
  5810.      ActiveChart.Export ActiveWorkbook.Path & "\Диаграмма.gif", "GIF"
  5811.    End If
  5812. End Sub
  5813. Листинг 5.5. Сохранение диаграммы под указанным именем
  5814. Sub InteractiveSaveChart()
  5815.    Dim strFileName As String  ' Имя файла для сохранения
  5816.  
  5817.    ' Проверка, выделена ли диаграмма
  5818.   If ActiveChart Is Nothing Then
  5819.       ' Нет выделенных диаграмм
  5820.      MsgBox "Выделите диаграмму"
  5821.    Else
  5822.       ' Выбор файла для сохранения
  5823.      strFileName = Application.GetSaveAsFilename( _
  5824.        ActiveChart.Name & ".gif", "Файлы GIF (*.gif), *.gif", 1, _
  5825.        "Сохранить диаграмму в формате GIF")
  5826.       ' Проверка, выбран ли файл
  5827.      If strFileName <> "" Then
  5828.          ' Сохранение выделенной диаграммы в файл
  5829.         ActiveChart.Export strFileName, "GIF"
  5830.       End If
  5831.    End If
  5832. End Sub
  5833. Построение и удаление диаграммы нажатием одной кнопки
  5834. Листинг 5.6. Быстрое построение и удаление диаграммы
  5835. Sub CreateChart()
  5836.    ' Создание диаграммы
  5837.   Charts.Add
  5838.  
  5839.    ' Параметры диаграммы
  5840.   ' Тип диаграммы
  5841.   ActiveChart.ChartType = xlLineMarkers
  5842.    ' Заголовок
  5843.   ActiveChart.SetSourceData Range("B1:E2"), xlRows
  5844.    ActiveChart.Location xlLocationAsObject, Name
  5845.    ' Остальные параметры
  5846.   With ActiveChart
  5847.       ' Заголовок
  5848.      .HasTitle = True
  5849.       .ChartTitle.Characters.Text = Name
  5850.       ' Заголовок оси категорий
  5851.      .Axes(xlCategory, xlPrimary).HasTitle = True
  5852.       .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text _
  5853.        = Sheets(Name).Range("A1").Value
  5854.       ' Заголовок оси значений
  5855.      .Axes(xlValue, xlPrimary).HasTitle = True
  5856.       .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text _
  5857.        = Sheets(Name).Range("A2").Value
  5858.       ' Отображение легенды
  5859.      .HasLegend = False
  5860.       .HasDataTable = True
  5861.       .DataTable.ShowLegendKey = True
  5862.  
  5863.       ' Настройка отображения сетки
  5864.      With .Axes(xlCategory)
  5865.          .HasMajorGridlines = True
  5866.          .HasMinorGridlines = False
  5867.       End With
  5868.       With .Axes(xlValue)
  5869.          .HasMajorGridlines = True
  5870.          .HasMinorGridlines = False
  5871.       End With
  5872.    End With
  5873. End Sub
  5874.  
  5875. Sub DeleteChart()
  5876.    ' Удаление диаграммы
  5877.   ActiveSheet.ChartObjects.Delete
  5878. End Sub
  5879. Вывод списка диаграмм в отдельном окне
  5880. Листинг 5.7. Внедренные диаграммы
  5881. Sub ShowSheetCharts()
  5882.    Dim strMessage As String
  5883.    Dim i As Integer
  5884.    ' Формирование списка диаграмм
  5885.   For i = 1 To ActiveSheet.ChartObjects.Count
  5886.       strMessage = strMessage & ActiveSheet.ChartObjects(i).Name _
  5887.        & vbNewLine
  5888.    Next i
  5889.    ' Отображение списка
  5890.   MsgBox strMessage
  5891. End Sub
  5892. Листинг 5.8. Перечень рабочих листов, содержащих обычные диаграммы
  5893. Sub ShowBookCharts()
  5894.    Dim crt As Chart
  5895.    Dim strMessage As String
  5896.    ' Формирование списка диаграмм
  5897.   For Each crt In ActiveWorkbook.Charts
  5898.       strMessage = strMessage & crt.Name & vbNewLine
  5899.    Next
  5900.    ' Отображение списка
  5901.   MsgBox strMessage
  5902. End Sub
  5903. Применение случайной цветовой палитры
  5904. Листинг 5.9. Случайная цветовая палитра
  5905. Sub RandomChartColors()
  5906.    Dim intGradientStyle As Integer, intGradientVariant As Integer
  5907.    Dim i As Integer
  5908.  
  5909.    ' Проверка, выделена ли диаграмма
  5910.   If ActiveChart Is Nothing Then Exit Sub
  5911.  
  5912.    ' Изменение оформления всех категорий
  5913.   For i = 1 To ActiveChart.SeriesCollection.Count
  5914.       With ActiveChart.SeriesCollection(i)
  5915.          ' Вид градиентной заливки (случайный)
  5916.         intGradientStyle = Int(Rnd * 7) + 1
  5917.          If intGradientStyle = 6 Then intGradientStyle = 1
  5918.          If intGradientStyle = 7 Then
  5919.             intGradientVariant = Int(Rnd * 2) + 1
  5920.          Else
  5921.             intGradientVariant = Int(Rnd * 4) + 1
  5922.          End If
  5923.          ' Применение градиента
  5924.         .Fill.TwoColorGradient Style:=intGradientStyle, _
  5925.           Variant:=intGradientVariant
  5926.          ' Установка случайных цветов фона и обводки (используются _
  5927.           для градиента)
  5928.         .Fill.ForeColor.SchemeColor = Int(Rnd * 57) + 1
  5929.          .Fill.BackColor.SchemeColor = Int(Rnd * 57) + 1
  5930.       End With
  5931.    Next i
  5932. End Sub
  5933. Эффект прозрачности диаграммы
  5934. Листинг 5.10. Эффект прозрачности диаграммы
  5935. Sub TransparentChart()
  5936.    Dim shpShape As Shape
  5937.    Dim dblColor As Double
  5938.    Dim srSerie As Series
  5939.    Dim intBorderLineStyle As Integer
  5940.    Dim intBorderColorIndex As Integer
  5941.    Dim intBorderWeight As Integer
  5942.  
  5943.    ' Проверка, есть ли выделенная диаграмма
  5944.   If ActiveChart Is Nothing Then Exit Sub
  5945.    ' Изменение отображения каждой категории
  5946.   For Each srSerie In ActiveChart.SeriesCollection
  5947.       If (srSerie.ChartType = xlColumnClustered Or _
  5948.        srSerie.ChartType = xlColumnStacked Or _
  5949.        srSerie.ChartType = xlColumnStacked100 Or _
  5950.        srSerie.ChartType = xlBarClustered Or _
  5951.        srSerie.ChartType = xlBarStacked Or _
  5952.        srSerie.ChartType = xlBarStacked100) Then
  5953.          ' Сохранение прежнего цвета категории
  5954.         dblColor = srSerie.Interior.Color
  5955.          ' Сохранение стиля линий
  5956.         intBorderLineStyle = srSerie.Border.LineStyle
  5957.          ' Цвет границы
  5958.         intBorderColorIndex = srSerie.Border.ColorIndex
  5959.          ' Толщина линий границы
  5960.         intBorderWeight = srSerie.Border.Weight
  5961.  
  5962.          ' Создание автофигуры
  5963.         Set shpShape = ActiveSheet.Shapes.AddShape _
  5964.           (msoShapeRectangle, 1, 1, 100, 100)
  5965.          With shpShape
  5966.             ' Закрашиваем нужным цветом
  5967.            .Fill.ForeColor.RGB = dblColor
  5968.             ' Делаем прозрачной
  5969.            .Fill.Transparency = 0.4
  5970.             ' Убираем линии
  5971.            .Line.Visible = msoFalse
  5972.          End With
  5973.          ' Копируем автофигуру в буфер обмена
  5974.         shpShape.CopyPicture Appearance:=xlScreen, _
  5975.           Format:=xlPicture
  5976.          ' Вставляем автофигуру в изображения столбцов _
  5977.           категории и настраиваем
  5978.         With srSerie
  5979.             ' Собственно вставка
  5980.            .Paste
  5981.             ' Возвращаем на место толщину линий
  5982.            .Border.Weight = intBorderWeight
  5983.             ' Стиль линий
  5984.            .Border.LineStyle = intBorderLineStyle
  5985.             ' Цвет границы
  5986.            .Border.ColorIndex = intBorderColorIndex
  5987.          End With
  5988.          ' Автофигура больше не нужна
  5989.         shpShape.Delete
  5990.       End If
  5991.    Next srSerie
  5992. End Sub
  5993. Построение диаграммы на основе данных нескольких рабочих листов
  5994. Листинг 5.11. Одновременное создание нескольких диаграмм
  5995. Sub ManyCharts()
  5996.    Dim intTop As ****, intLeft As ****
  5997.    Dim intHeight As ****, intWidth As ****
  5998.    Dim sheet As Worksheet
  5999.    Dim lngFirstRow As ****      ' Первая строка с данными
  6000.   Dim intSerie As Integer      ' Текущая категория диаграммы
  6001.   Dim strErrorSheets As String ' Список листов, для которых _
  6002.                                  не удалось построить диаграммы
  6003.  
  6004.    intTop = 1       ' Верхняя точка первой диаграммы
  6005.   intLeft = 1      ' Левая точка каждой диаграммы
  6006.   intHeight = 180  ' Высота каждой диаграммы
  6007.   intWidth = 300   ' Ширина каждой диаграммы
  6008.  
  6009.    ' Постоение диаграммы для каждого листа, кроме текущего
  6010.   For Each sheet In ActiveWorkbook.Worksheets
  6011.       If sheet.Name <> ActiveSheet.Name Then
  6012.          ' Первый заполненный ряд
  6013.         lngFirstRow = 3
  6014.          ' Первая категория
  6015.         intSerie = 1
  6016.  
  6017.          On Error GoTo DiagrammError
  6018.          ' Добавление и настройка диаграммы
  6019.         With ActiveSheet.ChartObjects.Add _
  6020.           (intLeft, intTop, intWidth, intHeight).Chart
  6021.             Do Until IsEmpty(sheet.Cells(lngFirstRow + intSerie, 1))
  6022.                ' Создание ряда
  6023.               .SeriesCollection.NewSeries
  6024.                ' Значения для ряда
  6025.               .SeriesCollection(intSerie).Values = _
  6026.                 sheet.Range(sheet.Cells(lngFirstRow + intSerie, 2), _
  6027.                 sheet.Cells(lngFirstRow + intSerie, 4))
  6028.                ' Диапазон данных для подписей
  6029.               .SeriesCollection(intSerie).XValues = _
  6030.                 sheet.Range("B3:D3")
  6031.                ' Название ряда (берется из столбца "A" таблицы с данными)
  6032.               .SeriesCollection(intSerie).Name = sheet.Cells( _
  6033.                 lngFirstRow + intSerie, 1)
  6034.                intSerie = intSerie + 1
  6035.             Loop
  6036.  
  6037.             ' Настройка внешнего вида диаграммы
  6038.            .ChartType = xl3DColumnClustered
  6039.             .ChartGroups(1).GapWidth = 20
  6040.             .PlotArea.Interior.ColorIndex = xlNone
  6041.             .ChartArea.Font.Size = 9
  6042.             ' Диаграмма с легендой
  6043.            .HasLegend = True
  6044.             ' Заголовок
  6045.            .HasTitle = True
  6046.             .ChartTitle.Characters.Text = sheet.Range("A1")
  6047.             ' Задание диапазона значений на осях
  6048.            .Axes(xlValue).MinimumScale = 0
  6049.             .Axes(xlValue).MaximumScale = 120000
  6050.             ' Стиль линий сетки (прерывистый)
  6051.            .Axes(xlValue).MajorGridlines.Border. _
  6052.              LineStyle = xlDot
  6053.          End With
  6054.          On Error GoTo 0
  6055.          ' Сдвиг верхней точки следующей диаграммы на высоту _
  6056.           текущей диаграммы
  6057.         intTop = intTop + intHeight
  6058. AfterError:
  6059.       End If
  6060.    Next sheet
  6061.  
  6062.    If strErrorSheets <> "" Then
  6063.       ' Отобразим список листов, для которых не построили диаграммы
  6064.      MsgBox "Не удалось построить диаграммы для листов:" & Chr(13) _
  6065.        & strErrorSheets, vbExclamation
  6066.    End If
  6067.    Exit Sub
  6068. DiagrammError:
  6069.    ' Добавление в список имени листа, для которого не смогли _
  6070.     построить диаграмму (ошибка в данных для диаграммы)
  6071.   strErrorSheets = strErrorSheets & sheet.Name & Chr(13)
  6072.    ' Удаление пустой диаграммы на текущем листе
  6073.   ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Delete
  6074.    ' Продолжаем работу с другими листами
  6075.   Resume AfterError
  6076. End Sub
  6077. Создание подписей к данным диаграммы
  6078. Листинг 5.12. Подписи к данным диаграммы
  6079. Sub ShowLabels()
  6080.    Dim rgLabels As Range    ' Диапазон с подписями
  6081.   Dim chrChart As Chart    ' Диаграмма
  6082.   Dim intPoint As Integer  ' Точка, для которой добавляется подпись
  6083.   ' Определение диаграммы
  6084.   Set chrChart = ActiveSheet.ChartObjects(1).Chart
  6085.  
  6086.    ' Запрос на ввод диапазона с исходными данными
  6087.   On Error Resume Next
  6088.    Set rgLabels = Application.InputBox _
  6089.     (prompt:="Укажите диапазон с подписями", Type:=8)
  6090.    If rgLabels Is Nothing Then Exit Sub
  6091.    On Error GoTo 0
  6092.  
  6093.    ' Добавление подписей
  6094.   chrChart.SeriesCollection(1).ApplyDataLabels _
  6095.     Type:=xlDataLabelsShowValue, _
  6096.     AutoText:=True, _
  6097.     LegendKey:=False
  6098.  
  6099.    ' Просмотр диапазона и назначение подписей
  6100.   For intPoint = 1 To chrChart.SeriesCollection(1).Points.Count
  6101.       chrChart.SeriesCollection(1). _
  6102.        Points(intPoint).DataLabel.Text = rgLabels(intPoint)
  6103.    Next intPoint
  6104. End Sub
  6105.  
  6106. Sub DeleteLabels()
  6107.    ' Удаление подписей диаграммы
  6108.   ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1). _
  6109.     HasDataLabels = False
  6110. End Sub
  6111. ГЛАВА . РАЗНЫЕ ПРОГРАММЫ.
  6112. Программа для составления кроссвордов
  6113. Листинг 6.1. Программа для составления кроссворда
  6114. Const dhcMinCol = 1   ' Номер первого столбца кроссворда
  6115. Const dhcMaxCol = 35  ' Номер последнего столбца кроссворда
  6116. Const dhcMinRow = 1   ' Номер первой строки кроссворда
  6117. Const dhcMaxRow = 35  ' Номер последней строки кроссворда
  6118.  
  6119. Sub Clear()
  6120.    ' Выделение и очистка всех используемых для кроссворда ячеек
  6121.   Range(Cells(dhcMinRow, dhcMinCol), _
  6122.     Cells(dhcMaxRow, dhcMaxCol)).Select
  6123.    Selection.Clear
  6124.    ' Удаление сетки всего кроссворда
  6125.   ClearGrid
  6126.  
  6127.    Range("A1").Select
  6128. End Sub
  6129.  
  6130. Sub ClearGrid()
  6131.    ' Удаление сетки кроссворда (в выделенных ячейках)...
  6132.   ' Возврат прежнего цвета ячеек
  6133.   Selection.Interior.ColorIndex = xlNone
  6134.    ' Задание начертания границ ячеек по умолчанию
  6135.   Selection.Borders(xlDiagonalDown).LineStyle = xlNone
  6136.    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
  6137.    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
  6138.    Selection.Borders(xlEdgeTop).LineStyle = xlNone
  6139.    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
  6140.    Selection.Borders(xlEdgeRight).LineStyle = xlNone
  6141.    Selection.Borders(xlInsideVertical).LineStyle = xlNone
  6142.    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
  6143. End Sub
  6144.  
  6145. Sub DrowCrosswordGrid()
  6146.    ' Процедура начертания сетки кроссворда
  6147.  
  6148.    ' Задание цвета всех ячеек кроссворда
  6149.   Selection.Interior.ColorIndex = 35
  6150.    ' Линии по диагонали не нужны
  6151.   Selection.Borders(xlDiagonalDown).LineStyle = xlNone
  6152.    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
  6153.  
  6154.    ' Задание начертания границ всех диапазонов, входящих _
  6155.     в выделение, а также границ между соседними ячейками _
  6156.     всех диапазонов
  6157.   On Error Resume Next
  6158.    ' Левые границы
  6159.   With Selection.Borders(xlEdgeLeft)
  6160.       .LineStyle = xlContinuous
  6161.       .Weight = xlThin
  6162.       .ColorIndex = xlAutomatic
  6163.    End With
  6164.    ' Правые границы
  6165.   With Selection.Borders(xlEdgeRight)
  6166.       .LineStyle = xlContinuous
  6167.       .Weight = xlThin
  6168.       .ColorIndex = xlAutomatic
  6169.    End With
  6170.    ' Верхние границы
  6171.   With Selection.Borders(xlEdgeTop)
  6172.       .LineStyle = xlContinuous
  6173.       .Weight = xlThin
  6174.       .ColorIndex = xlAutomatic
  6175.    End With
  6176.    ' Нижние границы
  6177.   With Selection.Borders(xlEdgeBottom)
  6178.       .LineStyle = xlContinuous
  6179.       .Weight = xlThin
  6180.       .ColorIndex = xlAutomatic
  6181.    End With
  6182.    ' Вертикальные границы между ячейками
  6183.   With Selection.Borders(xlInsideVertical)
  6184.       .LineStyle = xlContinuous
  6185.       .Weight = xlThin
  6186.       .ColorIndex = xlAutomatic
  6187.    End With
  6188.    ' Горизонтальные границы между ячейками
  6189.   With Selection.Borders(xlInsideHorizontal)
  6190.       .LineStyle = xlContinuous
  6191.       .Weight = xlThin
  6192.       .ColorIndex = xlAutomatic
  6193.    End With
  6194. End Sub
  6195. Sub DisplayGrid()
  6196.    ' Включение сетки на листе
  6197.   ActiveWindow.DisplayGridlines = True
  6198. End Sub
  6199.  
  6200. Sub HideGrid()
  6201.    ' Выключение сетки на листе
  6202.   ActiveWindow.DisplayGridlines = False
  6203. End Sub
  6204.  
  6205. Sub AutoNumber()
  6206.    ' Нумерация клеток, являющихся началом слов
  6207.   Dim intRow As Integer    ' Текущая строка
  6208.   Dim intCol As Integer    ' Текущий ряд
  6209.   Dim cell As Range        ' Текущая ячейка (с координатами _
  6210.                              (intRow, intCol))
  6211.   Dim fTop As Boolean      ' = True, если cell имеет соседей сверху
  6212.   Dim fBottom As Boolean   ' = True, если cell имеет соседей снизу
  6213.   Dim fLeft As Boolean     ' = True, если cell имеет соседей слева
  6214.   Dim fRight As Boolean    ' = True, если cell имеет соседей справа
  6215.   Dim intDigit As Integer  ' Текущий номер слова в кроссворде
  6216.  
  6217.    intDigit = 1             ' Нумерация слов с 1
  6218.  
  6219.    ' Проходим по всем клеткам диапазона, используемого _
  6220.     для кроссворда, сверху вниз слева направо и анализируем _
  6221.     каждую угловую и крайнюю (левую и верхнюю) ячейки
  6222.   For intRow = dhcMinRow To dhcMaxRow
  6223.       For intCol = dhcMinCol To dhcMaxCol
  6224.          ' Текущая ячейка
  6225.         Set cell = Cells(intRow, intCol)
  6226.  
  6227.          ' Проверка, входит ли ячейка в кроссворд (по ее цвету)
  6228.         If cell.Interior.ColorIndex = 35 Then
  6229.             fLeft = False
  6230.             fRight = False
  6231.             fTop = False
  6232.             fBottom = False
  6233.             On Error Resume Next
  6234.             ' Определение наличия соседей у ячейки...
  6235.            ' сверху
  6236.            fTop = cell.offset(-1, 0).Interior.ColorIndex = 35
  6237.             ' снизу
  6238.            fBottom = cell.offset(1, 0).Interior.ColorIndex = 35
  6239.             ' слева
  6240.            fLeft = cell.offset(0, -1).Interior.ColorIndex = 35
  6241.             ' справа
  6242.            fRight = cell.offset(0, 1).Interior.ColorIndex = 35
  6243.             On Error GoTo 0
  6244.  
  6245.             ' Анализ положения ячейки
  6246.            If (Not fTop And Not fLeft) Or _
  6247.              (Not fBottom And Not fLeft And fRight) Or _
  6248.              (Not fLeft And fRight) Or _
  6249.              (Not fTop And fBottom) Then
  6250.                ' Ячейка подходит для начала слова
  6251.               SetDigit intDigit, cell
  6252.                intDigit = intDigit + 1
  6253.             End If
  6254.          End If
  6255.       Next intCol
  6256.    Next intRow
  6257. End Sub
  6258.  
  6259. Sub SetDigit(intDigit As Integer, cell As Range)
  6260.    ' Вставка цифры intDigit в ячейку, заданную параметром cell
  6261.   cell.Value = intDigit
  6262.    ' Изменение настроек шрифта так, чтобы было похоже _
  6263.     на настоящий кроссворд
  6264.   ' Маленький размер шрифта
  6265.   cell.Font.Size = 6
  6266.    ' Выравнивание текста по левому верхнему углу ячейки
  6267.   cell.HorizontalAlignment = xlLeft
  6268.    cell.VerticalAlignment = xlTop
  6269. End Sub
  6270.  
  6271. Sub ToPrint()
  6272.    ' Удаление цветовой подсветки кроссворда
  6273.   Cells.Interior.ColorIndex = xlNone
  6274. End Sub
  6275.  
  6276. Sub ToNumber()
  6277.    ' Закрытие первой формы и переход ко второй
  6278.   UserForm1.Hide
  6279.    UserForm2.Show
  6280. End Sub
  6281. Создать обложку DVD
  6282. Sub Обложка_DVD()
  6283. On Error Resume Next
  6284. Sheets("Обложка").Select
  6285. If Err > 0 Then GoTo 10 Else MsgBox ("Такой лист уже присутствует в книге..."): Exit Sub
  6286. 10:
  6287. Sheets.Add.Name = "Обложка" ' создаем новый лист в текущей книге с именем "Обложка"
  6288.  
  6289. Sheets("Обложка").Range("A1").Select ' становимся в ячейку А1
  6290. Application.Dialogs(xlDialoginsеrtPicture).Show 'вызываем диологовое окно "Вставка рисунка из файла"
  6291. Selection.ShapeRange.LockAspectRatio = msoFalse '
  6292. ' Selection.ShapeRange.Height = 530.25 ' подгоняем размеры под размеры коробки
  6293. ' Selection.ShapeRange.Width = 726# '
  6294.  
  6295. Selection.ShapeRange.Height = 530.2 ' подгоняем размеры под размеры коробки
  6296. Selection.ShapeRange.Width = 724# '
  6297.  
  6298. Selection.ShapeRange.Rotation = 0# '
  6299. Selection.Locked = False '
  6300.  
  6301. With ActiveSheet.PageSetup ' разносим поля листа на максимальные расстояния
  6302. .LeftMargin = Application.InchesToPoints(0.17)
  6303. .RightMargin = Application.InchesToPoints(0.17)
  6304. .TopMargin = Application.InchesToPoints(0.27)
  6305. .BottomMargin = Application.InchesToPoints(0.27)
  6306. .HeaderMargin = Application.InchesToPoints(0.17)
  6307. .FooterMargin = Application.InchesToPoints(0.17)
  6308. .Zoom = 100
  6309. .FitToPagesWide = 1
  6310. .FitToPagesTall = 1
  6311. .Orientation = xlLandscape ' придаем листу горизантальное положение (АЛЬБОМНЫЙ)
  6312. End With
  6313. If MsgBox("Печать текущего изображения", vbYesNo, "Вывод на печать") = vbYes Then Sheets("Обложка").PrintOut Copies:=1, Collate:=True
  6314.  
  6315. Application.DisplayAlerts = False ' Выключили системные сообщения...
  6316. If MsgBox("Удалить лист ОБЛОЖКА", vbYesNo, "Удаление листа...") = vbYes Then Sheets("Обложка").Delete Else Application.CommandBars("Picture").Visible = True
  6317. Application.DisplayAlerts = True 'Включили системные сообщения...
  6318.  
  6319. End Sub
  6320.  
  6321.  
  6322.  
  6323. Игра «Минное поле»
  6324. Листинг 6.2. Код в модуле рабочего листа
  6325. Sub Worksheet_Selectiоnchange(ByVal Target As Range)
  6326.    Dim intCol As Integer, intRow As Integer
  6327.    Dim intMinesAround As Integer
  6328.    Dim fInGameField As Boolean
  6329.  
  6330.    ' Определим, попадает ли в игровое поле выделенная ячейка
  6331.   fInGameField = (Target.Row >= 2) And (Target.Row <= 7) _
  6332.     And (Target.Column >= 2) And (Target.Column <= 7)
  6333.  
  6334.    ' Обрабатываем выделение ячейки
  6335.   If Target.Value = "*" And fInGameField Then
  6336.       ' Пользователь выделил ячейку с миной - покажем мину
  6337.      Target.Font.Color = RGB(0, 0, 0)
  6338.       Target.Interior.Color = RGB(255, 0, 0)
  6339.       ' Пользователь проиграл!
  6340.      EndGame
  6341.    ElseIf fInGameField Then
  6342.       ' Пользователь выделил пустую ячейку. Оформим эту ячейку
  6343.      Target.Interior.Color = RGB(0, 0, 255)
  6344.       Target.Font.Color = RGB(0, 255, 0)
  6345.       Target.Font.Size = 16
  6346.  
  6347.       ' Подсчитаем количество мин рядом с ячейкой (вокруг ячейки)
  6348.      For intCol = Target.Column - 1 To Target.Column + 1
  6349.          For intRow = Target.Row - 1 To Target.Row + 1
  6350.             If Target.Worksheet.Cells(intRow, intCol).Value = "*" _
  6351.              Then
  6352.                ' Нашли очередную мину
  6353.               intMinesAround = intMinesAround + 1
  6354.             End If
  6355.          Next
  6356.       Next
  6357.       ' Отображение количества мин
  6358.      Target.Value = intMinesAround
  6359.    End If
  6360. End Sub
  6361. Листинг 6.3. Код в стандартном модуле
  6362. Sub NewGame()
  6363.    ' Начало новой игры
  6364.   ' Подготовим поле для игры
  6365.   InitGame
  6366.  
  6367.    Dim intRow As Integer, intCol As Integer
  6368.    Dim intMinesCount As Integer    ' Количество мин
  6369.   ' Расставляем мины (то есть в случайные ячейки помещаем _
  6370.     значения "*" и делаем цвет шрифта таким же, как цвет _
  6371.     фона этих ячеек)
  6372.   For intMinesCount = 1 To 10
  6373.       ' Строка для мины (от 2 до 7)
  6374.      intRow = Int((6 * Rnd) + 1) + 1
  6375.       ' Столбец для мины (от 2 до 7)
  6376.      intCol = Int((6 * Rnd) + 1) + 1
  6377.  
  6378.       ' Ставим мину, если ячейка пустая
  6379.      If Cells(intRow, intCol) <> "*" Then
  6380.          Cells(intRow, intCol).Font.Color = _
  6381.           Cells(intRow, intCol).Interior.Color
  6382.          Cells(intRow, intCol).Value = "*"
  6383.       Else
  6384.          ' В данной ячейке мина есть - продолжим поиск ячеек
  6385.         intMinesCount = intMinesCount - 1
  6386.       End If
  6387.    Next
  6388.  
  6389.    ' Вывод информации о количестве мин в строку состояния
  6390.   Application.StatusBar = "Количество мин " & intMinesCount
  6391. End Sub
  6392. Sub InitGame()
  6393.    ' Раскраска (оформление) листа перед началом игры
  6394.   Dim intRow As Integer, intCol As Integer
  6395.  
  6396.    ' Цвет фона всех ячеек
  6397.   Cells.Interior.Color = RGB(0, 200, 75)
  6398.    ' Цвет шрифта всех ячеек
  6399.   Cells.Font.Color = RGB(0, 0, 0)
  6400.    ' Размер шрифта
  6401.   Cells.Font.Size = 18
  6402.    ' Все надписи - по центру
  6403.   Cells.HorizontalAlignment = xlCenter
  6404.  
  6405.    ' Всем ячейкам игрового поля назначим особый цвет
  6406.   For intRow = 2 To 7
  6407.       For intCol = 2 To 7
  6408.          Cells(intRow, intCol).Interior.Color = RGB(200, 200, 200)
  6409.          Cells(intRow, intCol).Value = ""
  6410.       Next
  6411.    Next
  6412. End Sub
  6413. Sub EndGame()
  6414.    ' Завершение игры (поражение)
  6415.   Dim intRow As Integer, intCol As Integer
  6416.  
  6417.    ' Покажем все мины. Для этого сделаем цвет шрифта всех ячеек _
  6418.     черным (ведь во всех ячейках с минами "*" цвет шрифта и цвет _
  6419.     заливки одинаковы)
  6420.   For intRow = 2 To 7
  6421.       For intCol = 2 To 7
  6422.          If Cells(intRow, intCol).Value = "*" Then
  6423.             Cells(intRow, intCol).Font.Color = RGB(0, 0, 0)
  6424.          End If
  6425.       Next
  6426.    Next
  6427.  
  6428.    MsgBox "Проигрыш"
  6429. End Sub
  6430. Игра «Угадай животное»
  6431. Листинг 6.4. Игра «Угадай животное»
  6432. Sub StartGame()
  6433.    Dim intLastRow As Integer    ' Номер строки для вставки записей
  6434.   Dim intRow As Integer        ' Номер текущей строки
  6435.   Dim intYesRow As Integer     ' Номер строки, из которой брать _
  6436.                                  данные при утвердительном ответе
  6437.   Dim intNoRow As Integer      ' Номер строки, из которой брать _
  6438.                                  данные при отрицательном ответе
  6439.   Dim strText As String        ' Строка с вопросом или названием _
  6440.                                  животного
  6441.   Dim strNewName As String     ' Строка с названием нового животного
  6442.   Dim strNewQuestion As String ' Строка с новым вопросом
  6443.   Dim intRes As Integer
  6444.  
  6445.    ' Начало игры
  6446.   MsgBox "Начнем игру. Задумайте животное.", vbOKOnly, _
  6447.     "Задумайте животное"
  6448.  
  6449.    ' Определение номера ряда для вставки записей. _
  6450.     intLastRow-1 - номер последнего ряда, содержащего данные
  6451.   intLastRow = Worksheets("Data").Range("D1").Value + 1
  6452.    ' Данные в таблице идут с первого ряда
  6453.   intRow = 1
  6454.  
  6455.    Do While intRow < intLastRow
  6456.       ' Текст вопроса или название животного из столбца "A"
  6457.      strText = Worksheets("Data").Cells(intRow, 1).Value
  6458.       ' Номер ряда, из которого брать данные при утвердительном _
  6459.        ответе, берем из столбца "B"
  6460.      intYesRow = Worksheets("Data").Cells(intRow, 2).Value
  6461.       ' Номер ряда, из которого брать данные при отрицательном _
  6462.        ответе, берем из столбца "C"
  6463.      intNoRow = Worksheets("Data").Cells(intRow, 3).Value
  6464.  
  6465.       If intYesRow > 0 Then
  6466.          ' В строке strText содержится вопрос. Зададим его
  6467.         intRes = MsgBox(strText, vbYesNo, "Вопрос")
  6468.          If intRes = vbYes Then
  6469.             ' Переходим по утвердительному ответу
  6470.            intRow = intYesRow
  6471.          Else
  6472.             ' Переходим по отрицательному ответу
  6473.            intRow = intNoRow
  6474.          End If
  6475.       Else
  6476.          ' Альтернативы закончились. В строке strText - название _
  6477.           животного. Спросим, его ли загадали
  6478.         intRes = MsgBox("Это " & strText & "?", vbYesNo, "Вопрос")
  6479.          If intRes = vbYes Then
  6480.             ' Животное угадано
  6481.            MsgBox "Угадано! Спасибо за игру!", vbOKOnly, _
  6482.              "Игра завершена"
  6483.             Exit Do
  6484.          Else
  6485.             ' Животное не угадали, но данные уже занкончились. _
  6486.              Нужно пополнить наши данные, чтобы отличать животное _
  6487.              с названием strText от загаданного
  6488.            ' Ввод названия нового животного
  6489.            strNewName = InputBox("Сдаюсь. Кто это?", _
  6490.              "Напечатайте название животного")
  6491.             If strNewName <> "" Then
  6492.                ' Ввод вопроса, по которому отличать животных
  6493.               strNewQuestion = InputBox("Задайте вопрос, по " & _
  6494.                 "которому можно отличить '" & strNewName & _
  6495.                 "' от '" & strText & "'", "Напечатайте вопрос")
  6496.                If strNewQuestion <> "" Then
  6497.                   ' Определение, какое из животных соответствует _
  6498.                    утвердительному ответу на вопрос
  6499.                  intRes = MsgBox("Правильный ответ на ваш " & _
  6500.                    "вопрос - " & strNewName & "'", vbYesNo, _
  6501.                    "Какой ответ на вопрос?")
  6502.  
  6503.                   ' Добавление в таблицу названия нового животного
  6504.                  Worksheets("Data").Cells(intLastRow, 1). _
  6505.                    Value = strNewName
  6506.                   ' Перемещения названия животного, которое было _
  6507.                    ранее, в конец таблицы
  6508.                  Worksheets("Data").Cells(intLastRow + 1, 1). _
  6509.                    Value = strText
  6510.                   ' Замена названия этого животного вопросом
  6511.                  Worksheets("Data").Cells(intRow, 1). _
  6512.                    Value = strNewQuestion
  6513.  
  6514.                   ' Корректировка номеров строк для перехода _
  6515.                    в зависимости от того, какое животное является _
  6516.                    правильным ответом на введенный пользователем вопрос
  6517.                  If intRes = vbYes Then
  6518.                      ' Новое животное - правильный ответ
  6519.                     Worksheets("Data").Cells(intRow, 2). _
  6520.                       Value = intLastRow
  6521.                      Worksheets("Data").Cells(intRow, 3). _
  6522.                       Value = intLastRow + 1
  6523.                   Else
  6524.                      ' Бывшее ранее животное - правильный ответ
  6525.                     Worksheets("Data").Cells(intRow, 2). _
  6526.                       Value = intLastRow + 1
  6527.                      Worksheets("Data").Cells(intRow, 3). _
  6528.                       Value = intLastRow
  6529.                   End If
  6530.  
  6531.                   ' Сохраним номер строки для добавления записей
  6532.                  Worksheets("Data").Range("D1").Value = _
  6533.                    intLastRow + 2
  6534.                End If
  6535.             End If
  6536.             ' Игра завершена. Таблица дополнена
  6537.            MsgBox "Спасибо за игру!", vbOKOnly, "Игра завершена"
  6538.             Exit Do
  6539.          End If
  6540.       End If
  6541.    Loop
  6542. End Sub
  6543. Расчет на основании ячеек определенного цвета
  6544. Листинг 6.5. Код в стандартном модуле
  6545. Const dhcSum As Integer = 0
  6546. Const dhcAvg As Integer = 1
  6547. Const dhcMax As Integer = 2
  6548. Const dhcMin As Integer = 3
  6549. Const dhcCount As Integer = 4
  6550. Const dhcSumPlus As Integer = 5
  6551. Const dhcSumMinus As Integer = 6
  6552. Const dhcCountFull As Integer = 7
  6553. Const dhcCountNotNull As Integer = 8
  6554. Const dhcCountPlus As Integer = 9
  6555. Const dhcCountMinus As Integer = 10
  6556.  
  6557. Sub CalcColors()
  6558.    ' Отображение формы
  6559.   Load frmColorCalc
  6560.    frmColorCalc.Show
  6561. End Sub
  6562.  
  6563. Public Function ColorCalc(strRange As String, _
  6564.    lngColor As ****, fBackBolor As Boolean, _
  6565.    intMode As Integer, Optional fAbsence As Boolean) As Double
  6566.  
  6567.    ' Операции над ячейками с установленным цветом шрифта _
  6568.     или заливки
  6569.   Dim rgData As Range     ' Диапазон ячеек для расчетов
  6570.   Dim i As Integer
  6571.    Dim Values() As Variant ' Массив со значениями для расчета
  6572.   Dim intCount As Integer ' Количество значений в массиве
  6573.   Dim cell As Range
  6574.    Dim varOut As Variant   ' В этой переменной хранятся _
  6575.                             результаты промежуточных подсчетов _
  6576.                             и окончательный результат
  6577.  
  6578.    Set rgData = Range(strRange)
  6579.    ReDim Values(1 To rgData.Count)
  6580.  
  6581.    ' Просматриваются все ячейки входного диапазона. Значения тех из них, _
  6582.     цвет которых удовлетворяет условию, записываются в массив Values
  6583.   For Each cell In rgData.Cells
  6584.       ' Если нужно суммировать по заливке:
  6585.      If fBackBolor = True Then
  6586.          ' Включение ячейки в сумму в зависимости от цвета _
  6587.           заливки и фильтра
  6588.         If fAbsence Then
  6589.             ' Если ячейка имеет заданный цвет, то она не включается _
  6590.              в вычисления
  6591.            If cell.Interior.Color <> lngColor Then
  6592.                intCount = intCount + 1
  6593.                Values(intCount) = cell.Value
  6594.             End If
  6595.          Else
  6596.             ' Если ячейка имеет заданный цвет, то она включается _
  6597.              в вычисления
  6598.            If cell.Interior.Color = lngColor Then
  6599.                intCount = intCount + 1
  6600.                Values(intCount) = cell.Value
  6601.             End If
  6602.          End If
  6603.          ' В противном случае - суммируется по шрифту
  6604.      Else
  6605.          ' Включение ячейки в сумму в зависимости _
  6606.           от ее цвета и фильтра
  6607.         If fAbsence Then
  6608.             ' Если ячейка имеет заданный цвет, то она не включается _
  6609.              в вычисления
  6610.            If cell.Font.Color <> lngColor Then
  6611.                intCount = intCount + 1
  6612.                Values(intCount) = cell.Value
  6613.             End If
  6614.          Else
  6615.             ' Если ячейка имеет заданный цвет, то она включается _
  6616.              в вычисления
  6617.            If cell.Font.Color = lngColor Then
  6618.                intCount = intCount + 1
  6619.                Values(intCount) = cell.Value
  6620.             End If
  6621.          End If
  6622.       End If
  6623.    Next cell
  6624.  
  6625.    ' Выполнение над собранными значениями операции, заданной в intMode
  6626.   For i = 1 To intCount
  6627.       Select Case intMode
  6628.          Case dhcSum, dhcAvg
  6629.             ' Подсчет суммы значений
  6630.            varOut = varOut + Values(i)
  6631.          Case dhcSumPlus
  6632.             ' Подсчет суммы положительных значений
  6633.            If Values(i) > 0 Then varOut = varOut + Values(i)
  6634.          Case dhcSumMinus
  6635.             ' Посчет суммы отрицательных значений
  6636.            If Values(i) < 0 Then varOut = varOut + Values(i)
  6637.          Case dhcMax
  6638.             ' Нахождение максимального значения
  6639.            If Values(i) > varOut Then varOut = Values(i)
  6640.          Case dhcMin
  6641.             ' Нахождение минимального значения
  6642.            If i = LBound(Values) Then varOut = Values(i)
  6643.             If Values(i) < varOut Then varOut = Values(i)
  6644.          Case dhcCount
  6645.             ' Подсчет количества значений
  6646.            varOut = varOut + 1
  6647.          Case dhcCountFull
  6648.             ' Подсчет количества заполненных ячеек
  6649.            If Not IsEmpty(Values(i)) Then varOut = varOut + 1
  6650.          Case dhcCountNotNull
  6651.             ' Подсчет количества пустых ячеек
  6652.            If Not IsEmpty(Values(i)) And Values(i) <> 0 Then _
  6653.              varOut = varOut + 1
  6654.          Case dhcCountPlus
  6655.             ' Подсчет количества положительных значений
  6656.            If Values(i) > 0 Then varOut = varOut + 1
  6657.          Case dhcCountMinus
  6658.             ' Подсчет количества отрицательных значений
  6659.            If Values(i) < 0 Then varOut = varOut + 1
  6660.       End Select
  6661.    Next i
  6662.  
  6663.    ' Окончательные операции для некоторых видов расчета
  6664.   If intMode = dhcAvg Then
  6665.       ' Вычисление среднего значения
  6666.      ColorCalc = varOut / intCount
  6667.    Else
  6668.       ColorCalc = varOut
  6669.    End If
  6670. End Function
  6671. Листинг 6.6. Код в модуле формы
  6672. Dim lngCurColor As **** ' Выбранный цвет, по которому _
  6673.                          идентифицировать (отбирать) ячейки
  6674. Dim intMode As Integer  ' Номер типа вычисления в списке
  6675.  
  6676. Sub cmbApplyColor_Click()
  6677.    If cboOtherColor.Value >= 0 Then
  6678.       ' Вычисление с использованием выбранного в списке цвета
  6679.      lngCurColor = cboOtherColor.Value
  6680.       SetColorSum
  6681.    End If
  6682. End Sub
  6683.  
  6684. Sub cmbColor1_Click()
  6685.    ' Вычисление с использованием цвета нажатой кнопки
  6686.   lngCurColor = cmbColor1.BackColor
  6687.    SetColorSum
  6688. End Sub
  6689.  
  6690. Sub cmbColor2_Click()
  6691.    ' Вычисление с использованием цвета нажатой кнопки
  6692.   lngCurColor = cmbColor2.BackColor
  6693.    SetColorSum
  6694. End Sub
  6695.  
  6696. Sub cmbColor3_Click()
  6697.    ' Вычисление с использованием цвета нажатой кнопки
  6698.   lngCurColor = cmbColor3.BackColor
  6699.    SetColorSum
  6700. End Sub
  6701.  
  6702. Sub cmbColor4_Click()
  6703.    ' Вычисление с использованием цвета нажатой кнопки
  6704.   lngCurColor = cmbColor4.BackColor
  6705.    SetColorSum
  6706. End Sub
  6707.  
  6708. Sub cmbColor5_Click()
  6709.    ' Вычисление с использованием цвета нажатой кнопки
  6710.   lngCurColor = cmbColor5.BackColor
  6711.    SetColorSum
  6712. End Sub
  6713.  
  6714. Sub cmbColor6_Click()
  6715.    ' Вычисление с использованием цвета нажатой кнопки
  6716.   lngCurColor = cmbColor6.BackColor
  6717.    SetColorSum
  6718. End Sub
  6719.  
  6720. Sub cmbColor7_Click()
  6721.    ' Вычисление с использованием цвета нажатой кнопки
  6722.   lngCurColor = cmbColor7.BackColor
  6723.    SetColorSum
  6724. End Sub
  6725.  
  6726. Sub cmbColor8_Click()
  6727.    ' Вычисление с использованием цвета нажатой кнопки
  6728.   lngCurColor = cmbColor8.BackColor
  6729.    SetColorSum
  6730. End Sub
  6731.  
  6732. Sub cmbColor9_Click()
  6733.    ' Вычисление с использованием цвета нажатой кнопки
  6734.   lngCurColor = cmbColor9.BackColor
  6735.    SetColorSum
  6736. End Sub
  6737.  
  6738. Sub cmbColor10_Click()
  6739.    ' Вычисление с использованием цвета нажатой кнопки
  6740.   lngCurColor = cmbColor10.BackColor
  6741.    SetColorSum
  6742. End Sub
  6743.  
  6744. Sub cmbColor11_Click()
  6745.    ' Вычисление с использованием цвета нажатой кнопки
  6746.   lngCurColor = cmbColor11.BackColor
  6747.    SetColorSum
  6748. End Sub
  6749.  
  6750. Sub cmbColor12_Click()
  6751.    ' Вычисление с использованием цвета нажатой кнопки
  6752.   lngCurColor = cmbColor12.BackColor
  6753.    SetColorSum
  6754. End Sub
  6755.  
  6756. Sub SetColorSum()
  6757.    ' Вычисление с использованием заданного цвета
  6758.   Dim strFormula As String
  6759.  
  6760.    ' Проверка правильности введенных диапазонов и номеров ячеек
  6761.   If txtResCell.Value = "" Then
  6762.       MsgBox "Введите адрес ячейки вставки функции", _
  6763.        vbCritical, "Внимание!"
  6764.       txtResCell.SetFocus
  6765.       Exit Sub
  6766.    ElseIf txtRange.Value = "" Then
  6767.       MsgBox "Введите адрес диапазона суммирования", _
  6768.        vbCritical, "Внимание!"
  6769.       txtRange.SetFocus
  6770.       Exit Sub
  6771.    End If
  6772.  
  6773.    ' Формирование формулы
  6774.   strFormula = "=ColorCalc(" & """" & txtRange.Value & """" _
  6775.     & "," & lngCurColor & "," & CInt(tglType.Value) & "," _
  6776.     & intMode & "," & CInt(chkVarify.Value) & ")"
  6777.    ' Запись формулы в ячейку
  6778.   Range(txtResCell.Value).Formula = strFormula
  6779. End Sub
  6780.  
  6781. Sub cmbExit_Click()
  6782.    ' Закрытие формы
  6783.   Unload Me
  6784. End Sub
  6785.  
  6786. Sub cboCalcTypes_Afterupdаtе()
  6787.    ' Изменение режима вычисления - сохраним в переменной _
  6788.     номер вычисления
  6789.   intMode = cboCalcTypes.ListIndex
  6790. End Sub
  6791.  
  6792. Sub cboOtherColor_Change()
  6793.    ' Изменение выделенного цвета в списке "Другой"
  6794.   If cboOtherColor.Text <> "" Then
  6795.       ' Сохранение выбранного цвета в переменной
  6796.      lngCurColor = Val(cboOtherColor.Value)
  6797.    End If
  6798. End Sub
  6799.  
  6800. Sub tglType_Click()
  6801.    ' Изменение типа идентификации ячеек
  6802.   If tglType.Value = -1 Then
  6803.       ' Идентификация по цвету заливки
  6804.      tglType.Caption = "Заливка"
  6805.    Else
  6806.       ' Идентификация по цвету шрифта
  6807.      tglType.Caption = "Шрифт"
  6808.    End If
  6809.    GetColors
  6810. End Sub
  6811.  
  6812. Sub txtRange_Afterupdаtе()
  6813.    ' Изменение диапазона с исходными данными - покажем _
  6814.     кнопки с цветами, представленными в новом диапазоне
  6815.   GetColors
  6816. End Sub
  6817.  
  6818. Sub txtRange_Beforeupdаtе(ByVal Cancel As MSForms.ReturnBoolean)
  6819.    ' Проверка корректности данных, введенных в поле _
  6820.     диапазона исходных данных
  6821.   Dim rgData As Range
  6822.    Dim cell As Range
  6823.  
  6824.    ' Проверка, введен ли диапазон данных
  6825.   If txtRange.Text = "" Then
  6826.       MsgBox "Введите адрес диапазона суммирования!", _
  6827.        vbCritical, "Ошибка выполнения"
  6828.       Cancel = True
  6829.    End If
  6830.    If txtResCell.Text = "" Then Exit Sub
  6831.  
  6832.    On Error GoTo Err1
  6833.    ' Проверка отсутствия циклических ссылок (чтобы одна _
  6834.     из входных ячеек не была одновременно и выходной)
  6835.   Set rgData = Range(txtRange.Text)
  6836.    For Each cell In rgData.Cells
  6837.       If cell.Address(False, False) = _
  6838.        Range(txtResCell.Text).Address(False, False) Then
  6839.          ' Нашли циклическую ссылку
  6840.         MsgBox "Введите другой адрес во избежание " & _
  6841.           "появления циклических ссылок", vbCritical, _
  6842.           "Внимание!"
  6843.          Cancel = True
  6844.          Exit Sub
  6845.       End If
  6846.    Next cell
  6847.    Exit Sub
  6848.  
  6849. Err1:
  6850.    ' Обработка ошибок при работе с ячейками
  6851.   If Err.Number = 1004 Then
  6852.       MsgBox "Введите корректный адрес ячейки", vbCritical, _
  6853.        "Ошибка ввода"
  6854.       Cancel = True
  6855.       Exit Sub
  6856.    Else
  6857.       MsgBox Err.Desсriрtion, vbCritical, "Ошибка ввода"
  6858.       Cancel = True
  6859.       Exit Sub
  6860.    End If
  6861. End Sub
  6862.  
  6863. Sub txtResCell_Beforeupdаtе(ByVal Cancel As MSForms.ReturnBoolean)
  6864.    ' Проверка корректности данных, введенных в поле _
  6865.     адреса выходной ячейки
  6866.   Dim rgData As Range
  6867.    Dim cell As Range
  6868.  
  6869.    ' Проверка, введен ли диапазон данных
  6870.   If txtRange.Text = "" Then
  6871.       MsgBox "Введите адрес диапазона суммирования!", _
  6872.        vbCritical, "Ошибка выполнения"
  6873.       Cancel = True
  6874.    End If
  6875.    If txtResCell.Text = "" Then Exit Sub
  6876.  
  6877.    On Error GoTo Err1
  6878.    ' Проверка отсутствия циклических ссылок (чтобы одна _
  6879.     из входных ячеек не была одновременно и выходной)
  6880.   Set rgData = Range(txtRange.Text)
  6881.    For Each cell In rgData.Cells
  6882.       If cell.Address(False, False) = _
  6883.        Range(txtResCell.Text).Address(False, False) Then
  6884.          ' Нашли циклическую ссылку
  6885.         MsgBox "Введите другой адрес во избежание " & _
  6886.           "появления циклических ссылок", vbCritical, _
  6887.           "Внимание!"
  6888.          Cancel = True
  6889.          Exit Sub
  6890.       End If
  6891.    Next cell
  6892.    Exit Sub
  6893.  
  6894. Err1:
  6895.    ' Обработка ошибок при работе с ячейками
  6896.   If Err.Number = 1004 Then
  6897.       MsgBox "Введите корректный адрес ячейки", vbCritical, _
  6898.        "Ошибка ввода"
  6899.       Cancel = True
  6900.       Exit Sub
  6901.    Else
  6902.       MsgBox Err.Desсriрtion, vbCritical, "Ошибка ввода"
  6903.       Cancel = True
  6904.       Exit Sub
  6905.    End If
  6906. End Sub
  6907.  
  6908. Sub UserForm_Activate()
  6909.    ' Инициализация формы при активации
  6910.   Dim intFunc As Integer
  6911.    Dim strFunc As String
  6912.  
  6913.    ' Заполение списка доступных операций
  6914.   cboCalcTypes.AddItem "0"
  6915.    cboCalcTypes.List(0, 1) = "Сумма"
  6916.    cboCalcTypes.AddItem "1"
  6917.    cboCalcTypes.List(1, 1) = "Среднее"
  6918.    cboCalcTypes.AddItem "2"
  6919.    cboCalcTypes.List(2, 1) = "Максимум"
  6920.    cboCalcTypes.AddItem "3"
  6921.    cboCalcTypes.List(3, 1) = "Минимум"
  6922.    cboCalcTypes.AddItem "4"
  6923.    cboCalcTypes.List(4, 1) = "Количество ячеек"
  6924.    cboCalcTypes.AddItem "5"
  6925.    cboCalcTypes.List(5, 1) = "Сумма положительных"
  6926.    cboCalcTypes.AddItem "6"
  6927.    cboCalcTypes.List(6, 1) = "Сумма отрицательных"
  6928.    cboCalcTypes.AddItem "7"
  6929.    cboCalcTypes.List(7, 1) = "Количество непустых"
  6930.    cboCalcTypes.AddItem "8"
  6931.    cboCalcTypes.List(8, 1) = "Количество непустых ненулевых"
  6932.    cboCalcTypes.AddItem "9"
  6933.    cboCalcTypes.List(9, 1) = "Количество положительных"
  6934.    cboCalcTypes.AddItem "10"
  6935.    cboCalcTypes.List(10, 1) = "Количество отрицательных"
  6936.  
  6937.    ' Заполнение списка дополнительных цветов
  6938.   cboOtherColor.AddItem "255"
  6939.    cboOtherColor.List(0, 1) = "Красный"
  6940.    cboOtherColor.AddItem "52479"
  6941.    cboOtherColor.List(1, 1) = "Оранжевый"
  6942.    cboOtherColor.AddItem "65535"
  6943.    cboOtherColor.List(2, 1) = "Желтый"
  6944.    cboOtherColor.AddItem "32768"
  6945.    cboOtherColor.List(3, 1) = "Зеленый"
  6946.    cboOtherColor.AddItem "16776960"
  6947.    cboOtherColor.List(4, 1) = "Голубой"
  6948.    cboOtherColor.AddItem "16711680"
  6949.    cboOtherColor.List(5, 1) = "Синий"
  6950.    cboOtherColor.AddItem "16711935"
  6951.    cboOtherColor.List(6, 1) = "Фиолетовый"
  6952.    cboOtherColor.AddItem "16777215"
  6953.    cboOtherColor.List(7, 1) = "Белый"
  6954.    cboOtherColor.AddItem "0"
  6955.    cboOtherColor.List(8, 1) = "Черный"
  6956.  
  6957.    If Selection.Cells.Count = 1 Then
  6958.       ' На листе есть выделенная ячейка. Определим, есть ли в этой _
  6959.        ячейке формула с функцией ColorCalc
  6960.      intFunc = InStr(Selection.Formula, "ColorCalc(")
  6961.       If intFunc > 0 Then
  6962.          ' Формула есть, заполним поля формы для вычислений
  6963.         ' Адрес ячейки с результатом
  6964.         txtResCell.Text = Selection.Address(False, False)
  6965.  
  6966.          ' Выделяем аргументы функции...
  6967.         ' Номера ячеек с исходными данными
  6968.         strFunc = Mid(Selection.Formula, intFunc + 11)
  6969.          intFunc = InStr(strFunc, """")
  6970.          txtRange.Text = Left(strFunc, intFunc - 1)
  6971.  
  6972.          ' Тип идентификации ячеек (по шрифту или цвету)
  6973.         strFunc = Mid(strFunc, intFunc + 2)
  6974.          intFunc = InStr(strFunc, ",")
  6975.          strFunc = Mid(strFunc, intFunc + 1)
  6976.          intFunc = InStr(strFunc, ",")
  6977.          tglType.Value = Left(strFunc, intFunc - 1)
  6978.  
  6979.          ' Режим вычислений
  6980.         strFunc = Mid(strFunc, intFunc + 1)
  6981.          strFunc = Left(strFunc, Len(strFunc) - 1)
  6982.          intFunc = InStr(strFunc, ",")
  6983.          cboCalcTypes.Text = cboCalcTypes.List(Val(Left$( _
  6984.           strFunc, intFunc - 1)), 1)
  6985.  
  6986.          strFunc = Mid(strFunc, intFunc + 1)
  6987.          chkVarify.SetFocus
  6988.          chkVarify.Value = CBool(strFunc)
  6989.          lblChoose.Visible = True
  6990.  
  6991.          GetColors
  6992.       Else
  6993.          ' Будем применять формулу для выделенной ячейки
  6994.         txtRange.Value = Selection.Address(False, False)
  6995.          ' В выделенной ячейке конкретная функция не задана. _
  6996.           Выберем первую функцию в списке
  6997.         cboCalcTypes.Text = "Сумма"
  6998.       End If
  6999.    Else
  7000.       ' Будем применять формулу для выделенной ячейки
  7001.      txtRange.Value = Selection.Address(False, False)
  7002.       ' В выделенной ячейке конкретная функция не задана. _
  7003.        Выберем первую функцию в списке
  7004.      cboCalcTypes.Text = "Сумма"
  7005.    End If
  7006. End Sub
  7007.  
  7008. Sub GetColors()
  7009.    ' Отображение кнопок выбора цвета окрашенными в цвета, _
  7010.     встречающиеся среди ячеек заданного диапазона
  7011.   Dim rgCells As Range
  7012.    Dim i As Integer
  7013.    Dim intColorNumber As Integer   ' Номер следующей кнопки _
  7014.                                     выбора цвета
  7015.   Dim lngCurColor As ****         ' Анализируемый цвет
  7016.   Dim fColorPresented As Boolean  ' Кнопка с цветом _
  7017.                                     lngCurColor уже существует
  7018.   Dim ctrl As Control
  7019.    Dim strCtrl As String
  7020.    Dim fBackColor As Boolean       ' = True, если ячейки _
  7021.                                     идентифицируются по цвету фона, _
  7022.                                     = False - по цвету шрифта
  7023.   fBackColor = tglType.Value
  7024.  
  7025.    On Error Resume Next
  7026.    ' Скрытие всех кнопок выбора цвета
  7027.   For Each ctrl In Me.Controls
  7028.       If Left(ctrl.Name, 8) = "cmbColor" Then
  7029.          ctrl.Visible = False
  7030.       End If
  7031.    Next ctrl
  7032.  
  7033.    On Error GoTo ErrRange
  7034.    Set rgCells = Range(txtRange.Text)
  7035.    On Error GoTo 0
  7036.  
  7037.    ' Получение цвета первой ячейки
  7038.   If fBackColor = False Then
  7039.       lngCurColor = rgCells.Cells(i).Font.Color
  7040.    Else
  7041.       lngCurColor = rgCells.Cells(i).Interior.Color
  7042.    End If
  7043.    ' Назначения цвета первой ячейки первой кнопке
  7044.   cmbColor1.BackColor = lngCurColor
  7045.    cmbColor1.Visible = True
  7046.  
  7047.    ' Просмотр остальных ячеек и при нахождении новых цветов _
  7048.     отображение кнопок, окрашенных в эти цвета
  7049.   intColorNumber = 2
  7050.    For i = 2 To rgCells.Cells.Count
  7051.       fColorPresented = False
  7052.  
  7053.       ' Получение цвета i-й ячейки
  7054.      If fBackColor = False Then
  7055.          lngCurColor = rgCells.Cells(i).Font.Color
  7056.       Else
  7057.          lngCurColor = rgCells.Cells(i).Interior.Color
  7058.       End If
  7059.  
  7060.       ' Проверка, отображается ли уже кнопка с таким цветом
  7061.      For Each ctrl In Me.Controls
  7062.          If Left(ctrl.Name, 8) = "cmbColor" And _
  7063.           ctrl.Visible = True Then
  7064.             If lngCurColor = ctrl.BackColor Then
  7065.                ' Кнопка с цветом i-й ячейки уже отображается
  7066.               fColorPresented = True
  7067.                Exit For
  7068.             End If
  7069.          End If
  7070.       Next ctrl
  7071.  
  7072.       If Not fColorPresented Then
  7073.          ' Кнопки с цветом lngCurColor еще нет - покажем ее
  7074.         intColorNumber = intColorNumber + 1
  7075.          strCtrl = "cmbColor" & intColorNumber
  7076.          Me.Controls(strCtrl).BackColor = lngCurColor
  7077.          Me.Controls(strCtrl).Visible = True
  7078.       End If
  7079.    Next i
  7080.    Exit Sub
  7081.  
  7082. ErrRange:
  7083.    ' Обработка ошибок при работе с диапазоном
  7084.   If txtRange.Text = "" Then
  7085.       MsgBox "Введите адрес диапазона суммирования", _
  7086.        vbCritical, "Внимание!"
  7087.    Else
  7088.       MsgBox "Введен некорректный адрес диапазона суммирования", _
  7089.        vbCritical, "Ошибка!"
  7090.    End If
  7091.    ' Установка курсора в поле ввода диапазона
  7092.   txtRange.SetFocus
  7093. End Sub
  7094.  
  7095.  
  7096.  
  7097.  
  7098.  
  7099.  
  7100.  
  7101.  
  7102.  
  7103.  
  7104.  
  7105. ГЛАВА .ДРУГИЕ ФУНКЦИИ И МАКРОСЫ
  7106. Вызов функциональных клавиш
  7107. Sub Test()
  7108.  SendKeys ("{F1}")
  7109. End Sub
  7110. Расчет среднего арифметического значения
  7111. Sub CalculateAverage()
  7112.    Dim strFistCell As String
  7113.    Dim strLastCell As String
  7114.    Dim strFormula As String
  7115.  
  7116.    ' Условия закрытия процедуры
  7117.   If ActiveCell.Row = 1 Then Exit Sub
  7118.  
  7119.    ' Определение положения первой и последней ячеек для расчета
  7120.   strFistCell = ActiveCell.offset(-1, 0).End(xlUp).Address
  7121.    strLastCell = ActiveCell.offset(-1, 0).Address
  7122.  
  7123.    ' Формула для расчета среднего значения
  7124.   strFormula = "=AVERAGE(" & strFistCell & ":" & strLastCell & ")"
  7125.    ' Ввод формулы в текущую ячейку
  7126.   ActiveCell.Formula = strFormula
  7127. End Sub
  7128. Перевод чисел в «деньги»
  7129. Листинг 2.50. Функция RubKop
  7130. Function RubKop(Число)
  7131.    ' Пустые ячейки и ячейки, содержащие текст, функция _
  7132.     не обрабатывает
  7133.   If IsNumeric(Число) = False Or Число = "" Then RubKop = _
  7134.     "<>": Exit Function
  7135.  
  7136.    ' Из числа целой части - рубли
  7137.   ДлинаЧисла = Len(Число)
  7138.    ЦелаяЧасть = Fix(Число)
  7139.    ДлинаЦелой = Len(ЦелаяЧасть)
  7140.  
  7141.    ' Вычисление длины дробной части
  7142.   ДлинаДроби = ДлинаЧисла - ДлинаЦелой
  7143.    If ДлинаДроби <> 0 Then
  7144.       ДлинаДроби = ДлинаЧисла - ДлинаЦелой - 1
  7145.    End If
  7146.  
  7147.    ' Формирование количества копеек в зависимости от длины _
  7148.     дробной части
  7149.   If ДлинаДроби = 0 Then
  7150.       ' Ноль копеек
  7151.      Копейки = "00"
  7152.    ElseIf ДлинаДроби = 1 Then
  7153.       ' Дробная часть состоит из одного числа - это _
  7154.        десятки копеек
  7155.      Копейки = Right(Число, ДлинаДроби) & "0"
  7156.    ElseIf ДлинаДроби = 2 Then
  7157.       ' Дробная часть полностью соответствует количеству копеек
  7158.      Копейки = Right(Число, ДлинаДроби)
  7159.    Else
  7160.       ' Длина дробной части больше двух - округлим _
  7161.        дробную часть
  7162.      Копейки = Right(Число, ДлинаДроби)
  7163.       If Mid(Копейки, 3, 1) > 4 Then
  7164.          Копейки = Left(Копейки, 2) + 1
  7165.       Else
  7166.          Копейки = Left(Копейки, 2)
  7167.       End If
  7168.    End If
  7169.    ' Составление полной надписи из количества рублей и копеек
  7170.   Рубли = ЦелаяЧасть
  7171.    RubKop = Рубли & " " & "руб." & " " & Копейки & " " & "коп."
  7172. End Function
  7173. Поиск ближайшего понедельника
  7174. Листинг 2.60. Ближайший день недели по отношению к дате
  7175. Function dhGetNextMonday(datDate As Date) As Date
  7176.    ' Определение даты следующего понедельника (функция Weekday _
  7177.     возвращает номер дня недели, считая от понедельника, если _
  7178.     в качестве второго аргумента задавать vbMonday)
  7179.   If Weekday(datDate, vbMonday) = 1 Then
  7180.       ' Заданная дата и есть понедельник
  7181.      dhGetNextMonday = datDate
  7182.    Else
  7183.       ' Расчет даты следующего понедельника
  7184.      dhGetNextMonday = datDate + 8 - Weekday(datDate, vbMonday)
  7185.    End If
  7186. End Function
  7187. Подсчет количества полных лет
  7188. Листинг 2.61. Функция dhCalculateAge
  7189. Function dhCalculateAge(datDate As Date) As ****
  7190.    Dim lngAge As ****
  7191.    ' Находим разность между текущей датой и указанной (лет)
  7192.   lngAge = DateDiff("yyyy", datDate, Date)
  7193.    If DateSerial(Year(datDate) + lngAge, Month(datDate), _
  7194.     Day(datDate)) > Date Then
  7195.       ' В этом году день рождения еще не наступил
  7196.      lngAge = lngAge - 1
  7197.    End If
  7198.    dhCalculateAge = lngAge
  7199. End Function
  7200.  
  7201. Расчет средневзвешенного значения
  7202. Листинг 2.63. Расчет средневзвешенного значения
  7203. Function dhAverageWithWeight(rgWeights As Range, rgValues As Range) _
  7204.  As Double
  7205.    If (rgWeights.Count <> rgValues.Count) Then
  7206.       ' Количество весов не соответствует количеству аргументов
  7207.      dhAverageWithWeight = 0
  7208.       Exit Function
  7209.    End If
  7210.  
  7211.    Dim i As Integer
  7212.    Dim dblSum As Double        ' Сумма значений
  7213.   Dim dblSumWeight As Double  ' Взвешенная сумма значений
  7214.  
  7215.    ' Вычисление...
  7216.   For i = 1 To rgWeights.Count
  7217.       ' Взвешенной суммы значений
  7218.      dblSumWeight = dblSumWeight + rgWeights(i) * rgValues(i)
  7219.       ' Суммы значений
  7220.      dblSum = dblSum + rgWeights(i)
  7221.    Next
  7222.  
  7223.    ' Возвращение средневзвешенного значения
  7224.   dhAverageWithWeight = dblSumWeight / dblSum
  7225. End Function
  7226. Преобразование номера месяца в его название
  7227. Листинг 2.64. Название месяца
  7228. Function dhMonthName(intMonth As Integer) As String
  7229.    ' Возвращение имени месяца по его номеру (intMonth _
  7230.     является номером элемента в массиве с названиями месяцев)
  7231.   dhMonthName = Choose(intMonth, "Январь", "Февраль", "Март", _
  7232.     "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", _
  7233.     "Октябрь", "Ноябрь", "Декабрь")
  7234. End Function
  7235.  
  7236. Использование относительных ссылок
  7237. Листинг 2.73. Функция dhSheetOffset
  7238. Function dhSheetOffset(offset As Integer, cell As Range) As Variant
  7239.    ' Возврат корректного значения ячейки cell листа, смещение _
  7240.     которого относительно текущего задано переменной offset
  7241.   dhSheetOffset = Sheets(Application.Caller.Parent.Index _
  7242.     + offset).Range(cell.Address)
  7243. End Function
  7244. Листинг 2.74. Функция dhSheetOffset2
  7245. Function dhSheetOffset2(offset As Integer, cell As Range) As Variant
  7246.    ' Корректировка смещения (чтобы ссылка была на рабочий лист)
  7247.   Do While TypeName(Sheets(cell.Parent.Index + offset)) _
  7248.     <> "Worksheet"
  7249.       If offset > 0 Then
  7250.          ' Пропускаем лист и проходим вперед по книге
  7251.         offset = offset + 1
  7252.       Else
  7253.          ' Пропускаем лист и проходим назад по книге
  7254.         offset = offset - 1
  7255.       End If
  7256.    Loop
  7257.  
  7258.    ' Возврат корректного значения ячейки cell листа, смещение _
  7259.     которого относительно текущего задано переменной offset _
  7260.     с пропуском листов с диаграммами
  7261.   dhSheetOffset2 = Sheets(cell.Parent.Index _
  7262.     + offset).Range(cell.Address)
  7263. End Function
  7264.  
  7265. Преобразование таблицы Excel в HТМL-формат
  7266. Листинг 3.60. Преобразование таблицы в HТМL-формат
  7267. Sub ExportAsHТМL()
  7268.    Dim strStyle As String     ' Параметры стиля отображения ячейки
  7269.   Dim strAlign As String     ' Параметры выравнивания ячейки
  7270.   Dim strOut As String       ' Выходная строка с HТМL-кодом
  7271.   Dim cell As Object         ' Обрабатываемая ячейка
  7272.   Dim strCellText As String  ' Текст обрабатываемой ячейки
  7273.   Dim lngRow As ****         ' Номер строки обрабатываемой ячейки
  7274.   Dim lngLastRow As ****     ' Номер строки предыдущей ячейки
  7275.   Dim strTemp As String
  7276.    Dim objWordApp As Object
  7277.    Dim i As ****
  7278.  
  7279.    lngLastRow = Selection.Row
  7280.    ' Просмотр всех выделенных ячеек
  7281.    For Each cell In Selection
  7282.       ' Значение строки для рассматриваемой ячейки
  7283.      lngRow = cell.Row
  7284.       ' Если перешли на другую строку, то вставляем <tr>
  7285.      If lngRow <> lngLastRow Then
  7286.          strOut = strOut & vbTab & "</tr>" & vbCrLf & vbTab & _
  7287.           "<tr>" & vbCrLf
  7288.          ' Переход на следующую строку
  7289.         lngLastRow = lngRow
  7290.       End If
  7291.  
  7292.       ' Задание шрифта ячейки
  7293.      If Not IsNull(cell.Font.Size) Then
  7294.          strStyle = " style=" & "font-size: " & Int(100 * _
  7295.           cell.Font.Size / 19) & "%;"
  7296.       End If
  7297.       ' Для полужирного шрифта вставляем <b>
  7298.      If cell.Font.Bold Then
  7299.          strCellText = "<b>" & strCellText & "</b>"
  7300.       End If
  7301.  
  7302.       ' Задание выравнивания
  7303.      If cell.HorizontalAlignment = xlRight Then
  7304.          ' По правому краю
  7305.         strAlign = " align=" & "right"
  7306.       ElseIf cell.HorizontalAlignment = xlCenter Then
  7307.          ' По центру
  7308.         strAlign = " align=" & "center"
  7309.       Else
  7310.          ' По левому краю (по умолчанию)
  7311.         strAlign = ""
  7312.       End If
  7313.  
  7314.       ' Чтение текста в ячейке
  7315.      strCellText = cell.Text
  7316.       ' Если нужно, то вертикальный вывод текста (в строку strTemp _
  7317.        с последующим перенесением обратно в strCellText)
  7318.      If cell.Orientation <> xlHorizontal Then
  7319.          strTemp = ""
  7320.          ' Печать после каждого символа специального _
  7321.           разделителя - <br>
  7322.         For i = 1 To Len(strCellText)
  7323.             strTemp = strTemp & Mid$(strCellText, i, 1) & "<br>"
  7324.          Next i
  7325.          strCellText = strTemp
  7326.          strStyle = ""
  7327.       End If
  7328.  
  7329.       strOut = strOut & vbTab & vbTab & "<td" & strStyle & strAlign _
  7330.        & ">" & strCellText & "</td>" & vbCrLf
  7331.    Next
  7332.    ' Вставка <tr> для первой строки и </tr> - для последней
  7333.   strOut = vbTab & "<tr>" & vbCrLf & strOut & vbTab & "</tr>" & vbCrLf
  7334.    ' Вставка дескриптора <table>
  7335.   strOut = "<table border=1 cellpadding=3 cellspacing=1>" & vbCrLf & _
  7336.     strOut & vbCrLf & "</table>"
  7337.  
  7338.    ' Запускаем Word и показываем в нем сформированный HТМL-код
  7339.   Set objWordApp = CreateObject("Word.Application")
  7340.    objWordApp.documents.Add
  7341.    objWordApp.Selection = strOut
  7342.    objWordApp.Selection.Copy
  7343.    objWordApp.Visible = True
  7344.    Set objWordApp = Nothing
  7345. End Sub
  7346. Генератор случайных чисел
  7347. Листинг 2.77. Функция dhGetRandomValues
  7348. Function dhGetRandomValues() As Variant
  7349.    Dim intRow As Integer       ' Номер текущей строки
  7350.   Dim intCol As Integer       ' Номер текущего столбца
  7351.   Dim aintOut() As Integer    ' Выходной массив (двумерный)
  7352.   Dim aintValues() As Integer ' Массив с возможными значениями
  7353.   Dim intMax As Integer       ' Последний доступный элемент массива _
  7354.                                 aintValues
  7355.   Dim i As Integer
  7356.  
  7357.    ReDim aintOut(1 To Application.Caller.Rows.Count, 1 To _
  7358.     Application.Caller.Columns.Count)
  7359.    ' Всего нужно чисел...
  7360.   intMax = Application.Caller.Rows.Count * _
  7361.     Application.Caller.Columns.Count
  7362.    ReDim aintValues(1 To intMax)
  7363.    ' Заполнение массива aintValues значениями от 1 до intMax
  7364.   For i = 1 To intMax
  7365.       aintValues(i) = i
  7366.    Next i
  7367.  
  7368.    ' Занесение значений в выходной массив aintOut, в произвольном _
  7369.     порядке выбирая их из aintValues
  7370.   Randomize
  7371.    For intRow = 1 To Application.Caller.Rows.Count
  7372.       For intCol = 1 To Application.Caller.Columns.Count
  7373.          ' Определение номера элемента из aintValues
  7374.         i = Rnd * intMax
  7375.          If i = 0 Then i = 1
  7376.          ' Занесение этого элемента в выходной массив
  7377.         aintOut(intRow, intCol) = aintValues(i)
  7378.  
  7379.          ' Уменьшение массива aintValues (то есть еще один его _
  7380.           элемент выбран) - замена выбранного элемента последним _
  7381.           в массиве
  7382.         aintValues(i) = aintValues(intMax)
  7383.          intMax = intMax - 1
  7384.       Next intCol
  7385.    Next intRow
  7386.    ' Возвращение массива значений
  7387.   dhGetRandomValues = aintOut
  7388. End Function
  7389. Случайные числа — на основании диапазона
  7390. Листинг 2.78. Функция dhGetRandomValues1
  7391. Function dhGetRandomValues1(rgSource As Range) As Variant
  7392.    Dim intRow As Integer       ' Номер текущей строки
  7393.   Dim intCol As Integer       ' Номер текущего столбца
  7394.   Dim avarOut() As Variant    ' Выходной массив (двумерный)
  7395.   Dim avarValues() As Variant ' Массив с возможными значениями
  7396.   Dim intValCount As Integer  ' Количество возможных значений
  7397.   Dim cell As Range
  7398.    Dim i As Integer
  7399.  
  7400.    ReDim avarOut(1 To Application.Caller.Rows.Count, 1 To _
  7401.     Application.Caller.Columns.Count)
  7402.    ' Всего нужно чисел...
  7403.   intValCount = rgSource.Rows.Count * rgSource.Columns.Count
  7404.    ReDim avarValues(1 To intValCount)
  7405.    ' Заполнение массива avarValues значениями из указанного _
  7406.     диапазона
  7407.   For Each cell In rgSource
  7408.       i = i + 1
  7409.       avarValues(i) = cell.Value
  7410.    Next cell
  7411.  
  7412.    ' Занесение значений в выходной массив avarOut, в произвольном _
  7413.     порядке выбирая их из avarValues
  7414.   Randomize
  7415.    For intRow = 1 To Application.Caller.Rows.Count
  7416.       For intCol = 1 To Application.Caller.Columns.Count
  7417.          ' Определение номера элемента из avarValues
  7418.         i = Rnd * intValCount
  7419.          If i = 0 Then i = 1
  7420.          ' Занесение этого элемента в выходной массив
  7421.         avarOut(intRow, intCol) = avarValues(i)
  7422.       Next intCol
  7423.    Next intRow
  7424.    ' Возвращение массива значений
  7425.   dhGetRandomValues1 = avarOut
  7426. End Function
  7427.  
  7428. Применение функции без ввода ее в ячейку
  7429. Листинг 3.14. Применение функции без ввода в ячейку
  7430. Sub Func()
  7431.    [a1] = Application.Sum([B5:B10])
  7432. End Sub
  7433. Подсчет именованных объектов
  7434. Листинг 3.29. Количество именованных объектов
  7435. Sub CountNames()
  7436.    Dim intNamesCount As Integer
  7437.    ' Получаем и отображаем количество имен в активной _
  7438.     рабочей книге
  7439.   intNamesCount = ActiveWorkbook.Names.Count
  7440.    If intNamesCount = 0 Then
  7441.       MsgBox "Имен нет"
  7442.    Else
  7443.       MsgBox "Имен: " & intNamesCount & " шт."
  7444.    End If
  7445. End Sub
  7446.  
  7447. Включение автофильтра с помощью макроса
  7448. Листинг 3.63. Включение автофильтра
  7449. Sub EnableAutoFilter()
  7450.    On Error Resume Next
  7451.    Selection.AutoFilter
  7452. End Sub
  7453.  
  7454. Создание бегущей строки
  7455. Листинг 3.76. Создание бегущей строки
  7456. Dim intSpacesLeft As Integer  ' Количество пробелов в начале строки
  7457. Sub Start()
  7458.    ' Установка начального количества пробелов
  7459.   intSpacesLeft = 10
  7460.    ' Первый вызов функции бегущей строки
  7461.   MovingString
  7462. End Sub
  7463.  
  7464. Sub MovingString()
  7465.    If intSpacesLeft >= 0 Then
  7466.       ' Отображение строки
  7467.      Range("A1").Value = Space(intSpacesLeft) & "Привет!"
  7468.       intSpacesLeft = intSpacesLeft - 1
  7469.       ' Указывем Excel, что данную процедуру нужно вызвать через _
  7470.        1 секунду
  7471.      Application.OnTime Now + TimeValue("00:00:01"), "MovingString"
  7472.    End If
  7473. End Sub
  7474. Создание бегущей картинки
  7475. Листинг 3.77. Бегущая картинка
  7476. Sub MovingImage()
  7477.    Dim i As Integer
  7478.    Dim image As Object
  7479.  
  7480.    ' Создание изображения (в ячейке "A1")
  7481.   With Range("A1")
  7482.       ' Формирование значения в ячейке:
  7483.      ' текст
  7484.      .Value = "Привет!"
  7485.       ' полужирный шрифт
  7486.      .Font.Bold = True
  7487.       ' цвет
  7488.      .Font.Color = RGB(233, 133, 229)
  7489.       ' размер шрифта
  7490.      .Font.Size = 16
  7491.       ' угол наклона
  7492.      .Orientation = 30
  7493.  
  7494.       ' Отображение текста полностью
  7495.      .EntireColumn.AutoFit
  7496.       ' Копирование в буфер обмена
  7497.      .Copy
  7498.  
  7499.       ' Создание самостоятельного изображения (на основе _
  7500.        скопированных в буфер обмена данных)
  7501.      Set image = ActiveSheet.Pictures.Paste(Link:=False)
  7502.  
  7503.       ' Содержимое ячейки больше не нужно
  7504.      .Clear
  7505.    End With
  7506.  
  7507.    ' Задание начального положения изображения (левый верхний _
  7508.     угол листа)
  7509.   With image
  7510.       .Top = 0
  7511.       .Left = 0
  7512.    End With
  7513.  
  7514.    MsgBox "ПУСК!"
  7515.    With image
  7516.       ' Перемещение изображения по диагонали
  7517.      For i = 0 To 100
  7518.          .Top = i
  7519.          .Left = i
  7520.       Next
  7521.       ' Удаление изображения
  7522.      .Delete
  7523.    End With
  7524.    ' Удаление ссылки на изображение
  7525.   Set image = Nothing
  7526. End Sub
  7527. Вращающиеся автофигуры
  7528. Листинг 3.79. Вращение автофигур
  7529. Sub RotatingAutoShapes()
  7530.    Static fRunning As Boolean
  7531.    ' Проверка, выполняется ли уже этот макрос
  7532.   If fRunning Then
  7533.       ' При повторном запуске останавливаем все запущенные макросы
  7534.      fRunning = False
  7535.       End
  7536.    End If
  7537.    ' Укажем, что макрос запущен
  7538.   fRunning = True
  7539.  
  7540.    Dim cell As Range                  ' Рабочая ячейка
  7541.   Dim intLeftBorder As ****          ' Левая граница ячейки
  7542.   Dim intRightBorder As ****         ' Правая граница ячейки
  7543.   Dim intTopBorder As ****           ' Верхняя граница ячейки
  7544.   Dim intBottomBorder As ****        ' Нижняя граница ячейки
  7545.   Dim alngVertSpeed(1 To 2) As ****  ' Массивы со значениями
  7546.   Dim alngHorzSpeed(1 To 2) As ****  ' горизонтальной и вертикальной
  7547.                                      ' составляющих скоростей фигур
  7548.   Dim ashShapes(1 To 2) As Shape     ' Массив перемещаемых автофигур
  7549.   Dim i As Integer
  7550.  
  7551.    ' Заполнение массива автофигур
  7552.   Set ashShapes(1) = ActiveSheet.Shapes(1)
  7553.    Set ashShapes(2) = ActiveSheet.Shapes(2)
  7554.  
  7555.    ' Заполнение массива скоростей:
  7556.   ' для первой фигуры
  7557.   alngVertSpeed(1) = 3
  7558.    alngHorzSpeed(1) = 3
  7559.    ' для второй фигуры
  7560.   alngVertSpeed(2) = 4
  7561.    alngHorzSpeed(2) = 4
  7562.  
  7563.    ' Получение границ рабочей ячейки
  7564.   Set cell = Range("B2")
  7565.    intLeftBorder = cell.Left
  7566.    intRightBorder = cell.Left + cell.Width
  7567.    intTopBorder = cell.Top
  7568.    intBottomBorder = cell.Top + cell.Height
  7569.  
  7570.    ' Выполнение вращения и перемещения фигур
  7571.   Do
  7572.       ' Изменение положения каждой автофигуры
  7573.      For i = 1 To 2
  7574.          With ashShapes(i)
  7575.             ' Контроль достижения правой границы ячейки
  7576.            If .Left + .Width + alngHorzSpeed(i) > intRightBorder Then
  7577.                ' Корректировка положения
  7578.               .Left = intRightBorder - .Width
  7579.                ' Изменение направления горизонтальной скорости _
  7580.                 на противоположное
  7581.               alngHorzSpeed(i) = -alngHorzSpeed(i)
  7582.             End If
  7583.             ' Контроль достижения левой границы ячейки
  7584.            If .Left + alngHorzSpeed(i) < intLeftBorder Then
  7585.                ' Корректировка положения
  7586.               .Left = intLeftBorder
  7587.                ' Изменение направления горизонтальной скорости _
  7588.                 на противоположное
  7589.               alngHorzSpeed(i) = -alngHorzSpeed(i)
  7590.             End If
  7591.             ' Контроль достижения нижней границы ячейки
  7592.            If .Top + .Height + alngVertSpeed(i) > intBottomBorder Then
  7593.                ' Корректировка положения
  7594.               .Top = intBottomBorder - .Height
  7595.                ' Изменение направления вертикальной скорости _
  7596.                 на противоположное
  7597.               alngVertSpeed(i) = -alngVertSpeed(i)
  7598.             End If
  7599.             ' Контроль достижения верхней границы ячейки
  7600.            If .Top + alngVertSpeed(i) < intTopBorder Then
  7601.                ' Корректировка положения
  7602.               .Top = intTopBorder
  7603.                ' Изменение направления вертикальной скорости _
  7604.                 на противоположное
  7605.               alngVertSpeed(i) = -alngVertSpeed(i)
  7606.             End If
  7607.  
  7608.             ' Перемещение автофигуры
  7609.            .Left = .Left + alngHorzSpeed(i)
  7610.             .Top = .Top + alngVertSpeed(i)
  7611.             ' Вращение автофигуры (изменение направления вращения _
  7612.              происходит каждый раз при изменении направления _
  7613.              вертикального перемещения)
  7614.            .IncrementRotation alngVertSpeed(i)
  7615.  
  7616.             ' Даем Excel команду обработать пользовательский ввод
  7617.            DoEvents
  7618.          End With
  7619.       Next
  7620.    Loop
  7621. End Sub
  7622. Вызов таблицы цветов
  7623. Листинг 3.80. Отображение таблицы цветов
  7624. Sub ShowColorTable()
  7625.    Dim intColor As Integer
  7626.  
  7627.    ' Формирование заголовка таблицы
  7628.   Range("A1").Value = "Цвет"
  7629.    Range("B1").Value = "Значение свойства ColorIndex"
  7630.  
  7631.    ' Вывод таблицы
  7632.   Range("A2").Select
  7633.    For intColor = 1 To 56
  7634.       ' Окрашиваем ячейку столбца "A" в текущий цвет
  7635.      With ActiveCell.Interior
  7636.          .ColorIndex = intColor
  7637.          .Pattern = xlSolid
  7638.          .PatternColorIndex = xlAutomatic
  7639.       End With
  7640.       ' В ячейку столбца "B" вносим индекс текущего цвета
  7641.      ActiveCell.offset(0, 1).Value = intColor
  7642.       ' Переходим на следующую строку
  7643.      ActiveCell.offset(1, 0).Activate
  7644.    Next
  7645.  
  7646.    ' Покажем ячейку "A1" (начало таблицы)
  7647.   Range("A1").Select
  7648.    ActiveWindow.ScrollRow = 1
  7649. End Sub
  7650. Создание калькулятора
  7651. Листинг 3.81. Создание калькулятора
  7652. Sub SimpleCalculator()
  7653.    Dim strExpr As String
  7654.    ' Ввод выражения
  7655.   strExpr = InputBox("Что будем считать?")
  7656.    ' Подсчет и вывод результата
  7657.   MsgBox strExpr & " = " & Application.Evaluate(strExpr)
  7658. End Sub
  7659.  
  7660. Склонение фамилии, имени и отчества
  7661. Листинг 3.85. Склонение ФИО
  7662. Public Sub PossessiveCase()
  7663.    ' Склоняем ФИО в родительный падеж
  7664.   Dim strName1 As String, strName2 As String, strName3 As String
  7665.    strName1 = dhGetName(ActiveCell, 1)  ' Выделяем имя
  7666.   strName2 = dhGetName(ActiveCell, 2)  ' Выделяем фамилию
  7667.   strName3 = dhGetName(ActiveCell, 3)  ' Выделяем отчество
  7668.  
  7669.    ' Если в ячейке менее трех слов - закрытие процедуры
  7670.   If strName1 = "" Or strName2 = "" Or strName3 = "" Then Exit Sub
  7671.    ' Склоняем
  7672.   Cells(ActiveCell.Row, ActiveCell.Column) = dhPossessive( _
  7673.     strName1, strName2, strName3)
  7674. End Sub
  7675.  
  7676. Public Sub DativeCase()
  7677.    ' Объявление переменных
  7678.   Dim strName1 As String, strName2 As String, strName3 As String
  7679.    strName1 = dhGetName(ActiveCell, 1)
  7680.    strName2 = dhGetName(ActiveCell, 2)
  7681.    strName3 = dhGetName(ActiveCell, 3)
  7682.    ' Если в ячейке менее трех слов - закрытие процедуры
  7683.   If Len(strName1) = 0 Or Len(strName2) = 0 Or Len(strName3) = 0 _
  7684.     Then Exit Sub
  7685.  
  7686.    Cells(ActiveCell.Row, ActiveCell.Column) = dhDative( _
  7687.     strName1, strName2, strName3)
  7688. End Sub
  7689.  
  7690. Function dhPossessive(strName1 As String, strName2 As String, _
  7691.  strName3 As String) As String
  7692.    Dim fMan As Boolean
  7693.    ' Определяем, мужские ФИО или женские
  7694.   fMan = (Right(strName3, 1) = "ч")
  7695.  
  7696.    ' Склонение фамилии в родительный падеж
  7697.   If Len(strName1) > 0 Then
  7698.       If fMan Then
  7699.          ' Склонение мужской фамилии
  7700.         Select Case Right(strName1, 1)
  7701.             Case "о", "и", "я", "а"
  7702.                dhPossessive = strName1
  7703.             Case "й"
  7704.                dhPossessive = Mid(strName1, 1, Len(strName1) - 2) + "ого"
  7705.             Case Else
  7706.                dhPossessive = strName1 + "а"
  7707.          End Select
  7708.       Else
  7709.          ' Склонение женской фамилии
  7710.         Select Case Right(strName1, 1)
  7711.             Case "о", "и", "б", "в", "г", "д", "ж", "з", "к", "л", _
  7712.              "м", "н", "п", "р", "с", "т", "ф", "х", "ц", "ч", _
  7713.              "ш", "щ", "ь"
  7714.                dhPossessive = strName1
  7715.             Case "я"
  7716.                dhPossessive = Mid(strName1, 1, Len(strName1) - 2) & "ой"
  7717.             Case Else
  7718.                dhPossessive = Mid(strName1, 1, Len(strName1) - 1) & "ой"
  7719.          End Select
  7720.       End If
  7721.       dhPossessive = dhPossessive & " "
  7722.    End If
  7723.    ' Склонение имени в родительный падеж
  7724.   If Len(strName2) > 0 Then
  7725.       If fMan Then
  7726.          ' Склонение мужского имени
  7727.         Select Case Right(strName2, 1)
  7728.             Case "й", "ь"
  7729.                dhPossessive = dhPossessive & Mid(strName2, _
  7730.                 1, Len(strName2) - 1) & "я"
  7731.             Case Else
  7732.                dhPossessive = dhPossessive & strName2 & "а"
  7733.          End Select
  7734.       Else
  7735.          ' Склонение женского имени
  7736.         Select Case Right(strName2, 1)
  7737.             Case "а"
  7738.                Select Case Mid(strName2, Len(strName2) - 1, 1)
  7739.                   Case "и", "г"
  7740.                      dhPossessive = dhPossessive & Mid( _
  7741.                       strName2, 1, Len(strName2) - 1) & "и"
  7742.                   Case Else
  7743.                      dhPossessive = dhPossessive & Mid(strName2, _
  7744.                       1, Len(strName2) - 1) & "ы"
  7745.                End Select
  7746.             Case "я"
  7747.                If Mid(strName2, Len(strName2) - 1, 1) = "и" Then
  7748.                   dhPossessive = dhPossessive & Mid(strName2, _
  7749.                    1, Len(strName2) - 1) & "и"
  7750.                Else
  7751.                   dhPossessive = dhPossessive & Mid(strName2, _
  7752.                    1, Len(strName2) - 1) & "и"
  7753.                End If
  7754.             Case "ь"
  7755.                dhPossessive = dhPossessive & Mid(strName2, _
  7756.                 1, Len(strName2) - 1) & "и"
  7757.             Case Else
  7758.                dhPossessive = dhPossessive & strName2
  7759.          End Select
  7760.       End If
  7761.       dhPossessive = dhPossessive & " "
  7762.    End If
  7763.    ' Склонение отчества в родительный падеж
  7764.   If Len(strName3) > 0 Then
  7765.       If fMan Then
  7766.          dhPossessive = dhPossessive & strName3 & "а"
  7767.       Else
  7768.          dhPossessive = dhPossessive & Mid(strName3, 1, _
  7769.           Len(strName3) - 1) & "ы"
  7770.       End If
  7771.    End If
  7772. End Function
  7773.  
  7774. Function dhDative(strName1 As String, strName2 As String, _
  7775.  strName3 As String) As String
  7776.    Dim fMan As Boolean
  7777.    ' Определяем, мужские ФИО или женские
  7778.   fMan = (Right(strName3, 1) = "ч")
  7779.  
  7780.    ' Склонение фамилии в дательный падеж
  7781.   If Len(strName1) > 0 Then
  7782.       If fMan Then
  7783.          ' Склонение мужской фамилии
  7784.         Select Case Right(strName1, 1)
  7785.             Case "о", "и", "я", "а"
  7786.                dhDative = strName1
  7787.             Case "й"
  7788.                dhDative = Mid(strName1, 1, Len(strName1) - 2) + "ому"
  7789.             Case Else
  7790.                dhDative = strName1 + "у"
  7791.          End Select
  7792.       Else
  7793.          ' Склонение женской фамилии
  7794.         Select Case Right(strName1, 1)
  7795.             Case "о", "и", "б", "в", "г", "д", "ж", "з", "к", "л", _
  7796.              "м", "н", "п", "р", "с", "т", "ф", "х", "ц", "ч", "ш", _
  7797.              "щ", "ь"
  7798.                dhDative = strName1
  7799.             Case "я"
  7800.                dhDative = Mid(strName1, 1, Len(strName1) - 2) & "ой"
  7801.             Case Else
  7802.                dhDative = Mid(strName1, 1, Len(strName1) - 1) & "ой"
  7803.          End Select
  7804.       End If
  7805.       dhDative = dhDative & " "
  7806.    End If
  7807.    ' Склонение имени в дательный падеж
  7808.   If Len(strName2) > 0 Then
  7809.       If fMan Then
  7810.          ' Склонение мужского имени
  7811.         Select Case Right(strName2, 1)
  7812.             Case "й", "ь"
  7813.                dhDative = dhDative & Mid(strName2, 1, _
  7814.                 Len(strName2) - 1) & "ю"
  7815.             Case Else
  7816.                dhDative = dhDative & strName2 & "у"
  7817.          End Select
  7818.       Else
  7819.          ' Склонение женского имени
  7820.         Select Case Right(strName2, 1)
  7821.             Case "а", "я"
  7822.                If Mid(strName2, Len(strName2) - 1, 1) = "и" Then
  7823.                   dhDative = dhDative & Mid(strName2, 1, _
  7824.                    Len(strName2) - 1) & "и"
  7825.                Else
  7826.                   dhDative = dhDative & Mid(strName2, 1, _
  7827.                    Len(strName2) - 1) & "е"
  7828.                End If
  7829.             Case "ь"
  7830.                dhDative = dhDative & Mid(strName2, 1, _
  7831.                 Len(strName2) - 1) & "и"
  7832.             Case Else
  7833.                dhDative = dhDative & strName2
  7834.          End Select
  7835.       End If
  7836.       dhDative = dhDative & " "
  7837.    End If
  7838.    ' Склонение отчества в дательный падеж
  7839.   If Len(strName3) > 0 Then
  7840.       If fMan Then
  7841.          dhDative = dhDative & strName3 & "у"
  7842.       Else
  7843.          dhDative = dhDative & Mid(strName3, 1, Len(strName3) - 1) & "е"
  7844.       End If
  7845.    End If
  7846. End Function
  7847.  
  7848. Function dhGetName(strString As String, intNum As Integer)
  7849.    ' Функция возвращает слово с номером intNum во входной строке _
  7850.     strString
  7851.   Dim strTemp As String
  7852.    Dim intWord As Integer
  7853.    Dim intSpace As Integer
  7854.  
  7855.    ' Удаление пробелов по краям строки
  7856.   strTemp = Trim(strString)
  7857.    ' Просмотр строки (до слова с нужным номером)
  7858.   For intWord = 1 To intNum - 1
  7859.       ' Поиск следующего пробела
  7860.      intSpace = InStr(strTemp, " ")
  7861.       If intSpace = 0 Then
  7862.          ' Строка закончилась
  7863.         intSpace = Len(strTemp)
  7864.       End If
  7865.       ' Строка strTemp теперь начинается со слова с номером intWord
  7866.      strTemp = Trim(Right(strTemp, Len(strTemp) - intSpace))
  7867.    Next intWord
  7868.  
  7869.    ' Выделение нужного слова (по пробелу после него)
  7870.   intSpace = InStr(strTemp, " ")
  7871.    If intSpace = 0 Then
  7872.       intSpace = Len(strTemp)
  7873.    End If
  7874.    dhGetName = Trim(Left(strTemp, intSpace))
  7875. End Function
  7876.  
  7877. ГЛАВА . ДАТА И ВРЕМЯ
  7878. Вывод даты и времени_1
  7879. Sub Test()
  7880.  Dim MyDate As Date
  7881.  MyDate = DateValue("6/1/72") + TimeValue("10:10:12")
  7882.  MsgBox Str(Minute(MyDate))
  7883.  MsgBox Str(Year(MyDate))
  7884. End Sub
  7885. Вывод даты и времени_2
  7886.  
  7887. Sub TimeAndDate()
  7888.    Dim strDate As String, strTime As String
  7889.    Dim strGreeting As String
  7890.    Dim strUserName As String
  7891.    Dim intSpacePos As Integer
  7892.  
  7893.    strDate = Format(Date, "**** Date")
  7894.    strTime = Format(Time, "Medium Time")
  7895.    ' Приветствие - в зависимости от времени суток
  7896.   If Time < TimeValue("12:00") Then
  7897.       strGreeting = "Доброе утро, "
  7898.    ElseIf Time < TimeValue("17:00") Then
  7899.       strGreeting = "Добрый день, "
  7900.    Else
  7901.       strGreeting = "Добрый вечер, "
  7902.    End If
  7903.    ' В приветствие добавляется имя текущего пользователя
  7904.   strUserName = Application.UserName
  7905.    intSpacePos = InStr(1, strUserName, " ", 1)
  7906.    ' Управление ситуацией, когда в имени нет пробела
  7907.   If intSpacePos = 0 Then intSpacePos = Len(strUserName)
  7908.    strGreeting = strGreeting & Left(strUserName, intSpacePos)
  7909.  
  7910.    ' Вывод на экран информационного сообщения о дате и времени
  7911.   MsgBox strDate & vbCrLf & strTime, vbOKOnly, strGreeting
  7912. End Sub
  7913.  
  7914.  
  7915. Получение системной даты
  7916.  
  7917. Извлечение даты и часов
  7918. Month(переменная типа Date)
  7919. Day(переменная типа Date)
  7920. Year(переменная типа Date)
  7921. Hour(переменная типа Date)
  7922. Minute(переменная типа Date)
  7923. Second(переменная типа Date)
  7924. WeekDay(переменная типа Date)
  7925. WeekDay это день недели, если Вам это нужно, то вы можете написать что-то типа этого.
  7926. Sub Test()
  7927.  Dim MyDate As Date
  7928.  MyDate = DateValue("9/1/72")
  7929.  If (Weekday(MyDate) = vbSunday) Then MsgBox ("Sunday")
  7930. End Sub
  7931. vbSunday это константа , есть еще vbMonday , ну дальше понятно.
  7932. Функция ДатаПолная
  7933. Function ДатаПолная(Ячейка)
  7934.    ' Получение данных в заданной ячейке в формате _
  7935.     "dd mmmm yyyy"
  7936.   Дата = Format(Ячейка, "dd mmmm yyyy")
  7937.    If IsDate(Ячейка) = True Or IsDate(Дата) = True Then
  7938.       ' Возврат строки с полной датой
  7939.      ДатаПолная = StrConv(Дата, vbProperCase)
  7940.    Else
  7941.       ' Данные в ячейке не являются датой
  7942.      ДатаПолная = "<>"
  7943.    End If
  7944. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement