通过缩进将选择中的最大数字居中对齐

Posted

技术标签:

【中文标题】通过缩进将选择中的最大数字居中对齐【英文标题】:Center aligning largest number in selection by indenting 【发布时间】:2016-07-01 20:08:00 【问题描述】:

我长期以来对格式设置感到沮丧。我经常手动执行此操作,但手动执行此操作需要很长时间,并且必须有一种方法可以使用 VBA 宏、条件格式或智能数字格式来执行此操作。

以下是我想要的结果。它具有以下属性:

    列中的最大数字(在本例中为列中的最后一个数字,$103,420)在单元格中居中。 单元格中的最大数字不是居中对齐,而是右缩进,直到值居中。 列中的所有其他数字也右缩进等量。这是可取的,因为它会在每个数字中排列个位、十位等。 用括号括起来的负数表示。 美元符号与最左边的数字相邻。 大于 999 的数字正确包含逗号。

此结果由以下人员实现:

    应用以下数字格式:$#,##0_);($#,##0)_);$0_);@_) 手动调整最大数字单元格的右缩进以确定它何时大致居中。如果必须在一侧或另一侧留更多空间,则在数字的左侧留下较大的空间。

我尝试应用一种类似于回复this question. 时使用的数字格式 具体来说,我尝试使用以下数字格式将所有单元格居中对齐:$?,??0;($?,??0);

这会产生以下关闭但不完全的结果。

关于如何解决这个问题的想法?我正在想象一个宏,它标识选择中的最大数字,获取该数字中的位数,字体大小,列的宽度,进行一些计算以产生所需的右缩进,然后应用右缩进。我只是不确定如何进行这种计算。

【问题讨论】:

输入足够的? 以占您的最大数量:$???,??0 嗨,斯科特 - 如果我走那条路线(根据第二个示例),那么问题是 $ 在每种情况下都不与数字相邻 【参考方案1】:
'Select your data range, and run formatCells_Accounting().  The number formatting in the selected cells will widen to the cell with the longest value.  Note, the macro does not work on values greater than 10^14 (not sure why.)

Sub formatCells_Accounting()
Dim rg As Range
Set rg = Selection

maxVal = Application.WorksheetFunction.Max(rg)
minVal = Application.WorksheetFunction.Min(rg)

If Abs(minVal) > maxVal Then
    longest_ = minVal
Else
    longest_ = maxVal
End If

lenLongest = Len(CStr(Round(longest_, 0)))

rg.NumberFormat = "_($" & addCommasToFormat(lenLongest) & "_);" & _
                  "_(($" & addCommasToFormat(lenLongest) & ");" & _
                  "_($" & addCommasToFormat(lenLongest - 1) & "0_);" & _
                  "_(@_)"


End Sub

Function addCommasToFormat(ByVal lenLongest) As String
    str_ = String(lenLongest, "?")
    new_str_ = ""

    For i = 1 To Len(str_)
        If i Mod 3 = 1 And i <> 1 Then
            new_str_ = new_str_ & ",?"
        Else
            new_str_ = new_str_ & "?"
        End If
    Next

    addCommasToFormat = StrReverse(new_str_)
End Function

【讨论】:

【参考方案2】:

克里斯 - 你的答案没有达到我的预期(你的答案在美元符号和“最后一个”数字之间留有空间,以表示比集合中最长数字短的数字)

但是,您的代码是我提出的这个解决方案的一个有用的起点。下图显示了结果以及此解决方案的固有缺点 - 在以这种方式格式化后对列中的数字运行公式会导致奇怪的数字格式。

我能想出的唯一解决方案不存在此解决方案的问题,它依赖于估计缩进并应用它。该解决方案仅在未调整列宽的情况下才有效。如果对其进行了调整,则必须重新运行宏。此外,由于缩进只能以 1 的增量增加(并且仅此而已),因此应用缩进的宏通常会导致列中的最大数字不完全居中。没什么大不了的,但我当前的解决方案没有这些问题,在我的用例中,这些格式被应用为格式化电子表格过程的最后一步,因此不太可能发生额外的计算,如果他们这样做,可以根据需要简单地重新运行宏。

'Select your data range, and run formatCells_Accounting().  The number formatting in the selected cells will widen to the cell with the longest value.  Note, the macro does not work on values greater than 10^14 (not sure why.)
Sub formatCells_Accounting()
    Dim rg, thisColRange, rCell As Range
    Dim maxVal, minVal, valueLen, longest_, lenLongest As Long

    Set rg = Selection

    'Center aligns all selected cells
    rg.HorizontalAlignment = xlCenter

    'Loops through each column in the selected range so that each column can have it's own max value
    For Each thisColRange In rg.Columns

        maxVal = Application.WorksheetFunction.Max(thisColRange)
        minVal = Application.WorksheetFunction.Min(thisColRange)

        'The longest number in the range may be the most negative
        'This if section accounts for this scenario
        If Abs(minVal) > maxVal Then
            longest_ = minVal
        Else
            longest_ = maxVal
        End If

        'Gets the length of the longest value rounded to the ones place (aka length not including decimals)
        lenLongest = Len(CStr(Round(Abs(longest_), 0)))

        'Creates a number format for every cell
        For Each rCell In thisColRange.Cells
            'Gets the length of the value in the current cell
            valueLen = Len(CStr(Round(Abs(rCell.Value), 0)))
            rCell.NumberFormat = "_(" & addCommasDollarsToFormat(lenLongest, valueLen, rCell.Value) & "_);" & _
                                 "_(" & addCommasDollarsToFormat(lenLongest, valueLen, rCell.Value) & ")_);" & _
                                 "_(" & Left(addCommasDollarsToFormat(lenLongest, 1, rCell.Value), Len(addCommasDollarsToFormat(lenLongest, 1, rCell.Value)) - 1) & "0_);" & _
                                 "_(@_)"
        Next
    Next

End Sub

Function addCommasDollarsToFormat(ByVal lenLongest, ByVal valueLen, ByVal cellVal) As String

    Dim new_str_ As String
    Dim i, j As Long

    'Initializes empty strings
    new_str_ = ""
    nearlyFinishedString = ""

    'Adds ? and , through the length of the value currently being formatted
    For i = 1 To valueLen
        If i Mod 3 = 1 And i <> 1 Then
            new_str_ = new_str_ & ",?"
        Else
            new_str_ = new_str_ & "?"
        End If
    Next

    If cellVal < 0 Then
        new_str_ = new_str_ & "$("
    Else
        new_str_ = new_str_ & "$"
    End If

    For j = i To lenLongest
        If j Mod 3 = 1 Then
            new_str_ = new_str_ & ",?"
        Else
            new_str_ = new_str_ & "?"
        End If
    Next

    addCommasDollarsToFormat = StrReverse(new_str_)

End Function

解决方案可视化,下方显示解决方案的缺点。

【讨论】:

以上是关于通过缩进将选择中的最大数字居中对齐的主要内容,如果未能解决你的问题,请参考以下文章

wps word 中的部分数字和英文的字体怎么没法改成Times New Roman

wps word 中的部分数字和英文的字体怎么没法改成Times New Roman

如何将由空格缩进的用户输入存储到 String 数组中并将数字转换为 int 数组?

latex:等式中的缩进(方框而不是数字)

贪心算法对最小化最大和的数字进行配对

查找数字字段中的最大和