Excel VBA質問箱 IV

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

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


11546 / 13645 ツリー ←次へ | 前へ→

【15534】Worksheet_Changeについて まさぼん 04/6/28(月) 19:07 質問[未読]
【15535】Re:Worksheet_Changeについて ちゃっぴ 04/6/28(月) 19:21 発言[未読]
【15536】Re:Worksheet_Changeについて まさぼん 04/6/28(月) 19:42 発言[未読]
【15537】Re:Worksheet_Changeについて まさぼん 04/6/28(月) 19:50 発言[未読]
【15538】Re:Worksheet_Changeについて IROC 04/6/28(月) 20:02 回答[未読]
【15539】Re:Worksheet_Changeについて まさぼん 04/6/28(月) 20:24 質問[未読]
【15541】Re:Worksheet_Changeについて まさぼん 04/6/28(月) 20:38 お礼[未読]
【15543】Re:Worksheet_Changeについて [名前なし] 04/6/28(月) 22:41 発言[未読]
【15548】Re:Worksheet_Changeについて まさくん 04/6/29(火) 0:34 お礼[未読]

【15534】Worksheet_Changeについて
質問  まさぼん  - 04/6/28(月) 19:07 -

引用なし
パスワード
   こんにちは、ご質問があります。

"セルA1"に数値を入力→Enterキー→"セルA2"に("セルA1")×1.05の計算結果を表示

と、するのはどのようにすれば良いのでしょうか?

【15535】Re:Worksheet_Changeについて
発言  ちゃっぴ  - 04/6/28(月) 19:21 -

引用なし
パスワード
   数式で十分だと思いますが?

【15536】Re:Worksheet_Changeについて
発言  まさぼん  - 04/6/28(月) 19:42 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>数式で十分だと思いますが?


実は、もう少しややこしい処理でして…
入力が正しくなければエラーチェックとか行いたいんですよ。
ですので、Worksheet_Changeを使用しないといけないと思ってます。

【15537】Re:Worksheet_Changeについて
発言  まさぼん  - 04/6/28(月) 19:50 -

引用なし
パスワード
   ちなみにソースはこちらです。


Private Sub Worksheet_Change(ByVal Target As Range)

  Dim lngOpeTime     As Long         ' 運転時間
  Dim lngAveSpeed     As Long         ' 平均速度


  ' 処理開始
  On Error GoTo ErrorHandler
  
  ' 運転時間取得
  lngOpeTime = Sheets(MAIN_SHEET).Range("celOpeTime").Value
  
  
  '---値チェック---
  If Sheets(MAIN_SHEET).Range("celOpeTime").Value <> 0 Then
    ' 総巻長が0以下だった場合
    If glngTotalLength <= 0 Then
      ' 総巻長 = 0の場合 -> 計算不可
      'メッセージボックス出力
      MsgBox "総巻長が 0(m) または 0(m)以下 のため、平均速度が算出できません。", vbInformation, "平均速度算出"
              
      Exit Sub
    End If
    
    
    ' 運転時間が数値入力された場合
    If IsNumeric(lngOpeTime) = True Then
      ' 運転時間が0入力でない場合
      If lngOpeTime > 0 Then
        ' 平均速度を算出
        lngAveSpeed = glngTotalLength / lngOpeTime
        ' 平均速度を表示
        Sheets(MAIN_SHEET).Range("celAveSpeed").Value = lngAveSpeed
→正常入力した場合、ココにくるんですが、ここで、また先頭に戻り、ずーっとloopするんです!        
        Exit Sub
      Else
        ' 運転時間が0以下入力の場合 -> 計算不可
        'メッセージボックス出力
        MsgBox "運転時間項目には、0より大きい数値を入力して下さい。", vbInformation, "平均速度算出"
        
        Exit Sub
      End If
    Else
      ' 運転時間が数値入力でない場合 -> 計算不可
      'メッセージボックス出力
      MsgBox "運転時間項目には、数値を入力して下さい。", vbInformation, "平均速度算出"

      Exit Sub
    End If  
  End If
  
  Exit Sub
          
ErrorHandler:

  ' エラー処理
  gErrMsgOutPut "Worksheet_Change", Err.Description
  
End Sub

【15538】Re:Worksheet_Changeについて
回答  IROC  - 04/6/28(月) 20:02 -

引用なし
パスワード
   コードは見ていませんが、
changeイベントが再発動しているのではないでしょうか?


EnableEvents プロパティを使っては如何でしょうか?


True の場合、指定されたオブジェクトに対してイベントが発生します。
値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。


EnableEvents プロパティの使用例

この使用例は、BeforeSave イベントが発生しないように、
ファイルを保存する前にイベントを無効にします。

Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True

【15539】Re:Worksheet_Changeについて
質問  まさぼん  - 04/6/28(月) 20:24 -

引用なし
パスワード
   おっしゃるとおり、changeイベントが再発動しています。

ただ、入力されるたびに計算し、表示させたいのですが、
そのような場合も、
Application.EnableEvents
を使用すれば良いのでしょうか?

【15541】Re:Worksheet_Changeについて
お礼  まさぼん  - 04/6/28(月) 20:38 -

引用なし
パスワード
   すいません!よく理解すればできました。

どうも、ありがとうございました!

感謝いたします。

【15543】Re:Worksheet_Changeについて
発言  [名前なし]  - 04/6/28(月) 22:41 -

引用なし
パスワード
   関数にしてみました。
標準モジュールにコピペして使います。

Function AveSpeed(TotalLength As Range, OpeTime As Range)
 'TotalLength:総巻長 OpeTime:運転時間
 AveSpeed = ""
 
 Select Case True
 '総巻長が空白の時
 Case TotalLength.Value = ""
  Exit Function
 '運転時間が空白の時
 Case OpeTime.Value = ""
  Exit Function
 '総巻長が数字じゃない時
 Case Not IsNumeric(TotalLength.Value)
  MsgBox "総巻長項目には、数値を入力して下さい。", vbExclamation, "平均速度算出"
  Exit Function
 '運転時間が数字じゃない時
 Case Not IsNumeric(OpeTime.Value)
  MsgBox "運転時間項目には、数値を入力して下さい。", vbExclamation, "平均速度算出"
  Exit Function
 '総巻長が0以下の場合
 Case TotalLength <= 0
  MsgBox "総巻長が 0(m) または 0(m)以下 のため、平均速度が算出できません。", vbExclamation, "平均速度算出"
  Exit Function
 '運転時間が0以下の場合
 Case OpeTime <= 0
  MsgBox "運転時間項目には、0より大きい数値を入力して下さい。", vbExclamation, "平均速度算出"
  Exit Function
 End Select
 
 AveSpeed = TotalLength / OpeTime
End Function

他の関数と同じように、A1が総巻長、B1が運転時間のときに

=AveSpeed(A1,B1)

という感じで入力します。って、もう見てないよな・・・

【15548】Re:Worksheet_Changeについて
お礼  まさくん  - 04/6/29(火) 0:34 -

引用なし
パスワード
   いやいや、見てますよ(--)

こちらの方が見やすいですね…。
ぜひ、参考にさせて戴きます!

ありがとうございました。

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