マクロに割り当てられるショートカットキーについて ~エクセル編~
- はじめに
- マクロにショートカットキーを割り当てる方法
- そもそもエクセルのショートカットキーってどういうのがあるの?
- マクロに割り当てられるキーの種類
- VBAのコードで設定することも可能
- もっと多くのショートカットキーを使いたい場合 (要VBA)
はじめに
マクロにはショートカットキーを割り当てることが出来ますが、標準で設定されているショートカットキーもあり、それじゃあ一体どのキーなら使っていいの?ってなりますよね。
マクロにショートカットキーを割り当てる方法
マクロにショートカットキーを割り当てるには、マクロの記録をするときに設定するか、マクロの作成後にマクロのオプション画面から設定します。
そもそもエクセルのショートカットキーってどういうのがあるの?
エクセルのショートカットについてはものすごく詳しく分かりやすいサイトがあるのでこちらをご覧下さい。
excel-hack.com
アルファベットを使っている物だけを抽出すると下表のようになります。
ショートカットキー | 機能 |
---|---|
Ctrl+A | 全てを選択 |
Ctrl+B | 文字を太字(ボールド)にする |
Ctrl+C | コピー |
Ctrl+D | 下方向へコピー |
Ctrl+E | 選択している列の周囲のデータを使用して、その列に値を入力 |
Ctrl+F | 検索 |
Ctrl+G | ジャンプ |
Ctrl+H | 置換 |
Ctrl+I | 文字をイタリックにする |
Ctrl+J | (割り当てなし) |
Ctrl+K | ハイパーリンク |
Ctrl+L | テーブルの作成 |
Ctrl+M | (割り当てなし) |
Ctrl+N | 新規ブックを作成 |
Ctrl+O | ファイルを開く |
Ctrl+P | 印刷 |
Ctrl+Q | クイック分析 |
Ctrl+R | 右方向へコピー |
Ctrl+S | 上書き保存 |
Ctrl+T | テーブルの作成 |
Ctrl+U | 文字に下線(アンダーライン)を引く |
Ctrl+V | 貼り付け |
Ctrl+W | ブックを閉じる |
Ctrl+X | カット(切り取り) |
Ctrl+Y | 直前の作業を繰り返す |
Ctrl+Z | 直前の作業を元に戻す |
Ctrl+Shift+F | セルの書式ダイアログ(フォント) |
Ctrl+Shift+P | セルの書式ダイアログ(フォント) |
Ctrl+Shift+U | 数式バーの展開と格納 |
意外とたくさんあるものですね。割り当てられていないのは「J」と「M」の2つだけでした。
マクロに割り当てられるキーの種類
アルファベットは入れられるだろうなぁと直感的に思います。そこで数字や記号などを入れてみると次のように怒られます。
入れられるのは結局アルファベットだけな訳です。つまり26個。
Shiftを組み合わせることが可能
入力できるのはアルファベットだけですが、図のようにShiftキーを組み合わせることが可能です。
これで更に26個増えました。
標準設定は上書きできる
52個のうち、標準で割り当てられているのが27個ありますが、実は標準設定のショートカットキーよりもマクロに設定したショートカットキーの方が優先されるのです。頻繁に使うショートカットキー以外だったら上書き設定しちゃってもいいと思います。ほら、使ったことないようなものもあるでしょう?
設定を削除すれば標準のショートカットキーに戻る
なお、設定画面から削除すれば標準のショートカットキーが復活しますので安心して下さい。
VBAのコードで設定することも可能
今までの内容は、VBAのコードで記述することも可能です。
コードの記述
Application.MacroOptions Macro:="マクロ名", _ Hasshortcutkey:=True, _ ShortcutKey:=A
引数の説明
Macro : VBAマクロのプロシージャ名 Hasshortcutkey : ショートカットキーを持つかどうか ShortcutKey : 指定するキー
指定するキーの記述と実際のショートカットキー
指定できるキーはアルファベットの「a~z」「A~Z」のみになります。小文字の場合は「Ctrl + 文字」、大文字の場合は「Shift + Ctrl + 文字」を意味します。
アルファベット小文字 a ~ z : Ctrl + A ~ Z アルファベット大文字 A ~ Z : Shift + Ctrl + A ~ Z
もっと多くのショートカットキーを使いたい場合 (要VBA)
VBAのApplication.OnKeyメソッドを使えば、キーボード上のほとんどのキーを使ったショートカットキーを作ることが可能です。以下の記事を参照して下さい。
dz11.hatenadiary.jp
以上です。
選択範囲のコメント位置をリセットする
行の切り取り&貼り付けを行っていると、コメント位置がぐちゃぐちゃになってくることが多いため、コメント位置をリセットするマクロを組んでみました。
Sub ResetCommentPosition() ' ** 選択範囲のコメント表示位置をリセットする ** Dim CL As Range Dim T, L, W, T2, L2 As Long For Each CL In Selection ' セルにコメントがあれば処理 If TypeName(CL.Comment) = "Comment" Then With CL T = .Top L = .Left W =.Width End With T2 = T - 7 L2 = L + W + 11 With CL.Comment.Shape .Top = T2 .Left = L2 End With End If Next CL End Sub
コメントの位置(座標)については、オートシェイプと同様に画面左上を原点とした座標に依ります。現在のセルから基本情報(Top, Left, Width, Height)が得られるのでそれを利用します。
以上。
(Excel) VBAマクロでオートシェイプを描画するときの基礎知識
ExcelのVBAマクロでオートシェイプを描画する場合の基礎知識を紹介します。
座標系
オートシェイプの座標系は画面(セル範囲内)の左上を原点として右方向がX軸、下方向がY軸の、値はポイント単位のものになります。
ポイント単位とは? (2018.12.17追記)
ポイントとはExcel(Office)内で使われる独自の単位で、ピクセルのようなものですがピクセルとは異なります。またフォントのサイズのことでもありません。ポイントとピクセルは以下の式が当てはまります。
1ピクセル=0.75ポイント ( 1ポイント≒1.3334ピクセル)
座標系(図解)
選択範囲から得られる座標値
描画をするにあたり、その位置を決定するために、選択範囲からいくつかの値が得られるようになっています。上図のように範囲選択をしたときに、
- Selection.Left = X座標
- Selection.Top = Y座標
- Selection.Width = 幅のポイント値
- Selection.Height = 高さのポイント値
の値が得られます。これらの値を計算することで、右上、左下、右下の座標やその他の座標を得ることも可能です。なお、値は単精度浮動小数点数型(Single型) Variant型になります。
Dim T, L, W, H As Variant With Selection T = .Top L = .Left W = .Width H = .Height End With
オートシェイプを描画するメソッド
開始点(X1, Y1) , 終了点(X2, Y2) を指定するもの
- AddLine : 直線を描画する
- AddConnector : コネクタを描画する
左上隅の座標値(X, Y) と 幅(Width) と 高さ(Height) を指定するもの
- AddShape : いろいろなオートシェイプを描画する (汎用)
- AddCallout : 輪郭なしの吹き出しを描画する
- AddTextBox : テキストボックスを描画する
座標値の配列を指定するもの
- AddPlyLine : ポリラインを描画する
- AddCurve:ベジェ曲線(スプライン曲線)を描画する
その他
- BuildFreeform : フリーフォームを描画する
サンプル
工程表・ガントチャートのような直線を描画する
Sub AddLineSample() Dim T, L, W, H As Variant Dim X1, Y1, X2, Y2 As Variant With Selection T = .Top L = .Left W = .Width H = .Height End With X1 = L Y1 = T + H / 2 X2 = L + W Y2 = T + H / 2 With ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2) With .Line .ForeColor.RGB = RGB(255, 0, 0) .Weight = 4 .DashStyle = msoLineSolid End With End With End Sub
サンプルコードはやや冗長に書いていますが、この書き方がオートシェイプを追加するときの基本的な書き方になります。
選択範囲の中心に位置する最大の円を描画する
Sub DrawCircle() ' ** 選択範囲の中央に位置する最大の真円を描画する ** Dim L, T, W, H As Variant Dim L2, T2, W2, H2 As Variant ' **選択範囲の基礎情報を取得 With Selection L = .Left T = .Top W = .Width H = .Height End With ' **描画開始位置の設定 If W > H Then L2 = L + (W - H) / 2 T2 = T Else L2 = L T2 = T + (H - W) / 2 End If ' **幅と高さの設定 If W > H Then W2 = H H2 = H Else W2 = W H2 = W End If With ActiveSheet.Shapes.AddShape(msoShapeOval, L2, T2, W2, H2) With .Line .ForeColor.RGB = RGB(0, 0, 0) .Weight = 1 End With With .Fill .ForeColor.RGB = RGB(255, 0, 0) .Patterned (msoPatternLightUpwardDiagonal) End With End With End Sub
以上。
お詫びと訂正
- 2018.12.17:当初、シェイプの座標の単位を「ピクセル(ポイント)」と説明していましたが、ピクセルとポイントは別の単位で、正しくは「ポイント」でした。相関関係を説明の上、訂正してお詫び致します
- 2018.12.17:当初、Range.Top, Left, Width, Heightのデータ型を「単精度浮動小数点数型(Single型)」と説明していましたが、正しくは「Variant型」でした。訂正してお詫び致します
コメント枠の自動サイズ調整を一括で有効にするマクロ
大量にあるシートのコメントが見えてたり見えてなかったりするものが多かったため、コメント枠の自動サイズ調整を一括で有効にするマクロを組んでみました。
アクティブシート内全てのコメント枠の自動サイズ調整を有効にする場合
Sub SetCommentAutoSizeInSheet() ' ** アクティブシートのコメント枠の自動サイズ調整を有効にする ** For i = 1 To ActiveSheet.Comments.Count ActiveSheet.Comments(i).Shape.TextFrame.AutoSize = True Next i End Sub
Enterキーを押したときに移動するセルの方向(上下左右)を変更するトグルマクロ
通常、Enterキーを押したときに移動するセルの方向は「下」です。これを「右/上/左」に変更するには「Excelのオプション」を開いて「詳細設定」から変更することが可能ですが、やや面倒くさいです。ここでは、実行するたびに移動するセルの方向を変更するマクロを作ります。
下→右→上→左→下……と切り替える場合
Sub SetMARD() ' ★★ Enterを押したら移動する方向を変更 ★★ Select Case Application.MoveAfterReturnDirection Case xlDown Application.MoveAfterReturnDirection = xlToRight MsgBox "下→右に切り替えました。", vbOKOnly + vbInformation Case xlToRight Application.MoveAfterReturnDirection = xlUp MsgBox "右→上に切り替えました。", vbOKOnly + vbInformation Case xlUp Application.MoveAfterReturnDirection = xlToLeft MsgBox "上→左に切り替えました。", vbOKOnly + vbInformation Case xlToLeft Application.MoveAfterReturnDirection = xlDown MsgBox "左→下に切り替えました。", vbOKOnly + vbInformation End Select End Sub
- 「Enterキーを押したときに移動するセルの方向」は Application.MoveAfterReturnDirection で取得および設定が可能
- 上=xlUp
- 下=xlDown
- 左=xlToLeft
- 右=xlToRight
このコードでは、現状の MoveAfterReturnDirection を取得し、その値にしたがって処理を分けたいので、Select Caseを使っています。実行後、どのように方向が変わったのかダイアログを出しています。
下→右→下……と切り替える場合
ほとんど同じです。万が一現状が上や左になっていた場合に備え、その場合は下になるようにコードを変更しました。
Sub SetMARD2() ' ★★ Enterを押したら移動する方向を変更 ★★ Select Case Application.MoveAfterReturnDirection Case xlDown Application.MoveAfterReturnDirection = xlToRight MsgBox "下→右に切り替えました。", vbOKOnly + vbInformation Case xlToRight Application.MoveAfterReturnDirection = xlDown MsgBox "右→下に切り替えました。", vbOKOnly + vbInformation Case Else Application.MoveAfterReturnDirection = xlDown MsgBox "上/左→下に切り替えました。", vbOKOnly + vbInformation End Select End Sub
以上。
InputBox関数を数値を入力するまで繰り返す処理
InputBox関数で数値だけを入力させたい場合の処理です。
Do StrIB = InputBox("開始数字?") Loop Until IsNumeric(StrIB) = True
- Do~Loopを後判定で実行しています
- 後判定は最低1回は処理を実行します(この場合はInputBox関数)
- Untilは条件が成立するまで。Whileにすると条件が成立している間ずっと、になります
- IsNumeric関数は"数値に見えるもの"は全てTrueを返します
エクセルのコマンドボタン/自作VBAマクロの解説
基本的なこと
リボン/クイックアクセスツールバーのボタン
- 「Excelのオプション」を一発で開くボタン
- 「罫線」を手軽に引く/消すボタン
- いろいろな「貼り付け」ボタン
- 「印刷」に関連したボタン
エクセルVBA
基本
- VBAマクロ作成を気軽に始めてみよう! ~Excel編~
- VBAマクロをリボンやクィックアクセスツールバーのボタンに割り当てる
- (VBScript) XLSTARTフォルダを開く (無い場合は作成して開く)
- (PowerShell) XLSTARTフォルダを開く、フォルダが無い場合は作成して開く
ループ処理
分岐処理
セル
シート
ブック
コマンド
セルのコメント
- 選択範囲にコメントを一括で追加する
- コメントのみ貼り付けるコマンドをを作成する
- セルのコメントを一括で表示・非表示にする
- 選択範囲のコメント位置をリセットする
- コメント枠の自動サイズ調整を有効にする
- セルのコメントを編集する(1) InputBox関数編-1
- セルのコメントを編集する(2) InputBox関数編-2 複数行対応
- セルのコメントを編集する(3) ユーザーフォーム編-1
シェイプ
セルのコメントを編集する(3) ユーザーフォーム編-1
前回までは InputBox関数を使ってセルのコメント編集を行いました。複数行に対応はしましたが、その方法は区切り文字を使うというちょっとまどろっこしいものでした。もう少し編集画面をなんとか出来ないかと思ったのがこの記事を作るきっかけです。
入力ダイアログにユーザーフォームを使う
ユーザーフォームの作り込み
早速作っていきます。Visual Basic Editorのプロジェクトウィンドウ、個人用マクロブック(PERSONAL.XLSB)で右クリックから挿入>ユーザーフォームを選びます。
UserForm1が作られました。
ツールボックスを表示させます。
テキストボックスを配置します。
ボタンを配置します。
オブジェクト名を変更する
プロパティウィンドウでオブジェクト名を分かりやすい名前に変更します。オブジェクト名はコード入力でも使います。ここでは以下のようにしました。
- ユーザーフォーム:UF_EditComment
- テキストボックス:TB_EditComment
- コマンドボタン:Btn_EditCommentOK
オブジェクトのプロパティを設定する
オブジェクトのプロパティはある程度はプロパティウィンドウでも設定できますし、コード記述で設定することも可能です。ここでは以下のようプロパティウィンドウで設定しました。
ユーザーフォーム
プロパティ | 内容 |
---|---|
(オブジェクト名) | UF_EditComment |
Caption | コメント編集 |
- Caption : 表示される名称
テキストボックス
プロパティ | 内容 |
---|---|
(オブジェクト名) | TB_EditComment |
MultiLine | True |
WordWrap | False |
EnterKeyBehavior | True |
ScrollBars | fmScrollBarsBoth |
IMEMode | fmIMEModeHiragana |
TabIndex | 0 |
- MultiLine : テキストボックスを複数行対応させるか (True/False)
- WordWrap : テキストボックスの右端で自動改行させるか (True/False)
- EnterKeyBehavior : Enterキーを押したときにテキストボックス内で改行するか (True/False)
- ScrollBars : fmScrollBarsBoth=縦横のスクロールバーを有効にする
- IMEMode : fmIMEModeHiragana=テキストボックスで自動的にIMEをひらがなモードにする
- TabIndex : TABキーを押したときにフォーカスが移動する順番 (0, 1, 2, ……)
コマンドボタン
プロパティ | 内容 |
---|---|
(オブジェクト名) | Btn_EditCommentOK |
Caption | OK |
TabIndex | 1 |
標準モジュールのコード
まず標準モジュールにコードを書きます。(2017.10.31追記あり)
Sub EditComment() ' ** ユーザーフォーム版コメント編集 ** If TypeName(ActiveCell.Comment) = "Comment" Then ' ** コメントがある場合 Dim BoolCommentVisible As Boolean ' ** 既存コメントの表示状態を記憶 BoolCommentVisible = ActiveCell.Comment.Visible ' ** 既存コメントが非表示なら表示させる If BoolCommentVisible = False Then ActiveCell.Comment.Visible = True End If ' ** ユーザーフォームをモーダルで表示 ** UF_EditComment.Show (vbModal) ' ** 既存コメントの状態を回復 If BoolCommentVisible = False Then ActiveCell.Comment.Visible = False End If Else MsgBox "コメントがありません。", vbOKOnly + vbExclamation End If End Sub
ここでは対象セルのコメントの有無を判定して、あればユーザーフォーム:UF_EditCommentをモーダルで表示するよう指示しています。
(2017.10.31追記)また、コメントが表示状態でないとエラーになるため、コメントが非表示状態の場合はユーザーフォームを表示させる前にコメントを表示状態にしています。フォームが閉じられるとコメントを非表示状態に戻します。(追記ここまで)
- Modal (モーダル) : フォーカスをユーザーフォームのみに当て、エクセルのメイン画面に当てない
- Modeless (モードレス) : フォーカスをユーザーフォームとエクセルのメイン画面の両方に当てる
例としては、セルの書式設定ウィンドウがモーダル、検索/置換ウィンドウがモードレスです。
起動テスト
マクロ:EditCommentの起動テストをしてみます。
セルにコメントがある場合、このようにユーザーフォームが表示されます。
テキストボックスに文字を入力して挙動を確認して下さい。
- テキストボックス内で改行できるか?
- EnterでフォーカスがOKに飛んでしまわないか?
- テキストボックスの右端で自動改行されてしまわないか?
- 横スクロールバーが出てくるか?
- 縦スクロールバーが出てくるか?
また、TABキーの挙動も確認して下さい。
- TABを押すたびにテキストボックスとOKボタンにフォーカスが移動するか?
なお、この状態でOKボタンを押しても何の反応もありません。これはユーザーフォームのコードを入力していないからです。右上の×ボタンでフォームを閉じることだけが出来ます。フォームを閉じて次に進みます。
ユーザーフォーム(UF_EditComment)のコード
ユーザーフォームのコードウィンドウを表示させます。
ユーザーフォームの初期化
ユーザーフォームの初期化は決まり文句です。ユーザーフォームを開いたときに処理しておきたい内容を記します。
Private Sub UserForm_Initialize() End Sub
オブジェクトのプロパティをプロパティウィンドウで設定しなかった場合はユーザーフォームの初期化の中でプロパティを記述する必要があります。ここではプロパティウィンドウで設定済みなのでコードはありません。
今回は必要な処理は下記になります。
- 現在のセルを記憶させる
- 既存のコメントをテキストボックスに表示する
Private StrActiveCell As String ' ** ユーザーフォームの初期化 ' ** ユーザーフォームの初期化 ** Private Sub UserForm_Initialize() ' ** 現在のセルを記憶 ** StrActiveCell = ActiveCell.Address ' ** 既存のコメントをテキストボックスに表示 ** TB_EditComment.Text = ActiveCell.Comment.Text End Sub
OKボタンを押したときの処理
次に、OKボタンを押したときの処理を書きます。
Private StrComment As String Private Sub Btn_EditCommentOK_Click() ' ** OKボタンを押したときの挙動 ' ** テキストボックスの内容を変数に代入 StrComment = TB_EditComment.Text ' ** 編集内容が空白ならキャンセルとみなしてフォームを閉じる If StrComment = "" Then Unload UF_EditComment Exit Sub End If ' **セルのコメント内容を上書きする With Range(StrActiveCell) With .Comment .Shape.Select True .Text Text:=StrComment End With .Activate End With ' **フォームを閉じる Unload UF_EditComment End Sub
完成したマクロの動作を確認する
完成しました。
(PowerShell) XLSTARTフォルダを開く、フォルダが無い場合は作成して開く
PowerShellも覚えたいなと思い、少しずつ調べています。PS5対応のリファレンス本とかあればいいんですが……。
「XLSTARTフォルダを開く」をPowerShellで作ってみました
さて、以前VBScriptで作った、
dz11.hatenadiary.jp
をPowerShellで作ってみました。
#XLSTARTフォルダの有無を確認して、あれば開く、なければ作って開く。 $UserProfile = $env:UserProfile If(Test-Path $UserProfile\AppData\Roaming\Microsoft\Excel\XLSTART){ #フォルダが存在する場合 Invoke-Item $UserProfile\AppData\Roaming\Microsoft\Excel\XLSTART }else{ #フォルダが存在しない場合 New-Item $UserProfile\AppData\Roaming\Microsoft\Excel\XLSTART -ItemType Directory Invoke-Item $UserProfile\AppData\Roaming\Microsoft\Excel\XLSTART }
上記のコードをWindows PowerShell ISEにコピー&ペーストして任意のファイル名でps1ファイルを作成して下さい。
スクリプトの実行セキュリティポリシーの変更が必要
PowerShellではセキュリティの関係から初期状態ではスクリプトが動作しません。したがって、実行ポリシーの変更が必要です。
Set-ExecutionPolicy RemoteSigned
詳細はこちらを参照して下さい。
www.atmarkit.co.jp
スクリプトファイルを開く
デスクトップ等にあるスクリプトファイルはダブルクリックしても起動できません。PowerShellスクリプトを開くには、
このようにします。
VBScript版に比べるとフォルダが開く速さが格段に違いますね。
以上。
セルのコメントを編集する(2) InputBox関数編-2 複数行対応
InputBox関数によるセルのコメント編集マクロ、前回は1行コメントの編集に対応したものを作成しました。今回はこれを元に複数行に対応させてみようと思います。
- 前回までのコード
- 単純に vbCrLf や Chr(13) & Chr(10) とはいかない
- 文字列を分割するSplit関数
- 既存のコメントが複数行だった場合の処理
- 完成コード
- 次回:ユーザーフォームを使ったセルのコメント編集
前回までのコード
Sub KomeHen() If TypeName(ActiveCell.Comment) = "Comment" Then ' ** セルにコメントがあれば処理する ** Dim StrHen As String StrHen = InputBox(Prompt:="※改行は出来ません。", _ Title:="コメント編集(一行版)", _ Default:=ActiveCell.Comment.Text) ' ** キャンセル処理 If StrPtr(StrHen) = 0 Then Exit Sub End If ' ** コメント内容を変更する処理 ** With ActiveCell With .Comment .Shape.Select True .Text Text:=StrHen End With .Activate End With Exit Sub Else ' ** セルにコメントがなかったら終了する ** MsgBox "コメントがありません。", vbOKOnly + vbExclamation Exit Sub End If End Sub
単純に vbCrLf や Chr(13) & Chr(10) とはいかない
改行と言えば vbCrLf や Chr(13) & Chr(10) などが思いつきますが、InputBoxにこれらを単純に入力しても改行にはなりません。
全然出来てませんね。入力したとおりのコメントになってしまいました。
文字列を分割するSplit関数
文字列を分割するのにはSplit関数があります。区切り文字を設定することで文字列を複数文字列に分割することが可能です。分割された文字列は1次元配列に入ります。
' ** Split Dim RTmp As Variant RTmp = Split(StrHen, ",")
返り値が1次元配列なのでVariant型とします。区切り文字を","として StrHen を分割し、1次元配列 RTmp に代入します。
StrHen = RTmp(0) For i = 1 To UBound(RTmp) StrHen = StrHen & vbCrLf & RTmp(i) Next i
StrHen を書き換えます。まず1行目を代入し、2行目以降は改行(vbCrLf)と文字列を追加していきます。このとき、最大分割数(=配列の最大数)が必要になりますので、UBound関数で最大値を求めます。
既存のコメントが複数行だった場合の処理
既存のコメントが複数行だった場合、InputBoxに代入される文字列は見た目は1行になったように見えます。
この状態で別の場所に改行を入れてみます。「1行目」「2行目」「3行目」の後ろに","を入れて改行します。
指定した箇所で改行されましたが、元々の改行が残っていました。
ワークシート関数 Clean を使う
InputBoxに既存のコメントを表示する際に、不要な改行を削除するため、ワークシート関数「CLEAN」を使用します。
Dim DefaultComment As String DefaultComment = WorksheetFunction.Clean(ActiveCell.Comment.Text) StrHen = InputBox(Prompt:="※改行したい位置に,を入力して下さい。", _ Title:="コメント編集(改良版)", _ Default:=DefaultComment)
「1行目」「2行目」「3行目」の後ろに","を入れて改行します。
意図したとおりに改行されました。
完成コード
Sub KomeHen2() If TypeName(ActiveCell.Comment) = "Comment" Then ' ** セルにコメントがあれば処理する ** Dim StrHen As String Dim DefaultComment As String DefaultComment = WorksheetFunction.Clean(ActiveCell.Comment.Text) StrHen = InputBox(Prompt:="※改行したい位置に,を入力して下さい。", _ Title:="コメント編集(改良版)", _ Default:=DefaultComment) ' ** 空白ならキャンセルとする If StrPtr(StrHen) = 0 Then Exit Sub End If ' ** Split Dim RTmp As Variant RTmp = Split(StrHen, ",") StrHen = RTmp(0) For i = 1 To UBound(RTmp) StrHen = StrHen & vbCrLf & RTmp(i) Next i ' ** コメント内容を変更する処理 ** With ActiveCell With .Comment .Shape.Select True .Text Text:=StrHen End With .Activate End With Exit Sub Else ' ** セルにコメントがなかったら終了する ** MsgBox "コメントがありません。", vbOKOnly + vbExclamation Exit Sub End If End Sub
セルのコメントを編集する(1) InputBox関数編-1
個人的に仕事で大量のコメントを追加しては日々編集しているんですが、こう大量にあるとエクセル標準のコメント編集機能ではちょっとまどろっこしいところがあります。何か入力ダイアログみたいなもので編集できると便利だなと思ったので今回はこれをやってみたいと思います。
入力ダイアログにInputBox関数を使う
まず最初に考えたのは文字列を入力できるInputBox関数です。まずは簡単にコードを組んでみます。
Sub KomeHen0() Dim StrHen As String ' ** 文字列を入力 ** StrHen = InputBox(Prompt:="文字を入力", Title:="コメント編集") ' ** コメント内容を変更する処理 ** With ActiveCell With .Comment .Shape.Select True .Text Text:=StrHen End With .Activate End With End Sub
コードの説明
With~End Withをネスト(入れ子構造)してますが、内容は簡単です。
ActiveCellに対し「.Comment.Shape.Select True」は、セルのコメントを選択状態にします。その上で「.Comment.Text Text:=StrHen」でコメントのテキストをStrHenにする」を実行します。最後に「ActiveCell.Activate」で選択状態をコメントからセルに戻します。
基本のコードが出来ました。
エラー処理を追加
現状のコードですと、コメントが設定されていないセルで実行するとエラーになりますので、エラー処理を加えます。
If TypeName(ActiveCell.Comment) = "Comment" Then ' ** セルにコメントがあれば処理する ** Else ' ** セルにコメントがなかったら終了する ** MsgBox "コメントがありません。", vbOKOnly + vbExclamation Exit Sub End If
コメントの有無で処理を変えます。
キャンセル処理
現状のコードでキャンセルを押すとエラーが発生します。
InputBox関数のキャンセル処理は定型的な書き方があります。私はこちらを参考にしました。
これを踏まえて
' ** キャンセル処理 If StrPtr(StrHen) = 0 Then Exit Sub End If
既に入力されているコメントをInputBoxに代入する
コメントをまるっきり書き換える場合は今のままで良いのですが、既に入力されているコメントを編集する場合、また同じような文字列を入力するのは面倒です。そこで既に入力されているコメントをInputBoxに代入しておきます。
StrHen = InputBox(Prompt:="文字を入力", _ Title:="コメント編集", _ Default:=ActiveCell.Comment.Text)
次回:複数行に対応させる
今回のコードですと一行のコメントにしか対応していません。次回は複数行に対応させてみようと思います。
今回の完成コード
Sub KomeHen() If TypeName(ActiveCell.Comment) = "Comment" Then ' ** セルにコメントがあれば処理する ** Dim StrHen As String StrHen = InputBox(Prompt:="※改行は出来ません。", _ Title:="コメント編集(一行版)", _ Default:=ActiveCell.Comment.Text) ' ** キャンセル処理 If StrPtr(StrHen) = 0 Then Exit Sub End If ' ** コメント内容を変更する処理 ** With ActiveCell With .Comment .Shape.Select True .Text Text:=StrHen End With .Activate End With Else ' ** セルにコメントがなかったら終了する ** MsgBox "コメントがありません。", vbOKOnly + vbExclamation Exit Sub End If End Sub
以上。
(リボン/クイックアクセス) 「セルの罫線」を手軽に引く/消すボタンを追加する
リボンやクイックアクセスツールバーに罫線を引いたり消したりするボタンを追加してエクセルを便利にしてみましょう。
はじめに
皆さんはエクセルで罫線を引くときにどのようにしていますか?
まさか、昔のエクセルみたいに範囲選択して右クリックの書式設定から罫線設定してたりしませんか?
それともホームタブのフォントグループ内にある罫線ボタンのプルダウンリストから設定しているでしょうか?
実はこのプルダウンリストにある項目、すべて単独のボタンとして設定することが可能です。ここでは、新しく罫線タブを作って各ボタンを追加する手順を説明します。
準備
まず入れ物を作ります。リボンのユーザー設定を開き、新しいタブを作成して名前を「罫線」に変更してください。
コマンドをリボンに追加する
この作業がちょっと面倒くさいのですが、これを設定してしまえば後が楽になりますので我慢してやってみましょう。
「コマンドの選択」は「すべてのコマンド」を選びます。目的の罫線コマンドを探し、「追加」ボタンでリボンに追加していきます。
追加するコマンド
1. 右罫線 ( BorderRight )
※上下左右の4つの罫線にはもう一つコマンドがあります。右罫線の場合「右罫線 (BorderRightNoToggle)」という風に「NoToggle」がついたものです。こちらは今回は使いませんので注意してください。
2. 横罫線(内側)( BorderInsideHorizontal )
3. 下罫線 ( BorderBottom )
4. 下太罫線 ( BorderThickBottom )
5. 下二重罫線 ( BorderDoubleBottom )
6. 外枠 ( BorderOutside )
7. 外枠太罫線 ( BorderThickOutside )
8. 格子 ( BordersAll )
9. 罫線 ( BordersGallery )
10. 罫線(内側)( BorderInside )
11. 罫線グリッドの作成 ( BordersDrawGrid )
12. 罫線の作成 ( BorderDrawLine )
13. 罫線の削除 ( BorderErase )
14. 左罫線 ( BorderLeft )
15. 斜め罫線(右下がり)( BorderDiagonalDown )
16. 斜め罫線(右上がり)( BorderDiagonalUp )
17. 縦罫線(内側)( BorderInsideVertical )
18. 上罫線 ( BorderTop )
19. 枠なし ( BorderNone )
ボタンを並び替える
ボタンを選択して右の上下ボタンで並び替えが出来ます。ここでは右図のように並べ替えました。
完成したリボンの罫線タブは以下の通りです。
なお、リボンのボタンはウィンドウ幅によって自動的に拡大縮小します。
便利な使い方
上下左右の罫線がトグルボタン(状態監視付)になっているので、押すたびに「罫線を引く」「罫線を削除」が出来る
B2:D4の範囲を選択した状態
「上罫線」「下罫線」「左罫線」「右罫線」を押すと、ボタンの背景が緑色に変化(押された状態を示す)します。
そのときの状態
次に「左罫線」「右罫線」を再度押して消します。(ボタンの緑背景が消えた)
そのときの状態
横罫線(内側)・縦罫線(内側)・斜め罫線(右下がり/右上がり)もトグルボタン(状態監視無し)になっている
B2:D4の範囲で上下左右の罫線が引かれている状態
「横罫線(内側)」「縦罫線(内側)」を押すと、縦横の罫線が引かれました。このときボタンの背景は変わっていません。内側罫線にはその機能がないからです。
次に「縦罫線(内側)」を押して消してみます。縦罫線だけ消えたのが確認できます。
「罫線の作成」「罫線グリッドの作成」「罫線の削除」ボタン
「罫線の作成」ボタンを押してから、任意範囲をドラッグ(囲う)と、その範囲を囲う外枠罫線が引くことが出来ます。
「罫線グリッドの作成」の場合は、内側の罫線も童子に引くことが出来ます。
「罫線の削除」では任意の範囲の罫線を全て消すことが出来ます。
クイックアクセスツールバーにボタンを追加する
気に入ったリボンのボタンはクイックアクセスツールバーに追加することが出来ます。
「格子」ボタンにカーソルを合わせて右クリックすると、一番上に「クイックアクセスツールバーに追加」の項目があります。
クイックアクセスツールバーに「格子」が追加されました。
同様に気に入ったボタンをクイックアクセスツールバーに追加しました。
以上。
(News) iOS用のGoogleのキーボードアプリGboardにGoogle日本語入力が搭載されました
Google Japan Blogによると、
本日より、iOS 向けキーボードアプリ Gboard が日本語に対応し、日本語をお使いの皆さんにも広くお使いいただけるようになりました。
Gboard は、直接、キーボードアプリから検索したり、検索結果を共有したり、さらに絵文字を入力したりすることができます。iOS ユーザーの皆さんから、多数のリクエストをいただいていた Google 日本語入力も、Gboard に搭載する形で、やっとお届けできるようになりました。お待たせしました!
とのことです。
早速試してみた
私も早速インストールしてみましたが、今のところ出来ることは
- キーボードレイアウトの変更(12キー/QWERTY/GODAN)
- テーマの変更(デフォルト2種/風景10種/自作背景可能)
- Google音声入力の使用
- サジェスト対応
- 絵文字対応
となっており、逆に今のところ出来ないことは
- ユーザー辞書のインポート・エクスポート
- iOSユーザー辞書を利用する
- iOS連絡先を利用する
など、ユーザー辞書絡みについては全く作られていない様子です。
今後のバージョンアップに期待ですね。
シートのインデックスと名前と数、表示と非表示の制御
目次
シートのインデックス番号と名前
現在のシートのインデックス番号と名前を表示する
ActiveSheet.Index 'シートのインデックス ActiveSheet.Name 'シートの名前
Msgboxに表示させます。
Sub GetSheetName() MsgBox "現在のシート" & vbCrLf & _ "Index = " & ActiveSheet.Index & vbCrLf & _ "Name = " & ActiveSheet.Name End Sub
結果表示
シートを移動させたらインデックス番号はどうなる?
Sheet2を左端に移動してみます。
Indexが1になりました。Indexはあくまでもシートの左からの順番だということが分かります。
ブックに含まれるすべてのシートのインデックスと名前を表示する
Sub GSN_All() Dim myShts As Object Dim SN As String SN = "Index:Name" & vbCrLf For Each myShts In ActiveWorkbook.Sheets SN = SN & myShts.Index & ":" & myShts.Name & vbCrLf Next myShts MsgBox SN End Sub
ブックに含まれるシートの数は?
Sub GetSheetCount() MsgBox Worksheets.Count End Sub
シートの非表示と再表示
シートの表示と非表示の制御はシートのVisibleプロパティで行います。
Sheets("Sheet1").Visible = True または False または xlVeryHidden
選択したシートを非表示にする
メニュー操作の場合
注意点:全てのシートを非表示にしようとすると次のエラーダイアログが出ます。
VBAの場合
Sub SheetInvisible() ActiveWindow.SelectedSheets.Visible = False End Sub
メニュー操作と同様、全てのシートを非表示にしようとするとエラーが出ます。エラー処理の追加が必要です。
非表示のシートを再表示する
メニュー操作の場合
VBAの場合
Sub AllSheetsVisible() Dim myShts As Object For Each myShts In ActiveWorkbook.Sheets myShts.Visible = True Next myShts End Sub
全てのシートをFor Each ~ Nextで一つずつ回してVisibleプロパティをTrueにしていきます。
セルの内容を調べるExcelVBAコード
一口にセルの内容と言ってもいくつか考えられます。「値」だったり「テキスト」だったり「数式」だったり、また書式によっても内容はいろいろ変わりますよね。ここではいくつかの例を挙げてそれぞれの「セルの内容」を確認します。
コード
Sub ShowCellData() Dim StrCellAddress, StrFmt, StrVal, StrVal2, StrTxt, StrFml With ActiveCell StrCellAddress = "セル : " & .Address StrFmt = "書式 : " & .DisplayFormat.NumberFormatLocal StrTxt = "Text : " & .Text StrVal = "Value : " & .Value StrVal2 = "Value2 : " & .Value2 StrFml = "Fomula: " & .Formula End With MsgBox StrCellAddress & vbCrLf & StrFmt & vbCrLf & _ StrTxt & vbCrLf & StrVal & vbCrLf & _ StrVal2 & vbCrLf & StrFml End Sub
Rangeオブジェクトのプロパティ | 内容 |
---|---|
.Text | テキスト |
.Value | 値 |
.Value2 | 値2 |
.Formula | 数式 |
数値(1)
C4セルに「123」と数値を入力しました。数式バーも「123」になっています。書式は標準でこれは数値です。この場合はどのプロパティでも「123」になります。
D4セルに「=C4*2」と数式を入力しました。計算されてセルは「246」と表示されています。数式バーは「=C4*2」です。書式は標準でこれは数値です。数式以外のプロパティは「246」になります。
数値(2):分数
C8セルに「0.5」と数値を入力しました。数式バーも「0.5」になっています。書式は標準でこれは数値です。この場合はどのプロパティでも「0.5」になります。
D8セルに「=C8」と数式を入力し、書式を「# ?/?」(分数)に設定しました。書式に従ってセルには「1/2」と表示されています。数式バーは「=C8」です。このとき値としては「0.5」、テキストは「1/2」となります。
文字列
C5セルに「ABC」と文字列を入力しました。数式バーも「ABC」になっています。書式は標準でこれは文字列です。この場合はどのプロパティでも「ABC」になります。
D5セルに「=LEFTB(C5,2)」と数式を入力しました。数式に従いセルは「AB」と表示されています。数式バーは「=LEFTB(C5,2)」です。書式は標準でこれは文字列です。数式以外のプロパティは「AB」となります。
通貨/会計
C6セルに「1234567」と数値を入力しました。数式バーも「1234567」になっています。書式は標準でこれは数値です。この場合はどのプロパティでも「1234567」になります。
D6セルに「=C6」と数式を入力し、書式を「通貨(¥)」に設定しました。書式に従ってセルには「¥1,234,567」と表示されています。数式バーは「=C6」です。このとき値としては「1234567」、テキストは「¥1,234,567」となります。
日付/時刻
C7セルに「2017/9/1」と日付を入力しました。書式は自動的に「yyyy/m/d」になりました。数式バーは「2017/9/1」です。値(Value)は「2017/09/01」になっています。また、値2(Value2)はシリアル値の「42979」になっています。数式もシリアル値になっています。
C7セルを一度クリアして「H29/9/1」と日付を入力しました。書式は自動的に「[$-411]ge.m.d」になりました。数式バーは「2017/9/1」です。値(Value)は「2017/09/01」になっています。また、値2(Value2)はシリアル値の「42979」になっています。数式もシリアル値になっています。
D7セルに「=C7」と数式を入力し、書式を和暦の日付に設定しました。数式バーは「=C7」です。値(Value)は「2017/09/01」になっています。また、値2(Value2)はシリアル値の「42979」になっています。
まとめ
まとめると以下のようになります。
日付/時刻以外の場合
プロパティ | 内容 |
---|---|
Textプロパティ | セルに表示されているもの |
Valueプロパティ | 入力値または数式の結果で書式が標準のもの |
Value2プロパティ | Valueと同値 |
Formulaプロパティ | 数式が入力されていれば数式 それ以外は入力値で書式が標準のもの |