MW211 EXIT

devlog
ExcelVBA/条件付き書式(2)
2013年11月14日
特定の文字が入力された瞬間に色を塗って強調してしまう条件付き書式を
選択したセル全てに追加するマクロ。

「×」と「△」の場合のみ、赤背景白抜文字になる。
┌──────────────────────────────────────┐
│Sub 入力色塗()                                                              │
│    Dim cellAddr As String                                                  │
│    Dim r As Range                                                          │
│    For Each r In Selection                                                 │
│        With r                                                              │
│            cellAddr = .Address(columnabsolute:=False, rowabsolute:=False)  │
│            .FormatConditions.Add Type:=xlExpression, _                     │
│                Formula1:="=OR(" & cellAddr & "=""×""," _                  │
│                            & cellAddr & "=""△"")"                         │
│            .FormatConditions(.FormatConditions.Count).SetFirstPriority     │
│            With .FormatConditions(1)                                       │
│                .Interior.Color = RGB(255, 0, 0)                            │
│                .Font.Color = RGB(255, 255, 255)                            │
│            End With                                                        │
│        End With                                                            │
│    Next                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘

Excel関数の条件式で「×」とかを出力させるのと組み合わせるといいかも。
分類:ExcelVBA
ExcelVBA/条件付き書式(1)
2013年11月12日
マクロで条件付き書式を追加してしまおうとい企画。

まずは、選択範囲の重複を塗ってしまうマクロ。
┌──────────────────────────────────────┐
│Sub 重複検出()                                                              │
│    With Selection                                                          │
│        .FormatConditions.AddUniqueValues                           '重複版 │
│        .FormatConditions(.FormatConditions.Count).SetFirstPriority '最優先 │
│        With .FormatConditions(1)                                           │
│            .DupeUnique = xlDuplicate                                       │
│            .Interior.Color = RGB(255, 0, 0)                                │
│            .Font.Color = RGB(255, 255, 255)                                │
│        End With                                                            │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
先頭に条件を追加していくので、
同じセルに対して何回も行うと条件がいっぱい追加されるから注意。

なお、すべて一回消してしまう場合には以下のような感じとなる。
┌──────────────────────────────────────┐
│    With Selection                                                          │
│        .FormatConditions.Delete                                            │
│    End With                                                                │
└──────────────────────────────────────┘
当然、既存のものも消されてしまうので注意。
分類:ExcelVBA
ExcelVBA/入力イベント
2013年11月11日
「ThisWorkbook」にて以下のソースを記述。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
├──────────────────────────────────────┤
│Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) │
│    MsgBox "シート名=" & Sh.Name & "(" & Sh.CodeName & ")" & vbLf _         │
│        & "横=" & Target.Column & vbLf _                                    │
│        & "縦=" & Target.Row                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
入力したセルの情報が取得できる。

シート名と座標で条件分岐すれば、
特定のセルでの入力に対して動作することができる。
分類:ExcelVBA
MySQL/ひとつだけ
2013年11月09日
所有者が一つだけしたデータを持てない状況の場合。

これから所有者を更新しようとする場合、既に所有者が他に持っていたら
NULLを更新するという条件付きのUPDATE文を考えた。

案1:COUNTして条件分岐する
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = (CASE (SELECT COUNT(*)                                     │
│                            FROM (SELECT * FROM 表) AS 一時表               │
│                            WHERE 所有者 = 値)                              │
│                    WHEN 0 THEN 値                                          │
│                    ELSE        NULL                                        │
│                  END)                                                      │
│    WHERE キー = キー値;                                                    │
└──────────────────────────────────────┘

案2:NOT EXISTSを使う
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = (SELECT 値                                                 │
│                      FROM DUAL                                             │
│                      WHERE NOT EXISTS (                                    │
│                                SELECT *                                    │
│                                    FROM (SELECT * FROM 表) AS 一時表       │
│                                    WHERE 所有者 = 値))                     │
│    WHERE キー = キー値;                                                    │
└──────────────────────────────────────┘
分類:MySQL
MySQL/更新対象表はサブクエリに使えない
2013年11月08日
INSERT文やUPDATE文で更新する対象の表を、サブクエリで使うとエラーとなる。
┌──────────────────────────────────────┐
│#1093 - You can't specify target table 表 for update in FROM clause         │
└──────────────────────────────────────┘

例えば、「キー」と「所有者」の列からなる表について、
「所有者」が他に所有していない場合のみ、更新できるように条件文を
以下のように付加したとしたら、エラーとなってしまうわけだ。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = 2                                                          │
│    WHERE キー = 1                                                          │
│      AND NOT EXISTS (SELECT *                                              │
│                          FROM 表                                           │
│                          WHERE 所有者 = 2);                                │
└──────────────────────────────────────┘

これの回避方法は一時表を使うこと。以下のような感じ。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = 2                                                          │
│    WHERE キー = 1                                                          │
│      AND NOT EXISTS (SELECT *                                              │
│                          FROM (SELECT * FROM 表) AS 一時表                 │
│                          WHERE 所有者 = 2);                                │
└──────────────────────────────────────┘

循環参照となるので、コピーを一つ用意するような感じだ。
分類:MySQL
PHP/浮動小数点数を経由しないで
2013年11月05日
浮動小数点数を経由しないで整数を1/100する関数。
┌──────────────────────────────────────┐
│private function waru($in) {                                                │
│    $in = preg_replace('/\..*$/', '', $in);                                 │
│    if (preg_match('/^\-/', $in)) {                                         │
│        $in = substr($in, 1);                                               │
│        $in = '0000' . $in;                                                 │
│        return sprintf('-%d.%02d', substr($in, 0, -2),                      │
│                                   substr($in, -2));                        │
│    } else {                                                                │
│        $in = '0000' . $in;                                                 │
│        return sprintf('%d.%02d', substr($in, 0, -2),                       │
│                                  substr($in, -2));                         │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘

浮動小数点数を経由しないで小数を100倍する関数。
┌──────────────────────────────────────┐
│private function kakeru($in) {                                              │
│    return intval(str_replace('.',                                          │
│                              '',                                           │
│                              preg_replace('/(?<=\..{2}).*$/',              │
│                                           '',                              │
│                                           $in)));                          │
│}                                                                           │
└──────────────────────────────────────┘

いずれも文字列で処理している。
分類:PHP
正規表現/先頭のみ末尾のみ
2013年11月04日
「abba」という文字列で先頭の「b」もしくは、末尾の「b」のみを検索する正規表現。
┌────┬─────────────────────────────────┐
│先頭のみ│(?<=^[^b]*)b                                                      │
├────┼─────────────────────────────────┤
│末尾のみ│b(?=[^b]*$)                                                       │
└────┴─────────────────────────────────┘

ちなみに逆にそれらを除いた場合。
┌────┬─────────────────────────────────┐
│先頭以外│(?<!^[^b]*)b                                                      │
├────┼─────────────────────────────────┤
│末尾以外│b(?![^b]*$)                                                       │
└────┴─────────────────────────────────┘

ついでに応用で、一つしかない場合のみヒットさせるのはこれ。
┌────┬─────────────────────────────────┐
│唯一    │(?<=^[^b]*)b(?=[^b]*$)                                            │
└────┴─────────────────────────────────┘

【注意】
  preg系では「(?<=.*)」のような可変のものは認められないので
  エラーとなる模様。
分類:正規表現
PHP/浮動小数点型とフォーマット指定子
2013年11月03日
「sprintf('%.f')」で浮動小数点型を表示する場合、
こまかく表示しすぎると誤差がでてしまう。
┌──────────────────────────────────────┐
│sprintf('%.17f', 0.7);                                 →0.69999999999999996│
└──────────────────────────────────────┘

でも、端数を四捨五入してくれるらしいので、
ある程度まで粒度を下げると、正しい値になってくれる。
┌──────────────────────────────────────┐
│sprintf('%.16f', 0.7);                                 →0.7000000000000000 │
└──────────────────────────────────────┘
こいつが、端数切捨てで「0.699…」だったら大変だ。

ちょっと気になったのでついでに。
┌──────────────────────────────────────┐
│sprintf('%.f'  , 0.7);                                 →0.700000           │
└──────────────────────────────────────┘

なお、ちなみに「%.F」(こちらはfloat型、「%.f」はdouble型)も同じ結果。
分類:PHP
PHP/iniファイルの記述ミス
2013年11月02日
┌─────────────────────────────────[xxxx.ini]┐
│[WEB]                                                                       │
│ROOT=/root                                                                  │
└──────────────────────────────────────┘
上記のようなiniファイルを定数化してしまうプログラム。
┌──────────────────────────────────────┐
│foreach (parse_ini_file('xxxx.ini', TRUE) as $key1 => $value1) {            │
│    foreach ($value1 as $key2 => $value2) {                                 │
│        define($key2, $value2);                                             │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘

以下のようにコメントアウトするつもりが…。
┌─────────────────────────────────[xxxx.ini]┐
│;ROOT=/root                                                                 │
└──────────────────────────────────────┘

入力ミスで以下のようにコメントアウトしてしまった。
┌─────────────────────────────────[xxxx.ini]┐
│::ROOT=/root                                                                │
└──────────────────────────────────────┘

そしたら、以下のようなエラーとなってしまった。
┌──────────────────────────────────────┐
│Warning: Class constants cannot be defined or redefined in …               │
└──────────────────────────────────────┘

「["::ROOT"]」を定数名にしようとしてしまったんだから当然だ。

ま、iniファイルだからそんなに堅牢にする必要はないのだけど…。
分類:PHP
前へ 1 2 次へ