personal.xls 強化講座


Home What's
New
Site
Concept
生産性向上
基本テクニック
トラブル回避
テクニック
生産性向上
リンク
personal.xls
強化講座
生産性向上
ツール
Site
Map
Coffee
Break
Guest
Book
地球風
画像館
Q&A Salon
EXCELの質問はこちらへ

 

2.ショートカット機能を追加するマクロ
06/09/2000 -


EXCELには標準でさまざまなショートカットキーが用意されています。(標準ショートカットキーはこちら
このショートカットキーを使いこなせるようになると、 キーボードから手を離してマウスを操作すること無しに、キーボードだけでいろいろな操作が出来るようになりますので、作業効率が大変向上します。

しかし、EXCELの機能の中にはマウスを操作しないといけない機能(ショートカットが用意されていない機能)も数多く存在します。
EXCEL操作の生産性を向上させるためには、標準ショートカットやファンクションキーを活用してなるべくキーボードから手を離さずに作業できるようになることが重要ですが、メニューから操作するような機能はどうしてもマウスを使うことになり、作業が途切れると同時に、思考も中断されてしまいます。

ここでは、私が普段EXCELを使っていて不便に感じていた問題を解消するために開発した、追加すると便利なショートカット機能を紹介します。

文字の拡大・縮小ショートカットや画面のズームショートカットなどは、一度使うとそのあまりの便利さに手放せなくなると思います。
ぜひ、あなたのpersonal.xlsにも組み込んでみて下さい。
 

2003.01.18

Shirt + Ctrl + U , Y 画面5%ズームUp、Down
Shirt + Alt + ↑ , ↓ 文字サイズ +1ポイント、−1ポイント
Alt + ← , → 列幅の微減、微増
の3機能の紹介として、これらのショートカットを操作した(キーを押し続けた)ときの画面の動きを録画したムービー(avi形式)を用意してみました。下の説明文中にある【Movie】をそれぞれクリックしてください。
画面ズームと文字サイズ増減のムービーについては、画面左上に画面ズーム比率やフォントサイズのツールバーも表示させていますので、その変化を確認出来ると思います。

なお、 ムービーはファイルサイズをなるべく小さくするためにフレームレートをかなり落としているため、再生するとちょっとカクカクしていますが、実際にはもっとすばやく滑らかに動作します。
2004.12.19 , 2004.12.23

Shirt + Ctrl + I , J , K , N (カーソル移動) について、ユーザの方から「結合されたセルでカーソル移動ができない」というお話をいただいたので、toRIGHTtoDOWNを少し改善してみました。

一応、カーソル移動中に結合セルにさしかかってもそのまま移動できるようになりました。
ただし、結合セルでセルの位置(行番号・列番号)をマクロで取得すると、結合範囲の一番左上角の位置が返ってくる(取得される)ため、移動中に行位置または列位置が結合範囲の左上角の位置に変わってしまいます。それでもよいという方はコードを置き換えてみてください。

キーボードの矢印キーでカーソル移動させる場合は、移動中に結合セルを通り越しても列位置(上下に移動の場合)や行位置(左右に移動の場合)は保持されて、結結合セルから結合されていないセルに移動するときに最初にカーソル移動を開始した列位置(または行位置)に復帰するので、同じ動きをマクロで再現することを目指して開発を始めました。

しかし、ショートカットマクロでカーソル移動を始めたときの列位置・行位置を覚えておいても、それが移動中に変化したときに「マウスで違う場所を選択されたのか、それとも結合セルにカーソル移動したので列(または行)位置が変わったのか」を personal.xls から判別する方法が思いつかない(personal.xlsのマクロではマウスクリックのイベントを拾えない)ため、断念しました。

以前のコードはコメントで残してあります。
2006.01.15

2003.1.18 から 
Shirt + Alt + ↑ , ↓ 文字サイズ +1ポイント、−1ポイント というショートカット追加を掲載しておりましたが、この Shift + Alt + 上下矢印には標準で「ふりがな」関係の機能が割り当てられていたことに最近気づきました。

具体的には、
Shirt + Alt +  は『ふりがなを表示している日本語の文字列で、ポインタをふりがなに移動する。』 という機能、Shirt + Alt +  は『ポインタをふりがなから親文字に戻す。』という機能が標準のショートカットです。(ショートカット一覧はコチラ

したがって、この標準機能のショートカットを標準のまま活かしたい方は、ここで紹介している文字サイズ増減のマクロをキーに割り当てている以下の部分

Application.OnKey "+%{UP}", "charaBIG"
Application.OnKey "+%{DOWN}", "charaSMALL"

を別のキーに設定していただくか、もしくはこの機能が不要であればこの2行を削除してください。
 

このページのマクロ(テキスト)の表示

【目次に戻る】

以下のマクロ例では、ShirtキーCtrlキーAltキー、およびアルファベットや矢印キーを組み合わせて、新しいショートカットキーを定義しています。
標準ショートカットキーとは重ならないように設定していますが、組み合わせやアルファベットなどは好みに合わせて変えると良いでしょう。

auto_open() の所で、追加するショートカットのキーの組み合わせと、動かすマクロを定義しています。

Application.OnKey の後ろの記述は、 + が
Shirtキー、 ^ がCtrlキー、 % がAltキーです。

【主な機能の説明】

 
Shirt + Ctrl + I , J , K , N (カーソル移動)

 キーボードのホームポジションから指を離さずに(矢印キーを操作せずに)、アクティブセルを上下左右に移動させることが出来ます。
 
Shirt + Ctrl + B (行挿入)

 行を挿入します。(縦に)複数セル選択した状態で動かすと、複数行挿入されます。
 
Shirt + Ctrl + O , Shirt + Ctrl + P (行の高さを最適化、列の幅を最適化)

 マウスで行番号や列番号の境目をダブルクリックすると、セルに入力されている数字や文字列の大きさや幅に合わせて行の高さ・列の幅が最適化されますが、これをショートカットで一発で行います。
 
Shirt + Ctrl + L (列幅で折り返し表示設定と解除) <特におすすめ!>

 セルの中で文字を折り返すことは頻繁に(私は)やる操作ですが、標準機能では Ctrl + 1 で「セルの書式設定」を出し、「配置」で「折り返して全体を表示する」のチェックを付ける必要があり、非常に面倒です。これを一発で行います。折り返し設定がすでにされているセルでは、設定を解除します。
 
Shirt + Ctrl + D , C , F (文字左詰め表示、中央揃い表示、右詰め表示)

 セルの中の文字や数字の表示を、左詰め・中央揃い・右詰めにします。
 
Shirt + Ctrl + U , Y (画面5%ズームUp、Down) <特におすすめ!> 【Movie】(759KB)

 画面表示の拡大・縮小は、ツールバーから100%とか75%とかの倍率を選ぶか、そこに直接倍率の数字を入力するしかなく、「もうちょっと小さくして全体を表示させたい」という場合などには大変不便です。
 このショートカットは、現在の表示倍率を5%ずつ変化させます。ショートカットを押し続けると、画面がスムーズに拡大・縮小されるので、横で人が画面を見ていると「えっ?エクセルってそんな機能あるの?教えてっ!」と 必ず聞いてきます。
 
Shirt + Alt + ↑ , ↓ (文字サイズ +1ポイント、−1ポイント) 【Movie】(1,009KB)

 文字の大きさを1ポイントずつ変化させます。これも、上記と同様に、ショートカットを押し続けると、文字の大きさがスムーズに拡大・縮小されます。
 上記2006.01.15の注釈をご確認ください。
 
Alt + ← , → (列幅の微減、微増) <特におすすめ!> 【Movie】(886KB)

 列の幅を調節する操作は頻繁に行いますが、列番号の間をつまんで左右に動かすのは、ノートパソコンのマウスパッドなどでは結構大変だったりします。複数のセル(または列)を選択してこのショートカットを操作すると、同じ幅にしてから列幅を増減させます。
 
Alt + ↑ , ↓ (文字縦位置の変更 下→中央、中央→上、上→中央、中央→下) <特におすすめ!>

 セルの中の文字や数字は、標準では縦位置が下詰めで表示されます。表などで行の高さを広めにとっている場合には、文字表示を上詰めに設定することが多いですし、列見出しは中央詰めに設定したくなります。
標準機能では Ctrl + 1 で「セルの書式設定」を出し、「配置」で「縦位置」を指定しなくてはいけませんが、このショートカットを使うことで「下」「中央」「上」に連続的に縦位置を変化させることが出来ます。

【注意】
Alt +  は、標準のショートカットでは「リストの現在の列中の値のドロップダウン リストを表示する」という機能が割り当てられていますので、標準機能を残したい場合にはこのマクロを追加しないか、別のキーに割り当ててください。
 
Shirt + Ctrl + T (選択セルの結合と結合解除) <特におすすめ!>

 表の見出しなどで、隣り合った2つや3つのセルを「結合」させることがよくありますが、標準機能では Ctrl + 1 で「セルの書式設定」を出し、「配置」で「セルを結合する」のチェックボックスを付ける必要があり、面倒です。
このショートカットは、連続して選択しているセル(横に連続して選択でも縦に連続して選択でも、縦横複数選択でもOK)を結合して、文字の横位置を中央揃いにします。既に結合されているセルを指定した場合は、結合を解除します。
 
Shirt + Ctrl + Alt + ← , → , ↑ , ↓ (入力済みセルに限定した移動)

 作成したシートでセルの内容を1つ1つ見直していくときに、矢印キーで移動していくやり方だとデータが入力されているセルの間隔が広いと大変ですし、1行(または1列)の最後まで来たときに次の行(または列)の先頭まで戻るのが面倒です。

Ctrl + 矢印キー』で移動していく方法なら間隔が開いていても一発で移動できますが、連続したセル範囲にデータが入力されている場合はそのセル範囲の先頭行か末尾行(左右方向の場合は左端列または右端列)にだけカーソルが移動してしまいますし(値の入っているセル1つ1つにはカーソルは移動しない)、最終的にはカーソルの有る行(または列)の最後(A65536セルやIV1セルなど)までカーソルが飛んでしまうので、やはり次の行や列の先頭に戻るのが面倒です。

 そこで、データが入っているセルだけにカーソルを移動させ、行(または列)の最後のデータまで来たら次の行(または列)に移動するショートカットを作りました。これで、私はある仕事の作業の能率が大幅にアップしました(^_^;)

 例えば、
 A1 B1 C1 D1
 A2 B2 C2 D2
 A3 B3 C3 D3

 と7ヶ所にデータが入力されていて、A1にカーソルがある場合、
 Shirt + Ctrl + Alt +   を押すごとに、A1→B1→D1→A2→C2→C3→D3→A1→B1・・・
 Shirt + Ctrl + Alt +   を押すごとに、A1→D3→C3→C2→A2→D1→B1→A1→D3・・・
 Shirt + Ctrl + Alt +   を押すごとに、A1→A2→B1→C2→C3→D1→D3→A1→A2・・・
 Shirt + Ctrl + Alt +   を押すごとに、A1→D3→D1→C3→C2→B1→A2→A1→D3・・・
 という感じでカーソルが移動していきます。

 なお、「使われたセル範囲の最後のセル」までは探すため、書式(背景色や罫線、表示形式など)が設定されたセルがかなり下のほうにあると、先頭行に戻るのに時間がかかる場合があるので注意してください。大きなシートの場合などは、「編集(E)」「ジャンプ(G)」「セル選択(S)」「最後のセル(S)」がどこになっているか確認しておくと良いでしょう。

 もし、マウスポインタが砂時計の状態のままで長い時間戻らない場合は、「最後のセル」の位置が遠くて(行番号が非常に大きくて)次のセルを探すのに時間がかかっている状態なので、Ctrlキーを押しながらBreakキーを押して、マクロを強制ストップさせてください。
 

Ctrl + PageUp , Ctrl + PageDown (サイクリックなシート移動)

 標準のショートカットでは、「ブック内の前のシートをアクティブにする」「ブック内の次のシートをアクティブにする」という機能が割り当てられています。”アクティブにする”とは表示するということで、1つ前(左隣)または次(右隣)のシートに表示が切り替わるということです。

デスクトップPCのキーボードだと、Ctrlキーを右手親指で押しながらPageUp/PageDownキーを右手(私の場合)中指で押しやすく、右手をマウスまで持っていってマウスでシートを切り替えるよりも簡単で便利なので、多用しています。

しかし、ちょっとした不満もあります。シートがたくさんあるブックの前の方のシート(1シート目とか2シート目とか)を編集していて、次に最後のシートを編集したいときなどでは、Ctrl + PageDown を何度も押してシートを切り替えないといけません。一番左のシート名タブのさらに左の部分(行番号表示の下の部分)を右クリックしてシート名一覧を選択して一発で切り替えるという方法もありますが、シート間を頻繁に移動するような作業の時には面倒でしかたありません。

 そこで、標準ショートカットの機能を少し改造して、最後のシートで Ctrl + PageDown を押すと最初のページをアクティブに、最初のページで Ctrl + PageUp を押すと最後のページをアクティブにするようにしてみました。

Sheet1・Sheet2・Sheet3という3つのシートがある場合、標準ショートカットでは Ctrl + PageDown を押し続ける(または何回も押す)とSheet1→Sheet2→Sheet3と切り替わって、Sheet3が表示されてからは Ctrl + PageDown を押してもシートは切り替わりません。これが、personal.xls に以下のようなコードを追加することで、標準の機能が置き換わって、Sheet1→Sheet2→Sheet3→Sheet1→Sheet2→・・・とサイクリックにシートが切り替わるようになります(Ctrl + PageUp を押し続けると逆の動きになります)。
シートが隠してあっても、エラーにならないように考慮しています。

なお、これはショートカットの追加ではなく、標準ショートカットを置き換える(再定義する)コードになっていますので、この機能を標準に戻したい場合は、

 Application.OnKey "^{PGDN}", "Next_Sheet_Active"
 Application.OnKey "^{PGUP}", "Prior_Sheet_Active"

この2行をコメントアウトするか削除して、personal.xlsを保存してから、EXCELを再起動してください。これで置き換えが無効になるので標準のショートカットの機能に戻ります。

 Application.OnKey "^{PGDN}", ""
 Application.OnKey "^{PGUP}", ""

としてしまうと、標準のショートカットも機能しなくなってしまいますので、ご注意ください。

 

Option Explicit

Public nRow As Long
Public nCol As Long
 
Sub auto_open()

    Application.OnKey "{F1}", ""
    Application.OnKey "+^I", "toUP"
    Application.OnKey "+^J", "toLEFT"
    Application.OnKey "+^K", "toRIGHT"
    Application.OnKey "+^N", "toDOWN"
    Application.OnKey "+^H", "DELETE"
    Application.OnKey "+^B", "InsertLine"
    Application.OnKey "+^O", "LineAutoFit"
    Application.OnKey "+^P", "ColumnAutoFit"
    Application.OnKey "+^L", "列幅折り返し表示"
    Application.OnKey "+^D", "文字左詰め表示"
    Application.OnKey "+^C", "文字中央揃い表示"
    Application.OnKey "+^F", "文字右詰め表示"
    Application.OnKey "+^M", "ウィンドウ最少化"
    Application.OnKey "+^U", "ZoomUp"
    Application.OnKey "+^Y", "ZoomDown"
    Application.OnKey "+%{UP}", "charaBIG"
    Application.OnKey "+%{DOWN}", "charaSMALL"
    Application.OnKey "%{RIGHT}", "列幅微増"
    Application.OnKey "%{LEFT}", "列幅微減"
    Application.OnKey "+^T", "Cell結合"
    Application.OnKey "%{UP}", "セル縦位置UP"
    Application.OnKey "%{DOWN}", "セル縦位置DOWN"
    Application.OnKey "+^%{RIGHT}", "FindNextRight"
    Application.OnKey "+^%{LEFT}", "FindNextLeft"
    Application.OnKey "+^%{UP}", "FindNextUp"
    Application.OnKey "+^%{DOWN}", "FindNextDown"
    Application.OnKey "^{PGDN}", "Next_Sheet_Active"
    Application.OnKey "^{PGUP}", "Prior_Sheet_Active"

End Sub

Sub toUP()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
 
    If nRow > 1 Then
        Cells(nRow - 1, nCol).Select
    End If
 
End Sub
 
Sub toLEFT()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
 
    If nCol > 1 Then
        Cells(nRow, nCol - 1).Select
    End If
 
End Sub
 
Sub toRIGHT()
 
    Dim tmpCol As Long
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    tmpCol = nCol
 
    If Selection.MergeCells Then
        Do
            If nCol = 256 Then Exit Sub
            nCol = nCol + 1
            Cells(nRow, nCol).Select
        Loop Until Not Selection.MergeCells Or tmpCol <> ActiveCell.Column
    Else
        If nCol <> 256 Then Cells(nRow, nCol + 1).Select
    End If
 
'    If nCol <> 256 Then
'        Cells(nRow, nCol + 1).Select
'    End If
 
End Sub
 
Sub toDOWN()
 
    Dim tmpRow As Long
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    tmpRow = nRow
 
    If Selection.MergeCells Then
        Do
        If nRow = 65536 Then Exit Sub
            nRow = nRow + 1
            Cells(nRow, nCol).Select
        Loop Until Not Selection.MergeCells Or tmpRow <> ActiveCell.Row
    Else
        If nRow <> 65536 Then Cells(nRow + 1, nCol).Select
    End If
 
'    If nRow <> 65536 Then
'        Cells(nRow + 1, nCol).Select
'    End If
 
End Sub

Sub FindNextRight()
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    Do
        nCol = nCol + 1
        If nCol > ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column Then
            nCol = 1
            nRow = nRow + 1
            If nRow > ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row Then
                nRow = 1
            End If
        End If
        If Cells(nRow, nCol).Value <> "" Then
            Cells(nRow, nCol).Select
            Exit Do
        End If
    Loop
 
End Sub
 
Sub FindNextLeft()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    Do
        nCol = nCol - 1
        If nCol < 1 Then
            nCol = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
            nRow = nRow - 1
            If nRow < 1 Then
                nRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
            End If
        End If
        If Cells(nRow, nCol).Value <> "" Then
            Cells(nRow, nCol).Select
            Exit Do
        End If
    Loop
 
End Sub
 
Sub FindNextUp()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    Do
        nRow = nRow - 1
        If nRow < 1 Then
            nRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
            nCol = nCol - 1
            If nCol < 1 Then
                nCol = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
            End If
        End If
        If Cells(nRow, nCol).Value <> "" Then
            Cells(nRow, nCol).Select
            Exit Do
        End If
    Loop
 
End Sub
 
Sub FindNextDown()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    Do
        nRow = nRow + 1
        If nRow > ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row Then
            nRow = 1
            nCol = nCol + 1
            If nCol > ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column Then
                nCol = 1
            End If
        End If
        If Cells(nRow, nCol).Value <> "" Then
            Cells(nRow, nCol).Select
            Exit Do
        End If
    Loop
 
End Sub
 
Sub DELETE()
 
    Selection.ClearContents
 
End Sub
 
Sub InsertLine()
 
    Selection.EntireRow.Insert
 
End Sub
 
Sub ZoomUp()
 
    If ActiveWindow.Zoom < 396 Then
        ActiveWindow.Zoom = ActiveWindow.Zoom + 5
    End If
 
End Sub
 
Sub ZoomDown()
 
    If ActiveWindow.Zoom > 30 Then
        ActiveWindow.Zoom = ActiveWindow.Zoom - 5
    End If
 
End Sub
 
Sub charaBIG()
    With Selection.Font
        .Size = .Size + 1
        If .Size > 300 Then
            .Size = 300
        End If
    End With
End Sub
 
Sub charaSMALL()
    With Selection.Font
        If .Size >= 2 Then
            .Size = .Size - 1
        End If
    End With
End Sub
 
Sub LineAutoFit()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    Rows(nRow).Select
    Selection.EntireRow.AutoFit
    Cells(nRow, nCol).Select
 
End Sub
 
Sub ColumnAutoFit()
 
    nRow = ActiveCell.Row
    nCol = ActiveCell.Column
    Columns(nCol).Select
    Selection.EntireColumn.AutoFit
    Cells(nRow, nCol).Select
 
End Sub
 

Sub ウィンドウ最少化()
    Application.WindowState = xlMinimized
End Sub

Sub 列幅微増()
    Selection.ColumnWidth = Selection.ColumnWidth + 1
End Sub
'
Sub 列幅微減()
    If Selection.ColumnWidth > 1 Then
        Selection.ColumnWidth = Selection.ColumnWidth - 1
    Else
        Selection.ColumnWidth = 0
    End If
End Sub
'
Sub セル縦位置UP()
'
    With Selection
        If .VerticalAlignment = xlBottom Then
            .VerticalAlignment = xlCenter
            Exit Sub
        End If
        If .VerticalAlignment = xlCenter Then
            .VerticalAlignment = xlTop
            Exit Sub
        End If
        .VerticalAlignment = xlTop
    End With
'
End Sub
'
Sub セル縦位置DOWN()
'
    With Selection
        If .VerticalAlignment = xlTop Then
            .VerticalAlignment = xlCenter
            Exit Sub
        End If
        If .VerticalAlignment = xlCenter Then
            .VerticalAlignment = xlBottom
            Exit Sub
        End If
        .VerticalAlignment = xlBottom
    End With
'
End Sub
'
Sub 列幅折り返し表示()
    With Selection
        If .WrapText = True Then
            .WrapText = False
        Else
            .WrapText = True
        End If
    End With
End Sub
'
Sub 文字左詰め表示()
    With Selection
        .HorizontalAlignment = xlLeft
    End With
End Sub
'
Sub 文字中央揃い表示()
    With Selection
        .HorizontalAlignment = xlCenter
    End With
End Sub
'
Sub 文字右詰め表示()
    With Selection
        .HorizontalAlignment = xlRight
    End With
End Sub

Sub Cell結合()
'
    With Selection
        If .MergeCells = False Then
            .MergeCells = True
            .HorizontalAlignment = xlCenter
        Else
            .MergeCells = False
        End If
    End With
'
End Sub
 
Sub Next_Sheet_Active()
' Dim sheet_cnt As Long Dim activesheetname As String Dim ws As Variant Dim i As Long sheet_cnt = ActiveWorkbook.Sheets.Count activesheetname = ActiveWorkbook.ActiveSheet.Name For i = 1 To sheet_cnt If ActiveWorkbook.Sheets(i).Name = activesheetname Then Exit For End If Next Do i = i + 1 If i > sheet_cnt Then i = 1 If ActiveWorkbook.Sheets(i).Visible = True Then ActiveWorkbook.Sheets(i).Select Exit Do End If Loop ' End Sub  
Sub Prior_Sheet_Active()
' Dim sheet_cnt As Long Dim activesheetname As String Dim ws As Variant Dim i As Long sheet_cnt = ActiveWorkbook.Sheets.Count activesheetname = ActiveWorkbook.ActiveSheet.Name For i = 1 To sheet_cnt If ActiveWorkbook.Sheets(i).Name = activesheetname Then Exit For End If Next Do i = i - 1 If i < 1 Then i = sheet_cnt If ActiveWorkbook.Sheets(i).Visible = True Then ActiveWorkbook.Sheets(i).Select Exit Do End If Loop ' End Sub
 

Back Next

【目次に戻る】

モーグ
Google
  Web excel7.com