Десятичные знаки для нескольких форматов - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь найти способ увеличения / уменьшения десятичных разрядов для выбранного диапазона (одна или несколько ячеек с потенциально разными форматами).

Пока мои коды выглядят следующим образом:

Dim myformat As String
Dim cell As Range
Dim val As Variant

For Each cell In Selection
    val = cell.Value
    myformat = cell.NumberFormat

    If IsDate(val) = False Then
        If InStr(1, myformat, ".") > 0 Then
            myformat = myformat & "0"
        Else
            myformat = "0.0"
        End If
    End If
        cell.NumberFormat = myformat
Next cell

Как правило, это работает, но не полностью. Что мне нужно сделать, так это работать с процентными, общими, числовыми форматами, а также с формулами (не с прямыми значениями ячеек) и CUSTOM (это я не могу обойти, как бы я ни старался это сделать ...). Код НЕ должен работать (должен выходить из sub или ничего не делать), когда он видит, что ячейка содержит формат времени / даты (мне удалось это сделать).

Ниже вы найдете типы форматов, для которых я разрабатываю свой макрос : enter image description here

Как видите, мой способ кодирования (я пытаюсь научиться) - это просто отредактировать NumberFormat, прочитав существующий формат и изменив его при необходимости. Это работает для простых форматов, но когда в сочетании с пользовательскими форматами? Это просто не работает.

У кого-нибудь есть идеи, как я могу продолжить свою идею? Любая помощь высоко ценится! Заранее благодарю всех, кто хочет помочь мне в этом. Я становлюсь лучше в VBA с каждым днем, но не ЭТО хорошо, пока;)

1 Ответ

2 голосов
/ 10 марта 2020

Для пользовательских форматов, которые уже включают десятичную точку, вместо:

myformat = myformat & "0"

Было бы более надежно использовать:

myformat = replace(myformat,".",".0")

Это обеспечит добавление дополнительного 0 после всех десятичных знаков, в том числе в пользовательских форматах чисел с несколькими разделами, таких как:

#,##0.00;[Red]-#,##0.00

Чтобы добавить десятичную точку к число, в котором еще нет десятичной точки, вместо:

myformat = "0.0"

использование:

myformat = replace(myformat,"0","0.0")

Обратите внимание, что оно все еще не будет обрабатывать все возможные пользовательские форматы чисел, которые потребуют огромного количества разбора, но он должен обрабатывать стандартные типы форматов, как в вашем примере.

Чтобы удалить десятичные точки, выполните обратное:

myformat = replace(myformat,".0",".")

Это приведет к тому, что после удаления всех нулей останется десятичная точка, однако это можно сделать, проверив, содержит ли формат чисел десятичные точки, за которыми не следуют нули:

If InStr(myformat, ".") > 0 and InStr(myformat, ".0") = 0 then
    myformat = replace(myformat,".","")
End if
...