Vba excel как определить формат ячейки excel

Свойства ячейки, часто используемые в коде 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 при применении их к ячейкам с отформатированным числом и датой. Свойство 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

Community's user avatar

asked Mar 12, 2013 at 21:19

Fat Owl's user avatar

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_plum's user avatar

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

Joe Brooks's user avatar

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 Zemens's user avatar

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 Kusleika's user avatar

Dick KusleikaDick Kusleika

32.5k4 gold badges51 silver badges73 bronze badges

Содержание

  1. Определение типа данных в ячейке или переменной
  2. Способ 1. Использовать функцию TypeName для определения типа данных
  3. Способ 2. Проверка на возможность преобразования строки к нужному типу.
  4. Свойство Range.Formula (Excel)
  5. Синтаксис
  6. Замечания
  7. См. также
  8. Пример
  9. Поддержка и обратная связь
  10. Проверка свойств и значений и Информационные функции

Определение типа данных в ячейке или переменной

В языке 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) )

  • ТИП.ОШИБКИ (ERROR.TYPE) — Определяет номер, соответствующий одному из типов ошибок Microsoft Excel. Чаще всего применяется в составе логических функций типа ЕСЛИ (IF) для проверки результата вычисления функций. ТИП.ОШИБКИ(значение_ошибки)
    Значение_ошибки — значение ошибки, номер которой необходимо определить. Как правило ссылка на ячейку с формулой, чтобы определить, не возвращает ли формула ошибку. При необходимости определяется конкретный тип ошибки. Всего доступно 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) — Выдает информацию о текущей операционной среде и некоторых свойствах приложения Excel. Однако данная функция давно не дорабатывалась и некоторые сведения могут быть неверными или выдавать ошибочный результат в версиях Excel 2007 и выше.
    ИНФОРМ(тип_инфо)
    Тип_инфо — текстовая константа, означающая тип возвращаемой информации.
    =ИНФОРМ(«КАТАЛОГ»)
    =ИНФОРМ(«ВЕРСИЯОС»)
    =ИНФОРМ(«ПЕРЕВЫЧИСЛИТЬ»)
    =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) )

  • ЕПУСТО (ISBLANK) — Выдает логическое значение ИСТИНА, если аргумент является ссылкой на пустую ячейку.
    =ЕПУСТО(значение)
    значение — ссылка на ячейку или именованный диапазон, значение которого необходимо проверить на наличие пустого значения. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
    =ЕПУСТО( A1 )
    Что важно помнить, при работе с этой функцией: если в проверяемой ячейке записана формула, то такая ячейка всегда будет считаться не пустой и функция ЕПУСТО вернет значение ЛОЖЬ (FALSE) , даже если при этом формула в проверяемой ячейке возвращает пустую строку( =»» ).
  • ЕОШ (ISERR) — Выдает логическое значение ИСТИНА (TRUE) , если аргумент ссылается на любое значение ошибки, кроме #Н/Д (#N/A) .
    =ЕОШ(значение)
    значение — непосредственно формула или значение, а так же ссылка на ячейку или именованный диапазон, которые необходимо проверить на наличие ошибки. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
    Чаще всего используется вместе с вложенными функциями, которые могут вернуть значение ошибки(например, функция ПОИСК или НАЙТИ), кроме ошибки #Н/Д (#N/A) :
    =ЕОШ(( A1 )
    =ЕСЛИ(ЕОШ((НАЙТИ(«дом»; A1 ));»»;ПСТР( A1 ;1;НАЙТИ(«дом»; A1 )-1))
    где в A1 текст для поиска значения «дом». Если значение в ячейке есть — функция возвращает текст до этого значения
    Чтобы обработать исключительно ошибку #Н/Д (#N/A) используется функция ЕНД
    Пример применения функции можно посмотреть в этой статье — Как в ячейке с формулой вместо ошибки показать 0
  • ЕОШИБКА (ISERROR) — Выдает логическое значение ИСТИНА, если аргумент ссылается на любое значение ошибки
    =ЕОШИБКА(значение)
    значение — непосредственно формула или значение, а так же ссылка на ячейку или именованный диапазон, которые необходимо проверить на наличие ошибки. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
    Применяется для обработки функций, которые могут вернуть значение ошибки или проверки ячеек, содержащих такие функции:
    =ЕОШИБКА( A1 )
    =ЕСЛИ(ЕОШИБКА(ВПР( A1 ;B2:F10;2;0));»»;ВПР( A1 ;B2:F10;2;0))
    Если ВПР не найдет значение(вернет ошибку #Н/Д) или возвращаемое значение будет содержать любую ошибку, то формула вернет пустую строку. В противном случае — будет вычислена ВПР
    Пример применения функции можно посмотреть в этой статье — Как в ячейке с формулой вместо ошибки показать 0
    Подробнее про ВПР можно ознакомиться здесь: Как найти значение в другой таблице или сила ВПР
  • ЕНД (ISNA) — Выдает логическое значение ИСТИНА, если аргумент ссылается на значение ошибки #Н/Д (#N/A) (значение недоступно).
    =ЕНД(значение)
    значение — непосредственно формула или значение, а так же ссылка на ячейку или именованный диапазон, которые необходимо проверить на наличие ошибки. Если ссылка содержит более одной ячейки, то функция проверит значение только одной — левой верхней ячейки.
    Очень похожа на ЕОШ и ЕОШИБКА , но работает исключительно с типом ошибок #Н/Д (#N/A) . Поэтому применяется в основном вместе с функциями вроде ВПР (VLOOKUP) и ПОИСКПОЗ (MATCH) . Подробнее про ВПР можно ознакомиться здесь: Как найти значение в другой таблице или сила ВПР
  • ЕЧЁТН (ISEVEN) — Выдает логическое значение ИСТИНА (TRUE) , если аргумент — четное число.
    =ЕЧЁТН(число)
    число — непосредственно значение или ссылка на ячейку с числом. Число может быть положительным или отрицательным. 0 будет считаться четным. Если значение является не целым числом, то дробная часть числа отбрасывается(например, 2,5 будет преобразовано в 2). Если значение не является числом, то функция возвращает значение ошибки #ЗНАЧ! (#VALUE!) . В версиях 2007 и ниже функция может быть недоступна. В этом случае необходимо установить надстройку Пакет Анализа, а затем подключить его с помощью команды Надстройки из меню.
    =ЕЧЁТН(-1) вернет ЛОЖЬ
    =ЕЧЁТН(2,5) вернет ИСТИНА
    =ЕЧЁТН(5) вернет ЛОЖЬ
  • ЕНЕЧЁТ (ISODD) — Выдает логическое значение ИСТИНА, если аргумент — нечетное число.
    =ЕНЕЧЁТ(число)
    число — непосредственно значение или ссылка на ячейку с числом. Число может быть положительным или отрицательным. 0 будет считаться четным, т.е. функция вернет ЛОЖЬ (FALSE) . Если значение является не целым числом, то дробная часть числа отбрасывается(например, 2,5 будет преобразовано в 2). Если значение не является числом, то функция возвращает значение ошибки #ЗНАЧ! (#VALUE!) . В версиях 2007 и ниже функция может быть недоступна. В этом случае необходимо установить надстройку Пакет Анализа, а затем подключить его с помощью команды Надстройки из меню.
    =ЕНЕЧЁТ(-1) вернет ИСТИНА
    =ЕНЕЧЁТ(2,5) вернет ЛОЖЬ
    =ЕНЕЧЁТ(5) вернет ИСТИНА
  • ЕЛОГИЧ (ISLOGICAL) — Выдает логическое значение ИСТИНА, если аргумент ссылается на логическое значение.
    =ЕЛОГИЧ(значение)
    значение — непосредственно значение или ссылка на ячейку, а также формула или функция.
  • ЕНЕТЕКСТ (ISNONTEXT) — Выдает логическое значение ИСТИНА, если аргумент ссылается на значение, которое не является текстом.
    =ЕНЕТЕКСТ(значение)
    Самое важное, что стоит помнить в этой функции — она вернет ИСТИНА, если аргумент значение является ссылкой на пустую ячейку.
  • ЕЧИСЛО (ISNUMBER) — Выдает логическое значение ИСТИНА, если аргумент является числом.
    =ЕЧИСЛО(значение)
    Отличие этой функции от функции ЕНЕТЕКСТ (ISNONTEXT) в том, что если аргументом значение будет логическое ИСТИНА или ЛОЖЬ или значение ошибки, то функция ЕНЕТЕКСТ вернет ИСТИНА, в то время как ЕЧИСЛО вернет ЛОЖЬ.
  • ЕССЫЛКА (ISREF) — Выдает логическое значение ИСТИНА, если аргумент является рабочей ссылкой на существующую ячейку.
    =ЕССЫЛКА(значение)
    значение — ссылка на одну ячейку, диапазон ячеек или именованный диапазон. Если аргумент является текстом или несуществующей ячейкой, функция вернет ЛОЖЬ. Как правило ЕССЫЛКА используется в случаях, когда другие функции используют данные с других листов, которые могут быть удалены.
    =ЕСЛИ(ЕССЫЛКА(Лист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 , например, если искомые данные отсутствуют на листе.
    Подробнее про ВПР можно ознакомиться здесь: Как найти значение в другой таблице или сила ВПР
  • ЕТЕКСТ (ISTEXT) — Выдает логическое значение ИСТИНА, если аргумент является текстом.
    =ЕТЕКСТ(значение)
    значение — непосредственно значение или ссылка на ячейку, значение которой необходимо проверить. Если аргументом значение будет логическое ИСТИНА или ЛОЖЬ или значение ошибки, то функция ЕТЕКСТ вернет ЛОЖЬ.
    Главное, о чем стоит помнить, применяя функцию это то, что если число в ячейке записано как текст(«2»), функция вернет ИСТИНА. Т.е. функция проверяет именно тип данных, а не возможность работы со значением как с числом.
  • Ч (N) — Преобразует заданное значение в число.
    =Ч(значение)
    значение — произвольное значение или ссылка на ячейку со значением. Если значение является значением любой из ошибок 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
    Регистрация: 04.09.2016

    #1

    09.10.2016 11:50:06

    Всем привет. Пытаюсь сделать свою функцию, одно из условий проверяет формат другой ячейки. Однако не получается правильно прописать условия…

    Код
    Public Function Myfunc(Знач1 As Long, Знач2 As Long)   
        If Знач1 = Cell.Style = "Percent" Or Знач2 = Cell.Style = "Percent" Then
            Myfunc = "N/A"
        ElseIf Знач1 =1 Then
            Myfunc = Знач1
        ElseIf Знач2 =2 Then
            Myfunc = Знач2
    End Function

    В принципе разные варианты пробовал, но просто только когда уже знаешь синтаксис.
    Поиск ничего полезного не дал…

    Изменено: G-man09.10.2016 11:51:37

     

    vikttur

    Пользователь

    Сообщений: 47199
    Регистрация: 15.09.2012

    #2

    09.10.2016 11:59:52

    Хотите получить формат ячейки, но указываете значение…
    Непонятно, что хотите получить, если форматы не процентные. Если в первой ячейке 1, то до проверки второй ячейки не дойдет.

    Цитата
    G-man написал: но просто только когда уже знаешь синтаксис.

    Вот-вот… Не стесняйтесь спрашавать в справке или в сети. Ошибок в коде много.

    Код
    Public Function Myfunc(rRng1 As Range, rRng2 As Range)
        If rRng1.NumberFormat = "0.00%" Or rRng2.NumberFormat = "0.00%" Then
            Myfunc = "N/A"
        ElseIf rRng1.Value = 1 Then
            Myfunc = 1
        ElseIf rRng2.Value = 2 Then
            Myfunc = 2
        End If
    End Function
    

    Порядок условий:
    — если одна из ячеек имеет процентный формат, то «N/A»
    — если первая ячейка со значением 1, то 1
    — если вторая ячейка со значением 2, то 2
    — если все условия ложные , то 0

    Нехорошо, когда функция может показать разные типы данных (здесь: текст и число). Отображение ошибки («N/A») — тоже не лучший вариант. Потом, возможно, придется обходить такую ошибку.

     

    vikttur

    Пользователь

    Сообщений: 47199
    Регистрация: 15.09.2012

    #3

    09.10.2016 12:04:58

    Код
    Public Function Myfunc(rRng1 As Range, rRng2 As Range)
        If rRng1.NumberFormat = "0.00%" Or rRng2.NumberFormat = "0.00%" Then
            Myfunc = "N/A"
        ElseIf rRng1.Value = 1 Then
            Myfunc = 1
        ElseIf rRng2.Value = 2 Then
            Myfunc = 2
        End If
    End Function
    

    Порядок условий:
    — если одна из ячеек имеет процентный формат, то «N/A»;
    — если первая ячейка со значением 1, то 1;
    — если вторая ячейка со значением 2, то 2;
    — если все условия ложные , то 0.

    Нехорошо, когда функция может показать разные типы данных (здесь: текст и число). Отображение ошибки («N/A») — тоже не лучший вариант. Потом, возможно, придется обходить такую ошибку.

     

    G-man

    Пользователь

    Сообщений: 11
    Регистрация: 04.09.2016

    #4

    09.10.2016 12:22:26

    Цитата
    vikttur написал: Непонятно, что хотите получить, если форматы не процентные.

    Ну, как работает функция «если» (экселевская) я знаю, я же не буду Вас грузить сотней условий. Поэтому упростил вопрос.

    О замечаниях: хорошо, буду иметь ввиду.
    То, что Вы скинули сверху работает. Спасибо!

     

    vikttur

    Пользователь

    Сообщений: 47199
    Регистрация: 15.09.2012

    #5

    09.10.2016 12:28:01

    Цитата
    как работает функция «если» (экселевская) я знаю

    А как работает VBA-шная, не знаете (найдите ошибку в своем коде) )

     

    G-man

    Пользователь

    Сообщений: 11
    Регистрация: 04.09.2016

    #6

    09.10.2016 12:42:48

    Цитата
    А как работает VBA-шная, не знаете

    2 основных отличия:
    1. Вы переименовали аргументы в «rRng1» и «rRng2», но тогда они не будут говорящими. Я через пол-года не вспомню что в них должно быть, поэтому прописал Кирилицей, т.к. хотел чтобы аргументы были «говорящие»:

    2. Добавился параметр Value. Но для меня пока загадка почему он нужен, т.к. и без него работает.

     

    vikttur

    Пользователь

    Сообщений: 47199
    Регистрация: 15.09.2012

    #7

    09.10.2016 12:57:22

    Писал об ошибке в синтаксисе ЕСЛИ: Вы не указали выход из функции (End If).

    Название переменных можете поменять, но у Вас неправильно: не значение должны проверять, а диапазон.
    Знач1 As Long — тип переменной — целое число, но нужно же получать форматировние ячейки, а ячейка — это диапазон, тип Range
    И перемення должна на это как-то указывать, иначе сами потом запутаетесь.
    rRng1 — переменная типа Range. Можете назвать Диап1 , но тут возможны ошибки, желательно не применять кириллицу в коде. Вариант — Diap1
    А вот Diap1.Value — это значение диапазона. Да, по умолчанию берется значение, но правильнее указывать явно во избежание ошибок.

    В Вашем коде Cell... неправильно… семейство, поэтому Cells

    Like this post? Please share to your friends:
  • Vba excel как обратиться к строке
  • Vba excel как обратиться к листу по имени
  • Vba excel как обратиться к листу книги
  • Vba excel как обратиться к другой книге
  • Vba excel как обратиться к диапазону