2015年8月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

最近のトラックバック

最近買った本(Amazon.co.jp)

広告(Amazon.co.jp)

広告(Google AdSense)

無料ブログはココログ

« 2011年8月 | トップページ | 2011年10月 »

2011年9月の記事

2011年9月25日 (日)

Excel/VBA入門: 英数字を半角に変換し、半角カナを全角に変換する。

以前、某所に掲載したものの改良版です。

ワークシートに入力された文字列について、英数字や片仮名のように半角(1Byte)と全角(2Byte)の文字が存在するものをどちらか一方に統一したいということが良くある。この場合、VBAのStrConv関数を使用して全てのセルの文字列を一括変換すれば良い。

str = StrConv(str, vbNarrow) ' 文字列を半角(1Byte)に変換する。
str = StrConv(str, vbWide)   ' 文字列を全角(2Byte)に変換する。

しかし、英数字は半角に統一したいが、「いわゆる半角カナ」などと呼ばれ過去に多くの問題を引き起こしてきた半角カナ(0xA1-0xCF)だけは全角に変換したいという場合、StrConvなどの既存の関数では一度に変換できないため、少し工夫が必要となる。

というわけで、英数字を半角に変換し、半角カナを全角に変換するプロ-シージャーを作成してみた。

Sub ToHankakuWithoutKatakana()
    '
    ' 現在のワークシートの値が入力されている全てのセルについて、
    ' 半角変換可能な全角文字を全て半角に変換する。
    ' ただし、半角カナ(0xA1-0xCF)については全角に変換する。
    ' また、可能であればカナ文字と直後の濁点・半濁点が合成される。
    '
    ' 2011/09/25 hichon: 新規作成。
    '
    Dim re As Object
    Dim Cell As Range
    Dim Str As String
    Dim Match As Object

    '
    ' 正規表現オブジェクトを作成する。
    ' 1文字以上の半角カナ(0xA1-0xCF)を検索対象とする。
    '
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "[。-゚]+"
    re.Global = True

    '
    ' 値が入力されている全てのセルについて、変換処理を実行する。
    ' 尚、値が入力されているセルが存在しない場合、エラーとなる。
    '
    On Error GoTo Error
    For Each Cell In Cells.SpecialCells(xlCellTypeConstants, xlTextValues)

        Str = Cell.Value
        If Str <> "" Then

            '
            ' 半角変換可能な文字を半角に変換する。
            ' 全角カナもいったん半角カナに変換される。
            '
            Str = StrConv(Str, vbNarrow)

            '
            ' 半角カナを全角に変換する。
            ' 半角カナの直後に濁点・半濁点があればここで合成される。
            '
            For Each Match In re.Execute(Str)
                Str = Replace(Str, Match, StrConv(Match, vbWide), , 1)
            Next
            Cell.Value = Str

        End If
 
    Next

    Exit Sub

Error:
    MsgBox Err.Description

End Sub

2011年9月23日 (金)

昨日はTechLIONに参加してきた。

昨日(9/22)はUSP友の会主催のTechLION vol.3というイベントに参加してきた。
というわけで簡単なレポートでも上げようと思ったが、もたもたしているうちに本家に詳しいレポートが上がってたので詳しくはこちらを参照してください。

とりあえず、会場で前から気になったっていたUSP Magazineが売られていたので新刊とバックナンバーを入手。ついでに一緒に売られていたとシェルスクリプトシンプルレシピ54(amazon.co.jp)という本も入手してきた。
Techlion_books_20110923

因みに表紙の動物のイラストは「ちんじゅうちゃん」というマスコットらしい。

2011年9月19日 (月)

Eclipse入門: 日本語APIドキュメントをローカル環境、及び、ホバー表示で使用する。

はじめに

以前「Android入門: Androidの開発環境を作成する。(Linux/Windows対応版)」という記事で、日本語化プラグインPleiadesを使用してEclipseを日本語化する方法を説明した。PleiadesではEclipseのメニューやダイアログ、及び、エディタ上でJavaの標準APIのクラスやメソッドにカーソルを合わせてShift+F2を押下したときに表示されるドキュメントが日本語化される。

しかし、このドキュメントについてはインターネット上にあるJDKの日本語APIドキュメントを参照しているため、インターネットに接続していない環境では表示できない。また、エディタ上でJavaの標準APIのクラスやメソッドにマウスカーソルを合わせるとそれらの説明がホバー表示されるが、取得元のJDKのソースコードのコメントが英語で記述されているため、表示される説明も英語のままとなる。

そこで今回は、日本語APIドキュメントをローカルから参照する方法、及び、ホバー表示を日本語化する方法について説明する。

使用環境

  • Windows 7 Professional SP1

  • Ubuntu 11.04 Desktop 日本語Remix

  • JDK 6 update 27

  • Eclipse 3.7 Indigo + Pleiades 1.3.3

日本語APIドキュメントのインストール

日本語APIドキュメントをローカル環境にインストールする方法を説明する。インターネット上の日本語APIドキュメントについては、OracleのJavaのドキュメントページから[API]をクリックするとバージョンと言語ごとにドキュメントをまとめたページに遷移するので、例えば、[JDK Programmer Guides/6]の[Japanese]をクリックすれば、JDK 6の日本語APIドキュメントが参照できる。EclipseにPleiadesをインストールするとJavadocの参照先が英語版からこちらの日本語版に変更される。尚、現時点ではJDK 7の日本語APIドキュメントは準備されていない。

ダウンロード

日本語APIドキュメントをローカル環境で使用するには、これらのファイルをまとめてダウンロードする必要がある。しかし、Javaのダウンロードページから[Java SE 6 Documentation]の[Download]をクリックしドキュメントのダウンロードページに遷移しても英語版のアーカイブしか見当たらない。

というわけで、OracleとSunのサイトをあちこち探してみたが、以前は用意されていた日本語APIドキュメントのアーカイブが何処にも見当たらない。それらしいリンクをクリックしても英語版のページに飛ばされるだけである。どうやらサイトがリニューアルされたさいに行方不明になってしまったようだ。

いろいろ検索した結果、2chのプログラム板のJavaスレッドの書き込みから何とか無事にアーカイブを入手することができた。44さんありがとう!!因みにファイル名は以下の通りである。また、以降ファイルをダウンロードしたディレクトリを<download_dir>とする。

jdk-6u21-docs-ja.zip

また、複数バージョンのJDKをインストールして使い分けている場合、そのバージョンにあった日本語APIドキュメントのアーカイブが必要となる。updateのバージョンが異なる程度では殆ど問題ないが、メジャーバージョンが異なるとAPIの構成も異なるため問題が発生する。

2011/10/02追記:上記スレッドは過去ログ倉庫に落ちてしまったので、以下に該当部分を転載する。

http://hibari.2ch.net/test/read.cgi/tech/1312958339/41-44
42 名前:デフォルトの名無しさん[] 投稿日:2011/08/14(日) 11:26:57.48
Java6 の Javadoc 日本語ってダウンロードできなくなったの?
ja のリンクや言語の選択すらできん

43 名前:デフォルトの名無しさん[sage] 投稿日:2011/08/14(日) 11:38:29.02
所詮はオラクルがやることだからな

44 名前:デフォルトの名無しさん[sage] 投稿日:2011/08/14(日) 13:58:54.51
Oracleは正直よくわからん。
http://bit.ly/p8j9OL
jdk-6u21-docs-ja.zip

インストール

特にインストーラーなどは用意されていないので、ダウンロードしたアーカイブを対応するVersionの<java_home>にコピー、及び、展開する。尚、以降JDKがインストールされたディレクトリを<java_home>とする。

Linuxの場合

  1. アーカイブを<java_home>にコピーする。

    $ sudo cp <download_dir>/jdk-6u21-docs-ja.zip /opt/jdk1.6.0_27/
  2. unzipを使用してアーカイブを<java_home>の下に展開する。

    $ cd /opt/jdk1.6.0_27/
    $ sudo unzip jdk-6u21-docs-ja.zip

Windowsの場合

  1. 管理所特権でコマンドプロンプトを起動する。

    ツールバーの[スタート] ボタンをクリックする。→[検索] ボックスに「コマンド」と入力する。→結果一覧で [コマンド プロンプト] を右クリックし、[管理者として実行] を選択する。

  2. アーカイブを<java_home>にコピーする。

    > copy <download_dir>/jdk-6u21-docs-ja.zip "C:\Program Files\Java\jdk1.6.0_27\"
  3. 7-zipなどのファイルアーカイバを使用してアーカイブを<java_home>の下に展開する。

    > c:
    > cd "\Program Files\Java\jdk1.6.0_27"
    > "C:\Program Files\7-Zip\7z.exe" x jdk-6u21-docs-ja.zip

MergeDocのインストール

MergeDocはJDKのソースコードと日本語APIドキュメントをマージするツールである。MergeDocを使用してソースコードのコメントを日本語化すれば、標準APIのホバー表示だけでなくソースコードを参照したときのコメントも日本語化されることになる。

尚、MorgeDocのダウンロードページには「Eclipse 3.2 以降ではホバー表示は API ドキュメント HTML ソースから取得できるようになったため、ホバー表示のみを使用する場合は、MergeDoc は不要です。」とあるが、現状のEclipseではホバー表示の内容はソースコード→APIドキュメントの順番に検索されるため、ソースコードの参照とホーバー表示の日本語化を両立させるにはやはりMergedocが必要となる。

ダウンロード

MergeDocは日本語化プラグインのPleiadesと同じMergeDoc Projectのサイトで配布されている。MergeDoc Projectのトップページから左側のメニューの[MergeDoc / Javadoc 日本語化]をクリックするとMorgeDocのダウンロードページに遷移するので、「ダウンロード」から「MergeDoc本体」の最新版である[Version 2.1.4]をダウンロードする。尚、アーカイブのファイル名は以下の通り。また、以降ファイルをダウンロードしたディレクトリを<download_dir>とする。

mergedoc.zip

インストール

特にインストーラーなどは用意されていないので、ダウンロードしたアーカイブを適当なディレクトリに展開する。

Linuxの場合

ホームディレクトリの下にディレクトリmergedocを作成し、unzipを使用してアーカイブをその中に展開する。

$ cd
$ mkdir mergedoc
$ cd mergedoc
$ unzip <download_dir>/mergedoc.zip

Windowsの場合

C:\optの下にディレクトリmergedocを作成し、7-zipなどのファイルアーカイバを使用してアーカイブをその中に展開する。

> c:
> cd \opt
> mkdir mergedoc
> cd mergedoc
> "C:\Program Files\7-Zip\7z.exe" x <download_dir>\mergedoc.zip

Mergedocの使用方法

Mergedocを使用してJDKのソースコードと日本語APIドキュメントをマージする方法を説明する。

起動方法

MergedocはJavaアプリケーションのため、javaコマンドを使用して起動する。尚、-serverオプションを付けると処理が高速になるらしい。

Linuxの場合

$ cd ~/mergedoc
$ java -server -jar mergedoc.jar

Windowsの場合

> c:
> cd \opt\mergedoc
> java -server -jar mergedoc.jar

操作方法

Mergedocの操作方法について説明する。

  1. Mergedocが起動したら「基本設定」の以下の項目に値を設定する。

    • APIドキュメントディレクトリ

      日本語APIドキュメントを格納しているディレクトリを設定する。具体的にはpackage-listファイルがあるディレクトリとなる。また、エンコーディングの設定は「EUC-JP」とする。

    • 入力ソースアーカイブファイル

      Javaのソースコードのアーカイブを設定する。また、元のソースコードにはASCII以外の文字は含まれていないのでエンコーディングの設定は意味がないが、とりあえず「UTF-8」とする。

    • 出力ソースアーカイブファイル

      マージしたソースコードを出力する新規のアーカイブファイルを設定する。また、エンコーディングの設定は「UTF-8」とする。

    Linuxの場合

    以降<user_home>はユーザーのホームディレクトリとする。

    APIドキュメントディレクトリ /opt/jdk1.6.0_27/docs/ja/api EUC-JP
    入力ソースアーカイブファイル /opt/jdk1.6.0_27/src.zip UTF-8
    出力ソースアーカイブファイル <user_home>/src_ja_utf8.zip UTF-8

    Windowsの場合

    APIドキュメントディレクトリ C:\Program Files\Java\jdk1.6.0_27\docs\ja\api EUC-JP
    入力ソースアーカイブファイル C:\Program Files\Java\jdk1.6.0_27\src.zip UTF-8
    出力ソースアーカイブファイル C:\opt\src_ja_utf8.zip UTF-8

    また、「詳細設定」はデフォルトのままどの項目もチェックなしとする。

  2. [実行]ボタンを押下して、マージ処理を開始する。途中コンソールに以下のような警告がいくつか表示されるが、無視しても特に問題ないようだ。

    WARN  Comment - <コード名> 行数調整不可のためマージ出来ませんでした。
    WARN  JavaBuffer - Javadoc コメントの後のシグネチャを取得できませんでした。
  3. マージが終了したら、[終了]ボタンを押下してアプリケーションを終了する。

マージしたソースコードのインストール

マージしたソースコードのアーカイブを<java_home>に移動する。

Linuxの場合

  • アーカイブを<java_home>に移動する。

    $ sudo mv <user_home>/src_ja_utf8.zip /opt/jdk1.6.0_27/

Windowsの場合

  1. 管理所特権でコマンドプロンプトを起動する。

    ツールバーの[スタート] ボタンをクリックする。→[検索] ボックスに「コマンド」と入力する。→結果一覧で [コマンド プロンプト] を右クリックし、[管理者として実行] を選択する。

  2. アーカイブを<java_home>に移動する。

    > move C:\opt\src_ja_utf8.zip "C:\Program Files\Java\jdk1.6.0_27\"

Eclipseの設定

インストールした日本語APIドキュメント、及び、マージしたソースコードのアーカイブをEclipseから使用する方法について説明する。

ドキュメントの参照先の変更

Eclipseの設定で、以下のJREシステム・ライブラリーの「Javadoc ロケーション」、及び、「ソース添付」項目をローカル環境の日本語APIドキュメント、及び、マージしたソースコードのアーカイブに変更する。

  • <java_home>/jre/lib/resources.jar

  • <java_home>/jre/lib/rt.jar

  • <java_home>/jre/lib/jsse.jar

  • <java_home>/jre/lib/jce.jar

  • <java_home>/jre/lib/charsets.jar

また、複数バージョンのJDKをインストールして使い分けている場合、JDK毎に同様の設定が必要となる。

  1. Eclipseのウィンドウメニューから[設定]を選択する。

  2. 設定ダイアログで、左側の一覧の[Java]を展開し、[インストール済の JRE]を選択する。

  3. 「インストール済のJRE」の一覧から「jdk1.6.0_27」を選択し、[編集]ボタンを押下する。

  4. JREの編集ダイアログで、「JREの編集JREシステム・ライブラリー」から「<java_home>/jre/lib/resources.jar」を選択し、[javadoc ロケーション]ボタンを押下する。

    Javadocダイアログが表示される。デフォルトでは「Javadoc URL (例 ~)」ラジオボタンが選択され、「Javadoc ローケーション・パス」にインターネット上の日本語APIドキュメントのURLが設定されている。

    Javadoc ローケーション・パス http://java.sun.com/javase/ja/6/docs/ja/api/
  5. Javadocダイアログで、「アーカイブ内の Javadoc」ラジオボタンを選択し、「アーカイブ・パス」にローカル環境の日本語APIドキュメントのアーカイブのパス、「アーカイブファイル内のパス」に「docs/ja/api」を設定する。

    Linuxの場合

    アーカイブ・パス /opt/jdk1.6.0_27/jdk-6u21-docs-ja.zip
    アーカイブファイル内のパス docs/ja/api

    Windowsの場合

    アーカイブ・パス C:\Program Files\Java\jdk1.6.0_27\jdk-6u21-docs-ja.zip
    アーカイブファイル内のパス docs/ja/api
  6. [検証]ボタンを押下して以下の確認ダイアログが表示されることを確認する。

    Javadocの参照方法ロケーションの検証中
    [!] ロケーションは有効のようです。ファイル'package-list'および'index.html'が検出されました。

    ただし、Windowsでは以下の警告ダイアログが表示される。

    Javadocの参照方法ロケーションの検証中
    [!] Javadoc ロケーションは検証できません。

    どうやらEclipceの現バージョンではパスに空白が入っていると検証に失敗してしまうようだ。しかし、動作に問題は無いのでこのまま設定する。

  7. [OK]ボタンを押下して、Javadocダイアログをクローズする。

  8. JREの編集ダイアログで、「JREの編集JREシステム・ライブラリー」から「<パス名>/rt.jar」を選択し、[ソース添付]ボタンを押下する。

    ソース添付構成ダイアログが表示される。デフォルトでは「ローケーション・パス」に<java_home>の下のソースコードのアーカイブのパスが設定されている。

    Linuxの場合

    ローケーション・パス /opt/jdk1.6.0_27/src.zip

    Windowsの場合

    ローケーション・パス C:/Program Files/Java/jdk1.6.0_27/src.zip
  9. ソース添付構成ダイアログで、「アーカイブ・パス」にマージしたソースコードのアーカイブのパスを設定する。

    Linuxの場合

    ローケーション・パス /opt/jdk1.6.0_27/src_ja_utf8.zip

    Windowsの場合

    ローケーション・パス C:/Program Files/Java/jdk1.6.0_27/src_ja_utf8.zip
  10. [OK]ボタンを押下して、ソース添付構成ダイアログをクローズする。

  11. JREの編集ダイアログに戻るので、以下のライブラリの「Javadoc ロケーション」、及び、「ソース添付」も同様に変更する。

    rt.jar,jsse.jar,jce.jar,charsets.jar

  12. [完了]ボタンを押下して、JREの編集ダイアログをクローズする。

  13. [OK]ボタンを押下して、設定ダイアログをクローズする。

動作確認

設定が終わったら適当なソースに「String s;」と記述して、カーソルを合わせてShift+F2を押下する。内部Webブラウザーにドキュメントが表示されたら画面を右クリックしてプロパティを選択する。プロパティの「アドレス(URL)」が以下のようにローカル環境のアーカイブになっていれば、「Javadoc ロケーション」の設定は正しく行われている。

http://127.0.0.1:<ポート番号>/help/nftopic/jar:file:<java_home>/jdk-6u21-docs-ja.zip!/docs/ja/api/java/lang/String.html

また、「String s;」にマウスカーソルを合わせると表示されるホバー表示、及び、Ctrl+左クリックで表示されるソースコードのコメントが日本語化されていれば、「ソース添付」の設定は正しく行われている。

以上

2011/10/02、日本語APIドキュメントのダウンロードに追記した。

2011年9月 1日 (木)

Excel入門: CSVファイルをダブルクリックで開いたとき、数値の先頭の0が削除されないようにする。(増補版)

はじめに

ExcelではCSVファイルをダブルクリックで開いたとき、各列の表示形式が一律に標準となる。そのためデータが数字列の場合、自動的に数値に変換されて読み込まれる。通常ではこれで問題ないが、0011のように先頭に0が付いたデータの場合、先頭の0が削除されてしまう。同様に1-2-1、1/2/2ようにハイフン、または、スラッシュで区切られた数字が日付に変換される、1:2:3のようにコロンで区切られた数字が時間に変換される、全角数字が半角に変換されるなどの問題がある。

期待した結果

001,002,003           → |001     |002     |003     |
1-2-1,1/2/2,1:2:3     → |1-2-1   |1/2/2   |1:2:3   |
121,122,123  → |121  |122  |123  |

実際の結果

001,002,003           → |       1|       2|       3|
1-2-1,1/2/2,1:2:3     → |2001/2/1|2001/2/2| 1:02:03|
121,122,123  → |     121|     122|     123|

回避方法としては、先にExcelを起動して、ファイルメニューの開くから(Excel 2007以前の場合)、または、データメニューのテキストファイルから(Excel 2010の場合)ファイルを読み込み、テキストファイルウイザードで各列に表示形式を指定する方法が一般的だが、これをダブルクリックしか知らない相手に一から説明するのはなかなか面倒である。

この件については、以前某所に回避方法を書いたことがあったが、今回追加の調査を行ったので増補版としてあらためてまとめてみた。

回避方法の考察

とにかくデータを文字列として認識させれば良いということで、ダブルクォーテーションで括ってみる。→だめである。読み込み時にダブルクォーテーションが削除されてしまうので同じ結果になってしまう。

"001","002","003"           → |       1|       2|       3|
"1-2-1","1/2/2","1:2:3"     → |2001/2/1|2001/2/2| 1:02:03|
"121","122","123"  → |     121|     122|     123|

では、データの先頭に文字列をあらわすシングルクォーテーションを付けてみる。→文字列として読み込まれるが、シングルクォーテーションが表示されたままとなる。セルを一個一個確定し直せば意図した結果になるが…。

'001,'002,'003           → |'001    |'002    |'003    |
'1-2-1,'1/2/2,'1:2:3     → |'1-2-1  |'1/2/2  |'1:2:3  |
'121,'122,'123  → |'121 |'122 |'123 |

回避方法

データをダブルクォーテーションで括った上で先頭にイコールを付けて数式にしてしまう。こうすると読み込み時にダブルクォーテーションが削除されないので文字列として表示される。しかし、このCSVファイルをExcel以外のアプリケーションで読み込むと当然問題が発生する。

="001",="002",="003"           → |001     |002     |003     |
="1-2-1",="1/2/2",="1:2:3"     → |1-2-1   |1/2/2   |1:2:3   |
="121",="122",="123"  → |121  |122  |123  |

データの先頭にタブ文字を付ける(以下の<tab>は実際にはタブ文字)。こちらの方がスマートで良い。しかも、タブ文字は空白文字の一つなのでExcel以外のアプリケーションでも問題が発生しにくそうである。

<tab>001,<tab>002,<tab>003           → |001     |002     |003     |
<tab>1-2-1,<tab>1/2/2,<tab>1:2:3     → |1-2-1   |1/2/2   |1:2:3   |
<tab>121,<tab>122,<tab>123  → |121  |122  |123  |

同様にデータの末尾にタブ文字を付けても良い。むしろこちらの方が問題が発生しにくいかも。

001<tab>,002<tab>,003<tab>           → |001     |002     |003     |
1-2-1<tab>,1/2/2<tab>,1:2:3<tab>     → |1-2-1   |1/2/2   |1:2:3   |
121<tab>,122<tab>,123<tab>  → |121  |122  |123  |

Excelでのタブ文字の扱い

データにタブ文字を付ける方法でCSVファイルを読み込んだ場合、タブ文字は読み込み時に削除されたわけではなく、読み込まれたデータにしっかり付加されている。実際にセルのデータにカーソルを立て、矢印キーで移動すると横幅0の文字があることが分かる。以下のようにLEN()関数でデータの文字数を表示すると一文字分多く表示される。

A B:数式 B:表示
1 001 =LEN(A1) 4
2 1-2-1 =LEN(A2) 6
3 121 =LEN(A3) 4

しかも、このタブ文字は前後の空白文字を削除するTRIM()関数では削除できない。

A B:数式 B:表示
1 001 =LEN(TRIM(A1)) 4
2 1-2-1 =LEN(TRIM(A2)) 6
3 121 =LEN(TRIM(A3)) 4

タブ文字を削除するにはSUBSTITUTE()関数を使用する。尚、Excelではタブ文字を直接入力する方法がないので代わりにCHAR(9)を使用する。

A B:数式 B:表示
1 001 =LEN(SUBSTITUTE(A1,CHAR(9),"")) 3
2 1-2-1 =LEN(SUBSTITUTE(A1,CHAR(9),"")) 5
3 121 =LEN(SUBSTITUTE(A1,CHAR(9),"")) 3

以上

2011/09/02 記事のカテゴリーを変更した。

« 2011年8月 | トップページ | 2011年10月 »