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 で
のような表を積み上げ棒グラフで
みたいな感じにしたいなぁ、と思って系列名を表示させると、
こんな風に値が 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
系列名を表示させたいグラフを選択してこのマクロを実行すれば、自動的に
こんな風にしてくれます。
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 を未だに使っているのだが、その命名規則で僕の職場では日本語を使うルールがある。
個人的には英語の方が好きなんだけど、理由もなく英語に言えないので、まずはできるだけ客観的にメリット/デメリットを書き出してみた。ちなみに、基本的に日本人しかコーディングしないのが前提です。
命名方法 | メリット | デメリット |
英語 |
|
|
日本語 ※ローマ字ではない |
|
|
なんだかどっちもどっちな感じ。まあ、大したものじゃないけどこれを参考にしてもらって、英語と日本語のどちらの方がうれしさがあるか職場のメンバーに考えてもらおう。 以下に日本語のデメリットでソースがあるものだけ置いておく。
- Visual Basic でプロジェクト名に日本語の文字を使用できない
http://support.microsoft.com/default.aspx?scid=kb;ja;418924Visual Basic では、プロジェクト、コントロール、フォーム モジュール、クラスモジュール、標準モジュール、変数、定数、およびプロシージャの名前に日本語の文字を使用することができません。
ちゃんと調べていなかったので知らなかった。普通に使えていたので意外。
- [ACC2003] 日本語名のプロシージャが実行できない
http://support.microsoft.com/default.aspx?scid=kb;ja;414234こっちは限定的なのでまだマシなのかな。
例外処理について
例外処理について参考になりそうなサイトを見つけたのでメモ。
- Scribbled Records
http://msyi303.blog130.fc2.com/
例外処理の基本がここに書かれている。
- 実行エラーと業務エラーを区別する。
- 致命的ではない特定の例外を、必要な場所に絞って捕捉し、業務エラーにする。
- 集約例外ハンドラで例外が発生したときの後処理をする。
良い指針になると思ったので、これからはこれでやっていこうと思う。
あと、業務エラーの渡し方についてもイマイチ定まってなかったので、とりあえずここの Result クラスを作るパターンをマネしてます。
全部やっちゃうとクラスが爆発的に増えるので、使うべきところをちゃんと考えないと工数食ってしまうなぁ。