- ベストアンサー
VBAの構文を作りましたが、うまくいきません。困った・・
以下でVBAでつくりたいのです。 もし、○○株式会社なら 納品書シートのK3のセルを選ぶ その○○株式会社のなかでも○○センターの分なら 「NOなし」のメッセージと「○○セ)運賃出せ」のメッセージがでる もし、NOが入っていなかったら、納品書をしたまま印刷 NOが入っていたら、印刷なしで、売上日報表のシートへ戻る そこで私が手打ちでNOを消す作業をしたいと思います。 NOを手打ちで消したあと、手動で納品書シートに切り替えて納品書にある印刷ボタンをクリックして印刷(マクロボタンを納品書シートに作っています) ○○株式会社で○○センターの分でないなら、 NOが入っていたら、納品書の画面を表示したまま、印刷 NOが入っていなかったら、NO・確認のメッセージが出て、売上日報表シートへ戻る そこで、私が売上日報表に手打ちでNOを入れる作業をしたいと思います。 NOが入ったら、納品書シートを私が手動でクリックするので、納品書シートにある印刷のマクロボタンをまた押すと印刷 ○○株式会社でないなら、NOあるなしにかかわらず印刷 以上です。 ○○センターの分はNOが入っていたら印刷、NOが入っていなかったら、メッセージが出て、売上日報表に戻り、印刷されないようになってしまいます。その逆になってほしいのですが、難しいです。 どうすれば、うまくいくのでしょうか? 手打ちの部分は構文は要りません。 下記は構文です。 Public Sub msgbox○○会社() If Range("A5").Value = "○○会社" Then Worksheets("納品書").Range("k3").Select If Worksheets("納品書").Range("B17,B6") = "○○センター" Then MsgBox "NOなし" MsgBox "○○セ)運賃出せ" If Worksheets("納品書").Range("k3").Value < 0 Then '納品書画面を表示 Worksheets("納品書").Select Else Worksheets("納品書").Select End If Else Worksheets("納品書").Select End If If Range("k3").Value > 0 Then ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate _ :=True Else Worksheets("納品書").Select msgBox "NO" & vbCrLf & "確認" Worksheets("売上日報表").Select End If Else ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate _ :=True End If End Sub 間違いはどこですか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 私には、その文章も、そのマクロも読みきれません。 ただ、なんとなく、すごく単純な内容のような気がします。 >○○センターの分はNOが入っていたら印刷、 >NOが入っていなかったら、メッセージが出て、…… ○○センターのNOが入っていたら印刷しないで、メッセージが出て、売上日報表に戻り ○○センターがNOが入っていないなら、印刷をする。 ○○センターではなく、NOがないなら、メッセージを出し、そうでないなら、印刷する。 ということかな? 基本的に、他は、そのまま印刷できるようですから、「納品書」の場所で、マクロを実行するようにすればよいのではありませんか?別々の内容のものを無理にくっつけ合わそうとしても、慣れないと、混乱してしまいます。 それに、Range("A5").Value = "○○会社" が、一体、どこでチェックするか分かりません。 With Worksheets("納品書") If (.Range("B17").Value = "○○センター" Or .Range("B6").Value = "○○センター") And _ Val(.Range("K3").Value) > 0 Then MsgBox "NO" & vbCrLf & "○○セ)運賃出せ" Worksheets("売上日報表").Select Exit Sub ElseIf Not (.Range("B17").Value = "○○センター" And .Range("B6").Value = "○○センター") And _ Val(.Range("K3").Value) = 0 Then MsgBox "NO" & vbCrLf & "確認" Exit Sub End If .PrintOut From:=1, To:=1, Copies:=1, Collate:=True End With ただし、このマクロの最初の会社チェックの意味が良く分かりません。 おそらく、本来は、別の内容の印刷だと思います。 それから、インデントについて触れていますが、私は、他人のレイアウトは、まったく気にしないです。VB系だけが、全角空白を許していますが、兄弟のVBScript さえ、エラーを起こします。他の言語でも、困憊リングの際にエラーを返します。暗黙のマナーでVBAの掲示板によっては、回答者のインデントは常識なのですが、質問者さんに対しては、どちらでもよいです。なお、こちらは、エディタに組み込んだ正規表現スクリプトで置換しています。
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >困憊リングの際に すみません。誤変換です(^^; 昨日の「入力」の話の延長で、いわんこちゃないですね。(笑うしかありません) コンパイリングです。(Compling) コンピュータに関係のない私ですが、あれやこれや、言語には手を出しているのですが、VBAは、題材が多い分だけ、作った数は多いです。500個を作ると、サマになってきます。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.4です。 zap35さん >VBE画面からコピーしても半角空白やタブが入りますから、私の場合は手間ですが一旦エディタに貼り付けて、 >文字置換してから回答欄に貼り付け直しています。ご参考まで。 大変参考になりました。ありがとうございます。 質問者様、横入り失礼致しました。
- zap35
- ベストアンサー率44% (1383/3079)
#03です。直接の回答ではなくてすみません。 #02さんや#03のVBAをコピーしてメモ帳に貼り付ければすぐ分かりますが、先頭には「全角空白」を埋めて見やすくしています。 「タブ」や「半角空白」は桁詰めされますので… VBE画面からコピーしても半角空白やタブが入りますから、私の場合は手間ですが一旦エディタに貼り付けて、文字置換してから回答欄に貼り付け直しています。ご参考まで。
補足
どうもご丁寧にありがとうございます。 勉強不足の私の為に、わざわざすみません。 とても参考になります。
- n-jun
- ベストアンサー率33% (959/2873)
回答ではなくすいません。 zap35さん >行頭の空白がめちゃくちゃでとても見る気がしませんよね。 わたしもコードアップした際にうまくインデントが付かないのですが、 何かコツと言うのがあるのでしょうか? (Excelからそのまま貼り付けても、左に寄ってしまうんです。 他のサイトでは、そのままの状態に貼り付くのですが。)
補足
いえいえ、いいですよ。
- zap35
- ベストアンサー率44% (1383/3079)
まず If Worksheets("納品書").Range("B17,B6") = "○○センター" Then はあまり見慣れない書き方ですね。試しましたがこれは If Worksheets("納品書").Range("B17") = "○○センター" Then の動きしかしていません。B6は無視されますが、それで大丈夫ですか。 またK3が「NO」が格納されるセルですか。文脈からそう考えることにします。それと > MsgBox "NOなし" はB17が○○センターのとき無条件に実行されますが、NOがないときだけ実行する方が良くはないでしょうか(そこは手を入れていませんが…) Public Sub msgbox○○会社() If Range("A5").Value = "○○会社" Then Worksheets("納品書").Activate If Worksheets("納品書").Range("B17") = "○○センター" Then MsgBox "NOなし" & vbCrLf & "○○セ)運賃出せ" If Worksheets("納品書").Range("K3").Value > 0 Then Worksheets("売上日報表").Activate Else ActiveSheet.PrintOut Copies:=1, Collate:=True End If Else If Range("k3").Value > 0 Then ActiveSheet.PrintOut Copies:=1, Collate:=True Else MsgBox "NO" & vbCrLf & "確認" Worksheets("売上日報表").Select End If End If Else ActiveWindow.SelectedSheets.PrintOut From:=1, _ To:=1, Copies:=1, Collate:=True End If End Sub なお質問のプログラムをもう一度自分で見てみてください。行頭の空白がめちゃくちゃでとても見る気がしませんよね。 他人に「プログラムを読んでください」と依頼するなら、もう少し配慮して欲しいものです
補足
とても詳しくありがとうございます。 実は、まだまだ初心者です。 構文の書き方(配列の仕方というのでしょうか)は、まだまだ難しいのです。 見る気がしないぐらい見にくい構文になってしまい、申し訳ありません。御容赦ください。 土曜日に、じっくりとやってみます。 くわしく書いていただきまして、ありがとうございました。
- pkh4989
- ベストアンサー率62% (162/260)
こんにちは。 以下のように変更してみてください。 もし、間違ったら、ごめんなさいね。 Public Sub msgbox○○会社() If Range("A5").Value = "○○会社" Then Worksheets("納品書").Range("k3").Select If Worksheets("納品書").Range("B17,B6") = "○○センター" Then MsgBox "NOなし" MsgBox "○○セ)運賃出せ" If Worksheets("納品書").Range("k3").Value < 0 Then '納品書画面を表示 Worksheets("納品書").Select ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate :=True Else Worksheets("納品書").Select End If Else Worksheets("納品書").Select If Range("k3").Value > 0 Then ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate :=True Else MsgBox "NO" & vbCrLf & "確認" Worksheets("売上日報表").Select End If End If Else ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1,Copies:=1, Collate :=True End If End Sub
補足
回答ありがとうございます。 電話の少ない土曜日に落ち着いてやってみます。 丁寧に書いてくださいまして、ありがとうございました。
- n-jun
- ベストアンサー率33% (959/2873)
If Worksheets("納品書").Range("B17,B6") = "○○センター" Then 1点気になったので、 セルB17とB6に○○センターとあった場合と言う事? どちらか片方だけチェックしたらいいのでは? (必ず同じになるのなら)
補足
すみません。両方チェックしたいのです。
補足
分かりにくい文章ですみませんが、解釈どおりです。 土曜日にじっくりやってみます。 くわしくありがとうございます。 ANDはまだ学んだことがないので、難しそうです。 でも、チャレンジしてみます。 すみませんが、最後の4行ですが、難しくてよくわかりません。 困なんとかリングって(漢字が出せません。すみません)なんですか?