My Personal.xls:1

私のPersonal.xlsへようこそ!

このページでは、ちょっと変わったマクロを取り上げています。中には実用的なものもあるかな?(笑)

以下のマクロはHTML文書ではなくDOSのテキストファイルにあります。環境によっては正しく表示できないかもしれません。ごめんなさい。また、基本的にExcel95以外の環境では動作しません。間違いもあるかもしれません。

これらのマクロは自由に使用、改変することができます。ただし、原文のままでの複製物の配布、転載は禁止します。原文のままでのアプリケーションへの組み込みは、以下の条件を充たせば、許可いたします。

1. マクロコードの機能の直接的な利用を目的としていること。
2. アプリケーションの配布先が特定できること。


セル書式

書式コマンドを使い、セルの文字列を書式化するマクロ

セルに m^^3 と入力してマクロを実行すると、一括して3を上付き文字にできるというマクロです。比較的容易に独自のコマンドと処理を定義できるように作ってあるので、マクロがわかる方には楽しめるかも。実用性は別としても。

数式のセル参照を一括変換するマクロ

=A1 というセル参照を、=$A$1 =$A1 =A$1 に一括変換するマクロです。たいていの場合、入力し直した方が早いかも。

セル幅に関する基準値の取得とテストを行うマクロ

特に役に立つマクロではありません。Excelの座標の基準値の情報は私が知る限り非公開です。なんとなく解けそうなんですけどね・・・

小数点以下を上付き文字にするマクロ

1.23 という数値を文字列化して、23 の部分を上付き文字にするマクロです。小数点の位置もそろえます。

項目の値によって交互に行の色を変えるマクロ

上から、A, A, B, C, C ... という値があったら、Aの行は白、Bの行は青、Cの行は白・・・と交互に色を付けます。データの切れ目がわかりにくいときに使うと便利かも。

日付数字の位置をそろえるマクロ

11月 9日, 11月10日 ... というように、日付数字がそろうように表示形式を設定します。おなじみの処理ですが、多くの表示形式に対応している点に特徴があります。書式が決まっているのであれば、専用のマクロを作成する方が簡単で良いでしょう。

有効桁を表示し、小数点位置をそろえるマクロ

123.456 という数値に対して、有効桁数が4桁であれば、123.5 となるように表示形式を設定します。小数点以下の桁数を指定することで、小数点位置をそろえることができます。

小数点位置をそろえるマクロ

1.23, 1.234, 2 ... といった数値に対して小数点位置がそろうように表示形式を設定します。整数の場合、小数点は付けません。0.??? などのユーザ定義の表示形式が増えるので適当に削除してください。

罫線色を設定するマクロ

一度引いた罫線の色を一括して変更します。あまり使い道はないかも。

書式パレットマクロブックを作成するマクロ

登録したセル書式をショートカットメニューを使ってコピー貼り付けするツールです。スタイル機能と同じようなものですが、枠罫線だけを有効にします。スケジュール表の色分けに使っていました。


関数

文字列から英字 3 桁+数字 5 桁の ID を生成する関数(Excel 95)

Excel 質問箱のログを NIFTY ログ形式に変換するときに使った関数です。投稿者名から ID を生成しました。

日付文字列をチェックする関数

CDate 関数 は文字列を可能な限り日付値に変換しますが、それでは都合が悪いという場合もあります。この関数では yyyy/m/d の形式だけを有効にしてみました。年の 1 桁および 2 桁入力時には独自の変換ルールを適用します。

Format 関数を使った丸め関数

四捨五入、五捨六入、JIS 丸め などができます。Access や VB でも使えると思います。文字列化してから計算しているため、速度は遅いです。

Log 関数を使った丸め関数

Log 関数を使って桁位置を取得、整数化して丸めてみました。Access や VB でも使えると思います。試してみたら Excel のRound 関数を呼び出すより 20 倍高速でした。

JISの丸めを行う関数

丸める桁の後ろがちょうど5のときに、より近い偶数に丸めるという方法です。文字列化して処理しています。

有効桁で丸め、小数点位置がそろうようにフォーマットする関数

123.456 という数値に対して、有効桁数が4桁であれば、123.5 という文字列に変換する関数です。

文字列の数字部分をフォーマットする関数

1-1-1 という文字列の数字部分を2桁にして 01-01-01 と変換します。段落番号を並び替えるときなどに使います。

上位n個のセルのインデックス配列を返す関数

LARGE関数は上位n番目の値を返しますが、この関数は、上位n個のインデックス番号の配列を返します。順位の基準になる列とは異なる列の値を取得したい場合に使います。

空白挿入で均等割付をする関数

セル書式で均等割付すると (株) などの部分も ( 株 ) と文字間が広くなります。この関数は( )で囲んだ部分には空白を挿入しません。

月の第1X曜日を取得する関数

ワークシート関数でも計算できますが。

指定された期間の曜日回数を計算する関数

ある期間の日曜日の数などを計算できます。

指定された期間の日付回数を計算する関数

例えば、ある期間に4月1日が何回あるか計算する関数です。

EDATE関数と同機能のユーザ定義関数

月数の足し算引き算をする関数です。5月31日の1月後は6月30日に補正します。

DATEDIF関数と同機能のユーザ定義関数

DATEDIF関数には受け入れがたい仕様があります。詳しくは「こまったExcel95」をご覧ください。この関数では期待される数を返すようにしました。また、1900年以前の日付にも対応しているので、長寿の方の年齢計算に利用できます。

フィルタ範囲用SUMIF関数(低速注意)

フィルタ範囲に対応したSUMIF関数です。手に取るようにわかる・・・遅さです。(苦笑)

符号なし整数型をDouble型に変換する関数

VBAには符号なし整数型がありません。この関数を使うとLong型を符号なし整数型と見なし、Double型の数値に変換できます。逆の変換関数もあります。

Double型のダンプを取得する関数

特に役立つものではありませんが、この関数を使うと、例えば、0.1という数値が内部でどのように表現されているか知ることができます。計算誤差の理由を感得できるかも。

セルの文字列を連結するワークシート関数

セル範囲の文字列をすべて結合する関数です。

文字列を区切り文字で分割し、配列を作成する関数

文字列を指定された区切り文字で分割し、配列を作成する関数です。カンマで区切ったり、ラインフィードで区切ったり、結構、応用範囲が広いです。

2つのシート間のワークシートへの参照を返す関数

例えば「Sheet1からSheet5までのシート」という指定方法ができます。あまり必要ないかも。


再計算

数式を再計算させるマクロ2

再計算されない状況でも、強制的に再計算を行うマクロです。ExcelVBAって、こういうのが意外と用意されていないんですよね。


レコード・データ処理

各行に見出し行を追加するマクロ

データの各行に見出し行を挿入するマクロです。例えば、印刷して1件毎に切り離したいときに使います。

マトリックス表から一覧表を作成するマクロ

クロス集計表を一覧形式に変換します。必要になったときにその場で書いても、大した手間ではありませんが。

同形の表をまとめるマクロ

1つの表を複数コピーし、別々に追加、変更したものを、また1つにまとめるためのマクロです。変更の履歴も作成します。

コントロールブレーク処理のサンプルマクロ1

グループ集計のためのマクロです。汎用性があるので、これを利用して短時間で集計処理を作成できます。

コントロールブレーク処理のサンプルマクロ2

グループ集計のためのマクロです。汎用性があるので、これを利用して短時間で集計処理を作成できます。

レコード分割とマージのマクロサンプル

1行複数明細の表と1行1明細の表を変換するマクロです。

組み合わせ検索マクロ   (XLSファイル版)

例えば、複数の数値の中で合計が100になる組み合わせを検索するマクロです。基本的には1つ1つ調べて行く方法なのですが、できるだけ無駄な検索はしないように工夫しています。


ワークシート

入力規制のテスト用ブックを作成するマクロ(Excel97)

入力規制のリスト入力を利用するサンプルです。複数のリストを連動させて、絞り込みを行います。

ワークシートにカレンダーを作成するマクロ

数式を使って月間カレンダーを作成します。作成後に年と月を変更することができます。

月間シートを作成するマクロ

1列1日のカレンダーのサンプルです。作業グループのスケジュール表に使っていました。


セル選択・検索

A列を検索するツールバー(Excel97)

CommandBarのComboBoxControlを使ったサンプルです。ツールバーに文字列を入力してA列を検索します。

値のある最後のセルを選択するマクロ

UsedRangeは書式の設定されたセルも認識しますが、このマクロは書式とは関係なく、実際に値が入っている最後のセルを選択します。ただし、空文字列(')のセルは検索できません。

n行おきに選択するマクロ

例えば、選択範囲の2行目から3行ずつ1行間隔で選択する、といったことができます。複数セル範囲の選択には意外に時間がかかるので、ステータスバーに進捗を表示するようにしました。

再計算時にセルの値を自動チェックするサンプルマクロ

データ入力時だけでなく、クリアやコピー貼り付けのときにもデータチェックを行うサンプルです。でも、ちょっと無理筋ですので、おすすめはしません。

検索と選択マクロ

[編集]-[検索]を行い、見つかったセルをすべて選択します。処理の中断にも対応しています。

セル移動を制御するサンプルマクロ1

保護シートでTabキーでセル移動するサンプルです。マクロは使いません。

セル移動を制御するサンプルマクロ2

保護シートでEnterキーでセル移動するサンプルです。Enterを押したらTabをSendKeysします。

セル移動を制御するサンプルマクロ3

Enterキーでセル移動するサンプルです。移動セルを自由に設定できます。IMEの自動設定も行いますが、NEC機では動かないそうです。

セル移動を制御するサンプルマクロ4

Enterキーでセル移動するサンプルです。列に対して移動するかしないかを設定します。IMEの自動設定も行いますが、NEC機では動かないそうです。

参照元トレース(複数セル)マクロ

参照元トレースは、なぜか1つのセルに対してしか実行できません。このマクロはそれを繰り返しているだけです。

ダイアログボックスでシートを選択するマクロ

シートの一覧を表示し、指定されたシートをアクティブにします。シート選択時の自動実行マクロには対応していません。

アクティブセルを参照しているセルの配列を作成する関数

アクティブセルを数式で参照しているセルのオブジェクト配列を作成するマクロです。用途は・・・忘れました。(笑)

非保護セルを選択するマクロ

ロックが設定されていないセルを選択するマクロです。ロックの設定状況を確認するのに便利かも。非保護セルのコピーやクリアをしたいときは、範囲に名前を付けておくと、それ以降は簡単に選択できます。

選択解除するマクロと選択範囲以外を選択するマクロ

選択解除するマクロです。なぜかExcelには伝統的にこの機能がないようです。(選択範囲-指定範囲)が選択解除で、(指定範囲-選択範囲)が選択範囲以外の選択になるので、2つのマクロはほとんど同じコードになりました。


編集

値貼り付け後に空文字のセルをクリアするマクロ

=""という数式をコピーして値貼り付けすると、空白セルではなく、空文字列(長さ0の文字列)が入っているセルになります。空文字列のセルを空白セルに即、変換する方法はないようです。
このマクロでは、セル単位にクリアする方法、区切り文字を使う方法、置換を使う方法を試してみました。他にはオートフィルタで空白セルをフィルタしてクリアする方法などがあります。

選択された複数セル範囲をコピーするマクロ

通常、1回の操作でコピーできるのは1つのセル範囲か、一定の規則性を持った複数セル範囲です。このマクロでは任意の複数範囲をそのままの位置関係でコピー貼り付けします。同形式の表の間で特定のセルだけをコピーしたい場合に、1回の操作で済むので便利です。

選択範囲の定数セルをコピーするマクロ

上の複数セル範囲コピーの応用です。セル選択の機能を使い定数セルの範囲だけを取得し、コピーします。

使用されていない表示形式を削除するマクロ(Excel95)

表示形式の一覧の取得が、なぜかマクロではできません。多すぎる表示形式が原因であるトラブルを結構聞きますので、非常に不便です。このマクロではダイアログボックスから1つ1つ表示形式を取得しています。大量にユーザ定義してあると時間がかかります。

キーボードで罫線を引くマクロ

シンプルな操作が特徴です。Ctrl+矢印キーまたはAlt+矢印キーで線を引き、もう一度上書きすると線が消えるというものです。通常罫線と外枠線の2種類だけがあり、それぞれに線種を設定できます。
Excel97がセットアップしてある環境では線種の設定が動作しません。CreateObject("Excel.Sheet")の動作がExcel97では変更されているためです。

スタイルを削除するマクロ

スタイルの一覧を表示し、一括削除することができます。

全角半角変換マクロ

これは単純にどちらかに変換するだけのものです。英数字と一部の記号は半角、それ以外はすべて全角にするという処理もありますね。

各行に行挿入するマクロ

行の間を空けるマクロです。セルの挿入や削除は、しばしばバグに関係するので、できれば避けたい処理ですが・・・

各行に行挿入するマクロ2

上のマクロはExcel97では無限ループになるというご指摘をいただきました。ありがとうございます! 一部変更してみました。サポート情報にもこの仕様変更についての情報がありました。私のせいではなかったわけです。(笑) まあ、変更されそうな部分ではありましたが。


フィルタ

重複データの行番号を調べるサンプルマクロ

重複データがあれば、その行番号を書き出します。

重複のないデータを作成するマクロ

フィルタオプションの設定を使った、重複データの除去です。

セル値の検索によりフィルタをするサンプルマクロ

並べ替えて二分探索するという方法です。コードはやや煩雑ですが、性能は良好です。

かなでフィルタするサンプルシートを作成するマクロ

ひらがなのデータから、対応する、あ、か、さ、た・・・の文字を取得します。そしてオートフィルタであ行のデータだけを抽出しようというねらいです。マクロではサンプルシートを作成しているだけで、実際にはワークシート関数と名前定義を使います。

AutoFilterを使い、フィルタとコピーを行うマクロ2

オートフィルタを利用するサンプルです。

AutoFilterを使い、フィルタとコピーを行うマクロ3

オートフィルタを利用するサンプルです。

AdvancedFilterを使い、フィルタとコピーを行うマクロ

フィルタオプションの設定を利用するサンプルです。ShowAllDataが動作しないバグを回避するために、変なコードを書いています。(苦笑) その場にフィルタ表示させるのは、できるだけ避けた方がよいでしょう。

アクティブセルの値でオートフィルタするマクロ

アクティブセルの値でオートフィルタする機能は、組み込みのツールバーボタンにもあるので(分類の「データ」の中)、たいていはそれで十分でしょう。


グラフ

円グラフのデータ要素のパターンを設定するマクロ

円グラフのパターンはグラフ毎に自動的に設定されてしまいます。このマクロではデータ毎にあらかじめ決めておいたパターンを設定します。

埋め込みグラフのプロットエリアの位置とサイズを統一するマクロ

グラフ内部の位置やサイズは自動的に調整されるため、複数のグラフのレイアウトを厳密にそろえるのは困難です。このマクロでは同じ設定を数回繰り返していますが、これでも完全ではないでしょう。

散布図グラフ用リンクデータラベル追加マクロ

少し変更しました。Lotus1-2-3にあってExcelにはない機能です。そのせいか「どうやるのか?」という質問がときどきあります。Excel97では付属のSamples.xlsというファイルに同様のマクロがあります。


図形オブジェクト

フリーフォームの頂点をセルに合わせるマクロ(Excel97)

知らなかったのですが、Excel 97 のフリーフォームでは Alt キーでセルの枠線に合わせることができないのですね。以前のバージョンではできたのに……

リストボックスにセルの値を入力するマクロ

ダイアログシートの作成時に使う補助ツールです。ListFillRangeと同じような機能ですが、選択項目が固定で、作業用のワークシートを使うまでもない、という場合に使います。

図形オブジェクトをセルの枠線に一括して合わせるマクロ

オブジェクトの下のセルに合わせるだけなら単純ですが、このマクロでは一番近いセルに合わせるようにしています。アバウトに作成しておいて一括して整列させる、という使い方ができます。

図形オブジェクトを同じ位置にコピーするマクロ

1つの図形オブジェクトを同じ位置にコピーしたいときは、オブジェクトの左上位置のセルを選択して貼り付ければ良いのですが、オブジェクトが複数の場合は、どれが左上のセルかわかりにくく、面倒です。このマクロはその辺をやってくれます。


ダイアログボックス

読み仮名のリストボックスでフィルタをするサンプルマクロ

フィルタ方法にもいろいろありますが、これはMatch関数で最初と最後のデータを見つけています。

読み仮名のリストボックスで指定文字へジャンプするサンプルマクロ

リストボックスの表示状態は操作できないので、SendKeysで一度最終項目を選択してからListIndexを設定するようにしています。あまり使いたくない「技」です。(苦笑)

カレンダーダイアログボックス2

日付を入力するためのダイアログシートです。年のフィールドにスピンボタンを使っています。表示は遅いです。

カレンダーダイアログボックス

日付を入力するためのダイアログシートです。表示は遅いです。

ダイアログボックスのネストのサンプルマクロ

これはFAQでもありますね。ダイアログボックスを次々に表示するサンプルです。

EnterキーでEditBox間を移動するサンプルマクロ

ダイアログシートではEnterキーでのフォーカス移動はできません。これは無理矢理な方法で、標準ボタンを利用しています。それでも、データ入力の手間が少しでも減らせるのでしたら検討してみても良いかも。

InputBoxでワークシートにデータ入力するマクロ

InputBoxだけでレコード入力するという、ちょっと変わったものです。


ツールバー

ツールバーボタン名称変更マクロ

なぜかマクロを使わないとできない、という処理です。


印刷

アクティブシートを段組みにするサンプルマクロ 2

指定された 1 ページの行数と段組み数を使って、データ移動と改ページ設定を行います。細かいレイアウトやページ設定は後から行ってください。

ページ毎に左右の余白を入れ替えて印刷するマクロ

奇数ページと偶数ページに分けて印刷する方法の応用です。綴じ代のための余白を自動的に設定します。余白を変更することで自動改ページ位置の変更が発生しないかチェックしていますが、このチェックに結構時間がかかってしまいます。

宛名ラベル印刷サンプルマクロ

Excelだけでラベル印刷を行うサンプルです。あらかじめ作成した1ページ分のワークシートを繰り返しコピーして印刷用のブックを作成し、印刷するという方法です。

ワークシートを選択し、印刷プレビューするマクロ

ワークシートの一覧をリストボックスに表示し、複数選択されたワークシートを実際に選択してプレビューします。複数選択リストボックスのサンプルです。


[戻る]