[[20060828145649]] 『マクロで印刷』(ばんばん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで印刷』(ばんばん)
 いつも、お世話になっております。
 請求書という1つのシートに請求明細欄×2・経費明細欄×2があります。
 1カ月単位で請求書を作成するのですが、請求明細は常に2枚使用します。
 経費明細は1枚だったり2枚だったりします。
 作成後、印刷をするのですがその時に経費明細が1枚にも関わらず、ツールバーの印刷ボタンをクリックし、
 4枚出力してしまうことが多くあります。
 そこで、VBAを使いボタンをクリックし、ユーザーフォームのテキストボックスで経費明細数を指定し、
 その枚数に合わせて、印刷できるようにしようと思い、以下のようにコードを書いてみたものの、
 うまくいかず。。。
 ご教授頂ければ幸いです。

 ユーザーフォームに"1"と入力し、Enterを押下しても、次のステップに行きません。
 ユーザーフォームを使ってやりたいこと
 1.印刷ボタンをクリックするとユーザーフォームが出てくる。
 2.テキストボックスに入力された数値によって印刷枚数を分ける。
 【例】
 テキストボックスに1と入力されたら、請求明細×2枚と経費明細×1枚を印刷する。(1ページ〜3ページまで)
 テキストボックスに2と入力されたら、請求明細×2枚と経費明細×2枚を印刷する。(1ページ〜4ページまで)

 経費明細が1枚の時は素直にページ指定をして印刷すればよい事なのですが、これの使用者(相方)が
 Excel初心者な上、毎回のように「また、4枚出てきたよ!」と怒り爆発。
 一応覚える気はあるのですが、 なかなか、一筋縄ではいかず。。。
 私情を挟んでしまい申し訳ないのですが、よろしくお願い致します。
Sub insatsu()
Dim pa As Long
With Worksheets("請求書")
    pa = TextBox1.Value
    If pa = "1" Then
        .PrintOut from:=1, to:=3
    Else
    .PrintOut from:=1
    End If
End With
End Sub

 いつも、お手数ばかりで申し訳ないのですが、今回もご教授よろしくお願い致します。

 >次のステップに行きません。
質問ばかりになりますが・・・
 
どの部分でコードが停止しているのでしょうか?
また、どんなエラーメッセージが表示されますか?
プロシージャinsatsu()はどのモジュールへ登録していますか?
また、プロシージャinsatsu()は、どうやって呼び出しているのでしょうか。
  
 
経費明細の印刷枚数はデータの入っていないものを印刷しないことを意図していると
推測しますが、プログラム的に解決しておくことは難しいのでしょうか。
(たとえば、データの行数によって分岐するとか)
ユーザーは開発者が要求したことは無視するものだと思ったほうが良いです。
(とくに自分以外の人に使わせる場合は、自動化できることは自動化しておくべき)
 
(みやほりん)(-_∂)b

 みやほりんさん、いつもお世話になりましてありがとうございます。
 みやほりんさんの仰るとおり、
 >(とくに自分以外の人に使わせる場合は、自動化できることは自動化しておくべき)
 ですね。
 他人であれば、そこまで気が回ったのかもしれないですが、身内だったのでそこまで
 気が回りませんでした。
 よくよく、考えてみれば、私からするとページの設定なんてたいしたことのない手間
ですが、
 相方はいちいち面倒だし、つい忘れてしまうようです。
 その事を、しっかり頭に叩き込んでおくべきだった ... _| ̄|○ 

 >プロシージャinsatsu()はどのモジュールへ登録していますか?
 >また、プロシージャinsatsu()は、どうやって呼び出しているのでしょうか。
 失礼致しました。
 insatsuは標準モージュールです。
 自分でユーザーフォームでと言っておきながら、標準モジュールを作っていました。。。
 昨日、質問させて頂いた時は、テキストボックスに"1"を入力しても次のコードを
 実行してくれませんでした。
 昨日作ったコードは消してしまったので、原因は分からないのですがコードの記述が
 違っていたんだと思います。
  あれこれいじっているうちに訳が分からなくなってしまったので、先程
 改めてコードを書いてみました。

 Private Sub TextBox1_Change()
 Dim pa As Long
 With Worksheets("請求書")
     pa = TextBox1.Value
     If pa = "1" Then
     .PrintOut from:=1, to:=3
     End If
     If pa = "2" Then
     .PrintOut from:=1, to:=4
     End If
     If pa = "" Then
     MsgBox "経費明細の枚数を入力して下さい"
     End If
 End With
 End Sub

 ただ、上記マクロですと直接入力の場合、"1"を押下しただけでマクロが実行されてしまいます。
 これを、"ENTER"を押下された場合、マクロを実行させるには…Change()をどう変更すれば
よいのでしょうか?
 毎回、お手数ばかりですみません。ご教授よろしくお願い致します。
 (ばんばん)

 サンプルです。
 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = 13 Then
 MsgBox "Enterが押されました"
 Else
 MsgBox "Enter以外が押されました"
 End If
 End Sub
 
(みやほりん)(-_∂)b

 しょうとつぅ。
 かぶりますた・・・orz
 (ROUGE)
'----
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
                                            ByVal Shift As Integer)
    Dim x As String, y As Integer
    If KeyCode <> 13 Then Exit Sub
    x = Me.TextBox1.Text
    Me.TextBox1.Value = Empty
    Select Case x
        Case "1"
            y = 3
        Case "2"
            y = 4
        Case Else
            MsgBox "経費明細の枚数(1 or 2)を入力して下さい": Exit Sub
    End Select
    Worksheets("請求書").PrintOut , y
End Sub

 みやほりんさん、ROUGEさんいつもありがとうございます。
 マクロでしたいことは色々と思いつくのですが、なかなかうまくいかずいつもお世話になりっぱなしです。
 みやほりんさんのコードもROUGEさんのコードも試してみたのですが、

 TO:みやほりんさん
 試しに1を入力し、メッセージボックスを出してみようと思い、
 下記の様にしてみたのですが、pa = TextBox1.Valueでエラーになってしまい、
 "型が一致しません"とメッセージが出てきてしまいます。
 コードの書き方がおかしいのでしょうか。
 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 Dim pa As Integer
 With Worksheets("請求書")
 pa = TextBox1.Value
 If KeyCode = 13 Then
   If pa = 1 Then
   MsgBox "1が入力されました"
   If pa = 2 Then
   MsgBox "2が入力されました"
   End If
   End If
 Else
 MsgBox "Enter以外が押されました"
 End If
 End With
 End Sub

 TO:ROUGEさん
 頂いたコードをステップインで試したのですが、テキストボックスに"1"を入力すると、
 If KeyCode.Value <> 13 Then Exit Sub
                             ↑ここに移ってしまいます。
 それから、両方とも、ステップインで実行すると、End Subまで行っても、
 [実行中]のままなのですが、ステップインはできないですか?
 よろしくお願い致します。
 (ばんばん)


 Enterを押したときのイベントが良かったのでは?
 (ROUGE)

 Exit eventがよいのでは? 
 (Error処理も必要) (seiya)

 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 Dim pa As Integer
 If Len(Me.TextBox.Text)=0 Then Exit Sub
 pa = Int(Val(Me.TextBox.Text))
 If pa < 1 Then Exit Sub
 .
 .
 .
 .
 こんな感じで (seiya)

 > Exit eventがよいのでは?
私もそう思ったのですが、もしかしてテキストボックスひとつしか配置してないの
では、と思う次第。
Exit出来ない。
 
>"型が一致しません"とメッセージが出てきてしまいます。
Keyが押された瞬間にイベントが発生するのでTextBox1にはまだKeyの入力内容が
反映されておらず、Valueプロパティは "" のままです。
変数paは整数型なので、数値化できない文字列""は「型が合わない」と判断します。
とりあえず、次のようにすれば動く。
  
 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     Dim pa As Integer
     If KeyCode = 13 Then
         With Worksheets("請求書")
            pa = TextBox1.Value
            If pa = 1 Then
                MsgBox "1が入力されました"
            ElseIf pa = 2 Then
                MsgBox "2が入力されました"
            End If
         End With
     Else
         MsgBox "Enter以外が押されました"
     End If
 
実用的にはボタンを追加して、
テキストボックスに入力>ボタンクリック>印刷
の方が、一般的と思うのですけれども。
(みやほりん)(-_∂)b

 UserFormにTextBoxひとつ?
 もしそうだったら、InputBoxで十分だと思います。(seiya)

 多分、Sheetに配置されているものと。
 (ROUGE)

 質問には「ユーザーフォーム」と有りますけど? (seiya)

 本当ですね。
 すっかり見落としていました・・・orz
 そうであれば、ご指摘の通り、コマンドボタンを配置するか、インプットボックスで充分ですね。
 (ROUGE)

 おはようございます。
 私の説明が拙かったせいで皆さまの貴重な時間を無駄にしてしまいすみませんでした。

 >Enterを押したときのイベントが良かったのでは?
 これについての説明が足りていませんでした。すみません。
 "1"+"enter"を押すとマクロが実行することを望んでいました。
 いつもながら、説明が不足していてご迷惑をおかけしてしまいすみませんでした。

 >もしかしてテキストボックスひとつしか配置してないのでは、
 ご指摘の通り、ユーザーフォームにはテキストボックス1つだけを配置しています。
 みやほりんさんが仰っているように、
 "実用的にはボタンを追加して、テキストボックスに入力 >ボタンクリック>印刷の方が、一般的と思うのですけれども。"
 確かに一般的ですね。私もそうは思っていました。
 ただ、"1"+enterでできればいいなと思っていたので。。。
 少し考えてみます。

 みやほりんさん、ROUGEさん、seiyaさんすみませんでした。
 VBAを始めてはみたものの理解できていない事が多くいつもご迷惑ばかりで本当にすみません。
 もう少し、勉強して出直してきます。

 追伸:ROUGEさん
 配列もやはり、難しいですね。。。
 まだ、理解できていません。じっくり考える時間があればいいのですが、そうも行かず。。。
 そんな中、質問してしまってすみませんでした。

 ひとつだけ質問があります。
 F8でステップインしながら、End Subまでいくと普通はタイトルバー(?)に
[実行中]・[中断]となり最後はなにも出なくなると思うのですが、End Subまで行っても
 [実行中]のままになっているのは、何か訳があるのでしょうか?
 もし、その部分ご教授頂けましたら、よろしくお願い致します。
 (ばんばん)

 ユーザーフォームは表示されているだけでも「実行中」となります。
フォーム表示中はコード編集が出来ません。
(みやほりん)(-_∂)b

 Unload User Form1を入れなきゃいけなかったんですね。
 (ばんばん)

 ROUGEさん、ごめんなさい。。
 配列の考え方は一応理解できてました。
 後は実践で使いこなせるか(これが一番重要なのですが)
 ひとつ覚えると、ひとつ頭から消えていく。。。
 これじゃぁいつまで経っても進歩しないわけですね。。。
 (ばんばん)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.