Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
入出庫管理(日別)に関して
投稿日時: 20/04/04 00:39:49
投稿者: ゆうとも

VBAで入出庫の管理を行いたいです。
やりたい事は下記の通りです。
 
@”メニュー”シートで入出庫の登録をする。
C2に日付、C3に製品名、C4に数量を入力します。
 
B11:C20に現在の在庫数があります。
 製品を入力するとC5に現在の在庫をVlookupで反映します。
 
A製造または出荷をクリックすると、”入出庫履歴”シートに履歴を残します。
”入出庫履歴”シートはA列は日付、B列は製品名、C列に前回残、D列に製造、E列に出荷、F列は在庫数を残します。
 
ここまではコードを書けました。
 下記に記載。
 
 以降の動作がどうやればいいのか分からないので、教えてください。
 
B”メニュー”シートに日付、製品名、数量を入力し、製造または出荷をクリックすると、あ、い、う、え製品なら、”テスト1”シートの対象製品の対象日付の製造または出荷のセルに数量を反映。
か、き、く製品なら”テスト2”の対象製品の対象日付の製造または出荷のセルに数量を反映をしたいです。
 
どうぞよろしくお願い致します。
 
Private Sub 出荷_Click()
 
 Dim ws1 As Worksheet, ws2 As Worksheet
 Dim a, b, c, myRow1, myRow2, r As Range
 Set ws1 = ActiveSheet
 Set ws2 = Worksheets("入出庫履歴")
If ws1.Range("C5").Value < ws1.Range("C4").Value Then
 MsgBox "在庫数が不足しています!", vbExclamation
 Exit Sub
 End If
 a = ws1.Range("C3").Value
 b = ws1.Range("C4").Value
 myRow1 = ws1.Cells(Rows.Count, "B").End(xlUp).Row - 11
 myRow2 = ws2.Cells(Rows.Count, "B").End(xlUp).Row + 1
 If MsgBox(a & "を" & b & "個出荷しますか?", vbYesNo + vbQuestion) = vbYes Then
 Set r = ws1.Range("B12").Resize(myRow1, 1).Find(What:=ws1.Range("C3").Value, lookat:=xlWhole)
 If Not r Is Nothing Then
 ws2.Cells(myRow2, "C").Value = ws1.Range("C5").Value
 c = ws1.Cells(r.Row, "C").Value
 r.Offset(0, 1).Value = c - b
 ws2.Cells(myRow2, "A").Value = Now
 ws2.Cells(myRow2, "B").Value = a
 ws2.Cells(myRow2, "E").Value = b
 ws2.Cells(myRow2, "F").Value = ws1.Range("C5").Value
 Range("C2:C4").ClearContents
 End If
 End If
 End Sub
 -------------------------------------------------------------------------------
 Private Sub 製造_Click()
 
 Dim ws1 As Worksheet, ws2 As Worksheet
 Dim a, b, c, myRow1, myRow2, r As Range
 Set ws1 = ActiveSheet
 Set ws2 = Worksheets("入出庫履歴")
a = ws1.Range("C3").Value
 b = ws1.Range("C4").Value
 myRow1 = ws1.Cells(Rows.Count, "B").End(xlUp).Row - 11
 myRow2 = ws2.Cells(Rows.Count, "B").End(xlUp).Row + 1
 If MsgBox(a & "を" & b & "個製造しますか?", vbYesNo + vbQuestion) = vbYes Then
 Set r = ws1.Range("B12").Resize(myRow1, 1).Find(What:=ws1.Range("C3").Value, lookat:=xlWhole)
 If Not r Is Nothing Then
 ws2.Cells(myRow2, "C").Value = ws1.Range("C5").Value
 c = ws1.Cells(r.Row, "C").Value
 r.Offset(0, 1).Value = c + b
 ws2.Cells(myRow2, "A").Value = Now
 ws2.Cells(myRow2, "B").Value = a
 ws2.Cells(myRow2, "D").Value = b
 ws2.Cells(myRow2, "F").Value = ws1.Range("C5").Value
 Range("C2:C4").ClearContents
 End If
 End If
 End Sub
  
 

回答
投稿日時: 20/04/04 10:03:26
投稿者: 半平太

”テスト1”とか ”テスト2”のレイアウトが分からないですが、
 
このエリアを当該処理用に工夫(拡充)すればいいんじゃないですか?
  ↓    
>B11:C20に現在の在庫数があります。
 例

 行  ___B___  __C__  _____D_____
 11  製品名   在庫   Testシート  ←この列で書込先シート名を取得する
 12    あ      106    テスト1    
 13    い      110    テスト1    
 14    う       85    テスト1    
 15    か      160    テスト2    
 16    き      200    テスト2    

コードは、今までと大差ない作りでいけると思いますけど。

回答
投稿日時: 20/04/04 10:40:32
投稿者: 半平太

   ↑
「拡充」は避けたい場合は、
 当該製品名がどっちのシートにあるか
 事前チェックしてから書き込みをする。

回答
投稿日時: 20/04/04 11:03:11
投稿者: MMYS

ゆうとも さんの引用:

B”メニュー”シートに日付、製品名、数量を入力し、製造または出荷をクリックすると、あ、い、う、え製品なら、”テスト1”シートの対象製品の対象日付の製造または出荷のセルに数量を反映。
か、き、く製品なら”テスト2”の対象製品の対象日付の製造または出荷のセルに数量を反映をしたいです。

こういう時は、共通部分と変化部分を探します。
 
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
あ、い、う、え製品なら”テスト1”シート
の対象製品の対象日付の製造または出荷のセルに数量を反映。
か、き、く製品なら    ”テスト2”シート
の対象製品の対象日付の製造または出荷のセルに数量を反映
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 
色の部分は変化。それ以外は共通ですね。
つまり、製品でシートが変わるわけですね。
 
dim 対象シート as Worksheet

If (あ、い、う、え製品) then  対象シート="テスト1"
Else If (か、き、く製品) then 対象シート="テスト2"

With 対象シート
  対象日付の製造または出荷のセルに数量を反映。
End With

もちろん、If文は例であり、すでにレスがついている通り、
製品ごとにシートを指定するでもよいでしょう。
 
 
ところで、記述が進まない理由に コードの 読みにくい が原因です。
まず、正常動作を確認したら、機能追加はせず
わかりやすいコードに書き換えて下さい。
たとえば、ws2 って見ただけでは分かりません。
以下の記述だと理解度はどのくらいですか。
 

 ws2History.Cells(myRow2, "A").Value = Now		    '日付
 ws2History.Cells(myRow2, "B").Value = aModel		    '製品名
 ws2History.Cells(myRow2, "D").Value = bQty		    '数量
 ws2History.Cells(myRow2, "F").Value = ws1.Range("C5").Value'在庫数


インデントなど基本はもちろんですが、
1行で1処理が基本。MsgBoxはIF文の中に入れると1行に2処理になって
分かりにくいコードになります。
 
  Dim m As VbMsgBoxResult

  m = MsgBox(aModel & "を" & bQty & "個出荷しますか?", vbYesNo + vbQuestion)
  If m = vbYes Then
      '出荷処理
  End If

トピックに返信