掲載ファイルは、プログラムでEドライブから開きますから
どのファイルも、Eドライブに左側の名前で保存してください。
プログラムを変更すれば、他のドライブに保存可能です。
掲載参考 EXCEL ファイルダウンロード
1. A-10標準部品在庫帳.xlsm
2. 基本使用数台帳.xlsm
3. 製番別−標準部品使用数台帳A-10-1.xlsm
4. 手配部品一覧.xlsm
P1シートの最終列の次の列に罫線を引いて、7行目に「手配数」と書いて、
設定シートの「手配回数」を繰り上げて、E列の「手配列番号」に列番号を書いて、
B列の「次の列追加位置」を繰り上げる。

続きのページへ移動
JumpEnd:
Set myRange=Nothing ' 変数の解除
Sheets("P1").Select
Range("H3").Selact
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveSheet.EnableSelection=xlUnlockedCells ' シート保護
Application.ScreenUpdating=True
If Flag2=1 Then Call 手配一覧作成 ' 手配一覧表の作成と印刷
End Sub
[再手配列追加]マクロ


[手配判定と手配]マクロ2

If Sheets("P1").Range("P" & i)="" Then '
P1のP列は手配ロット数の列で記入されて
' いればその数値で手配する。
TeHai = MaxZ − endZS − Mtot ' ロット数がない場合の新規手配数計算
' 最大在庫数−最右残数−未入荷数
Else
TeHai=Sheets("P1").Range("P" & i) ' ロット数があればその数値で手配する。
End If
[手配判定と手配]マクロ3

Call 手配判定と手配 ' 出庫処理を行った時の残数を、最小在庫数と比較して、手配が必要か
' どうか確認し必要なら手配を行うサブマクロの呼出。
[手配判定と手配]マクロ1
※このマクロは、出荷や不良で在庫数が減少した時に、残数と最小在庫数設定値とを
比較して、残数が下回ると自動手配を行うものである。
下の様に、不良が発生して在庫数が減少した時に、残数再計算で手配判定を行っている。
(P1シート)
(設定シート)
If Sheets("設定").Range("B8") <> "" Then '
B8が空白でなかったら
If Sheets("設定").Range("B9") <> ""
Then ' B9が空白でなかってら
intRowZ=Sheets("設定").Range("B8").End(xlDown).Row '
B列の最下行番を取得
Else
intRowZ=Sheets("設定").Range("B8") ' B8は一番左の残数位置は19列目
End If
End If
endLT=Sheets("設定").Range("B" & intRowZ) ' 残数位置が入る。
MinZ=Sheets("P1").Range("K" & i) ' 最小在庫数
MaxZ=Sheets("P1").Range("L" & i) ' 最大在庫数
endZS=Sheets("P1").Cells(i, endLT) ' 最右残数位置
' 入荷数合計------------
Ntot=0
If Sheets("設定").Range("F4") <> 0 Then '
入力回数が 0 で無かったら
Nka=Sheets("設定").Range("F4")
For i2=7 To 6 + Nka ' i2 を 7 から 6 + 入荷回数まで
SCol=Sheets("設定").Range("F" & i2) ' F7の
20 をSColへ代入する。
Nyu=Sheets("P1").Cells(i, SCol) ' P1の20列の8行目をNyuに代入
If Sheets("P1").Cells(i, SCol)="" Then Nyu=0 ' 空白ならNyuは
0
Ntot=Ntot + Nyu ' 入荷数をNtotに加算する。
Next
Else
Ntot=0 ' 入荷数が 0 ならNtotは 0
End If
' 手配数合計-------------
TeTot=0
If Sheets("設定").Range("E4") <> 0 Then
Tki=Sheets("設定").Range("E4")
For i2=7 To 6+Tki
TCol=Sheets("設定").Range("E" & i2)
Teh=Sheets("P1").Cells(i, TCol)
If Sheets("P1").Cells(i, TCol)="" Then Teh=0
TeTot=TeTot + The ' 手配数の合計に手配数を加算
Next
Else
TeTot=0
End If
' 手配判定-------------
Mtot=Tetot − Ntot ' 手配数−入荷数=未入荷数
If endZS + Mtot > MinZ Then GoTo JumpN1 ' 最右残数 + 未入荷数が最小在庫数より
' 大きかったらJumpN1へ
If Mtot < 1 Then Mtot=0
If endZS + Mtot < MinZ Then ' 最右残数 + 未入荷数が最小在庫数より
' 小さかったら手配が必要になる。
ZanK=endZS + Mtot ' 最右残数 + 未入荷数 = ZanK
If Flag2=0 Then ' Flug2は変数定義してあるが、初期値を定義してないので
' 1 にしない限り 0 である。0 の場合は、手配が必要でも
' まだ手配列がないから、作成する必要がある。。
Flag2=1 ※ 8行目から最下行まで見てゆく。最初の行で手配列が作成
されるので、次の行では列が作成されないように、Flag2を
見て、1 なら作成しない。
Call 再手配列追加 ' Flag2が 0 なら手配列が作成される。
●違う在庫帳を見てみよう21列は20列の入庫の残数で、中間にある入庫列である。

この場合、[8.中間列入庫残数再計算]マクロが使用される。

ZS=Sheets("P1").Cells(i2, DTC2) ' 前回の19列の残数
Sheets("P1").Cells(i2, DTC).Value = ZS + Sheets("P1").Cells(i2,
DTC)
' (19列の残数 5 ) + (20列の入庫数 2) = ( 7 ) が21列の残数に記入される。
※出庫と入庫では、在庫の数量が変化する。その時に在庫残数が何個になるにかを計算する
のが残数計算である。その時に、表全体の残数が本当に正確なのかを確認し、修正する
のが残数再計算である。在庫帳では、最も重要な数値であるから、再計算は必要であろう。
----------------------------------------------------------------------------------------------------
ZS=Sheets("P1").Range("H" & i2) ' 初期の在庫数
Sheets("P1").Cells(i2, 18).Value = ZS + Sheets("P1").Cells(i2,
17)
' (初期在庫数 6) + (17列の入庫数 1) = ( 7 ) が18列の残数に記入される。
※最左の入庫列である限り、入庫列は17列目で、残数列は18列目と決まっているので、
入庫列も残数列も位置が固定されている。
-----------------------------------------------------------------------------------------------------
ZS=Sheets("P1").Range("H" & i2) ' 初期の在庫数
Sheets("P1").Cells(i2, 20).Value = ZS + Sheets("P1").Cells(i2,
19)
' (初期在庫数 6) + (19列の入庫数 1) = ( 7 ) が20列の残数に記入される。
※左に手配列二つがあり、最左の入庫列である限り、入庫列は19列目で、残数列は20列目と
決まっているので、入庫列も残数列も位置が固定されている。
-----------------------------------------------------------------------------------------------------
●違う在庫帳を見てみよう18列は17列の入庫の残数で、最も左にある入庫列である。

この場合、[7.最左入庫残数再計算]マクロが使用される。
ZS=Sheets("P1").Range("H" & i2) ' 初期の在庫数
Sheets("P1").Cells(i2, 20).Value=ZS−Sheets("P1").Cells(i2,
19)
' (初期在庫数 6) − (19列の入庫数 1) = ( 5 ) が20列の残数に記入される。
※左に手配列二つがあり、最左の出庫列である限り、出庫列は19列目で、残数列は20列目と
決まっているので、出庫列も残数列も位置が固定されている。
-----------------------------------------------------------------------------------------------------
●違う在庫帳を見てみよう。20列は19列の入庫の残数で、最も左にある入庫列である。
又、左に手配列が二つある。

この場合、[6.左手配列2、最左入庫残数再計算]マクロが使用される。

ZS=Sheets("P1").Range("H" & i2) ' 初期の在庫数
Sheets("P1").Cells(i2, 19).Value=ZS + Sheets("P1").Cells(i2, 18)
' (初期在庫数 6) + (18列の使用数 1) = ( 7 ) が19列の残数に記入される。
※左に手配列があり、最左の入庫列である限り、入庫列は18列目で、残数列は19列目と
決まっているので、入庫列も残数列も位置が固定されている。
-----------------------------------------------------------------------------------------------------
●違う在庫帳を見てみよう。20列は19列の出庫の残数で、最も左にある出庫列である。
又、左の手配列が二つある。

この場合、[5.左手配列2、最左出庫残数再計算]マクロが使用される。
※初期の在庫帳で、左に手配列が二つも来る理由は、更新時に前月の手配数が完納されずに
繰り越した場合で、更新計算でその手配数では、最小在庫数に満たない場合に再手配される。

ZS=Sheets("P1").Range("H" & i2) ' 初期の在庫数
Sheets("P1").Cells(i2, 19).Value=ZS−Sheets("P1").Cells(i2,
18)
' (初期在庫数 6) − (18列の使用数 1) = ( 5 ) が19列の残数に記入される。
※左に手配列があり、最左の出庫列である限り、出庫列は18列目で、残数列は19列目と
決まっているので、出庫列も残数列も位置が固定されている。
-----------------------------------------------------------------------------------------------------
●違う在庫帳を見てみよう。19列は18列の入庫の残数で、最も左にある入庫列である。
又、左の手配列がある。

この場合、[4.左手配列、最左入庫残数再計算]マクロが使用される。

※上の在庫帳では、[3. 左手配列、最左出庫残数再計算]の列配置にならないので、別の
在庫帳で見てみよう。
●19列は18列の出庫の残数で、最も左にある出庫列である。又、左に手配列がある。

この場合、[3.左手配列、最左出庫残数再計算]マクロが使用される。

●26列は25列の出庫の残数である。中間にある列である。

この場合も、[2.中間列出庫残数再計算]マクロが使用される。
ZS=Sheets("P1").Cells(i2, DTC2) ' 前回の残数列23の残数 = 4
Sheets("P1").Cells(i2, DTC).Value=ZS−Sheets("P1").Cells(i2,
DTC1)
' (23列の残数4) − (25列の使用数 0) = ( 4 ) を26列の残数に記入される。
-----------------------------------------------------------------------------------------------------
●23列は22列の出庫の残数である。中間にある列である。

この場合も、[2. 中間列出庫残数再計算]マクロが使用される。
ZS=Sheets("P1").Cells(i2, DTC2) ' 前回の21列の残数 = 5
Sheets("P1").Cells(i2, DTC).Value = ZS−Sheets("P1").Cells(i2, DTC1)
' (21列の残数5) − (22列の使用数 1) = ( 4 ) を23列の残数に記入される。
-----------------------------------------------------------------------------------------------------
[2. 中間列出庫残数再計算]マクロ

ZS=Sheets("P1").Cells(i2, DTC2) ' 前回の18列の残数 = 6
Sheets("P1").Cells(i2, DTC).Value = ZS−Sheets("P1").Cells(i2, DTC1)
' (18列の残数6) − (20列の使用数 1) = ( 5 ) を21列の残数に記入される。
-----------------------------------------------------------------------------------------------------
8行目から順に下へ、空白行、青色行、赤色行を除外して、残数を計算して記入して行く。
ZS=Sheets("P1").Range("H" & i2) ' H列は初期の残個数である。
Sheets("P1").Cells(i2, 18).Value = ZS−Sheets("P1").Cells(i2,
17)
' (初期在庫数 6)− (17列の使用数0) = ( 6 )を 18列の残数に記入される。
Call 標準部品使用数台帳に転記 ' 使用数台帳に記入する。
-----------------------------------------------------------------------------------------------------
●21列は20列の出庫の残数である。中間にある列である。

この場合、[2.中間列出庫残数再計算]マクロが使用される。
[1. 最左出庫残数再計算]マクロ

※現在の在庫帳P1シートの現状に沿って、残数計算を見てゆこう。
●18列は17列の出庫の残数である。一番左にあることが分かる。

この場合、[1.最左出庫残数再計算]マクロが使用される。
※残数は、在庫帳の中でも一番重要な数値である。担当者が出庫数や入庫数を何気なく
変更した場合でも、それに対応した、正確な残数値でなくてはならない。
だから、ここでは入出庫時には、必ず一番左の列から残数の再計算を行い書き直して
いる。
残数の再計算は、現在計算する列の前に、入庫、出庫、手配の列が存在する可能性が
ある。そのために現在計算する残数列位置の、前の列に何が存在するのかが分かって
いなければならない。そのために設定シートに、出庫、手配、入庫の旅に列情報を記入
している。残数の計算を行うのは、出庫と入庫だけである。
残数の位置によって、計算式は8種類に分類できる。だから8種類のマクロを作成して分岐
させる事が考えられる。
1. 最左出庫残数再計算 (一番左の出庫列)
2. 中間列出庫残数再計算 (中間にある出庫列)
3. 左手配列、最左出庫残数再計算 (左に手配列があり、一番左の出庫列)
4. 左手配列、最左入庫残数再計算 (左に手配列があり、一番左の入庫列)
5. 左手配列2、最左出庫残数再計算 ( 左に手配列が2列以上あり、一番左の出庫列)
6. 左手配列2、最左入庫残数再計算 ( 左に手配列が2列以上あり、一番左の入庫列)
7. 最左入庫残数再計算 ( 一番左の入庫列)
8. 中間列入庫残数再計算 ( 中間にある入庫列)
Sheets("P1").Cells(i, intCol).Select ' 黄色になっているセルを選択する。
With Selection.Interior
.Pattern = xlNone ' セルの色を無くしている。
End With
[残数再計算]マクロ


[手動出庫の色変更]マクロ

[残数計算]ボタンマクロ

製番と納期、出庫数を入力して[残数計算]ボタンを押すと
残数列に残数が記入される。

前回の残数から今回の出庫数を減算して、残数が割り出されている。
(P1シートに入力後残数計算フォームが表示された状態)

入力後残数計算.Show vbModoless
' 入力後残数計算フォームを移動可能状態で表示する。
[文字右寄せ]マクロ
[文字中心]マクロ
[手動入力 個別出庫]ボタンマクロ

製番列と残数列が25と26列目に作成された。
Columns(T1).Select ' T1=25 で列全体を選択する。
Selection.ColumnWith = 12 ' 文字の大きさを 12 に設定する。
Columns(T1 + 1).Select ' 25+1 の列を選択する。
Selection.ColumnWith = 8 ' 列幅を少し狭く 8 にしている。
Range("Cells(8, T1). Cells(intRow, T1 + 1)).Select ' 25列の8行目から、26列の最下行までを
' 選択する。
Call 文字右寄せ
intRow=Sheets("P1").Range("D1000").End(xlUp).Row
Sheets("P1").Range(Cells(5, T1), Cells(intRow, T1+1)).Select '
以下のコードで罫線が引かれる。
Selection.Borders(xlDiagonalDown).LineStyle=xlNone
Selection.Borders(xlDiagonalUp).LineStyle=xlNone
(P1シート) ' P1シートの25列目は空白になっている。
T1=Sheets("設定").Range("B4") ' 設定シートのB4に、次の列追加位置が
(設定シート) ' 書いてあので、それを取得している。

[出庫と入荷列追加]マクロ

Worksheets("P1").Cells(6, N).Select ' 使用列を選択する。
Application.MoveAfterReturnDirection=xlDown
' エンターを押した時に下のセルが選択されるようにする。
End Sub
(設定シート)

K2=Worksheets("設定").Range("D4") ' 現在の使用回数を記憶する。
Worksheets("設定").Range("D4").Value= K+1 ' 使用回数を繰り上げる。
Worksheets("設定").Range("D" & K2+7).Value=N ' 新規の使用列番号25を書く。
Worksheets("設定").Range("B4").Value=Worksheets("設定").Range("B4")+2
' B4に次回の最右列挿入位置を書く
intRow5=Sheets("設定").Range("B50").End(xlUp).Row+1
' B列の最下行番号 +1を書く。
Worksheets("設定").Range("B" & ntRow5).Value=N+1
' B列の最下行に残数列位置を書く。
(色の付いた青色行と文字)

intRow=Sheets("設定").Range("R6").End(xlDown).Row '
最下行番号を取得
intRow2=Sheets("設定").Range("S6").End(xlDown).Row
intRow3=Sheets("設定").Range("Q6").End(xlDown).Row
For i=7 To intRow ' 表内の青色行位置を順に選択して、色を付ける。
RG=Sheets("設定").Range("R" & i)
Sheets("P1").Range(Cells(RG, N), Cells(RG, N+1)).Select ' 範囲選択
Call 青色行
Sheets("P1").Cells(RG, N).Value="使用数" ' 使用数と書く。
Sheets("P1").Cells(RG, N).Select
With Selection
.HorizontalAlignment=xlCenter
End With
Sheets("P1").Cells(RG, N+1).Value="残数" ' 残数と書く。
Sheets("P1").Cells(RG, N+1).Select
With Selection
.HorizontalAlignment=xlCenter ' 文字位置をセンターにする。
End With
Next
For i=7 To intRow2 ' 表内の赤色行位置を順に選択して、色を付ける。
SG=Sheets("設定").Range("S" & i)
Sheets("P1").Range("Cells(SG, N), Cells(SG, N+1)).Selsct
Call 赤色行
Next
在庫表内の青色行、赤色行、空白行の位置が
記録されている。
(設定シート)

Sheets("P1").Cells(4, N).Value = N ' 25列目の4行目に行番号25を記入する。
Sheets("P1").Cells(5, N).Value = "製番" ' 25列目の5行目に製番と、記入する。
Sheets("P1").Cells(5, N).Select
Call 文字中心 ' 製番文字を中心に配置する、サブマクロ
Sheets("P1").Range("Cells(8, N),Cells(intRow, N)).Select
With Selection.Interior ' 25列目の8行目から最下行までのセルを
.Color=13434879 ' 朱色にする。
End With
Sheets("P1").Cells(6, N+1).Select ' 25+1=26列目の6行目選択する。
Selection.NumberFormatLocal="m/d;@" ' 日付セルなので、11/6 の様に表示される
' ように設定している。
Worksheets("設定").Range("C4").Value=N2+2 ' 設定シートの次回の残数列番号を加算しておく。
(設定シート)

(P1シート)

Active Windows.WindowState = xlNormal ' ウインドウの表示を標準にする。
' 表示を手動で拡大や縮小しているかもしれない。
Unload 入出庫操作 ' フォームの非表示
Sheets("P1").Select
intRow = Sheets("P1").Range("E1000").End(xlUp).Row '
最新の行数を取得する。
ActiveSheet.Unprotect ' 保護の解除
Application.ScreenUpdating = False ' マクロ実行時に画面を固定する。
Call 出庫と入庫列追加 ' サブマクロの実行
N = Worksheets("設定").Range("B4") ' 設定シートの B4 = 25
を取得する。
N2 = Worksheets("設定").Range("C4") ' 設定シートの C4 = 26
を取得する。
K = Worksheets("設定").Range("D4") ' 設定シートの D4 = 3
を取得する。
[一台分出庫]フォームには、個別出庫と一式出庫がある。
[個別出庫]は、出庫する部品を自分で選択して、出庫列セルに出庫数を記入する方法である。
修理部品の出庫など、必要な部品を選択して必要な数量を出庫するときに向く。
[一式出庫]は、製番の商品を一台分まとめて出荷するものである。この時に先に設定した
オプションが付く場合には、どのオプションを付けるかの選択が表示される。
すべての部品が、一台に必要な数量を計算されて入力される。
[手動入力 個別出庫]ボタンマクロ

Unload 入出庫操作 ' 入出庫操作フォームを非表示にする。
一台分出庫.Show vbModeless ' 一台分出庫フォームを移動可能状態で表示する。

(設定シートB7)

If Sheets("設定").Range("B7") = 1 Then
' 設定のB7に1が入っている時には、[手配確定]
' ボタンを押さなくてはならない、理由は手配処理
' の時に説明します。
[出庫入力]ボタンマクロ
■使用開始前設定の[操作フォーム]と[入出庫操作フォーム]
■入出力操作フォームの説明
●出庫入力の操作
' MsgBox の myAns には [OK] と [キャンセル]で返り値が
' 変わります。 OK=1 キャンセル=2 です。
' If myAns = 2 Then Exit Sub は、返り値が2の場合は、
' メッセージを表示しないで、マクロを終了します。
※ & vbCrLf _ の下線は文字数が長くて折り返す場合に使用し、
半角英数で、シフトを押しながら [ろ] ボタンを押します。
myAns=MsgBox("使用開始点に戻ります。" & vbCrLf _
"OKを押せば入出庫データは消去されます。", vbOKCancel)
If myAns = 2 Then Exit Sub
※[使用開始]マクロは、
1. [設定]シートの列に関するデータを初期に戻し、P1シートをP2シートにコピーする。
これは、P1シートに問題が発生した場合の予備保存である。
2. 品名すべての初期在庫数を、最小在庫数と比較して不足している場合には手配する。
[使用開始]マクロ2
[使用開始]マクロ1

CB使用開始.Visible = False ' [CB使用開始]ボタンが非表示になる。
CommandButton.Visible = True ' [CommandButton1]が表示される。
※使用開始後、間違って[使用開始]を押せないように非表示にしている。
そのために、[CommandButton1]で再度表示できるようにしている。
[CB使用開始]マクロ

警告が表示されるが、[OK]を押せば初期化せれます。[キャンセル]では中止します。
[使用開始]とは、在庫帳の初期設定が完了した状態から、実際に使用する状態に表と設定を
更新します。初期設定後、使用数や手配などの入力テストを行っていて、表に数値が記入され
ていても、初めて使用する状態に戻します。
[使用開始]ボタンを押した状態。

●使用開始
※イニシャライズは、フォームが開かれた時に、何をするのかを設定する。
テキストボックスは、開いたときに空白にしておかないと、前回入力されたままで
保存された場合には、値が入っていることになる。
' TextBox1="" はフォームを表示した時に、
' テキストボックスの値を空白にする。
' J17に値があれば、既に設定されている。
[イニシャライズ]マクロ
[OP設定]フォームを非表示にする。
Cancel]ボタンマクロ

[設定内容が見たい]ボタンマクロ

※メッセージボックスの文字の折り返しは、vbCrLfを書く。
vbOKCancelと書けば、[OK]と[キャンセル]ボタンが表示される。
そのどちらのボタンが押されたかの判定をする。
If 警告 = vbCancel Then Exit Sub ' [キャンセル]ボタンが押されたらプログラム終了。
Sheets("設定").Range("J17:K20").ClearContents ' 設定範囲の値だけを消す。
If TextBox1 <> "" Then Sheets("設定").Range("J17").Value
= TextBox1.Text
If TextBox2 <> "" Then Sheets("設定").Range("K17").Value
= TextBox2.Text
If TextBox3 <> "" Then Sheets("設定").Range("J18").Value
= TextBox3.Text
If TextBox4 <> "" Then Sheets("設定").Range("K18").Value
= TextBox4.Text
' テキストボックスの値を設定シートに記入する。
intTB =0
If TextBox1.Text <> "" Then intTB = intTB + 1 ' テキストボックスが空白でなかったら
If TextBox2.Text <> "" Then intTB = intTB + 1 ' intTBに
1 を加える。
If TextBox3.Text <> "" Then intTB = intTB + 1
If TextBox4.Text <> "" Then intTB = intTB + 1
If intTB = 0 And Sheets("設定").Range("K27") = 1 Then '
intTB = 0 で K27が 1 ならメッセージ
' ボックスが表示される。
※intTB変数は、テキストボックスに値が入っているのかを調べるためにあり、それによって
メッセージボックスを表示するか、しないかを決めるものである。
Sheets("設定").Range("K27")=1 ' 品番設定を行ったので Flag2 のK27に
1 を記入する。
※ここを見れば、設定が終わっているのが確認できる。
[変更して実行]ボタンマクロ

(OP設定フォーム) テキストボックスの名称
[オプション 部品設定]ボタンマクロ

OP設定.Show vbModeless ' OP設定フォームを移動可能状態で表示する。
[設定シート]
[オプション出庫警告]フォーム

※オプション部品とは、商品に特定の機能を付加する場合に必要になる部品で、すべての製番には
使用しないので、出庫の操作をする時に、オプション出荷警告が表示される。
その時に、オプション名にチェックを付けると、自動で出庫してくれる。
部品名は、初期設定で設定シートに記載されている。
●オプション部品の設定

※UserForm_Initializeはスライダーで表示し、リストから選択する。
左側に UserForm 、右側に Initialize を選択すると、
Private Sub UserForm_Initialize( ) が自動でできる。
(フォームの UserForm と Initialize の表示方法)

Private Sub CMcan_Click( )
Unload 最大、最小在庫数計算 ' 最大、最小在庫数計算フォームを非表示にする。
Range("K3").Select
画面.Show vbModeless ' 画面フォームを移動可能状態で表示する。
End Sub
Private Sub UserForm_Initialize( )
If Sheets("P1").Range("M3") <> "" Then ' M3が空白でなかったら
TBmsg.Text="設定済み" ' テキストボックスに「設定済み」を書く
Else
TBmsg.Text="設定してください" ' M3が空白なら
End If
End Sub
[Cancel]ボタンと[Initialize]マクロ
If Len(Sheets("P1").Range("M3"))=3 Then ' M3の文字(4〜7)の文字数が3なら
T1.Text=Left(Sheets("P1").Range("M3"), 1) ' 左から1番目文字4をT1に書く
T2.Text=Right(Sheets("P1").Range("M3"), 1) ' 右から1番目の文字をT2に書く
End If ' T1.Text=4, T2.Text=7になる。
If Len(Sheets("P1").Range("M3"))=4 Then ' M3の文字数が4なら
T1.Text=Left(Sheets("P1").Range("M3"), 1)
T2.Text=Mid(Sheets("P1").Range("M3"), 3, 4) ' 左から3番目と4番目をT2に書く
End If ' 5文字の場合は、左が1桁で右が2桁のはずである。
(P1シート)
[設定値を見たい]ボタンマクロ
If Cells(i, 13)="" And Cells(i, 14)="" And Cells(i,
15)="" Then GoTo Jump
' どの機種にも数値が無いとGoTo Jump へ移動する。
' 複数の機種で同じ部品を使用している場合もある。
If Cells(i, 9)="" Then ' 9列目は単価
MsgBox i & "行目が単価未入力" ' i 行目が単価未入力と表示する。
Unload 最大、最小在庫数計算 ' フォームを非表示にする。
Exit Sub ' 単価が書いていないと終わる。
End If
intMin=(A10Min * Cells(i, 13)) ' A10Minは入力値で、一台当たりの数値と
Cells(i, 11).Value=intMin ' 積算して最小在庫数に記入する。
intMax=(A10Max * Calls(i, 13))
Cells(i, 12).Value=intMax ' 積算して最大在庫数を記入する。
Jump:
Next
Cells(3, 13)=A10Min & "〜" & A10Max ' 13列の3行目に見やすく書いている。
Range("K3").Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveSheet.EnableSelection=xlUnlockedCells
' 間違って消せないように、セルの書式設定でセルのロックを設定している。
ActiveWorkbook.Save ' 上書き保存
Application.ScreenUpdating=True ' プログラム実行中の画面移動制限を解除
End Sub
TBmsg.Text="" ' テキストボックスを空白にしておく。
application.ScreenUpdating=False ' マクロ実行中に画面移動を無くして置く。
A10Max=T2.Text ' 設定が済の場合は、テキストボックスに値が
A10Min=T1.Text ' あるので、それに備えて変数に保存しておく。
Sheets("P1").Select ' 在庫帳シート
ActiveSheet.Unprotect ' 保護の解除
intRow=Range("D500").End(xlUp).Row ' 品番列の最終行番号を取得する。
For i=8 To intRow ' P1シートの8行目から下へintRowまで
For i21=7 To intRow2 ' 無色行 ' i=8 の時 i21=7
intQ=Sheets(設定").Range("Q" & i21) ' 設定のQ7は23だから
intQ=23
If intQ=i Then GoTo Jump ' i が23になった時に intQ と同じに
Next ' なるので、GoTo Jumpになる。
For i22=7 To intRow3 ' 青色行
intR=Sheets(設定").Range("R" & i22) ' i22=7 の時 R7
は26である。intR=26
If intR=i Then GoTo Jump ' i が26になった時は青色行である。
Next
For i23=7 To intRow4 ' 赤色行
intS=Sheets(設定").Range("S" & i23) ' i23=7 の時 S7
は84である。intS=84
If intS=i Then GoTo Jump ' i が84になった時は赤色行である。
Next
Range(Cells(i, 11),Cells(i, 12)).ClearContents ' 最小と最大の数値を消している。
※P1シートの11列目は最小在庫数の列で、12列目は最大在庫数の列である。
13列目に一台に使用する部品の数量が書かれている。
だから、各行の最大数も最小数も、入力値に一台に必要な数量を積算して算出している。
(P1シート)

If T1.Text="" Then
TBmsg.Text="台数がに入力"
End If
' T1内のテキストは、T1.Text と指定する。
' 空白の場合は、TBmsg に警告を書く。
' T1が空白なら、プログラムを終了する。
(フォーム内のテキストボックスの名称)
' 設定シートのQ列とR列、S列には在庫帳の
タイトル行や空白行の位置が書かれている。
[初期設定]で取得される。
※このプログラムは、入力された台数分の個数を
Pシートの各行に記入して行くもので、8行目
から下へ順に記入して行くが、空白行や青色行
や赤色行には数値を記入してはいけないから、
その行を飛ばして下に移動している。
(設定シート)

IntRow2=Sheets("設定").Range("Q6").End(xlDown).Row
IntRow3=Sheets("設定").Range("R6").End(xlDown).Row
IntRow4=Sheets("設定").Range("S6").End(xlDown).Row
' 設定シートのQ,R,S 各行の最下行番号を調べて intRow に代入する。
「一台に必要な部品数量」が記入されていると、最小数と最大数をテキストボックスに入力し、
[計算実行]ボタンを押せば、各部品行に数値が記入される。
又、[設定値を見たい]ボタンを押せば、現在の設定数がテキストボックスに表示される。
[計算実行]ボタンマクロ

最大、最小在庫数計算.Show vbModeless ' vbModeless は表示位置を移動可能になる。
(最大、最小在庫数計算)フォームが表示された状態

[最小、最大在庫数設定]ボタン押せば、在庫数計算フォームが表示される。
●最小、最大在庫数の設定
[最小、最大在庫数]を設定して置くと、在庫残数が最小になると最大数まで手配処理される。

※実際に使用されると、使用数欄に製番ごとの使用数が記入されて保存される。
出庫されるたびに、G7から右に製番と使用数が記入されて保存される。
※基本使用数台帳に品名などの項目が転記されて、製番別−標準部品使用数台帳になる。
使用数欄には、出荷がまだないので記入されていない。
(製番別−標準部品使用数台帳A−10−1.xlsm のシート)

(製番別−標準部品使用数台帳A−10−1.xlsmのシート)
(基本使用数台帳のシート)
※ここでは基本使用数台帳.xlsmと言うファイルに、在庫帳のP1の項目をコピーして
新しい[製番別−標準部品使用数台帳]ファイルとして保存している。
Workbooks.Open Filename:="E:\基本使用数台帳.xlsm"
Windows(myName).Activate
Range("D8:E" & intRow).Copy
Windows("基本使用数台帳.xlsm").Activate
Sheets("P1").Range("B8").Select
ActiveSheet.Paste
Windows(myName).Activate
Sheets("P1").Select
Range("I8:I" & intRow).Copy
Windows(基本使用数台帳.xlsm).Activate
Sheets("P1").Range("D8").Select
ActiveSheet.Paste
Application.CutCopyMode=False
Windows("基本使用数台帳.xlsm").Activate
ActiveWorkbook.SaveAs Filename:="E:\" & NFname, FileFormat:=
_
xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
※E:\製番別−標準部品使用数台帳A−10−1.xlsmとして保存している。
Sheets("設定").Range("M4")=Sheets("設定").Range("M4") + 1
NFname = Sheets("設定").Range("M6")
[設定]のM4には初期値で、0が入っている。それに1を加えてM4に記入する。
[設定]のM6には関数が入っていて、製番別−標準部品使用数台帳A−10−1.xlsmと
表示される。
そのファイル名が NFnameに代入される。
※ファイルを作成するたびに、連番でファイル名が作成される。
(設定シート)

[中間タイトル行の自動取得]マクロ3

If Sheets("P1").Range("D" & OPBT1 + i2)="" Or Sheets("P1") _
.Range("D" OPBT1 +i2) =" " Or Sheets("P1")
_
.Range("D" & OPBT1 + i2) = " " Then
※このコードの 「="" Or 」の部分は、78行の空白セルに当たった時に、それが空白なのか、
半角スペースなのか、全角スペースなのか、分からないのでそれを調べている。
(設定シート)
(P1シート)
If Sheets("P1").Range("D" & i)= "オプション1"
Then
OPBT1= i + 1
Sheets("設定").Range("J17").Value=OPBT1
If OPBT1 <> "" Then
For i2 = 1 To 10
If Sheets("P1").Range("D" & OPBT1 + i2)=""
Or Sheets("P1") _
.Range("D" OPBT1 +i2) =" " Or Sheets("P1")
_
.Range("D" & OPBT1 + i2) = " " Then
Sheets("設定").Range("K17").Value= OPBT1 + i2
− 1
Exit For
End If
Next
End If
End If
※For で上から順に行を調べてきて、i が75になった時に、D75が「オプション1」なら、
部品名の書いた行は次なので、i + 1 の76 を設定シートの J17 に書く。
「オプション1」の部品が何行あるのかを調べるために、順に下へ調べて空白行に当たったら、
その行の一つ上の行が最終行だから、その行番号を設定シートの K17 に書く。'
myName=ActiveWorkbook.Name ' 開いているファイルネームを myName へ保存し
' 他のファイルを開いて操作しても、元のファイルへ
' 戻れるように保存している。
Windows(myName).Activate ' 二つのファイルを同時に開いている場合、後で開いた
' ファイル名は分かるが、元になるファイル名は分から
' なくなるので、変数名でアクティブできる。
Col=Cells(7,16).End(xlToRight).Column ' 7行目の16列目から最右端データセルの列番号を
' 取得する。
[中間タイトル行の自動取得]マクロ2

[中間タイトル行の自動取得]マクロ1

※[初期設定]は在庫帳の、タイトル行の位置や空白行の位置、
オプションの位置を把握して、設定シートに記入する。
又、Eドライブにある基本使用数台帳を基に当月分の
使用数台帳を作成する。
[初期設定]マクロ

●初期設定

[文字修正]ボタンは、シート保護の解除を行って修正を可能にして、[終了]ボタンで
保護を行っている。不注意で変更できないようにしている。
[文字修正]ボタンマクロ

[文字修正]を押せば、文字の修正や行の追加と削除ができます。
[終了]で終わります。

●表内修正

[列表示][枠固定]ボタンマクロ
[枠固定]を押すと、水平スライダーで画面を左に移動しても、8列目から左には動かない。
[枠固定解除]で解除できる。
●列表示、非表示
[列非表示]を押すと、F,G,I,J,K,L の6列が非表示になる。
[列表示]で解除できる。
使用開始前の設定フォーム
1.列表示や枠固定は、普段使う入出力状態の時には、見る必要のない列を非表示や固定して見易すく
することができる。
2.在庫帳の行数や品種ごとの区切り行、空白行、加工部品と市販購入部品の区切り行などの、位置を
調べて設定シートに記録する。
3.最小と最大の在庫数は、最小の個数になると自動で手配を促すための設定値である。
4.オプション部品は、注文の状態によっては、その製番の商品には使用しない場合があるので、使用
する場合に指定すると、登録してある部品を一式出庫入力してくれる。
入出庫操作フォーム
1.出庫処理、手配処理、入庫処理、部品の価格変更処理などを行うための、操作フォームが表示され
る。
2.月末に完成、未完成などの製番の処理をして、来月用の新しい在庫帳を作成してくれる。
3.月末の在庫数を集計して、在庫部品明細表に出力し印刷できるように処理をしてくれる。
※在庫帳の構造は、左の固定部分に品番や品名が記入されている。
部品行の追加と削除は自由にできる。また空白行を挿入しても良い。
●記入内容で重要な項目は、製品一台に使用する部品個数、最小在庫数、最大在庫数、部品単価、仕入先コード
番号で、部品単価は変更すると在庫集計表の単価も連動して変更される。
(在庫帳 P1 シート)
●このシステムは、日々入出庫を記録する在庫帳と、手配部品の一覧が出力されることによって、注文書発行
システムとの連携ができる。
在庫帳には2種類ある。
1.実際に出庫した時に、出庫した数量を記入する。
※この場合、在庫帳の残数が実際の在庫数である。だから、出庫数が急に増えると残数が不足する場合がある。
2.注文が来た時に、その製造番号(以後製番と表記する)と使用数を記入する。
※このやり方は、生産するときに部品がそろっているようにする為で、納期を確実に守るためである。
だから、在庫帳の残数は実際の在庫数ではなく、使用するよりも先に引かれている。
だから、月末に実際の在庫数を算出するには、未生産の製番の部品を戻さなくてはならない。
この在庫帳は、2.のやり方を採用している。出庫、手配、入庫、出庫後の残数が表示される。
又、最小在庫数、最大在庫数を設定して置くと、在庫残数が最小在庫数になると手配列が作成されて、最大在庫数
になるように自動で手配数が入力される。
月末処理は、受注残ファイルを参照して、生産した製番と未生産の製番を判別して、実際の在庫残数を計算する。
そして、在庫数集計表と在庫金額集計表が作成できる。
更新後は、未生産の製番と、未入荷の手配数が記入された来月用の在庫帳になる。
在庫帳ファイルは、P1、P2、設定、集計、手配表、日付、コードの各シートから成り立っている。
出庫は使用数台帳に保存し、受注残や発注、仕入処理とも連携している。
※ 参照Excelファイルは、[A-10標準部品在庫帳.xlsm]で、その他関連するファイル[受注残]ファイル
[在庫集計]ファイル、[使用数台帳]ファイルなど、掲載ファイルは、プログラムでEドライブから開きますから
どのファイルも、Eドライブに保存してください。プログラムを変更すれば、他のドライブに保存可能です。
参照ファイルは、最下部よりダウンロードしてください。
実践コース
在庫帳の作成と運用システムを学ぶ 1
実際に使っているシステムの内容で解説
EXCEL VBA 講座