|
▼kon さん:
おはようございます。
まず、問題コードですが、アルゴリズムには何の変更もありませんが、一部、変数名として不適切な名前だけ変更しました。
'===========================================================
Sub main()
Dim g0 As Long
Dim stt As Long
Dim rng As Range
Set rng = Range("g20")
stt = 1
For g0 = 1 To 20
rng.Value = g0
Set rng = get_rng(rng, stt)
Next
End Sub
‘========================================
Function get_rng(ByVal rng, s_vec As Long) As Range
‘機能 現在のセルから時計回りで渦巻状に移動しデータを入力するための次にセルを取得する。
‘ 尚、渦巻状に連続したセルには、何らかのデータ(空白以外)が設定されているものとする
‘ 逆にそれ以外のセルは、未入力であるものとする
‘入力データ rng 現在のセル
‘ s_vec 渦巻状に進行することを目的に
‘ セルrngと前のセルからの進行方向
‘ 1 上方向 2 右方向 3 下方向 4 左方向
‘出力データ get_rng 現在のセルの位置から時計回りで渦巻状に移動し
‘ データを入力するための次にセル
‘ s_vec 取得したget_rngのrngに対する進行方向
‘ 1 上方向 2 右方向 3 下方向 4 左方向
Dim mx
ReDim cnt(1 To 4) As Long
ReDim chk(1 To 4) As Range
ReDim vecter(1 To 4) As Long
Dim c As Long
Dim g0 As Long
Dim g1 As Long
Dim g2 As Long
For g0 = s_vec To (s_vec + 3)
Select Case g0 Mod 4
Case 1
Set chk(c + 1) = rng.Offset(-1, 0)
vecter(c + 1) = 1
Case 2
Set chk(c + 1) = rng.Offset(0, 1)
vecter(c + 1) = 2
Case 3
Set chk(c + 1) = rng.Offset(1, 0)
vecter(c + 1) = 3
Case 0
Set chk(c + 1) = rng.Offset(0, -1)
vecter(c + 1) = 4
End Select
If chk(c + 1).Value = "" Then
For g1 = -1 To 1
For g2 = -1 To 1
If g1 <> 0 Or g2 <> 0 Then
If chk(c + 1).Offset(g1, g2).Value <> "" Then
cnt(c + 1) = cnt(c + 1) + 1
End If
End If
Next
Next
End If
c = c + 1
Next
With Application
g0 = .Match(.Max(cnt()), cnt(), 0)
End With
Set get_rng = chk(g0)
s_vec = vecter(g0)
End Function
上記のコードは、時計回りで渦巻状に移動しセルにデータを入力していった結果から
帰納的に見いだした規則性を基に作成したコードです。
私は、学者で無いのでその規則の普遍性については証明していません。
上記コードの前提条件として、
get_rngで取得するセル以前の時計回りに渦巻状を構成するセルには
必ず空白以外のデータが入っている
又、上記以外のセルは、未入力であること。
これが条件です。
上記の条件を踏まえて、渦巻状にデータを入力するためには・・・。
セルを渦巻状に移動しデータを入力するために現在の位置から移動先は
1 現在のセルのひとつ行が上のセル 現在のセルがG20なら、G19
2 現在のセルのひとつ右のセル 現在のセルがG20なら、H20
3 現在のセルのひとつ行が下のセル 現在のセルがG20なら、G21
4 現在のセルのひとつ左のセル 現在のセルがG20なら、F20
の4方向になります。
では、渦巻状に移動する次のセルとして上記の4つの方向を何を基準に決定するのか??
上記のFunction get_rngでは、4方向の内、隣接するセルで未入力以外のセルの個数が一番多い
方向を移動セルとして決定しています。
隣接するセルで未入力以外のセルの個数が同じ場合は、現在の方向から時計回りの順で優先します。
例えば、セルG20を出発セルとしている上記のコードでは、
G20(既に値が入力されている)から、4方向共に隣接する未入力以外のセルの個数は1です(共にG20だけが隣接する未入力以外のセルになります)。
よって、現在の進行方向である上のセルであるG19を取得し、G19には、「2」が入力されます。
G19を現在のセル、進行方向は上(1)を入力データして、get_rngは、
進行方向 上 隣接する未入力以外のセルの個数 1(g19)
右 2(g19 とg20)
下 既に入力済み(G20)なので対象外 0
左 2(g19 とg20)
と言う結果になり、時計回りの優先順位から、右方向のセルであるH19(s_vec 2)が取得されます。
このような規則で時計回りの渦巻状にセルに値を入力しています。
|
|