はじめに
前回は、料理献立のテーブル(メインとサブ)を作成し、そのテーブルを基に選択クエリを作り、作成したクエリを基に料理献立メニューの登録、削除、追加などが行え、作成した料理献立の栄養価計算もフォーム上に表示させるようにしました。
今回は、Excelで作成した保育園用栄養計算プログラム内の料理献立メニュー(566個)を料理マスターテーブル(MS_ryouritable)と料理明細テーブル(MS_ryourimeisaitable)に移して、これらをAccessで利用できるようにしたいと思います。
なお、私のパソコン環境やソフトのバージョンは以下の通りです。
パソコンOS : Windows10 Pro
Windowsバージョン : 21H1
Microsoft 365 Accessのバージョン 64ビット版: 2201
保育園用栄養計算プログラム内の料理献立をAccessへの取込
前回の料理献立フォームを作成したAccessのファイル(献立料理データ.accdb)を起動し、このファイルに保育園用栄養計算アプリ(保育園用栄養計算アプリ Eiyo-NCalc for nursery school .xlsm)から直接インポートしようとしましたが、「定義 XML によるスキーマの確認が失敗しました。XML ドキュメントの行|にエラーがあります。」と言うエラーが表示され、取り込むことができませんでした。
そこで、保育園用栄養計算アプリ(保育園用栄養計算アプリ Eiyo-NCalc for nursery school .xlsm)のファイルから料理献立が記録されているシート(料理名一覧)を表示させ、シート全てをコピーして、新たに作成したExcelファイル(Book1)の「Sheet1」にペーストし、これを「名前を付けて保存」として、保存ファイル名を「料理一覧.xlsx」で保存しました。
このファイルを良く見ると材料欄に記入されている材料コードは、保育園用栄養計算アプリでの独自の材用コードを利用しているために、食品成分表(八訂)を利用するためには、食品成分表(八訂)の食品番号にするために対応表を作成し、その対応表にしたがってVlookup関数を利用して、独自の材料コードを食品成分表(八訂)の食品番号に変換することにしました。
ここで注意することは、フィールドラベルになるExcelの1行目のタイトルには、空白文字を入れないこと、加食量の欄には、数値型のデータを入れること(空白行は、””ではなく数値の「0」に置き換えること)です。
変換した表は次の通りです。
これで、Accessに取り込む準備ができました。
上部メニューの「外部データ」⇒「新しいデータソース」⇒「ファイルから(F)」⇒「Excel(X)」と選択してクリックすると、「外部データの取り込み」- Excelスプレッドシート」のウインドウが表示されますので、その下にあるファイル名欄の横にある「参照(R)…」をクリック、ファイル選択画面で先に作成した「料理一覧.xlsx」を指定して「開く」をクリック、さらに「現在のデータベースの新しいテーブルにソースデータをインポート」にチェックを入れ「OK」をクリックします。
「スプレッドシートインポートウィザード」が表示されますので、ワークシートにチェックを入れその横のシート選択部分で取り込むシート(Access取り込む表)を選択、下にその取り込む表が表示、「次へ(N) >」をクリック、さらに「スプレッドシートインポートウィザード」で「先頭行をフィールド名として使う(I)」にチェックが入っていることを確認後「次へ(N) >」をクリック、「フィールドのオプション」でフィールド名(M)の「献立No」のデータ型を「長整数型」を選択ご「次へ(N >)」をクリック、次に「次のフィールドに主キーを設定する(C)」にチェックを入れ、その横の欄が「献立No」が選択されていることを確認後「次へ(N) >」をクリック、「インポート先にテーブル(I)」を「MS_excelryouri」と書き換え「完了」をクリック、「インポート先の保存」画面がでますが「閉じる」をクリックします。
これで、Excelの料理献立の表がAccessのテーブルに取り込むことができました。
取り込んだExcelの料理データテーブルから料理マスターテーブルと料理明細テーブルに移し替え
Excelから取り込んだ料理テーブルはこのままでも利用できますが、前回の料理献立フォーム作成で作成した料理マスターテーブルと料理明細テーブルに移し替えられれば、そのまま料理献立フォームが利用できるようになります。
また、Excelで取り込んだテーブルは1つの料理に対して最大20食品素材までしか入っておりませんが、中には1つの料理に対して20以上の食品素材を使う料理もあると思います。
そのような場合も、料理マスターテーブルと料理明細テーブルに分けて料理を登録できれば、1つの料理に対して食品素材の数は20素材以上にも対応することが可能となります。
Excelから取り込んだ料理テーブルから料理マスターテーブルと料理明細テーブルに分けて料理を登録するためには一つ一つ料理献立フォームから入力することも可能ですが、566個もの料理を登録するには大変な作業となります。
したがって、ここではVBAを利用して登録作業を実施することにしました。
料理フォーム内のフィールド値とExceから取り込んだ料理テーブル(MS_excelryouri)の対応付けは次の通りとしました。
Public Sub 料理献立変換_エクセルからアクセスへ()
Dim dbs As DAO.Database
Dim rs, rs1, rs2, rs3 As DAO.Recordset
Dim i As Integer
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("MS_ryourimeisaitable")
Set rs1 = dbs.OpenRecordset("MS_Foodcomptable")
Set rs2 = dbs.OpenRecordset("MS_excelryouri")
Set rs3 = dbs.OpenRecordset("MS_ryouritable")
rs2.MoveFirst
Do Until rs2.EOF
rs3.AddNew
rs3!日付 = Date
rs3!料理NO = rs2!献立No
rs3!料理大分類 = "昼食"
rs3!料理中分類 = ""
rs3!料理小分類 = ""
rs3!料理分類コード = rs2!料理献立分類コード
rs3!料理名 = rs2!献立名
rs3!メモ = "保育園用"
rs3.Update
For i = 1 To 20
If rs2("材料" & i) <> "" Then
rs.AddNew
rs!NO = i
rs!料理NO = rs2!献立No
rs!材料NO = rs2("材料" & i)
rs!使用量_g = rs2("加食量" & i)
rs![廃棄率_%] = DLookup("MS_Foodcomptable!REFUSE", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'")
rs!エネルギー_kcal = DLookup("MS_Foodcomptable!ENERC_KCAL", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!水分_g = DLookup("MS_Foodcomptable!WATER_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!PROTCAA_g = DLookup("MS_Foodcomptable!PROTCAA_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!たんぱく質_g = DLookup("MS_Foodcomptable!PROTen_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ATNLEA_g = DLookup("MS_Foodcomptable!FATNLEA_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!コレステロール_mg = DLookup("MS_Foodcomptable!CHOLE_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!脂質_g = DLookup("MS_Foodcomptable!FATe_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!CHOAVLM_g = DLookup("MS_Foodcomptable!CHOAVLM_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!CHOAVL_g = DLookup("MS_Foodcomptable!CHOAVL_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!CHOAVLDF_g = DLookup("MS_Foodcomptable!CHOAVLDF_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!食物繊維総量_g = DLookup("MS_Foodcomptable!FIB_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!糖アルコール_g = DLookup("MS_Foodcomptable!POLYL_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!炭水化物_g = DLookup("MS_Foodcomptable!CHOCDF_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!有機酸_g = DLookup("MS_Foodcomptable!OA_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!灰分_g = DLookup("MS_Foodcomptable!ASH_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!NA_mg = DLookup("MS_Foodcomptable!NA_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!K_mg = DLookup("MS_Foodcomptable!K_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!CA_mg = DLookup("MS_Foodcomptable!CA_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!MG_mg = DLookup("MS_Foodcomptable!MG_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!P_mg = DLookup("MS_Foodcomptable!P_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!FE_mg = DLookup("MS_Foodcomptable!FE_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ZN_mg = DLookup("MS_Foodcomptable!ZN_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!CU_mg = DLookup("MS_Foodcomptable!CU_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!MN_mg = DLookup("MS_Foodcomptable!MN_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!I_μg = DLookup("MS_Foodcomptable!ID_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!SE_μg = DLookup("MS_Foodcomptable!SE_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!CR_μg = DLookup("MS_Foodcomptable!CR_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!MO_μg = DLookup("MS_Foodcomptable!MO_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!レチノール_μg = DLookup("MS_Foodcomptable!RETOL_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![α-カロテン_μg] = DLookup("MS_Foodcomptable!CARTA_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![β-カロテン_μg] = DLookup("MS_Foodcomptable!CARTB_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![β-クリプトキサンチン_μg] = DLookup("MS_Foodcomptable!CRYPXB_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![β-カロテン当量_μg] = DLookup("MS_Foodcomptable!CARTBEQ_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!VITA_RAE_μg = DLookup("MS_Foodcomptable!VITA_RAE_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンD_μg = DLookup("MS_Foodcomptable!VITD_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![α-トコフェロール_mg] = DLookup("MS_Foodcomptable!TOCPHA_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![β-トコフェロール_mg] = DLookup("MS_Foodcomptable!TOCPHB_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![γ-トコフェロール_mg] = DLookup("MS_Foodcomptable!TOCPHG_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs![δ-トコフェロール_mg] = DLookup("MS_Foodcomptable!TOCPHD_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンK_μg = DLookup("MS_Foodcomptable!VITK_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンB_1mg = DLookup("MS_Foodcomptable!THIA_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンB2_mg = DLookup("MS_Foodcomptable!RIBF_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ナイアシン_mg = DLookup("MS_Foodcomptable!NIA_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ナイアシン当量_mg = DLookup("MS_Foodcomptable!NE_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンB6_mg = DLookup("MS_Foodcomptable!VITB6A_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンB12_μg = DLookup("MS_Foodcomptable!VITB12_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!葉酸_μg = DLookup("MS_Foodcomptable!FOL_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!パントテン酸_mg = DLookup("MS_Foodcomptable!PANTAC_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビオチン_μg = DLookup("MS_Foodcomptable!BIOT_μg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!ビタミンC_mg = DLookup("MS_Foodcomptable!VITC_mg", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!アルコール_g = DLookup("MS_Foodcomptable!ALC_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs!食塩相当量_g = DLookup("MS_Foodcomptable!NACL_EQ_g", "MS_Foodcomptable", "MS_Foodcomptable!FoodcompNO = '" & rs!材料NO & "'") * rs!使用量_g / 100
rs.Update
End If
Next i
rs2.MoveNext
Loop
rs.Close: Set rs = Nothing
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs1 = Nothing
rs3.Close: Set rs1 = Nothing
End Sub
全ての料理を変換して登録するのに約2分弱かかりました。
下図は、料理NOが1番と料理NOが最終の566番を表示した画面です。
おわりに
如何だったでしょうか?
保育園用栄養計算プログラム内の料理献立をAccessへの取込、取り込んだExcelの料理データテーブルから料理マスターテーブルと料理明細テーブルに移し替えなどついて紹介してきました。
次は、これまでの料理関係とは直接関係しませんが、健康を考える上では必要なBMI、理想体重、基礎代謝量、一日の総消費カロリーなどを年齢、性別、身長、運動量などを記入して、計算・表示させるフォームをAccessで作成して見たいと思います。
お楽しみに・・・。
以上です。
コメント