Excel で セルの書式の「分類」を「標準」に戻すショートカット

(使用している Excel は Excel 2016 です)

セルの書式の「分類」を「標準」に戻すショートカットです。

勝手に日付型になってしまったセルや 文字列型のセルの数式を有効にしたいときに キーボードだけで操作でき便利です。

ショートカットは次のようになります。

[Ctrl] + [Shift] + [~]

あくまで 書式の「分類」を「標準」に戻すだけなので 文字のフォントや色、 セルの背景色などは そのままです。 Word の [Ctrl] + [Shift] + [n] のように 書式をクリアするわけではありません。

Excel の VLOOKUP では検索条件にワイルドカードが使える

(使用している Excel は Excel 2016 です)

VLOOKUP ワークシート関数は 検索条件にワイルドカードが使える というか 使えてしまいます。

次のように ワイルドカードの "*" が含まれている場合、、、

=VLOOKUP("*大久保",C2:D3,2,FALSE)

"新大久保" なんかが先にあると、完全一致なのに こちらがヒットしてしまいます。

WRITE_0906_01

この場合、次のように ワイルドカードの "*" を "~" で エスケープする必要があります。

=VLOOKUP("~*大久保",C2:D3,2,FALSE)

"?" も同様に "~" でエスケープします。

=VLOOKUP("~?大久保",C2:D3,2,FALSE)

"~" 自体を使いたいときも "~" でエスケープします。

=VLOOKUP("~~大久保",C2:D3,2,FALSE)

VLOOKUP ワークシート関数で 検索条件にワイルドカードを使うことは そんなに無いんじゃないかと思いますが、 逆に 意図せず含まれている場合は エスケープしてやる必要があるため 注意が必要です。

PostgreSQL で 配列をテーブルのように扱う

メモです。
(使用している PostgreSQL は PostgreSQL 9.3.12 です)

PostgreSQL で 配列をテーブルのように扱う方法です。 データの一括登録や、関数のテストなどに便利です。

まず、配列の定義は次のようになります。

'{value1,value2,value3}'

ARRAY 演算構文を使うと次のようになります。

ARRAY['value1','value2','value3']

今回はまず ARRAY 演算構文の方を SQL で使用します。

SELECT field1::VARCHAR
FROM UNNEST(ARRAY['value1','value2','value3']) AS field1;

使いまわしが良いように FROM 句で使用しています。

ポイントは UNNEST 関数です。 UNNEST 関数を使用すると 配列を行集合に展開することができます。

[参考]
9.18. 配列関数と演算子 - PostgreSQL 9.3.2文書

SQL の実行結果は次のようになります。

db=# SELECT field1::VARCHAR
db-# FROM UNNEST(ARRAY['value1','value2','value3']) AS field1;

 field1
--------
 value1
 value2
 value3
(3 rows)

これを使うと 次ように SQL で使用する関数のテスト用 SQL が簡単に作れます。

SELECT field1::VARCHAR, test_function(field1::VARCHAR) AS result
FROM UNNEST(ARRAY['value1','value2','value3']) AS field1;

ここまでは一次元配列でした。

配列をテーブルのように扱うのに 列が 1 つでは困りますね。

ただ、2 次元配列にすると扱いが面倒になるため 配列の文字列定義と ARRAY 演算構文を組み合わせて 次のように定義します。

ARRAY['{100,value1,2018/10/01}','{200,value2,2018/10/02}']

これを SQL で使います。

SELECT (fields::VARCHAR[])[1]::NUMERIC AS field1
     , (fields::VARCHAR[])[2]::VARCHAR AS field2
     , (fields::VARCHAR[])[3]::DATE AS field3
FROM UNNEST(ARRAY['{100,value1,2018/10/01}'
                 ,'{200,value2,2018/10/02}']) AS fields;

ポイントは "fields" に配列の文字列定義が入るので それを "VARCHAR[]" でキャストします。

SQL の実行結果は次のようになります。

db=# SELECT (fields::VARCHAR[])[1]::NUMERIC AS field1
db-#      , (fields::VARCHAR[])[2]::VARCHAR AS field2
db-#      , (fields::VARCHAR[])[3]::DATE AS field3
db-# FROM UNNEST(ARRAY['{100,value1,2018/10/01}'
db-#                  ,'{200,value2,2018/10/02}']) AS fields;

 field1 | field2 |   field3
--------+--------+------------
    100 | value1 | 2018-10-01
    200 | value2 | 2018-10-02
(2 rows)

値にカンマを使用する場合は 次のようにエスケープします。

ARRAY['{100,val\,ue1,2018/10/01}','{200,value2,2018/10/02}']

PostgreSQL で 数値の小数点以下の 0 を削る

メモです。
(使用している PostgreSQL は PostgreSQL 9.3.12 です)

列の型が "NUMERIC(10,4)" のような場合 そのまま SQL でデータを取得すと "123456" が "123456.0000" のように取得されます。

今回は、小数点以下の 0 を削る方法です。

以下の SQL で テーブルとデータを作成します。

CREATE TABLE table1 (
        field1  NUMERIC(10,4)
);
INSERT INTO table1 (field1)
    VALUES (123456.0000)
         , (123456.5000)
         , (123456.0500)
         , (123456.0050)
         , (123456.0005);

SQL を実行。

db=# CREATE TABLE table1 (
db(#         field1  NUMERIC(10,4)
db(# );

CREATE TABLE
db=# INSERT INTO table1 (field1)
db-#     VALUES (123456.0000)
db-#          , (123456.5000)
db-#          , (123456.0500)
db-#          , (123456.0050)
db-#          , (123456.0005);

INSERT 0 5

まずは 普通にデータを取得してみます。

db=# SELECT field1
db-# FROM table1;

   field1
-------------
 123456.0000
 123456.5000
 123456.0500
 123456.0050
 123456.0005
(5 rows)

小数点以下に 0 が 続いていますね。

可変精度の "DOUBLE PRECISION" 型に キャストします。

PostgreSQL のキャストは セミコロン 2 つです。

xxxx::DOUBLE PRECISION

次の SQL で そのままの取得(field1)と キャストして取得(field1+)を比較してみます。

db=# SELECT field1
db-#      , field1::DOUBLE PRECISION AS "field1+"
db-# FROM table1;

   field1    |   field1+
-------------+-------------
 123456.0000 |      123456
 123456.5000 |    123456.5
 123456.0500 |   123456.05
 123456.0050 |  123456.005
 123456.0005 | 123456.0005

小数点以下の 0 が 削れていますね。

これは プログラム言語でも よくある方法です。

ただし、"DOUBLE PRECISION" は 不正確な可変精度の数値データ型ですので 精度の問題には注意する必要があります。

[参考]
8.1. 数値データ型 - PostgreSQL 9.3.2文書

Excel で セルの値の非表示にする

(使用している Excel は Excel 2016 です)

Excel で 「セルの値を非表示にする」といえば、文字の色を白にする方法があります。

WRITE_0902_01

しかし、当然ながらこの方法では 背景の色を変えてしまうと 値が見えてしまいます。

WRITE_0902_02

次のユーザー定義書式を使用することで、 セルの値を非表示にすることができます。

;;; (セミコロン3つ)

WRITE_0902_03

これで 値が表示されなくなります。

WRITE_0902_04

もちろん 値が表示されていないだけですので 数式から利用することはできます。

文字の色を変える方法と違って セルをテキストエディタにコピーしたときは空文字でコピーできたり 列幅の自動調整で邪魔しない(文字の色を変えるだけの場合は列幅の自動調整に影響する)など 他にも良い面があります。

Excel のシートの VeryHidden 設定

(使用している Excel は Excel 2016 です)

Excel の非表示シートにデータを格納して 他のシートから数式で参照する、なんてことはよくありますが その非表示のシートを簡単には表示されたくないときの方法です。

WRITE_0900_01

「ブックの保護」で、シート構成を変更不可にすることでも シートを再表示できなくすることはできます。

WRITE_0900_04

WRITE_0900_02

WRITE_0900_03

ただ、この場合は シートの追加やシート名の変更もできなくなってしまいます。

そこで、 Excel の VBA 側から シートの設定を変更します。

「コードの表示 (V)」をクリック。

WRITE_0900_09

VBA の画面が表示されます。

ここで、非表示になっているシート「Sheet2」の「プロパティ」の「Visible」属性を見てみます。

WRITE_0900_05

「Visible」属性には "0 - xlSheetHidden" が設定されています。 これが通常の Excel 側で設定した「非表示」状態です。

この「Visible」属性には 「表示」状態である "-1 - xlSheetVisible" 以外に "2 - xlSheetVeryHidden" という いかにも強そうな設定があります。

WRITE_0900_06

"2 - xlSheetVeryHidden" を設定してみます。

WRITE_0900_07

すると、Excel のシート側では再表示できなくなりました。

WRITE_0900_08

もちろん「通常の非表示」のシートが他にある場合は、 そのシートの再表示は可能です。

絶対に表示させない、というわけではないですが 他のシートの運用と分けることができますので便利です。

Excel のユーザー定義書式にある「G/標準」も書式

(使用している Excel は Excel 2016 です)

Excel のセルの書式設定の分類「ユーザー定義」は 初期値に「G/標準」と表示されます。

WRITE_0899_01

これも書式のようで、次のよう設定して、、、

G/標準年寝太郎

WRITE_0899_02

数字を入力してみます。

WRITE_0899_03

次のようになります。

WRITE_0899_04

「G/標準年寝太郎」の "G/標準" の部分が "3" で、"年寝太郎" の部分が文字列として連結されたようです。

文字列を入力した場合はそのままですね。

WRITE_0899_05

"G/標準" ではなく "標準" でも同じようで、 次のように設定すると、、、

標準デス

WRITE_0899_06

WRITE_0899_07

このようになります。

"G" も含めて「なんだろう?」と思っていましたが、 次のサイトに書いてありました。

[参考]
Excel(エクセル)の表示形式で見かける「G/標準」とは何の意味? | Prau(プラウ)Office学習所

"G/標準" というのは、Excel の初期状態の、 自動的に四捨五入や指数表示をしてくれる書式とのことです。

WRITE_0899_08

WRITE_0899_09

つまり、"G/標準年寝太郎" のように設定するのは 「Excel の初期状態の書式」に「文字列の"年寝太郎」を連結させる、という意味になるようです。

PostgreSQL で、一時的に全てのトリガーを無効にする

メモです。
(使用している PostgreSQL は PostgreSQL 9.3.12 です)

PostgreSQL で できるだけ他に影響を与えないように 一時的に全てのトリガーを無効にしたいと思っていたら 次のような方法がありました。

[参考]
PostgreSQLで一時的にtriggerを全て無効する方法 - Qiita

SET session_replication_role = replica;

クライアント接続の変数「session_replication_role」を変更する方法で この変数は、トリガおよびルールの発行を制御するそうです。

[参考]
18.11. クライアント接続デフォルト - PostgreSQL 9.3.2文書

実際に試してみます。

まず、table1 と table2 を作成。

CREATE TABLE table1 (
        field1  INTEGER
,       field2  INTEGER
);

CREATE TABLE table2 (
        field1  INTEGER
);

table1 の INSERT 時に field1 の値を field2 にセットする BEFORE トリガーを作成。

CREATE FUNCTION before_func1()
RETURNS TRIGGER AS $$
BEGIN
    NEW.field2 := NEW.field1;
    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER before_trigger1
    BEFORE INSERT ON table1
    FOR EACH ROW EXECUTE PROCEDURE before_func1();

table1 の INSERT 時に table2 にレコードを INSERT する AFTER トリガーを作成。

CREATE FUNCTION after_function1()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO table2 (field1) VALUES (NEW.field1);
    RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER after_trigger1
    AFTER INSERT ON table1
    FOR EACH ROW EXECUTE PROCEDURE after_function1();

テーブルとトリガーを作成したら、次の SQL を実行します。

INSERT INTO table1 (field1) VALUES (1);

table1 に INSERT 。

db=# INSERT INTO table1 (field1) VALUES (1);

INSERT 0 1

table1 を確認。

db=# SELECT * FROM table1;

 field1 | field2
--------+--------
      1 |      1
(1 row)

BEFORE トリガーで field2 に値がセットされています。

table2 を確認。

db=# SELECT * FROM table2;

 field1
--------
      1
(1 row)

AFTER トリガーで レコードが INSERT されています。

次にクライアント接続の変数「session_replication_role」を試しますが まず初期値を確認。

db=# SHOW session_replication_role;

 session_replication_role
--------------------------
 origin
(1 row)

初期値は「origin」でした。

クライアント接続の変数「session_replication_role」に 「replica」を設定します。

db=# SET session_replication_role = replica;

SET
db=# SHOW session_replication_role;

 session_replication_role
--------------------------
 replica
(1 row)

ちゃんと変更されてます。

さっきと同じ INSERT 文を実行。
(テーブルのレコードはクリア済です)

db=# INSERT INTO table1 (field1) VALUES (1);

INSERT 0 1

table1 を確認。

db=# SELECT * FROM table1;

 field1 | field2
--------+--------
      1 |
(1 row)

BEFORE トリガーが実行されなかったため field2 に値がセットされていません。

table2 を確認。

db=# SELECT * FROM table2;

 field1
--------
(0 rows)

AFTER トリガーが実行されなかったため レコードが INSERT されていません。

トリガーは実行されませんでした。
これは便利ですね。

もちろん他のセッションでは通常通りの動作をします。

ただし、整合性が保たれなくなる可能性があるので 当然ながら慎重に実行する必要があります。

Windows で システム エラー 1219 が消えないときの対処A

メモです。
(使用している Windows は Windows 10 です)

前に「システム エラー 1219 が消えないときの対処@」を書きましたが 今回は「システム エラー 1219」が発生したときに 「とりあえず、ここも見ておこう」という内容です。

まず NET USE をしますが 出てこないから困るわけです。

C:\> NET USE

新しい接続は記憶されません。

一覧にエントリが存在しません。

こういうときは 次の場所もチェックしてみます。

「コントロールパネル」から「ユーザアカウント」を選択。

WRITE_0897_02

「資格情報の管理」をクリック。

右側にある「Windows 認証情報」をクリック。

WRITE_0897_03

接続しようとしているサーバの情報が表示されたら そのせいで「システム エラー 1219」が出ている可能性があります。

削除して問題なければ「削除」をクリック。

この情報はサーバ接続時に「資格情報を記憶する」にチェック入れると 登録されます。

WRITE_0897_01

削除して問題なければ「削除」をクリック。

これで「システム エラー 1219」が消えることがあります。

差分ファイルだけを tar コマンドで固める

メモです。
(使っている Linux は Ubuntu 14.04.3 LTS です)

find コマンドで取得した更新日が新しいファイルだけを tar コマンドで 固める方法です。

更新日は、比較対象のファイルより新しいものを取得します。 (この方法については、前に書いているので、そちらを参照してください)

まずは環境変数の設定。
比較対象のファイル(BASE_FILE_PATH)と 固めるTARファイル(TAR_FILE_PATH)のパスを設定します。

$ BASE_FILE_PATH=./last_update.txt
$ TAR_FILE_PATH=/tmp/xxxxxx

既存のTARファイルが存在するとよろしくないため 念のためですが、0バイトで上書きしておきます。

$ cat /dev/null > ${TAR_FILE_PATH}.tar

find コマンドでファイルを取得しつつ tar コマンドで固めます。 このとき、tar コマンドでは 追記 "r" を指定するのと 圧縮の "z" は指定しないようにします。

$ find ./ -type f -newer ${BASE_FILE_PATH} -exec tar rf ${TAR_FILE_PATH}.tar {} \;

TAR ボールを作った後で圧縮します。

$ gzip -f ${TAR_FILE_PATH}.tar

最後に比較対象のファイルを touch コマンドで更新しておけば 次もこの後からの差分を取得することができます。

$ touch ${BASE_FILE_PATH}

Windows 上で .htaccess のようなファイルを作成する

(使用している Windows は Windows 10 です)

Windows 上で普通に .htaccess のような「 . (ドット)」 から始まるファイルを作成しようとすると 拡張子のみと判断されて 次のようにエラーが出てしまいます。

WRITE_0894_01

最近知ったのですが、そういうときは 次のようにファイル名の最後にも「 . 」を入れます。

WRITE_0894_02

そうすると 最後の「 . 」は消えて .htaccess になります。

WRITE_0894_03

これはフォルダなどでも同じです。

この方法だと コマンドプロンプトや他の方法を使わなくても 簡単に「 . 」から始まるファイルを作ることができます。

Windows で システム エラー 1219 が消えないときの対処@

メモです。
(使用している Windows は Windows 10 です)

次のようにネットワークドライブの割り当てをしようとしたときに 「システム エラー 1219」が発生することがあります。

C:\> NET USE P: \\fileserver ...
システム エラー 1219 が発生しました。
同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。
サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。

たいていは NET USE ... /DELETE で解決しますが たまにエラーが消えないときがあります。

NET USE で見ても一覧に表示されず。

C:\> NET USE

新しい接続は記憶されません。

一覧にエントリが存在しません。

こんなとき、とりあえずの対処法として 次のようにサーバ名をIPアドレス(または逆にIPアドレスからサーバ名)に変更して コマンドを実行します。

C:\> NET USE P: \\192.168.1.200 ...

サーバ名が設定されていない場合は 自分のパソコンの lmhosts などに記載すると良いです。

find コマンドで日時を指定して検出する

メモです。
(使っている Linux は Ubuntu 14.04.3 LTS です)

find コマンドで -mtime オプションを使うと ファイルの更新日を条件にして「〜日前」のような検出ができます。

$ find ./ -mtime -3

具体的に日時を指定して検出するには 次のように -newermt オプションを使用します。 (-newermt の m は Modify の m で、a にすると Access、c だと Change になります)

$ find ./ -newermt "2018/10/30 12:00"

(日付の書式は色々指定できます)

これで指定した時刻よりもタイムスタンプが大きい(指定した時刻は含まれない)ファイルを検出することができます。

-newerXY reference

    Compares the timestamp of the current file with reference.  The reference argument is normally the name
    of a file (and one of its timestamps is used for the comparison) but it may also be a string describing
    an absolute time.  X and Y are placeholders for other letters, and  these  letters  select  which  time
    belonging to how reference is used for the comparison.

    a   The access time of the file reference
    B   The birth time of the file reference
    c   The inode status change time of reference
    m   The modification time of the file reference
    t   reference is interpreted directly as a time

    Some  combinations  are  invalid;  for example, it is invalid for X to be t.  Some combinations are not
    implemented on all systems; for example B is not supported on all systems.  If  an  invalid  or  unsup‐
    ported  combination  of XY is specified, a fatal error results.  Time specifications are interpreted as
    for the argument to the -d option of GNU date.  If you try to use the birth time of a  reference  file,
    and  the  birth  time cannot be determined, a fatal error message results.  If you specify a test which
    refers to the birth time of files being examined, this test will fail for any  files  where  the  birth
    time is unknown.

find コマンドで特定のファイル以降の更新を検出する

メモです。
(使っている Linux は Ubuntu 14.04.3 LTS です)

find コマンドで -mtime オプションを使うと ファイルの更新日を条件にして「〜日前」のような検出ができます。

$ find ./ -mtime -3

何かの作業で更新したファイル以降に作成・更新されたファイルを検出したい場合 -newer というオプションが使えます。

$ find ./ -newer hogehoge.txt
-newer file

    File  was  modified  more  recently  than file.  If file is a symbolic link and the -H option or the -L
    option is in effect, the modification time of the file it points to is always used.

このオプションは、引数のファイルのタイムスタンプよりタイムスタンプが新しいファイルを検出してくれます。

引数のファイルのタイムスタンプ“より大きい”ため、そのファイル自体は含まれません。 引数のファイルが対象の中にあっても、検出されないようになってるわけです。 よく考えられてますね。

ORACLE で実行した SQLから実行計画を表示する

ORACLE で実行計画を表示したい状況があったのですが 自由にテーブルを作れる環境ではなく どうしようかと思っていたところ、 実行したSQLに対して実行計画を表示する方法がありました。

次のように「DBMS_XPLAN.DISPLAY_CURSOR」を使用します。

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

最後に実行したSQLの実行計画が次のように表示されます。

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  dyk4dprp70d74, child number 0
-------------------------------------
SELECT DECODE('A','A','1','2') FROM DUAL

Plan hash value: 1388734953

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |       |     2 (100)|          |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------------

ただ、DISPLAY_CURSOR の実行には「V$SQL_PLAN、V$SESSIONおよびV$SQL_PLAN_STATISTICS_ALL.の各固定ビューに対するSELECT権限が必要です。」とのことです。

[参考]
DBMS_XPLAN - OracleR Database PL/SQLパッケージおよびタイプ・リファレンス

実行したSQLを指定するには、 V$SQL で SQL_ID を調べて 以下のように実行します。

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('SQL_ID'));

実行したSQLにしか使えませんが テーブル等を作らなくて良いのは助かります。

tar コマンドでパスを変更して展開したい

メモです。
(使っている Linux は Ubuntu 14.04.3 LTS です)

tar コマンドで展開するときに 格納されているパスがそのまま使えずに パスの一部を変更して展開したいときがあります。

[格納されているパス]
home/hogehoge/test1/xxxxxx

[展開したいパス]
/home/hogehoge/test2/xxxxxx

次のようにオプションと変更内容を指定することで、 パスを変更しながら展開することができます。

$tar xzvf xxxxx.tar.gz --transform='s/test1/test2/g'
File name transformations:

    --transform=EXPRESSION, --xform=EXPRESSION
                           use sed replace EXPRESSION to transform file
                           names

ディレクトリの「 / 」も変更したい場合は 次のように区切り文字を「 | 」などに変更しておくと良いと思います。

$tar xzvf xxxxx.tar.gz --transform='s|hogehoge/test1|hugahuga/test2|g'

tar コマンドで一部だけを展開したい

メモです。
(使っている Linux は Ubuntu 14.04.3 LTS です)

tar コマンドで展開するときに 特定のファイルや、特定のディレクトリ以下のファイルだけを展開したいときがあります。

次のようにパスを指定することで、そのファイルだけを展開することができます。

$ tar xvzf xxxxx.tar.gz home/hogehoge/test.html

同様に、ディレクトリのパスを指定すると、そのディレクトリ以下を展開できます。

$ tar xvzf xxxxx.tar.gz home/hogehoge

パスの指定にはワイルドカードを使うこともできます。

$ tar xvzf xxxxx.tar.gz --wildcards */hogehoge.png
File name matching options (affect both exclude and include patterns):

    --wildcards            use wildcards (default for exclusion)
    --no-wildcards         verbatim string matching

余談ですが、TABキーの入力補完で .tar.gz ファイルの中のパスまで 指定できてビックリしました。

Google サイト内検索

Amazonアソシエイト