« 2009年3月 | トップページ | 2009年5月 »

2009年4月の記事

2009年4月26日 (日)

Excelの荒技(その5) 行の高さを調整するVBA(その2)

前回の「行の高さを調整するVBA」の続きである。

前回、行の高さを調整する方法として以下の3つを挙げ、1番目について VBAのコードを掲載した。

方法1: 現在の高さの1.1倍とする
方法2: セルの最後に強制的に改行を挿入した後、高さを自動調整する
方法3: 列幅を0.8倍に変更 => 高さを自動調整 => 列幅を元に戻す

今回は残り全部、即ち、方法2と3のコードと、それらをアドイン化してメニューバーから起動する方法について説明する。
最後に、アドインファイルもアップする。
従って、コードの内容に興味がなく、「行の高さを調整するVBA」を試してみたいだけの人は、下の方の「2.作成したアドインファイルの存在を Excel に認識させる。」から見てもらってもよい。

方法2と3のコードを以下に示す。
なお、コメント「選択範囲のチェック~XXXXX をコピー」のところには、前回載せたコードの該当行をそのままコピーしてくれば良い。
また、表示幅の関係で、行の途中で改行されている箇所もあるので注意。

方法2

Private Sub 改行挿入()
    Dim a As Range
    Dim lastCell_Row As Long
    Dim sdHeight As Double
   
    '選択範囲のチェック~最終有効行 をコピー
    For Each a In Selection
        '最終有効行に達したら終わり
        If a.Row > lastCell_Row Then
            Exit Sub
        End If
        If VarType(a.Value) = vbString And Len(Trim(a.Value)) > 0 And a.RowHeight > sdHeight Then
            '最後に改行を挿入
            a.Value = a.Value & Chr(10)
            a.Rows.AutoFit
        End If
    Next a
   
End Sub

方法3

Private Sub 幅縮小拡大()
    Dim a1, a2 As Range
    Dim lastCell_Col As Long
    Dim rate As Double
   
    '幅の縮小率
    rate = 0.8
   
    '選択範囲のチェック~画面の更新を止める をコピー

    '最終有効桁
    lastCell_Col = ActiveSheet.Cells.SpecialCells(xlLastCell).Column

    For Each a1 In Selection.Areas
        For Each a2 In a1.Columns
            '最終有効桁に達したら終わり
            If a2.Column > lastCell_Col Then
                Exit For
            End If
            a2.ColumnWidth = a2.ColumnWidth * rate
        Next a2
    
        a1.Rows.AutoFit
       
        For Each a2 In a1.Columns
            '最終有効桁に達したら終わり
            If a2.Column > lastCell_Col Then
                Exit For
            End If
            a2.ColumnWidth = a2.ColumnWidth / rate
        Next a2
       
    Next a1
   
End Sub

なお、前回、方法1のコードを載せたが、倍率(例えば 1.1倍)のパラメータ付きで呼ばれる形式にしていたので、以下に「呼び側」のコードも載せておく。

Public Sub 行高さ定率変更X11()
    行高さ定率変更 (1.1)
End Sub

それぞれのプログラムの内容については、見ればだいたい判ると思うので特に説明はしない。Range オブジェクトに関する Columns や Rows の使い方が私自身も怪しいが、とりあえず動作するようなので良しとしよう。

さて、これらのプログラムをアドイン化して Excel のファイルメニューから起動できるようにする方法に移る。

手順としては、以下の流れになる。
1.アドインファイル(.xla)を作成する。
2.作成したアドインファイルの存在を Excel に認識させる。
3.アドインを有効にする。

早速、順に示す。
なお、手順1でアドインファイルを作成する方法を示すが、この記事の最後に置いてあるアドインファイル「行高さ調整.xla」を使うのであれば、手順2から始めれば良い。

1.アドインファイル(.xla)を作成する。

Thisworkbook_4 Excelを開き、[ツール]->[マクロ]->[Visual Basic Editor]で、Microsoft Visual Basic ウィンドウを表示する。ここで、左側の「プロジェクト」のサブウィンドウの「ThisWorkbook」をダブルクリックして ThisWorkbook ウィンドウを表示させ、そこに以下のコードを貼り付ける。

  

  

Private Sub Workbook_AddinInstall()
    '新たにMenuBarを追加する
    Set Menu = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
    'MenuBarの名前
    Menu.Caption = "行高さ調整(&G)"

    'MenuBarにサブMenuを追加
    Set SubMenu1 = Menu.Controls.Add
    'サブMenuの名前
    SubMenu1.Caption = "× 1.1(&U)"
    'サブMenuにマクロを登録
    SubMenu1.OnAction = "行高さ定率変更X11"

    'MenuBarにサブMenuを追加
    Set SubMenu3 = Menu.Controls.Add
    'サブMenuの名前
    SubMenu3.Caption = "改行挿入(&I)"
    'サブMenuにマクロを登録
    SubMenu3.OnAction = "改行挿入"

    'MenuBarにサブMenuを追加
    Set SubMenu5 = Menu.Controls.Add
    'サブMenuの名前
    SubMenu5.Caption = "幅縮小拡大(&W)"
    'サブMenuにマクロを登録
    SubMenu5.OnAction = "幅縮小拡大"

End Sub

Private Sub Workbook_AddinUninstall()
    'MenuBarを削除
    Application.CommandBars("Worksheet Menu Bar").Controls("行高さ調整(&G)").Delete
End Sub

上のコードの内容を少し説明すると、手順3でアドインを有効にした際に、Workbook_AddinInstall の内容が実行されて ファイルメニューに 「行高さ調整」とそのサブメニュー項目が追加される。上の例では、1つ目のサブメニュー項目名を「× 1.1」、それを選んだときに実行されるプログラム名を「行高さ定率変更X11」と指定している。
逆に、アドインを無効にした場合は、Workbook_AddinUninstall の内容が実行されて ファイルメニューから「行高さ調整」が削除される。

次に、実行されるプログラムを記述する。
Microsoft Visual Basic ウィンドウで、[挿入]->[標準モジュール]を選択して Module1 と書かれたウィンドウを表示し、ここに、前回および今回記載したコード群を全て貼り付ける。

Visualbasic

最後に、[ファイル]->[Book1の上書き保存]を選択し、既定のアドイン格納場所へ 「行高さ調整.xla」 としてファイルを格納する。

アドインの既定の格納場所は以下である。なお、「ファイル名を付けて保存」ダイアログで「ファイルの種類」を「*.xla」とすると、自動的にこのフォルダが表示される。

  C:\Documents and Settings\ユーザ名\Application Data\Microsoft\AddIns

2.作成したアドインファイルの存在を Excel に認識させる。

通常のExcelのウィンドウに戻り [ツール]->[アドイン]でアドイン画面を表示し、[参照]ボタンからアドインファイル(行高さ調整.xla)を指定すれば良い。
なお、1で書いた既定の格納場所に格納しておけば、Excelを再起動すれば自動的に認識されるので、この操作は不要である。

3.アドインを有効にする。

Excel_addin ファイルメニューの [ツール]->[アドイン]のアドイン画面で [行高さ調整]にチェックを入れる。
これで、ファイルメニューに「行高さ調整」という項目が追加され、使用可能となる。

 

 

以上である。なお、ファイルメニューから「行高さ調整」の項目を消したい場合は、手順3の逆で、チェックをはずせばよい。

最後に、アドインファイルをアップする。

「行高さ調整.xla (zipで圧縮)」をダウンロード

サブメニューは、以下の5つとなっている。
[× 1.1]  [× 0.9]  [改行挿入]  [挿入取消] [幅縮小拡大]

ここで、
 [× 1.1] は 方法1
 [× 0.9] は 方法1の取消し(高さを 1/1.1 倍する)
 [改行挿入] は 方法2
 [挿入取消] は 方法2の取消し(行末の改行を削除する)
 [幅縮小拡大] は 方法3
である。(取消し系のコードは、アドインファイルの中を参照)

なお、最後にお決まりの言い訳。

  • Windows XP + Excel 2000 or 2002 の環境を前提にしており、他は確認していない。
  • デバッグはあまりしていない。
  • 今回の内容は、1週間程度でWEBからかき集めた情報を 自分勝手に解釈して記載しており、書いた本人もよくわかっているわけではない。(キッパリ sign01 bleah

あしからず。

| | コメント (2) | トラックバック (1)

2009年4月19日 (日)

Excelの荒技(その4) 行の高さを調整するVBA

ずっと以前から仕事でExcelを使っているのだが、使い方というよりも、MSの開発ポリシーの点で、理解できないことが多い。

その代表的なものが、画面上ではちゃんとセル内に収まっているのに、印刷すると字が隠れるという現象だ。これは、私がExcelを使い始めた15年前ぐらいから脈々と受け継がれているExcelの「仕様」で、このお蔭で、行の高さ調整・印刷プレビュー・印刷を延々と繰り返さなければならず、日本中で相当な資源(労力&紙)が無駄になっているハズだ。

また、ご丁寧にも、行の高さや列幅を自動調整する機能(行間や列間でダブルクリックする)があるが、使っているフォントによっては行の高さが足りず、表示上においてすら見にくい場合がある。印刷用に頑張って高さ調整した後で、間違って「自動調整」してしまった暁には気が狂うしかない。 crying

使わないお節介機能が次々と実装される中で、このような基本的「不具合」が未だに修正されないのは、「MSの社員は実は使っていないのでは?」と勘ぐりたくなる。
と、嘆いては見たものの、今やExcel抜きでは仕事にならないので使い続けている。

最近も、客先から受領したExcelファイルが、行数が多い上に文字がテンコ盛りで表示上も隠れまくっており、高さ調整する気にもならない。(と、言っても結局したが・・・)

行の高さを調整するマクロをWEB上で探してみたのであるが、VBAのサンプルコードっぽいのしか見つけられなかった。(実は、これまで、VBAはさわったこともなかったので、サンプルコードの実装の仕方すら解らなかった・・・ coldsweats01

そこで、意を決して、自分で作って見ることにした。
あまり、こんなことに時間を費やしたくなかったので、1週間、会社の休み時間にWEBでVBAのサンプルコードをかき集め、土曜日にそれらを参考に一気に書き上げた。

VBAの文法については、Z80の時代のBASIC言語(古っ!)の記憶とWEB上の情報を参照すれば、それほど悩むことはなかったが、VBA 独特の オブジェクト、特に Selection(Excelのセル選択)の扱いには相当手こずった。

例えば、Excel上で選択されたセルを順に処理するには

For Each 変数 in Selection

というループ処理を使うようなのであるが、この方法では、選択範囲が、単純な1つの矩形領域ではなく複数の跳び地であった場合は、セルを左上から順に拾ってくれず、選択した順番通りに拾われてしまう。その結果、選択の仕方によっては、同じ行や列が何度も繰り返し現れる場合があり、「行の高さを調整する」今回のプログラムのような「行単位の処理」には都合が悪い。
回避策をあれこれ考えたが、凝ったコードを書いてもうまくいかない例外ケースが出てしまうので、結局あまり難しいことは考えずに、(少々の例外ケースには目をつぶって)シンプルにいく方針とした。

主な仕様としては以下とした。

・ 選択されたセル(の行)を対象に行の高さを広げる
・ 広げ方は以下の3通りとする(1番目だけでもよいかも知れないがVBAの勉強も兼ねて)

  1. 現在の高さの1.1倍とする
  2. 最後に強制的に改行を挿入した後、高さを自動調整する
  3. 列幅を0.8倍に変更 => 高さを自動調整 => 列幅を元に戻す
     

まだ、ほとんどテストもできていないが、まず 1.のコードを載せておく。

1.現在の高さの1.1倍とする(倍率は可変)

Private Sub 行高さ定率変更(ByVal rate As Double)
    Dim a As Range
    Dim lastCell_Row As Long
    Dim sdHeight As Double
    Dim current_Height As Double
   
    '選択範囲のチェック
    If TypeName(Selection) <> "Range" Then
        MsgBox "対象セルを選択してから実行してください"
        Exit Sub
    End If
   
    '画面の更新を止める
    Application.ScreenUpdating = False
   
    '標準の行の高さ
    sdHeight = ActiveSheet.StandardHeight
    '最終有効行
    lastCell_Row = ActiveSheet.Cells.SpecialCells(xlLastCell).Row

   
For Each a In Selection.Rows
        '最終有効行に達したら終わり
        If a.Row > lastCell_Row Then
            Exit Sub
        End If
       
        current_Height = a.RowHeight
        If current_Height <> sdHeight Then
            a.RowHeight = current_Height * rate
        End If
    Next a
   
End Sub

2. 以降は、次回とする。
近いうちに、3. まで含めた xla ファイルをアップする(つもり )

【2009年4月26日追記】
続き(残りのコードとアドインファイル)をアップしました。
ココです。

では。

| | コメント (0) | トラックバック (0)

2009年4月12日 (日)

トレインチャンネル 「ダーリンは外国人」は終わった?

2月21日の記事「トレインチャンネルと愉快な中吊り広告たち」で、JR中央線他で放映されている社内テレビ「トレインチャンネル」における「誰もが認める人気番組」として小栗左多里さんの漫画「ダーリンは外国人」を紹介したが、今週(4月6日~)は放映されなかったように思う。

このまま、打ち切りなのだろうか? coldsweats02

事実や事情は全くわからないが、もしそうであれば、出勤時のわずかな楽しみが消えたようで非常に悲しい。

JR東日本企画さん、どうなんでしょうか sign02  ear

| | コメント (4) | トラックバック (0)

2009年4月 5日 (日)

サクラエディタ 再び

私の1回目の記事でサクラエディタ(その時は sakuraエディタと記載)を紹介したが、使い始めたキッカケだけを書いて、機能については全く紹介していなかった。
今や、サクラエディタは「定番」なので、ヘビーユーザでもない私が紹介するのも少し気が引けるが、私的に「これは便利と思っている機能」を2つ紹介する。
なお、様々なカスタマイズが可能というのがサクラエディタの売りの1つなのだが、この記事の画面サンプル(特に色)や操作例では、私の好みにカスタマイズしている部分があるので、あらかじめお断りしておく。

ちなみに、私は、サクラエディタを、主に短い一時的な文章の作成や簡単なデータ加工などに使用している。(実はこのブログの下書きも サクラエディタ を使用している。)
従って、サクラエディタが最も活きる「プログラムのソースエディタ」としての視点ではないのでご容赦いただきたい。
また、今回の記事を書くにあたって、一応、最新バージョン(Ver 1.6.4.0)としたが、今回紹介する機能は昔から(多分、原作者の「竹パンダ」こと「たけ」さんが管理していた頃から)あった機能と記憶している。

【Grep】
Grep というのは、指定フォルダ以下のファイルの中から、指定文字列を検索する機能である。
例えば、以下の例は、C:\Temp フォルダ以下のテキストファイルから「エディタ」という語を含むファイルを検索している。

Sakura_grep1

その検索結果の例が以下である。
(このケースでは、該当ファイルが1つ、該当箇所が7箇所)

Sakura_grep2

このウィンドウ上で検索結果の行をダブルクリックすると、その該当ファイルが、該当位置にカーソルがセットされた形で サクラエディタ上に開かれる。

あ~ 便利。 happy01

【矩形選択】
テキストエディタの機能として最初にこの機能を考え出した人はスゴイと思う。テキストエディタの枠に囚われて開発していたら、なかなか思いつかない(これは「テキストエディタで実装すべき機能ではない」と逃げてしまう)と思われる代物である。

矩形選択の機能を一言で言うと、エディタ上に表示されている(複数行に跨った)任意の矩形領域を選択できる機能である。サクラエディタでは、Altキーを押しながらマウスドラッグすることで選択する。
選択した後は、通常の文字列選択後の場合と同様に、削除/コピー などが可能である。また、選択後に文字を入力すると、選択していた全ての行に対しその入力が実行される。

以上である。と言っても文章だけではピンとこないと思うので、百聞は一見にしかず、以下に例で説明する。(番号順に操作している。)

サンプルデータとして、Wikipedia の「国際電話番号の一覧」というページから、カリブ海の国の国際電話番号一覧をコピペして持ってきた。これを選んだ意図は全くないが、後の例でもわかるように、矩形選択はこのような固定長データの編集に威力を発揮する。

1.元データ

Sakura_sample1
注)左端の2桁の番号は単なる行番号でデータではない

2.各行の先頭から2桁を矩形選択

Sakura_sample2

3.deleteキーで削除
  → 矩形部分が削除される

Sakura_sample3
注)行番号の色が変わったのは「変更あり」の意味

4.4桁目を矩形選択

Sakura_sample4

5.「,カリブ海,」を入力後、deleteキー
  → 各行の4桁目の空白を「,カリブ海,」に入替え

Sakura_sample5

6.全行の先頭位置を矩形選択後に「,」を入力
  → 各行の先頭に「,」を挿入
「先頭位置を矩形選択」というのは、Altキーを押しながら先頭位置を全行分マウスでドラッグする。
この場合、横方向には1桁も選択していない、すなわち 0桁×N行 の選択なので選択範囲は表示上は見えないが、ちゃんと矩形選択の機能は動作する。

Sakura_sample6_2

7.最後の国部分を矩形選択
  → 改行位置を超えて選択が可能

Sakura_sample7_2

8.Ctrl-X で切り取り後、カーソルを1行目の先頭位置に移動し、Ctrl-V で貼り付け
  → 7で切り取った文字列を、それぞれの行の1桁目に挿入

Sakura_sample8

8の操作について少し補足すると、矩形選択をコピー/切り取った時は、クリップボードには選択文字列が改行コード付きで格納される。
それを貼り付ける場合、(コピー元のサイズが k 桁×N 行、現在のカーソル位置が i 桁 j 行とすると) j 行以降の N 行(すなわち、j ~ (j + N -1) 行)の i 桁目に、コピー元文字列が(挿入されて)貼り付けられる。

なお、余談ではあるが、矩形選択をコピーした場合は、コピー元の文字列と共に、
"MSDEVColumnSelect"形式という「矩形選択」の目印情報も合わせてクリップボードに格納される。
貼り付ける場合、その目印があれば、上記のような特殊な貼り付けを行う仕様になっているようだ。

 
以上である。繰り返しになるが、矩形選択は、固定長データのちょっとした編集に便利であり、(上記の操作の一部は文字列置換でも可能なものはあるが、)それらを簡単で直感的にできるのがメリットである。

では。

| | コメント (0) | トラックバック (0)

« 2009年3月 | トップページ | 2009年5月 »