2007年7月15日日曜日

第22回目 階段状の処理

○第22回目 階段状の処理

第21回で、
『 マクロではどうなるでしょうか。
 色々な方法が考えられます。
 1.計算式中、61以上のあるセルをクリアする。
 2.物理的階段状にセルをクリアする。
 3.複数の置き換えが可能なマクロで、置き換える。』
とあり、3のマクロを作りましたが、ひょなことから、2の類型を適用する事例があることを発見しました。

 処理はセルの内容をクリアするのではなく、セルを挿入していくことです。
 データの形態を階段状にしてしまおうというのです。これを二回繰り返すと、あとでセル(当然四角形で与える)を削除することによって、階段状になったものから、通常の四角の形にするということも出来ます。
 
 
 基本機能は、セルを一つずつ多くして挿入していくことですが、
 1.行及び列に対して処理できる。
 2.例えば行を指定した場合、左端から一つずつ増やして挿入するのか、右端から一つずつ増やして挿入するのかの指定が出来る。
 (削除は怖いのでこのマクロの対象とはしない。しかし、削除は、この挿入機能と通常の削除操作で可能です。すなわち、階段状のものに逆階段状にセルを挿入していき、正方形にしたあとで、セルを削除するということです)
 
 前提としては、挿入したい範囲を指定しておきます。行で指定すれば下への挿入。列で指定すれば、右への挿入となります。
 
 基本処理をマクロの記録でとって見ましょう。

Sub marco01()
Range("AE54:AG55").Select
Selection.Insert Shift:=xlDown
Range("AJ54:AK60").Select
Selection.Insert Shift:=xlToRight
End Sub

 簡単な命令ですね。
 
 次に、指定範囲の座標から必要な情報を取得します。
 列1~列9、行1
 行1~行9、列1 のいずれかです。
 
指定範囲の座標から、とってみましょう。

AAA = Selection.Address
p1 = InStr(AAA, ":")
AAA1 = Left(AAA, p1 - 1)
AAA9 = Mid(AAA, p1 + 1)
MsgBox ("セルの座標は、" & AAA & "最初の座表は、" & AAA1 & "最後の座標は、" & AAA9 & " です")


更に、列・行に分けて見ましょう。

p1 = InStr(Mid(AAA1, 2), "$")
retu1 = Mid(AAA1, 2, p1 - 1)
gyo1 = Mid(AAA1, p1 + 2)

p1 = InStr(Mid(AAA9, 2), "$")
retu9 = Mid(AAA9, 2, p1 - 1)
gyo9 = Mid(AAA9, p1 + 2)

MsgBox ("先頭のセルは、 " & retu1 & "--" & gyo1 & "最後のセルは、" & retu9 & "--" & gyo9 & " です")

別の方法で、列番号などをとってみましょう。
retu1=range(AAA1).column
gyo1=range(AAA1).row

retu9=range(AAA9).column
gyo9=range(AAA9).row


 これまでのところを少し整理してみましょう
 
Sub a20セルの階段状挿入()
'範囲を指定したあとに実行する

AAA = Selection.Address
p1 = InStr(AAA, ":")
AAA1 = Left(AAA, p1 - 1)   '先頭の座標
AAA9 = Mid(AAA, p1 + 1)    '最後の座標
'チェック
MsgBox ("セルの座標は、" & AAA & "最初の座表は、" & AAA1 & "最後の座標は、" & AAA9 & " です")

'列番号と、行番号を取得
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row

retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row

'チェック
MsgBox ("先頭のセルは、 " & retu1 & "--" & gyo1 & "最後のセルは、" & retu9 & "--" & gyo9 & " です")


 次の段階へ。

'挿入する階段の形態の入力
flag1 = InputBox("一つずつ増やしていきますか(1)、減らしていきますか(-1) ", , 1)


'行に対して挿入していく場合
If gyo1 = gyo9 Then   '先頭と最後の行が同じということは、行に対して挿入することになる

kaisuu = retu9 - retu1 + 1  '何列分あるかということ
If flag1 = 1 Then
kosuu0 = 1 '挿入するセル数の初期値
Else
kosuu0 = kaisuu '逆の場合は、初期値は回数分となります
flag1 = -1    'あとで使うのでキチンとしておく
End If
'チェック
' MsgBox ("回数は、 " & kaisuu & "--" & "挿入するセル数の初期値は、 " & kosuu0 & " です")

For i = 0 To kaisuu - 1  'ゼロからはじめるので最後はマイナス1しておく必要がある
kosuu = kosuu0 - 1 + i * flag1 '挿入するセル数-1
Range(Cells(gyo1, retu1 + i), Cells(gyo1 + kosuu, retu1 + i)).Select
Selection.Insert Shift:=xlDown
Next i

End If

'列に対して挿入していく場合
If gyo1 <> gyo9 Then

kaisuu = gyo9 - gyo1 + 1
If flag1 = 1 Then
kosuu0 = 1 '挿入するセル数の初期値
Else
kosuu0 = kaisuu '逆の場合は、初期値は回数分となります
flag1 = -1    'あとで使うのでキチンとしておく
End If

For i = 0 To kaisuu - 1
kosuu = kosuu0 - 1 + i * flag1 '挿入するセル数-1
Range(Cells(gyo1 + i, retu1), Cells(gyo1 + i, retu1 + kosuu)).Select
Selection.Insert Shift:=xlToRight
Next i

End If


End Sub

 
 この機能を使う用途は広いのではないかと思われた。
 第18回目から第20回目までの『凝った計算式の作り方』で紹介した計算式など、この機能で軽く出来てしまうのである。これは驚くべきことである。
 確かに、通常はセルを階段状に使うとかいうものは少ないので、イメージはつきづらいのかもしれません。
 難しいことはさておき、ここで使われたテクニックは、いろいろと活用できるともいます。
 

0 件のコメント: