その他インターネット

エクセル嫌いのための「趣味のエクセル」

数字ぎっしりの表計算ソフト、大事だとわかっていても、敬遠してしまう。そんなエクセルへの敵討ち。エクセルをおもちゃに遊んでしまいましょう。メルマガを見ながら、エクセルにひとつずつ入力していると、意外に可愛いやつになってくるかも。

全て表示する >

「趣味のエクセル」 No.94 2011/5/12 漢字ナンクロツール(5)

2011/05/12

         OOO 今日のお遊び OOO

******** 漢字ナンクロツール(5) *********

★ 前回までにやったこと 

((( カレンダーで遊ぶ )))
(((  スタートリック  )))
((( 暑中見舞にひと工夫 )))「スピードくじ」を作る
((( 暑中見舞にひと工夫 )))気配り案内状を作ってみる
((( 暑中見舞にひと工夫 )))はがき裏表を作成する
((( グラフ機能を使って絵を描く )))グラフで作る幾何学模様
((( グラフ機能を使って絵を描く )))「帆船」を描く
((( ブロックくずしを作る )))一時休止です。しばらくお待ち下さい。
((( ナンバープレースを解く )))
((( 3択トレーナー ショートカットキー・マスター )))
((( 万華鏡もどき )))
((( ユーザー定義の書式を拡げる ))) 選挙啓発ポスター
((( セイムセットを解く )))
((( フエル・カレンダー )))
((( 「日報」作りを楽しむ )))
((( カレンダーの写真を自動変更 )))
((( 漢字ナンクロツール )))
1 漢字ナンクロとは
2 ツールのねらい
(1)盤面の中から、指定された番号の入っているます目をみつけ場所を表示
  する。
(2)その番号の場所に推理する漢字を表示してみる。
(3)推理が正しいと判断した時、その場所に正しい漢字を書き込む。
(4)いったん正しいとしたが、疑問が出た場合、その場所を見つけて表示 
  し、書き直しできるようにする。
3 ツールを動かす
(1)回答シートで問題を解いてみる
(2)回答手順をたどる
4 各シートの説明
(1)「基本データ」シート
(2)「問題」シート、「問題データ」シート
(3)「回答表示」シート
(4)「チェック表」シート

  はじめての方は申し訳ありませんが、バックナンバーを見てたどってみて
 ください。
                        ───→ http://homepage3.nifty.com/hcho/

===================================
         OOO 今回のお遊び OOO

******** 漢字ナンクロツール(5) *********

5 他のシートの説明

 d 「チェック表」シート

  (2)漢字の重複を監視する

    前回、列Cのセルに入っている

    =IF(A1="","",COUNTIF(B:B,B1))

   という式で、重複した漢字を見つけると説明しましたが、正確には、こ
   れはセルC1に入っている式で、セルC2では

    =IF(A1="","",COUNTIF(B:B,B2))

   となります。一般的には、行番号=yとすれば

    =IF(A1="","",COUNTIF(B:B,By))

   という式が列Cの各セルに入っています。

    実際に入っている式は、修正して

   =IF(A1="","",IF(By="■",0,COUNTIF(B:B,By)))

   としています。

    追加した条件「IF(By="■",0」はホワイトナンクロという、より難解
   な問題に対応するものです。

    この修正を含め、いくつかの手直しをしていますので、エクセルファ
   イルを取り込んでおられる方は、サイトからダウンロードしなおしてく
   ださい。

       *ホワイトナンクロは、漢字だけでなく、黒いマスの部分にも
       番号を割り当てて、熟語だけでなく、その熟語の前後の黒マス
       も当てさせる問題です。通常黒マスを割り当てた番号の数が問
       題文の中で明らかにされます。例えば、チェック表の1、25、
       36、41、50を黒マスに当てるようになっているとすると、「黒
       マスは5つです」というように問題に書かれていますので、そ
       の数を「隠れ黒マス」と名づけ、基本データのセルB4に書き込
       み、セルB4に「隠れ黒マスの数」と名前を定義しています。そ
       れが回答シートのセルB11に「=隠れ黒マスの数」という式で反
       映されています。

    ホワイトナンクロでは、黒マスに当たる「■」が複数個はいりますの
   で、それを「重複」として検出してしまうとゲームが進みませんので、
   「■」は無視するようにします。それが、「IF(By="■",0」の意味で
   す。

    隣の列Dには検出した重複セルに通し番号をつける式が入っていま
   す。

    セルD1には、「=IF(B1="","",IF(C1>1,1,""))」(式1)という式で
   すが、それ以下には

   「=IF(By="","",IF(Cy>1,MAX($D$1:D(y-1))+1,""))」(式2)

   という式が入っています。

    標準的には(式2)の方を使います。任意の行について、列Bが空白
   の場合列Dも空白、もし列Cに1より大きい数が入っていれば、列Bの漢
   字は重複なので通し番号の対象になります。

    番号の打ち方は、その行より上にある通し番号の内最大のものに1を
   加えた数字にする、というのが「IF(Cy>1,MAX($D$1:D(y-1)」の意味で
   す。もしはじめて重複行に当たっていれば、それより上は番号が入って
   いませんから、「0+1」つまりここにはじめて「1」が入ることになりま
   す。

    セルD1だけはそれより上の行がありませんから、「もし重複している
   場合は1、それ以外は空白にする」という特別な形(式1)になってい
   ます。

  (3)漢字の重複を警告する

    「回答シート」を開いて「警告」を確認してみます。

    「回答シート」のセルA12には、次の式が入っています。

    =IF(SUM(INDIRECT(検索範囲2))>1,"文字が重複しています!!","")

    ここで「チェック表」シートに新しく設定した「検索範囲2」が使わ
   れています。しかし、ここでセル範囲に名前をつけた理由はその下のセ
   ルA13、A14の方にあります。

    セルA13に入っている式は次の通りです。

   =IF($A$12="","",INDEX(INDIRECT(検索範囲1),MATCH(1,INDIRECT(検索範囲2),0),1))

    そして隣のセルB13には次の式が入っています。

   =IF($A$12="","",INDEX(INDIRECT(検索範囲1),MATCH(1,INDIRECT(検索範囲2),0),2))

    セルA14に入っている式は次のようになっています。

   =IF($A$12="","",INDEX(INDIRECT(検索範囲1),MATCH(2,INDIRECT(検索範囲2),0),1))

    むろん、隣のセルB14にも次の式が入ります。

   =IF($A$12="","",INDEX(INDIRECT(検索範囲1),MATCH(2,INDIRECT(検索範囲2),0),2))


    ここではINDEX関数を使って表の中からデータを取り出して、重複し
   た文字の入っているセルのチェック表の番号(列A)と文字(列B)を表
   示しています。

    INDEX関数は、表の縦横の位置を指定して、そのセルに入っている値
   を取り出す関数で、「=INDEX(セル範囲,行番号,列番号)」の形で使いま
   す。ここで使う「行番号」、「列番号」はエクセルのワークシートの行
   番号・列番号ではなく、検索する表=セル範囲の上から何行目、左から
   何列目かを指しています。

    この4つのセルの式は同じ形式ですので、セルA13の式で検討します。

   =IF($A$12="","",INDEX(INDIRECT(検索範囲1),MATCH(1,INDIRECT(検索範囲2),0),1))

    最初の「IF($A$12="","",」はセルA12が空白であればセルA13も空白
   にするということで、重複が発生しない限りこのコーナーにはなにも表
   示しない仕掛けです。

    もし、重複が発生すると直ちにこのエリアに警告が表示されます。

    警告は、重複した文字の入っているチェック表の番号(列A)とその
   文字(列B)で表示されます。

    INDEX関数は表の中の特定の一つのセルだけしか指定しません。先ほ
   ど書いたように一般形は「=INDEX(セル範囲,行番号,列番号)」です。

     セル範囲=INDIRECT(検索範囲1)
     行番号=MATCH(1,INDIRECT(検索範囲2),0)
     列番号=1

    これがセルA13の本体です。

    「検索範囲1」と言うのは「チェック表」シートのセルI2につけた名
   前で、その実体は「="チェック表!$A$1:$D$"&MAX($A:$A)」という式、
   この問題に当てはめれば「チェック表!$A$1:$D$67」というセル範囲で
   す。

    INDEX関数で表引きするためにはセル範囲を確定する必要があります
   が、漢字ナンクロのチェック表は問題によってチェックする数が変わり
   ます。どんな問題にでも対応できるように、限りなく大きな表にするの
   も一方法ですが、あまり大きくすると無駄な範囲まで検索することにな
   るので、問題のつど、その数に合わせる方法を考えました。

    それが「="チェック表!$A$1:$D$"&MAX($A:$A)」で
   「チェック表!$A$1:$D$67」の「67」の部分を
   「列Aの中で一番大きい数」という形で汎用化したものです。

    しかし、これはただ単に「セル範囲を表現した文字列」に過ぎませ
   ん。この文字列を直接「実際のセル範囲を指示する式」にする関数は、
   エクセルにはありません。

    それを間接的に実現してくれるのが「INDIRECT関数」です。

    「INDIRECT関数」は「INDIRECT(参照文字列,参照形式)」という形で
   使う、他のセルを参照する関数です。参照先のセルに「セルあるいはセ
   ル範囲」を表す文字列が入っていた場合、それを自分の式に取り込んで
   「セルまたはセル範囲」として計算する働きを持っています。

    したがって、式を表す文字列が入っているセルと、それを利用する式
   が入っているセルとは違っていなければなりません。そのために参照さ
   れるセルを「チェック表」シートに、利用する式が入っているセルを
   「回答シート」に分けています。

 今回はここまでとします。

----------------------------------------------------------------------
┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌─┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐
┌┌───────────────────────────────┐┐
 │    「趣味のエクセル」REVIVAL(64)    │
└└───────────────────────────────┘┘
└└└└└└└└└└└└└└└└└─┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘┘
===================================
         OOO 今回のお遊び OOO

***********  万華鏡もどき(5) ************

8 ボタンを使ってマクロを動かす

 a ボタンを表示する

   ツールバー「フォーム」の「ボタン」作成機能を使ってボタンを作り、
  マクロ「万華鏡」と関連付けて、ボタンをクリックすることによってマク
  ロを実行させるようにします。

 (1)メニューバーの「表示」→「ツールバー」→「フォーム」をクリック
   して「フォーム」ツールバーを表示させます。

 (2)ツールバーの中の「ボタン」のアイコンをクリックして、作成モード
   に入ります。

 (3)ワークシート「万華鏡」の列ARのあたりの1〜3行目ぐらいでマウス
   をドラッグし、ボタンを作成します。

 (4)適当な形で指を離すと「マクロの登録」画面が表示されます。

 (5)「マクロ名」のところに「ボタン1_Click」と表示され、下のマクロ
   のリストに「万華鏡」と表示されていますから、「万華鏡」をダブルク
   リックして、「マクロ名」の表示を「万華鏡」に変更します。

 (6)「マクロの保存先」を「作業中のブック」にしてください。(右端の
   ▼を押して出てくるリストの中から選びます)

 (7)下の「OK」ボタンを押して、確定します。

 (8)そのままの状態でボタンの文字を編集できる状態になっていますか
   ら、「ボタン1」の上をドラッグして反転させ「CLICK」と書き込
   み、ワークシートのどこかをクリックします。

 (9)ためしにボタンをクリックしてみてください。

 b マクロでやっていること

 (1)ボタンを押すと表示されていた模様が全部消されます。

    これは「基礎領域をクリアする」のところが実行され、色や四角の表
   示の元になっている数値が消されたため、それを反射している全画面が
   同じように消えてしまった結果です。

 (2)次に色の付いたセルが一つずつ全面に表示されていきます。

    この時は「メイン」と書かれた部分が実行されています。

    ここではまず、乱数を使って「表示の元になる数値=d」と、その
   「数値を格納するセル=p」を決めています。

   ・dは1〜4までの数字です。

    前に決めた書式設定により、dが1ですとセルが青、2だと赤、3だ
   と緑のセルに黄色い「/」の入ったもの、4だとオレンジ色の■が表示
   されます。

   ・Pは1〜30の数字です。

    ボタンの横の表にある数字を読み取って、表示位置を決めています。
    表の左端、列AVの数字が基礎領域にあるセルに付けた番号で、Pはこ
   の番号に当たります。2番目の数字、列AWはそのセルの行番号、3番目    の数字、列AXは列番号です。その後ろは行番号と列番号を組み合わせた
   セル番地を表しています。
    もしPが5であれば、3行目の2列目、つまりセルB3にdを入れるの
   だということになります。

    いちいちセルまで見に行くのは面倒ですから、「初期設定』の

     For i = 1 To 30
         pn(i) = Cells(i, 48)
         pr(i) = Cells(i, 49)
         pc(i) = Cells(i, 50)
     Next i 

   のところで、マクロで使う変数に読み込ませてそれを使うようにしてい
   ます。

    pn がセルの番号、pr がセルの行番号、pc がセルの列番号です。
   ( )の中には1〜30の番号が入ります。セル番号はこれで表されます
   から、本当は pn のデータは場所の無駄遣いです。

   ( )のついた変数を配列変数といいます。同じ名前の変数に番号をつ
   けてひとまとめにし、扱いやすくするものです。
    例えばprに番号をつけると、具体的には
    pr(1)、pr(2)、pr(3)・・・pr(30)というふう表現されています。そ
   れを一般的には pr(p) というような形で使い、d=5であれば
   pr(5) のことになります。

    セルの値を読み込んだ段階でそれぞれ次のようになっています。

    pr(1)=1、pc(1)=1
    pr(2)=2、pc(2)=1
    pr(3)=2、pc(3)=2
    pr(4)=3、pc(4)=1    
    pr(5)=3、pc(5)=2
    pr(6)=3、pc(6)=3
       ・
       ・
       ・
       ・
    pr(30)=10、pc(30)=1

    もし、乱数を実行した結果

    d=1、p=5

   となった場合、行番号pr(5)・・3(3行目)
          列番号pc(5)・・2(2列目=B列)
   が使われ、セルB3に1が書き込まれて、セルB3は赤く表示されます。

       r = pr(p)
       c = pc(p)
       Cells(r, c).Value = d

   のところがその動作です。

   ・埋める数値は16個以下です。「メイン」ルーチンの

    For i = 1 To 16
      ・
      ・
    Next i   

   が、そのための命令で、同じことを16回やりますが、もしPに同じ数
   が出れば、その位置の数字を書き換えるだけですので、実際に埋められ
   るセルはその分減ってくる計算になります。

   ・念のために万華鏡マクロを再掲します。

'−−−−−ここから

Sub 万華鏡()

'初期設定
Dim pn(30), pr(30), pc(30) As Integer

Worksheets("万華鏡").Activate

For i = 1 To 30
    pn(i) = Cells(i, 48)
    pr(i) = Cells(i, 49)
    pc(i) = Cells(i, 50)
Next i

'基礎領域をクリアする
For i = 1 To 30
    Cells(pr(i), pc(i)).Value = 0
Next i

'メイン
Randomize

For i = 1 To 16
    d = Int(Rnd() * 4) + 1
    p = Int(Rnd() * 30) + 1
    r = pr(p)
    c = pc(p)
    Cells(r, c).Value = d
Next i

End Sub

'−−−−−ここまで

9 万華鏡で遊ぶ

  ボタンをクリックすると、模様が書き換えられます。本物の万華鏡を回し
 て模様を替えるのにあたります。

  クリックを連続して数回行いますと、コンピュータはその回数分自動的に
 書き換えをします。実験では50回以上は自動化できました。ぼんやりと次
 々変る模様を眺めることができます。

 「万華鏡もどき」はここまでとします。

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
===================================

編集後記:最後までおつきあい下さりありがとうございます。

前回、ニュージーランドの地震のことに触れました。日本人の犠牲者がまだ半
分も確定しないうちに、今度は東日本大震災が発生しました。

巨大地震によって引き起こされた大津波が、人々が営々として築いてきた街や
農地、住宅、工場、そして道路や橋をみるみる呑み込んでいく光景を隠すこと
なく映し出すテレビの画面を見て、声を出すこともできませんでした。

それに引き続いて知らされた東電福島第一原発の事故は、さらに大きな衝撃で
した。

昨年12月にお送りした92号で、原子力発電は私たちが引く継ぐべき技術で
はないと書きました。

この時点では、現在稼動している原子力発電の装置の安全性は信頼に足りるも
のだという前提に立っていました。

しかし想定を超えた強い地震と高津波のために、準備していた安全対策は全く
働きませんでした。5重の安全対策のどれがどう働かなかったのか、その一つ
一つについて細かい検証は今後徹底的に行われなければならないでしょう。単
純に津波さえ防げれば解決というわけには行かないでしょう。

地震によって発生した不安全状態と津波によって発生した不安全状態とは厳密
に区別する必要があります。一切をひっくるめて東電や政府対応を責めても何
の解決にもなりません。

原子力発電を否定している私がこんなことを言うのはおかしいと思われるかも
わかりませんが、もし今一切の原発を止めても、安全に廃棄できる状態になる
には、燃料の放射性物質や放射性廃棄物は、数ヶ月あるいは数年のあいだ現在
地に留め置いて監視しなければなりません。実際に廃棄処分するにはさらに
長い年月が必要になります。

そのあいだに、また想定外の天変地異が起これば、放射能の危険がまた勃発し
ます。ですから、廃止するにも安全対策の強化は不可欠なのです。

今回の事故を受けて、性急に原発全面停止の声も上がっています。しかし代替
エネルギーの問題も片付いていませんし、CO2の25%削減目標の方針も固
まっていません。現存する原発の活用は避けることはできません。

廃止を目標に現存設備を安全に存続するという矛盾を解決することが要求され
ています。

===================================

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2005-07-19  
最終発行日:  
発行周期:不定期  
Score!: - 点   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。