[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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に依存するコードはお勧めしませんが、下記のようにすれば諸々回避できると思いますので研究材料として提示します。
興味があれば【ステップ実行】で研究の上、必要な部分のみご自身のコードに取り込んでみてください。
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.