Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


29660 / 76732 ←次へ | 前へ→

【52349】Re:らせん状(うず状)に数字を並べていく
発言  ichinose  - 07/11/10(土) 8:39 -

引用なし
パスワード
   ▼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)が取得されます。


このような規則で時計回りの渦巻状にセルに値を入力しています。
0 hits

【52188】らせん状(うず状)に数字を並べていく やまだ 07/10/29(月) 12:59 質問
【52189】Re:らせん状(うず状)に数字を並べていく ハチ 07/10/29(月) 13:10 発言
【52190】Re:らせん状(うず状)に数字を並べていく とおりすがり 07/10/29(月) 13:10 発言
【52191】Re:らせん状(うず状)に数字を並べていく やまだ 07/10/29(月) 13:58 質問
【52192】Re:らせん状(うず状)に数字を並べていく ichinose 07/10/29(月) 14:24 発言
【52196】Re:らせん状(うず状)に数字を並べていく 駿 07/10/29(月) 15:04 お礼
【52193】Re:らせん状(うず状)に数字を並べていく やまだ 07/10/29(月) 14:46 発言
【52194】Re:らせん状(うず状)に数字を並べていく じゅんじゅん 07/10/29(月) 14:49 発言
【52197】Re:らせん状(うず状)に数字を並べていく やまだ 07/10/29(月) 15:21 質問
【52198】Re:らせん状(うず状)に数字を並べていく ichinose 07/10/29(月) 19:39 発言
【52199】Re:らせん状(うず状)に数字を並べていく やまだ 07/10/29(月) 19:46 お礼
【52216】Re:らせん状(うず状)に数字を並べていく Jaka 07/10/31(水) 16:03 発言
【52223】Re:らせん状(うず状)に数字を並べていく 小僧 07/11/1(木) 10:50 回答
【52224】数学なんて嫌いだ。 Jaka 07/11/1(木) 11:29 発言
【52329】Re:らせん状(うず状)に数字を並べていく kon 07/11/9(金) 2:11 質問
【52332】Re:らせん状(うず状)に数字を並べていく ichinose 07/11/9(金) 7:46 発言
【52349】Re:らせん状(うず状)に数字を並べていく ichinose 07/11/10(土) 8:39 発言

29660 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free