|
▼ちくたく さん:
>もっと、単純な書き方はないかなぁ、と思い、質問させて頂きます。
単純かどうかはわかりませんが、こんなのはどうでしょうか?
Sub Macro1()
Dim MyCol As Range
Dim 増加分 As Single
Dim i As Long, j As Long
Dim Large As Double
Dim Small As Double
Dim LargeRow As Long
Dim SmallRow As Long
'3行以上なければ数値間の空白セルは存在しないので抜ける
If ActiveWindow.RangeSelection.Rows.Count < 3 Then Exit Sub
'1列ずつ処理
For Each MyCol In ActiveWindow.RangeSelection.Columns
With MyCol
'数値が2個以上なければ数値間の空白セルは存在しないので
'数値が2個以上なら処理する
If WorksheetFunction.Count(.Cells) > 1 Then
'数値だけを選択
With .SpecialCells(xlCellTypeConstants, xlNumbers)
'(範囲数 - 1) 回分繰り返す
'範囲が1つであれば以下のループは処理されない
For i = 1 To .Areas.Count - 1
'範囲の最終セル(Aとする)の値と行番号を取得
With .Areas(i)
With .Cells(.Cells.Count)
Small = .Value
SmallRow = .Row
End With
End With
'次の範囲の先頭セル(Bとする)の値と行番号を取得
With .Areas(i + 1).Cells(1)
Large = .Value
LargeRow = .Row
End With
'A,Bのセルから取得した情報を使用して増加分を算出
増加分 = (Large - Small) / (LargeRow - SmallRow)
'A,Bのセルの間の数だけ、Aのセルの値に増加分を足した値を出力
For j = SmallRow + 1 To LargeRow - 1
Cells(j, .Column).Value = Cells(SmallRow, .Column).Value _
+ Format(増加分 * (j - SmallRow), "0.00")
Next
Next
End With
End If
End With
Next
End Sub
数値だけ選択[SpecialCells(xlCellTypeConstants, xlNumbers)]した場合の範囲
A
1 1 ←Areas(1).Cells(1) 範囲1の先頭セル
2 2 ←Areas(1).Cells(2) [= Areas(1).Cells(Areas(1).Cells.Count)]範囲1の最終セル
3
4
5 3 ←Areas(2).Cells(1) 範囲2の先頭セル
6 4 ←Areas(2).Cells(2)
7 5 ←Areas(2).Cells(3) [= Areas(2).Cells(Areas(2).Cells.Count)]範囲2の最終セル
8
9 6 ←Areas(3).Cells(1) 範囲3の先頭セル
なので、ある範囲の最終セルと次の範囲の先頭セルを使うようなコードに
してみました。
|
|