こんにちは。よろしくお願いします。
エクセルで出荷入力画面シートに数字を入力。もし、発注しなくてはならない
在庫数設定より(在庫限界入力シート)、その商品の総合計(在庫残高シート)が
少なくなったら、メッセージボックスに警告を表示したいのです。
先日、親切な方々のアドバイスで、以下のように組んで見ましたが、
入力シートにはたくさんの商品があり、どのセルに入れても全部同じメッセージ
ボックスがでてしまいます。これができないと、お茶組のままです。
がんばって作ってきたエクセルが、期限に間に合いません。助けてください。
Private Sub Worksheet_Calculate()
dim counter as integer
If Worksheets("在庫残高").Range("C6") < Worksheets("在庫限界入
力").Range("C6") Then
counter=Worksheets("在庫限界入力").Range("C6")-Worksheets("在庫
残高").Range("C6")
MsgBox counter& "本在庫不足", vbOKOnly, "警告"
End If
End Sub

一行目のworksheetをobjectにしてもだめでした。また()のなかに入力する
全てのセルの範囲を指定してもだめでした。
どうすればいいのでしょう。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>どのセルに入れても全部同じメッセージボックスがでてしまいます。


#241482については、単一の『C6』の変更時の判定の仕方を書いています。
どのようにして『Worksheets("在庫残高").Range("C6")』が更新されるか分からなかったからです。

この例を沢山の商品の在庫残高についても同様に使われているようですが、複数にするには変更が必要でしょう。
出荷入力画面シートの入力がどのように在庫残高シートに反映するかがはっきりしないと解決にはならないかもしれません。


出荷入力画面シートに入力すると在庫残高シートの『同じ列が更新』されるとすると、以下の訂正くらいで対応できるかもしれません。

出荷入力画面シートのコードウインドウに貼り付け、#241482と同じように、在庫残高シートで変動する数値を、出荷入力画面シートで分かるようにしておく必要があります。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim clm As Integer '入力したセルの列
  Dim counter As Long '不足数

  clm = Target.Column
  If Worksheets("在庫残高").Cells(6, clm) < Worksheets("在庫限界入力").Cells(6, clm) Then
    counter = Worksheets("在庫限界入力").Cells(6, clm) - Worksheets("在庫残高").Cells(6, clm)
    MsgBox counter & "本在庫不足", vbOKOnly, "警告"
  End If
End Sub
    • good
    • 0
この回答へのお礼

本当にありがとうございます。質問するたびに本と照らし合わせて
勉強しています。
おかげさまで、質問の答えがわかり、ちゃんと思い通りになりました。
でも・・・おっちょこちょいな私なので、また新たな問題が発生しました。
それは、新しい質問をしますので、もしよかったら
もう一度御教授ください。
よろしくおねがいします。

お礼日時:2002/03/28 15:06

正直VBAは詳しくはないです。

おかしな部分もあるかと思います。
・飛び飛びのセルを参照できる。
・出荷入力時で在庫がマイナスになるなら在庫数は0で不足分を返す。
・出荷入力時で在庫がまだあるなら差し引き分を在庫数とし、不足分を返す。
・限界に満たないなら差し引き分を在庫とする。
Private Sub Worksheet_Change(ByVal target As Range)
'出荷入力セルのアドレス取得
Dim taddr As String: taddr = target.Address
'出荷入力したアドレスがA1?
If taddr = "$A$1" Then
'chgZaiko(入力アドレス,在庫アドレス,限界アドレス)
Call chgZaiko(taddr, "C6", "C6")
ElseIf taddr = "$A$2" Then
Call chgZaiko(taddr, "C7", "C7")
End If
End Sub

Private Sub chgZaiko(ByVal addr1 As String, ByVal addr2 As String, ByVal addr3 As String)

Dim count As Integer: count = 0
Dim inpt As Integer: inpt = Worksheets("出荷入力").Range(addr1)
Dim zaiko As Integer: zaiko = Worksheets("在庫残高").Range(addr2)
Dim genkai As Integer: genkai = Worksheets("在庫限界入力").Range(addr3)
'在庫数-出荷数 < 限界数
If zaiko - inpt < genkai Then
If zaiko - inpt < 0 Then
'在庫数-出荷数<0なら在庫数は0
Worksheets("在庫残高").Range(addr2) = count
MsgBox inpt - zaiko & "在庫不足", vbOKOnly, "警告"
Else
'在庫数-出荷数>0なら在庫数は在庫数-出荷数
count = genkai - (zaiko - inpt)
Worksheets("在庫残高").Range(addr2) = zaiko - inpt
MsgBox count & "在庫不足", vbOKOnly, "警告"
End If
Else
'在庫数-出荷数 > 限界数
count = zaiko - inpt
Worksheets("在庫残高").Range(addr2) = count
MsgBox "現在の在庫数" & count
End If
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。問題は前の人のを参考にしたら
できました。
またよろしくお願いします。

お礼日時:2002/03/28 15:07

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルでの在庫管理について教えて下さい。

エクセルでの在庫管理について教えて下さい。

これまで全て手書きで管理していたものをエクセルで行いたいのです。
が、全くのエクセル初心者です。
シート内容として、月日・入荷数・使用数・在庫数です。
入荷数に数量を入力すると在庫数に数量を追加し、使用数に数量を入力すると在庫数から数量を差し引く形にしたいのです。

宜しくお願いします。

Aベストアンサー

こんばんは!
一例です。
↓の画像のようにこちらで勝手に表を作ってみました。
2行目は繰越数を表示させていますので、3行目からの数式になります。

商品は一つだけとしています。

D3セルに
=IF(COUNTBLANK(B3:C3)=2,"",D2+B3-C3)
という数式を入れ、オートフィルで下へコピーすると
画像のような感じになります。

以上、参考になれば幸いです。m(__)m

QSubとEnd Subについて

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate URL
objIE.Visible = True

Do Until objIE.Busy = False
WScript.sleep(250)
Loop

If objIE.document.URL = URL Then
BodyText = objIE.document.body.innerTEXT
AriNashi = InStr(1, BodyText, "Yahoo")
If AriNashi > 0 Then
Set objINPUT = objIE.document.getElementsByTagName("input")
objINPUT(0).value = LoginID
objINPUT(1).value = Password
objINPUT(2).Click
Else
msgbox "NO"
End If
Else
WScript.Echo " ダ メ" & Err.Description
End If
Set objIE = Nothing

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate ...続きを読む

Aベストアンサー

Subで囲むとプロシージャとなります。
プロシージャは他から呼び出されない限り、勝手に動作はしません。

Sub Hoge
'実体
End Sub

と書いたなら、プロシージャの外で
Call Hoge()
のようにプロシージャを呼び出してあげてください。

Qエクセル 在庫管理について 初歩的な質問ですが、何卒お願い致します。 制服の在庫管理を行おうと思い

エクセル 在庫管理について

初歩的な質問ですが、何卒お願い致します。
制服の在庫管理を行おうと思います
添付した写真の黒枠に数式を入れ、D12からD21まで数を打ち込む事で、自動的に計算する数式がありましたら、教えて下さい。
宜しくお願いします。

Aベストアンサー

考え方は
Sサイズの総数-Sサイズの貸与数の合計
と云う事ですよね。


=C5-SUMIF(C$12:C$21,B5,D$12:D$21)
と入れて下へコピーします。

QSub-EndでConsole.Writeでコマンドプロンプト出力したい

VB.NET2003:WindowApplication の Sub~End で 出力Console.Write("***") としてもコマンドプロンプトウィンドウにでないで、.NETウィンドウのデバッグ欄にしか出ない。前もって何かを指定しなければならないのでしょうが全くわかりません。ConsoleApplication ではうまくいっていますが。初心者なのでよろしくお願いします。

Aベストアンサー

Windows Applicationは,コンソールを持ちません。
# AllocConsole API等を使えば,専用コンソールを持てますが。

コンソールへ出力したいのであれば,Console Applicationにする必要があります。
なお,Console ApplicationであってもWindows Formsを開く事は可能です。

QエクセルVBとアクセスでの在庫管理

おはようございます。
お世話になります。

エクセルVBとアクセスでの在庫管理をしたと考えています。
この質問では仕様の詳細ではなく、もっと手前の段階の疑問を
ご教示いただきたいと思っています。

●背景
日々手作業での在庫の管理に限界を感じ、商品が売れるたびに
簡単に在庫消込を行いたいと考えているが、ネットショップには登録していない
商品も在庫管理する必要があり、ネットショップへの登録は手間が大きいし
利点がすくないので選ぶつもりがありません。
そこで、本日から一気に全在庫を数えていくつもりですが、それで固まった在庫数を
今後は売れるたびにエクセル&アクセスで管理したいと考えています。

●目的
Office2010のエクセルとアクセスを使って在庫を管理する。
実際の在庫自体はアクセスに入れておき、エクセルはコマンドボタンなどがあるので
あくまで各スタッフのユーザビリティ向上のために(簡単に行えるように)用意する。
※アクセスは日々ネットショップの商品管理に使っているのである程度の操作は
できますが、在庫消込用のVB画面のようなものを用意できるのかなどは不明な状態です。
◎質問したいこと
1.エクセルとアクセスで連動して管理することは可能ですか?
2.世の中には在庫管理用のソフトがあると思います。費用削減のために自前で
  今回のように作りたいなと思っていますが、どう思われますか?
  例)データ紛失の恐れがあるので危険やめたほうがよい
  例)非常に安価またはフリーソフトの在庫管理システムがある
  例)上記ソフトで実現するのは非常に負荷が高い
  などなど…

この質問では詳しいことは述べませんし、おおまかに実現したい機能は以下です。

商品番号、カラー、サイズを打ち込める画面的なものをエクセルに用意する。
そこにデータを打ち込むと、対象候補のレコードを検索して結果を表示する。
その中から対象のレコードを選択して、更新したい在庫数に変更する。
更新ボタンを押すとアクセス側にレコード更新に向かい、処理を完了する。

です。
プログラム経験はVB・SQLはありますが、VBAはありません。
なのでエクセル&アクセスでこの機能を実現するのがどれくらい大変かまたは簡単か
わかっていません。
この質問で「大して大変な機能ではないので作って管理してもいいんじゃない?」という回答を頂けるようなら、その機能の実装についても
別の質問を用意してアドバイス頂きたいと考えています。
アドバイス頂いた中でわからない部分についてはググったり試行錯誤したりはする覚悟がありますが、本を用意して新しい概念や知識を入れないと作れないような場合は
そこまでする時間がないので諦めようと思っています。

以上を踏まえて、ご教示いただければと思います。
(以上といっても私の知識がどの程度なのかわかりづらいと思うので
アドバイスしづらいかもしれませんが、上記の説明内容でおおまかにどれくらい
わかっていないのかは伝わったら幸いと思っています。)

よろしくお願いいたします。

おはようございます。
お世話になります。

エクセルVBとアクセスでの在庫管理をしたと考えています。
この質問では仕様の詳細ではなく、もっと手前の段階の疑問を
ご教示いただきたいと思っています。

●背景
日々手作業での在庫の管理に限界を感じ、商品が売れるたびに
簡単に在庫消込を行いたいと考えているが、ネットショップには登録していない
商品も在庫管理する必要があり、ネットショップへの登録は手間が大きいし
利点がすくないので選ぶつもりがありません。
そこで、本日から一気に全在庫を数えていく...続きを読む

Aベストアンサー

回答者の一人ですが、ソフトライブラリーからダウンロードできなかったということなので、アクセスで在庫管理のプログラムを作ってみようと思います。方針は次のものでよろしいでしょうか
1.テーブルのフィールドとしては5つ、商品番号、カラー、サイズ、在庫数、備考
2テーブルの入力は、フォームは作らず、当面テーブルに直接入力とする
3検索用フォームとクエリーをつくる。カラーとサイズを条件にして該当するレコードを抽出
4在庫数を更新するためのクエリーを作る
なお私のパソコンはOSはXP、アクセスは97です。
ほかにご希望の機能はございませんか

QRangeの範囲指定限界

お世話になります。
ASP.NETで開発を行なってます。

そこで質問なんです。
xlsSheet.Range("A8:CV45000").Valueと指定すると、『式またはステートメントの評価がタイムアウトしました。』というエラーが出るのですが、範囲指定が大きすぎるのでしょうか?
xlsSheet.Range("A8:CV23000").Valueぐらいだと取得できるのですが・・・。

Aベストアンサー

> xlsSheet.Range("A8:CV23000").Valueぐらいだと取得できるのですが・・・。

であるならば、

> 範囲指定が大きすぎるのでしょうか?

そういうことになりますよね^^;

A8:CV45000 なら 4,499,300セルですからね、、、

仮にここまで大きなデータを処理できたとしても、HDD スワップが発生して
遅くなるだけだと思いますよ。環境にもよるでしょうが。

例えば、1万セル×449.93回など適切な分量で分割処理してみたら?

Qエクセルで在庫管理

在庫管理をエクセルでしているのですが、

在庫が0を切った(0以下になった)ら入力できない方法はありますか? 条件付で色を変える方法は分かるのですが、0以下になるから入力できなくする方法なんてないのですかね?

教えてください。

Aベストアンサー

モデル的に考えてみました。
例データSheet1の A1:C10
入庫出庫在庫
4030100
10020180
・・・
C列の、C2以下には
=IF(AND(A3="",B3=""),"",C2+A3-B3)
と式が入れてあるとします。
Sheet1のChangeイベントで
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column < 3 Then
If ActiveSheet.Cells(Target.Row, "C") < 0 Then
MsgBox "在庫マイナス"
Application.Undo
End If
End If
End Sub
と入れます。
モデル的といったのは、色々な入力ケースに耐えうるかどうかわからないからです。
VBAを勉強したことがなければ、自分のケースに適用できないですが。

QRange("A" & x) + Range("A" & x+1) +

Range("A" & x) + Range("A" & x+1) + Range("A" & x+2) + ・・・ + Range("A" & x+n)

x:変数(基準点)
n:定数(A列のセルをいくつ足し併せるか、を指定。)


上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
Do ~ Loop 文 などを使うのでしょうか。

お詳しい方、教えて下さい。
必ずお返事致します。

Aベストアンサー

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '----------------
  ' 検証1(回す)
  '----------------
  dbl1 = Now
  cur結果 = サンプル1(N定数)
  dbl2 = Now
  MsgBox "サンプル1(回す):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1

  '----------------
  ' 検証2(Sum)
  '----------------
  dbl1 = Now
  cur結果 = サンプル2(N定数)
  dbl2 = Now
  MsgBox "サンプル2(Sum):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1
End Sub

Function サンプル1(n As Long) As Currency
  Dim i As Long
  For i = 0 To n
    サンプル1 = サンプル1 + Range("A" & x + i)
  Next i
End Function

Function サンプル2(n As Long) As Currency
  Dim rng始点 As Range
  Dim rng終点 As Range
  Dim rng範囲 As Range
  
  Set rng始点 = Range("A" & x)
  Set rng終点 = rng始点.Offset(n)
  
  Set rng範囲 = Range(rng始点, rng終点)
  サンプル2 = WorksheetFunction.Sum(rng範囲)
End Function

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '...続きを読む

Qエクセルを使った、在庫管理と発注。

エクセルを使った、在庫管理と発注。


私は、エクセルが得意ではないのですが、今日、用事で退社する上司に「手が空いているので何かやっておくことがあったら言ってください」といったところ、思わぬ無茶振りをされてしまい、とても困っています。在庫管理などに関する知識がまったく無い人間なので、説明が長くなってしまうことと、わかりにくい点があるかもしれないですが、なるべくわかりやすく書こうと思うのでご協力お願いいたします。


現在当社の商品在庫は、エクセルで管理されております。
発注は目視で足りないと思ったら適性分だけ頼むかたちです。

今度上司のしたいことはエクセルの在庫データを使って「発注リスト」が自動的に作成されることです。

例えば、商品Aの適正在庫が5だとして、それを切ったら自動でリストの中に適正在庫になるような個数と商品名が載る。あとはそれをプリントアウト(パソコンからも送れるのでそれで自動発注できればなお良いです)してFAXで発注。というかたちです。

それは、エクセル上で全部済めばそれでも良いですが、そのやり方が複雑な場合、こんな方法、こんな簡単なソフトがあるよ、という意見がありましたらよろしくお願いしたいです!!

当社POSシステムはございません。導入もいたしませんのでどうかパソコンでの方法でご回答お願いいたします。

アクセスは、当社で使える者がいないため、なるべくエクセルを使う形にしたいみたいです。

何か説明が足りないようでしたらご指摘ください。

よろしくお願いいたします!

エクセルを使った、在庫管理と発注。


私は、エクセルが得意ではないのですが、今日、用事で退社する上司に「手が空いているので何かやっておくことがあったら言ってください」といったところ、思わぬ無茶振りをされてしまい、とても困っています。在庫管理などに関する知識がまったく無い人間なので、説明が長くなってしまうことと、わかりにくい点があるかもしれないですが、なるべくわかりやすく書こうと思うのでご協力お願いいたします。


現在当社の商品在庫は、エクセルで管理されております。
発注は目視...続きを読む

Aベストアンサー

No.1です!
何度もごめんなさい。
前回は単に適正在庫数に足らないものだけを表示するだけです。
ご希望としてはそのリストを印刷できる表にしたい!ということだと思いますので、
もう一度画像をアップしてみます。

商品補充リストをSheet2に表示するようにしてみました。
Sheet1は前回そのままで、

Sheet2のA2セルに
=IF(COUNT(Sheet1!$C$2:$C$1000)<ROW(A1),"",INDEX(Sheet1!A$2:A$1000,SMALL(IF(Sheet1!$C$2:$D$1000<>"",ROW($A$1:$A$999)),ROW(A1))))

これは配列数式になってしまいますので、データ量が多い場合はコンピュータにかなりの負担を与えます。
という訳で、Sheet1の1000行目まで対応できる数式にしていました。

Sheet2のA2セルにこの画面からコピー&ペーストしただけではエラーになると思います。
貼り付け後、F2キーを押す、または貼り付けセルをダブルクリック、または数式バー内で一度クリックします。
編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定します。
数式の前後に{ }マークが入り配列数式になります。

そして、B2セルに
=IF(A2="","",VLOOKUP(A2,Sheet1!A:C,3,0))
(これは配列数式ではありません)

最後にZ2・B2セルを範囲指定し、B2セルのフィルハンドルで下へコピーすると
画像のような感じになります。

以上、参考になればよいのですが・・・
何度も失礼しました。m(__)m

No.1です!
何度もごめんなさい。
前回は単に適正在庫数に足らないものだけを表示するだけです。
ご希望としてはそのリストを印刷できる表にしたい!ということだと思いますので、
もう一度画像をアップしてみます。

商品補充リストをSheet2に表示するようにしてみました。
Sheet1は前回そのままで、

Sheet2のA2セルに
=IF(COUNT(Sheet1!$C$2:$C$1000)<ROW(A1),"",INDEX(Sheet1!A$2:A$1000,SMALL(IF(Sheet1!$C$2:$D$1000<>"",ROW($A$1:$A$999)),ROW(A1))))

これは配列数式になってしまいますので、データ量が多...続きを読む

Qsubプロシージャーですか?subステートメン

----------------
Sub test()

End Sub
----------------
は、subプロシージャーですか?subステートメントですか?

上記のコードの「Sub」にカーソルをあて、F1を押すとヘルプが立ち上がり「Sub ステートメント」と表示されますが、

挿入(I)→プロシージャー(P)を見ると画像のように「Subプロシージャー」となっています。

どちらが正しいのでしょうか?
どちらも正しいのでしょうか?

Aベストアンサー

Sub~という構文が「Subステートメント」。プログラミング言語では、ステートメントは「文」とも訳されます。
そのSub~End Subで定義した一連のものが「Subプロシージャ」。プロシージャは「手続き」とか言う意味。

だから、Subのヘルプを見ると、Subステートメントの書式などになってるし、
挿入→プロシージャでは、「手続き」とての一かたまりを挿入するから、End Subまでになる。


人気Q&Aランキング

おすすめ情報