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");
        }
})();