エクセルで在庫管理をすることになりました。完璧に作って
みんなに認めてもらいたいので、マクロも組んでいます。
今まで本とか読んでがんばっていましたが、どうしても
動かないので、おしえてください。下のように組んでもオブジェクト
が無いと言って動いてくれないのです。皆さんには簡単すぎるかもしれず、
恥ずかしいですがよろしくお願いします。

Private Sub 警告()
If thisworksheets.Range("c6") < Worksheets("在庫限界入力").Range("c6") Then
MsgBox "在庫不足", vbOKOnly, "警告"
End If
End Sub

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

A 回答 (3件)

補足の


>・・・警告をだしたいのですが
について考えてみました。

シート名を
 データを入力するシート・・・データ入力
 データを合計するシート・・・データ合計
 限界値入力シート・・・・・・在庫限界値 とします。
計算方法は自動にしておきます。

シート<データ入力>のどこかに、『=データ合計!C6』 を入力します。差し障りのない位置がいいと思います。

VBE画面で、シート<データ入力>のコードウインドウに下記を貼り付けます。

Private Sub Worksheet_Calculate()
  If Worksheets("データ合計").Range("C6") < Worksheets("在庫限界入力").Range("C6") Then
    MsgBox "在庫不足", vbOKOnly, "警告"
  End If
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。ああ、なるほどと思いました。ちょっと
わたしの発想が貧弱だったのですね。
これでだめだったら、また新しい質問をします。
本当にありがとうございました。

お礼日時:2002/03/26 18:43

こんにちは。



Private Sub 警告()
If Range("c6") < Worksheets("在庫限界入力").Range("c6") Then
MsgBox "在庫不足", vbOKOnly, "警告"
End If
End Sub

「thisworksheets.」の部分をとればエラーは出ないと思いますよ。

この回答への補足

早速回答していただきまして、ありがとうございます。おかげさまで、エラーが出なくなりました。
ただ質問の内容自体が間違っていたようです。他のシートで入力した数が、このシートに合計されて、在庫限界入力シートの数字よりも少なくなったら警告をだしたいのですが、ぜんぜんうまくいきませんでした。public subかなあと思ってやってみましたが、もともと理解力がないせいか、本を読んでもわかりませんでした。
すみません。
ご指導のほどよろしくお願いします。

補足日時:2002/03/26 09:35
    • good
    • 0
この回答へのお礼

すみません。初めてなもので、補足に書いてしまいました。
早速の回答、ほんとうにありがとうございます。
よろしければ、補足に書いた質問のほうも見ていただけますか。
質問のしかたが不十分だったみたいで。
よろしくおねがいします。

お礼日時:2002/03/26 10:27

「thisworksheets」にしようとしてることは、


マクロをこのシートに書いているわけですよね。
「thisworksheets」は最初「Dim」でオブジェクトとして定義しないとオブジェクトとしてはみなされませんよ。

どうせならこうやってみたらどうですか?

Private Sub 警告()
If Me.Range("c6") < Worksheets("在庫限界入").Range("c6") Then
MsgBox "在庫不足", vbOKOnly, "警告"
End If
End Sub

「thisworksheets」を使う場合は、
Private Sub 警告()
Dim thisworksheets As Object
Set thisworkbooks=Me
If thisworksheets.Range("c6") < Worksheets("在庫限界入力").Range("c6") Then
MsgBox "在庫不足", vbOKOnly, "警告"
End If
End Sub
あまり意味がないですが・・・

この回答への補足

早速回答していただきまして、ありがとうございます。おかげさまで、エラーが出なくなりました。
ただ質問の内容自体が間違っていたようです。他のシートで入力した数が、このシートに合計されて、在庫限界入力シートの数字よりも少なくなったら警告をだしたいのですが、ぜんぜんうまくいきませんでした。public subかなあと思ってやってみましたが、もともと理解力がないせいか、本を読んでもわかりませんでした。
すみません。
ご指導のほどよろしくお願いします。

補足日時:2002/03/26 09:28
    • good
    • 0
この回答へのお礼

すみません。初めてなもので、補足に書いてしまいました。
早速の回答、ほんとうにありがとうございます。
よろしければ、補足に書いた質問のほうも見ていただけますか。
質問のしかたが不十分だったみたいで。
よろしくおねがいします。

お礼日時:2002/03/26 10:24

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

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

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

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

Qメッセージカードの言葉

もうすぐ卒業する部活の先輩にメッセージカードを送ることになったのですが、なんかけばよいのか分かりません
誰か教えてください
ちなみに「○○さん卒業おめでとうございます」の文からはじめる言葉です。

Aベストアンサー

なるほど。
部活でお世話になった先輩への感謝の言葉は、いざ考えるとなると難しいものですよね^-^
お気持ち大変よくわかります!

しかし、やはりそれは誰かに教えてもらう言葉ではなく、
nb50sさんご自身の言葉で伝えてあげることが一番大切だと思います♪

難しく考えることはありません。
例えばnb50sさんが思い出に残っていて感謝している事ならなんでも、

これまでの部活動でお世話になったことに対し、お礼を言っても良いと思いますし、
具体的に先輩がかけてくれた言葉や、
してくれて嬉しかった事などの内容を書いても、先輩は大変喜んでくれると思いますよ♪^^

きっと、卒業された後も、
「そういえばこんな事もあったなぁ」と懐かしく思ってくれることでしょう。

また、卒業した後も先輩に頑張ってもらえたら嬉しいですよね。
応援のメッセージを書いても良いと思います^-^
その先輩が大変でくじけそうな時、nb50sさんの励ましの言葉で、先輩を勇気づけてあげられるかもしれません☆

nb50sさんが先輩に伝えたいことを、そのまま伝えれば、先輩は絶対に喜んでくれるはずですよ♪

なるほど。
部活でお世話になった先輩への感謝の言葉は、いざ考えるとなると難しいものですよね^-^
お気持ち大変よくわかります!

しかし、やはりそれは誰かに教えてもらう言葉ではなく、
nb50sさんご自身の言葉で伝えてあげることが一番大切だと思います♪

難しく考えることはありません。
例えばnb50sさんが思い出に残っていて感謝している事ならなんでも、

これまでの部活動でお世話になったことに対し、お礼を言っても良いと思いますし、
具体的に先輩がかけてくれた言葉や、
してくれて嬉しか...続きを読む

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メッセージカード

彼女の誕生日がちかいんですが
プレゼントにメッセージカードを添えようと思っています
メッセージカードってどういう内容のものを書けばいいんでしょうか?
初めてなのでまったくわかりません;;
教えてください!

Aベストアンサー

26歳のOLです
微笑ましいですね。
私は今でも彼にあげるプレゼントにはカード添えます。
でもみんな絶対喜んで…というか感動してくれます。

私の場合、(♀なのであまり参考にならないかもしれませんが…)
お誕生日おめでとうということを伝えて、
日ごろの感謝と、反省…などをちょこっと書きます。
例えば、いつもわがままな私でごめんねとか、
○○が笑ってるととっても幸せな気持ちになりますとか…
ちょっとクサいくらいでいいと思いますよ。
他の方もおっしゃてるようにポエムとまではいかなくても…。

あと最後にちゃんと、大好きって気持ちを書くといいと思います。
短文すぎても、長文すぎてもダメだと思うので、
雑貨屋さんに売っているようなバースデーカードに
収まる分量でまとめるのがいいです。

あまりかしこまらず、いつも思ってることを書けばいいと思います。
お幸せに♪

QIf Not c Is Nothing Then ~延々処理が続く~ End If

質問というか相談というか
VBAで下記のようなコードをよく見ますし、私自身もこれで書いてます。

For i= 1 to 10
set c=Range.Find(”いろは")
If Not c Is Nothing Then


処理が続く


End If
Next i

cが見つからなかったら、さっさと次の i に進む場合の処理です。Ifの字下げがず~~っと延々続き、最後のNext iの直前でEnd If です。
・Exit For はあるのに 途中Next iは出来ない
・Goto 使って書くと「スパゲティプログラムだ」とか言われる
正直言って、上記コードとGotoスパゲティで可読性に差異があるとは思えません。何でもかんでもGotoはダメていう風潮がおかしいように思えます。

みなさんどうやって書いてますか?

Aベストアンサー

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next i

これって、よく見るとおっしゃっていますが、ひとつ例外に、いわゆる「ブルートフォースアタック(総当り制)」のコードがありますね。それは、Goto 以外に抜け出せる方法がありませんね。「深いネストはするな」という禁を犯しているのだから、Goto 以前のものがあります。(何に使うかはご存知だと思いますし、それをとやかく言う人はいないでしょう。)

これを書き換え、再帰を使うと良いとか言う人もいるのでしょうけれども、そういうのは、知識だけで実際にやったことがない人の話だと思います。「スパゲティ」とか知らない人に、比べさせれば、再帰などを使った方法は、遅くてダメ出しされるのは目に見えています。特殊な例ですが。

ご質問で、実際の私は、内容にもよりますが、
Private flg As Boolean

Sub Main()
On Error Goto ErrHandler
For i= 1 to 10
 Call subRutine(findTxt)
 If flg Then Exit For
Next i
Exit Sub

ErrHandler:
処理
End Sub
'ここの中身はテンプレート化してあります。
Private Sub subRutine(ByVal findTxt) または、Public
'処理
End Sub

としているはずで、モジュールレベルの変数を、flg とし、サブルーチンの中に置いて、目的がかなったら、Flgは、Trueになって、ループから抜け出すようにします。

サブルーチン側では、End ステートメントを使用することさえもあります。(テンプレート化しているのは、Findメソッド、RegExpの正規表現、Sortメソッド、Dictionary とSortLists などがあります。[MZ-Tools 3.0]を使用)

GOTO は、構造化プログラムが登場した時に、排除するように言われてきたものです。古い時代の人は、GOTOに逃げたくなるのを抑えるために、「GOTO」を使うなって、肝に命じてきたのです。しかし、結局、Goto は、なくならなかったのは、一つには、ErrHandlerを使った、エラートラップのせいもあります。だから、Goto を書かないでErr.Raise (513~)で飛ばす方法がありますが、あまり使う人はいません。

ところで、
「スパゲティプログラム」という話に振られると、私は自信がありません。
読みやすさ(可読性)の対極になるものでしょうけれども、誰に対して言っているものか、ということです。私の大事にしている本の中に、アスキーの『QuickBASICプログラミング道場』(1991年)という本があります。

---引用
・本道場で推奨するプログラミングスタイル (p25~)

1.変数・定数・プロシージャーの命名法 (変数の型のサフィックスは使うな)
2.インデントを付けるべし
3.メインプロシージャは短くすべし
4.プロシージャは短くすべし
5.長いブロックはプロシージャーにすべし
6.汎用性のあるプロシージャーを作るべし
7.定数は活用すべし
8.GOTOは乱用(濫用)すべからず。●
 従来のBASICを使ってきた人の中には、GOTO文を多用する人がいるようだ。GOTO文はそのときは便利なように思うが、あとになってリストを眺めてみると、どこに飛んでいるか分からなくなることが多い。……わけがわからない最低の"スパゲティプログラム"になってしまう。
 【例】GOTO文をDOループに置き換える
----引用終わり

現代でも通用するというよりも、その言葉が生まれた時代背景がありますから、必ずしも、GOTOが問題だということではなさそうです。Goto を使わないということにこだわると、逆に墓穴を掘ることになります。

それと、DO ループにするというのは、DO ~ LOOPの間に緊張感(?)は生まれるけれども、無限ループを生み出しやすくなるのです。その頃はそれで良かったかもしれませんが、もうESCでは止まりません。今は必ずしも認められるものではありません。

それと、記録マクロを、そのままVBAプロシージャーに用いるのは、絶対にダメなのですよね。本当のスパゲティプログラムになってしまいます。ベタ書きになってしまうからで、一度、そういうコードを直してくれと言われましたが、怒りを抑えて、丁重にお断りました。

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next...続きを読む

Qメッセージカード付きで贈りたい

お世話になった方に、果物を贈りたいと思いました。
沖縄マンゴーにメッセージカードを添えて贈りたいのですが、
ネットで検索してみると、沖縄マンゴーを贈ることができてもメッセージカードは
添えられないところばかりです。どなたかメッセージカードに対応していただける
お店をご存じないでしょうか?

Aベストアンサー

カードは手書きのものでしょうか?
ワープさせることはできませんから、注文のメールを出す時に手書きカードを添えて頂きたいので、同梱してもらうことはできますか?とお訊ねになればよいと思いますよ。
ごくこじんまりと品物を実際に見て、詰めて、出荷してくれるようなお店なら、特定のカードを特定の方に入れるくらいはサービスでやってくれます。

もう少し丁寧に……と考えるならカードは普通の郵便で出して、「別便でこれこれの品を贈らせていただきました、お口にあえば幸いです」のようなものを送られてもいいかもしれません。発送予定の前日か当日に着くようにすると、受け取り損ねなどがなくてよいでしょう。
昔はきちんとしたお中元、お歳暮もこうだった気がします。

QPrivate Subについて

VB初心者ですが質問させていただきます。
現在
Private Sub CommandButton1_Click()
で呼び出されている処理を、
コマンドラインからstart~.exeと入力して呼び出される(実行される)ようにするにはPrivate Subにてどのように記載してexeファイルを作成すればよいでしょうか??

何分初心者な者ですので概念に間違いがありましたら申し訳ございません。

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

Aベストアンサー

>Sub Main()
>Call Command1_Click
>End Sub
>とか出来なかったっけ?
できるはずがない。
Privateの範囲を考えればわかるはず

Public Sub Command1_Click()
にして
sub min側で
Call Form1.Command1_Click
呼び出せば動かないことはないけどイレギュラー的な
使い方すぎる。
それ考えれば
Command1_Clickイベント内をサブルーチン(関数化)して
それをsub mainとCommand1_Clickイベントから
呼び出して使うのが本来でしょう。

Q義理チョコのメッセージカードは付けるべき?

義理チョコのメッセージカードは付けるべき?


バレンタインの義理チョコにメッセージカードを付けようかどうかで迷っています。
名刺サイズのカードに一言二言書いて、かわいくシールを貼ろうと考えています。
しかし、カードをもらった方は処理に困らないでしょうか?

チョコを入れてある袋に、直接色々書いた方が、もらった方も気軽(?)に捨てる事が出来ますかね。

小さいことで申し訳ありませんが、ご意見をお願いいたします。

Aベストアンサー

直接渡せるなら特にメッセージカード等は要らないと思いますよ^^
でも、14日は日曜ですからね。。。
おいくつか存じませんが、社会人で、直接ではなく、机の上とか?に置いておくなら
軽いメッセージ付けてくれてると、義理とわかっていても嬉しいかなw

QPrivate Subをコピーしない

シートにPrivate Subが組み込まれた状態で、そのシートを別のブックに移動した場合、Private Subも同時に移動されてしまいます。
シートの移動を行った場合Private Subのみ移動しない方法はないのでしょうか?

埋め込んであるのは
Private Sub Worksheet_Deactivate()
On Error Resume Next
CommandBars("××").Delete
Call ***
End Sub
となっています。
別ブックに移動した場合、Resume Nextとなっているのにエラーで停止します。このエラーを出さない方法でも構いません。

別の方法として新しいシートを作成してCellsコピーを行うと共に、印刷範囲を指定してから移動する方法も試したのですが、シートに複数のページがある場合は微妙に印刷範囲がずれてしまって上手くいきませんでした。

宜しくお願い致します。

Aベストアンサー

コードをSheetモジュールではなくて
ThisWorkbookモジュールのSheetDeactivateイベントに書いておけばいいと思いますが。

'---------------------------------------------
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  If Sh.Name = "該当シー名" Then
    On Error Resume Next
    CommandBars("××").Delete
    Call XXXX
  End If

End Sub
'----------------------------------------------

以上。

Q手紙かメッセージカードか

来月、彼が21歳の誕生日を迎えます。
そこでプレゼントも悩んでいるのですが、
そのプレゼントに添える物を手紙にしようか
メッセージカードにしようか悩んでいます。

今までの誕生日や記念日などに手紙を渡していて、
書いているとだいたい内容が似たようになってきて
それだったらシンプルに「誕生日おめでとう これからもよろしく」的な
メッセージカードの方が新鮮かな?と思ったりするのですがどうでしょう。。。
一言添えただけのメッセージカードでも喜んでくれるか不安です。

手紙かメッセージカードかの答えとその理由を教えて頂けたら嬉しいです^^
同世代の男性の意見が聞けたらなと思いますが、それ以外でも経験談等あれば聞かせて頂ければと思います。

Aベストアンサー

バースデーカード派。

文字であまり多くを語られる、語るのが好きじゃない。
短い言葉に如何に思いを詰めるかですね。。。

Q数式は残し値をクリアするマクロについてご教示お願いします。 Private Sub CommandB

数式は残し値をクリアするマクロについてご教示お願いします。

Private Sub CommandButton3_Click

Dim msg As Integer
Dim i As Integer
Dim LastRow As Integer

msg = MsgBox(”初期化しますか?”,vbYesNo)
If msg = vbYes Then

Cells(8,8).Select
LastRow = Range(”H65536”).End(xlUp).Row

For i = 8 To LastRow

If Cells(i,8) = ”予算” Or _
Cells(i,8) = ”実績” Then

Range(Cells(i,9),Cells(i,15)).SpecialCells(xlConstants,23).ClearContents
EndIf
Next i

これで実行するもエラー1004となり、
9〜11列は値がクリアになりますが、
12〜15列目はクリアになりません。

★12〜15列のみ関数が入ってます。

なぜ数式が入ってない列のみクリアになり、エラーとなるのでしょうか?

数式は残し値をクリアするマクロについてご教示お願いします。

Private Sub CommandButton3_Click

Dim msg As Integer
Dim i As Integer
Dim LastRow As Integer

msg = MsgBox(”初期化しますか?”,vbYesNo)
If msg = vbYes Then

Cells(8,8).Select
LastRow = Range(”H65536”).End(xlUp).Row

For i = 8 To LastRow

If Cells(i,8) = ”予算” Or _
Cells(i,8) = ”実績” Then

Range(Cells(i,9),Cells(i,15)).SpecialCells(xlConstants,23).ClearContents
EndIf
Next i

これで実行するもエラー1004となり...続きを読む

Aベストアンサー

>VLOOKUPなどで他からひっぱっており、全部金額が入ってます。
>この金額だけ消したいんですm(_ _)m

関数式が入っているのですから、当然ながらセルには関数式の答えが表示されます。
それを消したいと言うことは、式を消すか、または引っ張ってきている元のデータを変更することになるのではないでしょうか??

あるいは、特定の条件下でのみ式の答えを表示させたくないということでしたら、セルの関数式でIFを使って条件設定する方法になるかと。


人気Q&Aランキング

おすすめ情報