○第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 件のコメント:
コメントを投稿