MsgBoxではなくビープ音で知らせて欲しい
何かの処理が終わったときに「終わりましたよ」的なお知らせがあると助かりますが、一番手っ取り早いのはMsgBoxです。でも、MsgBoxだとVBAの処理も止まってしまうため、タイマーを使って10分毎や30分毎に処理をさせているようなケースでは困ってしまいます。例えば、Application.OnTimeを使って複数のタスクを一定時間毎に処理させているような場合ですね。
次に簡単なのはビープ音で知らせる。これはBeepで実現できます。聞き逃しを防ぐために5,6回鳴らすとよいでしょう。
For i = 0 to 4
Next
でも、MP3を再生させて知らせるというのはどうでしょうか。好きな曲でもいいし、好きな声優の台詞をどこからか拾ってきてMP3ファイルに落としておけばいいわけです。VBAでMP3ファイルを再生させるにはShell関数を使ってメディアプレーヤーを立ち上げて、再生したいMP3ファイルを渡してやればいいんですが、メディアプレーヤーっていったいいつのアプリですか? ファイルの場所を調べるのも面倒だし、ダブルクォーツも面倒だし、そんなことするくらいならShellExecute WindowsAPI使ったほうが簡単です。MP3の保存場所もログインユーザーしかアクセスできないフォルダーではなく、パブリックな場所に置いておくとよいでしょう。
ShellExecuteの便利なところはファイル名を渡してやるだけで関連付いているアプリが勝手に起動するということです。URLを渡してやればブラウザーがそのページを開いてくれるし、.TXTファイルならメモ帳、.xlsならエクセルが開きます。
Public Declare Function ShellExecute _
Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hWnd As Long, _
ByVal Operation As String, _
ByVal FileName As String, _
Optional ByVal Parameters As String, _
Optional ByVal Directory As String, _
Optional ByVal WindowStyle As Long = vbMinimizedFocus _
) As Long
Public Sub OpenUrl(strURL)
Dim lSuccess As Long
lSuccess = ShellExecute(0, "Open", strURL)
End Sub
Public Sub PlayJobDone()
OpenUrl "C:\MP3\PaleBlueDot.mp3"
End Sub
radikoで関東エリアのラジオ局に接続
この国の放送法はほんとにどーしようもなくて、こんなに小さな国なのに地方で関東エリアのテレビやラジオを見ることも聞くこともできません。ミュージックステーションや乃木中のように人気のある番組はYoutubeで配信してる人がいるので見ることはできますが全部というわけにはいきません。
radikoもずいぶんメジャーになってきましたが、これも放送法に縛られており地方に住んでる人は関東エリアの放送を聞くことはできません。IPアドレスから住んでいる場所を特定して、そのエリアで聞ける局しかメニューに表示されないという、もはやインターネット全否定のウェブサービスです。
お金を払えば他のエリアの放送局も楽しめるらしいのですが、そんなことにお金払う人いないでしょうし、VPNかませばいいだけのことです。ChromeやFirefoxにはカスタムプラグインでプロキシー接続がサポートされています。これを使っていったん関東エリアのサーバー経由で接続する方法が考えられますが、今回はもうちょっとスマートなやり方を紹介します。
このVPNソフトが出たときにちょっとだけ使ってみましたが、TCP/IPをトンネリングさせるという画期的なコンセプトで感心したものです。たしか筑波大学の学生がコンテストか何かで入賞して、法人を作ってビジネスにしたと聞いています。そのSoftEtherが今も無償で使えるということなので久しぶりに試してみることにしました。
1.ダウンロードはこちらから https://ja.softether.org/5-download
2.インストールしてVPNクライアント接続マネージャを起動します。
3.VPN Gate公開 VPN 中継サーバーをダブルクリック
アメリカ、韓国、ベトナム、カナダとかたくさん出てきますが、今回はJapanで接続数の多めのやつを選んでください。プロトコル選択はPCPで。
接続に成功すると、こんな画面表示になります。これで準備完了。
ブラウザーでradiko.jpを開いてください。もうすでに選択できる放送局が変わっているはずです。
ラジオ日本
bayfm78
これは関東エリアに住んでいる人でないと表示すらされませんが、SoftEtherならこんなにスマートにエリアフリーできました。18:00から文化放送で乃木坂46の『の』をやるみたいなので聞いてみたいと思います。
はてなブログのフォントは美しくない問題
タイプフェイスというのは芸術作品です。明朝とゴシックはそれぞれによさがあり、使用目的に応じて使わないとダメなんです。ましてや、この2つの書体をひとつのドキュメントの中で混合させたら、気持ち悪くて反吐を吐きそうになること請け合いです。
いや、そんなこと知ってるよ。誰でも知ってることを今更どうした? って言ってる人は、これ以外のはてなブログのページを見てください。太字はゴシックだけど、それ以外は明朝になっているブログがたくさんあります。
はてなブログはこれ以外にもちょっとおかしな癖があって、太字設定にしてないのに最初の段落はゴシックで表示して、2つ目の段落から明朝で表示したりします。何が原因か分かりませんが、挙動がおかしすぎます。とにかく、こんなことは絶対にあってはならないことです。スティーブ・ジョブズなら秒でそのウェブデザイナーを首にしてるでしょうね。
というわけで、このような憂鬱から解放されるには次のようにするしかなさそうです。
1. ブログ設定画面の左メニューからデザインをクリック
2. 「管理者画面に戻る」の下あたりにある工具のレンチみたいなアイコンをクリック
3. 一番下のデザインCSSをクリック
4. 編集ボックスに以下のCSSをコピペ
body {
font-family: "メイリオ", Meiryo;
}
全画面にするたび憂鬱な気分になっている人へ
Windows10で動画再生を全画面にすることってよくありますよね。その時に画面右下の通知アイコンがオンになるので、"ん、メールか?と思ってクリックすると"「全画面表示モードになっているときは、通知は表示されずアクションセンターに保存されます。」という例のいやらしい通知が来るのをどうしていますか? 「今すぐオフにする」をクリックすると無間地獄に陥ります。一生この通知から逃げることはできなくなります。
そもそもこの通知は何のためにあるのか
全画面にしているときに通知が来てもらっても邪魔でしょうがないから、ポップアップはしない代わりにアクションセンターに保存しておいたからね。というのがこのメッセージの趣旨です。いやいや逆におまえが邪魔してんじゃんwwwっていう話です。
じゃあ、どうしたらオフにできるか
一番簡単なのは、この通知で変更をクリックして設定画面を出すことです。でなかったら、ウィンドウズアイコンを右クリックで設定を出して、システム>>集中モードをクリックすれば出てきます。
次に画面一番下に「アプリを全画面表示モードで使用しているとき」というのがあるので、これをオフにする。たったこれだけです。
全画面表示中のメールの通知などが表示されなくなるので、それは困るという人は無間地獄を楽しんでください。
言われるまで気づかなかったシリーズ:パッヘルベルのカノン
原題は『3つのヴァイオリンと通奏低音のためのカノンとジーグ ニ長調』。有名な曲だから一度は聞いたことあると思います。バイオリン3人とチェロのカルテットでやる例のあれです。エヴァ劇場版でも使われているから、「ああ、エヴァのあれね」という人もいることでしょう。
https://www.youtube.com/watch?v=jJRdLZyOU4w
Stringspace String Quartet
わたしもこの曲は耳タコで、いったい何回聴いたか分からないくらい聴きました。自分でもピアノで弾いたりするしね。音大出た人やプロの人は知ってるからここからは音楽素人の人だけ対象の話です。
カノンって知ってる?
複数の声部が同じ旋律を異なる時点からそれぞれ開始して演奏する様式の曲を指す。ポリフォニーの一つの典型である。一般に輪唱と訳されるが、輪唱が全く同じ旋律を追唱するのに対し、カノンでは、異なる音で始まるものが含まれる。また、リズムが2倍になったり、上下もしくは左右(時間の前後)が逆になったような特殊なものをも含む。有名な『パッヘルベルのカノン』(パッヘルベル)は、3つの声部が全く同じ旋律を追唱し(ただし同時に終わるために最後がカットされる声部がある)それに伴奏が付けられたものである。Wikipediaより抜粋
そう、輪唱なのですよ。小学校でかえるの歌を歌ったことあると思いますが、あの繰り返しずらして歌うあれです。パッヘルベルのカノンもタイトル通り輪唱(=カノン)なんです。知ってました? 知らなかったよぉぉ。言われたらその通りだよねとか、今さら聞けない〇〇とか、考えたこともなかったわーwwwみたいな話ですが、輪唱なんですよ。
それはきれいなお姉さんがきっかけだった
さっきのYoutube動画がおすすめに出てきて、なんとなく再生して見ていたら一番左のお姉さんがとってもきれいな人で、チェロって暇そうだなーとか、これどこの国の人達だろ?とか本当にぼぉ~~っと見てたんです。たぶん、ほとんどの人は私と同じことしか見えてないと思います。この曲は同じパッセージの繰り返しなんですが、一か所だけちょっと盛り上がるところがあるんです。ずーっと聞いていて、いつになったらその部分になるんだっけと思って聞いてたら5:50くらいからやっと始まりました。ああ、これこれ。ここ好きなんだよ。って思ってきれいなお姉さんを見てたんです。
https://youtu.be/jJRdLZyOU4w?t=350
そしたらですよ。ブレードランナーのダリル・ハンナ似の第2バイオリンに目で合図を送ったんですよ。んで、第2バイオリンの人が同じフレーズを弾いて、カメラが第3バイオリンにパンして第3バイオリンが同じフレーズを弾いて・・・・ これでやっと気が付きました。ああ、これカノンだわwww おせーよ。いまさらかよwwww
スクロール楽譜で確認してみよう
https://www.youtube.com/watch?v=gDEnmYWzXQA
これを見れば一目瞭然です。第1バイオリンが2小節弾いたら、第2バイオリンが全く同じフレーズを弾いて、それをさらに第3バイオリンが弾いてるのが分かりますよね? これをずっと最後まで繰り返してるんです。すごいよね。すごくない? みんな知ってた? これすごいよ。
バッハのゴールドベルクとかもっとすごいんだよね。右手だけでカノンやるんですよ。左手は全く別のコード進行してます。ピアノ初心者は右手パートを一人でやって、誰か他の人に左手パートを演奏してもらえたら楽しいだろうなぁと思います。左手を自分で演奏して録音しておいてもいいよね。これいつかやってみよう。
https://www.youtube.com/watch?v=BYfKWyeichE&t=420s
Variation 3: Canone all' Unisono
余談ですが
パッヘルベルのカノンはいろんなアレンジがありますが、ピアノソロとかオーケストラ、パイプオルガン、カノンロックまで。でもね。オリジナルはカルテットだから最低でも4人いないと成立しないと思います。パイプオルガンでさえもダメでした。ペダルと右手、左手しかないからね。ピアノとチェロもダメ。3人でカノンを演奏して、低音担当が一人。最低でもこの構成じゃないと意味がない。
というわけで、耳タコのパッヘルベルさんのカノンでしたが、いかがだったでしょうか。3人のカノン+通奏低音で美しいハーモニーを作っていることが理解できるとより楽しめるようになったでしょ?
Stringspaceのきれいなお姉さんは結婚したようです。幸せになってください。><
知っておくとちょっぴり幸せになれる小技 Pt1
知っておくとちょっぴり幸せに なれるシリーズです。
編集メニュー:繰り返し(CTRL+Y)
昔のエクセルには編集メニューがあって繰り返し(CTRL+Y)なんて便利なものがありました。なので、初めてエクセルを触る人もこの機能を覚えることができました。
今のエクセルではこのメニューに相当するリボンがないので(もしかしたら探し方が悪いのかもですが)、罫線をひくたびに同じダイアログを出して・・・みたいな動作を何回も繰り返している人がいるかと思うと気の毒になってしまいます。
リボンに登録しておいてもよいのですが、繰り返しアイコンを探すのも意外と大変だったりします。
タイトルにもあるとおりCTRL+Yで時短してください。でも、CTRLキーとYって距離遠いですよね。左手だけでやろうとすると、小指がギューってなるしw なのでF4を押しましょう。
セルの中身を全部消したい
消去したいセル範囲を選択しておいてDeleteキーを押してますか? セルの値や数式を消したいだけならいいんですが、罫線や背景色はDeleteキーでは消えません。ホームの右側にあるクリア⬇を探して「すべてクリア」をクリックですか? いったい何回クリックしなきゃいけないんでしょう。気が遠くなります。
例えば、次のようなシートがあるとして、これをすべて消したいとしましょう。
▶1行上のブランク行も含めてハイライトします。(7751をクリックしてCTRL+SHIFT+➡してCTRL+SHIFT+⬆ して、再度⬆)
▶CTRL+Dで一気にクリア
CTRL+Dはエクセルで非常によく使う機能です。一番先頭のセル内容を範囲指定したセルにコピーしてくれます。CTRL+Cしなくてもペーストできるので本当によく使います。今回はこのフィルダウンの応用編で、先頭のブランク行は罫線も背景色も何も設定されていないセルなので、これをそのまま貼り付けることでクリアできるわけです。
ブランクセルを1個クリックしてCTRL+Cして、テーブルをハイライトしてからCTRL+Vでも悪くはないです。ここらへんは個人の趣味かもしれません。
日付を平成何年なのか知りたい
▶日付が入ったセルをクリック
▶セルの書式設定をクリック
▶分類:日付をクリック
▶カレンダーの種類:和暦をクリック
▶OKをクリックしなくても、サンプルに平成の日付が表示されます
選択範囲のセルを画像として保存する
やりたいのはエクセルのセルを画像として保存して、添付ファイルとしてメール送信です。mailItem.bodyには文字列しかセットできないのですが、セルの背景色情報がどうしても知りたいんです。特殊な条件で背景色を変更するようにセットしているからです。考えられる解決策は、① 画像ファイルとして保存して添付する ② HTMLフォーマットで記述してmailItem.HTMLBodyにセットする。今回は画像ファイルとして保存する方法を解説してみたいと思います。
世の中にはいろいろ知恵を絞ってる人がいるようで
mspaint.exeを立ち上げてSendKeys "^v", Trueすればいいじゃないかとか、ワークブックの実体はzipフォーマットなので拡張子を.zipに変えて、中にあるpngファイルを取り出せばいいとか、チャートに貼り付けてExportすれば10行でできるとか。
言うまでもなくチャートオブジェクトに貼り付けてjpgファイルとしてExportに決まりです。しかも、Pasteメソッドもあります。それにしてもチャートにそんなメソッドがあるとか知りませんでした。
デバッグモードでは問題ないが、普通に実行するとPasteが失敗する
xChart.Pasteするとチャートに何もペーストされないというバグでしばらく悩みました。デバッグモードではうまくいくのでさっぱり意味が分かりません。.CopyPictureしたシートにチャートオブジェクトを作らないとダメなのかと思いましたが、関係ありません。DoEventsを入れてみてもダメ。右クリックで出てくるポップアップメニューの貼り付けアイコンのあたりを上下に動かすと画像が出たり消えたりという不審な挙動があって、これがもしかしたら関係しているのかと思いましたが、関係なさそうです。
結局のところ.Selectで解決しました。全くの偶然で適当にやってみたらうまく行っただけの話でした。アクティブではないワークシートのセルを指定しても問題なく実行できるし、まぁ今回はこれでよしとしましょう。
Public Sub savePicture(pFileName As String, pRange As Excel.Range) Dim xChart As Excel.Chart Dim xSheet As Excel.Worksheet pRange.CopyPicture appearance:=xlScreen, Format:=xlPicture Set xSheet = pRange.Worksheet Set xChart = xSheet.ChartObjects.add(0, 0, pRange.Width, pRange.Height).Chart xChart.Parent.Select '<== これかよっ xChart.Paste xChart.Export Filename:=pFileName, filtername:="JPG" xChart.Parent.Delete End Sub
最後にファイル添付
Attachments.Add すればおしまいです。一応サンプルを載せておきます。
Private Sub SendMail() Dim oMail As Outlook.MailItem Dim oOutLook As Outlook.Application Dim xCell As Excel.Range Set oOutLook = New Outlook.Application Set oMail = oOutLook.CreateItem(olMailItem) oMail.Subject = "本日の途中経過 " & Format(Now, "MM/DD hh:mm") modUtil.savePicture ThisWorkbook.Path & "\tmp1.jpg", Sheet8.Range("AD2:AK7") modUtil.savePicture ThisWorkbook.Path & "\tmp2.jpg", Sheet8.Range("AM2:AT7") modUtil.savePicture ThisWorkbook.Path & "\tmp3.jpg", Sheet8.Range("AV2:BC7") oMail.Attachments.Add ThisWorkbook.Path & "\tmp1.jpg" oMail.Attachments.Add ThisWorkbook.Path & "\tmp2.jpg" oMail.Attachments.Add ThisWorkbook.Path & "\tmp3.jpg" oMail.body = "Hello Sam! How is your quest going?" oMail.To = "sam.bridges@central.knot.city.com" oMail.send End Sub