Оригінальний макрос Excel, FoxPro, Бази даних, статті

Спочатку власне створимо макрос, перекладом якого пізніше і займемося.
Відкрийте Excel, створіть новий файл і запустіть запис макросу через пункт меню
"Сервіс" – "Макрос" – "Почати запис". Ім'я макросу залиште в значенні по
умовчанням "Макрос1" та натисніть кнопку "Ok".


Далі заповнюємо лист Excel таким вмістом















Названіереквізіта Значеніереквізіта
Перший 1 234,56
Другий 9 876,54
РАЗОМ 11 111,10

Тут зроблено наступне:



Зупиняю запис макросу і дивлюся, що ж у мене вийшло. Пункт меню
"Сервіс" – "Макрос" – "Макрос". Вибираю ім'я щойно записаний макросу
"Макрос1" і натискаю кнопку "Змінити".

 Sub Макрос1 ()

"Макрос1 Макрос
"Макрос записаний 10.05.2005 (Максимов)


"Введення вмісту клітинок
ActiveCell.FormulaR1C1 = "Назва реквізиту"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Значення реквізиту"
Range("A2").Select
ActiveCell.FormulaR1C1 = "Перший"
Range("B2").Select
ActiveCell.FormulaR1C1 = "1324.56"
Range("A3").Select
ActiveCell.FormulaR1C1 = "Другий"
Range("B3").Select
ActiveCell.FormulaR1C1 = "9876.54"
Range("A4").Select
ActiveCell.FormulaR1C1 = "РАЗОМ"

"Формула розрахунку підсумку
Range("B4").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"

"Виділення першої та останньої рядків жирним шрифтом
Range("1:1,4:4").Select
Range("A4").Activate
Selection.Font.Bold = True

"Установка формату для другого стовпця
Columns("B:B").Select
Selection.NumberFormat = "#,##0.00"

"Установка умовного формату для числових даних другого стовпця
Range("B2:B4").Select
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type: = xlCellValue, Operator: = xlLess, _
Formula1:="2000"
Selection.FormatConditions(1).Interior.ColorIndex = 3

"Малювання рамки навколо всіх даних
Range("A1:B4").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With

"Установка формату даних для першого рядка (перенесення по словах і вирівнювання)
Rows("1:1").Select
Selection.NumberFormat = "@"
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlTop
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With

"Уточнення ширини стовпців
Columns("A:A").ColumnWidth = 11.57
Columns("B:B").ColumnWidth = 10.14

"Уточнення висоти першого рядка
Selection.RowHeight = 25.5

"Перехід на першу клітинку для скидання виділень
Range("A1").Select
End Sub


Зрозуміло, всередині коду макросу немає жодних коментарів. Я їх розставив сам,
для полегшення сприйняття. Все інше взято з коду макросу без змін.
Тепер спробуємо розібрати, що ж таке тут понаписувано.


Відкриття листа Excel в FoxPro


Перш ніж приступити до "розбору польотів" власне макросу, невелике
відступ, для того, щоб показати як власне відкрити Excel з FoxPro.
Справа в тому, що наступний код переказу макросу буде, так чи інакше, посилатися
на відкритий лист Excel.


Новий лист Excel відкривається наступним чином

 * Створюємо об'єкт Excel
LOCAL loExcel
loExcel=CREATEOBJECT(“Excel.Application”)

* Створюємо в ньому нову робочу книгу
LOCAL loBook
#DEFINE xlWBATWorksheet -4167
loBook = m.loExcel.workbooks.Add(xlWBATWorksheet)

* Створюємо посилання на новий лист у робочій книзі
LOCAL loSheet
loSheet = m.loBook.Sheets(1)

* Робимо Excel дивись
* Цю команду треба давати в самому кінці формування листа Excel
* Тут вона приведена для наочності
loExcel.Visible= .T.


Тут відразу потрібні деякі пояснення.


Ієрархія головних об'єктів Excel досить проста:


Сам об'єкт Excel (Excel.Application)
Колекція робочих книг (WorkBooks)
Колекція листів (Sheets)
Набір клітинок (Range, Cells, Columns, Rows)


Сам об'єкт Excel (Excel.Application) – Це якась "оболонка", яка
сама по собі особливого інтересу не представляє. Ну, приблизно як власне середу
FoxPro не має особливого сенсу без якихось користувальницьких форм або меню. Це
просто "середовище", де і "живуть" всі інші об'єкти Excel


Колекція робочих книг (WorkBooks) – Одна робоча книга – це один
файл XLS. Як правило, в одному об'єкті Excel відкривається тільки один файл XLS
(Робоча книга). Але, в принципі, можна відкрити і декілька файлів XLS в одному
об'єкті Excel.


Колекція листів (Sheets) – Один лист – це одна "сторінка" файлу XLS.
Або одна "сітка". При використаному вище способі створення робочої книги буде
створена робоча книга тільки з одним листом. Якщо ж взагалі не вказувати ніяких
параметрів у методі Add при створенні нової робочої книги, то кількість аркушів
буде визначатися настройками Excel у клієнта. Пункт меню Excel з ім'ям
"Сервіс" – "Параметри" – Закладка "Загальні" – реквізит "Листів в новій книзі"


Набір клітинок (Range, Cells, Columns, Rows) – Це вже власне клітинки
аркуша Excel. Можливі різні способи адресації до осередків:



Щоб почати заповнювати лист Excel треба попередньо обов'язково відкрити сам
об'єкт Excel і в ньому створити (або відкрити) робочу книгу.


Об'єкт Excel створюється саме командою CreateObject (), а не попередньої
спробою використовувати вже існуючий об'єкт Excel через команду GetObject () не
для наочності. Саме так і слід чинити! Справа в тому, що при
використання команди GetObject () невідомо, який саме з існуючих
об'єктів Excel буде "захоплений". Така невизначеність рано чи пізно, але
"Вийде боком". Тому краще створити новий об'єкт і бути впевненим, що при
цьому ніяк не зіпсуєш раніше відкриті об'єкти Excel.


У наведеному вище прикладі я в кінці кінців отримав посилання на потрібний мені лист
Excel. Далі я буду працювати саме з цим посиланням. Однак, в принципі, замість
повної ієрархії "Об'єкт Excel – Робоча книга – Лист – осередок" можна працювати і
напряму "Об'єкт Excel – осередок". Тобто "Пропустивши" всю "зайву" ієрархію
"Робоча книга – Лист".


Тільки слід мати на увазі, що при такій адресації проте
"Пропущена" ієрархія буде використана. Але використана неявно. За замовчуванням.
У цьому випадку передбачається, що йде посилання на активну робочу книгу і
активний лист. Зверніть увагу на слово "активний". Це зовсім не
означає "перший". Це саме "активний". Але це може бути, наприклад, десятий
лист.


Підключення механізму IntelliSens в FoxPro


Починаючи з версії Visual FoxPro 7 з'явився механізм IntelliSens. Якщо у Вас
молодша версія FoxPro, то даний розділ Ви можете сміливо пропустити. Для
власне перекладу коду макросу Excel в синтаксис FoxPro те, що написано в
даному розділі принципового значення не має. Це просто додаткові
зручності, пов'язані виключно з механізмом IntelliSens


Отже, механізм IntelliSens зокрема відображає список всіх властивостей,
методів і подій об'єкта в спадному списку, який з'являється автоматично
як тільки Ви встановите точку відразу за ім'ям об'єкта. Проте щоб цей
механізм спрацював у програмі необхідно виконати те, що в FoxPro називається
"Раніше зв'язування". Іншими словами, необхідно якось дати зрозуміти FoxPro ще на
етапі написання програмного коду який саме об'єкт "ховається" за вибраним
ім'ям змінної. Для цього використовується спеціальний синтаксис у визначенні
області видимості об'єкта. В даному випадку, приблизно так:


LOCAL loExcel as Excel.Application loExcel = CREATEOBJECT ("Excel.Application")


Звідки FoxPro дізнався про те, де взяти список властивостей, подій і методів
об'єкта Excel.Application? А з системного реєстру Windows. Точніше, звичайно, в
системному реєстрі зберігатися не сам список властивостей, а посилання на бібліотеку, в
якій ці властивості описані. Просто в процесі установки власне Excel в
системному реєстрі Windows був сформований якийсь ідентифікатор для об'єкта з
назвою Excel.Application. А вже з цього ідентифікатора можна визначити
масу інформації пов'язану з цим об'єктом. У тому числі і повний шлях до файлу зі
списком властивостей і методів даного об'єкта.


Все це, звичайно, добре. Але ж основна робота буде відбуватися не
власне з об'єктом Excel.Application, а з об'єктами, що існують всередині
Excel.Application. Невже, для того, щоб працював механізм IntelliSens
доведеться завжди писати повну ієрархію об'єктів Excel починаючи з самого верхнього
рівня?


Немає. Чи не доведеться. Розробники механізму IntelliSens передбачили
можливість явного підключення списку властивостей, методів і подій, як самого
об'єкта, так і об'єктів, які існують всередині нього.


У даному випадку треба скористатися пунктом системного меню FoxPro з ім'ям
Tools – підпункт IntelliSens. У вікні, перейдіть на закладку Types і
натисніть кнопку Type Libraries. З'явиться список тих об'єктів, які
зареєстровані в системному реєстрі Windows. Вам слід знайти в цьому списку
об'єкт "Microsoft Excel 10.0 Obect Library". Або з великим номером.
Бібліотека з номером 5.0 нас не цікавить, оскільки вона не дасть потрібного
результату.


Ставите галочку зліва від імені "Microsoft Excel 10.0 Obect Library
натисніть кнопку "Done". Це вовзвращает Вас у вікно IntelliSens Meneger.
Переконайтеся, що в списку об'єктів в цьому вікні з'явилася щойно обраного Вами
додаткова бібліотека, і натисніть кнопку "Ok"


Все. Тепер механізм IntelliSens буде працювати не тільки для об'єкта,
безпосередньо зареєстрованого в системному реєстрі Windows, а й для
"Вкладених" в нього об'єктів. Для цього, слід переписати наведений вище код
визначення об'єктів наступним чином.

 * Створюємо об'єкт Excel
LOCAL loExcel as Excel.Application
loExcel=CREATEOBJECT(“Excel.Application”)

* Створюємо в ньому нову робочу книгу
LOCAL loBook as Excel.Workbook
#DEFINE xlWBATWorksheet -4167
loBook = m.loExcel.workbooks.Add(xlWBATWorksheet)

* Створюємо посилання на новий лист у робочій книзі
LOCAL loSheet as Excel.Worksheet
loSheet = m.loBook.Sheets(1)

* Робимо Excel дивись
* Цю команду треба давати в самому кінці формування листа Excel
* Тут вона приведена для наочності
loExcel.Visible= .T.


Метод Select


Перше, що кидається в очі, при перегляді коду макросу Excel, це
розкиданий по всьому тілу макросу метод Select. Що це таке? А це
просто візуалізація переходу або виділення потрібної комірки. Тобто просто візуальне
відображення того факту, що Ви встали, наприклад, на осередок "A1".


При написанні коду в FoxPro нам це зовсім не потрібно. Ну, дійсно, навіщо
нам показувати користувачеві, що ми стали на клітинку "A1" і зараз почнемо
в ній щось міняти?


Якщо порівняти з формами FoxPro, то метод Select в Excel аналогічний
методу SetFocus() в FoxPro. А навіщо нам перекладати фокус, наприклад, в
TextBox, якщо я можу змінити його стан і без цього? Досить просто
отримати посилання на потрібний об'єкт. В даному випадку на клітинку Excel.


Саме так і слід вчинити. Тим більше, що візуалізація переходу на
потрібні комірки займає досить значний час. Тоді перша частина макросу –
"Заповнення клітинок" – в синтаксисі FoxPro з урахуванням попереднього коду буде
виглядати так:

 * Введення вмісту клітинок
m.loSheet.Cells (1,1). Value = "Назва реквізиту"
m.loSheet.Cells (1,2). Value = "Значення реквізиту"
m.loSheet.Cells (2,1). Value = "Перший"
m.loSheet.Cells(2,2).Value = 1324.56
m.loSheet.Cells (3,1). Value = "Другий"
m.loSheet.Cells(3,2).Value = "9876.54"
m.loSheet.Cells (4,1). Value = "РАЗОМ"

В даному випадку йде звернення до кожної окремої клітинки. Тому для
отримання посилання я використовував метод Cell (номер рядка, номер стовпця).


Звідки я взяв синтаксис використання Cells ()? Та з HELP самого Excel. Я
просто в коді макросу виділив ключове слово "Range"І натиснув клавішу F1.
Далі подивився приклад його використання і побачив такий чудовий метод
Cells () і приклад його використання.


Зверніть увагу, що я передав число в одному випадку як число (осередок з
координатами "2,2"), а в іншому – як символьну рядок (осередок з координатами
"3,2"). Але в обох випадках Excel сприйняв отримане значення саме як число.
Це вже пов'язано з особливістю інтерпретації символьних рядків самим Excel. В
загальному випадку неочевидно, у що буде конвертовано вміст символьної
рядка. Тому, логічно вказувати числа саме як числа. Втім, для
однозначної інтерпретації даних краще робити попереднє форматування
осередків Excel. Але про це нижче.


Про посиланнях на діапазон комірок відмінний від одного осередку буде розказано
далі.


Вказівка ​​діапазону комірок для функції


За тією ж самою схемою, яка описана в попередньому розділі, формулу для
розрахунку підсумку можна записати так:

 * Формула розрахунку підсумку
m.loSheet.Cells(4,2).Value = "=SUM(R[-2]C:R[-1]C)"
* Або в більш звичному вигляді
m.loSheet.Cells(4,2).Formula = "=SUM(B2:B3)"

Однак обидва ці способи мають недоліки. Почну з кінця, як більш
очевидного


Другий спосіб запису незручний тим, що в загальному випадку досить важко
перевести номер стовпця в відповідну букву. Ви можете сказати, яка буква
буде відповідати, наприклад, 53 колонку?


Як легко зрозуміти, перший спосіб використовує відносні посилання. Щодо
поточної комірки. Тобто адреса:


R[-2]C


Слід читати як: рядок (Row) на 2 вище від поточної і той же самий,
поточний, стовпець (Column)


Тут проблема в тому, що не завжди легко отримати саме відносні
значення. Особливо, якщо використовується діапазон комірок не є "суцільним".
Треба виключити ряд осередків з розрахунку.


Трохи покопавшись в HELP і поекспериментувавши, з'ясувалося, що можна
писати не відносні посилання, а абсолютні

 * Формула розрахунку підсумку
m.loSheet.Cells(4,2).Formula = "=SUM(R2C2:R3C2)"
* Або дещо громіздко
m.loSheet.Cells(4,2).Formula = "=SUM("+
m.loSheet.Cells(2,2).Address +":"+
m.loSheet.Cells(3,2).Address +")"

Тут перший варіант – це вказівка ​​абсолютних посилань. Другий варіант – це
теж абсолютні посилання, але отримані не шляхом "розрахунку", а просто лічені з
реквізитів потрібних клітинок. Який варіант для Вас більш кращий – вирішуйте
самі.


Чи використовувати властивість Value або Formula в даному випадку все одно. Обидва
властивості дадуть один і той же результат.


Зверніть увагу ще на одну "тонкість". В даному випадку використано
англійське ключове слово "SUM", незважаючи на те, що я створив вихідний макрос в
русифікованої версії Excel. Тобто якщо подивитися, що ж написано в самому
аркуші Excel, то там буде стояти російське "СУММ".


Вказівка ​​довільного діапазону комірок


Далі в коді макросу коштує установка напівжирного шрифту. Тут складність не в
самій команді установки реквізиту шрифту, а у вказівці діапазону клітинок, для
яких треба щось змінити. Дещо вже було написано в попередньому розділі
присвяченому вказівкою діапазону для формули. Тут опишу це детальніше.


Для зазначення діапазону комірок використовується метод Range (). В
найзагальнішому вигляді він має приблизно такий синтаксис:


m.loSheet.Range(“1:1;B:B;C2:D3”)


У даному випадку вказаний діапазон, в який входять: всі комірки першого рядка,
всі комірки стовпця "B", всі осередки лежать між осередками "C2" і "D3". Тобто
символ двокрапки виступає як фраза "від … до", а крапка з комою як фраза
"… І …".


Зверніть увагу, що в коді макросу Excel замість символу крапки з комою
використаний символ комою. Це не помилка. Ця відмінність синтаксису всередині Excel
і при роботі з самим Excel як COM-компонентом. Про те, коли треба використовувати
"Крапку з комою", а коли просто "кому" трохи нижче.


Усередині методу RANGE неприпустимо використання абсолютних посилань виду "R1C1",
як це можна зробити всередині формул. Це викличе помилку. Отже, по суті,
єдиним способом вказівки довільного діапазону залишається зчитування
потрібних адрес. Якщо взяти наведений вище приклад, то виходить так:

m.loSheet.Range(m.loSheet.Rows(1).Address+";"+;
m.loSheet.Columns(2).Address+";"+;
m.loSheet.Cells (3,2). Address +":"+ m.loSheet.Cells (4,3). Address)

Ну, а фрагмент коду макросу переводиться в синтаксис FoxPro наступним
чином:

m.loSheet.Range(m.loSheet.Rows(1).Address+";"+;
m.loSheet.Columns(4).Address).Font.Bold = .T.

Слід зауважити, що писати в одному методі RANGE () дуже вже довгих рядків
діапазонів не треба. Справа в тому, що у команд Excel, також як і у команд FoxPro,
є обмеження по довжині. У даному випадку – це ймовірно 1024 символів на одну
команду. Якщо Ви хочете однією командою змінити безліч розрізнених осередків, то
слід їх об'єднати за допомогою методу Union. Приблизно так:

LOCAL loUnion
loUnion = m.loExcel.UNION(m.loSheet.Rows(1),m.loSheet.Rows(2))
loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(3,2))
loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(3,3))
loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(4,2))
loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(4,3))
m.loUnion.Font.Bold = .T.

Зверніть увагу, що метод UNION ставитися до об'єкта "Excel.Application"
(Змінна m.loExcel). Це означає, що в ньому можна об'єднувати діапазоні не
просто з різних листів, але і з різних книг.


Метод UNION не може мати менше двох параметрів. Однак не можна однією
командою вказати більше 30 параметрів. Втім, як видно з прикладу, можна
нарощує вже об'єднані клітинки. Тобто в якості першого параметра вказати
раніше об'єднаний через UNION діапазон комірок.


Використання методу UNION – це ще один спосіб зазначення
діапазону


Коли використовувати "кому", а коли "точку з
коми


При перекладі коду макросу Excel в синтаксис FoxPro іноді доводиться замінювати
символ "коми" на символ "точки з комою" і навпаки. З чим це пов'язано, і
коли це необхідно робити?


Це пов'язано з особливістю поділу параметрів у синтаксисі Visual Basic і
в синтаксисі FoxPro. Щоб не залазити глибоко в "нетрі" мудрованих визначень
просто запам'ятайте загальне правило:


Якщо необхідно відокремити одне від одного елементи одного списку, то в
синтаксисі FoxPro слід використовувати символ "точки з комою". А якщо один від
друга відокремлюються "параметри", то слід використовувати символ "коми".


Щоб було зрозуміло про що йдеться, візьмемо раніше розглянутий приклад виділення
діапазону комірок. У макросі Excel це записано так:


Range(“1:1,4:4”).Select


Тут, за змістом, всередині Range () просто перераховані елементи одного списку.
Якщо "перекласти" це на російську мову, то можна прочитати це так: виділити
перший і четвертий рядок


Оскільки мова йде саме про перерахування, а не про параметри, то в синтаксисі
FoxPro слід замінити символ "коми" на символ "точки з комою". Приблизно
так:


m.loSheet.Range(“1:1;4:4”).Select


На жаль, у використаному в якості прикладу коді макросу немає функцій,
які б використовували діапазони як параметри. Тому наведу приклад функції
ЕСЛИ () ніякого відношення до разбираемому коду макросу не має.


.ActiveCell.FormulaR1C1 = “=IF(RC[-1]>0;RC[-1];””)”


В даному випадку, ця формула "перекладається" так. Якщо значення клітинки в
поточному рядку, але на стовпець раніше більше нуля, то відобразити значень цієї
комірки. В іншому випадку – нічого не відображати.


Як бачите, в коді макросу використаний символ "точки з комою". Але в даному
випадку, розділені величини виступають як параметри. Це явно не перерахування.
Значить, в синтаксисі FoxPro слід замість символу "точки з коми"
використовувати символ "коми".


m.loSheet.Cells(2,3).Value = “=IF(RC[-1]>0,RC[-1],””)”


Вказівка ​​формату клітинок


Далі в коді макросу варто вказівку формату для всього другого стовпця. В
перекладі в синтаксис FoxPro це виглядає так:


m.loSheet.Columns(2).NumberFormat = “#,##0.00”


Зверніть увагу, що хоча числовий формат був заданий на весь другий стовпець,
але тим не менше вміст заголовка стовпця (першого рядка) як було текстом,
так текстом і залишилося.


В даному випадку символ коми і крапки – це не є реальні
символи-роздільники. Їх призначення аналогічно призначенням тих же символів при
завданні маски введення "InputMask" в FoxPro.


За умовчанням, всі клітинки аркуша Excel мають формат "General". Це такий собі
універсальний формат, який сам, автоматично, робить спробу
конвертувати отримані дані в той формат, який він вважає найбільш
правильним. Це не завжди добре.


Наприклад, якщо Ви виводите в Excel банківський розрахунковий рахунок (це 20 цифр),
то Excel автоматично конвертує отримане значення в число. Але, оскільки
точність обчислення Excel до 15 значущих цифр, то відбудеться округлення і
подальша зміна формату відображення вже не зможе виправити цю
помилку.


У подібних випадках треба до початку виведення в Excel встановити формат осередків –
текстовий


m.loSheet.Columns(1).NumberFormat = “@”


Установка умовного формату для числових даних другого стовпця


Далі за кодом макросу йде установка умовного формату. Але щоб зрозуміти, що
там написано, і як це перевести в FoxPro слід зробити ряд пояснень


Константи Excel


У тілі макросу зустрічаються дивні значення, які починаються з символів
"Xl". У даному випадку – це xlCellValue і xlLess. Але і далі за кодом макросу
зустрічаються аналогічні значення. Це саме значення, оскільки, судячи по коду,
вони привласнюються певним параметрам. Що це таке?


Це константи. Тобто це деякі значення, які були визначені в момент
відкриття Excel. Їх відмітною ознакою як раз і є те, що вони
починаються з символів "xl" і з коду макросу випливає, що це деякі раніше
певні значення.


Визначити, чому ж рівні ці константи можна там же, в редакторі "Microsoft
Visula Basic ", де Ви і переглядаєте код макросу Excel. Для цього треба відкрити
"Object Browser". Пункт меню "View" – підпункт "Object Browser". Далі в порожньому
віконці ліворуч від кнопки з іконкою бінокля ввести ім'я шуканої константи і натиснути
кнопку з іконкою бінокля (або клавішу Enter). В результаті пошуку в самому низу
вікна "Object Browser" буде відображено значення шуканої константи.


У синтаксисі FoxPro константи записуються через директиву # DEFINE наступним
чином:

#DEFINE xlCellValue 1
#DEFINE xlLess 6

Іменовані параметри функцій Excel


У коді макросу, для установки умовного формату використовується функція ADD з
кількома іменованими параметрами. Як це перевести в синтаксис FoxPro, адже
в ньому немає такого поняття як "іменований параметр"


Іменований параметр – це передача параметрів у функцію не обов'язково в
порядку їх визначення, але при цьому значенню параметра передує його ім'я. В
цьому випадку приймаюча функція проаналізує ім'я параметра і зрозуміє, до чого
саме слід віднести отримане значення.


Повторю ще раз. Такого в FoxPro немає. Тобто реалізувати-то це не проблема.
Просто цього немає "штатно". На рівні самого середовища FoxPro.


А ось тут якраз надмірність макросу Excel дуже до речі. Справа в тому, що
в подібних випадках, макрорекодер Excel запише взагалі всі параметри, які є
у даної функції або методу і розташує їх в тому порядку, в якому вони йдуть у
самої функції.


У синтаксисі FoxPro параметри повинні йти в тому порядку, в якому вони
визначені у функції і відокремлюватися друг від друга комами. У макросі Excel вони
також будуть йти в тому порядку, в якому вони визначені в функції, але відділені
один від одного пробілом і кожному значенню параметра передує його ім'я.


Тоді все дуже просто. У FoxPro установка умовного форматування прийме
вид

#DEFINE xlCellValue 1
#DEFINE xlLess 6
LOCAL loUnion, loFormatCondition
loUnion = m.loExcel.Union (m.loSheet.Cells (2,2), m.loSheet.Cells (3,2))
loUnion = m.loExcel.Union(m.loUnion,m.loSheet.Cells(4,2))
m.loUnion.FormatConditions.Delete
loFormatCondition = m.loUnion.FormatConditions.Add (xlCellValue, xlLess, 2000)
m.loFormatCondition.Interior.ColorIndex = 3

В даному випадку, всі параметри методу Add () є обов'язковими. Тобто не можна не
задати будь-якої з параметрів. Однак у багатьох функціях частина параметрів
задавати не обов'язково. Це означає або що даний параметр залишається
незмінним, або приймає деяке значення за замовчуванням. У цьому випадку в
синтаксисі FoxPro можна просто нічого не вказувати, але обов'язково поставити
кому, щоб потрібний нам параметр виявився на відповідному місці.


Малювання рамки навколо всіх даних


У перекладі коду малювання рамки нічого нового немає. Хіба що, тут просто не
потрібно вказувати ряд команд. Наприклад, навіщо вказувати, що немає діагональних
ліній, якщо їх і так немає? А в іншому все те ж саме, що було описано
раніше:

#DEFINE xlThin 2
#DEFINE xlDiagonalDown 5
#DEFINE xlDiagonalUp 6
#DEFINE xlEdgeLeft 7
#DEFINE xlEdgeTop 8
#DEFINE xlEdgeBottom 9
#DEFINE xlEdgeRight 10
#DEFINE xlInsideVertical 11
#DEFINE xlInsideHorizontal 12

LOCAL loRange
loRange = m.loSheet.Range (m.loSheet.Cells (1,1). Address +":"+ m.loSheet.Cells (4,2). Address)
loRange.Borders(xlEdgeLeft).Weight = xlThin
loRange.Borders(xlEdgeTop).Weight = xlThin
loRange.Borders(xlEdgeBottom).Weight = xlThin
loRange.Borders(xlEdgeRight).Weight = xlThin
loRange.Borders(xlInsideVertical).Weight = xlThin
loRange.Borders(xlInsideHorizontal).Weight = xlThin


Як бачите, велика частина коду просто не увійшла до підсумкового "переклад". У цьому
немає необхідності. В даному випадку нас цілком влаштовує стиль і колір ліній по
замовчуванням. Тобто суцільна лінія чорного кольору. Немає сенсу змінювати ці значення.
Досить лише вказівки товщини (ваги) лінії


Перенесення слів, вирівнювання, ширина стовпця і висота
рядки


Власне, що залишився код Ви вже можете перевести самостійно. Тому я
приведу його вже без жодних пояснень

#DEFINE xlCenter -4108
#DEFINE xlTop -4160

m.loSheet.Rows(1).NumberFormat = "@"
m.loSheet.Rows(1).HorizontalAlignment = xlCenter
m.loSheet.Rows(1).VerticalAlignment = xlTop
m.loSheet.Rows(1).WrapText = .T.
m.loSheet.Rows(1).RowHeight = 25.5

m.loSheet.Columns(1).ColumnWidth = 11.57
m.loSheet.Columns(2).ColumnWidth = 10.14

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*