テクニック集第9回、検食簿、給食日誌の印刷編。エクセルVBAで献立自動化、栄養士さんお助けツール

Excel VBA

週間献立作業指示書データの活用

検食簿、給食日誌に作業指示書データからメニュー名を転記する

週間献立表から作業指示書を印刷後、同時に吐き出されたメニューデータをシートに転記します。

ダウンロードファイルを解凍して開き「検食簿・給食日誌」を開きます。

シート1、シート2にそれぞれにデータ枠を設定してあるのでここにメニューデータを割り振りして印刷します。

■ 印刷用アイコンをクリックすると、印刷用のフォームが開きます。

フォームには週間献立表で書き出した日付付のcsvファイルがリストされます。

日付が間違いないか確認して印刷ボタンを押せば印刷が始まります。

ボタンの下のチェックボックスに✔を入れるとプレビューを表示します。✔を入れないでボタンを押すとダイレクトにシート1,シート2を連続で印刷します。(ボタンを押す前にプリンタの電源、用紙の点検をしておきます)

 

プログラム

Sub siitoPrint(siito As Worksheet)
'引数のSheetに日付csvファイルのメニューデータを転送してsheetを印刷する処理
'
Dim youbiCSV As Variant
Dim r As Integer
Dim menu1 As Variant
Dim hizuke As String
Dim kaisi As Variant
Dim tenki As Variant
Dim gyouksn As Variant
Dim last As Integer
'
'WeeklyCsvは日付の付いた一週間分の7個のCSVファイルが入っている
'1つのファイルには朝、昼、おやつ、夕の区分でそれぞれレシピの食材が登録されている
'下のForでは二次元配列であるWeeklyCsvから一日分だけ取り出している。
'例えば最初のyoubiCSVは月曜日の二次元配列データです
'
siito.Select
For Each youbiCSV In WeeklyCsv
    '日付セット
    hizuke = youbiCSV(1, 1) & " " & youbiCSV(2, 1)
    
    'csvファイルで食事区分の開始位置'kaisi(0)=朝食の行、kaisi(1)=昼食の行、・・・
    kaisi = kaisiiti(youbiCSV)
    last = UBound(youbiCSV, 1)
    gyoukan = Array(kaisi(1) - kaisi(0), kaisi(2) - kaisi(1), kaisi(3) - kaisi(2), last - kaisi(3))
    
    '転記シートの行位置
    With siito
        If siito.Name = "検食簿" Then
            tenki = Array(8, 23, 33, 38)
            .Cells(2, "C") = hizuke
        ElseIf siito.Name = "給食日誌" Then
            tenki = Array(7, 12, 18, 19)
            .Cells(4, "C") = hizuke
        End If
     End With
       '-----------------------------

        For r = 0 To 3  '食事カテゴリーの繰り返し
            'メニュー名取得
            menu1 = menuName(youbiCSV, kaisi(r), gyoukan(r)) '5はcsvファイルのメニュー収集の開始行位置
            'メニュー名転記
            Call menutennki(siito, menu1, tenki(r))   '8はシート上の転記行位置
            
        Next r
        
        If CheckBox1.Value = True Then
            'プレビューから確認して印刷
            Me.Hide
            siito.PrintPreview
            'UserForm1.Show
        Else
            '印刷
            siito.PrintOut copies:=Val(Me.Label8.Caption)
        End If
       Call datakesu(siito)   '前回データ消す
Next youbiCSV


End Sub

 

■ 下図は日付付のcsvファイルを二次元配列に取り出した要素データの状態を表しています。

規則性を見出す

■二次元配列の中からメニュー名だけを拾い出すために、メニューデータの並びの規則性をみつけます。

■ 上図、一番左の「食事区分」は縦に朝食、昼食、おやつ、夕食の4個並んでいます。食事区分ごとにメニュー名が設定されていて、各メニューの行数は限定していないのでランダムで日ごとに変化します。

このことを踏まえて、食事区分間の行数を取得して、For繰り返しにセットします。

■ 23行目~26行目では、gyoukanにこの食事区分間の行数をセットしています。

■24行目では、下図のkaisiitiファンクションで4個の食事区分の行位置を持ち帰ります。

last = UBound(youbiCSV, 1)

■各食事区分の行位置から引き算して行数を取得して26行目のgyoukanに配列として渡します。

gyoukan = Array(kaisi(1) – kaisi(0), kaisi(2) – kaisi(1), kaisi(3) – kaisi(2), last – kaisi(3))

下図、42行目のmenuNameファンクションの第三引数にこのgyoukanを渡しています。

■下図はmenuNameファンクションでメニュー名を配列にして持ち帰ります。

引数の行間行数をFor繰り返し、食事区分間にあるメニュー名を拾い出しています。一つの食事区分間のメニュー数は最大6個ですが、将来増えることを想定して7個にしています(配列は0から始まるので要素数は8です)

■上図で取り出した配列menu1は44行目で、指定したシートの所定のセルに転記するmenutennkiプロシージャの第2引数に渡されます。

■下図はmenutennkiプロシージャになります。

■配列menuの要素の数だけForで繰り返してシートのセルに書き出しています。

■実際の転記の様子は下記印刷フォームのプレビューするチェックボックスに✔を入れて印刷するボタンをクリックすると転記した状態を確認できます。

■ ✔を入れない場合はダイレクトに印刷を開始します。

■詳しくはダウンロードファイルを開いて動作確認してみて下さい。

ダウンロード

■ 検食簿、給食日誌編をまとめたファイルが下のカードからダウンロードできます。

コメント

タイトルとURLをコピーしました