Excel VBA質問箱 IV

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

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


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

【67911】EventMacroの不安定 tama 11/1/16(日) 14:02 質問[未読]
【67912】Re:EventMacroの不安定 n 11/1/16(日) 14:48 発言[未読]
【67913】Re:EventMacroの不安定 tama 11/1/16(日) 20:53 質問[未読]
【67914】Re:EventMacroの不安定 山猿 11/1/16(日) 22:24 発言[未読]
【67918】Re:EventMacroの不安定 tama 11/1/17(月) 7:47 質問[未読]
【67924】Re:EventMacroの不安定 neptune 11/1/17(月) 12:34 発言[未読]
【67925】Re:EventMacroの不安定 n 11/1/17(月) 12:41 発言[未読]
【67928】Re:EventMacroの不安定 n 11/1/17(月) 17:04 発言[未読]

【67911】EventMacroの不安定
質問  tama  - 11/1/16(日) 14:02 -

引用なし
パスワード
   以下のようなイベントマクロを書きました
A列のセルが空白のときはその該当の行のB列は標準のフォントで、
A列のセルが空白で無いときはその該当行のB列は()付きの文字または数字に
しかし反応が不安定でしかもC列やD列でも反応するのです。B列だけの限定をしているのですが、コードのどこに問題があるのでしょう。
よろしくお願いします。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("A6:A20")) Is Nothing Then Exit Sub
On Error Resume Next
With Target
  If .Value = "" Then
    .Offset(, 1).NumberFormatLocal = "G/標準"
  End If
  If .Value <> "" Then
    .Offset(, 1).NumberFormatLocal = """(""@"")"""
  End If
End With
On Error GoTo 0
End Sub

【67912】Re:EventMacroの不安定
発言  n  - 11/1/16(日) 14:48 -

引用なし
パスワード
   >...コードのどこに問題があるのでしょう。

1)SelectionChangeイベントである必要はあるのか。
A6:A20の値が変わった時だけ判定すれば良いのでは。
Worksheet_Changeイベント、
あるいはA6:A20が数式ならWorksheet_Calculateイベントの検討をする。

2)On Error Resume Nextを外して検証する。
>反応が不安定でしかもC列やD列でも反応するのです。
この時はエラーが出ているはず。
SelectionChangeもChangeも、Targetが複数セル範囲の場合がある。

3)一旦、Intersect(Target, Range("A6:A20"))をRange型変数に受けて処理する。
(2)にも関連するがTargetが複数セル範囲の場合も考慮する必要があり
そのままTargetに対して処理せずIntersect範囲をさらにLoopさせる必要あり。

4)Offset
横方向の結合セルがなければ問題なし。

...ひとまず、以上の事は要検討です。

【67913】Re:EventMacroの不安定
質問  tama  - 11/1/16(日) 20:53 -

引用なし
パスワード
   ▼n さん:
アドバイスありがとうございます。
色々とチェックを入れてコードを訂正しましたが・・・

何故かC9:D12に数字を入れると、全てカッコ付き(数字)となります。
また、お時間が有りましたら、コードをチェックしてください。
B列の反応も、A列の数字を削除してもセルの升目の左に残ったまま( )が外されますが、"G/標準"になりません。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A6:A20")) Is Nothing Then Exit Sub
Dim i As Long
With Sheets(1)
For i = 6 To 20
  If .Cells(i, 1).Value = "" Then
    .Cells(i, 2).NumberFormatLocal = "G/標準"
  End If
  If .Cells(i, 1).Value <> "" Then
    .Cells(i, 2).NumberFormatLocal = """(""@"")"""
  End If
  Next
End With
End Sub 

【67914】Re:EventMacroの不安定
発言  山猿  - 11/1/16(日) 22:24 -

引用なし
パスワード
   横槍失礼。

> 何故かC9:D12に数字を入れると、全てカッコ付き(数字)となります。
そのセルが既にそういう書式になっているからでしょう。
If Intersect(Target, Range("A6:A20")) Is Nothing Then Exit Sub
にブレークポイントを置いて、そのあとステップ実行して、
そのプロシージャーの動作を確認してみては、どうですか?
C9:D12に入力したときは、直ぐに抜けているはずです。

こんな風に書いてはどうですか?
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim wRange As Range, r As Range
  
  Set wRange = Intersect(Target, Range("A6:A20"))
  If wRange Is Nothing Then Exit Sub
  For Each r In wRange
    If r.Value = "" Then
      r.Offset(, 1).NumberFormatLocal = "G/標準"
    Else
      r.Offset(, 1).NumberFormatLocal = """(""@"")"""
    End If
  Next
End Sub

【67918】Re:EventMacroの不安定
質問  tama  - 11/1/17(月) 7:47 -

引用なし
パスワード
   ▼山猿 さん:
ありがとうございます。

> 何故かC9:D12に数字を入れると、全てカッコ付き(数字)となります。
>そのセルが既にそういう書式になっているからでしょう。
その通りです。

>If Intersect(Target, Range("A6:A20")) Is Nothing Then Exit Sub
>にブレークポイントを置いて、そのあとステップ実行して、
>そのプロシージャーの動作を確認してみては、どうですか?
>C9:D12に入力したときは、直ぐに抜けているはずです。
3ステップで抜け出ます。これは問題ありでしょうか?

ご提供いただいたコードのリアクションは確実に動作します。ありがとうございます。
ただ、A列に数字を入れるとB列に在った数字が文字列的にセルの左に移動はしますがカッコ( )は付きません。ここまでは必要は無いかも知れませんが、Eventの動作として、動くのでは?っと思っていました。

【67924】Re:EventMacroの不安定
発言  neptune  - 11/1/17(月) 12:34 -

引用なし
パスワード
   ▼tama さん:
良くは見てませんけど

@は文字列の書式指定文字。
#とか0の数値の書式指定文字もありますが。試しては如何?
数値なら数値として扱うべきでは。

セルに入っているデータがどんなデータ形式を持っているかの問題という話でした。

【67925】Re:EventMacroの不安定
発言  n  - 11/1/17(月) 12:41 -

引用なし
パスワード
   (@)でないといけないのですか?
(#)あるいは(-#)ではダメなのでしょうか。
つまり数字を文字列ではなく数値のままカッコをつけるという意味ですが。
それでも良ければ
>r.Offset(, 1).NumberFormatLocal = """(""@"")"""
r.Offset(, 1).NumberFormatLocal = "(#);(-#);(@)"
この部分の変更だけです。

文字列として扱いたい場合は
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range

  Set Target = Intersect(Target, Range("A6:A20"))
  If Target Is Nothing Then Exit Sub
  For Each r In Target
    With r.Offset(, 1)
      Application.EnableEvents = False
      If r.Value = "" Then
        .NumberFormatLocal = "g/標準"
        .Value = .Value
      Else
        .NumberFormatLocal = "(@)"
        .Value = "'" & .Value
      End If
      Application.EnableEvents = True
    End With
  Next
End Sub
こんな感じですか。

【67928】Re:EventMacroの不安定
発言  n  - 11/1/17(月) 17:04 -

引用なし
パスワード
   失礼...orz
EnableEvents制御の位置が悪いです。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range

  Set Target = Intersect(Target, Range("A6:A20"))
  If Target Is Nothing Then Exit Sub
  Application.EnableEvents = False
  For Each r In Target
    With r.Offset(, 1)
      If r.Value = "" Then
        .NumberFormatLocal = "g/標準"
        .Value = .Value
      Else
        .NumberFormatLocal = "(@)"
        .Value = "'" & .Value
      End If
    End With
  Next
  Application.EnableEvents = True
End Sub

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