I hate MICROSOFT

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

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

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 マシンが存在するので、
この現象には一年に数回お目にかかる。

困ったもんだ。

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