<   2011年 07月 ( 30 )   > この月の画像一覧
VBScriptのModの結果は小数点以下を返さない!?
VBScriptで下記のようなコードを書きました。
MsgBox 1.5 Mod 1

しかし、表示されるのは 0 です。

本来なら、0.5 とならないといけないですが。。。

Mod 演算子を見たら驚愕の事実が。。
結果が浮動小数点数の時は整数に丸められるようですorz

整数かどうか判断するのに使いたかったのですが、ダメですね。
どうやらVB6でも同様のようです。


結局下記のように値を増やして対応するしかないですかね。。
MsgBox 1.5*1000 Mod 1000

これでも、小数第四位より深い桁以降は判定できなくなりますが。。。
[PR]
by jehoshaphat | 2011-07-10 23:20 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
VBScriptは型宣言ができない!?
VBScriptで下記のように書いてみました。

Dim str As String
str= "hogehoge"
MsgBox str

すると、「ステートメントの末尾が不正です。800A0401」というエラーが。。。

下記のようにすると、うまく走りました。

Dim str
str= "hogehoge"
MsgBox str

どうやら、VBScriptでは型宣言ができないようです。
型の概念はあるのに宣言できないとは変な話です。。。
VBScriptやVB6は宣言と同時の初期化もできず不便ですね。
特にInputBoxで数字を入力させる場合、文字列として入ってくるので手動でキャストしてやる必要があります。

参考:
型宣言はないが変数には型がある
[PR]
by jehoshaphat | 2011-07-10 23:18 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
VBScriptで配列宣言時に要素数を変数で指定したい
VB.NetやC系言語だと、下記のように配列宣言時に要素数を変数で指定できます。

Dim i As Integer
i = 3
Dim ary(i)

しかし、VBScriptだと配列宣言時に要素数を変数で指定できません。(VB6も?)
なので、とりあえず空の配列を定義し、ReDimで要素数を変更するという手段を取らざるをえません。
こんな感じです。

Dim i As Integer
i = 3
Dim ary()
ReDim ary(i)

C系になれると扱いずらい VBScript です。
[PR]
by jehoshaphat | 2011-07-10 23:17 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(WSH)VBScript(またはVB6)でAndAlsoをどうすればよいか?
VB.NetやC系言語,Javaでは論理演算子として AndoAlso,OrElse(VB.Net) , &&,||(C,Java) を一般的に使います。
AndAlso,&& は左辺を評価して false なら右辺は評価しません。
OrElse,|| は左辺を評価して true なら右辺は評価しません。

この演算子はショートサーキット演算子(短絡演算子)と呼ばれるらしく、処理速度を上げたり、ソースを見やすくする上で役立ちます。

しかし、VB6やVBScriptにはこのショートサーキット演算子は使えません。
なので下記のように文字列変数 x が整数の0~10の値かどうかというのを判定するのには、AndAlso が使えないので、下記のようにIF分をネストして書かないといけません。


If IsNumeric(x) Then '数字か
If x Mod 1 = 0 Then '整数か
If x <= 10 Then '10以下か
If x >= 0 Then '0以上か
'正しい処理
Else
MsgBox "設定した値に誤りがあります"
End If
Else
MsgBox "設定した値に誤りがあります"
End If
Else
MsgBox "設定した値に誤りがあります"
End If
Else
MsgBox "設定した値に誤りがあります"
End IF

(上記は実は、Mod のところや x<=10 , x>=0 は And 演算子でまとめられますが、例ということで。。。)



ネストしまくると非常に見にくいので見やすい方法ないかなとおもって探すと、If AndAlso や OrElse の代替方法 でいい方法がありました。
下記のような感じになります。

If Not IsNumeric(x) Then
MsgBox "設定した値に誤りがあります"
ElseIf x > 10 Then
MsgBox "設定した値に誤りがあります"
ElseIf x Mod 1 <> 0 Then
MsgBox "設定した値に誤りがあります"
ElseIf x < 0 Then
MsgBox "設定した値に誤りがあります"
Else
'正しい処理
End If

条件が逆になります。つまり間違いとなる条件を書くわけですね。
ただ、この方法にしても行が長くなるのはいたし方ありません。エラーメッセージを何度も書かないといけませんしね。(このへんはエラー表示関数とかでカバーする必要がありますが。。)

ちなみに、VB.Netだと AndAlso 使ってこう書けます。

If IsNumeric(x) AndAlso x Mod 1 = 0 AndAlso x <= 10 Then AndAlso x >= 0 Then
'正しい処理
Else
MsgBox "設定した値に誤りがあります"
End If



参考:
VBの And Or 演算子はショートサーキットしない | tk-engineering.com Technical blog:
(vb.net)VB.Net、VB2005で変わった点1
[PR]
by jehoshaphat | 2011-07-10 23:16 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(OpenOfficeBasic)印刷プレビューかどうかを判断する
OpenOffice3.2のマクロ(Basic)で、現在のビューが印刷プレビューかどうかを判断する方法です。
自力では難しそうだったので、ググったら OOobbs2/142 でどんぴしゃな方法が載っていました。

100%コピペなコードですが、転載させてもらいます。

Function IsPrintPreview( oDoc ) As Boolean
Dim bPreview As Boolean
sViewInterface = ""
oModMgr = CreateUnoService( _
"com.sun.star.frame.ModuleManager")
sModule = oModMgr.identify(oDoc)

Select Case sModule
Case "com.sun.star.text.TextDocument"
sViewInterface = "com.sun.star.view.XViewSettingsSupplier"
Case "com.sun.star.sheet.SpreadsheetDocument"
sViewInterface = "com.sun.star.sheet.XSpreadsheetView"
Case Else
sViewInterface = ""
End Select

If sViewInterface <> "" Then
oController = oDoc.getCurrentController()
bPreview = NOT HasUnoInterfaces(oController, sViewInterface)
End If

IsPrintPreview = bPreview
End Function

この関数の引数に、ThisComponent を渡すと、印刷プレビューかどうかが true,false で返ってくるので、これで判別できます。
[PR]
by jehoshaphat | 2011-07-10 23:13 | OpenOffice | Trackback | Comments(0)
(OpenOffice)メニューバーのフォントが汚い
WindowsXPでOpenOffice3.2を使ってますが、OpenOfficeのメニューバーのフォントが小さくつぶれた用に汚く見える現象が出ています。

下記のような感じです。
e0091163_22571791.jpg

で、調べると解決策として、Windowsの画面のプロパティから、フォントを設定する方法(デザインの詳細で、メニューのフォントをTahomaからMS UI Goshicにする)と、OpenOfficeの設定でフォントを置換する方法とがありました。

Windowsのデザインは変えたくなかったので、後者の方法を試してみました。

OpenOfficeのメニューバーの ツール → オプション → OpenOffice.org → フォント で、置換テーブルを使用 にチェックを入れ、Tahoma を MS UI Goshic に置換するようにし、リスト追加後 常に にチェックを入れて、OKを押下します。

しかし、見やすい MS UI Goshic にはなったのですが、今度は下記のように小さすぎてつぶれており、やはり見やすくありません。
e0091163_22573686.jpg


Windowsの画面のプロパティ デザインの詳細で、メニューのフォントサイズを8ptから9ptにすれば、きれいに見えるのですが、今度はスタートメニューの英字等が一回り大きくなり個人的に気に入りません。


で、いろいろ試した結果、置換テーブルで MS UI Goshicにした後、OpenOfficeのメニューバーの ツール → オプション → OpenOffice.org → 表示 で、ユーザインタフェースの倍率を 110% にするとWindowsのデザイン設定変更しなくても下記のようにいい感じになりました。
e0091163_22575981.jpg


本来は、Windowsデザインの設定でTahoma 8pt にしてても、WindowsServer2003R2でフォントが小さく見ずらい所があるで書いたように、日本語の場合はシステムフォントが使われるはずなんですが、どうもOpenOfficeはそうじゃないようです。。。
UIって大事ですね。

参考:
OpenOfficeのメニューフォントの変更方法 Windowsのデザインからフォントを設定する方法ですね。
OpenOfficeのフォントが汚い 置換テーブルを使ってフォントを変更する方法です。
[PR]
by jehoshaphat | 2011-07-10 23:05 | OpenOffice | Trackback | Comments(0)
(OpenOffice,Excel)二つの日付の経過(期間)を求める
年齢計算や経過日数を求めたい場合があります。

その場合、Excelだと、DATEDIF 関数使うと有用なようです。

書式は下記の通りです。

=DATEDIF(開始日,終了日,単位)

単位は下記のようになるようです。

"Y" 指定した期間の年数(満年数)を表示
"M" 指定した期間の月数(満月数)を表示
"D" 指定した期間の日数(満日数)を表示
"YM" 指定した期間の1年に満たない月数を表示
"MD" 指定した期間の1ヶ月に満たない日数を表示
"YD" 指定した期間の1年に満たない日数を表示


しかし、この DATEDIF 関数はLotus1-2-3との互換性を保つために用意されている隠し関数(関数ウィザードやヘルプにもない)なので、OpenOffice.org の Calc には存在しません。

Calcで DATEDIF 関数を代用しようとするには、DAYS関数・MONTHS関数・YEARS関数が有用なようです。

例えば、経過年数を求めるときは、YEARS関数を使います。
例:
=YEARS((開始日,終了日;0)
(Excelの =DATEDIF(A2,B2,"y") と同じ意味)


参考:
DATEDIF関数で期間の計算
DATEDIF関数の代用
関数のトラブル
[PR]
by jehoshaphat | 2011-07-10 22:45 | OpenOffice | Trackback | Comments(0)
XPでスタートメニューの自身で追加した項目が削除できない
XPのスタートメニューで自身で追加した項目があります。

下記図の丸で囲んでる部分です。
e0091163_2240343.jpg

それを右クリックから消そうとしても、消えない現象が発生しました。

そういう場合の削除方法としてはレジストリから消す方法があるようです。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartPage\

上記パスの中の、「Favorites」という項目を消して、再起動すればいいようです。


参考:
OKWave:スタートメニューの項目が削除できない
[PR]
by jehoshaphat | 2011-07-10 22:44 | 豆知識 | Trackback | Comments(0)
EXEがファイルが実行できない
とあるPCで、どのプログラムを実行しても、同じプログラムが実行されてしまうという現象が発生したというので相談がありました。

たしかに、ショートカットを実行してもEXE本体から起動しても同じ動画ダウンロードのソフトが実行されます。
Windowsにログインすると、スタートアップに登録されている全てのEXEも、同じ動画ダウンロードのソフトとして起動されます。

ウイルスかと思い、HDDを別PCでチェックしましたが、問題はありませんでした。

別ユーザでログインすると、問題なくそれぞれのプログラムが起動しました。

どうやら、問題のあるユーザで、EXEの関連付けをその動画ダウンロードアプリケーションしてしまったようです。
レジストリエディタを立ち上げようとしても、ダメです。


解決策は、すべてのプログラム(EXE,LNKファイル)を実行できないに載っていました。

まず、問題のユーザでログインし、[ファイル名を指定して実行]を起動します。
そして、コマンドプロンプトを起動するわけですが、"cmd" とすると動画ダウンロードソフトが起動してダメでした。
しかし、"command" とすると、コマンドプロンプトが立ちあがりました。

たしか "command" はWindows9x系の時に使ってた気がするんですが、XPでも使えるとは驚きでした。

後は下記のようなコマンドを打ち込んで、exeの関連付けを元に戻します。

accoc .exe=exefile
ftype exefile="%1% %*

assocコマンド
ftypeコマンド

コマンドプロンプトが立ち上がると、そこから "regedit" でレジストリエディタを起動することができました。
レジストリの下記を消すことでも解決できるようです。

HK_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.EXE

試しに、フォルダオプションからEXEの関連付けをテキストファイルにしたところ、上記のキーではなく下記キーが書き変わってました。

HK_CLASSES_ROOT\.exe
の(既定)のデータが txtfile

この場合(既定)のデータを exefile にすることで解決できました。
[PR]
by jehoshaphat | 2011-07-10 22:37 | 豆知識 | Trackback | Comments(0)
(ツール)Webアプリ自動生成ツール Tuigwaa がすごい
よく現場であるのが、スプレッドシート(表計算)を共有して、複数人で同時に作業したいという要望です。
Excelだったら共有モードを使うといいのですが、共有になると使えなくなる機能が出てきます。
また、スプレッドシートは自由度が高すぎるため、複数人で同時に編集すると必要なセルを消したりなどのトラブルになる可能性もあります。


当初、無償で使え自社内サーバに配備して、WEBアプリケーションで共同作業(同時編集)できるスプレッドシートアプリを探していたのですが、なかなか見つかりませんでした。(ちょうど、Google Documents や Microsoft Office Web Apps のローカル版です。データは自社内に置いておきたいので。。)

下記が調査したアプリの結果です。

●ASTERIA Spreadsheet Server OnSheet
http://www.infoteria.com/jp/asteria/product/w_option08.php
OnSheet単体は有料のSaasサービス。
ASTERIA Spreadsheet Server OnSheetだと社内サーバに設置可能。
価格は不明だが、有償なので、却下。

●Think Free てがるオフィス
http://www.thinkfree.co.jp/common/main.tfo
パッケージ版、オンライン版がある。
オンライン版は無料だが、データはすべてあちら側のサーバになる。
1ファイル同時編集できないので、意味なし。
コンシュマー向けの要素強く感じる。

●ThinkFree Server Standard
上記のThinkFreeおてがるオフィスのサーバ版。ということで自社内に設置はできそうだが、有償。1ユーザ$30/年。日本語対応はしてるようであるが、公式サイトは英語。
Tomcat上で動く。
Simple Spreadsheet
http://sourceforge.jp/projects/freshmeat_simplespreadsheet/
無償で、自前サーバに設置可能。(PHP)
しかし、手元にあるCSVを編集するような目的にしか使えそうない。
同時編集もできなさそう。

●ZK Spreadsheet
http://www.zkoss.org/download/zkspreadsheet.dsp
無償で、自前サーバに設置可能。(Tomcat)
サーバ上にファイル保存できるようだが、リアルタイムに同時変更点を反映することはできなさそう。一旦保存して、再度開かないと他人の変更点は反映されないので、同時編集には不向き。
UIはAjaxを使っており、見やすいが、英語Only

●TOMUSS
http://www710.univ-lyon1.fr/~exco/TOMUSS/home.html
Python上で動く。複数人で同時に編集するために作られた。
無償。機能的には要件にあっているが、起動になぜか失敗し、テストできない。非常に残念。WEBサーバ内蔵。
フランス産。

唯一TOMUSSというのが要件をみたそうだったんですが、起動に失敗し評価できませんでいた。

で、さらに探しているとスプレッドシートではないのですが、手軽にWEBアプリケーションを作成できる Tuigwaa (トゥイガー) というのを見つけました。
特著は下記のような感じです。

●Tuigwaa
http://tuigwaa.sandbox.seasar.org/start/download.html
Tomcat上で動く。Seaserフレームワーク使用。
無償。オープンソース。
スプレッドシートというよりは、DB連携WEBアプリケーション作成ツール。
超小規模のDBを使ったデータ共有向け。排他制御はロックはしないようなので後勝ち。


これを使うと、簡単な共有データベースアプリケーションが作れそうです。
特に、大きな基幹システムはシステム化されても、それを補助するツールは表計算ソフトや簡易データベースが多く、それらは大抵共有が想定されていません。(つまりスタンドアロン向け)
そのような場合に、このTuigwaaは有用みたいです。

使ってみた印象は、 Wiki + サイボウズ デヂエ 簡易版のような感じです。



Tuigwaaは日本製で、日本発のJ2EEフレームワークSeasarプロジェクトの一環として開発されていたようです。
"開発されていた"と書いたように、現在は、新機能開発を停止しています。IPAの未踏ソフトウェア創造事業に採択されたのに、開発停止とは残念ですね。

しかし、それでも十分使えるソフトウェアです。

具体的にまず、サイトという Tuigwaa 内のWEBアプリケーション単位を作成し、DBのテーブルを構成後、フォームでユーザからの入力画面を作っていく感じです。

荒削りな感はしますが、プログラマでないユーザであっても簡単にデータベースに連動したアプリケーションを作成、管理できるように仕上がっており、それがオープンソースなのは非常に評価できると思います。

Tomcat同梱版もあるので、それを使えば容易にサーバ立てれるのも魅力ですね。


参考:
マイコミジャーナル:【連載】セカイ系ウェブツール考 (50) 表計算/データベースアプリも"Web化"の時代に
マイコミジャーナル:【ハウツー】これはすごい! ブラウザのみでDB連携サイト構築Tuigwaa、話題のSeasarから (1) 簡単Tuigwaa
誰でも作れるデータベースアプリケーション「Tuigwaa」 | MOONGIFT
Tuigwaa Docs - Reference:
[PR]
by jehoshaphat | 2011-07-10 22:25 | ツール | Trackback | Comments(0)