I hate MICROSOFT

私が憎んでいるマイクロソフト社製品の便利小技集
悪い事は言わない、今すぐMS社製品をアンインストールしなさい

論理式

2006-05-19 11:19:40 | I hate MS Excel

もう既に散々使ってますが、Excelの関数で、
動作を期待しない条件判断は論理式をそのまま書けば良い。

どういう事かというと、

| |A| B |
| 1| 0|TRUE | <- =IF(A1=0, TRUE, FALSE)
| 2| 1|FALSE | <- =IF(A2=0, TRUE, FALSE)
| 3| 2|FALSE | <- =IF(A3=0, TRUE, FALSE)
| 4| 0|TRUE | <- =A4=0
| 5| 4|FALSE | <- =A5=0
| 6| 5|FALSE | <- =A6=0
| 7| 6|FALSE | <- =A7=0
| 8| |FALSE | <- =AND(B1:B7)


という具合に「真」か「偽」がわかりさえすればいいという場合、
=IF(A1=0, TRUE, FALSE) ではなく、
=A1=0          でよいという事だ。

B列は論理式なのでIF関数やAND関数やOR関数の条件式としてそのまま使える。
7行目はその例。B1からB7まで全て「真」ならば「真」となる。

代入文と混同しそうなところがさすがMSだ。

「まと」は「える」のか「いる」のか

2006-05-18 17:41:23 | 日本語

「まとをえる」って漢字でどう書く?
と聞かれて、困ってしまった。
「的を得る」としか浮かばなかったからだ。
しかし「的」を「得」るってどういう状態を言うのだろう。
誤用の香りがする。

自分も「まとをえたはつげん、ありがとうございます」なんて言うんだけどね。

ちょっと調べた。

「ひとりごと」2005.01.18 「的を得る? 」
このページは「綾波レイの幸せ」
というちょっと妖しいサイト(失礼)にあるのですが、
いちばんわかりやすかったので紹介させていただきます。
私的にはこのサイト、好きです。

結論だけ引用させていただきますと、
「的を得る」は「的を射る」の誤用。
「正鵠を失う」から「正鵠(まと)を得る」が生まれた。
という事ですので、

「まとをえる」と声に出して言うのはあながち間違いとはいえないらしい。

それはそうと、トラックバックした途端に消滅したキャバ嬢のブログに引き続き、
今度はホスト兄貴だ。水商売の営業も大変らしい。せいぜい消滅しない事を祈る。

「いかしかたない」 は正しいのか

2006-05-18 17:19:17 | 日本語

「いかしかたない」は正しい日本語であろうか?
「烏賊仕方ない」ではない。当たり前だ。
だが、並みの辞書には載っていない。

「いたしかたない」の 誤りであろうか?

> いたしかた 0 【致し方】 : する方法。しかた。「―ございません」
(大辞林 提供:三省堂)

「致し方ない」は正しい使い方のようだ。

> 如何しようも無・い:
> 1 ほかにどうすることもできない。それ以外に方策がない。
>   「ここまできたら、もう―・い」
>
> 2 手段を尽くしても見込みがない。救いがたい。「―・い欠陥」
(大辞泉 提供:JapanKnowledge)

から類推して

「如何仕方ない」も一応正しい日本語だといえそうだ。

「如何とも仕難い」とか
「御機嫌如何」の仲間だったのね。

英文字・数字・数字・数字のデータだけ抽出したい。

2006-05-17 20:42:29 | I hate MS Excel

文字数4、英文字、数字、数字、数字で構成される商品コードを抽出したい。
どうしたらいいべ。

| |   A   |    B    |
| 1|商品コード  |品名       |
| 2|4902102055314 |Emblem Black   |
| 3|T800     |ターミネーター  |
| 4|MR-GU2A13BK  |Multi Card Reader |
| 5|GP03     |GALS Paradise   |
| 6|Z112     |カスタムレンズシート レッド |
| 7|Z12L     |エンブレムサイン     |

セル「C2」に関数
=AND(LEN(A2)=4,"A"<=LEFT(A2,1),LEFT(A2,1)<="Z",
"0"<=MID(A2,2,1),MID(A2,2,1)<="9",
"0"<=MID(A2,3,1),MID(A2,3,1)<="9",
"0"<=MID(A2,4,1),MID(A2,4,1)<="9")
を入れて「C7」までコピー。

| |   A   |    B    | C |
| 1|商品コード  |品名       |   |
| 2|4902102055314 |Emblem Black   |FALSE |
| 3|T800     |ターミネーター  |TRUE |
| 4|MR-GU2A13BK  |Multi Card Reader |FALSE |
| 5|GP03     |GALS Paradise   |FALSE |
| 6|Z112     |カスタムレンズシート レッド |TRUE |
| 7|Z12L     |エンブレムサイン     |FALSE |

正規表現が使えればいいのだがねぇ。
地道にやるしかないでしょう。

別解1
C2 : =LEN(A2)=4                 4文字か?
D2 : =AND("A"<=LEFT(A2,1),LEFT(A2,1)<="Z")   英文字か?
E2 : =AND("0"<=MID(A2,2,1),MID(A2,2,1)<="9")  数字か?
F2 : =AND("0"<=MID(A2,3,1),MID(A2,3,1)<="9")  数字か?
G2 : =AND("0"<=MID(A2,4,1),MID(A2,4,1)<="9")  数字か?
H2 : =AND(C2, D2, E2, F2, G2)          全てが「真」ならば「真」
「C2」から「H2」を
「C7」から「H7」までコピー

別解2
IF関数の入れ子。面倒だから書かない。
多分動かない。私の記憶が確かならば、
関数の入れ子は確か7階層までだから。

数字3文字の検査を
AND("000"<=MID(A2,2,3),MID(A2,2,3)<="999")
とやってはいけない。
7行目"12L"も引っかかって「TRUE」となってしまうぞ。

手を抜いてはいけない。

もっとエレガントな方法、募集中。
考えてみなさい。

追伸:
こんな事はExcelでは処理しない。
csvでsaveして、(たとえばtest.csv)

#!/usr/local/bin/ruby
require "jcode"
$KCODE = "S"

while gets
  if $_ =~ /^Dd{3},/
    print
  end
end

てなrubyスクリプトに通せば

$ ruby test.rb < test.csv
T800,ターミネーター
Z112,カスタムレンズシート レッド

$ ruby test.rb < test.csv > ans.csv
で抽出したans.csvが得られる。

65536行などというけちな上限もない。

それはそうと「キャバ嬢」のブログにトラックバックされた模様。
削除しようと思ったが、面白いので放っておこう。
おじさん好きらしい。「くそおやじ」に反応したか?

と思ったら一日もしないうちに消滅。
がんばって生きてね。

ウイリーを排除しろ再び

2006-05-17 19:02:23 | I hate MS Excel

こんなデータがある。重複しない人数を数えたい。
どうする?

| |  A   |
| 1|相武 紗季 |
| 2|ウィリー  |
| 3|桜井 幸子 |
| 4|麻生 久美子|
| 5|上戸 彩  |
| 6|ウィリー  |
| 7|山口 智子 |
| 8|ウィリー  |
| 9|ウィリー  |
|10|桃井 かおり|

セルB1に関数
=COUNTIF($A$1:A1,A1)

これをB2からB10までコピー

セルB11に関数
=SUMIF(B1:B10,1)

| |  A   |B|
| 1|相武 紗季 | 1| <-- =COUNTIF($A$1:A1,A1)
| 2|ウィリー  | 1| <-- =COUNTIF($A$1:A2,A2)
| 3|桜井 幸子 | 1| <-- =COUNTIF($A$1:A3,A3)
| 4|麻生 久美子| 1| <-- =COUNTIF($A$1:A4,A4)
| 5|上戸 彩  | 1| <-- =COUNTIF($A$1:A5,A5)
| 6|ウィリー  | 2| <-- =COUNTIF($A$1:A6,A6)
| 7|山口 智子 | 1| <-- =COUNTIF($A$1:A7,A7)
| 8|ウィリー  | 3| <-- =COUNTIF($A$1:A8,A8)
| 9|ウィリー  | 4| <-- =COUNTIF($A$1:A9,A9)
|10|桃井 かおり| 1| <-- =COUNTIF($A$1:A10,A10)
|11|      | 7| <-- =SUMIF(B1:B10,1)   ほらね

何でこうなるかは、各自考えるように。

味噌は
=COUNTIF($A$1:A1,A1)
の絶対指定($A$1)と相対指定(A1)の混合指定にあります。

これをコピーすると、絶対指定は変化せず、
相対指定はコピーした分変移してゆくのです。

因みに、関数の中で
相対指定A1を選択(青反転)して、「F4」キーを押すと、
A1 -> $A$1 -> A$1 -> $A1 と変化します。
私も知りませんでした。
会社の渡邉さんに教わりました。


括弧を連打してOutlook 2000 の送信スレッドを凍らせろ

2006-05-17 14:32:31 | I hate MS Outlook
さすがに現行版ではない(と思いたい)が、
昔懐かしいOutlook2000には
「括弧を連打したメールは送信できない」
というバグが存在した(時期がある)。

よく見られるのが
署名の装飾に
「「「「「「「「「「「・・・・・ こんなのとか
{{{{{{{{{{{・・・・・ こんなのとか
《《《《《《《《《《《・・・・・ こんなのとか
使う奴。おまえだ。

送信時に括弧の対応のチェックをするらしく、
そのまま帰ってこなくなるのだ。

どうせ
括弧対応チェックルーチンをリカーシブに呼び出して
スタックエリアを使い果たしてるか何かだと思うが、
CPU100%握ったままいつまでたっても帰ってこない。

送信者が勝手に作った署名でそうなるなら、
「自業自得だ。ば~か」で済まされるが、
正常に受信したメールを、(受信は出来ちゃうんだこれが)
転送しようとして黙りこんだりすると、
ちょっと悩ましい。

私が管理しているPCの中に未だに
WindowsNT & Outlook2000 マシンが存在するので、
この現象には一年に数回お目にかかる。

困ったもんだ。

括弧連打した奴も、
「きれいな署名が出来た」
と悦に入ってるあたりが始末が悪い。

I love Mozilla

2006-05-11 20:07:22 | I hate MS-IE
私は Mozilla を愛しています。

Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.3)
             Gecko/20060426 Firefox/1.5.0.3
Mozilla Thunderbird/1.5.0.2
をインストールした。

元々 Netscape ユーザだったが、例のごたごたで使用を中止。
インターネットバンキングが出来ない事が決定打となった経緯がある。
以後、不承不承MS-IEを使う事を余儀なくされていたわけである。

Netscapeのまっとうな嗣子であるMozillaは
何度か使ってみたが色々不満があって常用には至らなかった。

久々に、RSS周りの実装状況確認のため、インストール。
これがどうして、なかなか良い。
RSSの実装も好感が持てる。
バンキングもちゃんと動くぞ。
常用に値するアプリケーションソフトである。

ただし、「digital西行庵」の縦表示は MS-IEの変態仕様を利用している為
表示不能。他の手を考えねば。これはしょうがない。



I hate MS-IE 7.0 Beta2 RSS feed 対応

2006-05-09 21:11:48 | I hate MS-IE
マイ・ホームページ
I hate MS-IE 7.0 Beta2 の RSS feed 検出に対応する。

まずは、index.htmlと同階層に rss.xmlを作成。
私はテキストエディタでがりがり書く。


<?xml version="1.0" ?>
<rss version="2.0">
<channel>
    <title>digital西行庵</title>
    <link>http://www.saigyo.org/</link>
    <description>saigyo database</description>
    <language>ja-JP</language>
    <copyright>Copyright 2000-2006, digital西行庵
</copyright>
    <managingEditor>***@saigyo.org ( Hiroaki Nitobe
)</managingEditor>
    <webMaster>***@saigyo.org ( Hiroaki Nitobe
)</webMaster>
    <pubDate>Mon, 24 Apr 2006 09:00
+0900</pubDate>
    <lastBuildDate>Mon, 24 Apr 2006 09:00
+0900</lastBuildDate>
    <generator>EmEditor Standard Ver.5.00 手入力
</generator>
<item>
    <title>仏説観普賢菩薩行法経</title>
    <link>http://www.saigyo.org/cgi-bin/cr.rb.cgi?fuge
n-txt</link>
    <description>仏説観普賢菩薩行法経 如是我聞一時仏
在</description>
    <guid>http://www.saigyo.org/cgi-bin/cr.rb.cgi?fuke
n-txt</guid>
    <pubDate>Sat, 6 May 2006 16:20
+0900</pubDate>
</item>
<item>
    <title>無量義経</title>
    <link>http://www.saigyo.org/cgi-bin/cr.rb.cgi?mury
ogi-txt</link>
    <description>無量義経 徳行品第一 如是我聞一時仏
在王舍城</description>
    <guid>http://www.saigyo.org/cgi-bin/cr.rb.cgi?mury
ogi-txt</guid>
    <pubDate>Wed, 3 May 2006 13:20
+0900</pubDate>
</item>
</channel>
</rss>


んでもって、index.htmlの head エレメントに link エレメントを追加する。
これもテキストエディタでがりがり書く。

<head>
    <TITLE>digital西行庵</TITLE>
    なんたらかんたら
    <META HTTP-EQUIV="Content-type" CONTENT="text/html;
charset=Shift_JIS">
    なんたらかんたら

    <link rel="alternate" type="application/rss+xml"
title="digital西行庵" href=http://www.saigyo.org/rss.xml>

</head>

なんちゃってRSSの出来上がり。
おらおらI hate MS-IE7.0でfeedの自動検出してくれるでしょう。

丸めいろいろ Round関数

2006-05-02 12:22:49 | I hate MS Excel
どうよこれ。
って何が・・・って感じですよね。
マクロでVBAを使う人以外は関係ありませんが・・・。

| |A |B |C |
| 1|0.5| 1| 0|
| 2|1.5| 2| 2|
| 3|2.5| 3| 2|
| 4|3.5| 4| 4|
| 5|4.5| 5| 4|
| 6|5.5| 6| 6|
| 7|6.5| 7| 6|
| 8|7.5| 8| 8|
| 9|8.5| 9| 8|
|10|9.5|10|10|
|11| 50|55|50|<---=SUM(*1:*10)


A列は数値 B列はExcelのROUND関数の値 C列はVBAのROUND関数の値。
B列数式 : =ROUND(A*, 0)
C列数式 : =MyRound(A*, 0)

Function MyRound(n, d)
  MyRound = round(n, d)
End Function

計算結果が違うでしょう。

そう。プログラムによって関数の返す値が違うんですよ。

ExcelのROUND関数=算術丸め:皆さんが学校で習った奴。
VBAのROUND関数 =銀行丸め:結果が偶数になるように丸め処理。
MS-ACCESS等はVBAのROUND関数の様です。

この他にもランダム丸め、オルタネート丸め等が存在しますが
MSは実装していないのでここでは触れません。
それぞれ .5 の処理が違います。
境界値の処理の問題ですな。
残業代は算術丸めで計算すべきでしょう。あ、俺残業代ないわ。

せめてどれかに統一して欲しかったな。マイクロソフトさん。

これ以上詳しい事は各自学習するように。
もっと詳しく知りたい向学心旺盛な方はこちらへどうぞ。

[OFFXP]VBAのRound関数について

丸めを行うカスタム プロシージャを実装する方法

ババァには気をつけろ * と ? と ~ (ワイルドカードとそのエスケープキャラクタ)

2006-05-01 14:28:36 | I hate MS Excel
例によってこんなデータがある。

| |A|  B  |
|1|1|* 紗季 |
|2|2|* 幸子 |
|3|3|* 久美子|
|4|4|* 彩  |

あとで置換を使って「*」を「新渡戸」に変えようという魂胆だ。

ではでは。BをクリックしてB列を選択。
編集/置換 
「検索する文字列」を「*」とし
「置換後の文字列」を「新渡戸」とする。
「すべて置換」をポチッとな。

| |A| B  |
|1|1|新渡戸|
|2|2|新渡戸|
|3|3|新渡戸|
|4|4|新渡戸|

あん?何だこりゃ。
原因は「*」がワイルドカードとして機能しているかららしい。
「?」一文字ワイルドカードも同様の問題を抱えているらしい。

打開策は?・・・「~」チルダ・・・なんだそうな。
ワイルドカードをエスケープするんだそうな。
聞いた事ねぇ~。
どれどれ。BをクリックしてB列を選択。
編集/置換 
「検索する文字列」を「~*」とし
「置換後の文字列」を「新渡戸」とする。
「すべて置換」をポチッとな。

| |A|   B    |
|1|1|新渡戸 紗季 |
|2|2|新渡戸 幸子 |
|3|3|新渡戸 久美子|
|4|4|新渡戸 彩  |

お馬鹿だね。マイクロソフト。