Excel VBA質問箱 IV

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

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


6850 / 13646 ツリー ←次へ | 前へ→

【42699】VBA動作後Enter・矢印きー動作不能 hori 06/9/19(火) 17:31 質問[未読]
【42705】Re:VBA動作後Enter・矢印きー動作不能 ichinose 06/9/19(火) 20:32 発言[未読]
【42707】Re:VBA動作後Enter・矢印きー動作不能 hori 06/9/19(火) 21:04 発言[未読]
【42709】Re:VBA動作後Enter・矢印きー動作不能 ichinose 06/9/19(火) 21:17 発言[未読]
【42714】Re:VBA動作後Enter・矢印きー動作不能 hori 06/9/20(水) 1:26 発言[未読]
【42715】Re:VBA動作後Enter・矢印きー動作不能 hori 06/9/20(水) 1:50 発言[未読]
【42717】Re:VBA動作後Enter・矢印きー動作不能 ichinose 06/9/20(水) 7:41 発言[未読]
【42726】Re:VBA動作後Enter・矢印きー動作不能 hori 06/9/20(水) 10:23 発言[未読]
【42756】Re:VBA動作後Enter・矢印きー動作不能 ichinose 06/9/20(水) 18:50 発言[未読]
【42761】Re:VBA動作後Enter・矢印きー動作不能 hori 06/9/20(水) 23:28 お礼[未読]

【42699】VBA動作後Enter・矢印きー動作不能
質問  hori  - 06/9/19(火) 17:31 -

引用なし
パスワード
   下記にてプログラムを実行すると矢印キー、Enterキーが動作不能に
なるのですがお解りになる方教授お願いします。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=40893;id=excel

【42705】Re:VBA動作後Enter・矢印きー動作不能
発言  ichinose  - 06/9/19(火) 20:32 -

引用なし
パスワード
   ▼hori さん:
こんばんは。

>下記にてプログラムを実行すると矢印キー、Enterキーが動作不能に
>なるのですがお解りになる方教授お願いします。
>
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=40893;id=excel

この記述では、再現手順の記述になっていません。
なっていなければ、投稿を見ても再現ができませんよね!!

horiさんは、「矢印キー、Enterキーが動作不能になる」
再現手順書を記述してみてください。
その際この現象を確認したExcelのバージョンの記述もお願いします。

気になったのは、Commandbutton1をクリックして
ファイル検索中にユーザーフォームの閉じるボタンをクリックして
ユーザーフォームを閉じてしまった場合ですが・・・。

【42707】Re:VBA動作後Enter・矢印きー動作不能
発言  hori  - 06/9/19(火) 21:04 -

引用なし
パスワード
   ▼ichinose さん:
返事ありがとうございます。
UserForm1に
Private Sub CommandButton1_Click()
  Call disp_open(Label1, "処理中しばらくお待ちください", 30)
  Range("A1:AF84").Select
  Call disp_proc
  DoEvents
  Range("AF84").Activate
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$AF$84"
  Call disp_proc
  DoEvents
  With ActiveSheet.PageSetup
  End With
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$AF$84"
  With ActiveSheet.PageSetup
    .PrintHeadings = False
     Call disp_proc
     DoEvents
    .PrintGridlines = False
     Call disp_proc
     DoEvents
    .PrintComments = xlPrintNoComments
     Call disp_proc
     DoEvents
    .PrintQuality = 600
     Call disp_proc
     DoEvents
    .CenterHorizontally = False
     Call disp_proc
     DoEvents
    .CenterVertically = False
     Call disp_proc
     DoEvents
    .Orientation = xlPortrait
     Call disp_proc
     DoEvents
    .Draft = False
     Call disp_proc
     DoEvents
    .PaperSize = xlPaperA4
     Call disp_proc
     DoEvents
    .FirstPageNumber = xlAutomatic
     Call disp_proc
     DoEvents
    .Order = xlDownThenOver
     Call disp_proc
     DoEvents
    .BlackAndWhite = False
     Call disp_proc
     DoEvents
    .PrintErrors = xlPrintErrorsDisplayed
   Application.Goto Reference:="R17C4"
  End With
  Call disp_proc
  DoEvents
  Call disp_close
  Label1.Caption = ""
  Hide
End Sub
Private Sub CommandButton2_Click()
  Hide
End Sub
Private Sub CommandButton3_Click()
  Call disp_open(Label1, "処理中しばらくお待ちください", 30)
  Range("A1:BL84").Select
  Call disp_proc
  DoEvents
  Range("BL84").Activate
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$BL$84"
  Call disp_proc
  DoEvents
  With ActiveSheet.PageSetup
  End With
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$BL$84"
  With ActiveSheet.PageSetup
  Call disp_proc
  DoEvents
    .PrintHeadings = False
     Call disp_proc
     DoEvents
    .PrintGridlines = False
     Call disp_proc
     DoEvents
    .PrintComments = xlPrintNoComments
     Call disp_proc
     DoEvents
    .PrintQuality = 600
     Call disp_proc
     DoEvents
    .CenterHorizontally = False
     Call disp_proc
     DoEvents
    .CenterVertically = False
     Call disp_proc
     DoEvents
    .Orientation = xlLandscape
     Call disp_proc
     DoEvents
    .Draft = False
     Call disp_proc
     DoEvents
    .PaperSize = xlPaperA3
     Call disp_proc
     DoEvents
    .FirstPageNumber = xlAutomatic
     Call disp_proc
     DoEvents
    .Order = xlDownThenOver
     Call disp_proc
     DoEvents
    .BlackAndWhite = False
     Call disp_proc
     DoEvents
    .PrintErrors = xlPrintErrorsDisplayed
   Application.Goto Reference:="R1C1"
   Application.Goto Reference:="R17C4"
  End With
     Call disp_proc
     DoEvents
  Call disp_close
  Label1.Caption = ""
  Hide
End Sub

標準モジュールに
'===========================================================
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private d_str As String
Private d_idx As Long
Private d_lbl As MSForms.Label
Private d_int As Long
Private d_len As Long
Private d_jdx As Long
'======================================================================
Sub disp_open(ByVal lbl As MSForms.Label, ByVal disp_str As String, Optional ByVal interval As Long = 100)
  Dim wk As Double
  Set d_lbl = lbl
  d_str = disp_str & String(Len(disp_str), " ")
  With d_lbl
    wk = .ForeColor
    .ForeColor = .BackColor
    .TextAlign = fmTextAlignRight
    .Caption = disp_str
    .Font.Name = "MS ゴシック"
    .Font.Size = 10
    .AutoSize = True
    DoEvents
    .AutoSize = False
    .Caption = ""
    .ForeColor = wk
    .Height = 20
    End With
  d_idx = 1
  d_jdx = 1
  d_int = interval
  d_len = Len(disp_str)
End Sub
'===============================================================
Sub disp_proc()
  Dim mystr As String
  If d_jdx > d_len Then
    d_idx = 1
    d_lbl.Caption = ""
    d_jdx = 1
    End If
  If d_idx > d_len Then
    d_jdx = d_jdx + 1
    d_idx = d_len
    End If
  mystr = Mid(d_str, d_jdx, d_idx)
  d_lbl.Caption = mystr
  d_idx = d_idx + 1
  Sleep d_int
End Sub
'==================================================================
Sub disp_close()
  d_str = ""
  d_idx = 0
  d_lbl.Caption = ""
  Set d_lbl = Nothing
End Sub
このようにしています。

>>下記にてプログラムを実行すると矢印キー、Enterキーが動作不能に
>>なるのですがお解りになる方教授お願いします。
>>
>>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=40893;id=excel
>
>この記述では、再現手順の記述になっていません。
>なっていなければ、投稿を見ても再現ができませんよね!!
>
>horiさんは、「矢印キー、Enterキーが動作不能になる」
>再現手順書を記述してみてください。
>その際この現象を確認したExcelのバージョンの記述もお願いします。
Excel2002&2003両方で同じ現象があります。
>
>気になったのは、Commandbutton1をクリックして
>ファイル検索中にユーザーフォームの閉じるボタンをクリックして
>ユーザーフォームを閉じてしまった場合ですが・・・。

以上ですよろしくお願いします。

【42709】Re:VBA動作後Enter・矢印きー動作不能
発言  ichinose  - 06/9/19(火) 21:17 -

引用なし
パスワード
   ▼hori さん:
これは、コードを提示されただけです。
「矢印キー、Enterキーが動作不能になる」という現象が起こすためには
どうすればよいのですか?
excel2002でCommandbutton1とCommandbutton3をクリックしてみましたが、
特に「矢印キー、Enterキーが動作不能になる」という現象は発生しませんでした。

【42714】Re:VBA動作後Enter・矢印きー動作不能
発言  hori  - 06/9/20(水) 1:26 -

引用なし
パスワード
   ▼ichinose さん:
返事遅くなりすみません。
動作不能になるのは、Commandbutton1とCommandbutton3押して
Commandbutton2で終了させた直後です。

ちなみにユーザーフォーム1に下記コードも書き込んでありますが
これには全然さわらずに
現象は発生します。下記参照
Private Sub CommandButton4_Click()
  Dim oldPrinter As String

  ' 設定する前に今のプリンタを覚える
  oldPrinter = Application.ActivePrinter
  ' 任意のプリンタに変更
  Application.ActivePrinter = "Canon LBP-2810 on Ne06:"
  ' 変更があったか確認
  If Application.ActivePrinter <> oldPrinter Then
    MsgBox "2810にプリンタが変更されました。"
  End If
End Sub

Private Sub CommandButton5_Click()
  Dim oldPrinter As String

  ' 設定する前に今のプリンタを覚える
  oldPrinter = Application.ActivePrinter
  ' 任意のプリンタに変更
  Application.ActivePrinter = "Canon LBP5800 LIPS on Ne05:"
  ' 変更があったか確認
  If Application.ActivePrinter <> oldPrinter Then
    MsgBox "5800にプリンタが変更されました。"
  End If
End Sub

Private Sub UserForm_Activate()
 Do
  Label3.Caption = Now
  DoEvents '←★ここがポイント
 Loop
End Sub

Private Sub UserForm_Terminate()
 End
End Sub

いかがでしょうか。

>これは、コードを提示されただけです。
>「矢印キー、Enterキーが動作不能になる」という現象が起こすためには
>どうすればよいのですか?
>excel2002でCommandbutton1とCommandbutton3をクリックしてみましたが、
>特に「矢印キー、Enterキーが動作不能になる」という現象は発生しませんでした。

【42715】Re:VBA動作後Enter・矢印きー動作不能
発言  hori  - 06/9/20(水) 1:50 -

引用なし
パスワード
   ▼ichinose さん:
いろいろさわってみたところ
下記に問題があるみたいなのですが
どうでしょうか。
問題があるとすれば回避する方法はありますか。

Private Sub UserForm_Activate()
 Do
  Label3.Caption = Now
  DoEvents '←★ここがポイント
 Loop
End Sub

Private Sub UserForm_Terminate()
 End
End Sub

【42717】Re:VBA動作後Enter・矢印きー動作不能
発言  ichinose  - 06/9/20(水) 7:41 -

引用なし
パスワード
   ▼hori さん:
おはようございます。
Hideというメソッドは、ユーザーフォームを非表示にするメソッドです。

このイベントプロシジャーは、ユーザーフォームが表示されたと同時に
ずっとループしていますね!!↓
>Private Sub UserForm_Activate()
> Do
>  Label3.Caption = Now
>  DoEvents '←★ここがポイント
> Loop
>End Sub

Hideメソッドで非表示にしても動作していることがトラブルの原因になっています。


簡単な修正は、HIDEという記述がある箇所をすべて

Unload me

に変更すれば、改善すると思いますが・・・。

これだとこのコードを見た人はきっと不安になります。
>Private Sub UserForm_Activate()
> Do
>  Label3.Caption = Now
>  DoEvents '←★ここがポイント
> Loop
>End Sub

このループはどこで終わるのだろう?? って・・。
Private loop_end as boolean
>Private Sub UserForm_Activate()
 loop_end=false
  Do until loop_end
>  Label3.Caption = Now
>  DoEvents '←★ここがポイント
> Loop
>End Sub

とし、
loop_end=true
doevents
unload me

というコードをUnload Meの前(Hideと記述したところ全て)に追加します。

これで試してみてください

それとHIDEだけでも動作しますが、
せめてMe.HideとMeぐらいは付けてくださいね。
Hideはユーザーフォームのメソッドですから。

【42726】Re:VBA動作後Enter・矢印きー動作不能
発言  hori  - 06/9/20(水) 10:23 -

引用なし
パスワード
   ▼ichinose さん:
返事ありがとうございます。下記のように
修正しましたが コンパイルエラー[変数が定義されてません。]
ちょっと修正方法が?です。よろしくお願いします。
Option Explicit
Private Sub CommandButton1_Click()
  Call disp_open(Label1, "処理中しばらくお待ちください", 30)
  Range("A1:AF84").Select
  Call disp_proc
  DoEvents
  Range("AF84").Activate
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$AF$84"
  Call disp_proc
  DoEvents
  With ActiveSheet.PageSetup
  End With
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$AF$84"
  With ActiveSheet.PageSetup
    .PrintHeadings = False
     Call disp_proc
     DoEvents
    .PrintGridlines = False
     Call disp_proc
     DoEvents
    .PrintComments = xlPrintNoComments
     Call disp_proc
     DoEvents
    .PrintQuality = 600
     Call disp_proc
     DoEvents
    .CenterHorizontally = False
     Call disp_proc
     DoEvents
    .CenterVertically = False
     Call disp_proc
     DoEvents
    .Orientation = xlPortrait
     Call disp_proc
     DoEvents
    .Draft = False
     Call disp_proc
     DoEvents
    .PaperSize = xlPaperA4
     Call disp_proc
     DoEvents
    .FirstPageNumber = xlAutomatic
     Call disp_proc
     DoEvents
    .Order = xlDownThenOver
     Call disp_proc
     DoEvents
    .BlackAndWhite = False
     Call disp_proc
     DoEvents
    .PrintErrors = xlPrintErrorsDisplayed
   Application.Goto Reference:="R17C4"
  End With
  Call disp_proc
  DoEvents
  Call disp_close
  Label1.Caption = ""
loop_end = True
DoEvents
Unload Me
 Unload Me
End Sub
Private Sub CommandButton2_Click()
loop_end = True
DoEvents
Unload Me
 Unload Me
End Sub
Private Sub CommandButton3_Click()
  Call disp_open(Label1, "処理中しばらくお待ちください", 30)
  Range("A1:BL84").Select
  Call disp_proc
  DoEvents
  Range("BL84").Activate
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$BL$84"
  Call disp_proc
  DoEvents
  With ActiveSheet.PageSetup
  End With
  Call disp_proc
  DoEvents
  ActiveSheet.PageSetup.PrintArea = "$A$1:$BL$84"
  With ActiveSheet.PageSetup
  Call disp_proc
  DoEvents
    .PrintHeadings = False
     Call disp_proc
     DoEvents
    .PrintGridlines = False
     Call disp_proc
     DoEvents
    .PrintComments = xlPrintNoComments
     Call disp_proc
     DoEvents
    .PrintQuality = 600
     Call disp_proc
     DoEvents
    .CenterHorizontally = False
     Call disp_proc
     DoEvents
    .CenterVertically = False
     Call disp_proc
     DoEvents
    .Orientation = xlLandscape
     Call disp_proc
     DoEvents
    .Draft = False
     Call disp_proc
     DoEvents
    .PaperSize = xlPaperA3
     Call disp_proc
     DoEvents
    .FirstPageNumber = xlAutomatic
     Call disp_proc
     DoEvents
    .Order = xlDownThenOver
     Call disp_proc
     DoEvents
    .BlackAndWhite = False
     Call disp_proc
     DoEvents
    .PrintErrors = xlPrintErrorsDisplayed
   Application.Goto Reference:="R1C1"
   Application.Goto Reference:="R17C4"
  End With
     Call disp_proc
     DoEvents
  Call disp_close
  Label1.Caption = ""
loop_end = True
DoEvents
Unload Me
 Unload Me
End Sub
Private Sub CommandButton4_Click()
  Dim oldPrinter As String

  ' 設定する前に今のプリンタを覚える
  oldPrinter = Application.ActivePrinter
  ' 任意のプリンタに変更
  Application.ActivePrinter = "Canon LBP-2810 on Ne06:"
  ' 変更があったか確認
  If Application.ActivePrinter <> oldPrinter Then
    MsgBox "2810にプリンタが変更されました。"
  End If
End Sub

Private Sub CommandButton5_Click()
  Dim oldPrinter As String

  ' 設定する前に今のプリンタを覚える
  oldPrinter = Application.ActivePrinter
  ' 任意のプリンタに変更
  Application.ActivePrinter = "Canon LBP5800 LIPS on Ne05:"
  ' 変更があったか確認
  If Application.ActivePrinter <> oldPrinter Then
    MsgBox "5800にプリンタが変更されました。"
  End If
End Sub

Private loop_end As Boolean
 loop_end = False
  Do Until loop_end
  Label3.Caption = Now
  DoEvents '←★ここがポイント
 Loop
End Sub

Private Sub UserForm_Terminate()
 End
End Sub

【42756】Re:VBA動作後Enter・矢印きー動作不能
発言  ichinose  - 06/9/20(水) 18:50 -

引用なし
パスワード
   ▼hori さん:
こんばんは。

>返事ありがとうございます。下記のように
>修正しましたが コンパイルエラー[変数が定義されてません。]
>ちょっと修正方法が?です。よろしくお願いします。


Option Explicit
Private loop_end As Boolean
Private Sub UserForm_Activate()
  loop_end = False
  Do Until loop_end
    Label3.Caption = Now
    DoEvents '←★ここがポイント
    Loop
End Sub
Private Sub UserForm_Terminate()
 End
End Sub
>Private Sub CommandButton1_Click()
>  Call disp_open(Label1, "処理中しばらくお待ちください", 30)
>  Range("A1:AF84").Select
>  Call disp_proc
>  DoEvents
>  Range("AF84").Activate
>  Call disp_proc
>  DoEvents
>  ActiveSheet.PageSetup.PrintArea = "$A$1:$AF$84"
>  Call disp_proc
>  DoEvents
>  With ActiveSheet.PageSetup
>  End With
>  Call disp_proc
>  DoEvents
>  ActiveSheet.PageSetup.PrintArea = "$A$1:$AF$84"
>  With ActiveSheet.PageSetup
>    .PrintHeadings = False
>     Call disp_proc
>     DoEvents
>    .PrintGridlines = False
>     Call disp_proc
>     DoEvents
>    .PrintComments = xlPrintNoComments
>     Call disp_proc
>     DoEvents
>    .PrintQuality = 600
>     Call disp_proc
>     DoEvents
>    .CenterHorizontally = False
>     Call disp_proc
>     DoEvents
>    .CenterVertically = False
>     Call disp_proc
>     DoEvents
>    .Orientation = xlPortrait
>     Call disp_proc
>     DoEvents
>    .Draft = False
>     Call disp_proc
>     DoEvents
>    .PaperSize = xlPaperA4
>     Call disp_proc
>     DoEvents
>    .FirstPageNumber = xlAutomatic
>     Call disp_proc
>     DoEvents
>    .Order = xlDownThenOver
>     Call disp_proc
>     DoEvents
>    .BlackAndWhite = False
>     Call disp_proc
>     DoEvents
>    .PrintErrors = xlPrintErrorsDisplayed
>   Application.Goto Reference:="R17C4"
>  End With
>  Call disp_proc
>  DoEvents
>  Call disp_close
>  Label1.Caption = ""
>loop_end = True
>DoEvents
>Unload Me
'Unload meは一回だけ記述です
>End Sub
>Private Sub CommandButton2_Click()
> loop_end = True
>DoEvents
>Unload Me
' Unload Me  ←ここも不要です
>End Sub
>Private Sub CommandButton3_Click()
>  Call disp_open(Label1, "処理中しばらくお待ちください", 30)
>  Range("A1:BL84").Select
>  Call disp_proc
>  DoEvents
>  Range("BL84").Activate
>  Call disp_proc
>  DoEvents
>  ActiveSheet.PageSetup.PrintArea = "$A$1:$BL$84"
>  Call disp_proc
>  DoEvents
>  With ActiveSheet.PageSetup
>  End With
>  Call disp_proc
>  DoEvents
>  ActiveSheet.PageSetup.PrintArea = "$A$1:$BL$84"
>  With ActiveSheet.PageSetup
>  Call disp_proc
>  DoEvents
>    .PrintHeadings = False
>     Call disp_proc
>     DoEvents
>    .PrintGridlines = False
>     Call disp_proc
>     DoEvents
>    .PrintComments = xlPrintNoComments
>     Call disp_proc
>     DoEvents
>    .PrintQuality = 600
>     Call disp_proc
>     DoEvents
>    .CenterHorizontally = False
>     Call disp_proc
>     DoEvents
>    .CenterVertically = False
>     Call disp_proc
>     DoEvents
>    .Orientation = xlLandscape
>     Call disp_proc
>     DoEvents
>    .Draft = False
>     Call disp_proc
>     DoEvents
>    .PaperSize = xlPaperA3
>     Call disp_proc
>     DoEvents
>    .FirstPageNumber = xlAutomatic
>     Call disp_proc
>     DoEvents
>    .Order = xlDownThenOver
>     Call disp_proc
>     DoEvents
>    .BlackAndWhite = False
>     Call disp_proc
>     DoEvents
>    .PrintErrors = xlPrintErrorsDisplayed
>   Application.Goto Reference:="R1C1"
>   Application.Goto Reference:="R17C4"
>  End With
>     Call disp_proc
>     DoEvents
>  Call disp_close
>  Label1.Caption = ""
>loop_end = True
>DoEvents
>Unload Me
' Unload Me  ←ここも
>End Sub
>Private Sub CommandButton4_Click()
>  Dim oldPrinter As String
>
>  ' 設定する前に今のプリンタを覚える
>  oldPrinter = Application.ActivePrinter
>  ' 任意のプリンタに変更
>  Application.ActivePrinter = "Canon LBP-2810 on Ne06:"
>  ' 変更があったか確認
>  If Application.ActivePrinter <> oldPrinter Then
>    MsgBox "2810にプリンタが変更されました。"
>  End If
>End Sub
>
>Private Sub CommandButton5_Click()
>  Dim oldPrinter As String
>
>  ' 設定する前に今のプリンタを覚える
>  oldPrinter = Application.ActivePrinter
>  ' 任意のプリンタに変更
>  Application.ActivePrinter = "Canon LBP5800 LIPS on Ne05:"
>  ' 変更があったか確認
>  If Application.ActivePrinter <> oldPrinter Then
>    MsgBox "5800にプリンタが変更されました。"
>  End If
>End Sub

VBAの基本的な事をもう少し学ばれたら良いかと思います。
そうすれば、今回の間違いにはすぐ気づかれたと思いますよ!!

【42761】Re:VBA動作後Enter・矢印きー動作不能
お礼  hori  - 06/9/20(水) 23:28 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございました。
うまくいきました。
>
>VBAの基本的な事をもう少し学ばれたら良いかと思います。
>そうすれば、今回の間違いにはすぐ気づかれたと思いますよ!!
お恥ずかしい限りです。
何事もまず基本!ですね。(^-^)(^^;)

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