B-Teck!

お仕事からゲームまで幅広く

【VBA】半角カナを判定する

Not (Mid(strInput, i, 1) Like "[ヲ-゚]" Or strInput = "-")で不要な文字種を除外。
※"[ヲ-゚]“と”-“を指定するとカタカナひらがなの必要そうな文字列を抽出できる。
”-“を半角カナに含みたくない場合はstrInput = "-"を外す。
その後StrConvで一度文字列を半角カナに変換してからStrCompのバイナリモードで比較することで、
半角カナの判定ができる。

'/**
' * isHankakuKana
' * 入力文字列が半角カナかを調べる
' * @param strInput   調べる文字列
' * @return True:半角カナ False:半角カナではない
' */
Public Function isHankakuKana(ByVal strInput As String) As Boolean
    
    Dim i As Long
    
    '空文字の場合は判定前にFalse
    If strInput = "" Then
        isHankakuKana = False
        Exit Function
    End If
    
    '記号や数字、アルファベット等の場合はFalse
    For i = 1 To Len(strInput)
        If Not (Mid(strInput, i, 1) Like "[ヲ-゚]" Or strInput = "-") Then
            isHankakuKana = False
            Exit Function
        End If
    Next i
    
    '文字を半角カナに変換し、不整合ならFalse
    Dim hankakuKana As String
    hankakuKana = StrConv(strInput, vbKatakana + vbNarrow)
    isHankakuKana = StrComp(hankakuKana, strInput, vbBinaryCompare) = 0
End Function

Sub test()
    Debug.Print isHankakuKana("アイウエオ")
    Debug.Print isHankakuKana("バビブベボ")
    Debug.Print isHankakuKana("パピプペポ")
    Debug.Print isHankakuKana("゙")
    Debug.Print isHankakuKana("゚")
    Debug.Print isHankakuKana("-")
    Debug.Print isHankakuKana("アイウエオ")
    Debug.Print isHankakuKana("あいうえお")
    Debug.Print isHankakuKana("abcdefg")
    Debug.Print isHankakuKana("ABCD")
    Debug.Print isHankakuKana("123456")
    Debug.Print isHankakuKana("。゙")
    Debug.Print isHankakuKana("")
End Sub

【VBA/Access】Option Compareステートメント

Accessでは、Option Compareステートメントによって文字列の比較方法が決定される。
モジュールを作成した際には自動でDatabaseモードが付加されるが、
この記述を削除し、何も書かなかった場合の既定値はBinaryモードとして定義されている。

モード 概要
Binary バイナリで比較する。
大文字小文字、半角全角、ひらがなカタカナが区別される
Text OSの設定にもとづいて比較する。
大文字小文字、半角全角、ひらがなカタカナを区別しない
Database DBの設定にもとづいて比較する。

Databaseのときにどうなっているのかよくわからなかったけど、OSの設定に準じてるような挙動らしいので、
Textの場合はOS依存、Databaseの場合はAccessが作られたOS(が設定された自分自身?)という基準で比較してそう。
日本のOSで作る限りはText≒Databaseみたいなもんなのかな。

文字列比較の関数使用時に必要があれば、vbBinaryCompare,vbTextCompare,vbDatabaseCompareのような定数を用いて
比較関数のモードを変えることができるので厳密に比較する必要がある箇所以外はどのモードでもあまり問題なさそう。

【JavaScript】ウインドウを閉じたとき子ウインドウも一緒に閉じる

ウインドウにモーダルじゃない子ウインドウがある時、閉じたら一緒に消えてほしかった。
IEでのみ動作確認済み。
コードでは1対1の親子関係しか定義してないけど、childWindowを配列にして突っ込んで、
each()とかmap()とかああいうので回せばいいと思う。

(function() {
        //ウインドウが閉じられたときに子ウインドウが存在したら閉じる
        window.addEventListener("beforeunload",function() {
            if(!!childWindow){
                childWindow.close();
            }
        }, false);
        
        //自分自身を新しいタブで開く
        //無限ループにならないように親のいないウインドウのときのみ実行
        if(window.opener === void 0){
            //window.open()の戻り値は開いたwindowオブジェクトなので、閉じるとき用に確保する
            var childWindow = window.open(location,"","scrollbars=no");
        }
})();

【JavaScript/IE】ウインドウサイズの変更に合わせて要素を拡大縮小する

onresize時に現在のウインドウサイズ変更の比率に合わせてドキュメントの拡大率を動的に変更する。
動作確認はIEのみで、他ブラウザでは正常に動作しないかも。

(function(){
    window.addEventListener("resize",windowZoom, false);
    //ウインドウオープン時のデフォルトサイズ
    var defaultSizeH = document.documentElement.scrollHeight || document.body.scrollHeight;
    var defaultSizeW = document.documentElement.scrollWidth || document.body.scrollWidth;

    /**
    * windowZoom
    * ウインドウの拡大率を変更する
    * @return {boolean} true
    */
    function windowZoom() {
        var sizeRatioH = window.innerHeight / defaultSizeH;
        var sizeRatioW = window.innerWidth / defaultSizeW;

        var windowRatio = sizeRatioH > sizeRatioW ? sizeRatioW : sizeRatioH;
        document.body.style.zoom = windowRatio * 0.95;
        return true;
    }
})();

【JavaScript/IE】ファンクションキーを無効化する

onload時にイベントを無効化することでファンクションキーを動作しないようにできる。
押下時の処理を別で定義することで、Webアプリケーションでもファンクションキーを用いたデスクトップアプリケーションライクな処理を再現できる。
動作確認はIEのみで、おそらく他ブラウザでは正常に動作しない。

(function() {
    // keydownイベントに、Ev_KeyDown関数を登録
    // helpイベントはreturn falseで無効にする
    window.onkeydown = Ev_KeyDown;
    window.onhelp = function() {return false;};

    /**
     * Ev_KeyDown
     * デフォルトのキーダウンイベントを無効化する
     * @param なし
     * @return {boolean} false
     */
    function Ev_KeyDown() {
        // F1-F12キーであれば、無効化する(F1キー:112,... F12キー:123)
        if(event.keyCode >= 112 && event.keyCode <= 123)
        {
            event.keyCode = null;
            event.returnValue = false;
            
            //ファンクションキーに機能をもたせたい場合、下記キーコードで分岐
            //switch(code){
            //     // F1
            //     case 112:
            //         break;
            //     // F2
            //     case 113:
            //         break;
            //     // F3
            //     case 114:
            //         break;
            //     // F4
            //     case 115:
            //         break;
            //     // F5
            //     case 116:
            //         break;
            //     // F6
            //     case 117:
            //         break;
            //     // F7
            //     case 118:
            //         break;
            //     // F8
            //     case 119:
            //         break;
            //     // F9
            //     case 120:
            //         break;
            //     // F10
            //     case 121:
            //         break;
            //     // F11
            //     case 122:
            //         break;
            //     // F12
            //     case 123:
            //         break;
            //     default:
            //         break;
            // }
            
            //falseを返さないと動いてしまう
            return false;
        }

    }
})();