MW211 EXIT

devlog
ExcelVBA/更新系プレースホルダ
2014年10月31日
┌──────────────────────────────────────┐
│Dim データベース As New ADODB.Connection                                    │
│Dim キー As Long                                                            │
├──────────────────────────────────────┤
│データベース.Execute "UPDATE 表" _                                          │
│                   & "    SET 列 = 値" _                                    │
│                   & "    WHERE キー = " & キー & ";"                       │
└──────────────────────────────────────┘
上記のような更新処理をプレースホルダ処理に置き換えると以下のようになる。
┌──────────────────────────────────────┐
│Dim データベース As New ADODB.Connection                                    │
│Dim キー As Long                                                            │
├──────────────────────────────────────┤
│Const SQL文 As String = "UPDATE 表" _                                       │
│                      & "    SET 列 = 値" _                                 │
│                      & "    WHERE キー = ?;"                               │
│Dim SQLコマンド As New ADODB.Command                                        │
│With SQLコマンド                                                            │
│    .CommandText = SQL文                                                    │
│    .Parameters.Append .CreateParameter("キー", adInteger, adParamInput)    │
│    .ActiveConnection = データベース                                        │
│    .Parameters("キー") = キー                                              │
│    .Execute                                                                │
│End With                                                                    │
│Set SQLコマンド = Nothing                                                   │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/数値変換
2014年10月30日
┌──────────────────────────────────────┐
│数値か否か = IsNumber(変数)                                                 │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│数値 = Val(変数)                                                            │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ADODBの空セル
2014年10月29日
設定にもよるのだろうが、ADODBで値を代入する場合、
空のセルについて、「""」(空文字列)になるかと思いきや
「NULL(厳密にはEmpty)」になってしまう。
┌──────────────────────────────────────┐
│Private テーブル As New ADODB.Recordset                                     │
├──────────────────────────────────────┤
│テーブル.Fields("項目名").Value = Cells(y, x).Value                         │
└──────────────────────────────────────┘

これだと、NOT NULL属性の場合、エラーとなるのでその対策を考えた
「IsEmpty(Cells(y, x).Value, "")」とかで、Emptyの時に変換できたり
したらスマートなのだけど、残念ながら「IsEmpty()」はEmptyか否かの
結果を返すだけのBoolean関数なのだ。
かといって、いちいちIf文にするのもかっこ悪いし、
じゃユーザ関数作るかって考えたけど、いい案が浮かんだ。
┌──────────────────────────────────────┐
│テーブル.Fields("項目名").Value = Cells(y, x).Value & ""                    │
└──────────────────────────────────────┘
「Empty & "" = ""」なんだね。

なお、数値項目の場合は、以下でOK。
┌──────────────────────────────────────┐
│テーブル.Fields("項目名").Value = Cells(y, x).Value + 0                     │
└──────────────────────────────────────┘
「Empty + 0 = 0」なんだね。

【追記】
  文字列の場合、変数を間にかませば、NULLにはならないようだ。
┌──────────────────────────────────────┐
│Dim 変数 As String                                                          │
│変数 = Cells(y, x).Value                                                    │
│テーブル.Fields("項目名").Value = 変数                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
Excel/ボタン等を印刷しない
2014年10月28日
Excelシート上のボタン等を印刷しない方法。

「デザインモード」にして、対象となるボタン等を右クリック。
┌──────────────┐
│コントロールの書式設定      │
├──────────────┤
│┌─┌─┌─────┐─┐  │
││  │  │プロパティ│  │  │
│┌───┘          └──┐│
││□オブジェクトを印刷する││
│└────────────┘│
└──────────────┘
「オブジェクトを印刷する」のチェックをはずす。
分類:Excel
ExcelVBA/入力イベントはマクロからのも反応します
2014年10月27日
セルのフォーカスが変わった時に
(というよりは特定のセルにフォーカスがあたった時に)
イベントを起こす、シートの関数に以下のようなものがある。
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    …                                                                      │
│End Sub                                                                     │
└──────────────────────────────────────┘

これ、実は、マクロによってシートのフォーカスが変わったりした場合にも
起動してしまう。

基本手入力の捕捉なので、なんとかして欲しいものだと思う。

で、その回避方法。
「Application.EnableEvents」を無効にして、本関数自体が呼ばれないようにする。

イメージとしては以下のような感じ。
┌──────────────────────────────────────┐
│Application.EnableEvents = False                                            │
├──────────────────────────────────────┤
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    …                                                                      │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Application.EnableEvents = True                                             │
└──────────────────────────────────────┘
あくまでイメージ
┌──────────────────────────────────────┐
│Application.EnableEvents = False                                            │
│Call Worksheet_SelectionChange()                                            │
│Application.EnableEvents = True                                             │
└──────────────────────────────────────┘
上記とかだったらわかりやすいのだが、いかんせん「Worksheet_SelectionChange」は
どのタイミングで呼ばれるか未確定なのだ。

ということで、イベントが起きそうな前後で、「Application.EnableEvents」を
切り替えてあげればよい。
→なお、最後に有効にしないと手入力イベントも捕捉できなくなるので注意
分類:ExcelVBA
PHP/PDOが効かなくなった
2014年10月26日
PHPのインストール時に、PostgreSQLのPDOをインストールしたのだが
何か拍子に(たぶん何かをインストールしたことによる影響と思われる)、
そのPDOが効かなくなった(「phpinfo()」で参照しても見えてこない)

再インストール(ChangeもしくはRepair)を行っても解消しない。
(インストール済みになる、一回削除してからやっても同じ)

で、Apacheのエラーログ「apache-error.log」を見たら以下のエラーが出ていた。
┌──────────────────────────────────────┐
│Warning:  PHP Startup: Unable to load dynamic library                       │
│ 'C:\Program Files (x86)\PHP\ext\php_pdo_pgsql.dll'                         │
│ - このオペレーティング システムでは %1 は実行されません。                  │
└──────────────────────────────────────┘

この解決方法は以下の通り。

Apacheの設定ファイル(httpd.conf)の末尾に、以下が自動で追加されるので
そこに以下の一行(★)を追加すれば解消された。
┌──────────────────────────────────────┐
│PHPIniDir "C:\Program Files (x86)\PHP\"                                     │
│Loadfile "C:\Program Files (x86)\PHP\libpq.dll"                 ←★これを追加
│LoadModule php5_module "C:\Program Files (x86)\PHP\php5apache2_2.dll"       │
└──────────────────────────────────────┘
「C:\Program Files (x86)\PHP」の部分はPHPのインストール先。

なんでだろう?
分類:PHP、Apache
Excel/マクロショートカットの状況
2014年10月25日
Excelマクロのオプションでショートカットキーを割り当てたものの
何を割り当てたか忘れてしまった場合。

ソースコードを出力すると、ショートカットキーの割り当て状況がわかる。

例えば以下のようなマクロに「Ctrl+q」を割り当てた場合…。
┌──────────────────────────────────────┐
│Sub マクロ名()                                                              │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘

以下のように、関数の先頭に一行追加されるのだ。
┌──────────────────────────────────────┐
│Sub マクロ名()                                                              │
│Attribute マクロ名.VB_ProcData.VB_Invoke_Func = "q\n14"                 ←これ
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/自然キーによる復活のトリガ
2014年10月24日
レコードを追加した時、削除レコード(削除済フラグがONのレコード)に
(自然キー基準で)該当するものがある場合に復活させるトリガは以下のような感じ。
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガ] ON [QC工程表DB].[dbo].[表]                    │
│    INSTEAD OF INSERT                                                       │
│AS                                                                          │
│    MERGE INTO [QC工程表DB].[dbo].[表] AS [旧表]                            │
│        USING inserted AS [新表]                                            │
│        ON (                                                                │
│                [新表].[自然キー1] = [旧表].[自然キー1],                    │
│            AND [新表].[自然キー2] = [旧表].[自然キー2]                     │
│        )                                                                   │
│        WHEN MATCHED THEN                                                   │
│            UPDATE SET [列]           = [新].[列],                          │
│                       [削除済フラグ] = 0                                   │
│        WHEN NOT MATCHED THEN                                               │
│            INSERT (                                                        │
│                    [サロゲートキー],                                       │
│                    [自然キー1],                                            │
│                    [自然キー2],                                            │
│                    [列],                                                   │
│                    [削除済フラグ]                                          │
│                )                                                           │
│                VALUES (                                                    │
│                    (自動採番),                                             │
│                    [新].[自然キー1],                                       │
│                    [新].[自然キー2],                                       │
│                    [新].[列],                                              │
│                    [新].[削除済フラグ]                                     │
│                )                                                           │
│;                                                                           │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/自動採番をトリガで実現
2014年10月23日
主キー以外の項目で自動採番を実現するトリガは以下のような感じ。
(その項目にNULLが指定された場合のみ発動)
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガ] ON [DB].[dbo].[表]                            │
│    INSTEAD OF INSERT                                                       │
│AS                                                                          │
│    INSERT INTO [DB].[dbo].[表]                                             │
│        (                                                                   │
│            [連番],                                                         │
│            [列]                                                            │
│        )                                                                   │
│        SELECT CASE WHEN [連番] IS NULL THEN                                │
│                        ISNULL(                                             │
│                            (SELECT MAX([別表].[連番])                      │
│                                 FROM [DB].[dbo].[表] AS [別表]             │
│                                 WHERE [表].[主キー] = inserted.[主キー]),  │
│                            0                                               │
│                        ) + 1                                               │
│                    ELSE                                                    │
│                        [連番]                                              │
│               END,                                                         │
│               [列]                                                         │
│            FROM inserted                                                   │
│;                                                                           │
└──────────────────────────────────────┘
分類:MSSQL
DB設計/削除済フラグと復活の考察
2014年10月22日
削除処理時、直接DELETEで抹消するのではなく、
削除済フラグを立ててで削除レコード扱いとしたとする。

この場合、自然キーとサロゲートキー(主キー)のあるレコードで
同一自然キーで再度追加したら、以下の二つの対応ができる。

(1) 削除レコードの削除済フラグを落として、上書きする(復活)
(2) 別サロゲートキーを採番して別レコードとして追加する(追加)

容量的なことを考えると前者が効率的だし、履歴管理的なことを考えると後者が実用的。

では、そのレコードに子分がいた場合には?

前者は子分も復活できるが削除した経緯を知らない人が追加したつもりで
子分が突然ゾンビのように現れてくるということがおきる。

一方後者は、親分が一度削除されたら子分も削除される。復活はできない。
CASCADEのDELETEと同じようなものだ。

どっちらかというと後者が一般的か。
間違って削除したのを復活するのは
ハードディスクから削除データを復活する的な職人技と考えれば、
前者はSQLで解決できるが、一般的には簡単にできないという点で合致する。
分類:SQL
前へ 1 2 3 次へ