<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>名簿 - プログラミングで遊ブログ</title>
	<atom:link href="https://lemon818.com/tag/%E5%90%8D%E7%B0%BF/feed/" rel="self" type="application/rss+xml" />
	<link>https://lemon818.com</link>
	<description>現役システムエンジニアが趣味でプログラミングする自由気ままなブログ</description>
	<lastBuildDate>Sat, 06 Jun 2020 10:19:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>	<item>
		<title>【Excel vba】名簿から自動で席替えしてくれるマクロの作り方！！</title>
		<link>https://lemon818.com/excel-sekigae/</link>
		
		<dc:creator><![CDATA[Take]]></dc:creator>
		<pubDate>Wed, 06 Feb 2019 13:28:02 +0000</pubDate>
				<category><![CDATA[Excel]]></category>
		<category><![CDATA[vba]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[名簿]]></category>
		<category><![CDATA[席替え]]></category>
		<guid isPermaLink="false">https://lemon818.com/?p=3767</guid>

					<description><![CDATA[はじめに 名簿リストから席を自動で決定してくれる Excel マクロの作り方についてご紹介します。 このマクロは席数を自分で指定できるようにしてあるので、例えば 4 × 4 や ５× 6 の席でも自由に変えて席替えできる…]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p><strong>名簿リストから席を自動で決定してくれる Excel マクロの作り方</strong>についてご紹介します。</p>
<p>このマクロは<strong></strong><span style="color: #ff6600;"><strong>席数を自分で指定できるようにしてある</strong></span>ので、例えば 4 × 4 や ５× 6 の席でも自由に変えて席替えできることができます。</p>
<p>小学校や中学、高校では、気分転換のためかなんとなくか目的はさまざまですが、とにかく定期的に席替えが行われると思います。</p>
<p>そんなとき毎回くじ作ってそのくじを引いてみんなでギャーギャー騒いで...って楽しいんですが、<strong>教員の方は早く帰りたいのかもしれません。</strong></p>
<p>そんな教師はあんまり見たことがないんですが、少なからず席替えに時間を割くことがほとんどなくなりますので「いいな」と思われた人はぜひ使ってみてください。</p>
<p>※実際に作成した Excel マクロは下記のボタンからダウンロードできます。</p>
<div class="button frame block green"><a href="https://lemon818.com/wp/wp-content/uploads/2019/02/excel-zasekihyo.xlsm" class="midium">Excel 座席表自動作成マクロをダウンロードする</a></div>
<p>&nbsp;</p>
<h2>操作方法</h2>
<p>（１）<strong>名前を入力します。</strong>名前の左に番号が付いていますが、番号はなんでもいいです。</p>
<p>ダウンロードしたマクロには番号を自動で入力する関数を埋め込んでいますが、消して出席番号とかにしていただいても問題ありません。</p>
<p><img fetchpriority="high" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-3.png" alt="" width="224" height="232" class="aligncenter wp-image-3784" /></p>
<p>（２）<strong>席の行数と列数</strong>を入力します。値は整数を入力してください。また「チェック」というセルで入力チェックを行ってます。</p>
<p>例えば、名簿シートに１０人で座席数が６（行数 : 2  列数 : 3）の場合は、４人分席が不足していますね。こういうときは「チェック」欄に座席数が不足しています。というメッセージが表示されます。</p>
<p>&nbsp;</p>
<p><img decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-4.png" alt="" width="585" height="466" class="aligncenter wp-image-3785" /></p>
<p>（３）「座席表を作成」ボタンを押下します。すると別シート「座席表」に結果が表示されます。</p>
<p><img decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-5.png" alt="" width="243" height="68" class="aligncenter size-full wp-image-3786" /></p>
<h2>座席表自動作成マクロの作り方</h2>
<p>座席表自動生成マクロの作成方法についてご紹介します。今回は Excel vba をつかって作成しています。</p>
<div class="sc_frame_wrap block green">
<div class="sc_frame_title">シート構成</div>
<div class="sc_frame ">
<div class="sc_designlist li fa_angle_o green">
<ul>
<li>「名簿」シート : 名簿を入力するシート</li>
<li>「座席表」シート : 座席表が出力されるシート</li>
</ul>
</div>
</div>
</div>
<p>シートは上記２種類から構成されます。要は入力用シートとして「名簿」、出力用シートとして「座席表」の２種類です。</p>
<h5>「名簿」シート</h5>
<p><img loading="lazy" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-2.png" alt="" width="675" height="477" class="aligncenter wp-image-3773" srcset="https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-2.png 825w, https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-2-300x212.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/02/zasekihyo-2-768x543.png 768w" sizes="auto, (max-width: 675px) 100vw, 675px" /></p>
<p>入力欄は「名前」「行数」「列数」の三つです。</p>
<p>「番号」はいちおうつけていますが、<strong>処理上は何の関係もありません。</strong>つまりどんな番号が入力されても問題なく動作できます。</p>
<p>ダウンロード用の Excel マクロは自動で入力できるようにしていますが、上書きして出席番号にしていただいても何の問題ありません。</p>
<h5>「座席表」シート</h5>
<p>初期はまっさらなシートです。処理が完了した後に座席表が書き出されます。</p>
<p>&nbsp;</p>
<h3>処理内容（Excel vba）</h3>
<div class="sc_frame_wrap block blue">
<div class="sc_frame_title">処理の概要</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>名簿シートの読み込み</li>
<li>座席表シートへの書き込み</li>
<li>教卓の書き込み</li>
</ol>
</div>
</div>
</div>
</div>
<h4>名簿シートの読み込み</h4>
<p>これはシンプルな処理で、「名簿」シートのB列２行目からセルの値が空白になるまで読み込んで配列に入力しているだけです。</p><pre class="crayon-plain-tag">'名簿シートの読み込み
Private Sub readNameList(ByRef NameList() As String)
    
    Const x As Integer = 2
    Const y As Integer = 3
    
    Dim Name As String
    Dim index As Integer: index = 0

    Do
        ReDim Preserve NameList(index)
        Name = Worksheets(NAMELISTSHEET).Cells(y + index, x).Value
        NameList(index) = Name
        index = index + 1
    Loop Until Name = ""
    
    If UBound(NameList) = 0 Then
        MsgBox "名前を入力してください"
        End
    End If
    
    ReDim Preserve NameList(UBound(NameList) - 1)

End Sub</pre><p>
<h4>座席表シートへの書き込み</h4>
<p>「名簿」シートから取得した名前のデータを含む配列をランダムに取り出して、取り出した値を「座席表」シートに書き込むだけの処理です。</p>
<p>ソースコードを見ると複雑そうに見えますがやっていることはシンプルです。</p>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid orange">
<ol>
<li>「名簿」シートのエラー処理（座数の行数と列数  :　数値以外 or 0のとき or 空白ならエラー)</li>
<li>  エラー処理が終わったら「座席表」シートをいったん初期化</li>
<li>「名簿」シートから取得した名前を「座席表」シートに書き込む</li>
</ol>
</div>
</div>
</div>
</div>
<pre class="crayon-plain-tag">' 座席シート表への書き込み
Private Sub writeZasekihyo(ByRef NameList() As String)

    Const x As Integer = 2
    Const y As Integer = 4
    Dim RandList() As Integer
    Dim Name As String
    Dim i, j, k
    j = 0
    k = 0
    
    Dim Max_Row
    Dim Max_Column
    
    Max_Row = Worksheets(NAMELISTSHEET).Cells(2, 4).Value
    Max_Column = Worksheets(NAMELISTSHEET).Cells(2, 5).Value
 
    If Max_Row = "" Or Max_Column = "" Then
        MsgBox "行と列を入力してください"
        End
    End If
    
    If Max_Row &lt; 1 Or Max_Column &lt; 1 _
        Or IsNumeric(Max_Row) = False Or IsNumeric(Max_Column) = False Then
        MsgBox "行と列には 1 以上の数値を入力してください"
        End
    End If
    
    
    ' 乱数作成
    Call calRandomArray(RandList, UBound(NameList) + 1)
    
    ' 初期化
    Application.ScreenUpdating = False
    
    Call defaultSetting(x, y - 2, Max_Row)
    
    ' 座席表へ書き込み
    For i = 0 To Max_Row * Max_Column - 1
        If i &lt;= UBound(RandList) Then
            Name = NameList(RandList(i))
        Else
            Name = ""
        End If
        Call writeZasekihyo_oneChair(k + x, j + y, Name)
        If k = Max_Column - 1 Then
            k = 0
            j = j + 1
            If j = Max_Row Then
                Exit For
            End If
        Else
            k = k + 1
        End If
    Next i

    Application.ScreenUpdating = True
    
End Sub

' 乱数生成
Sub calRandomArray(ByRef arr() As Integer, ByVal MAX_NUM As Integer)

    Dim i, rand As Integer
    Dim num() As Boolean
    ReDim num(MAX_NUM)
    ReDim arr(MAX_NUM)
    
    Randomize
    For i = 0 To MAX_NUM - 1
        Do
        rand = Int(Rnd() * MAX_NUM)
        Loop Until num(rand) = False
        arr(i) = rand
        num(rand) = True
    Next i

    ReDim Preserve arr(UBound(arr) - 1)
    
End Sub

' 初期化
Private Sub defaultSetting(ByVal x As Integer, ByVal y As Integer, ByVal Max_Row As Integer)

    Worksheets(ZASEKISHEET).Select
    
    With Worksheets(ZASEKISHEET).Range(Cells(y, x), Cells(y + 100, x + Max_Row + 100))
        .ClearContents
        .Borders.LineStyle = xlLineStyleNone
    End With
    
    Worksheets(ZASEKISHEET).Rows("2:2").Select
    Selection.Delete Shift:=xlUp

    Worksheets(ZASEKISHEET).Range("A1").Select

End Sub

' 座席のセルの書式
Private Sub writeZasekihyo_oneChair(ByVal x As Integer, ByVal y As Integer, ByVal Name As String)
    
    With Worksheets(ZASEKISHEET).Cells(y, x)
        .Value = Name
        .Borders.LineStyle = xlContinuous
        .RowHeight = 50
        .ColumnWidth = 20
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Font.Size = 20
    End With
        
End Sub</pre>
<h4>教卓の書き込み</h4>
<p>最後に教卓を書き込む処理です。２行目に固定で、列は座席表の列数の値に応じて書き込まれます。</p>
<p>席の列数を2で割ったときの剰余計算（余りを算出）をして、その値が1の場合（つまり奇数のとき）は、席の列数を２で割った値を整数に変換し、得られた値 + 2を書き込み先の列番号とします。</p>
<p>席の列数を剰余計算をした値が0の場合（つまり偶数のとき）、席の列数を２で割った値を整数に変換し、得られた値 + 1 と得られた値 + 2 を書き込み先の列番号（事前に二つのセルを結合させるように処理）とします。</p>
<p>例えば席の列数が７（奇数）の場合、7 ÷ 2 = 3.5 を整数にして 3にします。そして 3 + 2 = 5 列目のセルに書き込むようにします。</p>
<p>また席の列数が８（偶数）の場合、8 ÷ 2 = 4とし、4 + 1 = 5 列目と 4 + 2 = 6 列目を書き込み先の列番号とします。</p>
<p>最後の + 2 ですが、これは<strong>B列（つまりセルの２列目）から座席表を書き込むように処理するため</strong>につけています。</p><pre class="crayon-plain-tag">' 教卓を描く
Private Sub writeKyotaku()

    Const x As Integer = 2
    Const y As Integer = 4
    Dim kyotaku As Integer
    Dim Max_Column As Integer
    
    Max_Column = Worksheets(NAMELISTSHEET).Cells(2, 5).Value
    kyotaku = Int(Max_Column / 2)
        
    If Int(Max_Column / 2) = 0 Then
        kyotaku = 0
        With Worksheets(ZASEKISHEET).Cells(2, kyotaku + x)
            .Value = "教卓"
            .Borders.LineStyle = xlContinuous
            .RowHeight = 50
            .ColumnWidth = 20
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .Font.Size = 20
        End With
    Else
        If Max_Column Mod 2 = 1 Then
            kyotaku = Int(Max_Column / 2)
            With Worksheets(ZASEKISHEET).Cells(2, kyotaku + x)
                .Value = "教卓"
                .Borders.LineStyle = xlContinuous
                .RowHeight = 50
                .ColumnWidth = 20
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .Font.Size = 20
            End With
        Else
            kyotaku = Int(Max_Column / 2) - 1
            With Worksheets(ZASEKISHEET).Range(Cells(2, kyotaku + x), Cells(2, kyotaku + x + 1))
                .Merge
                .Value = "教卓"
                .Borders.LineStyle = xlContinuous
                .RowHeight = 50
                .ColumnWidth = 20
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .Font.Size = 20
            End With
        End If
    End If

    
End Sub</pre><p>
&nbsp;</p>
<h2>まとめ</h2>
<p>いかがでしょうか？</p>
<p>かなりざっくりした説明だったかもしれませんので、もし作るのがめんどくさいと感じた方は下記ボタンからダウンロードしてみてください。</p>
<div class="button frame block green"><a href="https://lemon818.com/wp/wp-content/uploads/2019/02/excel-zasekihyo.xlsm" class="midium">Excel 座席表自動作成マクロをダウンロードする</a></div>
<p>&nbsp;</p>
<p><span></span></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
