[[20230517212103]] 『VBAで特定のセルが選択範囲内で何個目にあたるかax(さやたか) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAで特定のセルが選択範囲内で何個目にあたるかを調べる方法』(さやたか)

仮にセル範囲(B2:C4)(※)を選択しているときに、C3(※)は左上から縦方向に数えていく(B2,B3,B4……といった感じです)と5番目にあたりますが、この(※)部分が状況によって変化しても指定したセルが何番目にあたるかを取得するコードを教えていただきたいです。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


ひとつずつ見ていく案です。

    Sub Macro1()
        Dim rng As Range, r As Range, c As Range
        Dim n As Long

        Set rng = Range("C3")
        For Each r In Selection.Columns
            For Each c In r.Cells
                n = n + 1
                If c.Address = rng.Address Then
                    Debug.Print c.Address(0, 0) & "セルは" & n & "番目"
                    Exit For
                End If
            Next
        Next
    End Sub

(無印) 2023/05/17(水) 22:05:46


    Function test(特定のセル As Range) As Long
        Dim 選択範囲 As Range
        Set 選択範囲 = ActiveWindow.RangeSelection
        '=(COLUMN(特定のセル)-COLUMN(INDEX(選択範囲,1,1)))*ROWS(選択範囲)+ROW(特定のセル)-ROW(INDEX(選択範囲,1,1))+1
        test = (特定のセル.Column - 選択範囲.Column) * 選択範囲.Rows.Count + 特定のセル.Row - 選択範囲.Row + 1
    End Function

(白茶) 2023/05/17(水) 22:21:23


 単純な矩形領域であればよいのですが、
 もっと複雑な
 Range("A1:D1,C2,B3:B4,C3:C4").Select
 なんていうケースだと、思わぬ結果になりますね。

 質問者さんに、考慮の範囲というか、
 前提をもう少し正確に示してもらったほうがいいかもしれません。
(xyz) 2023/05/17(水) 22:30:01

 Sub 実験01() '' 順番の指定が無いと、どうなるか?
    Dim rng As Range
    Dim i As Long
    Set rng = Range("B2:C4")
    Range("B2").CurrentRegion.Clear
    rng.Select
    For i = 1 To Selection.Count
        Selection(i) = i
    Next i
 End Sub

 Sub 実験02() '' 列方向優先チェック
    Dim i As Long, j As Long, n As Long
    Dim msg As VbMsgBoxResult
    Range("B2").CurrentRegion.Clear
    For i = 2 To 3
        For j = 2 To 4
            n = n + 1
            Cells(j, i) = n
            Cells(j, i).Select
            msg = MsgBox(ActiveCell.Address)
        Next j
    Next i
 End Sub

 Sub 実験03() '' 行方向優先チェック
    Dim i As Long, j As Long, n As Long
    Dim msg As VbMsgBoxResult
    Range("B2").CurrentRegion.Clear
    For j = 2 To 4
        For i = 2 To 3
            n = n + 1
            Cells(j, i) = n
            Cells(j, i).Select
            msg = MsgBox(ActiveCell.Address)
        Next i
    Next j
 End Sub
(あみな) 2023/05/18(木) 00:10:24

質問?の内容から考えると、基本的にはターゲットのセルとSelection.Cells(1,1)が、それぞれシートのどこにあるのか調べれば求められると思います。

個人的にはSelectionに依存するコードはお勧めしませんが、下記のようにすれば諸々回避できると思いますので研究材料として提示します。
興味があれば【ステップ実行】で研究の上、必要な部分のみご自身のコードに取り込んでみてください。

    Sub 研究用()
        Stop  'ブレークポイントの代わり
        Dim MyRNG As Range

        Range("B2:C4").Select ' ←実際には手作業で"選択"しておく

        If TypeName(Selection) <> "Range" Then
            MsgBox "【セル(範囲)】が選択されていないっす"
            Exit Sub
        End If

        If Selection.Areas.Count > 1 Then
            MsgBox "複数範囲の選択には対応できないっす"
            Exit Sub
        End If

        Set MyRNG = Application.InputBox(Prompt:="セルを選択してください。", Type:=8)
        If MyRNG.Cells.Count > 1 Then
            MsgBox ("複数のセルを指定するのは駄目っす")
            Exit Sub
        End If

        With Selection
            If Intersect(.Cells, MyRNG) Is Nothing Then
                MsgBox MyRNG.Address(0, 0) & "セルは" & .Address(0, 0) & "から見て範囲外です"
            Else
                MsgBox MyRNG.Address(0, 0) & "セルは" & .Address(0, 0) & "のうち" & vbLf & _
                "左から「" & MyRNG.Column - .Column + 1 & "」列目、上から「" & MyRNG.Row - .Row + 1 & "」行目にあります。"
            End If
        End With
    End Sub

(もこな2) 2023/05/18(木) 11:54:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.