Excel vba количество знаков после запятой

Главная » Функции VBA »

28 Апрель 2011              129097 просмотров

  • ABS() — эта функция возвращает абсолютное значение переданного ей числа (то же число, но без знака). Например, ABS(3) и ABS(-3) вернут одно и то же значение 3.
  • Int(), Fix() и Round()позволяют по разному округлять числа:
    • Int() возвращает ближайшее меньшее целое;
    • Fix() отбрасывает дробную часть;
    • Round() округляет до указанного количества знаков после запятой.

    Однако Round может вернуть не совсем ожидаемый результат, т.к. функция применяет финансовое округление. По правилам данного округления если за последней к округлению цифрой стоит 5, то округляемую цифру увеличивают в том случае, если она нечетная и уменьшают, если четная.
    Математическое же округление всегда округляет цифру в большую сторону, если за ней идет цифра 5 и выше, и отбрасывает остаток если 4 и меньше.
    Т.е. если мы выполним такую строку кода

    то результатом будет 2,5, хотя предполагалось получить 2,51. Поэтому порой для округления лучше использовать Format:

        MsgBox Format(2.505, "#,##0.00")

    но в этом случае мы получим не число в чистом виде, а текст. И если нужно именно число, то придется производить дополнительные преобразования:

        MsgBox CDbl(Format(2.505, "#,##0.00"))

    Так же, для математического округления, можно использовать и такой вариант:

        MsgBox Application.Round(2.505, 2)

    Но здесь стоит учитывать, что это не чистый VB и этот метод сработает только в Excel, т.к. по сути мы обращаемся к встроенной в Excel функции округления ОКРУГЛ(ROUND), которая применяет именно математическое округление.

  • Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.
        Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long
        lMinNum = 1: lMaxNum = 100
        Randomize
        lRundNum = Int(lMinNum + (Rnd() * lMaxNum))
        MsgBox lRundNum
  • Sgn() — позволяет вернуть информацию о знаке числа. Возвращает 1, если число положительное, -1, если отрицательное и 0, если проверяемое число равно 0.
  • Mod() — Делит два числа и возвращает только остаток. Например, выражение 8 Mod 3 вернет число 2, т.к. без остатка(в виде дроби у результата деления) 8 делится на 3 только до 2-х(8 / 3 = 2,66666666666667).
    При этом функция Mod учитывает и знак числа — если первое число или оба числа отрицательные, то результатом будет отрицательное число. Если же отрицательное только второе число — то результат будет положительным числом.
    При попытке получить остаток при делении чисел с плавающей запятой результат может быть не тем, который ожидается, потому что перед выполнением деления оба числа округляются по математическим законам(5 и выше до большего, 4 и ниже — до меньшего). Например, выражение 8 Mod 3.5 вернет 0, а выражение 8 Mod 3.4 — 2.

0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

1

Excel

Изменение пользователем количества знаков после запятой

08.01.2020, 16:26. Показов 11297. Ответов 19


Студворк — интернет-сервис помощи студентам

Добрый день!

Подскажите, пожалуйста, как написать макрос для установки формата ячейки, как: ЧИСЛОВОЙ, КОЛ-ВО знаков после запятой равно значению в ячейке B1.

То есть, при вводе в ячейку B1, например, число 2, в столбце А формат ячеек будет «0,00», а если в ячейку B1 ввести 3, то формат будет «0,000», и т.д.?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

08.01.2020, 16:26

Ответы с готовыми решениями:

Visual Basic 2013 сложение чисел, округление до 2 знаков после запятой, отбрасывание знаков
Как сложить несколько чисел из TextBox, округлить их, отбросить знаки после запятой?
показать…

Округление числа до 2 знаков после запятой
Буду очень признательна, если кто-то подскажет, как написать программу, округляющую число до двух…

Как показать нули после запятой (до 2-x знаков)?
Здравствуйте! Мне нужно сделать так, чтобы макрос не округлил числа, и именно форматировал….

Фиксирование количества знаков после запятой
Здравствуйте! Мне надо, что функция "q" выводила в консоль число с фиксированной запятой, с…

19

Остап Бонд

Заблокирован

08.01.2020, 16:41

2

Так?

Visual Basic
1
[a1].NumberFormat = "0." & string([b1],"0")



1



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 16:48

3

Если ввод осуществляется в одну ячейку, то можно и так : (скопировать строго в модуль листа, где и должно происходить изменение формата)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Set r = Intersect(Target, [B:B])
    If Not r Is Nothing Then
       Set r = r(1)
       Select Case r
           Case 1 To 127
              r(1, 0).NumberFormat = "0." & String(r, "0")
           Case 0
              r(1, 0).NumberFormat = "0"
       End Select
    End If
End Sub



1



serjey2128

0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 17:22

 [ТС]

4

Спасибо огромное за помощь, уважаемые Остап и pashulka!

То, что нужно:

Visual Basic
1
[A:A].NumberFormat = "0." & string([b1],"0")

Добавлено через 23 минуты
Ваш код вообще шикарный, я о том, что 0 будет не корректно форматировать ячейки даже и не думал.

Чуть-чуть подправил под себя, надеюсь ни чего лишнего не убрал):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Set r = Intersect(Target, [B1])
    If Not r Is Nothing Then
       Select Case r
           Case 1 To 127
              [A:A].NumberFormat = "0." & String(r, "0")
           Case 0
              [A:A].NumberFormat = "0"
       End Select
    End If
End Sub



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 17:32

5

serjey2128, Если за весь столбец отвечает только одна ячейка, то можно и так :

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$1" Then
       Select Case Target
           Case 1 To 127
              [A:A].NumberFormat = "0." & String(Target, "0")
           Case 0
              [A:A].NumberFormat = "0"
       End Select
    End If
End Sub

или так, если пользователь изменит значение сразу нескольких ячеек, например, B1:C1

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, [B1]) Is Nothing Then Exit Sub    
    Select Case [B1]
       Case 1 To 127
           [A:A].NumberFormat = "0." & String([B1], "0")
       Case 0
           [A:A].NumberFormat = "0"
    End Select
End Sub



1



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 18:03

 [ТС]

6

Вопрос не по теме.

Есть диапазон измеренных значений, после запятой может быть 2, 3, и более знаков. Что можно сделать, чтобы отображались они с одинаковым количеством знаков после запятой, например:

1,52 = 1,5200
1,535 = 1,5350
1,4896 = 1,4896



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 18:09

7

serjey2128, Если введёте 4, то получите именно такой результат. Или Вы хотите вычислить/определить/узнать 4 программно ?



0



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 18:18

 [ТС]

8

К теме это не имеет отношения.

Я хочу чтобы в определенном столбце, куда вводятся измеренные значения, они представлялись в одном формате, т.е.
Если ввели 1,52; 1,236; 2,2, то алгоритм определил бы, что в данном диапазоне большее количество десятичных знаков у числа 1,236 и остальные значения привел бы к форме 1,520; 2,200



0



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 18:59

9

Можно было просто сказать, что мои предположения верны. Без перебора данных(чисел) в столбце, можно попробовать так :

Visual Basic
1
2
3
4
5
6
7
8
Dim r As Range, i%
Set r = [A:A]
 
For i = 127 To 1 Step -1
    If Not r.Find("*." + String$(i, "?"), , xlFormulas) Is Nothing Then
       MsgBox i: Exit Sub
    End If
Next

Чуть не забыл, вопрос нужно ли вводить(первый вопрос) или определять(второй вопрос) более 15 символов после запятой, если Excel всё равно обрубит большее количество… P.S. Ограничение пишу по памяти, почему могу быть неточен.



1



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 19:00

 [ТС]

10

Вы волшебник!) Спасибо.

А вы можете пояснить, i% — что это и для чего это нужно?



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 19:14

11

Теоретически i это и есть количество символов, после запятой. А практически, если в столбце будет текст, содержащий запятую, то мы можем получить результат, отличный от ожидаемого.



0



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 20:35

 [ТС]

12

Что-то я запутался… Всё замечательно работало пока столбец был один, а как быть если столбцов несколько?
Вы можете посмотреть мой файл и объяснить, что я сделал не правильно?

Добавлено через 5 минут
Что-то я запутался… Всё замечательно работало пока столбец был один, а как быть если столбцов несколько?
Вы можете посмотреть мой файл и объяснить, что я сделал не правильно?



0



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 20:39

 [ТС]

13

Что-то я запутался… Всё замечательно работало пока столбец был один, а как быть если столбцов несколько?
Вы можете посмотреть мой файл и объяснить, что я сделал не правильно?



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 20:56

14

Для столбца B возвращается корректный результат, в столбце M подобный подход работать не будет, ибо там формулы.



0



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

08.01.2020, 21:05

 [ТС]

15

В столбце В должно быть: при нажатии кнопки 2 четыре знака после запятой; при нажатии кнопки 3 два знака после запятой, а там почему-то всегда остается пять знаков.

Добавлено через 2 минуты
И можно ли что-нибудь придумать со столбцом М?



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

08.01.2020, 21:06

16

Для диапазона не содержащего отрицательных чисел — формула массива. А если есть минус, то ABS

Код

=МАКС(ДЛСТР(B4:B18)-ДЛСТР(ОТБР(B4:B18))-1;0)



0



serjey2128

0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

09.01.2020, 00:33

 [ТС]

17

Цитата
Сообщение от pashulka
Посмотреть сообщение

в столбце M подобный подход работать не будет, ибо там формулы.

Эту проблему решил с помощью выполнения перерасчёта в ячейке М20:

Visual Basic
1
2
3
4
    Dim rArea As Range
    For Each rArea In Intersect(ActiveSheet.UsedRange, Range("M20")).Areas
        rArea.FormulaArray = rArea.FormulaArray
    Next

Осталась проблема при такой записи, формат меняется только в столбце В:

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, [B3]) Is Nothing Then Exit Sub
    Select Case [B3]
       Case 1 To 127
           [B4:B18].NumberFormat = "0." & String([B3], "0")
       Case 0
           [B4:B18].NumberFormat = "0"
    End Select
    
    If Intersect(Target, [M20]) Is Nothing Then Exit Sub
    Select Case [M20]
       Case 1 To 127
           [M4:M18].NumberFormat = "0." & String([M20], "0")
       Case 0
           [M4:M18].NumberFormat = "0"
    End Select
End Sub

Если удалить форматирования одного из столбцов, например В, то столбец М начинает корректно работать:

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, [M20]) Is Nothing Then Exit Sub
    Select Case [M20]
       Case 1 To 127
           [M4:M18].NumberFormat = "0." & String([M20], "0")
       Case 0
           [M4:M18].NumberFormat = "0"
    End Select
End Sub

Можете подсказать где ошибка?

Вложения

Тип файла: rar Пример вер.1.rar (25.0 Кб, 3 просмотров)



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

09.01.2020, 11:12

18

То, что представлено как решение есть бред, который по факту ничего не делает. Т.к. меняет формулу массива в ячейке M20 НА ЭТУ ЖЕ САМУЮ ФОРМУЛУ. Правда повторный ввод формулы массива вызывает событие Worksheet_Change, но и там никакого подсчёта не производится. Более того, в этом событие происходит обработка данных только ячейки B3.



0



0 / 0 / 0

Регистрация: 30.11.2017

Сообщений: 17

09.01.2020, 18:07

 [ТС]

19

Цитата
Сообщение от pashulka
Посмотреть сообщение

То, что представлено как решение есть бред, который по факту ничего не делает.

Почему бред? Если из-за того, что я написал: «перерасчёт», то извините, не правильно выразился.

В любом случае, огромное Вам спасибо, за помощь!



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

09.01.2020, 18:26

20

Смысл повторять ещё раз ?

Пересечение одной единственной ячейки (в данном случае M20) и диапазона, содержащего эту ячейку, это всегда та же самая ячейка M20
А посему, несмежных диапазонов там быть не может
Перебор в цикле одной единственной ячейки — тоже бред

Проще говоря, весь ту бредятину можно заменить одной строкой [M20].FormulaArray = [M20].FormulaArray

И наконец, пересчёт(перерасчёт, неважно) формулы массива — никак не заставит мой макрос работать с диапазоном M4:M18, только с B4:B18



0



In this Article

  • VBA Round
  • Syntax of the VBA Round Function
  • VBA Round a Variable
    • VBA Rounding Results
  • VBA Round Cell Value
  • VBA RoundUp Function
    • RoundUp to the Nearest Whole Number
    • RoundUp Function Results
  • VBA RoundDown Function
    • RoundDown to the Nearest Whole Number
    • RoundDown Function Results
  • Other VBA Rounding Functions
    • VBA Ceiling – RoundUp to A Specified Significance
    • VBA RoundUp To Specified Significance Results
    • VBA Floor – RoundDown to A Specified Significance
    • VBA RoundDown to Specified Significance Results

VBA Round

The VBA Round Function rounds numbers to a specified number of digits.

Syntax of the VBA Round Function

The syntax of the VBA Round Function is:

Round(Expression, [Decimal_places]) where:

  • Expression – The number to round.
  • Decimal_places (Optional) – An integer that specifies the number of decimal places to round. The value must be greater than or equal to 0 (>=0). If blank, the default of 0 is used, which means the function rounds to the nearest integer.

So, let’s look at an example so that you can see how the VBA Round function works, rounding to 1 decimal place:

Sub Round1()

Msgbox Round(7.25, 1)

End Sub

The resulting MessageBox:

VBA Round to 1 Decimal

VBA Round a Variable

In the above example, we entered the to-be-rounded number directly into the function, usually however, you’d round a variable instead. The following is an example using a variable instead:

Note: We use the Double variable type in order to store decimal values.

Sub RoundUsingVariable()

Dim unitcount As Double

unitcount = 7.25

MsgBox "The value is " & Round(unitcount, 1)

End Sub

The result is:

Rounding to 1 decimal place with a variable example

VBA Rounding Results

Actual Number Number of Decimal Places Result
7.25 0 7
7.25 1 7.2
7.25 2 7.25
-7.25 1 -7.2
-7.25 2 -7.25

VBA Round Cell Value

You can also round a cell value directly in VBA:

Sub RoundCell()
Range("A1").Value = Round(Range("A1").Value, 2)
End Sub

VBA RoundUp Function

Let’s say you want to round a number up, using VBA. There is no built-in VBA RoundUp equivalent function, instead what you can do is call the Excel RoundUp Worksheet function from your VBA code:

roundupUnitcount = Application.WorksheetFunction.RoundUp(unitcount, 3)

Excel’s worksheet functions are available to use in VBA, through the use of the WorksheetFunction object. The only worksheet functions that you can’t call, are those that already have a built-in VBA equivalent.

A reminder of the syntax of the Excel Worksheet RoundUp Function:

ROUNDUP(Number, Digits) where:

  • Number – The number that you would like rounded up.
  • Digits – The number of digits that you would like to round the number.

So, let’s look at an example, so that you can see how to access the RoundUp Worksheet function in your VBA code:

Sub RoundUp()

Dim unitcount As Double

Dim roundupUnitcount As Double

unitcount = 7.075711

roundupUnitcount = Application.WorksheetFunction.RoundUp(unitcount, 4)

MsgBox "The value is " & roundupUnitcount

End Sub

The result is:

Rounding Up to Four Decimal Places using VBA

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

RoundUp to the Nearest Whole Number

You can round up to the nearest whole number by specifying 0 as the number of decimal places:

Sub RoundUpWhole()

MsgBox Application.WorksheetFunction.RoundUp(7.1, 0)

End Sub

The result delivered:

Rounding Up to the Nearest Integer using VBA

RoundUp Function Results

Actual Number Digits Result
7.075711 0 8
7.075711 1 7.1
7.075711 2 7.08
7.075711 3 7.076
7.075711 -1 10
7.075711 -2 100
7.075711 -3 1000

VBA RoundDown Function

Let’s say you want to round a number down, using VBA. There is no built-in VBA RoundDown equivalent function either, instead again, what you would do is call the Excel RoundDown Worksheet function from your VBA code.

A reminder of the syntax of the Excel Worksheet RoundDown Function:

ROUNDDOWN(Number, Digits) where:

• Number – The number that you would like rounded down.
• Digits – The number of digits that you would like to round the number.

So, let’s look at an example, so that you can see how to access the RoundDown Worksheet function in your VBA code:

Sub RoundDown()

Dim unitcount As Double

Dim rounddownUnitcount As Double

unitcount = 5.225193

rounddownUnitcount = Application.WorksheetFunction.RoundDown(unitcount, 4)

MsgBox "The value is " & rounddownUnitcount

End Sub

The result is:

VBA RoundDown

VBA Programming | Code Generator does work for you!

RoundDown to the Nearest Whole Number

You can round down to the nearest whole number by specifying 0 as the number of decimal places:

Sub RoundDownWhole()

MsgBox Application.WorksheetFunction.RoundDown(7.8, 0)

End Sub

The result is:

VBA RoundDown to Nearest Integer

RoundDown Function Results

Actual Number Digits Result
5.225193 0 5
5.225193 1 5.2
5.225193 2 5.22
5.225193 3 5.225
5.225193 -1 0
5.225193 -2 0
5.225193 -3 0

Other VBA Rounding Functions

VBA Ceiling – RoundUp to A Specified Significance

VBA does not have a Ceiling.Math function equivalent, so if you want to round a number up to the nearest integer or to the nearest specified multiple of significance, then you can call Excel’s Ceiling.Math worksheet function from your VBA code.

A reminder of the syntax of the Excel Worksheet Ceiling.Math Function:

CEILING.MATH(Number, [Significance], [Mode]) where:

  • Number – The number that you would like to round up.
  • Significance (Optional) – The multiple to which you want your number to be rounded to.
  • Mode (Optional) – Controls whether negative numbers are rounded towards or away from zero.

So, let’s look at an example, so that you can see how to access the Ceiling.Math Worksheet function in your VBA code:

Sub RoundUpToSignificance()

Dim unitcount As Double

Dim ceilingmathUnitcount As Double

unitcount = 4.1221 

ceilingmathUnitcount = Application.WorksheetFunction.Ceiling_Math(unitcount, 5)

MsgBox "The value is " & ceilingmathUnitcount

End Sub

The result is:

VBA RoundUp With Ceiling.Math

VBA RoundUp To Specified Significance Results

Actual Number Significance Mode Result
4.1221 5
4.1221 3 6
4.1221 50 50
-4.1221 3 -3
-4.1221 3 -1 -6

AutoMacro | Ultimate VBA Add-in | Click for Free Trial!

VBA Floor – RoundDown to A Specified Significance

VBA does not have a Floor.Math function equivalent either. However, once again, if you want to round a number down to the nearest integer or to the nearest specified multiple of significance, then you can call Excel’s Floor.Math worksheet function from VBA.

A reminder of the syntax of the Excel Worksheet Floor.Math Function:

FLOOR.MATH(Number, [Significance], [Mode]) where:
• Number – The number that you would like to round down.
• Significance (Optional) – The multiple to which you want your number to be rounded to.
• Mode (Optional) – Controls whether negative numbers are rounded towards or away from zero.

So, let’s look at an example, so that you can see how to access the Floor.Math Worksheet function in your VBA code:

Sub RoundDownToSignificance()

Dim unitcount As Double
Dim floormathUnitcount As Double

unitcount = 4.55555559
floormathUnitcount = Application.WorksheetFunction.Floor_Math(unitcount, 2)

MsgBox "The value is " & floormathUnitcount

End Sub

The result is:

VBA RoundDown to Specified Significance

VBA RoundDown to Specified Significance Results

Actual Number Significance Mode Result
4.55555559 4
4.55555559 3 3
4.55555559 50 0
-4.55555559 3 -6
-4.55555559 3 -1 -3

В моем превосходстве есть разные типы десятичных чисел, и разные десятичные знаки тоже.

Например. 112,33,
112,356,
145,1, 25,01,
27,001

Мне нужно знать количество ячеек с двумя десятичными знаками, например, 25.01, которые должны быть одним из них. Мне нужен этот код для Excel VBA

2014-07-02 13:30

3

ответа

Вы можете использовать технику VBA, как показано в следующем примере:

Dim digit As Integer
Dim num As Double
num = 123.456
digit = Len(CStr(num)) - InStr(CStr(num), ".")

где digit количество десятичных знаков

Относительно вашего первого образца:

digit = Len(CStr(112.33)) - InStr(CStr(112.33), ".")

Rgds,

2014-07-02 13:46

Улучшение очень удобной функции, представленной Мэтью Хагеманном.

Эта версия;

  • Не вызывает ошибки, когда пользователь передает функции более одной ячейки в качестве диапазона

  • Работает независимо от того, хранится ли число в ячейке как текст или как число

VBA:

Function CountDecimalPlaces(InputCell As Range) As Integer
'Counts the number of decimal places in a cell
Dim StringConvert As String

If InputCell.Cells.Count > 1 Then
    CountDecimalPlaces = 0
    Exit Function
End If

StringConvert = InputCell.Value

If InStr(1, StringConvert, ".") = 0 Then
    CountDecimalPlaces = 0
Else
    CountDecimalPlaces = Len(StringConvert) - InStr(1, StringConvert, ".")
End If

End Function

2019-06-18 15:42

Function GetNumberDecimalPlaces(theCell As Range) As Integer

Dim periodPlace as integer, stringLength as integer

periodPlace = InStr(1, theCell.Text, ".")

If periodPlace = 0 Then
    GetNumberDecimalPlaces = 0
Else
    stringLength = Len(theCell.Text)

    GetNumberDecimalPlaces = stringLength - periodPlace
End If

End Function

2017-07-25 13:40

Ответ Алекса может быть расширен для случая, когда десятичный символ (точка или запятая) неизвестен. Это может быть так, если числа взяты из листа Excel и региональные настройки заранее неизвестны. Другим расширением является обработка (целых) чисел без десятичных дробей.

Dim iDigits As Integer
Dim vNumber As Variant

vNumber = Excel.Application.ActiveCell.value

If VBA.IsNumeric(vNumber) And Not VBA.IsEmpty(vNumber) Then
    iDigits = Len(vNumber) - Len(VBA.Fix(vNumber))

    ' correct for decimal character if iDigits > 0
    iDigits = IIf(iDigits > 0, iDigits - 1, 0)
Else
    iDigits = 0
End If

2016-03-18 12:06

Как вывести в конкретную ячейку число с заданным форматом?

Юрий_Нд

Дата: Суббота, 25.05.2019, 14:02 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Доброго дня всем.
Подскажите пожалуйста как вывести в конкретную ячейку число с заданным форматом, то есть с заданным количеством знаков после запятой.
Пытаюсь применить такой способ:
[vba]

Код

.Cells(7, 4) = Format(sl, «0.00»)

[/vba]но ничего не получается.
Выводится тот формат, который был задан «в ручном режиме» через «Формат ячеек» — «Число» — «Числовой» — «Количество десятичных знаков»
Спасибо _________ Юрий.

Сообщение отредактировал Юрий_НдСуббота, 25.05.2019, 14:08

 

Ответить

_Igor_61

Дата: Суббота, 25.05.2019, 16:31 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 504


Репутация:

90

±

Замечаний:
0% ±


Excel 2007

Наверное, так: [vba]

Код

.Cells(7, 4) =NumberFormat = «#,##0.00»

[/vba] Если разряды не нужны, уберите решетки

Сообщение отредактировал _Igor_61Суббота, 25.05.2019, 16:33

 

Ответить

Юрий_Нд

Дата: Суббота, 25.05.2019, 19:55 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

_Igor_61, простите, что-то не получается.

К сообщению приложен файл:

123-6.xlsm
(12.4 Kb)

 

Ответить

_Igor_61

Дата: Суббота, 25.05.2019, 20:29 |
Сообщение № 4

Группа: Проверенные

Ранг: Ветеран

Сообщений: 504


Репутация:

90

±

Замечаний:
0% ±


Excel 2007

[vba]

Код

With Sheets(1)
.Cells(7, 4) = x
.Cells(7, 4).NumberFormat = «#,##0.00»
End With

[/vba]

 

Ответить

Юрий_Нд

Дата: Суббота, 25.05.2019, 22:51 |
Сообщение № 5

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

_Igor_61, спасибо, теперь всё нормально.
Однако:
1. Непонятно назначение решеток. Что с решетками, что без них, никакой разницы не вижу.
2. Хотелось бы цифру разместить по центру ячейки. Вот такая громоздкая конструкция
[vba]

Код

Range(7, 4).Select
    With Selection
        .HorizontalAlignment = xlCenter
    End With

[/vba] работает. Однако хотелось бы упростить, насколько это возможно.

 

Ответить

Alex2005-10

Дата: Суббота, 25.05.2019, 22:59 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

Можно так сделать:

Cells(1, 1).NumberFormat = «0.000»
Cells(1, 1).HorizontalAlignment = xlCenter

Вообще действие Select лучше не использовать, тормозит работу если данных много

Сообщение отредактировал Alex2005-10Суббота, 25.05.2019, 23:04

 

Ответить

Юрий_Нд

Дата: Суббота, 25.05.2019, 23:04 |
Сообщение № 7

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Alex2005-10, спасибо, я так и сделал, так для чего решетки там были нужны?

Сообщение отредактировал Юрий_НдСуббота, 25.05.2019, 23:06

 

Ответить

Alex2005-10

Дата: Суббота, 25.05.2019, 23:10 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

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

Range(7, 4).Select
With Selection
.HorizontalAlignment = xlCenter
End With

=

Cells(7, 4).HorizontalAlignment = xlCenter

 

Ответить

Юрий_Нд

Дата: Суббота, 25.05.2019, 23:15 |
Сообщение № 9

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Да, спасибо, я так уже сделал…

 

Ответить

Юрий_Нд

Дата: Суббота, 25.05.2019, 23:36 |
Сообщение № 10

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Кстати, Алекс, код ВБА подправьте, Борода этого не любит…
[moder]Никто из администрации этого не любит[/moder]

Сообщение отредактировал _Boroda_Понедельник, 27.05.2019, 11:45

 

Ответить

_Igor_61

Дата: Воскресенье, 26.05.2019, 07:13 |
Сообщение № 11

Группа: Проверенные

Ранг: Ветеран

Сообщений: 504


Репутация:

90

±

Замечаний:
0% ±


Excel 2007

Юрий_Нд, решетки для разделения групп разрядов — если много цифр

 

Ответить

bmv98rus

Дата: Воскресенье, 26.05.2019, 09:21 |
Сообщение № 12

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

Юрий_Нд

Дата: Воскресенье, 26.05.2019, 10:00 |
Сообщение № 13

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Спасибо товарищи, с решетками разобрался.
А вот можно ли как-то оптимизировать эту громоздкую конструкцию, то есть записать одной строчкой:
[vba]

Код

.Cells(10, 8) = x
.Cells(10, 8).NumberFormat = «#,##0.00»
.Cells(10, 8).HorizontalAlignment = xlCenter

[/vba]

 

Ответить

RAN

Дата: Воскресенье, 26.05.2019, 10:27 |
Сообщение № 14

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

можно ли как-то оптимизировать

Весьма странное и вольное толкование понятия.
Записать можно, но зачем?
[vba]

Код

.Cells(10, 8) = x:.Cells(10, 8).NumberFormat = «#,##0.00»:.Cells(10, 8).HorizontalAlignment = xlCenter

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Юрий_Нд

Дата: Воскресенье, 26.05.2019, 12:16 |
Сообщение № 15

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

RAN, если только так, тогда я за первоначальный вариант.
Вообще-то, мне больше всего не нравится, что приходится три раза писать:
[vba][/vba]

 

Ответить

Pelena

Дата: Воскресенье, 26.05.2019, 12:18 |
Сообщение № 16

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Используйте With


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Юрий_Нд

Дата: Воскресенье, 26.05.2019, 12:22 |
Сообщение № 17

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Pelena, а этот With, позволяет в качестве номеров строк и столбцов использовать переменные?

 

Ответить

Pelena

Дата: Воскресенье, 26.05.2019, 12:28 |
Сообщение № 18

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

With позволяет не , а один
[vba]

Код

With .Cells(10, 8)
.Value = x
.NumberFormat = «#,##0.00»
.HorizontalAlignment = xlCenter
End With

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Юрий_Нд

Дата: Воскресенье, 26.05.2019, 12:44 |
Сообщение № 19

Группа: Проверенные

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

Замечаний:
0% ±


Excel 2013

Pelena, отлично, пока мне больше всего нравится такая запись:
[vba]

Код

s = 12: c = 3
With .Cells(s, c): .Value = x: .NumberFormat = «#,##0.00»: .HorizontalAlignment = xlCenter: End With

[/vba]Но как я думаю, нет предела совершенству, если будет что-то поинтереснее пишите, буду очень признателен.

 

Ответить

_Igor_61

Дата: Воскресенье, 26.05.2019, 13:11 |
Сообщение № 20

Группа: Проверенные

Ранг: Ветеран

Сообщений: 504


Репутация:

90

±

Замечаний:
0% ±


Excel 2007

bmv98rus, спасибо за ссылку, очень хорошее объяснение

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Excel vba кодировка файла
  • Excel vba код символа кавычки
  • Excel vba изменить имя листа
  • Excel vba изменить высоту строки
  • Excel vba измененная ячейка