範囲のフォーマットを配列にコピーする方法はありますか?
提示された質問に焦点を当てると、はい、それは可能です。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)
単一セルの例を挙げます。もちろん、これは、数式に入力されるデータが既にシートにあり、数式が再計算されていることを前提としています。