「日付と時刻を挿入(カレンダー版)」の版間の差分
ナビゲーションに移動
検索に移動
ハイライト効果の適用 |
セミコロンの追加、ソースコードの整形 |
||
| (同じ利用者による、間の3版が非表示) | |||
| 1行目: | 1行目: | ||
[https://www.haijin-boys.com/discussions/2933 指定した日付の入力は出来ないでしょうか]でヒロさんが希望していた、カレンダーからの日付挿入マクロです。PowerShellで.NETのカレンダーコントロールを使用して、クリップボード経由で貼り付けます。 | |||
== 注意事項 == | |||
<syntaxhighlight lang="javascript"> | 環境によってはPowerShellの起動がやたらと遅いので、使い物にならないかもしれません。Core i5 Windows7 のビジネスノートではストレスなく動作しましたが、Windows10 にアップグレードされた古い Atom ネットブックでは無理でした。 | ||
== ソースコード == | |||
=== JavaScript === | |||
下記のソースコードをMeryのマクロファイルとして保存(例:calendar.js) | |||
<syntaxhighlight lang="javascript" copy> | |||
#title = "カレンダーで日付挿入" | #title = "カレンダーで日付挿入" | ||
/* | /* | ||
| 24行目: | 29行目: | ||
var mydoc = editor.ActiveDocument; //WScript.Shell.Runの終了待ちの間に操作される対策を追加 | var mydoc = editor.ActiveDocument; //WScript.Shell.Runの終了待ちの間に操作される対策を追加 | ||
var psScript = 'c:\\temp\\calendar.ps1';//←環境に合わせて修正 | var psScript = 'c:\\temp\\calendar.ps1';//←環境に合わせて修正 | ||
var psCmd = 'PowerShell.exe -STA -ExecutionPolicy RemoteSigned -File ' | var psCmd = 'PowerShell.exe -STA -ExecutionPolicy RemoteSigned -File '; | ||
var errlevel = new ActiveXObject('WScript.Shell').Run( psCmd + | var errlevel = new ActiveXObject('WScript.Shell').Run( psCmd + psScript, 0, true); | ||
psScript, 0, true); | |||
if(errlevel==0 && editor.ActiveDocument==mydoc)document.Write(ClipboardData.GetData()); | if(errlevel==0 && editor.ActiveDocument==mydoc)document.Write(ClipboardData.GetData()); | ||
})(); | })(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== PowerShell === | |||
<syntaxhighlight lang="powershell"> | 下記のソースコードをPowerShellのスクリプトファイルとして保存(例:calendar.ps1) | ||
<syntaxhighlight lang="powershell" copy> | |||
# MonthCalendar コントロールで日付を選択する Powershell スクリプト | # MonthCalendar コントロールで日付を選択する Powershell スクリプト | ||
# Enter または F5 でクリップボードにコピー、 Esc でキャンセルして終了する | # Enter または F5 でクリップボードにコピー、 Esc でキャンセルして終了する | ||
| 79行目: | 85行目: | ||
exit $exitcode | exit $exitcode | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2025年11月24日 (月) 18:53時点における最新版
指定した日付の入力は出来ないでしょうかでヒロさんが希望していた、カレンダーからの日付挿入マクロです。PowerShellで.NETのカレンダーコントロールを使用して、クリップボード経由で貼り付けます。
注意事項[編集]
環境によってはPowerShellの起動がやたらと遅いので、使い物にならないかもしれません。Core i5 Windows7 のビジネスノートではストレスなく動作しましたが、Windows10 にアップグレードされた古い Atom ネットブックでは無理でした。
ソースコード[編集]
JavaScript[編集]
下記のソースコードをMeryのマクロファイルとして保存(例:calendar.js)
#title = "カレンダーで日付挿入"
/*
* PowerShellを使って .Net の MonthCalendar コントロールを表示します
* 環境に合わせて PowerShell スクリプトのフルパスを修正してください
*
* PowerShell.exe の実行コマンドラインでは、セッションのみローカルの
* スクリプトの実行を許可しています
* Run メソッドではウインドウ非表示で実行し、PowerShell スクリプトの
* 内部で Window.State を操作しています。
* また、Run メソッドでは終了を待つため、フォームが表示されている間、
* 他のマクロは実行できません。
* PowerShell.exe 終了の戻り値が 0 であればクリップボードから貼り付け
* ます。PowerShell.exe 終了から Mery マクロへの復帰までに、他のアプ
* リでクリップボードが操作される可能性は無視しています。
*
* なお、MonthCalendar コントロールでは休日の色付けは困難な模様です。
*/
(function(){
var mydoc = editor.ActiveDocument; //WScript.Shell.Runの終了待ちの間に操作される対策を追加
var psScript = 'c:\\temp\\calendar.ps1';//←環境に合わせて修正
var psCmd = 'PowerShell.exe -STA -ExecutionPolicy RemoteSigned -File ';
var errlevel = new ActiveXObject('WScript.Shell').Run( psCmd + psScript, 0, true);
if(errlevel==0 && editor.ActiveDocument==mydoc)document.Write(ClipboardData.GetData());
})();
PowerShell[編集]
下記のソースコードをPowerShellのスクリプトファイルとして保存(例:calendar.ps1)
# MonthCalendar コントロールで日付を選択する Powershell スクリプト
# Enter または F5 でクリップボードにコピー、 Esc でキャンセルして終了する
$exitcode = 0
Add-Type -AssemblyName System.Windows.Forms
$Calendar = New-Object System.Windows.Forms.MonthCalendar
$Calendar.ShowToday = $False
$Calendar.ShowTodayCircle = $False
$Calendar.MaxSelectionCount = 1
# 休日に色を付けるとかはできない模様
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Select Date"
$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedToolWindow
$Form.Controls.Add($Calendar)
$Form.ControlBox = $False
$Form.TopMost = $True
$Form.KeyPreview = $True
$Form.Add_KeyDown({
if (($_.KeyCode -eq "Enter") -or ($_.KeyCode -eq "F5")){
$date = $Calendar.SelectionStart
# "カスタム日時書式指定文字列" を参照
# https://msdn.microsoft.com/ja-jp/library/8kb3ddd4.aspx
# 曜日を日本語で表示するため CultureInfo を指定
$culture = New-Object System.Globalization.CultureInfo("ja-JP")
[Windows.Forms.Clipboard]::SetText($date.ToString("yy/MM/dd(ddd)",$culture))
$Form.Close()
}
})
$Form.Add_KeyDown({
if ($_.KeyCode -eq "Escape"){
$Form.Close()
$exitcode = 1
}
})
$Form.Add_Shown({ $Calendar.Location = New-Object System.Drawing.Point
@(0, 0); $Form.ClientSize = $Calendar.Size; $Form.WindowState = 0; })
$dialogresult = $Form.ShowDialog()
$Calendar.Dispose()
$Form.Dispose()
exit $exitcode
スポンサーリンク