Здравствуйте! В книгу вставляется массив числовых значений, которые необходимо округлять или уменьшить разрядность по правилу: если значение меньше 1, то до 4 знака после запятой, 1-10 - 3 знака, 1-100 - 2 знака, >100 - 1. Массивы данных большие (раз в 10-20 больше чем в примере), и править в ручную трудоемко и затратно по времени. Возможно ли делать это при помощи макросов?
Здравствуйте! В книгу вставляется массив числовых значений, которые необходимо округлять или уменьшить разрядность по правилу: если значение меньше 1, то до 4 знака после запятой, 1-10 - 3 знака, 1-100 - 2 знака, >100 - 1. Массивы данных большие (раз в 10-20 больше чем в примере), и править в ручную трудоемко и затратно по времени. Возможно ли делать это при помощи макросов?al-shadow
AlexM, спасибо за столь быстрый ответ. Нечто подобное я делал. Сейчас стоит задача не создавать новую область данных, а править исходную, так как возможна правка исходных данных (например удаление столбцов, строк, перенос ячеек). При такой правке у меня сбивались все формулы и приходилось их исправлять. К тому же под одним массивом идет второй, за ним третий и т.д. Есть ли возможность править исходный массив?
AlexM, спасибо за столь быстрый ответ. Нечто подобное я делал. Сейчас стоит задача не создавать новую область данных, а править исходную, так как возможна правка исходных данных (например удаление столбцов, строк, перенос ячеек). При такой правке у меня сбивались все формулы и приходилось их исправлять. К тому же под одним массивом идет второй, за ним третий и т.д. Есть ли возможность править исходный массив?al-shadow
Sub test() Dim i&, n&, r&, c&, v() v = ActiveCell.CurrentRegion.Value i = UBound(v, 2) For r = 1 To UBound(v) For c = 1 To i If Not IsEmpty(v(r, c)) And IsNumeric(v(r, c)) Then Select Case Abs(v(r, c)) Case Is >= 100: n = 1 Case Is >= 10: n = 2 Case Is >= 1: n = 3 Case Else: n = 4 End Select v(r, c) = Round(v(r, c), n) End If Next c, r ActiveCell.CurrentRegion.Value = v End Sub
[/vba]
Добрый день! Так?[vba]
Код
Sub test() Dim i&, n&, r&, c&, v() v = ActiveCell.CurrentRegion.Value i = UBound(v, 2) For r = 1 To UBound(v) For c = 1 To i If Not IsEmpty(v(r, c)) And IsNumeric(v(r, c)) Then Select Case Abs(v(r, c)) Case Is >= 100: n = 1 Case Is >= 10: n = 2 Case Is >= 1: n = 3 Case Else: n = 4 End Select v(r, c) = Round(v(r, c), n) End If Next c, r ActiveCell.CurrentRegion.Value = v End Sub
Udik, у меня опечатка. 1-10 - знака, 10-100 - 2 nilem, изначально считал, что не принципиально. Сейчас понял, что лучше именно изменение разрядности. KSV, спасибо. попробовал работает. Я правильно понимаю, что макрос округляет? Можно ли сделать не округление, а изменение разрядности. Если последняя цифра 0, то она не отображается. Сначала я не точно сформулировал задачу. Мне важно именно отображение определенного количества знаков в зависимости от значения числа.
Udik, у меня опечатка. 1-10 - знака, 10-100 - 2 nilem, изначально считал, что не принципиально. Сейчас понял, что лучше именно изменение разрядности. KSV, спасибо. попробовал работает. Я правильно понимаю, что макрос округляет? Можно ли сделать не округление, а изменение разрядности. Если последняя цифра 0, то она не отображается. Сначала я не точно сформулировал задачу. Мне важно именно отображение определенного количества знаков в зависимости от значения числа.al-shadow
Сейчас понял, что лучше именно изменение разрядности
Тогда удобно условным форматированием (для 2003 с младших версий этот способ работать не будет, но, если нужно, можно попробовать поизвращаться)_Boroda_
вот набросал макрос, который форматирует выделенную область
[vba]
Код
Public Sub test() Dim arrStr(1 To 4) As String Dim i As Integer, j As Integer arrStr(1) = "0,0000" arrStr(2) = "0,000" arrStr(3) = "0,00" arrStr(4) = "0,0"
For i = delI To rowNum + delI For j = delJ To colNum + delJ If IsNumeric(Cells(i, j).Value) Then Select Case Cells(i, j).Value Case Is > 100 Cells(i, j).NumberFormatLocal = arrStr(4) Case Is > 10 Cells(i, j).NumberFormatLocal = arrStr(3) Case Is > 1 Cells(i, j).NumberFormatLocal = arrStr(2) Case Else Cells(i, j).NumberFormatLocal = arrStr(1) End Select End If
Next j Next i
End Sub
,
[/vba]
вот набросал макрос, который форматирует выделенную область
[vba]
Код
Public Sub test() Dim arrStr(1 To 4) As String Dim i As Integer, j As Integer arrStr(1) = "0,0000" arrStr(2) = "0,000" arrStr(3) = "0,00" arrStr(4) = "0,0"
For i = delI To rowNum + delI For j = delJ To colNum + delJ If IsNumeric(Cells(i, j).Value) Then Select Case Cells(i, j).Value Case Is > 100 Cells(i, j).NumberFormatLocal = arrStr(4) Case Is > 10 Cells(i, j).NumberFormatLocal = arrStr(3) Case Is > 1 Cells(i, j).NumberFormatLocal = arrStr(2) Case Else Cells(i, j).NumberFormatLocal = arrStr(1) End Select End If