|
Access і Visual basic for Application. Excel VBA: прийоми програмування |
екомендується описувати всі змінні явно, це дозволить уникнути помилок, пов'язаних з перетворенням типів даних. Явний опис типу проводиться оператором Dim, після якого указується ім'я змінної і її тип. Якщо при явному оголошенні змінній не вказаний тип даних, а задано тільки ім'я змінної те буде створене змінна типа Variant, якою можна привласнювати ланцюжки символів, числа з плаваючою крапкою, значення дати і часу. ACCESS 97 однозначно ідентифікує привласнюванні значення, оскільки разом з ними він зберігає в змінній і ознака типу.У ACCESS використовуються наступні типи даних:Тип даних. Значення, що зберігаються. Область значеньBoolean Логічна величина True або FalseByte Ціле позитивне число Від 0 до 255Integer Ціле число Від - 32768 до 32768Long Ціле число подвійної довжини Від - 2147483648 до 2147483648Single Число з плаваючою крапкою Від - 3,402823Е38 до - 1,401298Е-45 і від 1,401298Е-45 до 3,402823Е38Double Число з плаваючою точкою подвійної точності Від - 1,79769313486232Е308 до - 4,94065645841247Е-32 і від 4,94065645841247Е-324 до 1,79769313486232Е308Currency Число з фіксованою крапкою (використовується для проведення грошових розрахунків) Від - 922337203685477,5808 до 922337203685477,5807Rate Дата Від 1 січня 100 року до 31 грудня 9999 рокуString (фіксованої довжини) Рядкове значення Довжина від 1 до 65536String (змінної довжини) Рядкове значення Довжина від 0 до 2147483648Для оголошення декілька змінних можна користуватися одним оператором Dim, перераховуючи їх через кому.При оголошенні змінній слід пам'ятати про область дії. Змінні оголошені в процедурі, можна використовувати тільки усередині цієї процедури. Якщо змінна повинна бути доступна у всіх процедурах одного модуля, її необхідно оголосити в області опису модуля. Тут також можна застосовувати оператора Dim. Найбільшу область дії має змінна, оголошена глобальною (з префіксом Global) в області опису модуля. Синтаксис оператора Global не відрізняється від синтаксису оператора Dim.На відміну від змінній, константа містить фіксоване значення, яке не може бути змінене в процесі виконання програми. Згідно правилам хорошого тону, константи, як і змінні, слід оголошувати явно, указуючи їх імена і значення. Для оголошення константи використовується оператор Const. Оголошену константу можна використовувати в програмі, звертаючись до неї по імені. Наприклад:Const Число_Пи = 3.14159265.2. Умовні операториУ мові VBA, як і в інших мовах програмування, основними елементами, керівниками ходом виконання процедури, є умовні оператори. Найбільш простій з них - оператор If... Then:If Поліна = "Ж" ThenПоздоровлення = "З 8 березня!"End ifЯкщо умова, задана виразом між ключовими словами If і Then виконується, дотримуються інструкції усередині блоку, обмеженого ключовими словами Then і End if. Інакше оператори між ключовими словами не виконуються, а ACCESS перейде до обробки оператора, який слідує за ключовими слова End if. У разі потреби провести дві різні дії (одне при дотриманні умови, а друге - ні), доцільно скористатися повною формою оператора If:If вираз ThenОператор1ElseОператор2End ifЯкщо умова дотримується, виконується Оператор1 (або група операторів, розташованих між ключовими словами Then і Else, а якщо не дотримується - Оператор2 (або група операторів, розташованих між ключовими словами Else і End if.Проте, не завжди можливі два варіанти рішення. Враховуючи це, VBA надає в розпорядження користувачів оператора Select Case, призначеного для вибору одного з множин варіантів рішень:Select Case МістоCase "Київ"Код_МГТС = "044"Case "Москва"Код_МГТС = "095"Case "Запоріжжя"Код_МГТС = "061-2"Case ElsePrint "Я не знаю такого міста!"End SelectПри виконанні цього оператора перевіряється значення змінної Місто. Залежно від результату перевірки змінної Код_МГТС привласнюється телефонною код деякого міста. Якщо значення змінної Місто не співпадає ні з одним із значень, перерахованих в рядках з ключовим словом Case, проводиться дія, вказаною між ключовими словами Case Else і End Select.5.3. Оператори циклуЦикл використовується для багатократного повторення однієї або декількох інструкцій. Кількість повторень циклу пов'язана з деякою умовою. У VBA передбачено декілька різновидів циклів. Простим прикладом циклічної конструкції є так званий цикл по лічильнику.For Лічильник = 1 To 10Print ЛічильникNext ЛічильникЦикл по лічильнику обмежується ключовими словами For і Next. Після ключового слова For указується ім'я змінної, яка виконуватиме роль лічильника, після знаку рівності - початкове значення лічильника, а після ключового слова To - кінцеве значення лічильника.Ще один різновид циклу - While-цикл. Умова виконання команд усередині такого циклу визначається деяким умовним оператором:Do While Лічильник <> 10PrintLoopРізновидом циклу Do є Until-цикл, який виконується, поки умовний вираз помилковий:Do Until Счетчик=10PrintСчетчик=Счетчик+1Loop6. Excel VBA: Прийоми програмуванняЯк визначити останній запис в таблиці Excel?Необхідно знайти останній запис в електронній таблиці. Це можна було б організувати функцією Application. SpecialCells (xlLastCell)Як відмінити виділення діапазону осередків?ActiveSheet. Cells. SelectПісля припинення роботи макросу діапазон залишається виділеним. Як це виділення прибрати?Selection. Cells (1). Select Фокус введення потрапить після цього на перший осередок раніше виділеного діапазону.Як з макросу Excel програмно створити таблицю Access?Ось фрагмент коду, який створює таблицю "BalanceShifr" базі даних MS Access:Не забудьте виставити в Excel посилання на об'єкти DAO![VBA] Tools/References/Available References/ [x] MicroSoft DAO?.? Library ' Function CreateTable ' Create temporary table "BalanceShifr" into temporary databasePublic Function CreateTable (ByVal dbTemp As Database) As BooleanDim tdfTemр As TableDefDim idx As IndexDim fld As FieldOn Error GoTo errhandleCreateTable = True' CREATE TABLE "BalanceShifr"Set tdfTemp = dbTemp. CreateTableDef ("BalanceShifr")Set fld = tdfTemp. CreateField ("ConditionId", dbLong)fld. Required = TruetdfTemp. Fields. Append fldSet fld = tdfTemp. CreateField ("Account", dbText,4)tdfTemp. Fields. Append fldSet fld = tdfTemp. CreateField ("SubAcc", dbText,4)tdfTemp. Fields. Append fldSet fld = tdfTemp. CreateField ("Shifr", dbLong)tdfTemp. Fields. Append fldSet fld = tdfTemp. CreateField ("Date", dbDate)fld. Required = TruetdfTemp. Fields. Append fldSet fld = tdfTemp. CreateField ("SaldoDeb", dbCurrency)tdfTemp. Fields. Append fldSet fld = tdfTemp. CreateField ("SaldoKr", dbCurrency)tdfTemp. Fields. Append flddbTemp. TableDefs. Append tdfTemp' CREATE INDEX "BalanceShifr"Set tdfTemp = dbTemp. TableDefs ("BalanceShifr")Set idx = tdfTemp. CreateIndex ("ForeignKey")Set fld = idx. CreateField ("ConditionId")idx. Fields. Append fldtdfTemp. Indexes. Append idxExit FunctionerrHandle:MsgBox "Table creating error!", vbExclamation, "Error"CreateTable = FalseEnd FunctionВидалення листів залежно від датиЯк видалити робочі листи листів залежно від дати?Ось код функції на Excel VBA, який вирішує дану проблему:' Function DelSheetByDate' Видаляє робочий лист sSheetName в активній робочій книзі' якщо дата dDelDate вже наступила' У разі успіху повертає True, інакше - FalsePublic Function DelSheetByDate (sSheetName As String _dDelDate As Date) As BooleanOn Error GoTo errHandleDelSheetByDate = False' Перевірка датиIf dDelDate <= Date Then' Не виводити підтвердження на видаленняApplication. DisplayAlerts = FalseActiveWorkbook. Worksheets (sSheetName). DeleteDelSheetByDate = TrueApplication. DisplayAlerts = TrueEnd IfExit FunctionerrHandle:MsgBox Err. Description, vbCritical, "Помилка №" & Err. NumberEnd FunctionПридушення "гарячих" клавішPublic Sub Auto_Open ()' Overrride standard acceleratorsWith Application. OnKey "^o", "Dummy". OnKey "^s", "NewAction". OnKey "^р", "" ' Kill hotkey!End WithEnd Sub' - ----Public Sub Dummy ()MsgBox "This hotkey redefined!"End Sub' - ----Public Sub NewAction ()SendKeys "^n" ' Press <CTRL>+<s> for create new file' instead of <CTRL>+<n>!End SubHint: Відладжено в MS Excel '97!Підказки до ToolbarЯк зробити до "саме намальованим" кнопочкам на Toolbar підказки?Зробити можна от як: (Приклад реалізації на Excel'97 VBA)' Створюємо тулбарРublic Sub InitToolBar ()Dim cmdbarSM As CommandBarDim ctlNewBtn As CommandBarButtonSet cmdbarSM = CommandBars. Add (Name: ="MyToolBar"Position: =msoBarFloating _temporary: =True)With cmdbarSM' 1) Додаємо кнопкуSet ctlNewBtn =. Controls. Add (Type: =msoControlButton)With ctlNewBtn. FaceId = 26. OnAction = "OnButton1_Click". TooltipText = "My tooltip message!"End With' 2) Додаємо ще кнопкуSet ctlNewBtn =. Controls. Add (Type: =msoControlButton)With ctlNewBtn. FaceId = 44. OnAction = "OnButton2_Click". TooltipText = "Another tooltip message!"End With. Visible = TrueEnd WithEnd SubЯк визначити адресу активного осередкуЯк в макросі дізнатися і використовувати поточне положення курсораActiveCell. Row і ActiveCell. Column - покажуть координати активного осередку.Підрахунок коментарів на робочому листіЯк дізнатися чи є хоч один Notes (коментар) в робочому листі, окрім як перебором по всіх осередках?У Excel'97 ця проблема може бути вирішена от як:' Function IsCommentsPresent' Повертає TRUE, якщо на активному робочому листі є хоч би' один осередок з коментарем, інакше повертає FALSE'Public Function IsCommentsPresent () As BooleanIsCommentsPresent = (ActiveSheet.comments. Count <> 0)End FunctionПідказки до Toolbar (Excel'95 і '97)Як зробити свій власний Toolbar з tooltip'ами на кнопках в Excel'95?Ось фрагмент коду для Excel'95, який створює toolbar з однією кнопкою з призначеним для користувача tooltiр'ом. Натиснення кнопки приводить до виконання макросу NothingToDo ().' This example creates а new toolbar, adds the Camera button' (button index number 228) to it, and then displays the new toolbar.'Public Sub CreateMyToolBar ()Dim myNewToolbar As ToolbarOn Error GoTo errHandle:Set myNewToolbar = Toolbars. Add (Name: ="My New Toolbar")With myNewToolbar. ToolbarButtons. Add Button: =228, StatusBar: ="Statusbar help string". Visible = TrueWith. ToolbarButtons (1). OnAction = "NothingToDo". Name = "My custom tooltiр text!"End WithEnd WithExit SuberrНandle:MsgBox "Error number " & Err & ": " & Error (Err)End Sub'' Toolbar button on action code'Рublic Sub NothingToDo ()MsgBox "Nothing to do!", vbInformation, "Macro running"End SubЗапуск Excel з пошуком осередкуЯк запустити Excel, щоб опинитися на осередку вміст якої відомий наперед?' Sub GotoFixedCell:' Робить активним осередок, що містить значення vVariant на' робочому листі sSheetName в активній робочій книзі.'' Note: Вміст осередків інтерпретується як 'значення'!Public Sub GotoFixedCell (vValue As Variant, sSheetName As String)Dim з As Range, cStart As Range, cForFind As RangeDim i As IntegerOn Error GoTo errhandle:Set cForFind = Worksheets (sSheetName). Cells ' Діапазон пошукуWith cForFindSet з =. Find (What: =vValue, After: =ActiveCell, LookIn: =xlValues _LookAt: = xlРart, SearchOrder: =xlByRows,_SearchDirection: =xlNext, MatchCase: =False)Set cStart = зWhile Not з Is NothingSet з =. FindNext (c)If з. Address = cStart. Address Thenз. SelectExit SubEnd IfWendEnd WithExit SuberrНandle:MsgBox Err. Descriрtion, vbExclamation, "Error #" & Err. NumberEnd SubДосить виконати цей код з макросу Auto_Oрen () !Протестовано і відладжено в Excel'97.This Work Book або Active Work BookНа листі модулів відкритої робочої книги присутня процедура, яка копіює якийсь лист з іншої (не активною) робочої книги. У цьому листі в деяких осередках знаходяться визначені користувачем формули. Процедура працює без проблем.З workbook, що містить цю процедуру, я роблю надбудову (. xla) і підключаю її до Excel 95. При виклику вищеописаної процедури вона видає повідомлення:Run time error 424 object requiredЯк можна уникнути цього повідомлення?Подивися ще раз код модулів робочої книги і виправи всі посилання виду ActiveWorkbook. WorkSheets (". на посилання виду ThisWorkBook. WorkSheets (". .Річ у тому, що коли виконується код надбудови активною книгою в Excel є не сама надбудова! Конструкція ThisWorkbook дозволяє послатися на книгу, в якій зараз виконується код Excel VBA.Нint: Це загальний принцип створення надбудов Excel!Як задати ім'я листу, який буде вставлений?' Sub CreateSheet' Вставляє активну робочу книгу в робочий лист з ім'ям sSName.' Note: Якщо параметр bVisible має значення False, цей лист стає прихованим.'Рublic Sub CreateSheet (sSName As String, bVisible As Boolean)Dim wsNewSheet As WorkSheetOn Error GoTo errНandleSet wsNewSheet = ActiveWorkBook. Worksheets. AddWith wsNewSheet. Name = sSName. Visible = bVisibleEnd WithExit SuberrНandle:MsgBox Err. Descriрtion, vbExclamation, "Error #" & Err. NumberEnd SubЯк перевірити чи існує лист?' Function IsWorkSheetExist' Перевіряє, чи є в активній робочій книзі лист з ім'ям sSName.' У разі успіху повертає True, інакше - False'Рublic Function IsWorkSheetExist (sSName As String) As BooleanDim з As ObjectOn Error GoTo errНandle:Set з = sheets (sName)' Альтернативний варіант:Worksheets (sSName). Cells (1,1) = Worksheets (sSName). Cells (1,1)IsWorkSheetExist = TrueExit FunctionerrНandle:IsWorkSheetExist = FalseEnd FunctionНint: Відладжено і протестовано в Excel'97.Як звернутися до осередку по її імені?Як звернутися до осередки по її імені? Тобто є Лист1 і в ньому осередки з ім'ям Дебет і Кредит. Хочу підрахувати Дебет-Кредит засобами Excel VBA. Спробував Range (Дебет) - Range (Кредит), лається, що не описані змінні.Ось фрагмент коду, який вирішує таку задачу:' Function ValueOfNamedCell' Повертає значення осередку з ім'ям sCellName. у активній робочій книзі.' Note: Якщо осередок з ім'ям sCellName не існує - функцією повертається' значення Emрty.Рublic Function ValueOfNamedCell (sCellName As String) As VariantOn Error GoTo errНandleValueOfNamedCell = ActiveWorkbook. Names (sCellName). RefersToRange. ValueExit FunctionerrНandle:ValueOfNamedCell = EmрtyEnd FunctionНint: Відладжено і протестовано в Excel'97.Чи можна з програми на Visual Basic створити робочу книгу Excel?Так, можна. Приклад того, як з Visual Basic'a через OLE запустити Excel, і створити робочу книгу.' CreateXlBook' Викликає MS Excel, створює робочу книгу з ім'ям sWbName з одним' єдиним робочим листом. Робоча книга буде збережена в каталозі' sDirName. У разі успіху повертає True, інакше - False.'Public Function CreateXlBook (sWbName As String, sDirName) As Boolean' MS Excel hidden instanceDim objXLApp As ObjectDim objWbNewBook As ObjectCreateXlBook = FalseSet objXLApp = CreateObject ("Excel. Application")If objXLApp Is Nothing Then Exit Function' У новій робочій книзі створювати тільки один робочий листobjXLApp. SheetsInNewWorkbook = 1Set objWbNewBook = objXLApp. Workbooks. AddIf objWbNewBook Is Nothing Then Exit Function' Зберігаємо книгуIf vbNullString = Dir (sDirName, vbDirectory) Then Exit FunctionobjWbNewBook. SaveAs (sDirName + "\" + sWbName + ". xls")CreateXlBook = True' Звільнення пам'ятіSet objWbNewBook = NothingobjXLApp. QuitSet objXLApp = NothingCreateXlBook = TrueEnd Function
Страницы: 1, 2
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|