Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 23.12.2008, 01:01   #1
rzrwolf
Пользователь
 
Регистрация: 19.10.2008
Сообщений: 22
По умолчанию Округление чисел: вопрос

Имеется большой массив расчетов - все уже оформлено, но имеется проблема - нужно все расчеты округлить до 2 знаков после запятой, так чтобы не забивать в каждую ячейку команду ОКРУГЛ а как нибудь побыстрее, ибо формул на самом деле много... Как это сделать (не просто убрать лишние десятые, а чтобы расчет велся с округленными значениями?
rzrwolf вне форума
Старый 23.12.2008, 02:36   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте такой макрос:
Код:
Sub ОкруглениеРезультатовВычисленияФормул()
    Application.ScreenUpdating = False
    For Each cell In ActiveSheet.UsedRange
        If Len(cell.FormulaLocal) > 2 And IsNumeric(cell) Then cell.NumberFormat = "0.00"
    Next
End Sub

А если на листе отсутствуют формулы массивов, то можно использовать и такой вариант:
Код:
Sub ОкруглениеРезультатовПриПомощиИзмененияФормул()
    Application.ScreenUpdating = False
    For Each cell In ActiveSheet.UsedRange
        If IsNumeric(cell) Then cf = cell.FormulaLocal: If Len(cf) > 2 Then cell.FormulaLocal = "=ОКРУГЛ(" & Mid$(cf, 2) & ";2)"
    Next
End Sub
Проверку макросов лучше производить на копии листа.
Для этого после строки Application.ScreenUpdating = False
добавьте строку ActiveSheet.Copy ActiveSheet ' обрабатываем копию листа

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

Если надо обработать только выделенный диапазон ячеек, замените строку For Each cell In ActiveSheet.UsedRange
на строку For Each cell In selection


Если кто знает, подскажите, как макросом определить, какая формула введена в ячейку - формула массива или обычная формула?
Свойство FormulaArray возвращает то же самое, что и свойство Formula - для всех ячеек...

Последний раз редактировалось EducatedFool; 23.12.2008 в 02:51.
EducatedFool вне форума
Старый 24.12.2008, 00:32   #3
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

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

Если кто знает, подскажите, как макросом определить, какая формула введена в ячейку - формула массива или обычная формула?
Свойство FormulaArray возвращает то же самое, что и свойство Formula - для всех ячеек...
Попробуйте свойство HasArray

Для примера
Код:
Sub Макрос1()
Dim Rng As Range
    'вводим формулу массива
    Set Rng = Range("A1")
    Rng.FormulaArray = "=SUM(B1:D1)"
    If Rng.HasArray Then
        MsgBox "Ячейка " & Rng.Address(0, 0) & " содержит формулу массива!", 64, ""
    Else
        MsgBox "Ячейка " & Rng.Address(0, 0) & " содержит обычную формулу", 64, ""
    End If

    'вводим обычную формулу
    Set Rng = Range("A2")
    Rng.Formula = "=SUM(B2:D2)"
    If Rng.HasArray Then
        MsgBox "Ячейка " & Rng.Address(0, 0) & " содержит формулу массива!", 64, ""
    Else
        MsgBox "Ячейка " & Rng.Address(0, 0) & " содержит обычную формулу", 64, ""
    End If
End Sub
Pavel55 вне форума
Старый 08.01.2009, 22:29   #4
shmonin_d
Пользователь
 
Регистрация: 07.01.2009
Сообщений: 11
По умолчанию

Я бы добавил еще один столбец с округлением предыдущего (формулу "растянуть") и скрыл бы ненужный.
shmonin_d вне форума
Старый 11.01.2009, 15:34   #5
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Формат яч. выбран, после запятой два знака, а происходит, на скрине, почему??
Вложения
Тип файла: rar zxcc.jpg.rar (75.9 Кб, 136 просмотров)
valerij вне форума
Старый 11.01.2009, 15:48   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

формат ячейки - это способ, как показать данные, способ не влияет на сами данные в ячейке. все на картинке корректно.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 11.01.2009, 19:44   #7
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
формат ячейки - это способ, как показать данные, способ не влияет на сами данные в ячейке. все на картинке корректно.
Игорь!
А так, то же самое
Код:
Range("G147").Select
    Selection.NumberFormat = "0.00"
Вообще у меня вычисляется так
Код:
Cells(oStat * 51 + 45, 7) = Cells(oStat * 51 + 43, 10) + _
            Cells(oStat * 51 + 41, 10) + Cells(oStat * 51 - 6, 7) - _
            Cells(oStat * 51 + 45, 8)
Де может ошибка?
valerij вне форума
Старый 11.01.2009, 20:44   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Де может ошибка?
Эх, Валера... основную ошибку я тебе называл довольно давно.
хочешь получить округленный результат - округли его. Я вижу в ячейку(Х,У) записывается сумма четырех ячеек без каких-либо округлений.

А в данном случае ошибка в том, что ты считаешь, что достаточно задать формат ячейке и там исправится значение до нужного тебе состояния, это придуманное тобой правило не влияет на правила, которые заложены в эксель программистами. Повторюсь: формат ячейки НЕ ВЛИЯЕТ НА СОДЕРЖИМОЕ ЯЧЕЙКИ, это влияет только на внешний вид.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 11.01.2009 в 21:52.
IgorGO вне форума
Старый 11.01.2009, 21:06   #9
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
хочешь получить округленный результат - округли его..
А как их округлить?

Сделал так, заработало:
Код:
.Cells(oStat * 51 + 45, 7) = Round(.Cells(oStat * 51 + 43, 10) + _
            .Cells(oStat * 51 + 41, 10) + .Cells(oStat * 51 - 6, 7) - _
            .Cells(oStat * 51 + 45, 8), 2)
А вообще нашел источник, после запятой 1,46666666666667, никогда не обращал внимание.....
Код:
.Cells(x.Row, 10) = .Cells(x.Row, 4) / .Cells(x.Row, 12) * 2.2

а так все ОК!

.Cells(x.Row, 10) = Round(.Cells(x.Row, 4) / .Cells(x.Row, 12) * 2.2, 2)

Последний раз редактировалось valerij; 12.01.2009 в 00:50.
valerij вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Округление числа Pinya Microsoft Office Excel 2 18.09.2008 18:01
Суммирование и округление времени до целого Pilot Microsoft Office Excel 2 16.07.2008 15:02
округление в Firebird shurik_7866 БД в Delphi 0 05.07.2007 11:10
Округление чисел в Excel Bacardi_uk Microsoft Office Excel 3 16.05.2007 18:27
округление Toxa Общие вопросы Delphi 4 15.01.2007 19:15