公開中のソフトウェア

DicDB
オリジナル辞書・用語集を作成・閲覧するための
データベースソフトウェアです。

StanStop
指定したアプリケーションが起動している場合のみスタンバイや
スクリーンセーバーを一時的に抑止するソフトウェアです。

2017年12月10日

COMを使ったMicrosoft Wordの文字列置換(HSP)

Microsoft Wordの文字列置換をHSPから試してみました(2パターン)。
既存Wordファイル(DOC/DOCX)内の文字列を置換して別名で保存という例です。

(1) Excel VBAのVBScriptをHSP Script上で実行する
Excel VBAからVBScriptを実行することで、Wordの置換処理が可能です。
そこでVBScriptとしてHSP Script上で実行したのが下記のScriptです。
こちらのページを参考にしました。

onexit *exit

;DOCファイル
doc_path="C:\\HSP\\Sample.doc"
old="テスト" ;検索ワード
new="Test" ;置換ワード

;VBScript
newcom objVBsc, "ScriptControl"
objVBsc("Language")="VBScript"

vbs="Sub vbcmd()\n"
vbs+="Const wdReplaceAll = 2\n"
vbs+="Set objWord = CreateObject(\"Word.Application\")\n"
vbs+="objWord.Visible = True\n"
vbs+="Set objDoc = objWord.Documents.Open(\""
vbs+=doc_path
vbs+="\")\n"
vbs+="Set objSelection = objWord.Selection\n"
vbs+="objSelection.Find.Text = \""
vbs+=old
vbs+="\"\n"
vbs+="objSelection.Find.Forward = TRUE\n"
vbs+="objSelection.Find.MatchWholeWord = TRUE\n"
vbs+="objSelection.Find.Replacement.Text = \""
vbs+=new
vbs+="\"\n"
vbs+="objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll\n"
vbs+="End Sub\n"

mes vbs
objVBsc->"AddCode" vbs
objVBsc->"Run" "vbcmd"
stop

*exit
delcom objVBsc
end


一応実行はできますが、コードがコメント化されるのでわかりにくいのと
置換ワードに改行が入れられないという問題があります。

(2) COMコンポーネントを使ってHSP Script上で実行する
そこで、HSPから扱えるCOMコンポーネントを利用してみます。
下記のScriptでは置換したファイルを別ファイルに保存するようにしています。
Office2003とOffice2010のWordで動作を確認しました。

onexit *exit

;DOCファイル
doc_path="C:\\HSP\\Sample.doc"
save_path="C:\\HSP\\Sample_save.doc"
old="テスト" ;検索ワード
new="Test" ;置換ワード

newcom pWord,"Word.Application"
pWord("Visible")=1
pWord("DisplayAlerts")=0

;Documents.Open
pDocments=pWord("Documents")
pDocments->"Open" doc_path

;Selection.Find
pSelection=pWord("Selection")
pFind=pSelection("Find")
pFind("Text")=old
pFind("Forward")=1
pFind("MatchWholeWord")=1
pRep=pFind("Replacement")
pRep("Text")=new
pFind->"Execute",,,,,,,,,,2

;Documents.Save
pActiveDoc=pDocments("Item",1)
pActiveDoc->"SaveAs" save_path

;Word終了
pWord->"Quit"

*exit
delcom pWord
delcom pDocments
delcom pSelection
delcom pFind
delcom pRep
delcom pActiveDoc
end

posted by xorbit at 17:22| Comment(0) | Programming | このブログの読者になる | 更新情報をチェックする

2016年04月24日

GetOpenFileName

DicDB Version 1.09で行った修正ではファイルのオープン・セーブダイアログの
起動フォルダを固定しようとしたのですが、実際はうまくいっていないことが
分かりました。

たとえば、ユーザーフォルダ以外のフォルダからファイルを開くと、
次回はそのフォルダが起動フォルダになってしまいます。

ファイルオープンではAPI「GetOpenFileName」を使用しているのですが、
起動フォルダとして指定しているlpstrInitialDirが起動フォルダにならず。

そこで、調べてみると(MSDNより引用)

The initial directory. The algorithm for selecting the initial directory varies on different platforms.

Windows 7:
1.If lpstrInitialDir has the same value as was passed the first time the application used an Open or Save As dialog box,
the path most recently selected by the user is used as the initial directory.
2.Otherwise, if lpstrFile contains a path, that path is the initial directory.
3.Otherwise, if lpstrInitialDir is not NULL, it specifies the initial directory.
4.If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
5.Otherwise, the initial directory is the personal files directory of the current user.
6.Otherwise, the initial directory is the Desktop folder.

どうやらWindows7とそれ以前(XP)では起動フォルダの決まり方が違うようです。

Windows7ではファイル選択ダイアログで一度でも開いた場合には
そのフォルダの情報がレジストリに記憶され、次回オープン時に
参照され、起動フォルダになるようです。
一方、仮想環境で実行したWindows XP上では問題なく動作することを確認できました。
DicDB_XP.png
起動フォルダの仕様については、とりあえず現行のままにしておこうと思います。

posted by xorbit at 00:12| Comment(0) | Programming | このブログの読者になる | 更新情報をチェックする

2015年11月11日

ネットワーク上のファイル・フォルダ存在チェック

HSPスクリプトでファイル・フォルダが存在していることを
チェックするのにそれぞれexist命令・dirlist命令を使うことが
できます。

・ファイル存在チェック
path="C:\\Windows\\notepad.exe"
exist path
if strsize>0{
dialog "ファイル有り"
}
else{
dialog "ファイル無し"
}
stop

・フォルダ存在チェック
path="C:\\Windows" ;C:\\Windows\\だと取得できないので注意
dirlist list,path,5
if stat=1{
dialog "フォルダ有り"
}
else{
dialog "フォルダ無し"
}
stop

ネットワーク上(例えばコンピューター名(IPアドレス)\\フォルダ という形式)の
ファイルやフォルダをチェックしてみたのですが、
ファイルチェックexist命令はOK、フォルダチェックdirlist命令はNGでした。

そこでAPIのPathFileExistsを使うことで解決しました。
PathIsDirectoryも使えます。

#uselib "SHLWAPI.DLL"
#cfunc global PathFileExists "PathFileExistsA" sptr

path="\\\\コンピューター名\\フォルダ名\\"
if PathFileExists(path)=0{
dialog "フォルダ無し"
}
else{
dialog "フォルダ有り"
}
stop


(追記) PathFileExistsだと拡張子無しファイルも認識してしまうので
PathIsDirectoryと併用するのがよさそうです。

#uselib "SHLWAPI.DLL"
#cfunc global PathFileExists "PathFileExistsA" sptr
#cfunc global PathIsDirectory "PathIsDirectoryA" sptr

path="\\\\コンピューター名\\フォルダ名\\"
if PathFileExists(path)=0{
dialog "存在しない"
}
else{
if PathIsDirectory(path)=0{
dialog "拡張子なしファイル有り"
}
else{
dialog "フォルダ有り"
}
}
stop


posted by xorbit at 00:47| Comment(0) | Programming | このブログの読者になる | 更新情報をチェックする