1

複数の列を含むレポートを作成しています。私が必要とするのは、小数ではなく整数のみを表示する列を整数に丸める必要があることです(丸められた数値を表示するだけでなく、実際には丸められた数値に等しくなります)。小数点以下 2 桁の数値を表示する列は、四捨五入しないでください。

私ができることは次のとおりです。

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

ただし、レポート全体が配列になっているため、一度に 1 つのセルを貼り付けるのではなく、配列全体をシートに貼り付けたいと考えています。また、セルの書式設定に基づいて各セルを処理して丸めるのではなく、レポートが配列に入る範囲の書式設定をコピーして、配列から作業したいと考えています。これにより、プロセスが数秒短縮されると思います。

範囲のフォーマットを配列にコピーする方法はありますか?

4

1 に答える 1

4

範囲のフォーマットを配列にコピーする方法はありますか?

提示された質問に焦点を当てると、はい、それは可能です。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)

単一セルの例を挙げます。もちろん、これは、数式に入力されるデータが既にシートにあり、数式が再計算されていることを前提としています。

于 2013-07-01T06:05:52.767 に答える