Excel VBA質問箱 IV

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

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


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

【9321】結合セルのSelectionChangeイベント ぴかる 03/11/28(金) 16:53 質問
【9322】Re:結合セルのSelectionChangeイベント ハマゾウ 03/11/28(金) 17:01 回答
【9323】Re:結合セルのSelectionChangeイベント INA 03/11/28(金) 17:18 回答
【9324】Re:結合セルのSelectionChangeイベント つん 03/11/28(金) 17:28 発言
【9325】Re:結合セルのSelectionChangeイベント ぴかる 03/11/28(金) 17:54 お礼
【9326】やっぱり、自分のミスでした。 ぴかる 03/11/28(金) 18:09 発言
【9327】こんな時は? ぴかる 03/11/28(金) 18:32 質問
【9328】Re:こんな時は? ichinose 03/11/28(金) 20:35 回答
【9329】Re:こんな時は?(無駄コードが・・) ichinose 03/11/28(金) 20:49 発言
【9342】Re:結合セルのSelectionChangeイベント りん 03/11/30(日) 10:38 回答
【9343】Re:結合セルのSelectionChangeイベント ichinose 03/11/30(日) 14:05 発言
【9344】Re:結合セルのSelectionChangeイベント りん 03/11/30(日) 14:22 発言
【9345】Re:結合セルのSelectionChangeイベント ichinose 03/11/30(日) 14:42 お礼
【9370】今、やりたい事が出来ず・・・。 ぴかる 03/12/1(月) 10:44 質問
【9374】Re:今、やりたい事が出来ず・・・。 ichinose 03/12/1(月) 12:50 回答
【9376】出来ました。 ぴかる 03/12/1(月) 13:43 お礼

【9321】結合セルのSelectionChangeイベント
質問  ぴかる  - 03/11/28(金) 16:53 -

引用なし
パスワード
   みなさん、こんにちは。

SelectionChangeイベントというものは、結合セルには働かないものなんでしょうか?。
なんも起きんかったんで、少し困っております。よろしくお願いします。

確認が月曜日になるかもしれません。そん時は、ゴメンナサイです。

【9322】Re:結合セルのSelectionChangeイベント
回答  ハマゾウ E-MAIL  - 03/11/28(金) 17:01 -

引用なし
パスワード
   ▼ぴかる さん、こんにちは

次のコードで確認したところ結合セルでもイベントが発生しました。
ちなみに、Win2000, Excel2000です。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  MsgBox "Test"
End Sub

【9323】Re:結合セルのSelectionChangeイベント
回答  INA  - 03/11/28(金) 17:18 -

引用なし
パスワード
   どのような方法で、
「なんも起きんかった」
のでしょうか?

【9324】Re:結合セルのSelectionChangeイベント
発言  つん E-MAIL  - 03/11/28(金) 17:28 -

引用なし
パスワード
   ぴかる さん、こんちゃ。

うちでも、ちゃんとイベント発生しましたー
因みに、A2:A5で結合しといて、以下のコードを試しても、
結合セルの選択でちゃんと動きましたよ。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  
  If Target.Row = 2 Then
    MsgBox "せるせる"
  End If

End Sub

これで、

  If Target.Row = 3 Then

としといて結合セルを選択したらNGです。
……………当たり前やね(^^;

うちの環境は、Win98SE+Excel2002どす。
ところで石鹸箱でメアド公開してたから、
メール送ってみたんやけど・・・・見た?

【9325】Re:結合セルのSelectionChangeイベント
お礼  ぴかる  - 03/11/28(金) 17:54 -

引用なし
パスワード
   みなさん、どうもです。

あれれ、ほんまですね。ちゃうシートでやったら問題無しでした。なんでやろ?。
もうちと、解析してみます。多分、自分の打ち間違いやと思いますけど・・・。
なんか発見したら、報告いたしますネ。ありがとうございました。

つんさん
拝見いたしました。メールありがとさんでした。
2・3日はチェックしてたんですが、それ以降見てませんでした。
はい忘年会につきましては、前向き検討中です。
はっきりせんで、すんません。

【9326】やっぱり、自分のミスでした。
発言  ぴかる  - 03/11/28(金) 18:09 -

引用なし
パスワード
   失礼しました。わかりました。チョンボでした。
エラー回避マクロを入れてるんで、エラーとなったときスルーしてました。
今から、そのエラーを解析してきちんと動作する様にしようと思ってます。

なんか最近、へんな質問ばかりしてしまってます。お騒がせしております。
でもこれからも、ヘボ質問にもお付き合い願いますね。よろしくです!。

【9327】こんな時は?
質問  ぴかる  - 03/11/28(金) 18:32 -

引用なし
パスワード
   Target.Value = "" がネックでした。同じ意味でなんか回避出来ませんか?。
よろしくお願いします。多分、確認が遅れます。ゴメンナサイです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  On Error GoTo ZZZ
  If Target.Value = "" Then
    MsgBox "普通のセルを選択したネ!"
    Exit Sub
  End If
  
ZZZ:
  MsgBox "結合セル選択すると、エラーになるねん!"
  
End Sub

【9328】Re:こんな時は?
回答  ichinose  - 03/11/28(金) 20:35 -

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

>Target.Value = "" がネックでした。同じ意味でなんか回避出来ませんか?。
>よろしくお願いします。多分、確認が遅れます。ゴメンナサイです。
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>
>  On Error GoTo ZZZ
>  If Target.Value = "" Then
>    MsgBox "普通のセルを選択したネ!"
>    Exit Sub
>  End If
>  
>ZZZ:
>  MsgBox "結合セル選択すると、エラーになるねん!"
>  
>End Sub
エラートラップが簡単みたいですよ。
ただ、上記のコードだと結合セル選択と複数セル選択の区別がつかないですよね?
'====================================================================
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim m_rng As Range
  Dim crng As Range
  Set m_rng = Nothing
  Select Case mergechk(Target)
   Case 0
    Target.Value = "単一セル選択"
   Case 1
    Target.Cells(1, 1).Value = "複数セル選択"
   Case 2
    Target.Cells(1, 1).Value = "結合セル選択"
   End Select
End Sub
Function mergechk(rng As Range) As Long
'  INPUT : 調査セル範囲
'  OUTPUT: mergechk
'      0-単一セル
'      1-複数セル
'      2-結合セル
  On Error Resume Next
  Dim wk As Boolean
  If rng.Count > 1 Then
 
   wk = rng.MergeCells
   If Err.Number <> 0 Then
     wk = False
     End If
   If wk = True Then
     mergechk = 2
   Else
     mergechk = 1
     End If
  Else
   mergechk = 0
   End If
  On Error GoTo 0
End Function

確認して下さい

【9329】Re:こんな時は?(無駄コードが・・)
発言  ichinose  - 03/11/28(金) 20:49 -

引用なし
パスワード
   >>'====================================================================
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'  Dim m_rng As Range
'  Dim crng As Range
'  Set m_rng = Nothing これ、削除して下さい
>  Select Case mergechk(Target)
>   Case 0
>    Target.Value = "単一セル選択"
>   Case 1
>    Target.Cells(1, 1).Value = "複数セル選択"
>   Case 2
>    Target.Cells(1, 1).Value = "結合セル選択"
>   End Select
>End Sub

【9342】Re:結合セルのSelectionChangeイベント
回答  りん E-MAIL  - 03/11/30(日) 10:38 -

引用なし
パスワード
   ぴかる さん、みなさん、おはようございます。

>もうちと、解析してみます。多分、自分の打ち間違いやと思いますけど・・・。
>なんか発見したら、報告いたしますネ。ありがとうございました。

こんな感じで分岐してみたり。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Target
   If .MergeCells = True Then
     Res$ = "結合セル選択"
   Else
     If .Cells.Count = 1 Then
      Res$ = "単一セル選択"
     Else
      Res$ = "複数セル範囲選択(結合セルを含むかも)"
     End If
   End If
   MsgBox Res$, vbInformation, .Address(False, False)
   'セルの値は左上端のみ有効にすればエラーになりません
   MsgBox Target.Cells(1).Value, vbInformation, "セルの値"
  End With
End Sub

 『結合セルを含むかも』ってのは、複数セルを選択したときに、結合セルを含んでもMergeCellsはあくまでTargetの左上端セルのみを結果を返すようなので、別に判定が必要になるってことです。
 今回の内容では、単一セルを選択したときしか必要ではなさそうなので、その部分は省きました。

【9343】Re:結合セルのSelectionChangeイベント
発言  ichinose  - 03/11/30(日) 14:05 -

引用なし
パスワード
   ▼りん さん、こんにちは。

>  With Target
>   If .MergeCells = True Then
↑の参照だとエラーにならないんですね。 メモメモ・・。
wk=.MergeCells は、結合セルと非結合セルを一緒に選択すると
エラーになったのでon Error 〜にしましたが・・・。
トラップが起きないなら、Functionにする必要もないですね。
勉強になりました。

【9344】Re:結合セルのSelectionChangeイベント
発言  りん E-MAIL  - 03/11/30(日) 14:22 -

引用なし
パスワード
   ichinose さん、こんにちわ。

>>   If .MergeCells = True Then
>↑の参照だとエラーにならないんですね。 メモメモ・・。
>wk=.MergeCells は、結合セルと非結合セルを一緒に選択すると
>エラーになったのでon Error 〜にしましたが・・・。

 NullはBooleanではないのでwkに代入するところでエラーになってました。
(同時に選択するとTrueでもFalseでもないNullが返る)

というわけで、この4つに分岐しました。 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim wk As Variant ’何でも来い型
  With Target
   wk = .MergeCells
   '4つに分岐
   If TypeName(wk) = "Null" Then
     res$ = "結合セルを含む複数セル範囲"
   Else
     If wk = True Then
      res$ = "結合セル範囲"
     Else
      If .Cells.Count = 1 Then
        res$ = "単一セル"
      Else
        res$ = "複数セル"
      End If
     End If
   End If
   MsgBox res$, vbInformation, .Address(False, False)
  End With
End Sub

こんな感じです。

【9345】Re:結合セルのSelectionChangeイベント
お礼  ichinose  - 03/11/30(日) 14:42 -

引用なし
パスワード
   ▼りん さん:

>>
>>>   If .MergeCells = True Then
>>↑の参照だとエラーにならないんですね。 メモメモ・・。
>>wk=.MergeCells は、結合セルと非結合セルを一緒に選択すると
>>エラーになったのでon Error 〜にしましたが・・・。

> NullはBooleanではないのでwkに代入するところでエラーになってました。
>(同時に選択するとTrueでもFalseでもないNullが返る)
そうですねえ、私も確認しました。
 
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>  Dim wk As Variant ’何でも来い型
>  With Target
>   wk = .MergeCells
>   '4つに分岐
>   If TypeName(wk) = "Null" Then
>     res$ = "結合セルを含む複数セル範囲"
>   Else
>     If wk = True Then
>      res$ = "結合セル範囲"
>     Else
>      If .Cells.Count = 1 Then
>        res$ = "単一セル"
>      Else
>        res$ = "複数セル"
>      End If
>     End If
>   End If
>   MsgBox res$, vbInformation, .Address(False, False)
>  End With
>End Sub
選択範囲の種類を厳密に限定するとなると、個々の範囲での処理も考えると
やっぱりFunctionにしておいてもよいかもしれませんね
りんさんのコードをFunctionにして、プールしておきました。
ありがとうございました。

【9370】今、やりたい事が出来ず・・・。
質問  ぴかる  - 03/12/1(月) 10:44 -

引用なし
パスワード
   ichinoseさん、りんさん、みなさん、こんにちは。

ichinoseさん、りんさん
ありがとうございます。試させて頂きました。うまくセルを認識してくれますね。
しかし、実力不足で応用する事が出来ませんでした。

困ってる内容のマクロ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  On Error GoTo AAA
  If (Target.Value = "") And (Range("N" & Target.Row) <> "") And _
    (Target.Row >= 19) And (Target.Row <= 28) And (Target.Column = 16) Then
    項目表示ON ’処理マクロ
  End If
  If (Target.Column = 14) Or (Target.Column = 17) Then
    SendKeys "%{DOWN}", True
  End If

AAA:
End Sub
上段の部分である処理を行い、下の部分では、入力規則のリストを表示させています。
今、エラー処理を行っているので動作はするのですが、(Target.Column = 14) が結合セルの為、エラーとなりリスト表示されません。
On Error Resume Next・On Error GoTo 0で上マクロを囲ってみましたが、うまく行きませんでした。何か良い方法は、ないでしょうか。よろしくお願いします。

【9374】Re:今、やりたい事が出来ず・・・。
回答  ichinose  - 03/12/1(月) 12:50 -

引用なし
パスワード
   ▼ぴかる さん、みなさん、こんにちは。
ひょっとしてこういうことでしょうか?
'====================================================
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Target.Cells(1, 1)
  If (.Value = "") And (Range("N" & .Row).Cells(1, 1).Value <> "") And _
    (.Row >= 19) And (.Row <= 28) And (.Column = 16) Then
    '項目表示ON '処理マクロ
   MsgBox "'処理マクロ"
  End If
  If (.Column = 14) Or (.Column = 17) Then
    MsgBox "SendKeys ""%{DOWN}"", True"
  End If
  End With
AAA:
End Sub

ちなみに上のコードでは呼び出していませんが、以下は
りんさんのコードで作ったFunctionです。
'==============================================================
Function mergechk(rng As Range, r_rng As Range) As Long
'  INPUT : 調査セル範囲
'  OUTPUT: mergechk
'      0-単一セル
'      1-複数セル
'      2-結合セル
'      3-結合セルを含む複数セル
'      r_rng
'      型に合わせた操作可能なセル
  Dim wk As Variant '何でも来い型
  With rng
   wk = .MergeCells
   If TypeName(wk) = "Null" Then
     mergechk = 3
   Else
     If wk = True Then
      mergechk = 2
     Else
      If .Cells.Count = 1 Then
        mergechk = 0
      Else
        mergechk = 1
      End If
     End If
   End If
  End With
  Set r_rng = rng.Cells(1, 1)
End Function

【9376】出来ました。
お礼  ぴかる  - 03/12/1(月) 13:43 -

引用なし
パスワード
   ichinoseさん、こんにちは。

>ひょっとしてこういうことでしょうか?
はい、まさしくその通りです。バッチリ希望通りです。ありがとうございました。

>  With Target.Cells(1, 1)
これがポイントだったんですね。Target.・・・でしか使った事なかったです。
勉強になりました。

>ちなみに上のコードでは呼び出していませんが、以下は
>りんさんのコードで作ったFunctionです。
Function自体、あんまりまだ理解出来てないんで少し勉強要かなと思ってます。
(大分前にりんさんに教えて頂いたのに・・・。)

という事で非常に助かりました。現在、作成中ソフトがうまく行きそうです。
これからもよろしくお願いしますネ!。

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