Wraptext excel что это
Сразу хочется сделать несколько замечаний.
Первое. В основном говорить буду про то, с чем сталкивался лично. Претензий на стопроцентное знание «изнанки» формата у меня нет.
Второе. Как многие, вероятно, знают, файлы MS Office 2007 и выше представляют собой архив, который можно открыть с помощью любого архиватора (WinRAR, 7zip и так далее).
Третье. «Под капотом» у этих файлов — в основном XML-разметка, гордо именуемая OOXML или просто OpenXML. Поэтому, в принципе, для понимания принципов редактирования файлов «руками» достаточно будет Блокнота (или, что удобнее, Notepad++).
Первый интересующий нас файл — %file%/xl/workbook.xml. Основное его назначение — манифест, то есть перечень листов, из которых наша книга Excel, собственно, и состоит.
Выглядит этот перечень, к примеру, так:
Это значит, что в книге 4 листа, и их имена указаны в атрибутах name. Каждому тегу должен соответствовать файл в папке %file%/xl/worksheets. Excel сам знает, как должны называться эти файлы и при попытке их переименовать, сочтет всю книгу поврежденной.
Еще в папке %file%/xl нас интересует файл styles.xml.
Как нетрудно догадаться, здесь хранится информация об оформлении ячеек. Причем в угоду оптимизации, хранится она в достаточно интересном виде. Файл состоит из следующих секций:
Как можно понять, здесь перечислены только уникальные стили оформления текста, использованные в книге. Каждый тег — один стиль. Вложенные теги — особенности стиля, такие как полужирное написание (тег ), кегль ( ) и другие.
Как видно, первый вариант — без заливки вообще, а второй — сплошная заливка библиотечного цвета «gray125».
Как видно, одно наименование здесь состоит из пяти элементов, 4 основных границы и диагональная, то есть все то, что можно настроить через GUI самого Excel.
Перевод макроса Excel в синтаксис FoxPro
Вы вероятно уже знаете, что для того, чтобы определить как именно (какой командой) в Excel можно сделать то или иное проще всего выполнить это действие прямо в Excel с одновременной записью Ваших действий.
Откроется окно редактора Micosoft Visual Basic в котором будет отображен код Вашего макроса. Это все замечательно, но возникает вопрос: как перевести то, что здесь написано в синтаксис FoxPro? И как вообще использовать это в FoxPro? Вот ответам на эти вопросы и посвящена данная статья.
Сразу замечу, что почти без изменений все приведенные советы можно применить к Word. Для примера выбран Excel потому, что в нем проще адресация. Весь лист разбит на ячейки, к которым собственно и ссылаемся.
Исходный макрос Excel
Далее заполняем лист Excel таким содержимым
Названиереквизита | Значениереквизита |
Первый | 1 234,56 |
Второй | 9 876,54 |
ИТОГО | 11 111,10 |
Здесь сделано следующее:
Разумеется, внутри кода макроса нет никаких комментариев. Я их расставил сам, для облегчения восприятия. Все остальное взято из кода макроса без изменений. Теперь попробуем разобрать, что же такое здесь понаписано.
Открытие листа Excel в FoxPro
Прежде чем приступить к «разбору полетов» собственно макроса, небольшое отступление, для того, чтобы показать как собственно открыть Excel из FoxPro. Дело в том, что последующий код перевода макроса будет, так или иначе, ссылаться на открытый лист Excel.
Новый лист Excel открывается следующим образом
Здесь сразу нужны некоторые пояснения.
Иерархия главных объектов Excel достаточно проста:
Чтобы начать заполнять лист Excel надо предварительно обязательно открыть сам объект Excel и в нем создать (или открыть) рабочую книгу.
Объект Excel создается именно командой CreateObject(), а не предварительной попыткой использовать уже существующий объект Excel через команду GetObject() не для наглядности. Именно так и следует поступать! Дело в том, что при использовании команды GetObject() неизвестно, какой именно из существующих объектов 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 предусмотрели возможность явного подключения списка свойств, методов и событий, как самого объекта, так и объектов, существующих внутри него.
Ставите птичку слева от имени «Microsoft Excel 10.0 Obect Library» и нажмите кнопку «Done». Это вовзвращает Вас в окно IntelliSens Meneger. Убедитесь, что в списке объектов в этом окне появилась только что выбраная Вами дополнительная библиотека, и нажмите кнопку «Ok»
Все. Теперь механизм IntelliSens будет работать не только для объекта, непосредственно зарегистрированного в системном реестре Windows, но и для «вложенных» в него объектов. Для этого, следует переписать приведенный выше код определения объектов следующим образом.
Метод Select
Первое, что бросается в глаза, при просмотре кода макроса Excel, это разбросанный по всему телу макроса метод Select. Что это такое? А это просто визуализация перехода или выделения нужной ячейки. Т.е. просто визуальное отображение того факта, что Вы встали, например, на ячейку «A1».
При написании кода в FoxPro нам это совсем не нужно. Ну, действительно, зачем нам показывать пользователю, что мы встали на ячейку «A1» и сейчас начнем в ней что-то менять?
Если сравнить с формами FoxPro, то метод Select в Excel аналогичен методу SetFocus() в FoxPro. А зачем нам переводить фокус, например, в TextBox, если я могу изменить его состояние и без этого? Достаточно просто получить ссылку на нужный объект. В данном случае на ячейку Excel.
В данном случае идет обращение к каждой отдельной ячейке. Поэтому для получения ссылки я использовал метод Cell(номер строки, номер столбца).
Откуда я взял синтаксис использования Cells()? Да из HELP самого Excel. Я просто в коде макроса выделил ключевое слово «Range» и нажал клавишу F1. Далее посмотрел пример его использования и увидел такой замечательный метод Cells() и пример его использования.
О ссылках на диапазон ячеек отличный от одной ячейки будет рассказано далее.
Указание диапазона ячеек для функции
По той же самой схеме, которая описана в предыдущем разделе, формулу для расчета итога можно записать так:
Однако оба этих способа имеют недостатки. Начну с конца, как более очевидного
Второй способ записи неудобен тем, что в общем случае достаточно трудно перевести номер столбца в соответствующую букву. Вы можете сказать, какая буква будет соответствовать, например, 53 столбцу?
Как легко понять, первый способ использует относительные ссылки. Относительно текущей ячейки. Т.е. адрес:
Следует читать как: строка (Row) на 2 выше от текущей и тот же самый, текущий, столбец (Column)
Здесь проблема в том, что не всегда легко получить именно относительные значения. Особенно, если используемый диапазон ячеек не является «сплошным». Надо исключить ряд ячеек из расчета.
Немного покопавшись в HELP и поэкспериментировав, выяснилось, что можно писать не относительные ссылки, а абсолютные
Использовать ли свойство Value или Formula в данном случае все равно. Оба свойства дадут один и тот же результат.
Обратите внимание еще на одну «тонкость». В данном случае использовано английское ключевое слово «SUM», несмотря на то, что я создал исходный макрос в русифицированной версии Excel. Т.е. если посмотреть, что же написано в самом листе Excel, то там будет стоять русское «СУММ».
Указание произвольного диапазона ячеек
Далее в коде макроса стоит установка полужирного шрифта. Здесь сложность не в самой команде установки реквизита шрифта, а в указании диапазона ячеек, для которых надо что-то изменить. Кое-что уже было написано в предыдущем разделе посвященному указанию диапазона для формулы. Здесь опишу это подробнее.
Для указания произвольного диапазона ячеек используется метод Range(). В самом общем виде он имеет примерно такой синтаксис:
Обратите внимание, что в коде макроса Excel вместо символа точки с запятой использован символ запятой. Это не опечатка. Это отличие синтаксиса внутри Excel и при работе с самим Excel как COM-компонентом. О том, когда надо использовать «точку с запятой», а когда просто «запятую» чуть ниже.
Внутри метода RANGE недопустимо использование абсолютных ссылок вида «R1C1», как это можно сделать внутри формул. Это вызовет ошибку. Следовательно, по сути, единственным способом указания произвольного диапазона остается считывание нужных адресов. Если взять приведенный выше пример, то получается так:
Ну, а фрагмент кода макроса переводится в синтаксис FoxPro следующим образом:
Обратите внимание, что метод UNION относиться к объекту «Excel.Application» (переменная m.loExcel). Это значит, что в нем можно объединять диапазоны не просто из разных листов, но и из разных книг.
Метод UNION не может иметь меньше двух параметров. Однако нельзя одной командой указать больше 30 параметров. Впрочем, как видно из примера, можно наращивать уже объединенные ячейки. Т.е. в качестве первого параметра указать ранее объединенный через UNION диапазон ячеек.
Когда использовать «запятую», а когда «точку с запятой
При переводе кода макроса Excel в синтаксис FoxPro иногда приходится заменять символ «запятой» на символ «точки с запятой» и наоборот. С чем это связано, и когда это необходимо делать?
Это связано с особенностью разделения параметров в синтаксисе Visual Basic и в синтаксисе FoxPro. Чтобы не залезать глубоко в «дебри» мудреных определений просто запомните общее правило:
Если необходимо отделить друг от друга элементы одного списка, то в синтаксисе FoxPro следует использовать символ «точки с запятой». А если друг от друга отделяются «параметры», то следует использовать символ «запятой».
Чтобы было понятно о чем речь, возьмем ранее рассмотренный пример выделения диапазона ячеек. В макросе Excel это записано так:
Здесь, по смыслу, внутри Range() просто перечислены элементы одного списка. Если «перевести» это на русский язык, то можно прочитать это так: выделить первую и четвертую строку
Поскольку речь идет именно о перечислении, а не о параметрах, то в синтаксисе FoxPro следует заменить символ «запятой» на символ «точки с запятой». Примерно так:
К сожалению, в использованном в качестве примера коде макроса нет функций, которые бы использовали диапазоны как параметры. Поэтому приведу пример функции ЕСЛИ() никакого отношения к разбираемому коду макроса не имеющую.
Как видите, в коде макроса использован символ «точки с запятой». Но в данном случае, разделенные величины выступают как параметры. Это явно не перечисление. Значит, в синтаксисе FoxPro следует вместо символа «точки с запятой» использовать символ «запятой».
Указание формата ячеек
Далее в коде макроса стоит указание формата для всего второго столбца. В переводе в синтаксис FoxPro это выглядит так:
Обратите внимание, что хотя числовой формат был задан на весь второй столбец, но тем не менее содержимое заголовка столбца (первой строки) как было текстом, так текстом и осталось.
По умолчанию, все ячейки листа Excel имеют формат «General». Это некий универсальный формат, который сам, автоматически, предпринимает попытку конвертировать полученные данные в тот формат, который он считает наиболее правильным. Это не всегда хорошо.
Например, если Вы выводите в Excel банковский расчетный счет (это 20 цифр), то Excel автоматически конвертирует полученное значение в число. Но, поскольку точность вычисления Excel до 15 значащих цифр, то произойдет округление и последующее изменение формата отображения уже не сможет исправить эту ошибку.
Установка условного формата для числовых данных второго столбца
Далее по коду макроса идет установка условного формата. Но чтобы понять, что там написано, и как это перевести в FoxPro следует сделать ряд пояснений
Константы Excel
Это константы. Т.е. это некоторые значения, которые были определены в момент открытия Excel. Их отличительным признаком как раз и является то, что они начинаются с символов «xl» и из кода макроса следует, что это некоторые ранее определенные значения.
В синтаксисе FoxPro константы записываются через директиву #DEFINE следующим образом:
Именованные параметры функций Excel
В коде макроса, для установки условного формата используется функция ADD с несколькими именованными параметрами. Как это перевести в синтаксис FoxPro, ведь в нем нет такого понятия как «именованный параметр»
Повторю еще раз. Такого в FoxPro нет. Т.е. реализовать-то это не проблема. Просто этого нет «штатно». На уровне самой среды FoxPro.
А вот здесь как раз избыточность макроса Excel очень кстати. Дело в том, что в подобных случаях, макрорекодер Excel запишет вообще все параметры, какие есть у данной функции или метода и расположит их в том порядке, в котором они идут в самой функции.
В синтаксисе FoxPro параметры должны идти в том порядке, в котором они определены в функции и отделяться друг от друга запятыми. В макросе Excel они также будут идти в том порядке, в котором они определены в функции, но отделены друг от друга пробелом и каждому значению параметра предшествует его имя.
Тогда все очень просто. В FoxPro установка условного форматирования примет вид
В данном случае, все параметры метода Add() обязательны. Т.е. нельзя не задать какой-либо из параметров. Однако во многих функциях часть параметров задавать не обязательно. Это означает либо что данный параметр остается неизменным, либо принимает некоторое значение по умолчанию. В этом случае в синтаксисе FoxPro можно просто ничего не указывать, но обязательно поставить запятую, чтобы нужный нам параметр оказался на соответствующем месте.
Рисование рамки вокруг всех данных
В переводе кода рисования рамки ничего нового нет. Разве что, здесь просто не нужно указывать ряд команд. Например, зачем указывать, что нет диагональных линий, если их и так нет? А в остальном все то же самое, что было описано ранее:
Как видите, большая часть кода просто не вошла в итоговый «перевод». В этом нет необходимости. В данном случае нас вполне устраивает стиль и цвет линий по умолчанию. Т.е. сплошная линия черного цвета. Нет смысла менять эти значения. Достаточно только указания толщины (веса) линии
Перенос слов, выравнивание, ширина столбца и высота строки
Собственно, оставшийся код Вы уже можете перевести самостоятельно. Поэтому я приведу его уже безо всяких пояснений
VBA Excel. Содержание рубрики
Содержание рубрики VBA Excel на сайте «Время не ждёт». Систематизация статей по тематическим группам для ускорения поиска нужной информации по заданной теме.
Знакомство с VBA Excel
Методы VBA Excel
Объект Range в VBA Excel
Объекты VBA Excel
Операторы в VBA Excel
Переменные в VBA Excel
Примеры кода VBA Excel
Прочее в VBA Excel
Работа с Word из кода VBA Excel
Редактор VBA Excel
События VBA Excel
Функции в VBA Excel
Циклы в VBA Excel
Элементы управления в VBA Excel
32 комментария для “VBA Excel. Содержание рубрики”
Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?
Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.
Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.
Большущее спасибо. Я перерыл кучу сайтов, но нигде на находил ответ на свой вопрос. Можно ещё, Евгений, Вас потревожу?
Теперь как корректно отработать кнопки Ok и Отмена работы фильтра? Только на одном форуме нашёл способ — вставить в произвольной ячейке формулу, в которой присутствует поле из фильтрованного списка (например, Range(«B2»).FormulaR1C1 = «=RС[-1]»), а потом в событии листа Worksheet_Calculate() прописать команды, которые соответствуют нажатию кнопки OK. Всё хорошо, когда лист пустой. Но если на нём ещё есть формулы или нужно подправить значение в какой-то ячейке, то не знаю, как отследить, в какой момент запускался фильтр, а в какой — другие манипуляции.
Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?
Просто отследить, какая кнопка нажата.
По предыдущему вопросу. Я вставил sendkeys… в конец макроса, который запускается при нажатии кнопки на листе. Окно фильтра появляется и тут же закрывается. А как сделать, чтобы окно осталось, и пользователь мог выбрать данные?
Евгений, я разобрался, почему не выводилось окно с фильтром.
Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.
Вставьте в стандартный модуль (в примере — Module1) объявление глобальной переменной и код процедуры для кнопки:
Range(«A1»).CurrentRegion можно заменить на имя таблицы.
Евгений, а формулу в поле B2 оставлять или её можно удалить?
Можно удалить, если в таблице есть другие формулы. Я изменил код процедуры Worksheet_Calculate() в предыдущем примере, чтобы она не реагировала на изменение формул, а только на нажатие кнопки «OK» автофильтра. Range(«A1») — это ячейка с кнопкой фильтра.
Евгений, спасибо за корректировку процедуры. Думаю, в ней и поле myString1 необязательно (и связанная проверка с ним), т.к. пользователь может выбрать все значения.
Но… после команды SendKeys «%
В переменную myString записывается состояние таблицы до применения фильтра, в переменную myString1 — после применения. Затем их содержимое сравнивается: если они содержат разные значения — значит, фильтр был применен.
Здравствуйте! может я не туда пишу. вопрос
нужно посчитать кол-во строк в столбце «В» (от 100 до 5000) и вставить в формулу вместо 744
table = Range(«B2:C744»)
спасибо.
В столбце «B» не должно быть пустых ячеек до последней строки таблицы.
Как определить в VBA есть узор в ячейке?
Спасибо за достаточно полную информацию.
Был бы очень вам признателен, если бы вы подсказали:
как изменить ширину блоков верхнего колонтитула.
«Введена слишком длинная строка. Уменьшите число знаков.»
При изменении шрифта с полужирного на обычный всё нормально
воспринимается,
Прошу прощения, если не по адресу.
Добрый день! Никак не могу решить проблему с заблокированным автофильтром на защищенном макросом (нашел на форумах) листе. Подскажите пожалуйста, куда и какую строчку нужно добавить в макрос, чтобы при открытии файла был активен автофильтр:
Добрый день, Владислав!
Замените строку
Добрый день, Евгений!
ОГРОМНОЕ СПАСИБО. :))
Здравствуйте, помогите, пожалуйста, решить задачу((
Разработать программу «Кредитный калькулятор» для расчета выплат по кредиту в условиях начисления процентов по аннуитетной схеме постнумерандо. Форма должна предусматривать ввод:
1) сумма кредита, допустимы 2 знака после запятой;
2) процентная ставка (годовая), допустимы 2 знака после запятой;
3) количество периодов (месяцев), целое положительное число.
Также форма должна содержать две кнопки:
1) «Ok» (выполнить расчет, заполнить лист Excel, освободить форму и закончить работу программы);
2) «Отмена» (освободить форму и закончить работу программы).
На лист Excel следует вывести 5 колонок:
1) номер периода;
2) остаток кредита;
3) сумма процентов за пользование кредитом, подлежащая к оплате;
4) сумма погашения основного долга (кредита);
5) общая сумма выплат за период.
Форма должна быть открыта из макроса «main» и там же освобождена по завершению своего использования. Форма должна содержать только код работы с формой и ввода данных. Логика верификации данных должна быть, по возможности, отделена от кода формы. Бизнес-логика обязательно должна быть отделена от кода формы.
Здравствуйте, Рафия!
С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.
Добрый день, Евгений! Я только начинаю работать с VBA. Помогите, пожалуйста, прописать код для автоматического перемещения курсора на ячейку вправо после заполнения предыдущей.
Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).
Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.
Этот код перемещает фокус с активной ячейки на ячейку справа:
Wrap text in a cell
Microsoft Excel can wrap text so it appears on multiple lines in a cell. You can format the cell so the text wraps automatically, or enter a manual line break.
Wrap text automatically
In a worksheet, select the cells that you want to format.
On the Home tab, in the Alignment group, click Wrap Text. (On Excel for desktop, you can also select the cell, and then press Alt + H + W.)
Data in the cell wraps to fit the column width, so if you change the column width, data wrapping adjusts automatically.
If all wrapped text is not visible, it may be because the row is set to a specific height or that the text is in a range of cells that has been merged.
Adjust the row height to make all wrapped text visible
Select the cell or range for which you want to adjust the row height.
On the Home tab, in the Cells group, click Format.
Under Cell Size, do one of the following:
To automatically adjust the row height, click AutoFit Row Height.
To specify a row height, click Row Height, and then type the row height that you want in the Row height box.
Tip: You can also drag the bottom border of the row to the height that shows all wrapped text.
Enter a line break
To start a new line of text at any specific point in a cell:
Double-click the cell in which you want to enter a line break.
Tip: You can also select the cell, and then press F2.
In the cell, click the location where you want to break the line, and press Alt + Enter.
Need more help?
You can always ask an expert in the Excel Tech Community or get support in the Answers community.