VBA - 将范围复制到数组格式

时间:2013-07-01 03:30:44

标签: excel vba excel-vba

我正在创建一个包含多列的报告。我需要的是,只显示整数,没有小数的列应该舍入到整数(这样它不仅显示一个舍入的数字,它实际上等于一个整数)。

表示显示小数点后带两个数字的数字的列。

我能做的是:

If c.NumberFormat = "#,##0_);(#,##0)" Then
    c.Formula = "=round(" & Right(strFormula, Len(strFormula) - 1) & ",0)"
End If

但是,我将整个报告放在一个数组中,我想将整个数组粘贴到工作表中,而不是一次粘贴一个单元格。我还宁愿不根据单元格格式处理和舍入每个单元格,而是我想复制报表将进入数组的范围的格式,并从数组中工作。我相信这会缩短过程几秒钟。

有没有办法将范围的格式复制到数组中?

1 个答案:

答案 0 :(得分:3)

有没有办法将范围的格式复制到数组中?

专注于所提出的问题,是的,可以做到。不幸的是,它无法在单行中完成,例如,可以将范围的值分配给具有myArray = Range("A2:F25")的数组。 (另请参阅brettdj的评论。)相反,你需要这样的东西:

Dim rng as Range
Dim formatArray() As String
Dim i as Long, j as Long
Set rng = Range(A2:F20)    'or whatever the range is
Redim formatArray(1 to rng.Rows.Count, 1 to rng.Columns.Count)
For i = 1 to rng.Rows.Count
    For j = 1 to rng.Columns.Count
        formatArray(i, j) = rng.Cells(i, j).NumberFormat
    Next
Next
...

但有几点意见:

实际上,您只需要知道该行范围内单行的格式,因为可能是列中的数字格式不会在列中间发生变化。

这会将代码简化为:

...
Redim formatArray(1 to rng.Columns.Count)
For i = 1 to rng.Columns.Count
    formatArray(i) = rng.Cells(1, i).NumberFormat
Next
...

假设,为了举例,该范围的第1行具有必要的数字格式。

我很好奇你为什么要在工作表上修改一个公式,以便它可以舍入,因为你可以在代码中进行计算,并进行舍入,然后将结果值写回报表的工作表中

如果您需要将数字格式应用于您正在写入工作表的值(而不仅仅是修改公式以便它们将生成整数),那么可以立即对范围内的整个列执行,即

...
For i = 1 to rng.Columns.Count
    rng.Columns(i).NumberFormat = formatArray(i)
Next
...

如果您需要将单元格公式的结果转换为舍入值,则可以使用

之类的方法
rng.Cells(2, 5).Value = WorksheetFunction.Round(rng.Cells(2, 5).Value, 0)

给出单个单元格的示例。当然,这假定输入公式的数据已经在表格中,并且公式已经重新计算。