2015/04/07

MySQL For ExcelがExcelシート保存時にマクロ警告を出す

このエントリーをはてなブックマークに追加
Excelシートの保存時にマクロ警告が出る。
マクロなんて使った覚えはない。便利なソフトが台無しだ。
警告内容は、こんな感じ。

次の機能はマクロなしのブックに保存できません
・定義名で保存されている excel 4.0 関数
これらの機能が含まれるファイルを保存する場合は、[いいえ]をクリックし、[ファイルの種類]ボックスでマクロ有効ファイルの種類を選択してください。
マクロなしのブックとして保存する場合は、[はい]をクリックしてください。

先にいうと、アドインとしてMySQL For Excelが動いてた。
そういえば、MySQLをインストールしたな、と。MySQL For Excelがどういう悪さをしていたのかは知りませんが、これをアンインストールしたら現象が解消されました。
なお、うちのExcelはExcel2010です。

原因調査

マクロなんてそもそも使ってない。
「定義名で保存されている~」という意味がそもそも解らなかったので、そこから調べるはめになる。「定義名で保存されている excel 4.0 関数」というメッセージで検索すると、当然マクロ関係の話や名前の定義にたどり着く。身に覚えのない人は、そこからなかなか先に進めないわけです。
名前の定義やマクロなんか使ってないシートの話なので、謎は深まるばかり。
知らないうちにショーカットが機能しちゃったのだろうか。

名前の定義について

名前の定義とは、セルの範囲に名前を付けて解りやすくしておく機能。範囲選択を自分でつけた名前を利用することで、無機質なセルの整理整頓をしやすくしておけるというもの。

【名前の定義】セル範囲に名前をつける
http://kokoro.kir.jp/excel/name.html

でも自分はそんな機能まったく使っていなかった。

※Excel2010の名前の管理は、「数式」タブ→「定義された名前/名前の管理」から確認できます。

シートの問題ではない気がする

仕方ないので、手当たり次第にいろいろ試してみる。
  1. シートをコピーして新規シートにペーストしても同じ警告メッセージ。新規保存のときには出ないけど、開いて上書き保存するときに出るようだ。
  2. 計算も何もないリストアップしただけのシートですら、開いて、即保存で、同じメッセージが出る。
これはおかしい! シートの問題じゃないだろう。
ひょっとして、ウイルスか?と頭をよぎる。冷や汗…。Excelシートに感染するとか、そういうあれか?

MySQL for Excelのアドインがあやしい

オプションを調べていると、MySQL for Excelがアドインに追加されていた。

※「ファイル」タブ→「オプション」→「アドイン」で拡張機能が確認できます。

そういえば、昨日MySQLサーバーをインストールしたので、そのとき一緒にインストールされていた。
いかにもあやしい。どういうツールなのか調べてみるけれど、この先もMySQL for Excelを使うことはない気がする。
試しに消してみる。

アプリケーションの削除から、さくっとアンインストール。

そしてあっさり解消

あっさり、解消。いやあ、よかったよかった。
ガサツな解決方法だけど目をつむりましょう。

完全にMySQL For Excelを犯人扱いしてしまっているけれど、うちのマシンが特異環境かもしれないので、そのあたりはご留意お願いします。
双方の顔を立てるような解決策はないものか、もう少し掘り下げてもよかったかもしれない。けれど申し訳ないけれど元の環境に戻してあれこれするほど興味が沸きそうにない(どちらかというと一刻も早く忘れたいと思ってこの記事を書いている)ので、この辺で〆。

ありがとうございました。

2015/04/03

[C#]全角数字/アルファベットを半角に変換する

このエントリーをはてなブックマークに追加
全角の数字、全角のアルファベットを半角に変換したいなー、と思った。
全角英数はもっさりしてて読みにくい。
なんか、いかにも一発でできるメソッドが用意されてそうなのだけどないらしい。
なので自力でコードを書きました。

全角数字、全角アルファベットを半角にする


変換テーブルを作って自作することにします。
がっつり組んで、がりがり動かしているだけなので、種も仕掛けもありません。

書いたのは、見本となるテキストの文字を走査して、変換テーブルと照らし合わせて置換していくというコードです。
もしくは、変換テーブルのほうを走査してReplaceしていくようなコードも書けそうです。今回は1文字づつの走査でいいので前者のほうが効率よさそうですね。

使う文章
※たまたま拾ってきたニュース記事です。他意はありません。
一方、日本で「VAIO Phone」が正式に発表された際、パナソニックのスマホ「ELUGA U2」と「ロゴが違うだけではないか」、「ELUGA U2のコピーに近いにもかかわらず、価格はELUGA U2より高い」などと批判の声があがったことを伝えた。
「VAIO Phone」の販売出だしつまづく・・・「惨敗としか表現できない」=中国
http://headlines.yahoo.co.jp/hl?a=20150402-00000179-scn-sci

ソースコード
string text =
    "一方、日本で「VAIO Phone」が正式に発表された際、" +
    "パナソニックのスマホ「ELUGA U2」と「ロゴが違うだけ" +
    "ではないか」、「ELUGA U2のコピーに近いにもかかわら" +
    "ず、価格はELUGA U2より高い」などと批判の声があがっ" +
    "たことを伝えた。";

// 変換テーブルをつくる
Dictionary conv = new Dictionary() {
    {'1','1'},{'2','2'},{'3','3'},{'4','4'},{'5','5'},
    {'6','6'},{'7','7'},{'8','8'},{'9','9'},{'0','0'},
    {'A','A'},{'B','B'},{'C','C'},{'D','D'},{'E','E'},
    {'F','F'},{'G','G'},{'H','H'},{'I','I'},{'J','J'},
    {'K','K'},{'L','L'},{'M','M'},{'N','N'},{'O','O'},
    {'P','P'},{'Q','Q'},{'R','R'},{'S','S'},{'T','T'},
    {'U','U'},{'V','V'},{'W','W'},{'X','X'},{'Y','Y'},
    {'Z','Z'},
    {'a','a'},{'b','b'},{'c','c'},{'d','d'},{'e','e'},
    {'f','f'},{'g','g'},{'h','h'},{'i','i'},{'j','j'},
    {'k','k'},{'l','l'},{'m','m'},{'n','n'},{'o','o'},
    {'p','p'},{'q','q'},{'r','r'},{'s','s'},{'t','t'},
    {'u','u'},{'v','v'},{'w','w'},{'x','x'},{'y','y'},
    {'z','z'},
    {' ',' '},
};

string s = new string( text.Select( n => (conv.ContainsKey(n) ? conv[n] : n )).ToArray() );

Console.WriteLine(s); // 出力結果を表示

出力結果
一方、日本で「VAIO Phone」が正式に発表された際、パナソニックのスマホ「ELUGA U2」と「ロゴが違うだけではないか」、「ELUGA U2のコピーに近いにもかかわらず、価格はELUGA U2より高い」などと批判の声があがったことを伝えた。

いいじゃん! そんでVAIO Phoneがなんですって?
ニュースのネタの内容についてはあんまりわかりませんが、ずいぶんと読みすくなったね。

string s = new string( text.Select( n => (conv.ContainsKey(n) ? conv[n] : n )).ToArray() );
結局、主要コードはこの1行なので、ざっと。
  1. Selectでtextを一文字づつ走査。
  2. conv.ContainsKey(n) ? conv[n] : n で変換テーブルに該当したのを返す。
  3. ToArray()でchar[]にして、new string(char[])でstringが返ります。

置換対象は全角数字と全角アルファベット(大文字/小文字)、あと全角スペースの計63文字(10+26+26+1)としています。
全角スペースについては、先頭に来るやつは新しい段落としての意味があるので単純置換はまずいですね。

ConvStrを使って変換するやりかた


文字列を全角/半角に変換するには?(VB.NET関数活用)
http://www.atmarkit.co.jp/fdotnet/dotnettips/265vbhanzen/vbhanzen.html

Strings.StrConvでは、全角カタカナも半角カタカナになってしまうようで、なんていうか、やりすぎなのです。
半角カタカナなんて使う場面はもうないのです。

Strings.StrConvを使うには、Microsoft.VisualBasicの参照が必要です。

ソースコード
// using Microsoft.VisualBasic;

string text =
    "一方、日本で「VAIO Phone」が正式に発表された際、" +
    "パナソニックのスマホ「ELUGA U2」と「ロゴが違うだけ" +
    "ではないか」、「ELUGA U2のコピーに近いにもかかわら" +
    "ず、価格はELUGA U2より高い」などと批判の声があがっ" +
    "たことを伝えた。";

string s = Strings.StrConv(text, VbStrConv.Narrow, 0);

Console.WriteLine(s);

出力結果
一方、日本で「VAIO Phone」が正式に発表された際、パナソニックのスマホ「ELUGA U2」と「ロゴが違うだけではないか」、「ELUGA U2のコピーに近いにもかかわらず、価格はELUGA U2より高い」などと批判の声があがったことを伝えた。

パナソニックのスマホて。なんか、すごいおちょぼ口な感じ。

正規表現を使ったやりかた


正規表現を使ったやりかたもあります。
すべてにStrings.StrConvするのではなくて、該当文字だけがStrings.StrConvの恩恵を受ければいいじゃないかという考え方ですね。

全角英数字のみを半角に変換するには?[C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/1051anhankaku/anhankaku.html

おしまいですー。