おすなのぶろぐ

プログラミングとかの Tips 置き場。

Windows 7 PC 環境設定メモ

明日から勤務先が変わり、新たに PC の環境設定することになると思うので、困らないようにメモ。
職場ルールで基本的にフリーソフトのインストールが禁止されているが、そのルール内でもそこそこの環境になるようにしたい。
やりたいこととしては以下の様な感じ。

  • [Caps Lock] を [Ctrl] に変更
  • キーボード レイアウトを US 配列に変更


尚、対象環境としては、勤務先で使うであろう Windows 7(32 ビット)です。
ちなみに、以下のやり方はまだ実施していないため、もしかすると書いてある通りにはできないかもしれません。

[Caps Lock] を [Ctrl] に変更

今の勤務先では Ctrl2Cap という Microsoft で公開されているツールで変更していましたが、フリーソフトが禁止されているんで使えません。
そこでレジストリをいじって変更する方法を取りたいと思います。

設定を変更するには HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout に Scancode Map というキーを追加します。
Scancode Map の値を設定することでキーを置き換えることができます。
Scancode Map では [Caps Lock] や [Ctrl] でなくとも入れ替えることができるのですが、今回の場合だと

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

といった内容で登録すると [Caps Lock] を [Ctrl] に変更できます。
登録するときは上の内容を ".reg" という拡張子のテキスト ファイルとして保存し、ファイルを実行すれば登録できます。
レジストリを変更する前に、レジストリ エディター(regedit)の [ファイル] → [エクスポート] で該当のキーのバックアップを取っておきます。
レジストリの変更の反映には Windows の再起動が必要です。

[Ctrl] と [CapsLock]を入れ替えることもできますが、普通キーボードに慣れている人が自分のキーボードを操作することがたまに発生するため、[Ctrl] はそのままにしています。
SQL を書くときなど常に大文字で書きたいときがたまにあるため、その場合は言語バーにある [CAPS] ボタンで切り替えることにしています。

キーボード レイアウトを US 配列に変更

自宅では US 配列のキーボードを使っているのですが、職場ではもちろん日本語キーボードです。
仕方ないので、キーボード レイアウトを US 配列に変更します。

キーボード レイアウトを US 配列に変更するにはレジストリの HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters キーの以下のキーの値を変更します。

名前 種類 データ
LayerDriver JPN REG_SZ kbd101.dll
OverrideKeyboardIdentifier REG_SZ PCAT_101KEY
OverrideKeyboardSubtype DWORD 0
OverrideKeyboardType DWORD 7

念のため、レジストリのバックアップを取っておきます。
また、設定の反映には Windows の再起動が必要です。

Excel の積み上げ棒グラフで値が 0 の系列名を非表示にする方法

グラフの系列名が値が 0 でも表示されてしまい困る

Excel で
f:id:osuna:20121208234624p:plain
のような表を積み上げ棒グラフで
f:id:osuna:20121208234653p:plain
みたいな感じにしたいなぁ、と思って系列名を表示させると、
f:id:osuna:20121208234727p:plain
こんな風に値が 0 の系列名も表示されてしまい、見づらくなってしまいます。
何か自動的に設定できる方法があるのかもしれませんが、見たところ自動設定的な何かはないようです。

マクロで系列名表示 → 値 0 の系列名削除を自動化

仕方ないのでマクロで自動化することにしました。
(Excel 2007 で動作を確認しました)

Public Sub SetDataLabel()
    Dim Chart As Chart
    Set Chart = Application.ActiveChart
    
    If Chart Is Nothing Then
        Exit Sub
    End If
    
    Dim Series As Series
    Dim Values As Variant
    Dim i As Integer
    For Each Series In Chart.SeriesCollection
        With Series
            Values = .Values
            .ApplyDataLabels
        End With
        
        With Series.DataLabels
            .Position = xlLabelPositionCenter
            .ShowSeriesName = True
            .ShowValue = False
        End With
        
        For i = LBound(Values) To UBound(Values)
            If Values(i) = 0 Then
                Series.Points(i).DataLabel.Delete
            End If
        Next i
    Next
End Sub

系列名を表示させたいグラフを選択してこのマクロを実行すれば、自動的に
f:id:osuna:20121208234653p:plain
こんな風にしてくれます。

HTML 内の URL 解析

HTML 内の URL を解析してみるテスト。とりあえず A タグの URL だけ Debug.Print してみる。

MSHTML を使った例

Public Sub FindAnchorUrl1(ByVal HtmlPath As String)
    Dim HtmlDocument As MSHTML.HtmlDocument
    Set HtmlDocument = New MSHTML.HtmlDocument

    Dim Html As MSHTML.HtmlDocument
    Set Html = HtmlDocument.createDocumentFromUrl(HtmlPath, vbNullString)

    Do
        ' 本来は Sleep を使うべき
        ' テスト用に作ったので仮で DoEvents を使用
        DoEvents

        If Html.readyState = "complete" Then
            Exit Do
        End If
    Loop While True

    Dim Anchors As IHTMLElementCollection
    Set Anchors = Html.getElementsByTagName("A")

    Dim Anchor As HTMLAnchorElement
    For Each Anchor In Anchors
        Debug.Print Anchor.href
    Next
End Sub

地道にテキストを解析した例

※テスト用に書いたコードそのままなので、
 リファクタリングはまったくしてないです。ご容赦。
 ちなみに、HTML ファイルはローカルにあるのを前提とします。

Private FileSystemObject As New FileSystemObject

Public Sub FindAnchorUrl2(ByVal HtmlPath As String)
    Dim Stream As TextStream
    Set Stream = FileSystemObject.OpenTextFile(HtmlPath)

    Dim Text As String
    Text = Stream.ReadAll()

    Dim Find As String
    Find = Strings.LCase$(Text)

    Dim i As Long
    i = 1

    Do
        Dim AnchorIndex As Long
        AnchorIndex = Strings.InStr(i, Find, "<a", vbBinaryCompare)

        If AnchorIndex <> 0 And AnchorIndex < Len(Text) Then
            Dim HrefIndex As Long
            HrefIndex = Strings.InStr(AnchorIndex, Find, "href=", vbBinaryCompare)

            If HrefIndex <> 0 And HrefIndex < Len(Text) Then
                Dim UrlIndex As Long
                UrlIndex = HrefIndex + Len("href=")

                If Strings.Mid$(Find, UrlIndex, 1) = """" Then
                    UrlIndex = UrlIndex + 1
                End If

                Dim UrlLast As Long
                UrlLast = Strings.InStr(UrlIndex, Find, """", vbBinaryCompare)

                If UrlLast = 0 Then
                    UrlLast = Strings.InStr(UrlIndex, Find, " ", vbBinaryCompare)
                End If

                If UrlLast = 0 Then
                    Debug.Print "URL 取得失敗。"
                    i = UrlIndex
                Else
                    Debug.Print Mid$(Text, UrlIndex, UrlLast - UrlIndex)
                    i = UrlLast
                End If
            Else
                Exit Do
            End If

        Else
            Exit Do
        End If
    Loop Until Len(Text) < i

    Call Stream.Close
End Sub

参考

Web ページをダウンロードする方法~ MSHTML 編~
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html

命名規則 - 英語 VS 日本語

仕事で VB6/VBA を未だに使っているのだが、その命名規則で僕の職場では日本語を使うルールがある。
個人的には英語の方が好きなんだけど、理由もなく英語に言えないので、まずはできるだけ客観的にメリット/デメリットを書き出してみた。ちなみに、基本的に日本人しかコーディングしないのが前提です。

命名方法 メリット デメリット
英語
  • IntelliSense が使いやすい
  • 日本語よりは半角⇔全角の切り替えが少なくなる
  • 単語の区切りが表現しやすい/見やすい
  • 英語の語彙力がないと名前が付けにくい場合が多い
  • 英語の語彙力がないと読みにくい場合が多い
  • 英語に訳せない(訳しにくい)言葉がある
  • コメントが多くなりやすい
日本語
※ローマ字ではない
  • 直感的に分かりやすい名前を付けられる
  • 直感的に読みやすい場合が多い
  • コメントが少なくしやすい
  • 単語の区切りが表現しにくい/見づらい
  • IntelliSense が使いづらい
  • 英語よりは半角⇔全角の切り替えが多くなる
  • Microsoft が公式に使用できないと言っている(VB6)
  • 一部の条件で日本語名のプロシージャが実行できない(Access 2002)
  • 日本語長音による不具合あり(SQL Server

なんだかどっちもどっちな感じ。まあ、大したものじゃないけどこれを参考にしてもらって、英語と日本語のどちらの方がうれしさがあるか職場のメンバーに考えてもらおう。 以下に日本語のデメリットでソースがあるものだけ置いておく。

  • Visual Basic でプロジェクト名に日本語の文字を使用できない
    http://support.microsoft.com/default.aspx?scid=kb;ja;418924
    Visual Basic では、プロジェクト、コントロール、フォーム モジュール、クラスモジュール、標準モジュール、変数、定数、およびプロシージャの名前に日本語の文字を使用することができません。

    ちゃんと調べていなかったので知らなかった。普通に使えていたので意外。

例外処理について

例外処理について参考になりそうなサイトを見つけたのでメモ。

例外処理の基本がここに書かれている。

  1. 実行エラーと業務エラーを区別する。
  2. 致命的ではない特定の例外を、必要な場所に絞って捕捉し、業務エラーにする。
  3. 集約例外ハンドラで例外が発生したときの後処理をする。

良い指針になると思ったので、これからはこれでやっていこうと思う。
あと、業務エラーの渡し方についてもイマイチ定まってなかったので、とりあえずここの Result クラスを作るパターンをマネしてます。
全部やっちゃうとクラスが爆発的に増えるので、使うべきところをちゃんと考えないと工数食ってしまうなぁ。