LoginSignup
0
1

More than 3 years have passed since last update.

【ExcelVBA】指定した位置に表示範囲ごとアクティブセルを移動する

Last updated at Posted at 2019-05-14

行・列番号またはセルアドレスを指定して移動する

ワークシート上でアクティブセルを移動するには、マウスかキーボードの矢印キー、もしくはショートカットキーを使いますよね。
でも縦横に長い表組とか(業務でありがち)で、先頭や末端以外の中間のセルには移動しにくい…
いっそ100行目とかAB列とかBX10とか直接指定して移動したい!って場合向けのマクロです。

普段は自分用のアドインに入れてCtrl+Lのショートカットキーを設定して使っています。
エディタのノリで移動できてとても便利です。
アドインファイルの作り方とかはこの辺でざっと解説しています。
【Excel】シート名を部分一致で検索するアドインを作る

機能

ダイアログに移動先を入力すると、表示画面上の位置は変えずにアクティブセルを指定した場所に移動します。
画面上でのアクティブセルの位置は変わらず、シートだけをスクロールする感じ。
入力値が移動先として妥当でない場合、何もしないで処理を終了します。
なお、全角/半角、大文字/小文字は中で変換しているので、気にせず入力できます。

  • 行番号を指定する場合、数字(列位置は変更なし)
  • 列番号を指定する場合、アルファベット(行位置は変更なし)
  • セルを指定する場合、A1形式のセルアドレス

Z100:AZ200みたいな単一セルではなく範囲を指定した場合、範囲の左上のセルに移動します。

ソースコード

' 指定した行番号・列番号にアクティブセルを移動する
Sub FocusCell()
    Application.ScreenUpdating = False
    Dim value As String: value = Trim(InputBox("移動先の行/列番号・セルを入力してください。", "移動先の指定", ActiveCell.address(False, False)))
    If Len(value) = 0 Then
        Exit Sub
    End If
    value = UCase(StrConv(value, vbNarrow))

    If Not value Like "*[!0-9]*" Then
        ' 行番号を入力した場合
        If Not isEnabledCellAddress("A" & value) Then
            Exit Sub
        End If
        Dim row As Long: row = CLng(value)
        Dim column As Long: column = ActiveCell.column
    ElseIf Not value Like "*[!A-Z]*" Then
        ' 列名を入力した場合
        If Not isEnabledCellAddress(value & "1") Then
            Exit Sub
        End If
        row = ActiveCell.row
        column = Range(value & "1").column
    ElseIf isEnabledCellAddress(value) Then
        ' A1形式でセルを指定した場合
        row = Range(value).row
        column = Range(value).column
    Else
        ' 有効な位置が指定されなかった場合
        Exit Sub
    End If

    With ActiveWindow
        With .VisibleRange
            Dim scrollRow As Integer: scrollRow = ActiveCell.row - .Cells(1, 1).row
            Dim scrollCol As Integer: scrollCol = ActiveCell.column - .Cells(1, 1).column
        End With

        Call Cells(row, column).Activate
        Call Application.Goto(ActiveCell, True)
        Call .SmallScroll(up:=scrollRow, toleft:=scrollCol)
    End With
    Application.ScreenUpdating = True
End Sub

' 文字列が有効なセルアドレスか判定する
Private Function isEnabledCellAddress(ByVal address As String) As Boolean
    isEnabledCellAddress = True
On Error GoTo RangeError
    Dim rng As Range: Set rng = Range(address)
    Exit Function
RangeError:
    isEnabledCellAddress = False
End Function
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1