Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3583 / 13644 ツリー ←次へ | 前へ→

【61292】ユーザーフォームのボタンクリックイベントで再開処理する方法 satsuki 09/4/23(木) 17:22 質問[未読]
【61293】Re:ユーザーフォームのボタンクリックイベ... Abyss 09/4/23(木) 17:47 発言[未読]
【61294】Re:ユーザーフォームのボタンクリックイベ... satsuki 09/4/23(木) 18:08 質問[未読]
【61295】Re:ユーザーフォームのボタンクリックイベ... Abyss 09/4/23(木) 18:24 発言[未読]
【61296】Re:ユーザーフォームのボタンクリックイベ... satsuki 09/4/24(金) 11:56 質問[未読]
【61297】Re:ユーザーフォームのボタンクリックイベ... Abyss 09/4/24(金) 13:36 発言[未読]
【61300】Re:ユーザーフォームのボタンクリックイベ... satsuki 09/4/24(金) 14:52 お礼[未読]

【61292】ユーザーフォームのボタンクリックイベン...
質問  satsuki  - 09/4/23(木) 17:22 -

引用なし
パスワード
   satsukiと申します。
あちこち調べましたが、わかりませんでしたので、どなたかご教示お願いいたします。
エクセルシートを印刷したいのですが、修正する度に行数が変わるので、
改ページ位置をその都度指定して印刷しています。
その際、自動で行数を挿入し、ページごとの行数が同じになるようにしているのですが、下記モジュールで、印刷をするとき、改ページの指定を促すようにしたいのです。
ユーザーフォームを表示したままにして、改ページ指定が終わったら、ユーザーフォーム上のボタンを押して、行追加処理の部分に行くようにしたいのですが、現在は、改ページ指定はできますが、行追加ができません。
どなたかアドバイスよろしくお願いいたします。

--標準モジュール側--
Sub insatsu()
  Dim Ws As Excel.Worksheet
  Dim HPBreak As Excel.HPageBreak

  Set Ws = ActiveSheet
  gyo = 50

  ActiveWindow.SelectedSheets.PrintPreview

  UserForm1.Show vbModeless

  If UserForm1.Tag = vbCancel Then
    '改行位置を入れる"
  ElseIf UserForm1.Tag = vbOK Then
    '行追加処理"
  End If
End sub

--ユーザーフォーム側--
Private Sub CommandButton1_Click()
  Me.Tag = vbOK
  Me.Hide
End Sub

Private Sub UserForm_initialize()
  Me.Tag = vbCancel
  UserForm1.Show vbModeless
End Sub

【61293】Re:ユーザーフォームのボタンクリックイ...
発言  Abyss  - 09/4/23(木) 17:47 -

引用なし
パスワード
   >ユーザーフォームを表示したままにして、改ページ指定が終わったら

でしたら、

>ActiveWindow.SelectedSheets.PrintPreview

よりは ActiveWindow.View = xlPageBreakPreviewの方が
適切だと思いますが。それに

>Private Sub UserForm_initialize()
>  Me.Tag = vbCancel
>  UserForm1.Show vbModeless
>End Sub

の中でまた自分を立ち上げてますけど、なにか意味ありますか?

【61294】Re:ユーザーフォームのボタンクリックイ...
質問  satsuki  - 09/4/23(木) 18:08 -

引用なし
パスワード
   Abyss さん、アドバイスありがとうございます。

>>ユーザーフォームを表示したままにして、改ページ指定が終わったら
>>ActiveWindow.SelectedSheets.PrintPreview
>よりは ActiveWindow.View = xlPageBreakPreviewの方が
>適切だと思いますが。
改ページ指定をするためにページプレビューをしないと、現在の改ページ位置がわからないとどこかのホームページに書いてあったのです。

>>Private Sub UserForm_initialize()
>>  Me.Tag = vbCancel
>>  UserForm1.Show vbModeless
>>End Sub
>の中でまた自分を立ち上げてますけど、なにか意味ありますか?

標準モジュール側で
Userform1.Show vbModeless
とすると、Userform側のボタンクリック時のTagの値を受け取らずに、
先へ流れてしまうので、あちこち調べて上記のようなコードにしましたが、
やはり結果は同じでした。

どのように直したらよろしいでしょうか?
ご教示お願いいたします。

【61295】Re:ユーザーフォームのボタンクリックイ...
発言  Abyss  - 09/4/23(木) 18:24 -

引用なし
パスワード
   >改ページ指定をするためにページプレビューをしないと、
>現在の改ページ位置がわからないとどこかのホームページに
>書いてあったのです。

そうですか?要するに初期化のためのことでしょうかね。
Activesheet.displayPageBreaks = Trueとかで
ダイレクトに出来ると思いますが。

>Userform側のボタンクリック時のTagの値を受け取らずに、
>先へ流れてしまうので

Modelessに指定していますから、標準モジュールの
コードが最後まで進むのは仕様ですよね。ならば、
必要な部分をUserformのボタンクリックイベントに
直接書くのが簡単だと思います。

【61296】Re:ユーザーフォームのボタンクリックイ...
質問  satsuki  - 09/4/24(金) 11:56 -

引用なし
パスワード
   Abyss さん、お返事ありがとうございます。

>そうですか?要するに初期化のためのことでしょうかね。
>Activesheet.displayPageBreaks = Trueとかで
>ダイレクトに出来ると思いますが。
初期化のためだったのですね。勘違いしておりました。

>Modelessに指定していますから、標準モジュールの
>コードが最後まで進むのは仕様ですよね。ならば、
>必要な部分をUserformのボタンクリックイベントに
>直接書くのが簡単だと思います。
標準モジュール側の
UserForm1.Show vbModeless
を削除し、ユーザーフォーム側の下記イベントにそれぞれ入れてみましたが、
Private Sub CommandButton1_Click()
Private Sub UserForm_initialize()
ボタンクリックイベントに
UserForm1.Show vbModeless
を書くとユーザーフォームが開きません。(当然ですね)
また、イニシャライズのイベントがないと、Me.Tagの初期値にvbCancel
が入らないので、標準モジュール側の下記コードで「型が一致しません」という
エラーがでます。
If UserForm1.Tag = vbCancel Then
どのように直したらよいでしょうか?よろしくお願いいたします。

--標準モジュール側--
Sub insatsu()
  Dim Ws As Excel.Worksheet
  Dim HPBreak As Excel.HPageBreak

  Set Ws = ActiveSheet
  gyo = 50

  Activesheet.displayPageBreaks = True

  If UserForm1.Tag = vbCancel Then
    '改行位置を入れる"
  ElseIf UserForm1.Tag = vbOK Then
    '行追加処理"
  End If
End sub

--ユーザーフォーム側--
Private Sub CommandButton1_Click()
  Me.Tag = vbOK
  Me.Hide
End Sub

Private Sub UserForm_initialize()
  Me.Tag = vbCancel
  UserForm1.Show vbModeless
End Sub

【61297】Re:ユーザーフォームのボタンクリックイ...
発言  Abyss  - 09/4/24(金) 13:36 -

引用なし
パスワード
   少し、狙いを整理してみてください。

要するに、Userformを処理の引き金とする事ですので、
フォームをModalで表示するのであれば、標準モジュールでも
構いません。Userformが閉じるまでコードの流れは
Stopしますから。Userformが閉じた後にUserformの
戻り値で処理を分配するだけですね。

しかし、今回の質問がUserformを表示したまま処理を
したいことですので、Modelessになります。
ならば、実現したいコードを標準モジュールに
書いてしまうと標準モジュールのコードは
そのまま進行します。なので、そのまま進行しても
影響されない部分に書く必要がありますね。
だから、直接Userformモジュールに記述することに
なります。

ご提示のコードだけじゃ全体が見えませんが、
考え方として↓の方法がよろしいかと思います。

(例)
' 標準モジュール
Sub insatsu()
  Dim gyo As Long
  Dim Ws As Excel.Worksheet
  Dim HPBreak As Excel.HPageBreak

  Set Ws = ActiveSheet
  gyo = 50

  ActiveSheet.DisplayPageBreaks = True
  
  UserForm1.Show vbModeless

End Sub

' Userformモジュール
Private Sub CommandButton1_Click()
  ' 行追加処理 ...
  MsgBox "行追加処理です。"
End Sub

【61300】Re:ユーザーフォームのボタンクリックイ...
お礼  satsuki  - 09/4/24(金) 14:52 -

引用なし
パスワード
   Abyss さん、お返事ありがとうございます。

>しかし、今回の質問がUserformを表示したまま処理を
>したいことですので、Modelessになります。
>ならば、実現したいコードを標準モジュールに
>書いてしまうと標準モジュールのコードは
>そのまま進行します。なので、そのまま進行しても
>影響されない部分に書く必要がありますね。
>だから、直接Userformモジュールに記述することに
>なります。
なるほど、Userformモジュールに直接記述するというのは
後処理のことだったのですね。
掲示して頂いたコードのとおりにやりましたらできました。
助かりました。ありがとうございました。

3583 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free