経済産業省よりキャッシュレス決済によるポイント還元制度の加盟店一覧が発表されました。(ポイント還元加盟店一覧)
加盟店の一覧はpdfしかなく、住所で検索する等が難しかったのでとりあえずExcelにしてみました。
経済産業省よりキャッシュレス決済によるポイント還元制度の加盟店一覧が発表されました。(ポイント還元加盟店一覧)
加盟店の一覧はpdfしかなく、住所で検索する等が難しかったのでとりあえずExcelにしてみました。
背の小さい順や成績の悪い順で、座席を割り振りたいケースがあると思います。
今回は生徒の名簿一覧から背の順で座席を割り振る方法を紹介させて頂きます。
①マクロを使えるようにする
「マクロを使えるようにする」を参照
②生徒情報の表を作成
③座席表を作成
④席決め配置ボタンを配置する
※ ボタンの配置方法は「表を複数の条件で絞り込む②」を参照
⑤ボタン配置時の以下の画面で「マクロ名」を「 StartSeatSelection 」として「新規作成」を押す
⑥「Microsoft Visual Basic for Applications」にて以下のコードを記載
Sub StartSeatSelection() Dim noCol As Integer: noCol = 1 '★ Dim nameCol As Integer: nameCol = 2 '★ Dim heightCol As Integer: heightCol = 3 '★ Dim startRow As Integer: startRow = 2 '★ Dim lastRow As Integer: lastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 Dim studentList As Dictionary Set studentList = New Dictionary Dim tempStudentList As Dictionary Set tempStudentList = New Dictionary '「生徒情報」シートの内容を1行ずつ読み込み、studentListに身長順で格納します。 For i = startRow To lastRow Step 1 Set tempStudentList = studentList Set studentList = New Dictionary Dim no As String no = Cells(i, noCol).Value Dim name As String name = Cells(i, nameCol).Value Dim height As String height = Cells(i, heightCol).Value If IsEmpty(no) Then MsgBox "生徒番号が空欄です。" End If If Not IsNumeric(no) Then MsgBox no & ":生徒番号には数値を指定してください。" End If If IsEmpty(name) Then MsgBox "氏名が空欄です。" End If If IsEmpty(height) Then MsgBox "身長が空欄です。" End If If Not IsNumeric(height) Then MsgBox height & ":身長には数値を指定してください。" End If If tempStudentList.Count > 0 Then For Each tempStudent In tempStudentList.Items If (tempStudent(2) > height Or (tempStudent(2) = height And tempStudent(0) > no)) And Not studentList.Exists(no) Then studentList.Add no, Array(no, name, height) End If studentList.Add tempStudent(0), Array(tempStudent(0), tempStudent(1), tempStudent(2)) Next tempStudent End If If Not studentList.Exists(no) Then studentList.Add no, Array(no, name, height) End If Next 'studentListを基に、座席に名前をあてはめます。 Dim startSheetRow As Integer: startSheetRow = 4 '★ Dim lastSheetRow As Integer: lastSheetRow = 14 '★ Dim startSheetCol As Integer: startSheetCol = 2 '★ Dim lastSheetCol As Integer: lastSheetCol = 12 '★ Dim targetRow As Integer Dim targetCol As Integer Dim studentListCnt As Integer: studentListCnt = 0 '★ For targetRow = startSheetRow To lastSheetRow Step 2 For targetCol = startSheetCol To lastSheetCol Step 2 Worksheets("座席表").Cells(targetRow, targetCol).Value = studentList.Items(studentListCnt)(1) studentListCnt = studentListCnt + 1 Next targetCol Next targetRow End Sub
VLOOKUP 関数等を利用している場合、スポット的に直接値を入れたいケースがあると思います。
直接入れた値の削除時にもともと設定してあったVLOOKUP関数を再セットするプログラムを作成します。
①マクロを使えるようにする
「マクロを使えるようにする」を参照
②VLOOKUP関数の参照元、先を作成
③「Alt + F8」を押して表示される以下の画面で「マクロ名」を「FunctionDisplayOnDeletion」として「作成」を押す
④ Microsoft Visual Basic for Applications」にて以下のコードを記載
Sub FunctionDisplayOnDeletion() Dim searchValueRow As Integer: searchValueRow = 1 '★検索値列 Dim startFuncRow As Integer: startFuncRow = 2 '★VLOOKUP関数設定開始行 Dim startFuncCol As Integer: startFuncCol = 2 '★VLOOKUP関数設定開始列 Dim endFuncCol As Integer: endFuncCol = 3 '★VLOOKUP関数設定終了列 Dim c As Range, i As Long For Each c In Selection If c.Row >= startFuncRow _ And c.Column >= startFuncCol _ And c.Column <= endFuncCol Then c.Value = "=IFERROR(VLOOKUP(" & Cells(c.Row, searchValueRow).Address(False, False) & ",品目情報!$A$2:$C$5," & c.Column & ",FALSE),"""")" Else c.Value = "" End If Next c End Sub Sub AutoActivateSheet_Name() 'DeleteKeyを押すと「FunctionDisplayOnDeletion」マクロ実行 Application.OnKey "{Delete}", "FunctionDisplayOnDeletion" Application.OnKey "^{Delete}", "FunctionDisplayOnDeletion" End Sub Sub AutoDeactivateSheet_Name() 'DeleteKeyへの割り当て解除 Application.OnKey "{Delete}" Application.OnKey "^{Delete}" End Sub Sub Auto_Open() '「見積り入力」シートがアクティブになったら「AutoActivateSheet_Name」マクロ実行 Worksheets("見積り入力").OnSheetActivate = "AutoActivateSheet_Name" '「見積り入力卸」シート以外がアクティブになったら「AutoDeactivateSheet_Name」マクロ実行 Worksheets("見積り入力").OnSheetDeactivate = "AutoDeactivateSheet_Name" End Sub