No.3です。
マクロの改良版を作ってみました。もしよろしければ、お試し下さい。
【使い方】
・リスト項目は、シート名を「リスト項目」としたシートに全て入力して下さい。
・例えば、ルートの下に「AA」「BB」「CC」、「AA」の下に「AAA-1」「AAA-2」「AAA-3」、「AAA-1」の下に「aaa-1」「aaa-2」というツリー構造となっている場合、以下のように入力して下さい。
(1)
「ルート」「1」「AA」「BB」「CC」
(2)
「AA」「1」「AAA-1」「AAA-2」「AAA-3」
(3)
「AAA-1」「4」「aaa-1」「aaa-2」
等々
・「 」は1つ1つのセルを表わします。ここでは横方向に書きましたが、全て縦方向(行方向)に入力下さい。入力に使えるエリアは"A1:Z1000"としてあります。
・上記エリア内であれば、使用する位置に制約はありません。また(1)~(3)のような書き方でツリー構造を把握する方法なので、一連項目の入力順序(位置)とツリー構造とを対応させる必要もありません。
・ただし、(1)~(3)のような一連の項目は1行も空けずに続けて入力下さい。一連項目と別の一連項目との間には最低1行の空行を入れて下さい(空行が何行続いても構いません)。
・ツリーの一番上に当たる項目リストは、必ず"ルート"(全角)として下さい。
・項目名は、重複がないようにして下さい。
・(1)~(3)のように、2番目には必ず自然数を入れて下さい。この数字はその項目が使用するセル数です。例えば「サイズ」「重量」という選択肢の場合、「サイズ」の記入用に3セル使用するのであれば、4として下さい。「サイズ」「10cm」「20cm」「30cm」の4セルという意味です。「重量」を選んだときは、1セルしか使わないと思いますが、最もたくさんセルを使用する項目に合わせて下さい。従って、「重量」「5kg」「」「」という感じになってしまい、カッコ悪いかもしれませんが、ご容赦下さい。
・ツリーの一番下に来る項目には必ず「備考」という項目を付けて下さい。ツリーの一番下に来る項目が100個あったら、大変お手数ですが、一連のセルの組を100セットご入力頂くことになります。どんくさい仕組みで申し訳ありません。以下のような感じです。
・「aaa-1」「2」「備考」
・「AAA-3」「2」「備考」
等々
・実際の入力作業は、入力を開始したいセルを選択後、マクロを実行させて下さい。
・データ入力の開始を、B列としました。もし変更の必要がある場合には、プログラムを次のように書き換えて下さい。プログラムの上の方にある
「Retsu_Start = 2 ' 入力シートの入力開始列:B列 = 2」
の「Retsu_Start = 2」の"2"をA列なら1、B列なら2、C列なら3、D列なら4、E列なら5、‥‥として下さい。
・選択するセルは必ずしも行の先頭(今のままならB列)である必要はありません。次のような場合、既に入力済みのデータを消さずに「*」のセルを選択すれば、そこから開始されます。ただし、2番目のような場合に「*」ではなく「10cm」等を選択すると誤動作します。
・「AA」「AAA-1」「*」
・「AA」「AAA-1」「aaa-2」「10cm」「20cm」「30cm」「*」
・マクロの終了は「備考」の入力(何も入力せずOKでも可)後に、作業を続けるかどうかを聞いてきますので、ここで「いいえ」をクリックして下さい。
【マクロ】
No.3が残っているとマクロ選択時に間違う恐れがあるので、新規ブックにマクロ内容をコピーし、試してみて下さい。
Option Explicit
'----------------------------------------------------------------
' リスト化 改良版
'----------------------------------------------------------------
Sub リスト化_改()
Dim Item_Cnt_0 As Integer, Item_Cnt_1 As Integer, Item_Max As Integer
Dim Item(500, 500) As Variant, Item_List As String, Komoku As Variant, Naiyo As Variant
Dim Gyo_Max As Integer, Retsu_Max As Integer, Retsu_Start As Integer, Retsu_Offset As Integer
Dim Gyo As Integer, Retsu As Integer, i As Integer, j As Integer, k As Integer, m As Integer
Dim Nyuryoku_Sheet As String, Response As String, Cell_Su As Integer
Gyo_Max = 1000 ' Sheet("リスト項目")の使用行数。Excel上限:65536
Retsu_Max = 26 ' Sheet("リスト項目")のA列~Z列を使用。
Retsu_Start = 2 ' 入力シートの入力開始列:B列 = 2
Nyuryoku_Sheet = ActiveSheet.Name
Gyo = ActiveCell.Row
Retsu = ActiveCell.Column
' リスト項目取得
Sheets("リスト項目").Select
Item_Cnt_0 = 0
For i = 1 To Retsu_Max
Item_Cnt_1 = 0
For j = 1 To Gyo_Max
If Cells(j, i).Value = Empty Then
Item_Cnt_1 = 0
Else
If (j = 1) Or (Cells(j - 1, i) = Empty) Then
Select Case Cells(j, i).Value
Case "ルート"
k = 0
Case Else
Item_Cnt_0 = Item_Cnt_0 + 1
k = Item_Cnt_0
End Select
End If
Item_Cnt_1 = Item_Cnt_1 + 1
Item(k, 0) = Item_Cnt_1
Item(k, Item_Cnt_1) = Cells(j, i).Value
End If
Next j
Next i
Range("A1").Select
' リスト項目検索
Sheets(Nyuryoku_Sheet).Select
Retsu_Offset = -1
Label1:
Select Case Retsu
Case Retsu_Start
m = 0
Case Else
If Retsu = Retsu_Start + 1 Then
Retsu_Offset = 1
End If
Select Case Retsu_Offset
Case -1
For j = 1 To Retsu - Retsu_Start
For i = 1 To Item_Cnt_0
If Item(i, 1) = Cells(Gyo, Retsu - j) Then
m = i
GoTo Label2
End If
Next i
Next j
Case Else
For i = 1 To Item_Cnt_0
If Item(i, 1) = Cells(Gyo, Retsu - Retsu_Offset) Then
m = i
GoTo Label2
End If
Next i
End Select
End Select
Label2:
' 入力作業
Cell_Su = Item(m, 2)
Item_List = 1 & ":" & Item(m, 3)
For i = 4 To Item(m, 0)
Item_List = Item_List & "、 " & i - 2 & ":" & Item(m, i)
Next i
Label3:
If Item(m, 0) = 3 Then
Komoku = 1
Else
Cells(Gyo, Retsu).Select
Let Komoku = InputBox(Item_List & " から数字を選んで下さい。", "項目指定")
Komoku = Val(Komoku)
If (Komoku = Empty) Or (Komoku < 1 Or Item(m, 0) - 2 < Komoku) Then
GoTo Label3
End If
End If
Cells(Gyo, Retsu) = Item(m, Komoku + 2)
If Cell_Su >= 2 Then
For i = 1 To Cell_Su - 1
Cells(Gyo, Retsu + i).Select
Let Naiyo = InputBox("「" & Item(m, Komoku + 2) & "」の内容を入力して下さい。", Item(m, Komoku + 2))
Cells(Gyo, Retsu + i) = Naiyo
Next i
End If
If Item(m, Komoku + 2) = "備考" Then
Response = MsgBox("作業を続けますか?", vbYesNo, "続行/終了")
If Response = vbYes Then
Gyo = Gyo + 1
Retsu = Retsu_Start
GoTo Label1
End If
Else
Retsu = Retsu + Cell_Su
Retsu_Offset = Cell_Su
GoTo Label1
End If
End Sub
お礼
ありがとうございました。できました。かなり効率がよくなります。 感謝します!!