生産管理に使えるツール

  • 100社あれば100種類の生産管理があります。ものづくりの技術が各企業の固有技術であるように、生産管理も各企業の固有技術であるといえるでしょう。
  • そしてそれをシステムとして稼働させた場合、INPUT、OUTPUTが優先となり、計画立案者の考えるツールが後回しになってしまう場合が多いのではないでしょうか?
  • ここではVBAにこだわらず、考えるツールをいくつか提案いたします。

 1.スケジュール管理(投入管理)

 

  • どのような順序で何をいくつ作るかは計画に関わる担当者にとっては大きな問題です。
  • スケジュール管理には投入(着手)管理と進捗管理に分けて考えられると思いますが、ここでは前者について提案をします
  •  下記表は上からSheet1,Sheet2,Sheet3
  • A~F  各生産計画に必要な稼働時間(作業時間)です。必要に応じて段取り時間、初物検査時間などを追加します 
  • G、H列 前行の I列、M列時間(または1分追加した時間です)
  • I列     このシートの最大の問題点です。 

F列(累計生産時間)が2番目のシートの何行目に相当するかを表示しています

2番目のシートD列のとおり、この生産ラインの稼働時間は1日480分です(5月8日は240分)

1番目のシート5行目を参照願います。累計生産時間は840分ですから2日目に完了しますが

これを算出する簡単な関数がないのです

   VLOOKUP関数ではG5でSheet2のB列を検索した場合

   =VLOOKUP(F5,Sheet2!B:C,2,1) では1日前の4月27日が算出されてしまいます

   もし下記のような式が認められれば 4月28日が算出できるのですが、残念ながら

   そのような式は認められていません。

     =VLOOKUP(F5,Sheet2!B:C,2,-1)

   F5の値と同じ値がなかった場合、その値より大きい最小の値を求めるには

   Match関数しかないのです

   

   結局G5には次のような式が入ります。Matchには上記機能がありますがその代わり

   参照する対象列が降順にソートされている必要があるのです

   そこであらかじめSheet2のB:C列をF:G列にコピーして降順ソートしておきます。

      =INDEX(Sheet2!G:G,MATCH(F5,Sheet2!F:F,-1)) 

   実際にはここはメンテナンス漏れの危険性が大きいため、シートチェンジを

   イベントとしてイベントプロシージャを組み込みます

 J列 =VLOOKUP(F5,Sheet2!B:B,1,1)

    前日までの作業時間を算出します

 K列  =F5-J5

    累計作業時間から前日までの作業時間を引いて当日作業時間(分)を求めます

 L列   =VLOOKUP(K4,Sheet3!A:B,2,0)

    当日の作業分数から終了時間を求めます

    昼休みや休憩時間を加味するために完了時間のテーブルを参照します

    1分1行設定しなければいけませんが最大で1440行です 24X60分

    残業を加味して最大時間数で設定願います

    実際に各日何分稼働するかSheet2のD列でコントロールします

ご要望があればメールで要求して頂ければ元のシートを転送致します

(不特定多数の方にマクロファイルのリンクを張るのははばかれますので控えさせて頂きます)     

 

 2.ガントチャートの作成(投入管理)

 

  • 上記の表で各手配の着手日・時間、完了日・時間は算出できますが、各日にどこまで完了する必要があるかは分かりません。
  • そこで1日単位での進捗目標を作成します。
  • 材料はSheet1のA~E列、とSheet2のC,D列です。
  • 考え方 今回は全てマクロを使用します

カレンダー(Sheet2)を1件ずつ読み込み、その操業分で生産可能な手配にその日をセットします

もしその日に終わらなければ1行追加(挿入)して、生産仕切れなかった時間を翌日に繰り越します。

生産数量は操業分数とタクトタイムで逆算します。

  • 同種の複数ラインがあれば段取り替えのタイミングが見やすくなります。
  • より高速なラインならば日単位ではなく時間単位での運用も可能です。
  • 以下が生産結果とそれに使用したマクロです。ロジックを少しでも見やすくするため高速化とエラー回避のルーチンは組み込んでいません。

 

上記表をピポットテーブル機能で編集

Sub TEST27()

 Dim i, j, k, MaxRow, Max2 As Long

Dim W_CDAY As Date

Dim W_CFUN, W_CSEQ As Long

 

'計算結果ファイルの初期クリアー

Sheets("Sheet5").Select

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

 Range("A2:Z" & MaxRow).Clear

 'スケジュールシートを計算結果ファイルにコピーする

Sheets("Sheet1").Select

 MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range("A3:E" & MaxRow).Copy Sheets("Sheet5").Range("A1")

 ''操業カレンダーファイルの初期参照

Sheets("Sheet2").Select

k = 3

 If Cells(k, "D") = 0 Then Exit Sub

 W_CDAY = Cells(k, "C")

W_CFUN = Cells(k, "D")

 Range("C1").Copy Sheets("Sheet5").Range("F1")

 '計算ファイルに対する処理

 Sheets("Sheet5").Select

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

 i = 2

 Do While i <= MaxRow

 '該当する手配の所要ninitsがカレンダーのminitsより多かった場合

 If Cells(i, "E") > W_CFUN Then

 j = i + 1

 Rows(j).Insert

MaxRow = MaxRow + 1

 Cells(j, "A") = Cells(i, "A")   '次行製造手配番号

Cells(j, "B") = Cells(i, "B")   '次行製品名

Cells(j, "D") = Cells(i, "D")  '次行TACT

 Cells(j, "E") = Cells(i, "E") - W_CFUN  '次行作業分数繰り越し

 Cells(i, "E") = W_CFUN    'この行のminits

Cells(i, "F") = W_CDAY    'この行の日付

   Cells(i, "C") = Cells(i, "E") / Cells(i, "D")  'この行の生産数量

  W_CFUN = 0

 

 '該当する手配の所要minitsがカレンダーのminits以下だった場合

   Else

    W_CFUN = W_CFUN - Cells(i, "E")    'この日に使えるminitsを減算する

  Cells(i, "F") = W_CDAY

  Cells(i, "C") = Cells(i, "E") / Cells(i, "D")

   End If

 ' 当該日のminitsを使い果たしたら、翌日を参照する

 If W_CFUN = 0 Then

  Sheets("Sheet2").Select

    k = k + 1

   W_CDAY = Cells(k, "C")

  W_CFUN = Cells(k, "D")

   Sheets("Sheet5").Select

End If

   i = i + 1

  Loop

 End Sub