|
▼ひろし さん:
>以前ここでお世話になったものです。また皆様のお力を貸してください。
>いま、下記のような表があるとします。
>
>
> A B C …
>1 バスケ部 相島 康介
>2 バレー部 山本 太郎
>3 テニス部 川本龍三郎
>4 バレー部 山波 博
>5 テニス部 中井度 武
>6 野 球部 鈴木 健一
>7 バスケ部 中村 太一
>8 . .
> . .
>上のように200人くらいの部活動と生徒の名前を打ち込んでいって、『自動で』このデータを部活ごとにグループ分けして、
>
> 以下のようにグループごとに
>枠線(線の種類は何でもよいです)で囲み、縦に並べたいのです。
> --------------------
> |バスケ部 相島 康介|
> |バスケ部 中村 太一|
> -------------------- ← グループとグループの間は一行あける。
> -------------------- 以下、野球部、バレー部等、部活動の
> |テニス部 川本龍三郎| グループが縦に同じように続きます。
> |テニス部 中井度 武|
> --------------------
>できるならば、並べる部活動のグループの並べる順番までもコントロールしたいのですが。
>
> 4月からVBAを勉強し始めましたが、まだまだど素人のレベルで、他の人の書かれた
>コードを見て、理解・感心するので精一杯です。どうぞよろしく御願いいたします。
>
>--------------------------------------------------------------------------------
こんにちは〜
まず、ソートですね。
下のコードは(コメントがいっさい付してありませんが)
C列を作業列にして、そこに グループ番号を書き出しておき、
C列でソートするものです。
C列にグループ番号を書き出すとき、データ行の次の行以下に
ひとつづつ、余計にグループ番号を書き出しておくと、ソートしたとき
各グループの下に スペース行が挿入された格好になりますので、
データブロック単位で 罫線で囲っています。
Sub Try1()
Dim dic As Object
Dim i As Long, k As Long, n As Long
Dim v, vv, sp
Dim ss As String
Set dic = CreateObject("Scripting.Dictionary")
With Cells(1).CurrentRegion
v = .Value
n = UBound(v)
ReDim vv(1 To n)
ReDim sp(1 To n)
For i = 1 To n
ss = v(i, 1)
If Not dic.Exists(ss) Then
k = k + 1
vv(i) = k
sp(k) = k
dic(ss) = k
Else
vv(i) = dic(ss)
End If
Next
End With
With Range("C1")
.Resize(n).Value = Application.Transpose(vv)
.Offset(n).Resize(k).Value = Application.Transpose(sp)
End With
Dim a As Range
With Cells(1).CurrentRegion
.Sort Key1:=.Columns(3), Header:=xlNo
.Columns(3).Clear
For Each a In .Resize(, 2).SpecialCells(xlConstants).Areas
a.BorderAround xlContinuous
Next
End With
End Sub
ダミーのシートに簡単な表を作成し、シートを見ながら
上のコードを ステップ実行([F8]) して、
あるコードが何をしているのか? ご自分でコメントをつけてみてください。
|
|