• ベストアンサー

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 間違いはどこですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 私には、その文章も、そのマクロも読みきれません。 ただ、なんとなく、すごく単純な内容のような気がします。 >○○センターの分は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の掲示板によっては、回答者のインデントは常識なのですが、質問者さんに対しては、どちらでもよいです。なお、こちらは、エディタに組み込んだ正規表現スクリプトで置換しています。

olololol
質問者

補足

分かりにくい文章ですみませんが、解釈どおりです。 土曜日にじっくりやってみます。 くわしくありがとうございます。 ANDはまだ学んだことがないので、難しそうです。 でも、チャレンジしてみます。 すみませんが、最後の4行ですが、難しくてよくわかりません。 困なんとかリングって(漢字が出せません。すみません)なんですか?

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。 >困憊リングの際に すみません。誤変換です(^^; 昨日の「入力」の話の延長で、いわんこちゃないですね。(笑うしかありません) コンパイリングです。(Compling) コンピュータに関係のない私ですが、あれやこれや、言語には手を出しているのですが、VBAは、題材が多い分だけ、作った数は多いです。500個を作ると、サマになってきます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.6

ANo.4です。 zap35さん >VBE画面からコピーしても半角空白やタブが入りますから、私の場合は手間ですが一旦エディタに貼り付けて、 >文字置換してから回答欄に貼り付け直しています。ご参考まで。 大変参考になりました。ありがとうございます。 質問者様、横入り失礼致しました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

#03です。直接の回答ではなくてすみません。 #02さんや#03のVBAをコピーしてメモ帳に貼り付ければすぐ分かりますが、先頭には「全角空白」を埋めて見やすくしています。 「タブ」や「半角空白」は桁詰めされますので… VBE画面からコピーしても半角空白やタブが入りますから、私の場合は手間ですが一旦エディタに貼り付けて、文字置換してから回答欄に貼り付け直しています。ご参考まで。

olololol
質問者

補足

どうもご丁寧にありがとうございます。 勉強不足の私の為に、わざわざすみません。 とても参考になります。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

回答ではなくすいません。 zap35さん >行頭の空白がめちゃくちゃでとても見る気がしませんよね。 わたしもコードアップした際にうまくインデントが付かないのですが、 何かコツと言うのがあるのでしょうか? (Excelからそのまま貼り付けても、左に寄ってしまうんです。 他のサイトでは、そのままの状態に貼り付くのですが。)

olololol
質問者

補足

いえいえ、いいですよ。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

まず  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 なお質問のプログラムをもう一度自分で見てみてください。行頭の空白がめちゃくちゃでとても見る気がしませんよね。 他人に「プログラムを読んでください」と依頼するなら、もう少し配慮して欲しいものです

olololol
質問者

補足

とても詳しくありがとうございます。 実は、まだまだ初心者です。 構文の書き方(配列の仕方というのでしょうか)は、まだまだ難しいのです。 見る気がしないぐらい見にくい構文になってしまい、申し訳ありません。御容赦ください。 土曜日に、じっくりとやってみます。 くわしく書いていただきまして、ありがとうございました。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.2

こんにちは。 以下のように変更してみてください。 もし、間違ったら、ごめんなさいね。 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

olololol
質問者

補足

回答ありがとうございます。 電話の少ない土曜日に落ち着いてやってみます。 丁寧に書いてくださいまして、ありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

If Worksheets("納品書").Range("B17,B6") = "○○センター" Then 1点気になったので、 セルB17とB6に○○センターとあった場合と言う事? どちらか片方だけチェックしたらいいのでは? (必ず同じになるのなら)

olololol
質問者

補足

すみません。両方チェックしたいのです。

関連するQ&A