VBAの勉強を始めてみた

色々試しています。

指定位置(セル)に瞬間移動する方法

エクセルで「列がAAAで行が30000のセルを、表示して下さい」と言われたら、何秒以内に表示できるでしょうか?私がやってみたところ・・・・・・A1セルを表示した状態から、通常のスクロールのみで1分以上かかりました。
時間がかかることと、動く数字やアルファベットを目で追うのは、ストレスや眼精疲労の原因になります。

私はストレスや眼精疲労がこの世で一番嫌いです(@_@;)

なので、今回は指定位置(セル)に瞬間移動する方法を紹介しましょう。

 

標準機能で瞬間移動する

これはとてもカンタンです。
F5キーを押して表示されたボックスに、瞬間移動したい位置を入力してOKします。(A1形式で入力します)

f:id:kouten0430:20180914145359j:plain

 

一度移動した所へは、履歴から選んで瞬間移動することもできます。

f:id:kouten0430:20180914142707j:plain

 

ただし、エクセルを閉じると履歴はリセットされます。 

この標準機能での瞬間移動は、指定位置(セル)を表示し、かつ選択状態にします。


マクロで瞬間移動する

「表示はさせたいけど、セルの選択はしなくていい・・・・・・(>_<)」

という人は、VBAScrollRowプロパティScrollColumnプロパティを使ってみて下さい。ScrollRowプロパティでは指定行をウィンドウの上端に表示させることができ、ScrollColumnプロパティでは指定列をウィンドウの左端に表示させることができます。
この二つを組み合わせて、指定位置を左上に表示させます。

ActiveWindow.ScrollRow = 行番号
ActiveWindow.ScrollColumn = 列番号

 

セルの選択状態は変えず指定位置を左上に表示させるだけなので、表示変更後に任意のセルを Shift + 左クリックすることで範囲選択することもできます。 

 

表示させる位置を、行番号と列番号で指定するサンプルコードはこちら

Sub 指定位置に瞬間移動()
    Dim y As Variant
    Dim x As Variant
    Dim flag As Boolean
    
    y = InputBox("表示する「行」を数値で入力" & vbCrLf & "(行はこのままで良い場合、空白 or キャンセル)")
    
    If y = "" Then
        y = ActiveWindow.ScrollRow
    ElseIf y > 1048576 Then
        y = 1048576
        flag = True
    ElseIf y < 1 Then
        y = 1
    End If
    
    x = InputBox("表示する「列」を数値で入力" & vbCrLf & "(列はこのままで良い場合、空白 or キャンセル)")
    
    If x = "" Then
        x = ActiveWindow.ScrollColumn
    ElseIf x > 16384 Then
        x = 16384
        flag = True
    ElseIf x < 1 Then
        x = 1
    End If

    ActiveWindow.ScrollRow = y
    ActiveWindow.ScrollColumn = x
    If flag Then MsgBox "いしのなかにいる!"
    
End Sub

 

表示させる位置を、行番号と列のアルファベットで指定するサンプルコードはこちら

Sub 指定位置に瞬間移動アルファベットで指定版()
    Dim y As Variant
    Dim x As String
    Dim flag As Boolean
    
    y = InputBox("表示する「行」を数値で入力" & vbCrLf & "(行はこのままで良い場合、空白 or キャンセル)")
    
    If y = "" Then
        y = ActiveWindow.ScrollRow
    ElseIf y > 1048576 Then
        y = 1048576
        flag = True
    ElseIf y < 1 Then
        y = 1
    End If
    
retry:
    x = InputBox("表示する「列」をアルファベットで入力" & vbCrLf & "(列はこのままで良い場合、空白 or キャンセル)")
    
    If x <> "" Then
        x = StrConv(x, vbNarrow)
        x = StrConv(x, vbUpperCase)
        If x Like "*[!A-Z]*" Then
            MsgBox "列はアルファベットのみ入力可"
            GoTo retry
        End If
        On Error GoTo ErrorHandler
        ActiveWindow.ScrollColumn = Range(x & "1").Column
        On Error GoTo 0
    End If

    ActiveWindow.ScrollRow = y
    If flag Then MsgBox "いしのなかにいる!"
    
    Exit Sub
    
ErrorHandler:
    x = "XFD"
    flag = True
    Resume
    
End Sub


は変わりますが・・・・・・、ウィザードリィというゲームで瞬間移動する際に座標を間違えると、通路以外の場所に飛んでしまい

f:id:kouten0430:20180914142403j:plain

 

というメッセージが表示され、パーティが全滅します。

子供の頃、なけなしの小遣いでファミコン版「ウィザードリィIII ダイヤモンドの騎士」を買ったけれど、これに心を折られ、ソフトを中古屋に瞬間移動させた記憶があります←(ぇ)

 

全然関係ない話ですけどね。

 

A1セルに瞬間移動する

表示を、A1セルに戻すサンプルコードはこちら

Sub A1に瞬間移動()
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
    
End Sub

 

※コードの使用方法

  • SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら