2010年5月30日日曜日

第147回目、指定した場所に色を塗る

○第147回目、指定した場所に色を塗る

 指定されたセルを色を付けるというマクロですが、それほどたいしたものではないという感じはします。あると便利という程度のものかもしれません。

 通常の操作で色をつけるにはどのような操作になるでしょうか。
 1.範囲を指定する。
 2.Ctrl+1でセル書式のダイアログを出す。
 3.色のタブを選ぶ。
 4.カラーパレットから色を指定する(ここでは単純な指定とします=カラーコードで指定)。
 違う場所にも同じ色を付ける場合は、他の書式が同じであれば、書式のみのコピーとなります。
 一般的には、同じ操作を繰り返すということでしょう。
 ニーズがどのくらいかるのかということになりますが、よかったら作ってみてくださいという程度の紹介とします。

 色コードと色の対応は?
=⇒1-56のカラーコード"、または"カラーパレットのインデックス番号"色
  for i = 0 to 6
   for j = 0 to 7
    Cells(4 + i , 3 + j )= i * 8 + j + 1
    Cells(4 + i , 3 + j ).Interior.ColorIndex = i * 8 + j + 1
   next
  next
 を動かしてセルに付いた色をみてください。

 なんだこういう仕組みだったのか
=⇒そのとおりです。ほとんど操作マクロでできてしまいます。

 これでは面白くないので、
 1.連続処理にする(色は直前に指定したものを引き継ぐとします)
 2.色をとるという機能を入れる
 3.既に色が付いているセルには、新たな色をつけない、という選択ができる

 マクロの構造はdoループとします。
 終了は、セルの範囲指定の段階で、ESCキーとか終了キーを押した場合とします。
 色をとる場合は、色コードを指定する際に0を入力します。
 色が付いているセルをそのままにする場合は、色コードの指定の時に、コードに*をつけることで区分します。

 マクロのポイントは、
 
 1.二回目以降のセル範囲の指定
 Dim セル範囲 As Range
 On Error GoTo ErrorTrap

'色を付たいセル範囲の設定
 Set セル範囲 = Application.InputBox(Prompt:=msg02 & "セル範囲を指定してください", Default:=in_rrcc1, Left:=2, Top:=2, Type:=8)
  in_rrcc1 = セル範囲.Address
 If errflag = 99 Then Exit Do 'ESCキーを押すとエラーになりループを抜ける
 Range(in_rrcc1).Select

ErrorTrap:
 errflag = 99
 Resume Next

2.指定した色に*が付いているか
 iro = InputBox("色コードを指定してください", , iro)
 p1 = InStr(iro, "*")
 If p1 <> 0 Then

3.色をとる
   Cells(gyo1 + i - 1, retu1 + j - 1).Interior.ColorIndex = xlColorIndexNone

4.色情報の指定と色を付ける(色が付いているセルには新たに色をつけない場合)
  Range(in_rrcc2).Select
  iro = InputBox("色コードを指定してください", , iro)
  For Each CCC In Selection 'cells()を使わないで、指定範囲内のセルひとつずつ処理する方法
   iro0 = CCC.Interior.ColorIndex
   If iro0 = -4142 Or iro = 0 Then '-4142はセルに色が付いていないという意味
    CCC.Interior.ColorIndex = iro
   End If
  Next
 こんなものでしょうか。

 参考までに、系列別の色コードを掲げて置きます。
 
 "黄色系=⇒19-36-27-6"
 "水色系=⇒20-37-33-42-28-8"
 "ダイダイ系=⇒40-44-45-22-46-3"
 "桃色系=⇒38-26-7"
 "紫系=⇒24-17-39"
 "緑系=⇒43-4-50-10-14-31"
 "こげ茶系=⇒9-18-53-54-30"
 "濃い紫系=⇒13-29-21-12"
 "濃い灰色系=⇒15-48-16"
 "群青系=⇒41-23-32-5-55"

2010年5月23日日曜日

第146回目 加重平均計算式からの応用

○第146回目 加重平均計算式からの応用

 前回で「加重平均の計算式」を作りました。それを使っていたのですが、あとで件数の合計はどうなっているのかを知る必要が出てきました。どうしたらスムーズにつくれるのか。
 これがテーマとなります。
 簡単なのは、計算式を移植して、そこから分母だけ取り出してしまうというものです。一個作ればあとはコピーで複製できます。

 もともと、加重平均の計算式を作る際に、合計の件数もセルに入れておくんじゃないの?
=⇒それもそのとおりですね。加重平均値の計算式を入れたあとで、分母を入れる場所を指定して、そこに合計の件数の計算式を入れるということを、今のマクロに追加しましょう。
 これは、これまでのものの簡単な機能アップですので、皆さんでやってください。
 合計の件数(分母の値)を求めるかをきいて、求める場合はそのセルを指定するということでいいのではないでしょうか。

 さて、ここでは、ある計算式から、分母を取り出すことを考えてみます。
 当然、割り算があるということが前提です。
 通常は、/の直後の()の内部が求めるものではないでしょうか。
=⇒/が複数あったらどうするか=⇒一番後ろにあるもののみ対象とする。
=⇒/の直後に(がなかったらどうするか=⇒その後の,(カンマ)の直前までとする。カンマもなければ処理しない。
 という前提条件にしてしまい、100%ではない簡単なマクロとしましょう。
 
 これの応用としては、#DIV/0!回避のマクロが考えられます。分母がゼロにもかかわらず、割算をしてしまったというものです。計算式から分母を取り出して、if文を作り、ゼロで割ることを回避するものです。
 イメージとしては、
 =B11/B12 =⇒ =IF(B12<> 0,B11/B12,0) とするものです。
 このケースもよくあります。計算式を修正するのが面倒くさいので、結構最後までも残ってしまいます(当然手持ち資料ベース)。
 
 もう一つ。
 
 前の回に戻るのですが、値と件数の位置関係がまったく同じという場合は、二組以降は値のみの指定でよくなりますね。このように操作を簡素化したものを作るのもいいかもしれません。
 多くの場合は、二つの項目の位置関係が同じだと言えるのではないでしょうか。
 これは、一般的な場合は適用できないので、非一般系、又は、特殊系の加重平均という名をつけてもいいでしょう。
 (特殊相対性理論…加速度を考慮しない特殊な場合の理論。加速度を考慮したものは一般相対性理論となる。これから"特殊系"と名づけてみました)

2010年5月8日土曜日

第145回目 加重平均計算式の作成

○第145回目 加重平均計算式の作成

 あちこちに散らばっている件数、値(平均値)の加重平均をとりたいというニーズがあります。
 通常の操作では、値×件数をどんどん足していって、最後に括弧でくくり、合計の件数でわる、ということになります。分母の件数も足していく必要があります。
 散らばり度合いが大きいと面倒くさくなってしまいますね。また、分母の件数をもう一度指定しなければならないというのも、面倒さが増します。
 このような計算式を手軽に作ろうという発想です。
 手順
 0.計算式を作りたいセルにおいてマクロを実行します
 1.第一の組の場所にいって、値と件数を指定します。指定は値と件数という順番にします。
 2.次の場所にいって、同様に指定します。これを必要だけ繰り返します。最大組数は6組としました。
 3.指定終了の場合は、加重平均の計算式を作り、最初のセルに入れます。
 これはこれまでの、マクロをベースにすれば簡単です。

 機能をもう少し明確にしましょう。
 1.別のシートでのセルを指定できるようにします。(余裕があれば別ブックまで拡張してください)
 2.計算結果は、四捨五入して、端数は指定できるようにします。
 3.別シートに飛ぶ場合は、今のシートのセルと同じ場所に飛ぶか、それとも、単純に飛ぶかの指定ができます。
 4.同一の組の値と件数は、同じ一シートにあるものとします。

 注意点としては、
 1.各組ごとにシート名を取得しますが、計算式のあるセルと同じシートの場合は、シート名はなくすこと。
 2.取得したセル座標から$をとる。(これを基にコピーする時に、$は邪魔になります)
 3.デバック中は、計算式に何かの記号をつけて文字化しておいてください。
 4.理由はよくわからないのですが、シート名を'で囲むことが必要な場合があり混乱しました。
  計算式を、keisansikiに入れて、
 Range(AAA1) = keisansikiとすると、シート名を'で囲まなくても大丈夫です。
 Range(AAA1).Formula = keisansikiとすると、シート名に工夫(ある場合に限り、'で囲む)が必要です。

 このマクロは、使用するセルが、どのシートでも同じ場所にあるときは非常に便利です。

2010年5月3日月曜日

第144回目 ユーザー関数(条件付SUMPRO関数、その3)

○第144回目 ユーザー関数(条件付SUMPRO関数、その3)

 パラメータ='D20,A42,A20,42,B20,C21のコピーの問題です。
 これをコピーしたら、計算式のように座標が変わってほしいということです。
 考えてみましたら、これはそれほど難しくないのです。既存のマクロで何とかなります。
 その前にパラメータの項目を修正しておきます。
 パラメータ=/D19,D20,A20,42,B20,C21として
 E19にこのパラメータを入れておきます。
 関数式を入れるのは、D21にします。
 D19,D20の数値を入れ替えることによって、答えが任意に求められることになります。
 パラメータと関数式が、D19:E21の中に収まることになります。 
 このセットをコピーしていきます。

 参照する表がかわらないとすると、パラメータの中で動くのは、D19、D20の二つになります。
 そこでパラメータそのものを、/D19,D20,$A$20,42,$B$20,$C$21 とします。(パラメータをこう変えると、関数式の中に、頭の/を取る処理を加えればよろしいです)
 
 1.まず、パラメータを、複数項目の置換えで、/を=、,を+にし、次のようにします。
 =D19+D20+$A$20+42+$B$20+$C$21
 2.関数式を含めたセットを任意の場所にコピーします。そうすれば座標が動きます。
 3.次に全体を指定して、複数項目の置き換えをし、元の姿に戻します。 = は/、+は,に置換えです。

 置換え文字 
  ┏━━┳━━┳━━┓
  ┃,  ┃+  ┃  ┃
  ┣━━╋━━╋━━┫
  ┃/  ┃=  ┃/  ┃
  ┣━━╋━━╋━━┫
  ┃  ┃+  ┃,  ┃
  ┗━━┻━━┻━━┛
 と3列3行に置換文字を入れておけば便利でしょう。
 最初の置換えは、先頭の2行2列を指定し、最後の置換えは、2行2列目から3行3列目を指定します。(計算式なので計算式の要件を満たしていなければ、=絡みの置換えが無効となる)