【Excel】当日分のシフトを自動で抽出

通常、シフト表は横軸に日付、縦軸にスタッフ名を記載したマトリクスにすることが多いです。

1ヵ月の期間などでシフトを把握するのにマトリクスは有効ですが、今日出勤のスタッフを確認したい場合はマトリクスは不向きです。

今回は、Excel関数のみで今日出勤のスタッフを抽出できるようにしてみました。

このエクセルファイルの作り方

①TODAY関数で本日日付を取得

②以下の関数で、今日のシフト毎のスタッフを表示

IFERROR(TEXTJOIN(“、”,TRUE,FILTER($B$4:$B$15,INDIRECT(ADDRESS(4, MATCH($C$17,$3:$3)) & “:” & ADDRESS(15, MATCH($C$17,$3:$3)))=$B18)), “なし”)

以下、各関数の解説

1. MATCH(検査値, 検査範囲)で検査値を5/3、検査範囲を3行目とし、5/3のある列(5)を取得

2.ADDRESS(行番号, 列番号) で行番号には表の範囲である「4」と「15」を指定し、セルの座標「$E$4」「$E$15」をそれぞれ取得

3.INDIRECT(参照文字列) で、参照文字列にはADDRESSで取得した「$E$4」「$E$15」と「:」を連結した文字列「$E$4:$E$15」を指定

4.FILTERで「$E$4:$E$15」の中で「$B18(早番)」に該当する行と一致する「$B$4:$B$15」内の値「久保、前田、三宅」を取得

5.TEXTJOINで「久保」「前田」「三宅」を「、」で区切り連結

6.IFERRORで該当データがない場合(早番がいない場合)は「なし」と表示

【Excel】画面を最大化するショートカットキー

最近ほとんど会社に行くことなく自宅でテレワークをしています。
今日はリモート会議で役立つ機能の紹介です。

↓のように、通常の設定だと赤枠の部分が人に見せる時には邪魔な事が多いです。

「Alt → V → U」と順番にキーボードを押すと、↓のように全画面表示にすることができます。

元に戻したい時は「Esc」キーを押します。

【Excel】メールを自動作成する

Excelで情報共有しており、Excelに追記した内容をメールで共有するケースがあるかと思います。

面倒なメール作成を自動でできるようにしてみました。
件名やメール本文は微調整してご利用ください。

このエクセルファイルの作り方

①マクロを使えるようにする
マクロを使えるようにする」を参照

②ボタンを配置する
 ※ ボタンの配置方法は「表を複数の条件で絞り込む②」を参照

③ボタン配置時の以下の画面で「マクロ名」を「CreateEmail」として「新規作成」を押す

④ 「Microsoft Visual Basic for Applications」にて以下のコードを記載

Sub CreateEmail()
Dim oApp       As Object
Dim objMAIL    As Object
Dim messageList(1) As String
Dim n          As Long
Dim fullName As String
Dim firstName As String

On Error Resume Next
Set oApp = GetObject(, "Outlook.Application")
On Error GoTo 0
If oApp Is Nothing Then
Set oApp = CreateObject("Outlook.Application")
oApp.GetNamespace("MAPI").GetDefaultFolder(6).display
End If

fullName = Application.UserName
firstName = Mid(fullName, 1, InStr(fullName, " ") - 1)

Set objMAIL = oApp.CreateItem(0)
'メールに載せるメッセージ本文'
messageList(0) = "お疲れ様です。" & firstName & "です。" & vbCrLf & vbCrLf & _
"共有ファイルNo." & Cells(3, 3).Value & "に追記を行いました。" & vbCrLf & _
"タイミングを見てご確認ください。" & vbCrLf & vbCrLf & _
"<\ShareServer\メールを自動作成する.xlsm>" & vbCrLf

messageList(1) = vbCrLf & "     以上、宜しくお願い致します。"

Dim adress As String
Dim i As Long
For i = 1 To 50

adress = adress + ThisWorkbook.Worksheets("宛先").Cells(i + 1, 2).Value
adress = adress + " ;"

Next i

objMAIL.To = adress
'件名'
objMAIL.Subject = "共有ファイルNo." & Cells(3, 3).Value & "を追加しました"
objMAIL.BodyFormat = 2 'HTML形式
objMAIL.Body = messageList(0) & messageList(1)
objMAIL.display

n = Len(messageList(0))
ActiveSheet.Range(Cells(Cells(3, 3) + 5, 2), Cells(Cells(3, 3) + 5, 5)).Copy
oApp.ActiveInspector.WordEditor.Range(n, n).Paste
Application.CutCopyMode = False

Set objMAIL = Nothing
Set oApp = Nothing
End Sub

【Excel】QRコードを一括作成する

「Google Charts API」を利用して、URL等を一括でQRコードにするプログラムを作成します。
商品パッケージやパンフレットなどへの添付にご活用ください。

このエクセルファイルの作り方

①マクロを使えるようにする
マクロを使えるようにする」を参照

②URL、QRコードの表を作成

③ボタン配置時の以下の画面で「マクロ名」を「CreateQrcode」として「新規作成」を押す

④Microsoft Visual Basic for Applications」にて以下のコードを記載

Sub CreateQrcode()
    '開始行
    Dim firstRow As Long: firstRow = 3
    '最終行の取得
    Dim lastRow As Long: lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    'firstRow~lastRowまで繰り返し(途中エラーが出た場合も止めずに最後まで処理)
    On Error Resume Next
        For i = firstRow To lastRow

            'QRコード表示セルの高さなどを調整
            With Cells(i, "B")
                .RowHeight = 65
                .VerticalAlignment = xlTop '上詰め
            End With

            'GoogleAPIでQRコードを作成
            Set qr = ActiveSheet.Pictures _
                    .Insert("http://chart.apis.google.com/chart?cht=qr&chs=80x80&chl=" _
                            + Cells(i, "A").Value)

            'QRコードの表示位置を指定
            With qr
                .Top = Cells(i, "B").Top + 2
                .Left = Cells(i, "B").Left + 2
            End With
        Next i
    On Error GoTo 0
End Sub

【Excel】表をテキストに変換

売上データなど、Excelで作った表を送る場合に、メールやチャットにてテキスト形式で送りたいことがあると思います。
そんなExcel表からテキストへ変換するためのプログラムを作成してみました。

私はシステムエンジニアなので、プログラムのコメントでテキスト形式の表を書いたりします。

今回は、範囲選択した中のデータをテキスト形式の表にし、クリップボードにコピーします。(メモ帳等に張り付けてご利用ください)
なお、セルの書式設定が通貨(#,##0)の場合のみ三桁カンマを付与し、値が数値の場合は右寄せ、それ以外は左寄せで表を作成します。

このエクセルファイルの作り方

①マクロを使えるようにする
マクロを使えるようにする」を参照

②ボタンを配置する
 ※ ボタンの配置方法は「表を複数の条件で絞り込む②」を参照

③ボタン配置時の以下の画面で「マクロ名」を「ConvertTable 」として「新規作成」を押す

④ 「Microsoft Visual Basic for Applications」にて以下のコードを記載

Sub ConvertTable()
    Dim result As String
    Dim startRow, startCol, endRow, endCol As Integer
    Dim selectArea As Range
    Set selectArea = Selection
    
    startRow = selectArea.Cells(1).Row
    startCol = selectArea.Cells(1).Column
    endRow = selectArea.Cells(selectArea.Count).Row
    endCol = selectArea.Cells(selectArea.Count).Column
    
    Dim widthDic As Object
    Set widthDic = CreateObject("Scripting.Dictionary")
    
    Dim maxWidth As Integer: maxWidth = 0
    
    Dim cellVal As String
    Dim margin As Integer
    
    
    ' 各列毎の最大幅を配列で保持
    For j = startCol To endCol Step 1
        For i = startRow To endRow Step 1
            cellVal = Cells(i, j).Value
            If IsNumeric(cellVal) And Cells(i, j).NumberFormatLocal = "#,##0" Then
                cellVal = Format(cellVal, "#,#")
            End If
            
            If maxWidth < LenB(StrConv(cellVal, vbFromUnicode)) Then
                maxWidth = LenB(StrConv(cellVal, vbFromUnicode))
            End If
        Next
        widthDic.Add j, maxWidth
        maxWidth = 0
    Next
    
    ' 表文字列の作成
    For i = startRow To endRow Step 1
        ' 線だけの行を書き込み
        For j = startCol To endCol Step 1
            If i = startRow Then
                If j = startCol Then
                    result = result &amp; "┌"
                Else
                    result = result &amp; "┬"
                End If
            Else
                If j = startCol Then
                    result = result &amp; "├"
                Else
                    result = result &amp; "┼"
                End If
            End If
            
            result = result &amp; String(Application.WorksheetFunction.RoundUp(widthDic.Item(j) / 2, 0), "─")
            
            If i = startRow And j = endCol Then
                result = result &amp; "┐"
            ElseIf i <> startRow And j = endCol Then
                result = result &amp; "┤"
            End If
        Next
        result = result &amp; vbCrLf
        ' 値の行を書き込み
        For j = startCol To endCol Step 1
            result = result &amp; "│"
            cellVal = Cells(i, j).Value
            If IsNumeric(cellVal) And Cells(i, j).NumberFormatLocal = "#,##0" Then
                cellVal = Format(cellVal, "#,#")
            End If
            
            margin = widthDic.Item(j) - LenB(StrConv(cellVal, vbFromUnicode))
            margin = margin + widthDic.Item(j) Mod 2
            
            If IsNumeric(cellVal) Then
                result = result &amp; Space(margin)
                result = result &amp; cellVal
            Else
                result = result &amp; cellVal
                result = result &amp; Space(margin)
            End If
            
            If j = endCol Then
                result = result &amp; "│"
            End If
        Next
        result = result &amp; vbCrLf
    Next
    
    ' 最下部の線を書き込み
    For j = startCol To endCol Step 1
        If j = startCol Then
            result = result &amp; "└"
        Else
            result = result &amp; "┴"
        End If
        
        result = result &amp; String(Application.WorksheetFunction.RoundUp(widthDic.Item(j) / 2, 0), "─")

        If j = endCol Then
            result = result &amp; "┘"
        End If
    Next
    
    '表文字列をクリップボードに格納する
    With New MSForms.DataObject
        .SetText result
        .PutInClipboard
    End With
End Sub

⑤ 「C:\Windows\System32\FM20.DLL」を参照する
※クリップボードに値を格納するためのアセンブリ
※ない場合は 「C:\Windows\SysWOW64\FM20.DLL」