エクセルVBAで献立自動化、栄養士さんお助けツール、レシピの作成

Excel VBA

■ レシピ作成システムとCSVファイル

レシピ作成用フォーム

事業所給食サービスでまず必要になるのが献立です。

その献立の元になるのが料理のレシピになります。

ここでは下図の様なフォームを利用してレシピを作成しています。

下図フォームの上半分はそのメニュー名を表す管理項目です。

下半分はメニュー名に対して必要になる食材料のデータを表しています

今回の記事では主にこの食材料を扱う上で必要になるCSVファイルの作成について解説します。

 

■ 食材Item用CSVファイルを準備する

このシステムでは文部科学省のホームページからダウンロードした日本食品標準成分表2020年版(八訂)を使用しています。

日本食品標準成分表2020年版(八訂)

 日本食品標準成分表2020年版(八訂)は、給食事業等のほか、栄養成分表示をする事業者や個人の食事管理におけるニーズの高まりに応えるため、文部科学省科学技術・学術審議会資源調査分科会の下に食品成分委員会を設置及び検討を行い、調理済み食品の情報の充実、エネルギー計算方法の変更を含む全面改訂を行ったものです。
(文部科学省のホームページから引用)
日本食品標準成分表2020年版(八訂):文部科学省 (mext.go.jp)
文部科学省のホームページを開くと下図のような食品成分データの一覧が表示されます。
赤囲みの部分をクリックするとweb版のエクセルが開いてデータを表示します。
約2400件の食材データが収録されています。
本システムではこのデータを加工して利用します

食材Itemに活用

上のエクセルデータを当レシピシステムに利用しますが、このままでは利用しにくいので少し加工します。上の図で13行目以降が食品データとなっていて主に必要なのはこの部分です。その上の部分は項目データで必要ない項目行もあるため加工が必要です。
重要!! 前提としてお使いのPCにエクセル本体がインストールされていることが必要です。
まずwebのエクセルデータをダウンロードします
赤枠で囲ったデータをクリックするとダウンロードできます
次にダウンロードしたファイルを開いて左上のメニューバーから「ファイル」を開きます

エクスポート」→「ファイルの種類の変更」→「CSV(カンマ区切り)」を順に選択していきます
最後に一番下にある「名前を付けて保存」をクリックします。

名前を付けて保存のダイアログが出るので適当な名前を付けて保存します。途中下記のようなメッセージがでます。

・・・・サポートしていません」メッセージが出るのでOKボタンをクリック

更に「・・・・機能が失われる可能性があります」メッセージがでますがかまわず はいボタンをクリックすると下図のようなCSVファイルができます。

このCSVファイルをさらに加工します

最初のエクセルファイルのデータでは項目部分について複数のセルが結合していたり、セルの中で改行コードを使用している部分があります。そのためこれをCSVに変換したときセルのデータ構造が元のデータと変わってしまいます。

表では13行目から実の食品成分データになりますが、12行目までの項目データで一つのセル中に複数のデータが改行コードで区切られたところが複数あります。また、実データの中にマイナスの表示が付加されたデータが混在しています。
これらのデータをプログラムの中で利用しやすいCSVファイルに変換するときにデータ構造が不均一になってしまうためこれらを取り除く必要があります。ここでは下記のメソッドを使ってセルに含まれた改行コード (vbLf) と(ー)を取り除きました

改行コードを取り除く

このメソッドでは上記の最初の段階でエクセルの機能でCSVに変換したA.csvとして保存したファイルを開いて、そのデータをもう一度別のB.csvというCSVファイルに書き換える動作をしています。

そのA.csv を B.csvに書き換える中で、カンマで区切られた一個一個のデータ中に改行コード(vbLf)が含まれているときはそれを取り除きます。

具体的には
39行目 str = Replace(varData(i, j), vbLf, “”) がそのコードです。

ここで使用しているReplace関数は第一引数のvarData(i, j)が一個一個のデータで第二引数vbLfが改行コード、第三引数 ”” が長さ0の文字列に変換(つまりvbLfを取り除く)、という作業をしています

Public Sub MainProc()
    Dim shtMain As Worksheet
    Dim shtData As Worksheet
    Dim filePath As String
    Dim lastRow As Long
    Dim lastCol As Long
    Dim varData As Variant
    Dim i As Long
    Dim j As Integer
    Dim line As String
    
    '①「メイン」シートを変数に格納する
    'Set shtMain = ThisWorkbook.Sheets("表全体")
    
    '②「データ」シートを変数に格納する
    Set shtData = ThisWorkbook.Sheets("表全体")
            
    '③CSVファイルパスを変数に格納する
    filePath = ActiveWorkbook.Path & "\testcsv8.csv"
    
    '④「データ」シートの最終行を取得する
    lastRow = shtData.Cells(shtData.Rows.Count, 1).End(xlUp).Row
        
    '⑤「データ」シートの最終列を取得する
    lastCol = shtData.Cells(1, shtData.Columns.Count).End(xlToLeft).Column
        
    '⑥「データ」シートに入力されているデータを配列に格納する
    varData = shtData.Range(shtData.Cells(1, 1), shtData.Cells(lastRow, lastCol))
    
    '⑦作成するファイルを開く
    Open filePath For Output As #1
    
    '⑧ダブルコーテーションくくりのデータを書き込みする
    Dim str As String
    For i = 1 To lastRow
        line = ""
        For j = 1 To lastCol
            '項目用セル内に多数の改行コードが含まれているので取り除く
            str = Replace(varData(i, j), vbLf, "")
        
            line = line & """" & str & """"
            
            If j <> lastCol Then
                line = line & ","
            End If
            
        Next
        
        Print #1, line
    Next
    
    '⑨作成するファイルを閉じる
    Close #1
    
    MsgBox "完了"
End Sub

 

マイナス記号を取り除く

下記の左図はエクセルの元データの一部で、右図はエクセルの機能でCSVに変換した内容です。

赤丸で囲んだ部分を見ると元データではかっこで括った(数値)の部分が変換後は ‐数値 となっています。

なぜこうなるのかはエクセル機能の内部事情だと思いますが、よくわかりません。カッコ付の数値部分はマイナス付表記になってしまっているので、正しく栄養価計算ができるようにこれを取り除きます。

 

上の項目で改行コードを取り除くメソッドと同じReplace関数を使います

改行コードを表す vbLf の部分を ”-” に変えるだけです

具体的には
39行目 str = Replace(varData(i, j), vbLf, “”)のすぐ下に
40行目 str = Replace(str, ”-”, “”)
の一行を加えてメソッドを実行すれば

下図のように本システムで使用できるCSVファイルが出来上がります
(下図では項目部分を更に見やすい形に不要部分の項目や行を変更しています。下図の5行目以降は変更を加えていません)

リストビューの利用(食材Itemの検索結果を表示)

上で作ったcsvファイルをどのように利用するかの一例です

メニューのレシピを作るときに必要な食品データを検索して一覧に表示して選択するとレシピにその栄養価データを登録できます。

上図では検索用Textboxに「たま」と入力した状態で、CSVファイルの食品名で「たま」を含んだデータを一覧で表示した様子を表しています。

下からレシピシステムがダウンロードできますから、是非体感してみてください。

本システムはまだできたばかりでバグがあるかもしれませんがCSVファイルの利用についての部分は体感できると思います。まだ開発途中ですが順次、献立作成や発注の自動化、帳票印刷の自動化などに発展させてシステムを充実させたいと考えています。

レシピシステムダウンロード

下のカードからダウンロードしてください。

本プログラムはエクセル2013で作成しています。他のバージョンでは動作可能かはわかりません。また、最近(2022年以降)のエクセルではマクロを含んだネット経由のダウンロードファイルは動作しないようになっているようです(確認していません。)

ダウンロードしたファイルは圧縮ファイルですから解凍してください。

解凍したら、「CSVの利用」フォルダーを開けて「tes8」のエクセルファイルを開くとシステムのレシピ作成用フォームが開きます。

注意!!
「CSVの利用」フォルダーにあるCSVファイル「item_revi8」、画像用フォルダー「resipImage」の二つはエクセルファイル「tes8」と同じフォルダー内においてください。

一番左上のレシピ番号のコンボボックスを開いて登録済みのレシピ番号を選択してみてください。

メニューのイメージ画像ファイルは、ネットで画像検索したものを 「resipImage」フォルダーに入れて使用します。

 

 

コメント

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