2017年3月31日

【PowerShell】Wordに画像を貼り付ける


PowerShellからWordに画像を貼り付ける方法です。

$word = New-Object -ComObject "Word.Application"
$word.Visible = $true
$word.Documents.Open("C:\work\word\test01.docx")
$word.Selection.InlineShapes.AddPicture("C:\work\word\neko.jpg", $false, $true)


結果はこのような感じになります。


<参考サイト>
InlineShapes.AddPicture メソッド

2017年3月30日

【Excel】セルを結合せずに複数のセルの中央に文字を表示させる方法


たまに他人が作ったExcelファイルをいじっていると、結合されていないのに複数セルの中央に文字が来ていることがあって、なんじゃこれは!?魔法か!?なんて思っていたのですが、実はちゃんとやり方がありました。

まず、文字を表示させたい複数のセルを選択します。



選択したら次に、[Ctrl] + [1] で「セルの書式設定」ダイアログを表示させます。



そして横位置で「選択範囲内で中央」を選び[OK]を押します。



あとは、文字を入力していけば複数のセルの中央に文字が配置されます。

2017年3月29日

【Excel】「関数の挿入」ダイアログを表示するショートカット


「関数の引数」ダイアログを表示するショートカットです。

[Shift] + [F3]

まず関数を挿入したいセルを選択します。



そして、[Shift] + [F3] を押します。



すると、「関数の挿入」ダイアログが表示されます。

あとは、挿入したい関数を選択して、[OK]を押せばセルに関数が挿入されます。

2017年3月28日

【Excel】「関数の引数」ダイアログを表示するショートカット


「関数の引数」ダイアログを表示するショートカットです。

[Ctrl] + [A]

たとえば、セルに「=ROUND」と入力し、



ここで、[Ctrl] + [A] を押します。



すると、「関数の引数」ダイアログが表示されます。

あとは、数値と桁にセルを選択したり値を入力し[OK]を押すと、


このように、「=ROUND(B4,1)」と入力されます。

2017年3月27日

【Excel】関数の引数のヒントを表示するショートカット


関数の引数のヒントを表示するショートカットです。

[Ctrl] + [Shift] + [A]

たとえば、セルに「=ROUND」と入力し、



ここで、[Ctrl] + [Shift] + [A] を押します。



すると、引数のヒントが表示されます。

あとは、ヒントをもとにセルを指定したり、数値を入力していけば関数が出来上がります。
なかなか便利な機能ですので、ぜひ覚えておきたいショートカットです。

2017年3月26日

【PowerShell】MP3ファイルのタグ情報を表示してみる(ソート有り)


昨日の「MP3ファイルのタグ情報を表示してみる」から、さらにソートしてみました。

GetMp3Info_Sort.ps1
$sh = New-Object -ComObject Shell.Application
$music = "C:\work\mp3"
$folder = $sh.Namespace($music) 
$items = Get-ChildItem -Path $music -Include *.mp3 -Name

#空の配列を定義
$array = @()

foreach($f in $items)
{
    $fi = $folder.ParseName($f)

    $num = $folder.GetDetailsOf($fi,26).PadLeft(2,"0")
    $title = $folder.GetDetailsOf($fi, 21)
    $time = $folder.GetDetailsOf($fi, 27)
    $size =  $folder.GetDetailsOf($fi,1)

    #ジャグ配列に格納
    $array += ,@($num, $title, $time, $size)
}

Write-Host "■ソート前"
Write-Host "トラック番号   タイトル   長さ   ファイルサイズ" 
Write-Host "----------------------------------------------"

for($i = 0; $i -lt $array.Count; $i++)
{
    $rec = ""
    for($j = 0; $j -lt $array[$i].Count; $j++)
    {
        $work = [string]$array[$i][$j]
        $rec = $rec + $work + " "
    }
    Write-Host $rec
}

#ソート(バブルソート)
for($i = 0; $i -lt ($array.Count - 1); $i++)
{
    for($j = ($array.Count - 1); $j -gt $i; $j--)
    {
        if ($array[$j - 1][0] -gt $array[$j][0])
        {
            $tmp = $array[$j - 1]
            $array[$j - 1] = $array[$j]
            $array[$j] = $tmp
        }
    }
}

Write-Host ""
Write-Host "■ソート後"
Write-Host "トラック番号   タイトル   長さ   ファイルサイズ" 
Write-Host "----------------------------------------------"

for($i = 0; $i -lt $array.Count; $i++)
{
    $rec = ""
    for($j = 0; $j -lt $array[$i].Count; $j++)
    {
        $work = [string]$array[$i][$j]
        $rec = $rec + $work + " "
    }
    Write-Host $rec
}


実行結果
■ソート前
トラック番号   タイトル   長さ   ファイルサイズ
----------------------------------------------
10 4 Real 00:03:28 5.41 MB 
12 Alice (Extended Version) 00:05:00 6.85 MB 
19 Bad Reputation 00:02:42 4.42 MB 
01 Black Star 00:01:34 2.16 MB 
11 Darlin 00:03:50 5.73 MB 
08 Everybody Hurts 00:03:41 5.80 MB 
14 Goodbye 00:04:32 6.05 MB 
07 I Love You 00:04:01 6.24 MB 
18 Knockin' On Heaven's Door 00:02:52 3.38 MB 
09 Not Enough 00:04:18 6.25 MB 
16 Push (Acoustic) 00:02:46 4.37 MB 
03 Push 00:03:01 4.82 MB 
13 Remember When 00:03:29 5.37 MB 
05 Smile 00:03:29 5.05 MB 
06 Stop Standing There 00:03:27 5.19 MB 
15 What The Hell (Acoustic) 00:03:40 5.57 MB 
02 What The Hell 00:03:40 5.15 MB 
17 Wish You Were Here (Acoustic) 00:03:45 5.45 MB 
04 Wish You Were Here 00:03:45 5.52 MB 

■ソート後
トラック番号   タイトル   長さ   ファイルサイズ
----------------------------------------------
01 Black Star 00:01:34 2.16 MB 
02 What The Hell 00:03:40 5.15 MB 
03 Push 00:03:01 4.82 MB 
04 Wish You Were Here 00:03:45 5.52 MB 
05 Smile 00:03:29 5.05 MB 
06 Stop Standing There 00:03:27 5.19 MB 
07 I Love You 00:04:01 6.24 MB 
08 Everybody Hurts 00:03:41 5.80 MB 
09 Not Enough 00:04:18 6.25 MB 
10 4 Real 00:03:28 5.41 MB 
11 Darlin 00:03:50 5.73 MB 
12 Alice (Extended Version) 00:05:00 6.85 MB 
13 Remember When 00:03:29 5.37 MB 
14 Goodbye 00:04:32 6.05 MB 
15 What The Hell (Acoustic) 00:03:40 5.57 MB 
16 Push (Acoustic) 00:02:46 4.37 MB 
17 Wish You Were Here (Acoustic) 00:03:45 5.45 MB 
18 Knockin' On Heaven's Door 00:02:52 3.38 MB 
19 Bad Reputation 00:02:42 4.42 MB 

ソートするにはやはりトラック番号の比較が出来ないといけないので、とりあえず取得したデータをジャグ配列に格納してみました。

ソートは、単純にバブルソートで並び替えてます。
速度のことを考えればクイックソートがいいと思いますが、この程度の要素数ならバブルソートで十分です。

あとは、クラスを作ってListでソートすればもっとすっきり出来そうな気もしますが・・・、それはまたいずれ。

2017年3月25日

【PowerShell】MP3ファイルのタグ情報を表示してみる


MP3ファイルのタグ情報を表示するスクリプトを作ってみました。

GetMp3Info.ps1
$sh = New-Object -ComObject Shell.Application
$music = "C:\work\mp3"
$folder = $sh.Namespace($music) 
$items = Get-ChildItem -Path $music -Include *.mp3 -Name

Write-Host "トラック番号   タイトル   長さ   ファイルサイズ" 
Write-Host "----------------------------------------------"

foreach($f in $items)
{
    $fi = $folder.ParseName($f)

    $num = $folder.GetDetailsOf($fi,26).PadLeft(2,"0")
    $title = $folder.GetDetailsOf($fi, 21)
    $time = $folder.GetDetailsOf($fi, 27)
    $size =  $folder.GetDetailsOf($fi,1)

    Write-Host $num $title $time $size
}

実行結果
トラック番号   タイトル   長さ   ファイルサイズ
----------------------------------------------
10 4 Real 00:03:28 5.41 MB
12 Alice (Extended Version) 00:05:00 6.85 MB
19 Bad Reputation 00:02:42 4.42 MB
01 Black Star 00:01:34 2.16 MB
11 Darlin 00:03:50 5.73 MB
08 Everybody Hurts 00:03:41 5.80 MB
14 Goodbye 00:04:32 6.05 MB
07 I Love You 00:04:01 6.24 MB
18 Knockin' On Heaven's Door 00:02:52 3.38 MB
09 Not Enough 00:04:18 6.25 MB
16 Push (Acoustic) 00:02:46 4.37 MB
03 Push 00:03:01 4.82 MB
13 Remember When 00:03:29 5.37 MB
05 Smile 00:03:29 5.05 MB
06 Stop Standing There 00:03:27 5.19 MB
15 What The Hell (Acoustic) 00:03:40 5.57 MB
02 What The Hell 00:03:40 5.15 MB
17 Wish You Were Here (Acoustic) 00:03:45 5.45 MB
04 Wish You Were Here 00:03:45 5.52 MB

ちょっと、並び順がタイトル順になってしまっていて、本当はトラック順に並べたいのですが、それはまた次回ということで。

↓↓↓ソート有りバージョン↓↓↓
【PowerShell】MP3ファイルのタグ情報を表示してみる(ソート有り)


<参考サイト>
MP3ファイルからタイトルやアーティスト名などを取得するには?[C#、VB]
MP3の情報を取得するVBScript


2017年3月24日

【Excel】簡単にデータの順番を入れ替える方法


Excelを使っていると、データの順番を入れ替えたいといったことがよくあると思います。
そういう場合、一旦空いてるところにデータを移して、入れ替えたりするかと思いますが、実はもっと簡単な方法があります。

それは、[Shift]キーを押しながらドラッグして離すという方法です。

セル単位の入れ替え

たとえば、セルB7の「え」を「あ」の次に来るようにするには、次のようにします。


まず、セルB7を選択したら、[Shift]キーを押しながらセルの縁をドラッグさせます。
そうすると、移動先がこの図のように「H」型になります。


そして、「あ」の下でドラッグを離すと入れ替え完了です。
「あ」の下に「え」が来て、「い」「う」がそれぞれ下に一つずれました。



行単位の入れ替え

行単位の入れ替えも同じです。

まず、移動したい行を選択し。


次に[Shift]キーを押しながらドラッグさせます。


そして、移動先でドラッグを離す。



これは本当に簡単に出来ますので、覚えておくと便利です。


2017年3月23日

【Excel】選択した複数のセルに値を入力するショートカット


選択した複数のセルに値を入力するショートカットです。

[Ctrl] + [Enter]

まず、入力したい複数のセルを選択します。



次に、1つのセルに値を入力します。



そして、[Ctrl] + [Enter] を実行。



すると、このように選択されたすべてのセルに値が入力されます。


2017年3月22日

【Excel】「選択範囲から名前を作成」ダイアログを表示するショートカット


「選択範囲から名前を作成」ダイアログを表示するショートカットです。

[Ctrl] + [Shift] + [F3]

たとえばこのような表があったとします。


ここで、B3からE9の範囲を選択します。


そして、次に[Ctrl] + [Shift] + [F3] を実行します。


すると、「選択範囲から名前を作成」ダイアログが表示されるので、「上端行」にだけチェックを入れ、[OK]ボタンを押します。


すると、各列の4行目から9行目に、先頭行の項目名から名前が付けられます。
これは、先ほどのダイアログで「上端行」から名前を作成としたためです。

この例では、B4:B9が「品目」、C4:C9が「単価」、D4:D9が「個数」、E4:E9が「金額」になります。


2017年3月21日

【Excel】ハイパーリンクの編集ダイアログを表示するショートカット


ハイパーリンクの編集ダイアログを表示するショートカットです。

[Ctrl] + [K]

たとえば今、セルB3にカーソルがあったとします。



ここで、[Ctrl] + [K] を実行。



すると、ハイパーリンクの編集ダイアログが表示されます。

ここではためしに「test01.xlsx」というファイルを選択して、[OK]ボタンを押します。



セルB3にリンクが設定されました。


2017年3月20日

【Excel】横方向にスクロールするショートカット


横方向にスクロールするショートカットです。

[Alt] + [PageDown]   右方向
[Alt] + [PageUp]    左方向


[Alt] + [PageDown]   右方向にスクロール



[Alt] + [PageUp]    左方向にスクロール


2017年3月19日

【Excel】セルのコメントを追加するショートカット


セルのコメントを追加するショートカットです。

[Shift] + [F2]

セルB4にコメントを追加します。


[Shift] + [F2] を実行。


コメントボックスが表示され、コメントを入力できるようになります。

ちなみに、コメントボックスから元のセルにカーソルを戻すには、[Esc]キーを2回押せば出来ます。

また、追加したコメントを削除するには、コメントボックス内のコメントにカーソルがある状態から[Esc]キーを1回押し、コメントボックス自体が選択されてる状態で[Del]キーを押せば削除できます。


2017年3月18日

【PowerShell】新規にExcelファイルを作成して値を入力するスクリプト


新規にExcelファイルを作成して値を入力するスクリプトを作ってみました。


ExcelWorkBookCreate.ps1
# ファイル名
$file = "C:\work\Excel\test15.xlsx"

# Excelオブジェクトの作成
$xl = New-Object -ComObject Excel.Application

# Excelの画面を表示する
$xl.Visible = $true

# 新しいワークブックを作成する
$wb = $xl.Application.Workbooks.Add()

# 1番目のシートのセルA1に書き込む
$wb.Worksheets(1).Range("A1").Value = "Hello Excel !"

# 名前を付けて保存
$wb.SaveAs($file)

# ワークブックを閉じる
$wb.Close

# Excelを終了
$xl.Quit()

# COMオブジェクトの破棄
# 参照カウントが0になるまで繰り返す
do
{
    $cnt = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
}
while ($cnt -gt 0)

# ガベージコレクションの強制実行
[System.GC]::Collect()
最初このスクリプトを実行してみたところ、スクリプトが終了してExcelファイルも閉じているのにプロセスがなぜか残ってしまいます。

あれっ、なんで!?と思ったのですが、ネットで調べてみるとどうやら結構有名な問題のようです。

で、いろいろ調べたところExcelの場合、明示的にCOMオブジェクトを破棄してあげないといけないようで、具体的には[System.Runtime.Interopservices.Marshal]::ReleaseComObjectメソッドを使い参照カウンタをデクリメントさせればいいようです。

ただ今回の場合、このメソッドを1回呼び出しただけではカウンタが0にならず、プロセスは終了しませんでした。

これは、最初にNew-ObjectでExcelオブジェクトを作成したときにカウントが1になり、次にワークブックを作成した際ににまたカウントされているので、上のスクリプトでは最終的にカウンタが2になっているためのようです。

したがって、[System.Runtime.Interopservices.Marshal]::ReleaseComObjectメソッドを2回呼び出せばカウンタは0になり、プロセスが終了します。

一応、今回はdo...while()でカウンタが0になるまで回すようにしました。


<参考サイト>
PowerShellでExcelの読み書き・ファイル作成
http://mtgpowershell.blogspot.jp/2010/06/excel.html
Powershell Excel Cookbook Ver 2
Marshal.ReleaseComObject メソッド (Object) (System.Runtime.InteropServices)


2017年3月17日

【Excel】コンテキストメニューを表示させるショートカット


コンテキストメニューを表示させるショートカットです。

[Shift] + [F10]

たとえばこのようなシートがあったとして、セル、グラフ、図形でそれぞれコンテキストメニューを表示させてみます。



まずは、セルを選択して、[Shift] + [F10] を実行。




次に、グラフを選択して、[Shift] + [F10] を実行。




最後に、図形を選択して、[Shift] + [F10] を実行。