2025/04/05

シート上のデータをデータフォームで操作




ワークシート上でデータをテーブル状(タイトル行+データ行)に並べて管理することは、Excelの最も基本的な使い方です。また、そのデータを「検索」「追加」「修正」「削除」する事も、データを活用したり最新状態に保つためには必須の作業です。
その作業のためには、上下左右の矢印キーでセル操作をしたり、Ctrl+Fで起動する「検索と置換」ダイアログを使ったりしていると思いますが、Excelの標準機能である下記のような「データフォーム(DataForm)」を使って行うことも出来ます。横に長いテーブルの場合には特に有効です。
データフォームでの編集の様子
図01

データフォームは、右半分に操作ボタン、左半分は各列のタイトルとデータ値が入るテキストボックスが列順に並んでいるという簡単なダイアログです。しかし、データベースの基本である「検索」「追加」「修正」「削除」の機能は揃っています。
今回は、このデータフォームについて説明します。

1.対象となるテーブルの範囲とフォーマット

1-1.データ範囲

まずデータフォームが対象とするのは、基本的には「Selectしているセルを含むデータ範囲」で、最大32列までです(32列を超えるデータ範囲でデータフォームを起動しようとすると、エラーが発生します。)
但し、同じシート内に「DataBase」という名前の付いたセル範囲が存在すれば、たとえ他のデータ範囲をSelectしていても、下図のように「DataBaseという名前のセル範囲」がデータフォームの対象となります。
DataBaseという名前のセル範囲がある場合
図02

なお、データフォームを起動しようとしているシートでは無く「他のシートにDataBaseという範囲が存在」する場合は、「データベースまたはテーブル範囲が正しくありません」というメッセージが表示され、データフォームは起動されません。

1-2.データ範囲のフォーマット状態

データフォームがSelect位置のデータを「テーブル(タイトル行+データ行)」と認識できない場合は、以下のようなダイアログが表示されます。
Select範囲がテーブルでは無い場合のダイアログ表示
図03

なお「OK」ボタンをクリックすれば、強制的にデータ範囲の「1行目をタイトル」「2行目以降をデータ」とするテーブルと見なしてデータフォームが起動します。また「キャンセル」ボタンをクリックすれば、データフォームを表示せずに終了します。
Select位置のデータを「テーブル」と認識させる為には、2つの方法がありそうです。
1つ目は、タイトル行(1行目)とデータ行(2行目以降)のデータ型を変える方法です。
テーブルと見なされるデータ型
図04

上図のA・B列、D・E列のデータは、1行目と2行目以降が同じデータ型ですので、1行目をタイトル行として認識してくれません。またG・H列のデータでは、G列の1行目が空白セルになっているため2行目以降がデータとは認識しないようです。
それに対しJ・K列のデータでは、J列の1行目が文字列、2行目以降が数値とデータ型が異なるため、1行目をタイトル行と見なしてくれます(データ範囲内の1列だけでも条件が合えば、良いようです)。
具体的には、ユニークなデータ番号列や日付列などを、テーブル内に設けるのが良いかと思います。
2つ目の方法は、タイトル行にデータ行とは異なる「フォント、配置、書式、パターン、罫線」を設定する方法です。
テーブルのタイトルと見なされるフォーマット
図05

上図のA・B列のデータは、1行目も2行目以降も「フォントもセル書式も同じ」ために、テーブルとは見なしてくれません。
D・E列のデータでは、1行目のみにセル書式(この場合は、薄黄色の背景色)を設定しているため、1行目をタイトル行として見なしてくれます。
G・H列のデータでは1行目のみ Bold設定(=太字化)を行い、J・K列のデータでは文字色を赤色設定しているために、1行目をタイトル行として見なします。
これ以外にも、文字サイズ・背景パターン・1行目と2行目の間に罫線を引く などでもタイトル行とすることが可能です。
またデータ行が1行も無く「タイトル行のみ」の場合も、図03のダイアログが表示されます。この場合は「OK」ボタンをクリックすることでデータフォームが起動し、「新しいデータ行の挿入」のモードから始まります。

1-3.表題の有無

テーブルに下図のような表題が入っている場合は、表題は無視されます。
テーブルに表題がある場合は無視される
図06

Excelがこれを「表題」と判断している条件は、表題=文字列、タイトル行=文字列、データ=数値や文字列 という「異なるデータ型」で分けている訳ではなさそうです。例えば表題が数値であっても、その表題を無視してくれます。
もしかしたら「データ側(≒下側)からチェックし、データとタイトル行との境目を認識」しているのかもしれません。
もしそうだとすると、文字列・数値が混在しているデータのテーブルの場合は、1つのテーブル範囲として認識してくれない可能性も考えられるので注意が必要です。

2.データフォームの起動

データフォームを起動するには、手動による方法と、VBAを使用する方法があります。

2-1.手動による起動

2-1ー1.ボタンで起動

起動方法の1つは、Excelのリボンなどに「データフォームのボタン」を準備した上で、「データ範囲内をセル選択」→「データフォームボタンをクリック」する方法です。
2-1ー1-1.データフォームボタンの登録
現バージョンのExcelでは「データフォームボタン」は、既定状態では表示されていません。
そこで下記のような方法で、ボタンをリボン上(またはクイックアクセスツールバー上)に追加する必要があります。
リボンのユーザー設定
図07

追加手順として、まずExcelのリボン上でマウスを右クリック①し、現れたメニューの「リボンのユーザー設定」②を選択すると図08のようなダイアログが表示されます。中央列が登録する機能ボタン、右列が登録するリボン上の位置を示しています。
データフォームボタンを追加
図08

ダイアログを表示させた直後は、中央列は「基本的なコマンド」になっています。しかしデータフォームボタンは、基本的なコマンドには含まれていないため、コマンドの選択(C)をクリックし、リストから「すべてのコマンド」または「リボンにないコマンド」を選択③します。
そのリストの中から「フォーム...」を選択④します(リストは、あいうえお順に並んでいます)。
次にボタンを追加するタブ位置⑤を決定するのですが、既定のグループ(=タブの一つ下)に登録しようとするとエラーが発生するので、「新しいグループ」や「新しいタブ」を作成してから指定します。なおグループの順番は変更可能です。
最後に「追加(A)>>」⑥をクリックすると、ボタンが追加されます。
2-1ー1-2.ボタンでのデータフォームの起動
データフォームのボタンが登録できたら、下図のように操作したいデータ範囲内のどこかを選択①し、登録したデータフォームのボタンをクリック②します。すると、データフォームが起動③します。
手動でデータフォームを起動
図09

2-1-2.ショートカットキーでのデータフォームの起動

Excelには、ワークシートの上部に「操作するためのボタン」が並んでいます。その1つ1つのボタンには「キーボードからも操作」できるように「ショートカットキー」が割り当てられています。
そのショートカットキーを調べるには、スペースキーの横あたりにある「Altキー」を押す事で確認できます。
ショートカットキーの確認法
図10

まずAltキーを押すと、図10の中央図のように「タブ」や「クイックアクセスツールバー」を選択するためのショートカットキー(黒背景+白文字)が表示されます。
その状態からタブの種類を表すキー(図10ではデータタブを表す文字「A」)を押すと、選択したタブ内の各ボタンのショートカットキーが表示されます(図10の右側図)。
つまり、今回私のPCのExcelのリボンに「データフォームボタンの登録」を使って追加したフォームボタンのショートカットキーは「Alt → A → Y1」となる訳なのですが、追加したボタンのショートカットキーは、追加したタブやタブ内の位置・追加した順番などで変わってしまうため、一意では決まりません。
一方Excel2003以前のバージョンでは、以下のような「ツールバー」と呼ばれる「種類メニューをクリックすると、その操作項目がスダレ状に現れ、項目を選択する」という形式で操作をしていました。
Excel2003以前のツールバー
(図は上越教育大学資料より抜粋)
図11

この古いタイプのツールバーにも、もちろんショートカットキーが割り当てられており、且つ「(データ)フォーム」は標準でツールバーに登録されていました。
そのフォームのショートカットキーは「Alt → D → O」です。
Excel2007以降の操作系は現在のリボンタイプに変わりました。しかし、恐らく昔のプログラムとの互換性を保つために「Excel2003以前のツールバーのショートカット」は動く ように作られています。
つまりExcel2007以降でも、図12のように「Alt → D → O」のショートカットキー②でデータフォームの起動③ができます。
ショートカットキーでデータフォームを起動
図12

寄り道(旧ツールバーの各ショートカットキー)
今回はデータフォームだけに注目していますが、Excel2003以前のツールバーには、データフォーム以外にも様々な項目が存在していました。下表は「データ(D)」メニュー内の項目一覧です。右列は、対応する現在のボタンのショートカットです。
旧ツールバーのショートカットID新リボンのショートカット
ツ 













Alt+D(データ) → S(並べ替え)928Alt+A → SS
Alt+D → F(フィルタ) → F(オートフィルタ)899Alt+A → T
Alt+H → S → F
Alt+D → F(フィルタ) → S(全て表示)900Alt+A → C
Alt+H → S → C
Alt+D → F(フィルタ) → A(フィルタオプションの設定)901Alt+A → Q
Alt+D → O(フォーム)860
Alt+D → B(集計)861Alt+A → B
Alt+D → L(入力規則)2034Alt+A → V → V
Alt+D → T(テーブル)862Alt+A → W → T
Alt+D → E(区切り位置)806Alt+A → E
Alt+D → N(統合)863Alt+A → N
Alt+D → G(グループとアウトラインの設定) → H(詳細を表示しない)464Alt+A → ZO → H
Alt+D → G(グループとアウトラインの設定) → S(詳細データの表示)462Alt+A → ZO → J
Alt+D → G(グループとアウトラインの設定) → G(グループ化)3159Alt+A → ZO → G
Alt+D → G(グループとアウトラインの設定) → U(グループ解除)3160Alt+A → ZO → U
Alt+D → G(グループとアウトラインの設定) → A(アウトラインの自動作成)904Alt+A → G → A
Alt+D → G(グループとアウトラインの設定) → C(アウトラインのクリア)905Alt+A → U → C
Alt+D → G(グループとアウトラインの設定) → E(設定)906Alt+A → L
Alt+D → P(ピボットテーブルとピボットグラフレポート)2915(Alt+N → SZ → C / → P)
Alt+D → D(外部データの取り込み) → D(データの取り込み)6262(Alt+A → PN)
Alt+D → D(外部データの取り込み) → W(新しいWebクエリ)3829Alt+A → ZX → FW
(~Excel2016)
Alt+D → D(外部データの取り込み) → N(新しいデータベースクエリ)2054Alt+A → ZX → FO → Q
(~Excel2016)
Alt+D → D(外部データの取り込み) → E(クエリの編集)1950Alt+PU → E
Alt+D → D(外部データの取り込み) → A(データ範囲プロパティ)1951Alt+A → P1
Alt+D → D(外部データの取り込み) → M(パラメータ)537
Alt+D → I(リスト) → C(リストの作成)7193Alt+A → PT
Alt+D → I(リスト) → R(リストのサイズ変更)7765Alt+JT → I
Alt+D → I(リスト) → T(集計行)7372Alt+JT → T
Alt+D → I(リスト) → V(範囲に変換)7375Alt+JT → G
Alt+D → I(リスト) → P(リストの発行)7684Alt+JT → X → E
Alt+D → I(リスト) → L(サーバー上のリストの表示)7763
Alt+D → I(リスト) → U(リストのリンクを解除)7683Alt+JT → K
Alt+D → I(リスト) → Y(リストの同期)7761
Alt+D → I(リスト) → D(変更を破棄して最新の情報に更新)7762
Alt+D → I(リスト) → B(アクティブでないリストの枠線を非表示)?
Alt+D → X(XML) → I(インポート)7433Alt+L → T
Alt+D → X(XML) → E(エキスポート)7432Alt+L → E
Alt+D → X(XML) → R(XMLデータの更新)7812Alt+L → F
Alt+D → X(XML) → X(XMLソース)7693Alt+L → X
Alt+D → X(XML) → P(XMLの対応付けのプロパティ)7813Alt+L → O
Alt+JT → P
Alt+D → X(XML) → Q(クエリの編集)?
Alt+D → X(XML) → A(XML拡張パック)7784Alt+L → S
Alt+D → R(データの更新)459Alt+A → R → R
Alt+JT → F → R
図13

現在のExcelバージョンでは使えないもの(見え消しにした項目)も存在しますが、多くが昔の操作で使えます。なおカッコ書きとしているものは、全く同じでは無く機能が近い事を表していますし、バージョンによりショートカットが異なるものもあるようなので注意は必要です。
なお図13は全て大文字のアルファベットで書きましたが、小文字のアルファベットでも問題なく動作します(VBAから実行する時は、メニュークラスには小文字を指定する必要がありそうです)。
またID列は「旧ツールバーのID番号を指定」で説明する、FindControlメソッドで使用するID番号です。

2-2.VBAによる起動

VBAからデータフォームを起動するには、下記の4種類の方法がありそうです。

2-2-1.ShowDataFormメソッド

Worksheetクラスの「ShowDataForm」メソッドの実行でデータフォームを起動できます。最も一般的な方法のようです。
ShowDataFormメソッドは引数を持ちませんので、下記のようにそのまま実行します。
なお実行の対象となるのは、Selectセルを含むデータ範囲("DataBase"という範囲が存在する場合は、そちらが対象)というのは手動の時と同じです。
  • '========== ⇩(1) ShowDataFormメソッド ============
  •  Worksheet.ShowDataForm
図14

なおWorksheetオブジェクトとしては、ActiveSheet、Sheets("Sheet1")等を使用します。

2-2-2.旧ツールバーのショートカットキーを使用

手動の「ショートカットキー」をVBA側から発行する事でデータフォームを起動することも可能です。
ショートカットキーを送るにはSendKeysを使用します。SendKeysメソッドの構文は以下になります。
Application.Sendkeys (keys [,Wait])
引数内容
1Keys必須String送信するキーボード操作
2Wait省略可Boolean待機モード
False(既定)=キー送信直後に次行へ移行
True=キーボード操作完了後に次行へ移行
図15

第1引数(Keys )には、送信するキーボード操作を文字列で指定します。また「Altキー」との組み合わせでキーを送信するには「"%"」を文字キーの前に付加します。(なお「Shiftキー」の場合は「"+"」、「Ctrlキー」の場合は「"^"」となります。)
また、それ以外の文字キー以外のキー操作の詳細はMicrosoftサイトを参照下さい。
データフォーム起動のショートカットキーは、図12で説明したように「Alt → D → O」ですので、これをSendKeysメソッドの引数に指定して下記のように実行します。
なお、VBA側から「データ(D)」メニューを呼び出す時は「"%D"」ではダメで、「"%d"」と小文字の「"d"」を使用します(理由は、"D"だとShiftキーも押されていると判断して、データメニューにたどり着かない為のようです)。
但しデータメニュー内の「フォーム(O)」を呼び出す時は、大文字「"O"」でも小文字「"o"」でも大丈夫そうです。
  • '========== ⇩(2) ツールバーのショートカットキー ============
  •  Application.SendKeys "%dO"
図16

なお第2引数(Wait )には、False(既定)/True の指定が可能ですが、データフォームの起動に当たっては、動作の違いは無さそうです。
但し「Application.SendKeys "%dO"」のコードの後ろに「SendKeys以外の何らかのコード」があると、Excelに制御がある内はそちらのコードが実行されてしまい、データフォーム自体は起動されない事になります。これは、第2引数がFalse/Trueのどちらであっても同じです。
図15の説明を読むと、第2引数をTrueにしておけば「SendKeysで送ったキーを実行(=フォームの起動)」してから次の行(=他のコード)に移りそうですが、そのような動きにはなりませんので注意が必要です。

2-2-3.旧ツールバーの項目のID番号を指定

旧ツールバーの各項目のプロパティの1つに、機能を識別する「ID番号」等があります。そのID番号等を指定して実行することでも、今回のフォームは実行できます。
まず、実行したいフォームの機能(CommandBarControl)をFindControlメソッドで探します。構文は以下になります。
CommandBars.FindControl ([Type], [Id], [Tag], [Visible]) As CommandBarControl
引数内容
1Type省略可コントロールの種類
2Id省略可コントロールの ID (識別子)
3Tag省略可コントロールのタグの値
4Visible省略可False(既定)=全コントロールが検索対象?
True=表示されているコントロールのみが検索対象
図17

FindControlメソッドは、引数(第1~3)に合致するプロパティ値のコントロール(CommandBarControl)を探し、戻してくれます。探す範囲が第4引数のようです。
今回の目的のデータフォームのプロパティ値は、以下になります。ID値は図13を参照下さい。
プロパティ
TypemsoControlButton(値=1)
Id860
Tag""(長さゼロの文字列)
図18

探す際に、第1~3のプロパティ値の全てに合致するコントロールを探してももちろん良いのですが、一意で決まる「Id」のみを指定するのが一般的です。
戻されたコントロール(CommandBarControl)は、以下のようにExecuteメソッドで実行します。
  • '========== ⇩(3) ツールバーの項目ボタンの番号 ============
  •  Application.CommandBars.FindControl(, 860).Execute
図19

なおデータフォーム(コントロール)は、現Excelでは非表示という扱いのようで、第4引数(探す範囲)はFalse(既定)にしないと見つからない(=エラー発生)事になります(「ボタンの登録」を使って、リボン上にフォームボタンを表示させた状態でもエラーとなります)。

2-2-4.Excel4.0マクロからフォームを呼び出す

昔のExcelマクロである「Excel4.0マクロ」を使ってデータフォームを呼び出す事も出来ます。
このExcel4.0マクロそのものは、現在でも使用可能です。以下ではデータフォームを起動するマクロを作成し、実行させています。
Excel4.0マクロを登録
図20

Excel4.0マクロを使うには、まずシートのタブ位置で右クリック①し、現れたメニューの「挿入(I)...」を選択②すると、図20の中央図のような「挿入シートのタイプを選択」するダイアログが現れます。その中から「Excel4.0マクロ③」を選択すると、Excel4.0マクロを記入するマクロシートが追加(図20の右側図)されます。
そのマクロシートに、マクロを記述④していきます(マクロ文法については、今回は割愛します)。
記述したマクロは上から下へと流れていきますので、先頭セル(Macro1!$A$1)を実行すれば良い事になります。
マクロ実行するには、リボン上の「開発」タブ→「マクロ」をクリック⑤し、現れたダイアログでマクロシートの先頭セルを指定⑥し、実行⑦します。すると図21の右側図のようにデータフォーム⑧が起動します。
Excel4.0マクロを実行
図21

図21ではマクロを直接実行しましたが、ワークシート上に配置したボタン等にマクロシートのマクロを登録することも、もちろん出来ます。
実はこの図20図21の手順自体が「データフォームの起動方法」の1つなのですが、VBAが起動する環境のExcelでExcel4.0マクロを動かすと言うのも違和感があるので、ここでは「VBAでExcel4.0マクロの関数を起動」する方法を紹介します。
使用するのはVBAのExecuteExcel4Macroメソッドで、構文は以下です。
Application.ExecuteExcel4Macro (String)
引数内容
1String必須StringExcel4.0マクロ関数
図22

ここでは引数に、データフォームを起動する関数である「"DATA.FORM()"」を指定します。これは図20の右端図のA2セルに記述した「=DATA.FORM()"」の「"="を省いたもの」で、末尾の両カッコも必要です。コードとしては以下のようにします。
  • '========== ⇩(4) Excel4.0マクロから呼び出す ============
  •  Application.ExecuteExcel4Macro "DATA.FORM()"
図23

このコードをVBAから実行することで、Selectしたデータ範囲に対して図21の右端図と同様にデータフォームが起動します。

2-3.データフォームの起動直後状態の操作

UserFormではフォーム起動前に起動時の設定が出来ます。しかしデータフォーム自体には起動前の状態を設定できる機能はありません。しかし、システムによっては起動直後に「新規入力」状態や「検索」状態にしたい場合もあると思うので、SendKeysを使ったデータフォーム起動直後の状態を操作する手法を紹介します。
但し以下で説明する手法は、以下2つの理由でお勧めできません。
SendKeysで送ったキー内容が、Excel以外で実行される可能性があります。元々SendKeysは「相手を確認しないままキーを送信」しますので、制御がExcelからWindowsに移った時に、急にマルウェアのダイアログが現れるかもしれません。そこでキーが実行されたら 大変な事になる可能性があります。
上記理由に加えて「SendKeys以外でデータフォームを起動する場合」では、起動前に起動後の操作を行うという「コード順序が逆転」してしまいます。コンピュータの命令は順次実行(上から順番に命令を実行)ですので、途中で追い越すことを前提にコードが書かれてしまうと、後からコードを読む人が混乱します。

2-3-1.SendKeysでデータフォームを起動する場合

SendKeysでデータフォームを起動した後、データフォームの操作をSendKeysで送信します。コードとしては以下のようになります。
  1. '========== ⇩(5) データフォーム起動後の状態をVBAから操作1 ============
  2.  Application.SendKeys "%dO"   '←データフォームの起動
  3.  Application.SendKeys "%w"   '←新規(W) を実行
  4. ' Application.SendKeys "%c"   '←検索条件(C) を実行
図24

この流れを図にすると、以下のようになります。
SendKeysでフォームを起動しSendKeysで制御をする
図25

01行目「Application.SendKeys "%dO"」で、Windowsに対して「Alt+d+O」のキーを送ります。01行目のすぐ後に03行目がありますので、制御はExcelにある状態のまま03行目「Application.SendKeys "%w"」を実行し、またWindowsに対して「Alt+w」のキーを送ります。
03行目でプロシージャが終了するとすると、初めて制御はWindowsに移ります。すると01行目で送っていた「Alt+d+O」が実行され、Excel上でデータフォームが起動します。この時点ではデータフォームは01行目のデータを表示しています。
続いて03行目で送っていた「Alt+w」が実行され、データフォームの「新規(W)」ボタンを押す事になり、新しいレコードを入力するモードに変わります。
なお03行目の代わりに04行目「Application.SendKeys "%c"」を生かせば、検索モードでデータフォームが起動します。

2-3-2.SendKeys以外でデータフォームを起動する場合

SendKeys以外の「ShowDataForm」「CommandBars.FindControl(,860).Execute」「ExecuteExcel4Macro "DATA.FORM()"」でデータフォームを起動する場合は、データフォーム起動のコードの直前に「SendKeysでフォーム操作のキー」を送ります。
この方法は「データフォームが起動するまでは、制御はExcel側にある」事を利用しています。つまり、制御をExcelが持っている内にSendKeysで「データフォームを操作するキー」をWindows側に送っておき、データフォームが起動して制御がWindowsに移ってから、送っておいたキー操作が実行される というものです。
コード例は以下です。ここではデータフォームはShowDataFormで起動させていますが、コントロールID、Excel4.0マクロで起動する方法でも同じです。
  1. '========== ⇩(6) データフォーム起動後の状態をVBAから操作2 ============
  2.  Application.SendKeys "%w"   '←新規(W) を実行
  3. ' Application.SendKeys "%c"   '←検索条件(C) を実行
  4.  ActiveSheet.ShowDataForm
図26

11行目「Application.SendKeys "%w"」で「Alt + W」のキーをWindows側へ送り出しておきます。11行目から次の14行目はVBAのコードが連続していますので制御はExcel側のままです。そのまま14行目「ActiveSheet.ShowDataForm」でデータフォームを起動します。
データフォームが起動されると制御はWindowsに移り、ユーザーがキーでの入力が可能な状態となると同時に、11行目でWindows側に指示を出しておいたSendKeysの内容(Alt+W のキーを出力せよ)を実行しますので、あたかも「データフォーム上でAlt+Wが操作された」ようになるのです。
流れを図で表すと以下のようになります。
SendKeysを含めた制御の流れ
図27

図27の薄黄色の部分がExcelに制御がある状態で、データフォームを起動し制御がWindows(薄緑色)に戻ったらキー操作が開始するというイメージです。SendKeysからShowDataFormの間で制御が途切れていないのがポイントで、その間で一瞬でも制御がWindowsに戻る(例えば13行目にDoEventsが入る)と、データフォームが起動する前にAlt+Wが実行されてしまうため、新規入力状態にはなりません。
なお、通常の状態でAlt+W のキー入力がされると、Excelの上部リボンの「表示タブ」が選択される(表示タブのショートカットキーは、Alt+W 割り当てられている)だけで、実害はありません。

2-4.サンプルファイルでのコード例

データフォームの起動方法として、ここでは「データの上で右クリック」した時にデータフォームを起動させるコードを紹介します。プロシージャはシートモジュール上に記載しています。
もちろんこれが最良の方法という訳では無いので、システムに合わせた方法を検討して下さい。
  1. '========== ⇩(7) データフォームの起動 ============
  2. Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  3.  If Target.CurrentRegion.Count > 1 Then
  4.   Cancel = True
  5.   ActiveSheet.ShowDataForm
  6. '  Application.SendKeys "%dO"
  7. '  Application.CommandBars.FindControl(, 860).Execute
  8. '  Application.ExecuteExcel4Macro "DATA.FORM()"
  9.  End If
  10. End Sub
図28

21行目「Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)」は、シート上で右クリックした時に発生するイベントプロシージャです。右クリックしたセル位置を引数Targetとして取得できます。
23行目「If Target.CurrentRegion.Count > 1 Then」は、右クリックしたセル位置が「データ内」であるかを確認しています。データ内の時のみにデータフォームを起動させています。
但し「データに隣接」していてもIf文が成立しますので、「手動のデータフォーム起動」の場合よりは甘くなっています。
データフォームの起動の前に24行目「Cancel = True」で、右クリックの本来機能のメニューをキャンセルさせます。この処理をしておかないと、データフォームを終了させた後で本来のメニューが現れてしまいます。
26行目「ActiveSheet.ShowDataForm」でデータフォームを表示させています。
なお27行目「Application.SendKeys "%dO"」、28行目「Application.CommandBars.FindControl(, 860).Execute」、29行目「Application.ExecuteExcel4Macro "DATA.FORM()"」のコードを使用してもデータフォームを表示できます。

3.データフォームでの表示形式

データフォームのデータ値が入る部分は「テキストボックス」です。文字列はもちろん、数値や日付も左詰めで表示されます。
また日付値は、以下のようにデータフォームを起動する方法によって表示が異なるので、注意が必要です。
起動方法表示
手動ボタン登録yyyy/m/d
ショートカットキー
VBAShowDataFormm/d/yyyy
SendKeysyyyy/m/d
項目ボタンのID番号
Excel4.0マクロm/d/yyyy
図29

また図30のE列のように「数式」が入っている場合は、その計算結果はテキストボックスには入らず、編集不可となります。

4.データフォームの操作

データフォームは、データは左半分、操作ボタンは右半分に並んでいます。
データ部分は、タイトルとテキストボックス内に表示されたデータ値のセットになっています。 データフォームの基本操作
図30

4-1.検索(Select)

データフォーム起動直後は「1行目のデータ」が表示されている状態です。そこから「次を検索(N)」をクリックするごとに、次のデータ・次のデータと表示が変わります(≒全検索)。
条件を絞って検索する場合は、下図のように「検索条件(C)」をクリック①します。
データフォームでの検索
図31

すると右上のデータ番号欄が「Criteria」に変わり、左列のテキストボックスが全て空欄になるので、そこに検索条件を入力②します。検索のルールは以下のようです。
なお複数の列に検索条件を入力した場合は、AND検索(全ての検索条件を満たす行)となります。
列の種類検索値/入力例検索結果
文字列値のみ"雨"検索文字列を含む行が検索
等号"=雨"検索文字列のみの行が検索
不等号">雨"検索文字列の文字コードで検索(?)
?(疑問符)"雨?""?"を任意の1文字として検索
*(アスタリスク)"雨*""*"を任意のゼロ個以上の文字として検索
~(チルダ)"雨~?""~"に続く「?」、「*」、「~」を文字と認識し検索
数値系値のみ"500"検索値の行を検索
等号"=500"数式に従って検索
不等号">500"
図32

文字列に不等号を使ったり、数値のデータ検索に「?(疑問符)」「*(アスタリスク)」「~(チルダ)」を使用すると、意図しない検索結果となりますので使用しない方が良いと思います。
検索条件を入力したら「前を検索(P)」をクリック③すると、図31の一番右側のように検索結果が表示されます。
複数の検索結果が得られている場合は、更に「前を検索(P)」「次を検索(N)」をクリック④することで、隣のデータを表示することができます。
寄り道(検索順序)
複数の結果が得られる場合、検索条件を入力後に「前を検索(P)」「次を検索(N)」のどちらをクリックすれば「検索条件に合致した先頭行データ」が得られるかについて、色々試してみました。
結論としては「前を検索(P)」の方が、先頭行データを得やすい 程度の答えしか得られませんでした。どうも、検索がヒットした行位置をExcelが記憶している感じで、検索入力⇔検索実行を繰り返すと検索結果行が変化する結果が得られました。
また起動時にSelectしたセル位置でも異なるような印象を持ちましたが、確証は得られていません。
まあ、SQLで取り出したデータの並び順は保証されていない事から見ても、特に異常な事でもないのですが、取り出し順序(SQLで言う order by )を指定できないので、どんな仕組み・ルールになっているかには興味があります。

なお検索条件を入力中に「クリア(C)」または「元に戻す(R)」をクリックすると、入力中の検索条件は全て消えます。
また「フォーム(F)」をクリックすると、検索結果表示の状態に戻ります。
なお検索条件入力中に、「閉じる(L)」をクリックまたは「ESCキー」を押すと、データフォームは終了します。
また検索結果が表示されている状態で、再び「検索条件(C)」をクリックすると、検索条件入力のモードとなります。

4-2.追加(Insert)

データフォームを起動し、「新規(W)」ボタンをクリック①します。するとデータが表示されていたテキストボックスが全て空欄になりますので、そこに新しいデータを入力②します。
入力後Enterキーを押下③することで、データが最下行に追加されます。
データフォームでの挿入
図33

なお図33の「合計列(=E列)」のように、元々数式が入っていた列への入力は出来ません。また、データが追加されれば数式も同時に下にCopyされます。
なお値を入力した後、「新規(W)」「検索条件(C)」「閉じる(L)」をクリックしても、データは追加されます。
各テキストボックスへの値入力を中止する場合は、「元に戻す(R)」をクリックするか「ESCキー」を押します。
寄り道(入力規制の影響)
テーブルに入力規制が設定されている場合、データフォーム上のテキストボックスへは問題無く入力が可能です。しかしデータ値を決定(Enterキーなど)した時には、下記のようなエラーが表示され、規制値内でしか決定できません。
これは、最下行に新規データ行を追加すると「追加行も入力規制範囲となる」事を意味しています。
入力規制に合致しない値を入力した場合のエラー
図34

但し、この動きは「入力規制の範囲が、データの先頭行から最終行まで設定」されている場合です。途中行から設定されている場合は、下図のように「追加行が入力規制範囲とはならない」ため、どんな入力値でも決定できてしまうので注意が必要です。
入力規制の拡張範囲
図35


また追加されるのは操作しているテーブルのデータ行のみで、もし横に異なるテーブルが存在していたとしてもそちらには影響を与えません。しかし追加後「下方向にシフト」される形になるので、操作しているテーブルの下側に異なるテーブルが存在する時には、テーブル形状が壊れてしまいます。
この事から「1ワークシートには1テーブル」とするのが良いと思います。

4-3.編集(Update)

検索機能を使い編集をするデータを表示①した後、テキストボックスの値を手入力で編集②します。
編集が完了したら「Enterキー」を押下③すると、編集内容がデータに反映されます。なおワークシートに入力規制が設定されている場合は、図34のダイアログが発生します。
データフォームでの編集
図36

値の編集中に「元に戻す(R)」ボタンをクリックまたは「ESCキー」を押すと、全ての列データが編集前の状態に戻ります。
なお値編集後「新規(W)」「検索条件(C)」「閉じる(L)」をクリックしても、値は変更されます。
なおデータフォームで編集したデータは、ワークシート上で「元に戻す(Ctrl+Z)」では復元出来ないので注意が必要です。

4-4.削除(Delete)

検索機能①を使い削除するデータを表示した後、「削除(D)」をクリック②します。
すると削除をする旨のダイアログが表示されますので、「OK」ボタン③をクリックするとデータが削除されます。
データフォームでの削除
図37

なお、ダイアログで「キャンセル」ボタンをクリックまたは「ESCキー」を押すと、削除はされません。
1つのワークシートに複数のテーブルが存在する場合は注意が必要です。
削除されるのは操作しているテーブルのデータ行のみで、もし横方向に異なるテーブルが存在していたとしても、そちらには影響を与えません。しかし削除後「上方向にシフト」される形になるので、操作しているテーブルの下側に異なるテーブルが存在する時には、テーブル形状が壊れる可能性があります。
基本的には「追加(Insert)」の時と同様に「1つのワークシートには、1つのテーブル」とした方が良いと思います。

4-5.フォーム終了

フォームを終了するには、「閉じる(L)」ボタンまたはデータフォームの右上の×印をクリックします。
またデータが編集されていない状態であれば、ESCキーでも終了できます。

4-6.マウスの代わりにキーで操作

データフォームはマウスだけで無く、キーボードからでも操作が出来ます。
フォーム起動後、「Enterキー」でデータを上から下方向に移動できますし、フォーム上のテキストボックスやボタン類は「TABキー」で移動できます。なお逆に移動させるには「Shiftキー」を押しながら操作することで可能となります。
キーでデータフォームを操作
図38

また、Forcusの当たっているボタンを実行するにはスペースキーを押します。
なお各列のテキストボックス、および各ボタンにはショートカットキーが割り当てられています。
図38でA列の「日付:(A)」や「新規(W)」ボタンを例に説明すると、この中の「(A)」や「(W)」がショートカットキーとなっており、Alt+A(Altを押したままAを押下)やAlt+Wの操作で、そのテキストボックスにフォーカスが移動し、ボタンの場合は実行(=ボタンをクリック)できます。
なお図38では日付列がA列だからAlt+Aなのでは無く、A・B・C・・・のアルファベットから、ボタンに割り振られている「W・D・R・P・N・C・L・F」を除いたもののようです。
ですので、最大32列までのデータ処理がデータフォームでは可能ですが、17列を超えた列には「全てAlt+Z」が割り当てられます。この場合、キー操作の場合はAlt+Zを繰り返すことで、Alt+Zに割り当てられた複数テキストボックス間を移動する事になります。
なお「H」は欠番なのか、どのボタンにもテキストボックスにも割り当てられていないようです。

アプリ実例・関連する項目

特に無し

サンプルファイル

シート上のデータをデータフォームで操作(its-054.xlsm)
セキュリティ向上を目的として「インターネット経由でダウンロードしたOfficeファイル(Excel等)のマクロは、既定でブロック」されるようにOfficeアプリケーションの既定動作が変更になりました。(2022年4月より切替開始)
解除の方法については「ダウンロードファイルのブロック解除方法」を参照下さい。