2009年6月13日 (土)

DateAdd関数で1月ごを求めるのに

VBAでDateAdd関数を使って1月後を求めるには、
DateAdd("m",1,基準日) とする訳だが、基準日が月末の場合は単純に翌月を出すのではなく翌月の末日にしたいという状況もある(普通にDateAddで計算すると、例えば基準日が6月30日のときは7月30日が返ってきてしまう)。

 基準日が月末かどうかを調べて、月末の場合は2ヶ月後の初日の1日前を算出するような方法を考えてみた。月末かどうかは、基準日と基準日の1日後を比較して同じかどうかで判断する。

If Month(基準日)=DateAdd("d",1,基準日) Then
    一月後=DateAdd("m",1,基準日)
Else
    基準日の月の初日=DateSerial(Year(基準日),Month(基準日),1)
        1月後=DateAdd("m",2,基準日の月の初日)-1
EndIf

 分岐を使わずに一発で算出する方法ってないのかなあ?

| | コメント (0) | トラックバック (0)

2009年4月 8日 (水)

VMware Playerの「最近使った仮想マシン」のリストを消すには

VMware Player(Windows版)を開いたときの「最近使った仮想マシン」の表示を消す方法。

XPの場合
C:\Documents and Settings\《ユーザー名》\Application Data\VMware
Vistaの場合
C:\ユーザー\《ユーザー名》\AppData\Roaming\VMware\

preferences.iniを編集。

pref.mruVM0.filename =《ファイル名》
pref.mruVM0.displayname =《タイトル》

と対になっている行を削除。

| | コメント (0) | トラックバック (0)

2009年3月21日 (土)

SELECT CASE ステートメントって条件を複数列記出来たんだ

 いやあ、知りませんでした!VBAのSELECT CASEでCASEの条件をコンマで区切って複数列記できたんだあ。IF文でANDをつなげるより、これなら確かにスッキリしてるわ。

Select Jyoken
        Case 1
                ○○
    Case 2
                ○○
    Case 3
                ××
End Select

じゃなくって
Select Jyoken
        Case 1, 2
                ○○
    Case 3
                ××
End Select

でいいんだもんね。

| | コメント (0) | トラックバック (0)

VBAでSHELL関数の処理が終わるのを待つ方法

 shell関数を使うとVBAから簡単に別アプリケーションを実行することができるが、ただ実行するだけでそのアプリが終了するまで待ってくれたりはしない。Windows API関数を使えば終了を判断して次に進むのを制御できるようだ。

-------------------------------------------------------

API関数 GetExitCodeProcessとOpenProcess と定数 PROCESS_QUERY_INFORMATION を宣言

Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Public Const PROCESS_QUERY_INFORMATION = &H400

-----------------------------------------------

'shell関数の終了を待つプロシージャ
Dim hProcess As Long
Dim lpdwExitCode As Long
Dim dwProcessID As Long
Dim retVal As Long

dwProcessID = Shell(実行するアプリを記述)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)
Do
    retVal = GetExitCodeProcess(hProcess, lpdwExitCode)
    DoEvents
Loop While lpdwExitCode<>0 ← shell関数で実行したアプリが終了するまでループ

| | コメント (0) | トラックバック (0)

2008年12月20日 (土)

apacheとproftpdのアクセス制限について

 久し振りにproftpd(RedHat9)の設定をいじくる機会があった。proftpdとapacheは設定ファイルの書式が似ているのだが、アクセス制限の記述方法が微妙に異なっていて少々混乱してしまった。

例えば、IPアドレス192.168.1.10のみ許可し、それ以外全てを拒否する場合は、

apache(httpd.conf)だと

order deny,allow
deny from all
allow from 192.168.1.10

または

order allow,deny
allow from 192.168.1.10

となる。order deny,allowだとdenyを先に評価しdenyに記述があるかallowに記述があれば許可。order allow,denyの場合はallowを先に評価しallowに記述がないかdenyに記述があれば拒否。

ところがproftpd(proftpd.conf)では

order allow,deny
deny From all
allow from 192.168.1.10

または

order deny,allow
allow from 192.168.1.10

と、orderの順番が逆になる。order deny,allowであればdenyを先に評価しdenyに記述があれば拒否、denyに記述がない場合にallowにあれば許可(どちらにも記述がない場合は拒否)。order allow,denyのときはallowを先に評価しallowに記述があれば許可、allowに記述がなければdenyを見て記述があれば拒否(どちらにも記述がない場合は許可)。

 ううーん、ややこやしい。

| | コメント (0) | トラックバック (0)

2008年11月16日 (日)

Findメソッドによる検索についての注意点(EXCEL VBA)

 Findメソッドを使用して検索を行うコードが検索データを拾ってくれないという状況にぶち当たったためいろいろ試行錯誤してみたこところ、結合セルに問題があることが分かった。
 Findメソッドでの検索では、検索範囲に結合セルが含まれる場合は、結合されているセルを全て検索範囲としないと正しく動作しないようなのだ。

 例えば、A1からC1までが結合セルとなっており以下の行も同様に結合されたシートのA1からA10までを検索範囲としたいときに、
Range("A1:A10").Find(検索値) としてもヒットしてくれない。
Range("A1:C10").Find(検索値) でないと正しく検索されないようだ。
 同様に、行方向にセルが連結されている場合も結合された行までを検索範囲とする必要がある模様。

| | コメント (0) | トラックバック (0)

2008年11月13日 (木)

Anthy(続)

 Anthyを使えるようにしたものの、VNCで外部から接続したらダメだった。cannaを止めているので全く日本語入力ができなくなってしまっている。VNC用にはもっと設定をしなければいけないようだ。それで追加で調べてみたら、

 VNCで外部からリモートデスクトップを利用する場合はVNCサーバーの設定も変更する必要がある。
VNCサーバーを起動するユーザーのホームディレクトリの.vncディレクトリにあるxstartupに以下の記述を追加
 
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
export XMODIFIERS="@im=SCIM"
gnome-session &

 VNCサーバーを起動し直してVNCビューワーで接続するとAnthyが使用可能になった。
 
 scim -d & の記述も必要である旨の記事も見かけたが、自分の環境では不要であった。

| | コメント (0) | トラックバック (0)

2008年11月12日 (水)

日本語入力システムをAnthy+SCIMに変更

 日本語入力システムを、デフォルトのcanna+iiimからAnthy+SCIMに変えてみた。例によって、その時のメモ。

 通常の設定ではAnthyをyumでインストールできないので新たにリポジトリを追加する。必要なものは下記の2つ。

# cd /etc/yum.repos.d/
# wget http://centos.karan.org/kbsingh-CentOS-Extras.repo
# wget http://centos.karan.org/kbsingh-CentOS-Misc.repo

続いてGPGキーをインポート。

# rpm --import http://centos.karan.org/RPM-GPG-KEY-karan.org.txt

AnthyとSCIMをインストール。

# yum -y install anthy scim scim-anthy

scim-libs scim kasumi anthy scim-anthy の5個のパッケージがインストールされた。

入力メソッドの入替えを行なう。

# /usr/sbin/alternatives --config xinput-ja_JP

5 プログラムがあり 'xinput-ja_JP'を提供します。

  選択       コマンド
-----------------------------------------------
   1           /etc/X11/xinit/xinput.d/iiimf
   2           /etc/X11/xinit/xinput.d/kinput2-canna
   3           /etc/X11/xinit/xinput.d/kinput2-wnn
   4           /etc/X11/xinit/xinput.d/skkinput
*+ 5           /etc/X11/xinit/xinput.d/scim

Enterを押して現在の選択[+]を保持するか、選択番号を入力します:

既にscimが選択されていたのでEnterで抜ける。

iiimとcannaを停止し次回から自動起動しないように設定。

# /etc/init.d/iiim stop
# chkconfig iiim off
# /etc/init.d/canna stop
# chkconfig canna off

 この後ログインし直すことでAnthyが使えるようになった。

| | コメント (0) | トラックバック (0)

2008年11月 1日 (土)

九十九電機が

 あの九十九電機が民事再生法申請をしたそうだ。昔からずいぶんお世話になった店だっただけに、少なからず感慨が。パソコン草創期からの老舗で、特にSHARPのパソコンには力を入れてくれていたものだ。X68000を購入したのも(懐かしい)九十九だったし、その後もあれこれとオプション品を買ったしなあ(熊さん、今頃どうしているんだろうか)。

 時代の移り変わりを実感させられるニュースでした。

| | コメント (0) | トラックバック (5)

2008年10月30日 (木)

指定したセルが選択されているかどうかを調べる(EXCEL VBA)

 指定したセルが選択されているかどうかを調べ、選択されていればその行に対して何らかの処理を行うというような要件が発生した。Rangeプロパティにそれを判断できるものがあるだろうと思ったのだが、全然見つからない。逆に選択範囲を調べる方法はいくつかあるようなのだが。

 ということで、逆の逆を考えればと考え付いたのがこれ。
 選択範囲を求めるSelection.Address とIntersectメソッドを使って、選択範囲が指定セルと重なるかどうか判断することで実現できるわけだ。

 選択範囲と指定セルを引数としたIntersectメソッドの戻り値がNothingのときは未選択、そうでなければ選択されていることとなる。
 以下は、指定セルがA10の場合のサンプル。

Dim SelectArea As String
Dim TargetCell As Range

SelectArea = Selection.Address
Set TargetCell = Range("A10")

If Intersect(Range(SelectArea), TargetCell) Is Nothing Then
    'この場合は未選択の状態
Else
    'こちらで選択されている場合の処理
End If

| | コメント (0) | トラックバック (0)

«ローカルエリア接続のプロパティ表示が変!