タグ:SE♂のノウハウ ( 90 ) タグの人気記事 > Z_ ̄∂
[VBScript] TextBox > Z_ ̄∂
どーもボキです。

RadioGroupBoxやMessgeDlgを応用したTextBox。

a0021757_12270939.png

a0021757_12271868.png

利用時の注意
 ONCLICKをonlickと変換すること。

Option Explicit

msgbox TextBox("タイトル","キャプション","文字A" &vbTAB& ":" &vbCRLF & "文字B" &vbTAB& ":" & vbCRLF& "文字C" &vbTAB& ":")
'-----------------------------------------------------------------------------------------
' sTitle : タイトル
' sCaption : メッセージ
' sText : 表示するテキスト
Function TextBox(sTitle, sCaption, sText)
Const cRegName = "HKCU\Software\Microsoft\Internet Explorer\LinksExplorer\Docked"
Dim objWS,objIE,ieDoc
Dim i,s,r,ireg,html

' レジストリ修正 > エクスプローラバーを非表示
On Error Resume Next ' Dockedなし
Set objWS = CreateObject("WScript.Shell")
ireg = objWS.RegRead(cRegName)
objWS.RegWrite cRegName, 0, "REG_DWORD"
On Error GoTo 0 'エラー無視を解除

' IEを起動
Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate "about:blank"

' タグ記述
html = "<BODY><TABLE ID=Tbl BORDER=0>" &_
"<TR><TD ALIGN=Left VALIGN=Top><SPAN>" & Replace(sCaption,vbCRLF,"<BR>") & "<BR><BR></SPAN>" & _
"<FORM NAME=Form>" & _
"<INPUT TYPE=HIDDEN NAME=Button VALUE=-1><textarea name=text rows=16 cols=64>"&sText&"</textarea>" & _
"<BR></TD></TR><TR><TD ALIGN=Center VALIGN=Bottom>"&_
"<INPUT TYPE=BUTTON VALUE="" OK "" ONCLICK=Form.Button.value="& vbOK &"> " & _
"<INPUT TYPE=BUTTON VALUE=""キャンセル"" ONCLICK=Form.Button.value="& vbCancel &">" & _
"</TD></TR></FORM></TABLE></BODY>"

' ↓↓共通↓↓
Set ieDoc = objIE.Document
ieDoc.Body.InnerHtml = html
ieDoc.Title = sTitle
objIE.ToolBar = False ' 上ツールバーを隠す(AddressBar,MenuBarも非表示となる)
objIE.StatusBar = False ' ステータスバーを隠す
ieDoc.Body.RuntimeStyle.OverflowX = "hidden" ' 横 スクロールバーを隠す
ieDoc.Body.RuntimeStyle.OverflowY = "hidden" ' 縦 〃
objIE.Width = ieDoc.All.Tbl.clientWidth +50 ' 幅 サイズ調整
objIE.Height = ieDoc.All.Tbl.clientHeight +70 ' 高 〃
objIE.Left = Int((ieDoc.parentWindow.screen.availwidth -objIE.Width )/2) ' 左 位置調整
objIE.Top = Int((ieDoc.parentWindow.screen.availheight-objIE.Height)/2) ' 上 〃
For i = 0 To objIE.Width
ieDoc.Title = ieDoc.Title +" " ' - Microsoft Internet Explorerを隠す
i = i +10
Next
ieDoc.Body.bgcolor = "ButtonFace" ' 色
objIE.Visible = True ' ウィンドウ表示
objIE.Resizable = False ' ウィンドウサイズ固定 ※表示前に実行すると縁にゴミ画像が残る
' ユーザ操作取得
On Error Resume Next ' エラー無視 ([×]終了対応)
r = -1
Do While r = -1
WScript.Sleep 100
r = CInt(ieDoc.Form.Button.value)
If objIE = Null Then Exit Do
Loop
objIE.Visible = False
' ↑↑共通↑↑

' 値取得
If r = vbOK Then
r = ieDoc.Form.text.value
Else
r = ""
End If

objIE.Quit
Set objIE = Nothing

' レジストリ修正 > エクスプローラバーを元設定に戻す
objWS.RegWrite cRegName, ireg, "REG_DWORD"

On Error GoTo 0 'エラー無視を解除
TextBox = r
End Function

[PR]
by yozda | 2018-09-24 12:27 | SE♂日誌 | Trackback | Comments(0)
[VBScript] MessageDlg > Z_ ̄∂
どーもボキです。

MessageDlgの改良点

改良点
 ・サイドバー表示が有効な場合、関数内にて一時的にそれを無効とし、終了時に有効に戻すようにした。
 ・GetResolution関数の利用を廃止。

a0021757_12164198.png

a0021757_12122540.png

利用時の注意
 ONCLICKをonlickと変換すること。

Option Explicit

MsgBox MessageDlg("タイトル","キャプション" &vbCRLF& "01234567890123456789012345678901234567890123456789","Button0,Button1,Button2")
'-----------------------------------------------------------------------------------------
' sTitle : タイトル
' sCaption : メッセージ
' Items : アイテムリスト
' Index : デフォルト選択するアイテムインデックス
Function MessageDlg(sTitle, sCaption, Items)
Const cRegName = "HKCU\Software\Microsoft\Internet Explorer\LinksExplorer\Docked"
Dim objWS,objIE,ieDoc
Dim i,s,r,ireg,html

' レジストリ修正 > エクスプローラバーを非表示
On Error Resume Next ' Dockedなし
Set objWS = CreateObject("WScript.Shell")
ireg = objWS.RegRead(cRegName)
objWS.RegWrite cRegName, 0, "REG_DWORD"
On Error GoTo 0 'エラー無視を解除

If Not IsArray(Items) Then Items = Split(Items,",")

' IEを起動
Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate "about:blank"

' タグ記述
html = "<BODY><TABLE ID=Tbl BORDER=0 STYLE=font-size:10pt>" &_
"<TR><TD ALIGN=Left VALIGN=Top><SPAN>" & Replace(sCaption,vbCRLF,"<BR>") & "<BR><BR><SPAN>" & _
"<FORM NAME=Form>" & _
"<INPUT TYPE=HIDDEN NAME=Button VALUE=-1>" &_
"</TD></TR><TR><TD ALIGN=Center VALIGN=Center>"
' ボタン
html = html & "<INPUT TYPE=BUTTON VALUE=" & Items(0) & " ONCLICK=Form.Button.value=0>"
For i = 1 To UBound(Items)
html = html & " <INPUT TYPE=BUTTON VALUE=" & Items(i) & " ONCLICK=Form.Button.value=" & i & ">"
Next
html = html & "</TD></TR></FORM></TABLE></BODY>"

' ↓↓共通↓↓
Set ieDoc = objIE.Document
ieDoc.Body.InnerHtml = html
ieDoc.Title = sTitle
objIE.ToolBar = False ' 上ツールバーを隠す(AddressBar,MenuBarも非表示となる)
objIE.StatusBar = False ' ステータスバーを隠す
ieDoc.Body.RuntimeStyle.OverflowX = "hidden" ' 横 スクロールバーを隠す
ieDoc.Body.RuntimeStyle.OverflowY = "hidden" ' 縦 〃
objIE.Width = ieDoc.All.Tbl.clientWidth +50 ' 幅 サイズ調整
objIE.Height = ieDoc.All.Tbl.clientHeight +70 ' 高 〃
objIE.Left = Int((ieDoc.parentWindow.screen.availwidth -objIE.Width )/2) ' 左 位置調整
objIE.Top = Int((ieDoc.parentWindow.screen.availheight-objIE.Height)/2) ' 上 〃
For i = 0 To objIE.Width
ieDoc.Title = ieDoc.Title +" " ' - Microsoft Internet Explorerを隠す
i = i +10
Next
ieDoc.Body.bgcolor = "ButtonFace" ' 色
objIE.Visible = True ' ウィンドウ表示
objIE.Resizable = False ' ウィンドウサイズ固定 ※表示前に実行すると縁にゴミ画像が残る
' ユーザ操作取得
On Error Resume Next ' エラー無視 ([×]終了対応)
r = -1
Do While r = -1
WScript.Sleep 100
r = CInt(ieDoc.Form.Button.value)
If objIE = Null Then Exit Do
Loop
objIE.Visible = False
' ↑↑共通↑↑

objIE.Quit
Set objIE = Nothing

' レジストリ修正 > エクスプローラバーを元設定に戻す
objWS.RegWrite cRegName, ireg, "REG_DWORD"

On Error GoTo 0 'エラー無視を解除
MessageDlg = r
End Function


[VBScript] メッセージダイアログを実現する


[PR]
by yozda | 2018-09-24 12:18 | SE♂日誌 | Trackback | Comments(0)
[VBScript] RadioGropuBox > Z_ ̄∂
どーもボキです。

RadioGroupBoxの改良版です。

改良点
 ・サイドバー表示が有効な場合、関数内にて一時的にそれを無効とし、終了時に有効に戻すようにした。
 ・GetResolution関数の利用を廃止。

a0021757_12004880.png

a0021757_12122540.png

利用時の注意
 ONCLICKをonlickと変換すること。

Option Explicit

Const RadioGroupBox_MaxCount = 10
MsgBox RadioGroupBox("タイトル","キャプション" &vbCRLF&"01234567890123456789012345678901234567890123456789","アイテム0,アイテム1,アイテム2",1)
'-----------------------------------------------------------------------------------------
' sTitle : タイトル
' sCaption : メッセージ
' Items : アイテムリスト
' Index : デフォルト選択するアイテムインデックス
Function RadioGroupBox(sTitle, sCaption, Items, Index)
Const cRegName = "HKCU\Software\Microsoft\Internet Explorer\LinksExplorer\Docked"
Dim objWS,objIE,ieDoc
Dim i,s,r,ireg,html,bCmbBx

' レジストリ修正 > エクスプローラバーを非表示
On Error Resume Next ' Dockedなし
Set objWS = CreateObject("WScript.Shell")
ireg = objWS.RegRead(cRegName)
objWS.RegWrite cRegName, 0, "REG_DWORD"
On Error GoTo 0 'エラー無視を解除

If Not IsArray(Items) Then Items = Split(Items,",")

' IEを起動
Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate "about:blank"

' タグ記述
html = "<BODY><TABLE ID=Tbl BORDER=0 STYLE=font-size:10pt>" &_
"<TR><TD ALIGN=Left VALIGN=Top><SPAN>" & Replace(sCaption,vbCRLF,"<BR>") & "<BR><BR></SPAN>" & _
"<FORM NAME=Form>" & _
"<INPUT TYPE=HIDDEN NAME=Button VALUE=-1>"
bCmbBx = UBound(Items) >= RadioGroupBox_MaxCount-1
If bCmbBx Then
' コンボボックス
html = html +"<SELECT NAME=ComboBox size=" & RadioGroupBox_MaxCount &" style=width:100%>"
For i = 0 To UBound(Items)
If i = Index Then s = " selected" Else s = ""
html = html +"<OPTION value=" & i & s & ">" & Items(i) &"</OPTION>"
Next
s = s+"</SELECT>"
Else
' ラジオボタン
html = html +"<INPUT NAME=Radio TYPE=HIDDEN VALUE="& Index & ">"
For i = 0 to UBound(Items)
If i = Index Then s = " checked" Else s = ""
html = html +" <INPUT TYPE=RADIO Name=RG ONCLICK=Radio.value=" & i & s & ">" & Items(i) &"</INPUT><BR>"
Next
End If
html = html +"<BR></TD></TR><TR><TD ALIGN=Center VALIGN=Bottom>"&_
"<INPUT TYPE=BUTTON VALUE="" OK "" ONCLICK=Form.Button.value="& vbOK &"> " & _
"<INPUT TYPE=BUTTON VALUE=""キャンセル"" ONCLICK=Form.Button.value="& vbCancel &">" & _
"</TD></TR></FORM></TABLE></BODY>"
' ↓↓共通↓↓
Set ieDoc = objIE.Document
ieDoc.Body.InnerHtml = html
ieDoc.Title = sTitle
objIE.ToolBar = False ' 上ツールバーを隠す(AddressBar,MenuBarも非表示となる)
objIE.StatusBar = False ' ステータスバーを隠す
ieDoc.Body.RuntimeStyle.OverflowX = "hidden" ' 横 スクロールバーを隠す
ieDoc.Body.RuntimeStyle.OverflowY = "hidden" ' 縦 〃
objIE.Width = ieDoc.All.Tbl.clientWidth +50 ' 幅 サイズ調整
objIE.Height = ieDoc.All.Tbl.clientHeight +70 ' 高 〃
objIE.Left = Int((ieDoc.parentWindow.screen.availwidth -objIE.Width )/2) ' 左 位置調整
objIE.Top = Int((ieDoc.parentWindow.screen.availheight-objIE.Height)/2) ' 上 〃
For i = 0 To objIE.Width
ieDoc.Title = ieDoc.Title +" " ' - Microsoft Internet Explorerを隠す
i = i +10
Next
ieDoc.Body.bgcolor = "ButtonFace" ' 色
objIE.Visible = True ' ウィンドウ表示
objIE.Resizable = False ' ウィンドウサイズ固定 ※表示前に実行すると縁にゴミ画像が残る
' ユーザ操作取得
On Error Resume Next ' エラー無視 ([×]終了対応)
r = -1
Do While r = -1
WScript.Sleep 100
r = CInt(ieDoc.Form.Button.value)
If objIE = Null Then Exit Do
Loop
objIE.Visible = False
' ↑↑共通↑↑

' 値取得
If r = vbOK Then
If bCmbBx Then
r = ieDoc.Form.ComboBox.selectedIndex
Else
r = CInt(ieDoc.Form.Radio.value) ' 取得データは文字のため
End If
Else
r = -1
End If

objIE.Quit
Set objIE = Nothing

' レジストリ修正 > エクスプローラバーを元設定に戻す
objWS.RegWrite cRegName, ireg, "REG_DWORD"

On Error GoTo 0 'エラー無視を解除
RadioGroupBox = r
End Function


[VBScript] ラジオボタンダイアログを実現する その3


[PR]
by yozda | 2018-09-24 12:05 | SE♂日誌 | Trackback | Comments(0)
[VBScript] ワイルドカードを指定したファイル名サーチ > Z_ ̄∂
どーもボキです。

ニュースで英会話のバックアップでは、記事ごとに再生ボタンの表示高さ(Y座標)が異なり、
クリック位置の記録&調整に苦労した。

mp3を上書き更新とすることで、サイズ≠0で録音の成功を判断させた。

このときファイル名が「yymmdd_記事タイトル」となるため「記事タイトル」を固定できない。

FileExistsや、GetFileは、ファイル名をそのものを指定しければならず、記事タイトルを把握しないかぎり利用できない。

そのため、ワイルドカードを指定できるCopyFileやMoveFileを応用したファイル名取得関数「SearchFile」を作成した。
重複しない名前のフォルダへMoveし、そのMove先のファイル名を取得するようにしている。なお、戻り値は最後に見つかったファイル名としている。

' 指定したファイル名が存在するか調べる(ワイルドカードOK)
' 戻り値:見つかったファイル名
Function SearchFile(DirectoryPath, FileName)
Dim objFS,f,r,dpth

r = ""
Set objFS = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
dpth = DirectoryPath & Year(Now) & Month(Now) & Day(Now) & Hour(Now) & Minute(Now) & Second(Now)
objFS.CreateFolder(dpth) ' 重複しないフォルダを作成
objFS.MoveFile DirectoryPath & FileName, dpth &"\"
For Each f In objFS.GetFolder(dpth).Files
r = f.Name
Next
objFS.MoveFile dpth &"
\"& FileName, DirectoryPath
objFS.DeleteFolder dpth
On Error GoTo 0

SearchFile = r
End Function

[PR]
by yozda | 2018-04-15 09:30 | プログラミング | Trackback | Comments(0)
[VBScript] 半角カナを全角へ、全角記号&英数は半角へ変換する関数 > Z_ ̄∂
どーもボキです。

AdjustStringは
 ・半角カナ → 全角カナ
 ・全角記号 → 半角記号
 ・全角英数 → 半角数字
と変換する関数。

半角カナは、濁点(゛)や半濁点(゜)が別の文字となる、つまり、次の文字まで読まないと文字を確定できない。
そのため、今回はひとつの関数内で変換元の文字管理と変換処理を行った。

全角と半角とで文字の並びが統一されていなかったため、Case文処理が必須だったものの、可能な限り定型処理化した。
a0021757_12555734.gif
SetScriptHost("cscript")

s = "どーもボキです"
dprintf " 前:" & s
dprintf " 後:" & AdjustString(s)
dprintf ""

s = "http://yozda.exblog.jp"
dprintf " 前:" & s
dprintf " 後:" & AdjustString(s)
dprintf ""

s = "2004/05~"
dprintf " 前:" & s
dprintf " 後:" & AdjustString(s)
dprintf ""

' ===============================================================================
' 全角→半角
Function AdjustString(iStr)
Dim i,a1,a0,r,s,s0,s1

i = 1
r = ""
Do While i <= Len(iStr)
a1 = 1
a0 = 0
s0 = ""
s = Mid(iStr, i, 1)
r = s
If ( Asc(s) >= Asc("。") ) And ( Asc(s) <= Asc("゚") ) Then
' 半角カナ → 全角
Select Case s
Case "。" r = "。"
Case "ヲ" r = "ヲ"
Case "ッ" r = "ッ"
Case "ー" r = "ー"
Case Else
If Asc(s) >= Asc("゙") Then
s0="゙": s1="゛": a1=1
ElseIf Asc(s) >= Asc("ワ") Then
s0="ワ": s1="ワ": a1=4
ElseIf Asc(s) >= Asc("ラ") Then
s0="ラ": s1="ラ": a1=1
ElseIf Asc(s) >= Asc("ヤ") Then
s0="ヤ": s1="ヤ": a1=2
ElseIf Asc(s) >= Asc("ム") Then
s0="ム": s1="ム": a1=1
ElseIf Asc(s) >= Asc("マ") Then
s0="マ": s1="マ": a1=1
ElseIf Asc(s) >= Asc("ハ") Then
s0="ハ": s1="ハ": a1=3
If Mid(iStr, i+1, 1) = "゙" Then a0=1
If Mid(iStr, i+1, 1) = "゚" Then a0=2
ElseIf Asc(s) >= Asc("ナ") Then
s0="ナ": s1="ナ": a1=1
ElseIf Asc(s) >= Asc("ツ") Then
s0="ツ": s1="ツ": a1=2
If Mid(iStr, i+1, 1) = "゙" Then a0=1
ElseIf Asc(s) >= Asc("タ") Then
s0="タ": s1="タ": a1=2
If Mid(iStr, i+1, 1) = "゙" Then a0=1
ElseIf Asc(s) >= Asc("カ") Then
s0="カ": s1="カ": a1=2
If Mid(iStr, i+1, 1) = "゙" Then a0=1
ElseIf Asc(s) >= Asc("ア") Then
s0="ア": s1="ア": a1=2
ElseIf Asc(s) >= Asc("ャ") Then
s0="ャ": s1="ャ": a1=2
ElseIf Asc(s) >= Asc("ァ") Then
s0="ァ": s1="ァ": a1=2
ElseIf Asc(s) >= Asc("、") Then
s0="、": s1="、": a1=4
ElseIf Asc(s) >= Asc("「") Then
s0="「": s1="「": a1=1
End If
End Select
ElseIf ( Asc(s) >= Asc(" ") ) And ( Asc(s) <= Asc("z") ) Then
' 全角記号&英数 → 半角
Select Case s
Case " " r=" "
Case "," r=","
Case "." r="."
Case ":" r=":"
Case ";" r=";"
Case "?" r="?"
Case "!" r="!"
Case "^" r="^"
Case "_" r="_"
'Case "ー" r="-" ' 全角文字で利用するため半角変換しない
Case "―" r="-"
Case "‐" r="-"
Case "/" r="/"
Case "\" r="\"
'Case "
" r="~" ' 全角文字で利用するため半角変換しない
Case "
" r="|"
Case "
" r="'"
Case "”" r=""""
Case "(" r="("
Case ")" r=")"
Case "[" r="["
Case "]" r="]"
Case "{" r="{"
Case "}" r="}"
'Case "「" r="「" ' 全角文字で利用するため半角変換しない
'Case "」" r="」" ' 全角文字で利用するため半角変換しない
Case "+" r="+"
Case "-" r="-"
Case "=" r="="
Case "<" r="<"
Case ">" r=">"
Case "′" r="'"
Case "″" r=""""
Case "¥" r="\"
Case "
" r="$"
Case "
" r="%"
Case "
" r="#"
Case "
" r="&"
Case "
" r="*"
Case "
" r="@"
Case Else
If Asc(s) >= Asc("
") Then
s0="
": s1="a"
ElseIf Asc(s) >= Asc("
") Then
s0="
": s1="A"
ElseIf Asc(s) >= Asc("
") Then
s0="
": s1="0"
End If
End Select
End If
If s0 <> "
" Then r=Chr( (Asc(s) -Asc(s0))*a1 +Asc(s1) +a0) ' 変換処理
AdjustString = AdjustString & r

i = i +1 +Abs(CInt(a0 > 0))
Loop
End Function
' ===============================================================================
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
Dim i,s

If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & "
""" & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &"
""" & WScript.Arguments.Item(i) & """" ' 引数
Next
End If
CreateObject("
WScript.Shell").Run s
WScript.Quit
End Sub
' -------------------------------------------------------------------------------
' デバッグ
Dim objDbg
' クラス
Class TDebug
Dim FCScript

' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "
cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine NOW & "
[END]"
WScript.StdIn.ReadLine
End Sub

' CScriptホストかどうか
Public Property Get CScript
CScript = FCScript
End Property

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = "
"
For i = 0 to UBound(v)
s = s & "
dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then
Set objDbg = New TDebug
objDbg.dprintf(NOW & "
" & WScript.ScriptFullName)
End If
objDbg.dprintf(v)
End Sub
' -------------------------------------------------------------------------------
[VBScript] 全角文字を半角文字へ変換する

[PR]
by yozda | 2017-08-18 20:40 | プログラミング | Trackback(1) | Comments(0)
[VBScript] 全角英数&記号を半角へ変換する > Z_ ̄∂
どーもボキです。

定型業務のツール支援するにも、文字バイトが統一されていないとそれすらままならない。

というか、たいていの人は文字バイトなど意識しない。
本当にわからないのだろう、言っても直らない。ツール側で吸収したほうが早い。

以下のZenToHan関数で文字サイズを半角に統一するとよい。
a0021757_09255103.png
ZenToHan関数での変換事例

SetScriptHost("cscript")

s = "yozda ( … > Z_ ̄∂ "
dprintf " 前:" & s
dprintf " 後:" & ZenToHan(s)

' ===============================================================================
' 全角→半角
Function ZenToHan(iStr)
Dim i,r

r = ""
For i = 1 To Len(iStr)
r = r & ZenToHan_func(Mid(iStr, i, 1))
Next
ZenToHan = r
end function
' 関数
Function ZenToHan_func(iStr)
Dim r
r = iStr
ZenToHan_func = r
If Asc(r) < Asc(" ") Then Exit Function
If Asc(r) > Asc("z") Then Exit Function

Select Case r
Case " " r = " "
Case "," r = ","
Case "." r = "."
Case ":" r = ":"
Case ";" r = ";"
Case "?" r = "?"
Case "!" r = "!"
Case "^" r = "^"
Case "_" r = "_"
Case "ー" r = "-"
Case "―" r = "-"
Case "‐" r = "-"
Case "/" r = "/"
Case "~" r = "~"
Case "|" r = "|"
Case "’" r = "'"
Case "”" r = """"
Case "(" r = "("
Case ")" r = ")"
Case "[" r = "["
Case "]" r = "]"
Case "{" r = "{"
Case "}" r = "}"
Case "+" r = "+"
Case "-" r = "-"
Case "=" r = "="
Case "<" r = "<"
Case ">" r = ">"
Case "′" r = "'"
Case "″" r = """"
Case "¥" r = "\"
Case "
" r = "$"
Case "
" r = "%"
Case "
" r = "#"
Case "
" r = "&"
Case "
" r = "*"
Case "
" r = "@"
Case Else
If Asc(r) >= Asc("
") Then
r = Chr(Asc(r) -Asc("
") +Asc("a"))
ElseIf Asc(r) >= Asc("
") Then
r = Chr(Asc(r) -Asc("
") +Asc("A"))
ElseIf Asc(r) >= Asc("
") Then
r = Chr(Asc(r) -Asc("
") +Asc("0"))
End If
End Select
ZenToHan_func = r
End Function
' ===============================================================================
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
Dim i,s

If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & "
""" & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &"
""" & WScript.Arguments.Item(i) & """" ' 引数
Next
End If
CreateObject("
WScript.Shell").Run s
WScript.Quit
End Sub
' -------------------------------------------------------------------------------
' デバッグ ※ここだけ抜粋してもOK
Dim objDbg
' クラス
Class TDebug
Dim FCScript

' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "
cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine NOW & "
[END]"
WScript.StdIn.ReadLine
End Sub

' CScriptホストかどうか
Public Property Get CScript
CScript = FCScript
End Property

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = "
"
For i = 0 to UBound(v)
s = s & "
dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then
Set objDbg = New TDebug
objDbg.dprintf(NOW & "
" & WScript.ScriptFullName)
End If
objDbg.dprintf(v)
End Sub



[PR]
by yozda | 2017-08-16 22:11 | プログラミング | Trackback | Comments(0)
[VBScript] ブラウザでのダウンロードダイアログ操作を自動化する。 > Z_ ̄∂
こんにチワワ。どーもボキです。

a0021757_1545294.png
Firefoxでは、ZIPファイルなどのリンクをクリックすると、
「***を開く」というタイトルのダイアログが表示されるため、ダウンロードはユーザ操作が必要。
(IEでは、「ファイルのダウンロード」。Chromeではダイアログが表示されることなくダウンロードが始まる)

そのユーザ操作を自動化するスクリプト。
1.「***を開く」というタイトルのウィンドウがある場合は、それを最前面に移動する。
2.Alt+Sで、「ファイルを保存する」を選択する。
3.Enterで、ダイアログを閉じる。

実行状態がわかるように、CScriptで実行させている。
実行ホストの切り替えには、[VBScript] 引数を引き継いだ上で、指定したホストで実行するを使った
SetScriptHost("CScript")    ' CScriptで実行

Set objWS = WScript.CreateObject("WScript.Shell")
While True
If objWS.AppActivate("を開く") Then
WScript.StdOut.WriteLine "実行"
WScript.Sleep 500
objWS.SendKeys "%(S)" ' 保存するボタンにフォーカス
WScript.Sleep 500
objWS.SendKeys "{ENTER}" ' 保存するボタンを押下
End If
WScript.Sleep 1000
Wend
' -------------------------------------------------------------------------------
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
If InStr(LCase(WSCript.FullName),LCase(HostName)) <> 0 Then Exit Sub

s = HostName & " """ & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &" """ & WScript.Arguments.Item(i) & """"
Next
End If
CreateObject("WScript.Shell").Run s
WScript.Quit
End Sub



[PR]
by yozda | 2016-06-25 15:46 | プログラミング | Trackback(6) | Comments(0)
[Excel] 文字入力のみで自動色分けするスケジュールフォーマットを作成する > Z_ ̄∂
こんにチワワ。どーもボキです。

Excelブックを共有設定した場合、複数ユーザからセルへの文字入力は可能なものの、
図形(オートシェイプ)編集はできなくなる。

そのため、図形を使わず、セルへの文字入力のみスケジュールを作成する方法を紹介する。
またこの方法ならば、図形を使うよりも、日程の延長/短縮や色分けの編集も簡単に行える。
a0021757_21331285.gif
スケジュールのイメージ(■や★の記入のみで色分けされる)


以下を利用し実現する。
 ・ワークシート関数
 ・記号文字(■、●、★など)
 ・条件付き書式 機能

a0021757_14315029.gif
左列を参照する数式を入力する。(参照先がブランクの場合、参照元セルが「0」を表示)

a0021757_14314312.gif
参照先セルに「=""」を入力すれば、参照元セルもブランク表示となる。

a0021757_14313589.gif
■や★を入力し、スケジュールを書く。★の右列(P2)には、「=""」を入力)

a0021757_14312929.gif
条件付き書式を設定し、■であり、=左列ならば、フォント(文字)とパターン(塗りつぶし)に同じ色を指定する。

a0021757_14312376.gif
同様に、「■であり、≠左列」と「★である」条件での書式を追加する。

a0021757_14311899.gif
文字入力のみで、該当箇所が塗りつぶされるスケジュールフォーマットが完成。


Excel2003の場合、条件付き書式は3つまでに対し、2007以降は無制限となっている。

そのため、条件付き書式を使い「=0」の場合は、フォントの色を白にするとしておけば、
参照先が「0」と表示されても見えないので問題ない。(「=""」の入力が不要)

また、より多くの記号を使い、細かなスケジュールを作成することができる。


[PR]
by yozda | 2016-05-14 14:49 | プログラミング | Trackback | Comments(0)
[VBScript] 管理者昇格してスクリプトを実行する 【改良版】 > Z_ ̄∂
こんにちわわ。どーもボキです。

ExecRunas関数内でWScript.Quitすれば、前回バージョンのような判定処理は不要になるね。

実行部
' 管理者権限でVBSを実行する
ExecRunas

' ~管理者権限で実行したいソース~


実装部
'--------------------------------------------------------------------------------------------------------
'OSのバージョンを取得する
Const osWinNT = 4.0
Const osWin2k = 5.0
Const osWinXP = 5.1
Const osVista = 6.0
Const osWin7 = 6.1
Const osWin8 = 6.2
Function GetOSVersion
Dim objWMI, osInfo, os

Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each os in osInfo
GetOSVersion = CDbl(Left(os.Version, 3))
Next
End Function
'--------------------------------------------------------------------------------------------------------
' 管理者に昇格して実行する
Function ExecRunas
Const cKey = "/ExecRunas"
Dim s

' ExecRunas実行チェック'
If WScript.Arguments.Count > 0 Then
If WScript.Arguments.item(0) = cKey Then Exit Function
End If

' OSバージョンチェック'
If GetOSVersion < osVista Then Exit Function

' 引数を生成'
s = ""
For i = 0 To WScript.Arguments.Count -1
s = s & " """ & WScript.Arguments.item(i) & """"
Next

' Runas実行'
CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """" & " " &cKey& " " & s, "", "runas", 1

' VBS実行を終了'
WScript.Quit
End Function
'--------------------------------------------------------------------------------------------------------

[VBScript] 管理者昇格してスクリプトを実行する
[PR]
by yozda | 2015-12-20 15:37 | プログラミング | Trackback | Comments(0)
[Delphi] TShellTreeViewやTShellListView間でドラッグ&ドロップする 【EListError回避版】 > Z_ ̄∂
こんにチワワ。どーもボキです。

前回の紹介バージョンでは、何も入っていないフォルダに対してドロップを行うと、TListErrorが発生する。(下図)
ちなみに、エラーメッセージウィンドウを閉じれば押せば正常に処理される。

おそらくTShellListViewかその親となるコンポーネントにバグがあると思われるが、
ShellCtrls.pasのソースがインストールされてなく修正できない(あってもやらない)ので、別の回避方法を考えた。
a0021757_1733233.gif


以下のように、TShellListViewが何も表示していない場合、
DragDropイベント時にダミーファイルを作成し表示更新させ、EndDragイベントで、そのダミーファイルを消す。

こうすればエラーを回避できる。
// ドラッグ中にダミーファイル作成
procedure TForm1.ShellListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
_SLV : TCustomShellListView;
_STV : TCustomShellTreeView;
begin
if Sender is TShellListView then begin
_SLV := TCustomShellListView(Sender);
_STV := _SLV.ShellTreeView;
end else if Sender is TShellTreeView then begin
_STV := TCustomShellTreeView(Sender);
_SLV := _STV.ShellListView;
end else exit;
if _SLV.Items.Count > 0 then exit;

//※EListError回避のため、ダミーファイルを作成し表示更新
FileClose(FileCreate(_STV.Path+'\AvoidEListError'));
_SLV.Refresh;
end;

// ドラッグ終了時にコピー処理
procedure TForm1.ShellListView1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
//~ 省略 ~

DeleteFile(_STV[1].Path +'\AvoidEListError'); // ダミーファイルを削除
_SLV.Refresh;
end;

[Delphi] TShellTreeViewやTShellListView間でドラッグ&ドロップする
[PR]
by yozda | 2015-05-17 17:02 | プログラミング | Trackback | Comments(0)