Свойства ячейки, часто используемые в коде VBA Excel. Демонстрация свойств ячейки, как структурной единицы объекта Range, на простых примерах.
Объект Range в VBA Excel представляет диапазон ячеек. Он (объект Range) может описывать любой диапазон, начиная от одной ячейки и заканчивая сразу всеми ячейками рабочего листа.
Примеры диапазонов:
- Одна ячейка –
Range("A1")
. - Девять ячеек –
Range("A1:С3")
. - Весь рабочий лист в Excel 2016 –
Range("1:1048576")
.
Для справки: выражение Range("1:1048576")
описывает диапазон с 1 по 1048576 строку, где число 1048576 – это номер последней строки на рабочем листе Excel 2016.
В VBA Excel есть свойство Cells объекта Range, которое позволяет обратиться к одной ячейке в указанном диапазоне (возвращает объект Range в виде одной ячейки). Если в коде используется свойство Cells без указания диапазона, значит оно относится ко всему диапазону активного рабочего листа.
Примеры обращения к одной ячейке:
Cells(1000)
, где 1000 – порядковый номер ячейки на рабочем листе, возвращает ячейку «ALL1».Cells(50, 20)
, где 50 – номер строки рабочего листа, а 20 – номер столбца, возвращает ячейку «T50».Range("A1:C3").Cells(6)
, где «A1:C3» – заданный диапазон, а 6 – порядковый номер ячейки в этом диапазоне, возвращает ячейку «C2».
Для справки: порядковый номер ячейки в диапазоне считается построчно слева направо с перемещением к следующей строке сверху вниз.
Подробнее о том, как обратиться к ячейке, смотрите в статье: Ячейки (обращение, запись, чтение, очистка).
В этой статье мы рассмотрим свойства объекта Range, применимые, в том числе, к диапазону, состоящему из одной ячейки.
Еще надо добавить, что свойства и методы объектов отделяются от объектов точкой, как в третьем примере обращения к одной ячейке: Range("A1:C3").Cells(6)
.
Свойства ячейки (объекта Range)
Свойство | Описание |
---|---|
Address | Возвращает адрес ячейки (диапазона). |
Borders | Возвращает коллекцию Borders, представляющую границы ячейки (диапазона). Подробнее… |
Cells | Возвращает объект Range, представляющий коллекцию всех ячеек заданного диапазона. Указав номер строки и номер столбца или порядковый номер ячейки в диапазоне, мы получаем конкретную ячейку. Подробнее… |
Characters | Возвращает подстроку в размере указанного количества символов из текста, содержащегося в ячейке. Подробнее… |
Column | Возвращает номер столбца ячейки (первого столбца диапазона). Подробнее… |
ColumnWidth | Возвращает или задает ширину ячейки в пунктах (ширину всех столбцов в указанном диапазоне). |
Comment | Возвращает комментарий, связанный с ячейкой (с левой верхней ячейкой диапазона). |
CurrentRegion | Возвращает прямоугольный диапазон, ограниченный пустыми строками и столбцами. Очень полезное свойство для возвращения рабочей таблицы, а также определения номера последней заполненной строки. |
EntireColumn | Возвращает весь столбец (столбцы), в котором содержится ячейка (диапазон). Диапазон может содержаться и в одном столбце, например, Range("A1:A20") . |
EntireRow | Возвращает всю строку (строки), в которой содержится ячейка (диапазон). Диапазон может содержаться и в одной строке, например, Range("A2:H2") . |
Font | Возвращает объект Font, представляющий шрифт указанного объекта. Подробнее о цвете шрифта… |
HorizontalAlignment | Возвращает или задает значение горизонтального выравнивания содержимого ячейки (диапазона). Подробнее… |
Interior | Возвращает объект Interior, представляющий внутреннюю область ячейки (диапазона). Применяется, главным образом, для возвращения или назначения цвета заливки (фона) ячейки (диапазона). Подробнее… |
Name | Возвращает или задает имя ячейки (диапазона). |
NumberFormat | Возвращает или задает код числового формата для ячейки (диапазона). Примеры кодов числовых форматов можно посмотреть, открыв для любой ячейки на рабочем листе Excel диалоговое окно «Формат ячеек», на вкладке «(все форматы)». Свойство NumberFormat диапазона возвращает значение NULL, за исключением тех случаев, когда все ячейки в диапазоне имеют одинаковый числовой формат. Если нужно присвоить ячейке текстовый формат, записывается так: Range("A1").NumberFormat = "@" . Общий формат: Range("A1").NumberFormat = "General" . |
Offset | Возвращает объект Range, смещенный относительно первоначального диапазона на указанное количество строк и столбцов. Подробнее… |
Resize | Изменяет размер первоначального диапазона до указанного количества строк и столбцов. Строки добавляются или удаляются снизу, столбцы – справа. Подробнее… |
Row | Возвращает номер строки ячейки (первой строки диапазона). Подробнее… |
RowHeight | Возвращает или задает высоту ячейки в пунктах (высоту всех строк в указанном диапазоне). |
Text | Возвращает форматированный текст, содержащийся в ячейке. Свойство Text диапазона возвращает значение NULL, за исключением тех случаев, когда все ячейки в диапазоне имеют одинаковое содержимое и один формат. Предназначено только для чтения. Подробнее… |
Value | Возвращает или задает значение ячейки, в том числе с отображением значений в формате Currency и Date. Тип данных Variant. Value является свойством ячейки по умолчанию, поэтому в коде его можно не указывать. |
Value2 | Возвращает или задает значение ячейки. Тип данных Variant. Значения в формате Currency и Date будут отображены в виде чисел с типом данных Double. |
VerticalAlignment | Возвращает или задает значение вертикального выравнивания содержимого ячейки (диапазона). Подробнее… |
В таблице представлены не все свойства объекта Range. С полным списком вы можете ознакомиться не сайте разработчика.
Простые примеры для начинающих
Вы можете скопировать примеры кода VBA Excel в стандартный модуль и запустить их на выполнение. Как создать стандартный модуль и запустить процедуру на выполнение, смотрите в статье VBA Excel. Начинаем программировать с нуля.
Учтите, что в одном программном модуле у всех процедур должны быть разные имена. Если вы уже копировали в модуль подпрограммы с именами Primer1, Primer2 и т.д., удалите их или создайте еще один стандартный модуль.
Форматирование ячеек
Заливка ячейки фоном, изменение высоты строки, запись в ячейки текста, автоподбор ширины столбца, выравнивание текста в ячейке и выделение его цветом, добавление границ к ячейкам, очистка содержимого и форматирования ячеек.
Если вы запустите эту процедуру, информационное окно MsgBox будет прерывать выполнение программы и сообщать о том, что произойдет дальше, после его закрытия.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Sub Primer1() MsgBox «Зальем ячейку A1 зеленым цветом и запишем в ячейку B1 текст: «Ячейка A1 зеленая!»» Range(«A1»).Interior.Color = vbGreen Range(«B1»).Value = «Ячейка A1 зеленая!» MsgBox «Сделаем высоту строки, в которой находится ячейка A2, в 2 раза больше высоты ячейки A1, « _ & «а в ячейку B1 вставим текст: «Наша строка стала в 2 раза выше первой строки!»» Range(«A2»).RowHeight = Range(«A1»).RowHeight * 2 Range(«B2»).Value = «Наша строка стала в 2 раза выше первой строки!» MsgBox «Запишем в ячейку A3 высоту 2 строки, а в ячейку B3 вставим текст: «Такова высота второй строки!»» Range(«A3»).Value = Range(«A2»).RowHeight Range(«B3»).Value = «Такова высота второй строки!» MsgBox «Применим к столбцу, в котором содержится ячейка B1, метод AutoFit для автоподбора ширины» Range(«B1»).EntireColumn.AutoFit MsgBox «Выделим текст в ячейке B2 красным цветом и выровним его по центру (по вертикали)» Range(«B2»).Font.Color = vbRed Range(«B2»).VerticalAlignment = xlCenter MsgBox «Добавим к ячейкам диапазона A1:B3 границы» Range(«A1:B3»).Borders.LineStyle = True MsgBox «Сделаем границы ячеек в диапазоне A1:B3 двойными» Range(«A1:B3»).Borders.LineStyle = xlDouble MsgBox «Очистим ячейки диапазона A1:B3 от заливки, выравнивания, границ и содержимого» Range(«A1:B3»).Clear MsgBox «Присвоим высоте второй строки высоту первой, а ширине второго столбца — ширину первого» Range(«A2»).RowHeight = Range(«A1»).RowHeight Range(«B1»).ColumnWidth = Range(«A1»).ColumnWidth MsgBox «Демонстрация форматирования ячеек закончена!» End Sub |
Вычисления в ячейках (свойство Value)
Запись двух чисел в ячейки, вычисление их произведения, вставка в ячейку формулы, очистка ячеек.
Обратите внимание, что разделителем дробной части у чисел в VBA Excel является точка, а не запятая.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub Primer2() MsgBox «Запишем в ячейку A1 число 25.3, а в ячейку B1 — число 34.42» Range(«A1»).Value = 25.3 Range(«B1»).Value = 34.42 MsgBox «Запишем в ячейку C1 произведение чисел, содержащихся в ячейках A1 и B1» Range(«C1»).Value = Range(«A1»).Value * Range(«B1»).Value MsgBox «Запишем в ячейку D1 формулу, которая перемножает числа в ячейках A1 и B1» Range(«D1»).Value = «=A1*B1» MsgBox «Заменим содержимое ячеек A1 и B1 на числа 6.258 и 54.1, а также активируем ячейку D1» Range(«A1»).Value = 6.258 Range(«B1»).Value = 54.1 Range(«D1»).Activate MsgBox «Мы видим, что в ячейке D1 произведение изменилось, а в строке состояния отображается формула; « _ & «следующим шагом очищаем задействованные ячейки» Range(«A1:D1»).Clear MsgBox «Демонстрация вычислений в ячейках завершена!» End Sub |
Так как свойство Value является свойством ячейки по умолчанию, его можно было нигде не указывать. Попробуйте удалить .Value из всех строк, где оно встречается и запустить код заново.
Различие свойств Text, Value и Value2
Построение с помощью кода VBA Excel таблицы с результатами сравнения того, как свойства Text, Value и Value2 возвращают число, дату и текст.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Sub Primer3() ‘Присваиваем ячейкам всей таблицы общий формат на тот ‘случай, если формат отдельных ячеек ранее менялся Range(«A1:E4»).NumberFormat = «General» ‘добавляем сетку (границы ячеек) Range(«A1:E4»).Borders.LineStyle = True ‘Создаем строку заголовков Range(«A1») = «Значение» Range(«B1») = «Код формата» ‘формат соседней ячейки в столбце A Range(«C1») = «Свойство Text» Range(«D1») = «Свойство Value» Range(«E1») = «Свойство Value2» ‘Назначаем строке заголовков жирный шрифт Range(«A1:E1»).Font.Bold = True ‘Задаем форматы ячейкам A2, A3 и A4 ‘Ячейка A2 — числовой формат с разделителем триад и двумя знаками после запятой ‘Ячейка A3 — формат даты «ДД.ММ.ГГГГ» ‘Ячейка A4 — текстовый формат Range(«A2»).NumberFormat = «# ##0.00» Range(«A3»).NumberFormat = «dd.mm.yyyy» Range(«A4»).NumberFormat = «@» ‘Заполняем ячейки A2, A3 и A4 значениями Range(«A2») = 2362.4568 Range(«A3») = CDate(«01.01.2021») ‘Функция CDate преобразует текстовый аргумент в формат даты Range(«A4») = «Озеро Байкал» ‘Заполняем ячейки B2, B3 и B4 кодами форматов соседних ячеек в столбце A Range(«B2») = Range(«A2»).NumberFormat Range(«B3») = Range(«A3»).NumberFormat Range(«B4») = Range(«A4»).NumberFormat ‘Присваиваем ячейкам C2-C4 значения свойств Text ячеек A2-A4 Range(«C2») = Range(«A2»).Text Range(«C3») = Range(«A3»).Text Range(«C4») = Range(«A4»).Text ‘Присваиваем ячейкам D2-D4 значения свойств Value ячеек A2-A4 Range(«D2») = Range(«A2»).Value Range(«D3») = Range(«A3»).Value Range(«D4») = Range(«A4»).Value ‘Присваиваем ячейкам E2-E4 значения свойств Value2 ячеек A2-A4 Range(«E2») = Range(«A2»).Value2 Range(«E3») = Range(«A3»).Value2 Range(«E4») = Range(«A4»).Value2 ‘Применяем к таблице автоподбор ширины столбцов Range(«A1:E4»).EntireColumn.AutoFit End Sub |
Результат работы кода:
В таблице наглядно видна разница между свойствами Text, Value и Value2 при применении их к ячейкам с отформатированным числом и датой. Свойство Text еще отличается от Value и Value2 тем, что оно предназначено только для чтения.
When iterating through cells in a worksheet, how can I get what the format setting on the cell is? Because based on this, I would like to build a SQL statement to either add the single ticks or not to the value retreived
asked Mar 12, 2013 at 21:19
2
Sounds like you need the VarType() function. Vartype(Range("A1"))
OK, so you don’t want to know the format setting for the cell, but whether the value is numeric.
Can you just call IsNumeric(Range("A1"))
and quote it if False
?
Based on your comment that some numbers are stored as text in the DB, you are not going to solve this by a simple formula. Can’t you just quote the values as you build your SQL statement?
answered Mar 12, 2013 at 21:25
mr_plummr_plum
2,4481 gold badge17 silver badges31 bronze badges
7
Try using the following in VBA:
Range("A1").NumberFormat = "0.00" 'Sets cell formatting to numeric with 2 decimals.
Range("A1").Formula = "=Text(6, " & """0.00""" & ")" 'Looks like a number _
' but is really text.
Debug.Print WorksheetFunction.IsNumber(Range("A1")) 'Prints False
Range("A1").Value = 6 'Puts number into the cell, which also looks like 6.00
Debug.Print WorksheetFunction.IsNumber(Range("A1")) 'Prints True
This should tell you if the value is really text or really a number, regardless of the cell’s formatting properties.
The key is that the intrinsic Excel IsNumber() function works better for this purpose than the VBA function IsNumeric. IsNumber() tells you whether the cell’s value is a number, whereas IsNumeric only tells you if the cell is formatted for numeric values.
answered Jun 13, 2018 at 1:31
I don’t think there’s any property of a cell that indicates whether the cell actually contains a numeric value, although VarType()
might help, it gets tricky because Excel will allow a number-formatted cell to contain string, and a text formatted cell to contain numeric values, without overriding the NumberFormat
property.
In any case you likely need some independent test to figure out whether a cell IsNumeric (or other criteria) AND whether its NumberFormat
is among an enumerated list which you can define.
Sub numFormat()
Dim cl As Range
Dim numFormat As String
Dim isNumber As Boolean
For Each cl In Range("A1")
numFormat = cl.NumberFormat
isNumber = IsNumeric(Trim(cl.Value))
Select Case numFormat
Case "General", "0", "0.0", "0.00" ' <--- modify as needed to account for other formats, etc.
If isNumber Then
Debug.Print cl.Address & " formatted as " & numFormat
End If
Case Else
'ignore all other cases
End Select
Next
End Sub
answered Mar 13, 2013 at 3:25
David ZemensDavid Zemens
52.8k11 gold badges79 silver badges129 bronze badges
I don’t think the format of the cell is the important thing. Rather, it’s the data type of the field in your database. If you have the string ‘foobar’ in a cell and you create an INSERT INTO sql statement that attempts to put that into a Long Integer field, it’s going to fail regardless of tickmarks.
Conversely, if a cell contains a numeric value (like 100) that needs to go into a VARCHAR field, it will need tickmarks (like ‘100’).
If you’re using ADO, check the Type property of the Field object to determine the data type. Use this list http://support.microsoft.com/kb/193947 to see what the types are. Then set up the SQL statement according to the field type.
answered Mar 13, 2013 at 13:47
Dick KusleikaDick Kusleika
32.5k4 gold badges51 silver badges73 bronze badges
Содержание
- Определение типа данных в ячейке или переменной
- Способ 1. Использовать функцию TypeName для определения типа данных
- Способ 2. Проверка на возможность преобразования строки к нужному типу.
- Свойство Range.Formula (Excel)
- Синтаксис
- Замечания
- См. также
- Пример
- Поддержка и обратная связь
- Проверка свойств и значений и Информационные функции
Определение типа данных в ячейке или переменной
В языке VBA есть универсальные типы данных, т.е. способные хранить как число, так и строку, дату и любой другой тип информации. Например, ячейка в таблице может содержать что угодно и изначально, программа не знает какой в ней тип данных хранится. Кроме того, в самой программе может использоваться тип данных Variant, который так же может содержать любое значение любого типа.
Чтобы определить какой тип данных в ячейке или в переменной типа Variant, можно воспользоваться несколькими способами.
Способ 1. Использовать функцию TypeName для определения типа данных
Эта функция возвращает строку с названием типа данных на английском. В качестве аргумента принимает переменную, значение ячейки.
Обратите внимание: Функция определяет только стандартные типы данных и не может определить пользовательский тип (определенный с помощью Type).
Возможные возвращаемые функцией значения:
Byte | Число типа Byte |
Integer | Целое число |
Long | Длинное целое число |
Single | Число одиночной точности с плавающей запятой |
Double | Число двойной точности с плавающей запятой |
Currency | Валюта |
Decimal | Число с плавающей запятой |
Date | Дата |
String | Строка |
Boolean | Логическое |
Error | Ошибка |
Empty | Не проинициализировано (т.е. переменная не была объявлена) |
Null | Неверные данные (в переменной нет корректных данных) |
Object | Объект (класс) |
Unknown | Тип данных не известен |
Nothing | Объект, никуда не ссылающийся |
Приведу несколько примеров по использованию TypeName.
Пример 1. Определение типа переменной.
Обратите внимание: если вы используете результат TypeName в условии, т.е. проверяете, соответствует ли тип данных определенному, например, Integer, то регистр символов возвращаемого типа имеет значение. Т.е. нужно писать Integer с заглавной буквы, либо использовать приведение всех символов к одному регистру.
Пример 2. Использование TypeName в условии.
Пример 3. Определение типа данных в ячейке.
Если функции была передана переменная массив, она вернет тип данных в массиве с добавлением скобок.
Пример 4. Определение типа массива.
Способ 2. Проверка на возможность преобразования строки к нужному типу.
Бывает ситуация, когда значение, например, число или дата, содержится в строке. В этом случае TypeName вернет String, а не Integer или Date. Чтобы узнать, что содержится в строке, можно воспользоваться одной из функций IsNumeric, IsDate, IsObject, IsArray, IsNull, IsError.
IsNumeric | Проверяет может ли выражение быть преобразовано в число |
IsDate | Проверяет может ли выражение быть преобразовано в дату |
IsObject | Проверяет, является ли переменная объектом |
IsArray | Проверяет, является ли переменная массивом |
IsNull | Проверка на пустое значение |
IsError | Проверка выражения на ошибку |
Пример 4. Определение может ли переменная быть преобразована в число.
К сожалению, как видим из примера, нет возможности проверить, содержится ли в строке число с плавающей точкой.
Пример 5. Определение содержит ли переменная дату (может быть преобразована в дату).
Проверка, содержится ли число или дата в ячейке листа делается аналогично, как и с переменными.
Помимо этих способов можно конечно еще придумать и другие, например, проверку строки с данными регулярным выражением или пройти по каждому символу в цикле и проверить цифра это или нет и тому подобное. Но на мой взгляд, описанных мной способов вполне достаточно для решения повседневных задач.
Источник
Свойство Range.Formula (Excel)
Возвращает или задает значение Variant , представляющее неявно пересекающуюся формулу объекта в нотации стиля A1.
Синтаксис
expression. Формула
выражение: переменная, представляющая объект Range.
Замечания
В Excel с поддержкой динамических массивов Range.Formula2 заменяет Range.Formula. Range.Formula будет по-прежнему поддерживаться для обеспечения обратной совместимости. Обсуждение динамических массивов и Range.Formula2 можно найти здесь.
См. также
Свойство Range.Formula2
Это свойство недоступно для источников данных OLAP.
Если ячейка содержит константу, это свойство возвращает константу. Если ячейка пуста, это свойство возвращает пустую строку. Если ячейка содержит формулу, свойство Formula возвращает формулу в виде строки в том же формате, который будет отображаться в строке формул (включая знак равенства ( = )).
Если для ячейки задано значение или формула даты, Microsoft Excel проверяет, что ячейка уже отформатирована с помощью одного из форматов чисел даты или времени. В противном случае Excel изменит числовой формат на короткий формат даты по умолчанию.
Если диапазон состоит из одного или двух измерений, можно установить формулу для массива Visual Basic с теми же размерами. Аналогично, можно поместить формулу в массив Visual Basic.
Формулы, заданные с помощью Range.Formula, могут вызывать неявное пересечение.
Если задать формулу для диапазона с несколькими ячейками, все ячейки в диапазоне заполняются формулой.
Пример
В следующем примере кода задается формула для ячейки A1 на Листе1.
В следующем примере кода задается формула ячейки A1 на листе 1 для отображения текущей даты.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Проверка свойств и значений и Информационные функции
- ЯЧЕЙКА (CELL) — Определяет информацию о формате, местоположении или содержимом ячейки.
ЯЧЕЙКА(тип_инфо; ссылка) Если в качестве перв
- Тип_инфо — текстовое значение, определяющее тип информации о ячейке. Доступны следующие типы:
- адрес («address») — текстовое представление адреса ячейки, записанной в аргументе ссылка . Адрес отображается в соответствии с текущим стилем ссылок.
- столбец («col») — Номер столбца ячейки в ссылке.
- цвет («color») — вернет 1, если форматом ячейки(правая кнопка мыши -Формат ячейки) установлено изменение цвета отрицательных значений в зависимости от значения в ячейке. Например, если это один из предустановленных финансовых форматов, при котором отрицательные значения в ячейке отображаются красным. При этом совершенно не важно какое на данный момент значение в ячейке и какого оно цвета.
Если изменение цвета не предусмотрено форматом ячейки, функция вернет 0. - содержимое («contents») — по сути текст или число, записанное в ячейке или возвращаемое формулой, записанной в этой ячейке
- имяфайла («filename») — Имя файла в текстовом виде (включая полный путь), содержащего ссылку. Возвращает пустой текст («»), если книга с листом, содержащим ссылку, еще не сохранена. Имеет свои нюансы, подробнее о которых можно почитать в статье Как получить имя листа формулой
- формат («format») — Текстовое значение, соответствующее числовому формату ячейки. Возвращает «-» в конце текстового значения, если ячейка форматирована для вывода отрицательных значений другим цветом. Возвращает «()» в конце текстового значения, если ячейка форматирована для вывода положительных чисел в скобках. Доступные возвращаемые значения для различных форматов:
Формат Возвращаемое значение Основной G 0 «F0» 0,00 «F2» # ##0 «,0» # ##0,00 «,2» # ##0 _р_.;-# ##0 _р_. «,0» # ##0 _р_.;[Красный]-# ##0 _р_. «,0-« # ##0,00 _р_.;-# ##0,00 _р_. «,2» # ##0,00 _р_.;[Красный]-# ##0,00 _р_. «,2-« 0% «P0» 0,00% «P2» 0,00E+00 «S2» ##0,0E+0 «S1» #» «?/? или #» «??/?? «G» Д.ММ.ГГ или Д.МММ.ГГ или Д.ММ.ГГ ч:мм «D1» Д.МММ «D2» МММ.ГГ «D3» ч:мм AM/PM «D7» ч:мм:сс AM/PM «D6» ч:мм «D9» ч:мм:сс «D8» мм:сс,0 «G» [ч]:мм:сс «G» 0;[Зеленый]0 «F0-« - скобки («parentheses») — 1, если ячейка форматирована для вывода чисел (в том числе только положительных) в скобках. В ином случае возвращает 0.
- префикс («prefix») — Текстовое значение, соответствующее «метке-префиксу» ячейки. Вернет символ апострофа( ‘ ), если текст в ячейке выровнен влево; символ двойная кавычка( « ), если текст в ячейке выровнен вправо; символ( ^ ), если текст в ячейке выровнен по центру; символ обратной косой черты( ), если текст в ячейке выровнен по обоим краям. Функция вернет пустую строку( «» ), если ячейка содержит что-либо другое, отличное от текста
- защита («protect») — 0, если ячейка не заблокирована, и 1, если ячейка заблокирована. Подробнее про блокирование ячеек можно узнать из этой статьи — Как разрешить изменять только выбранные ячейки?. Функция не определяет, защищен ли в данный момент лист.
- строка («row») — Номер строки ячейки в ссылке.
- тип («type») — Текстовое значение, означающее тип данных в ячейке. Возвращает «b» , если ячейка пустая; «l» — если ячейка содержит текстовую константу; «v» — если ячейка содержит значение иного типа.
- ширина («width») — Ширина столбца ячейки, округленная до ближайшего целого. Ширина определяется на основании ширины символа текущего шрифта для ячейки.
- Ссылка — ссылка на ячейку, данные о которой требуется получить. Если указано более одной ячейки, то информация будет возвращено только для верхней левой ячейки указанного диапазона
Если функция была применена к ячейке и после этого у ячейки, заданной аргументом ссылка был изменен формат, ширина столбца или защита, то для получения корректной информации о текущем состоянии ячейки(в зависимости от типа информации) необходимо заново вычислить функцию или нажать Shift+F9 для вычисления всех формул листа.
Некоторые примеры применения:
=ЯЧЕЙКА(«строка»; A20 ) вернет 20
=ЯЧЕЙКА(«формат»; A1 ) вернет «D2» при условии, что к ячейке A1 применен формат «Д-МММ»
=ЯЧЕЙКА(«содержимое»; A2 ) вернет текст «ВСЕГО», если в ячейке A2 записан текст «ВСЕГО»
У функции ЯЧЕЙКА есть нюанс: т.к. в качестве аргумента принимается текстовая константа, то написанная в русской версии Excel эта константа не будет работать в других локализациях. Например, если записать на листе:
=ЯЧЕЙКА(«строка»; A20 )
сохранить и открыть файл в английскоязычном Excel, то функция вернет значение ошибки, а в ячейке функция будет записана так: =CELL(«строка», A20 ) . Т.е. название функции будет преобразовано в её английское написание, но текстовая константа — нет. Для обеспечения совместимости необходимо использовать английские названия констант:
=ЯЧЕЙКА(«row»;A20)
Такое написание констант будет корректно работать в любой локализации, т.к. является для Excel «интернациональным»(тот же трюк работает и с функцией ИНФОРМ (INFO) )
Значение_ошибки — значение ошибки, номер которой необходимо определить. Как правило ссылка на ячейку с формулой, чтобы определить, не возвращает ли формула ошибку. При необходимости определяется конкретный тип ошибки. Всего доступно 7 вариантов возвращаемых значений:
1 — #ПУСТО! (#EMPTY!)
2 — #ДЕЛ/0! (#DIV/0)
3 — #ЗНАЧ! (#VALUE!)
4 — #ССЫЛКА! (#REF!)
5 — #ИМЯ? (#NAME?)
6 — #ЧИСЛО! (#NUM!)
7 — #Н/Д (#N/A)
Если в ячейке содержится любое другое значение(не ошибочное), функция вернет значение ошибки #Н/Д (#N/A) .
Пример применения:
=ЕСЛИ(ТИП.ОШИБКИ( A10 )=4; «Неверная ссылка»; A10 )
=IF(ERROR.TYPE(A10)=4, «Wrong reference», A10)
ИНФОРМ(тип_инфо)
Тип_инфо — текстовая константа, означающая тип возвращаемой информации.
=ИНФОРМ(«КАТАЛОГ»)
=ИНФОРМ(«ВЕРСИЯОС»)
=ИНФОРМ(«ПЕРЕВЫЧИСЛИТЬ»)
=INFO(«directory»)
=INFO(«osversion»)
=INFO(«recalc»)
Доступны следующие варианты:
- КАТАЛОГ («directory») — Путь текущего каталога
- ЧИСЛОФАЙЛОВ («numfile») — Количество рабочих листов во всех открытых книгах Excel. При этом подсчитываются абсолютно все листы всех книг, даже если листы скрыты и если это листы надстроек и скрытых книг. Поэтому если хотите подсчитать только отображенные листы данная функция не поможет, т.к. у пользователя могут быть активны надстройки вроде Пакета анализа и Поиска решения, листы которых так же будут подсчитаны.
- ИСТОЧНИК («origin») — Возвращается абсолютная ссылка на левую верхнюю видимую в текущем окне ячейку с учетом состояния прокрутки листа. Ссылка возвращается в виде текста с префиксом «$A:» . Применяется для совместимости с Lotus 1-2-3 версий 3.x. Возвращаемое значение зависит от текущих настроек стиля ссылок. Например, если верхняя левая ячейка в окне — ячейка H5, то функция ИНФОРМ вернет следующий текст:
- Стиль ссылок A1: «$A:$H$5»
- Стиль ссылок R1C1: «$A:R5C8»
- ВЕРСИЯОС («osversion») — Возвращает сведения о версии операционной системы, в которой запущен Excel. Однако, если используется 64-разрядная версия ОС, а Excel установлен из пакета 32-бита, то и версия будет идентифицирована как 32-битная. Связано с тем, что функция определяет основные исполняемые файлы приложения и в зависимости именно от их битности выдаст результат. Это может ввести в заблуждение, т.к. тот же офис 365 определяется именно как 32-битный, даже если устанавливался на 64-битную ОС из 64-битного пакета.
- ПЕРЕВЫЧИСЛИТЬ («recalc») — Текущий режим вычисления формул. Функция возвращает «Автоматически» или «Вручную», в зависимости от того, какой режим выставлен в настройках. Более подробно про режим вычислений можно узнать в статье: Формулы перестали считать — как исправить?
- ВЕРСИЯ («release») — Версия Microsoft Excel в виде текста. Для Excel 2003 вернет «11.0», 2007 — «12.0», 2010 — «14.0», 2013 — «15.0», 2016(а так же 365) — «16.0»
- СИСТЕМА («system») — Возвращает название операционной среды, в которой запущен Excel. Macintosh(MAC OS) = «mac», Windows = «pcdos»
- Приведенные ниже типы применимы только в версиях Excel 2003 и более ранних. Начиная с Excel 2007 данные типы не используются и функция вернет значение ошибки #ЗНАЧ! (#VALUE!) :
- ПАМЯТЬВСЕГО («totmem») — Общее количество доступной памяти в байтах, включая уже используемую
- ДОСТУПНАЯПАМЯТЬ («memavail») — Количество свободной памяти в байтах
- ИСПОЛЬЗУЕМАЯПАМЯТЬ («memused») — Количество памяти, используемой для данных
С функцией ИНФОРМ есть один нюанс: т.к. в качестве аргумента принимается текстовая константа, то написанная в русской версии Excel эта константа не будет работать в других локализациях. Например, если записать на листе:
=ИНФОРМ(«ВЕРСИЯОС»)
сохранить и открыть файл в английскоязычном Excel, то функция вернет значение ошибки, а в ячейке функция будет записана так: =INFO(«ВЕРСИЯОС») . Т.е. название функции будет преобразовано в её английское написание, но текстовая константа — нет. Как же обеспечить совместимость? Все просто. Надо использовать английские названия констант:
=ИНФОРМ(«osversion»)
Такое написание констант будет корректно работать в любой локализации, т.к. является для Excel «интернациональным»(тот же трюк работает и с другой функцией, работающей с набором текстовых констант — ЯЧЕЙКА (CELL) )
=ЕПУСТО(значение)
значение — ссылка на ячейку или именованный диапазон, значение которого необходимо проверить на наличие пустого значения. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
=ЕПУСТО( A1 )
Что важно помнить, при работе с этой функцией: если в проверяемой ячейке записана формула, то такая ячейка всегда будет считаться не пустой и функция ЕПУСТО вернет значение ЛОЖЬ (FALSE) , даже если при этом формула в проверяемой ячейке возвращает пустую строку( =»» ).
=ЕОШ(значение)
значение — непосредственно формула или значение, а так же ссылка на ячейку или именованный диапазон, которые необходимо проверить на наличие ошибки. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
Чаще всего используется вместе с вложенными функциями, которые могут вернуть значение ошибки(например, функция ПОИСК или НАЙТИ), кроме ошибки #Н/Д (#N/A) :
=ЕОШ(( A1 )
=ЕСЛИ(ЕОШ((НАЙТИ(«дом»; A1 ));»»;ПСТР( A1 ;1;НАЙТИ(«дом»; A1 )-1))
где в A1 текст для поиска значения «дом». Если значение в ячейке есть — функция возвращает текст до этого значения
Чтобы обработать исключительно ошибку #Н/Д (#N/A) используется функция ЕНД
Пример применения функции можно посмотреть в этой статье — Как в ячейке с формулой вместо ошибки показать 0
=ЕОШИБКА(значение)
значение — непосредственно формула или значение, а так же ссылка на ячейку или именованный диапазон, которые необходимо проверить на наличие ошибки. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
Применяется для обработки функций, которые могут вернуть значение ошибки или проверки ячеек, содержащих такие функции:
=ЕОШИБКА( A1 )
=ЕСЛИ(ЕОШИБКА(ВПР( A1 ;B2:F10;2;0));»»;ВПР( A1 ;B2:F10;2;0))
Если ВПР не найдет значение(вернет ошибку #Н/Д) или возвращаемое значение будет содержать любую ошибку, то формула вернет пустую строку. В противном случае — будет вычислена ВПР
Пример применения функции можно посмотреть в этой статье — Как в ячейке с формулой вместо ошибки показать 0
Подробнее про ВПР можно ознакомиться здесь: Как найти значение в другой таблице или сила ВПР
=ЕНД(значение)
значение — непосредственно формула или значение, а так же ссылка на ячейку или именованный диапазон, которые необходимо проверить на наличие ошибки. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
Очень похожа на ЕОШ и ЕОШИБКА , но работает исключительно с типом ошибок #Н/Д (#N/A) . Поэтому применяется в основном вместе с функциями вроде ВПР (VLOOKUP) и ПОИСКПОЗ (MATCH) . Подробнее про ВПР можно ознакомиться здесь: Как найти значение в другой таблице или сила ВПР
=ЕЧЁТН(число)
число — непосредственно значение или ссылка на ячейку с числом. Число может быть положительным или отрицательным. 0 будет считаться четным. Если значение является не целым числом, то дробная часть числа отбрасывается(например, 2,5 будет преобразовано в 2). Если значение не является числом, то функция возвращает значение ошибки #ЗНАЧ! (#VALUE!) . В версиях 2007 и ниже функция может быть недоступна. В этом случае необходимо установить надстройку Пакет Анализа, а затем подключить его с помощью команды Надстройки из меню.
=ЕЧЁТН(-1) вернет ЛОЖЬ
=ЕЧЁТН(2,5) вернет ИСТИНА
=ЕЧЁТН(5) вернет ЛОЖЬ
=ЕНЕЧЁТ(число)
число — непосредственно значение или ссылка на ячейку с числом. Число может быть положительным или отрицательным. 0 будет считаться четным, т.е. функция вернет ЛОЖЬ (FALSE) . Если значение является не целым числом, то дробная часть числа отбрасывается(например, 2,5 будет преобразовано в 2). Если значение не является числом, то функция возвращает значение ошибки #ЗНАЧ! (#VALUE!) . В версиях 2007 и ниже функция может быть недоступна. В этом случае необходимо установить надстройку Пакет Анализа, а затем подключить его с помощью команды Надстройки из меню.
=ЕНЕЧЁТ(-1) вернет ИСТИНА
=ЕНЕЧЁТ(2,5) вернет ЛОЖЬ
=ЕНЕЧЁТ(5) вернет ИСТИНА
=ЕЛОГИЧ(значение)
значение — непосредственно значение или ссылка на ячейку, а также формула или функция.
=ЕНЕТЕКСТ(значение)
Самое важное, что стоит помнить в этой функции — она вернет ИСТИНА, если аргумент значение является ссылкой на пустую ячейку.
=ЕЧИСЛО(значение)
Отличие этой функции от функции ЕНЕТЕКСТ (ISNONTEXT) в том, что если аргументом значение будет логическое ИСТИНА или ЛОЖЬ или значение ошибки, то функция ЕНЕТЕКСТ вернет ИСТИНА, в то время как ЕЧИСЛО вернет ЛОЖЬ.
=ЕССЫЛКА(значение)
значение — ссылка на одну ячейку, диапазон ячеек или именованный диапазон. Если аргумент является текстом или несуществующей ячейкой, функция вернет ЛОЖЬ. Как правило ЕССЫЛКА используется в случаях, когда другие функции используют данные с других листов, которые могут быть удалены.
=ЕСЛИ(ЕССЫЛКА(Лист4!A1:C10);ВПР( A1 ;Лист4!A1:C10;3;0);ВПР( A1 ;Лист2!A1:C10;3;0))
=IF(ISREF(Лист4!A1:C10),VLOOKUP(A1,Лист4!A1:C10,3,0),VLOOKUP(A1,Лист2!A1:C10,3,0))
В этом случае функция ЕССЫЛКА будет возвращать ИСТИНА (TRUE) , если Лист4 присутствует в книге и тогда ВПР будет брать данные с этого листа. Если же Лист4 будет удален — ВПР будет брать данные с листа Лист2 . Это более корректно, чем применение ЕОШИБКА или подобные им, т.к. ВПР может возвращать значение ошибки с самого листа Лист2 , например, если искомые данные отсутствуют на листе.
Подробнее про ВПР можно ознакомиться здесь: Как найти значение в другой таблице или сила ВПР
=ЕТЕКСТ(значение)
значение — непосредственно значение или ссылка на ячейку, значение которой необходимо проверить. Если аргументом значение будет логическое ИСТИНА или ЛОЖЬ или значение ошибки, то функция ЕТЕКСТ вернет ЛОЖЬ.
Главное, о чем стоит помнить, применяя функцию это то, что если число в ячейке записано как текст(«2»), функция вернет ИСТИНА. Т.е. функция проверяет именно тип данных, а не возможность работы со значением как с числом.
=Ч(значение)
значение — произвольное значение или ссылка на ячейку со значением. Если значение является значением любой из ошибок Excel(#ДЕЛ/0! (#DIV/0) , #ЗНАЧ! (#VALUE!) , #ССЫЛКА! (#REF!) , #ИМЯ? (#NAME?) , #ЧИСЛО! (#NUM!) , #Н/Д (#N/A) ), то функция вернет значение этой ошибки. Преобразование не будет выполнено.
Остальные типы данных преобразуются по следующим правилам:
- Число или число, записанное как текст — будет преобразовано в это же число, которое является реальным числом
- Дата в одном из встроенных форматов Microsoft Excel — будет преобразована в дату в числовом формате(чуть более подробно о представлении дат в Excel можно узнать из статьи: Как Excel воспринимает данные?)
- ИСТИНА — будет преобразовано в 1
- любой другой тип данных — будет преобразован в 0
Источник
В языке VBA есть универсальные типы данных, т.е. способные хранить как число, так и строку, дату и любой другой тип информации. Например, ячейка в таблице может содержать что угодно и изначально, программа не знает какой в ней тип данных хранится. Кроме того, в самой программе может использоваться тип данных Variant, который так же может содержать любое значение любого типа.
Чтобы определить какой тип данных в ячейке или в переменной типа Variant, можно воспользоваться несколькими способами.
Способ 1. Использовать функцию TypeName для определения типа данных
Эта функция возвращает строку с названием типа данных на английском. В качестве аргумента принимает переменную, значение ячейки.
Обратите внимание: Функция определяет только стандартные типы данных и не может определить пользовательский тип (определенный с помощью Type).
Возможные возвращаемые функцией значения:
Byte | Число типа Byte |
Integer | Целое число |
Long | Длинное целое число |
Single | Число одиночной точности с плавающей запятой |
Double | Число двойной точности с плавающей запятой |
Currency | Валюта |
Decimal | Число с плавающей запятой |
Date | Дата |
String | Строка |
Boolean | Логическое |
Error | Ошибка |
Empty | Не проинициализировано (т.е. переменная не была объявлена) |
Null | Неверные данные (в переменной нет корректных данных) |
Object | Объект (класс) |
Unknown | Тип данных не известен |
Nothing | Объект, никуда не ссылающийся |
Приведу несколько примеров по использованию TypeName.
Пример 1. Определение типа переменной.
Dim v As Integer MsgBox TypeName(v) ' Выведет: Integer
Обратите внимание: если вы используете результат TypeName в условии, т.е. проверяете, соответствует ли тип данных определенному, например, Integer, то регистр символов возвращаемого типа имеет значение. Т.е. нужно писать Integer с заглавной буквы, либо использовать приведение всех символов к одному регистру.
Пример 2. Использование TypeName в условии.
Dim v As Integer If TypeName(v) = "Integer" Then MsgBox "Yes" Else MsgBox "No" ' Yes If TypeName(v) = "integer" Then MsgBox "Yes" Else MsgBox "No" ' No If LCase(TypeName(v)) = "integer" Then MsgBox "Yes" Else MsgBox "No" ' Yes
Пример 3. Определение типа данных в ячейке.
MsgBox TypeName(Cells(1, 1).Value) ' Выведет тип данных в ячейке A1
Если функции была передана переменная массив, она вернет тип данных в массиве с добавлением скобок.
Пример 4. Определение типа массива.
Dim Arr1(10) As Integer Dim Arr2(10) MsgBox TypeName(Arr1) ' Выведет: Integer() MsgBox TypeName(Arr2) ' Выведет: Variant()
Способ 2. Проверка на возможность преобразования строки к нужному типу.
Бывает ситуация, когда значение, например, число или дата, содержится в строке. В этом случае TypeName вернет String, а не Integer или Date. Чтобы узнать, что содержится в строке, можно воспользоваться одной из функций IsNumeric, IsDate, IsObject, IsArray, IsNull, IsError.
IsNumeric | Проверяет может ли выражение быть преобразовано в число |
IsDate | Проверяет может ли выражение быть преобразовано в дату |
IsObject | Проверяет, является ли переменная объектом |
IsArray | Проверяет, является ли переменная массивом |
IsNull | Проверка на пустое значение |
IsError | Проверка выражения на ошибку |
Пример 4. Определение может ли переменная быть преобразована в число.
Dim v As String If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no (т.к. в строке нет числа) v = "120" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes v = "120.45" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no v = "test 120" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no v = "120 test" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no
К сожалению, как видим из примера, нет возможности проверить, содержится ли в строке число с плавающей точкой.
Пример 5. Определение содержит ли переменная дату (может быть преобразована в дату).
Dim firstDate, secondDate As Date Dim timeOnly, dateAndTime, noDate As String firstDate = CDate("12.05.2017") secondDate = #12/5/2017# timeOnly = "15:45" dateAndTime = "12.05.2017 15:45" noDate = "Test" If IsDate(firstDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(secondDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(timeOnly) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(dateAndTime) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(noDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no
Проверка, содержится ли число или дата в ячейке листа делается аналогично, как и с переменными.
Помимо этих способов можно конечно еще придумать и другие, например, проверку строки с данными регулярным выражением или пройти по каждому символу в цикле и проверить цифра это или нет и тому подобное. Но на мой взгляд, описанных мной способов вполне достаточно для решения повседневных задач.
G-man Пользователь Сообщений: 11 |
#1 09.10.2016 11:50:06 Всем привет. Пытаюсь сделать свою функцию, одно из условий проверяет формат другой ячейки. Однако не получается правильно прописать условия…
В принципе разные варианты пробовал, но просто только когда уже знаешь синтаксис. Изменено: G-man — 09.10.2016 11:51:37 |
||
vikttur Пользователь Сообщений: 47199 |
#2 09.10.2016 11:59:52 Хотите получить формат ячейки, но указываете значение…
Вот-вот… Не стесняйтесь спрашавать в справке или в сети. Ошибок в коде много.
Порядок условий: Нехорошо, когда функция может показать разные типы данных (здесь: текст и число). Отображение ошибки («N/A») — тоже не лучший вариант. Потом, возможно, придется обходить такую ошибку. |
||||
vikttur Пользователь Сообщений: 47199 |
#3 09.10.2016 12:04:58
Порядок условий: Нехорошо, когда функция может показать разные типы данных (здесь: текст и число). Отображение ошибки («N/A») — тоже не лучший вариант. Потом, возможно, придется обходить такую ошибку. |
||
G-man Пользователь Сообщений: 11 |
#4 09.10.2016 12:22:26
Ну, как работает функция «если» (экселевская) я знаю, я же не буду Вас грузить сотней условий. Поэтому упростил вопрос. О замечаниях: хорошо, буду иметь ввиду. |
||
vikttur Пользователь Сообщений: 47199 |
#5 09.10.2016 12:28:01
А как работает VBA-шная, не знаете (найдите ошибку в своем коде) ) |
||
G-man Пользователь Сообщений: 11 |
#6 09.10.2016 12:42:48
2 основных отличия: 2. Добавился параметр Value. Но для меня пока загадка почему он нужен, т.к. и без него работает. |
||
vikttur Пользователь Сообщений: 47199 |
#7 09.10.2016 12:57:22 Писал об ошибке в синтаксисе ЕСЛИ: Вы не указали выход из функции (End If). Название переменных можете поменять, но у Вас неправильно: не значение должны проверять, а диапазон. В Вашем коде Cell... неправильно… семейство, поэтому Cells |