Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
予想外の動きをしました。For Each c In Selection.SpecialCells(xlCellTypeConstants)
投稿日時: 22/10/13 18:34:47
投稿者: taichi

Sub test1()
 Dim c As Range
    For Each c In Selection.SpecialCells(xlCellTypeConstants)
       MsgBox c
    Next
End Sub
 
適当にシートにデータ入力後、
たまたま 1個のセル(定数が入力済)を選択後、実行してみたところ、全セルが対象に
なっているような動きでした。
 
1個の空白セル選択後、実行してみたところ、エラーにならずに動きます。
複数の空白セルを選択後、実行するとエラー発生 → 予想通り
 
なんか気持ち悪いです。

回答
投稿日時: 22/10/13 18:44:25
投稿者: WinArrow
投稿者のウェブサイトに移動

taichi さんの引用:

 
適当にシートにデータ入力後、
たまたま 1個のセル(定数が入力済)を選択後、実行してみたところ、全セルが対象に
なっているような動きでした。

 
>全セルが対象になっているような動き
を具体的に説明できますか?
 
全セルが対象とは、どのようなことなのか?

回答
投稿日時: 22/10/13 20:05:05
投稿者: WinArrow
投稿者のウェブサイトに移動

単独セルを選択状態にしてある時は、全セルを検索対象とする
という仕様と思います。
  
他の例としては
シートを省略した場合、
アクティブシートが対象となります。
これも仕様です。
  
対象とするセル範囲は指定するようにしましょう。
   
↓のように変更すれば、指定したことになります。

Sub test1()
 Dim c As Range
With ActiveCell
    For Each c In Selection.SpecialCells(xlCellTypeConstants)
       MsgBox c
    Next
End With
End Sub

 
出来ればシートも指定したほうが無難です。
 
 

回答
投稿日時: 22/10/13 20:17:10
投稿者: simple

確かにちょっと予想外の動きですね。
こんな風に場合わけすると想定する結果になるのでしょうか。

Sub test()
    Dim c As Range
    If Selection.Count = 1 Then
        MsgBox Selection
    Else
        For Each c In Selection.SpecialCells(xlCellTypeConstants)
            MsgBox c
        Next
    End If
End Sub

投稿日時: 22/10/13 21:38:41
投稿者: taichi

WinArrow さん simple さん ありがとうございます。
 
>全セルが対象になっているような動き
を具体的に説明できますか?
    For Each c In sheets(1).cells.SpecialCells(xlCellTypeConstants)
       MsgBox c
    Next
と記述した場合と同様に、セル1個しか選択していない場合でも、定数で入力されている
セルの数だけ  MsgBox c が発生しています。
 
 
>単独セルを選択状態にしてある時は、全セルを検索対象とする
という仕様と思います。
私もそのように解釈して、一応
Sub test()
……
End Sub
のような書き方に変更しました。