プロが教えるわが家の防犯対策術!

エクセルで在庫表を作ろうとしているのですが、躓いてしまって困っています。

TEST1 コードを手入力した後実行
TEST2 出庫数を入力した後実行


Option Explicit
Option Base 1

Sub TEST1() 'コードを手入力した後実行
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r&, i&
Dim vL1 As String
Dim vL2 As Long

Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")

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

For i = 2 To r

vL1 = Application.WorksheetFunction.VLookup(ws1.Cells(i, 1), ws2.Range("A2:IV65536"), 2, False)

ws1.Cells(i, 1).Offset(, 1) = vL1

vL2 = Application.WorksheetFunction.VLookup(ws1.Cells(i, 1), ws2.Range("A2:IV65536"), 3, False)

ws1.Cells(i, 1).Offset(, 2) = vL2

Next i

End Sub
Sub TEST2() '出庫数を入力した後実行
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r&, i&
Dim vL2 As Long
Dim vL3 As String
Dim syukko As Long
Dim fnd As Range
Dim zaiko As Long

Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")

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

For i = 2 To r

If ws1.Cells(i, 4) > 0 Then

syukko = ws1.Cells(4, 1).Offset(, 3).Value

vL2 = Application.WorksheetFunction.VLookup(ws1.Cells(3, 2), ws2.Range("A2:IV65536"), 3, False)

Set fnd = ws2.Range("A:A").Find(ws1.Cells(i, 1))

If fnd Is Nothing = False Then

zaiko = vL2 - syukko

fnd.Offset(, 2) = zaiko

End If


MsgBox ws1.Cells(i, 2) & "を" & syukko & "出庫します" & vbLf & "在庫は" & zaiko & "になります。"

Else

MsgBox "出庫数を入力して下さい"

Exit Sub

End If

Next i

ws1.Range("A2:D65536").ClearContents

End Sub


ここまでは作りました。
ですが、プロシージャの外では無効です
と出てしまいます。
どうすればよいのでしょうか。
教えて下さい。


シート1のB2にコード・C3に名前・D2に現在個数・E2に出庫数を入力します。
実際にはB3からすうじを入力し、コードを入力すれば自然に名前と現在個数を
シート2から探してくるようにしたいです。

シート2にはA列にコード、B列に名前、C列に現在庫数が載っている表があります(量が半端ではないです)

出来れば、1度出庫数を入れたら、次開いた時にシート2のC列にある現在個数が自然に減っていて、シート1にはフォームしか残らない状態にしたいです。



お願いします<m(__)m>

A 回答 (2件)

質問と同じコードですが、小数例でやってみるとうまく行き増した。


Sub TEST1() 'コードを手入力した後実行
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r&, i&
Dim vL1 As String
Dim vL2 As Long
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
'--
r = ws1.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To r
vL1 = Application.WorksheetFunction.VLookup(ws1.Cells(i, "A"), ws2.Range("A2:IV65536"), 2, False)
MsgBox "vl1=" & vL1
ws1.Cells(i, "A").Offset(, 1) = vL1 'Sheet1の列へ
vL2 = Application.WorksheetFunction.VLookup(ws1.Cells(i, "A"), ws2.Range("A2:IV65536"), 3, False)
MsgBox "vl2=" & vL2
ws1.Cells(i, "A").Offset(, 2) = vL2 'Sheet1のC列へ
Next i
End Sub
ーー
雑感
(1)チェック用に上記のようにMsgbox うお入れてみるのはどうか
(2)Sheet2は
A列    B列  C列
aaa1
bbb2
ccc3
のようにB列文字列、C列数字にアンって居るか。
(3)VLOOKUP関数で見つからなかった場合の手を打っておく必要はあるのでは無いか。
ーー
標題の
>エクセルで在庫表を作ろうとしています ・・
は不適当ではないか?台が大きすぎて実態を表してない。
上記なら、VLOOKUP関数の利用の質問ではないか
ーーー
時間なく
質問後半は省略したが、
>躓いてしまって困っています
前半か後半かを明記すべきでは。
iでForNextで繰返しの中で
syukko = ws1.Cells(4, 1).Offset(, 3).Value
に i ガ無いのはこれで良いのか?
忙しい回答者に生のコードをコピペするだけでなく(また読み解かせるのでなく、シートの情況との関連も質問に書くこと。
全く予備知識が無いものが読むのだ。
    • good
    • 0

まず、[F8]でステップ実行させて変数の値があなたが考えている通りになっているのかを確認してください。


それでも解決しなければ、エラーが何処で出たのか、その時の使用している変数の値がどうなっているのかを明記してください。

ソースをざっと眺めた限りではシート1のB2セルに入っているはずのコードを参照している箇所が「出庫します」のメッセージ以外何処にもありません。
ソースか説明が間違っていませんか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!