役に立つか?VBAメモ

仕事で使ったVBAをメモっとく

bat de 楽する 朝から自堕落ファイル

朝の事務所でのラジオ体操は、俺のPCから流します。

スピーカーの音量上げる→ラジオ体操.mp3をクリック→体操する

終わったら、スピーカーの音量とメディアプレイヤーを落とす。

たったこれだけですけど、音量の上げ下げを忘れたりといちいちが面倒。

怠け者過ぎますけどね。

なんで、batファイル書いとくことにしました。

VBAじゃないけど、メモっとくことにします。

 

用意するもの
・mcvc400.exe
・音源(ラジオ体操全205秒)
・メディアプレイヤー(今回はwindows付属のプレーヤー)

 

準備
mcvc400はここからダウンロードして、好きなところに解凍して置いてください。


MOS PrivateProduct コンテンツ


取り敢えずDドライブ直下にフォルダ名”mcvc400”として置いておきました。
mcvcの設定方法はmcvcに同梱のテキストを読んで下さい。

音源はmp3など再生可能なもので、ファイルパスとその音源の長さ(秒数)をメモしておいてください。

メディアプレイヤーはなんでもいいのですが、音源再生のデフォルトメディアプレイヤーにしてください。
実行ファイル名をメモしておくのも忘れずに。

 

作成
メモ帳を開いて書いていきます。


  @echo off
  流れを見たいならonで。
 
  cd /d D:\mcvc400
   /d 付けないとディレクトリ変わってくんないのね。Linuxのコマンドとちょっと違うんだね。
 
  mcvc.exe m80+
   音量80%ミュートオフにしました。
   
  start C:\Users\”ログインユーザ名”\Desktop\radio.mp3
   デスクトップ上のradio.mp3を再生します。
   パスにスペースが含まれる場合は""で囲むの忘れずに!
   
  timeout /t 205 /nobreak
   timeoutを使います。
   コマンドプロンプトでtimeout /?を打てば説明が出てきます。
   タイムアウト時間(=再生時間は205秒)でキーが押されても無視設定です。
   
再生が終わったあとの処理
  taskkill /f /im wmplayer.exe
   メディアプレイヤーを強制終了させます。

  https://technet.microsoft.com/ja-jp/library/cc725602
   
  cd /d D:\mcvc400
   また戻って
   
  mcvc.exe m-
   ミュートします。例えば10%音量にするならm10ね。
   
  最終行でEnterして1行下にすること。
 
@echo off
cd /d D:\mcvc400
mcvc.exe m80+
start C:\Users\hoge\Desktop\radio.mp3
timeout /t 205 /nobreak
taskkill /f /im wmplayer.exe
cd /d D:\mcvc400
mcvc.exe m-

1クリックで朝のお努め終わります。ものぐさにには格好です。
タスクスケジュール化できれば何もしなくても済むんですけど、体操は定時じゃないんでそれは出来なかった。
今どき流行らないでしょうが目覚まし時計とかにはいいんじゃないの?

 

DVD付き もっとスゴイ! 大人のラジオ体操 決定版 (講談社の実用BOOK)

DVD付き もっとスゴイ! 大人のラジオ体操 決定版 (講談社の実用BOOK)

 

 

 

自作アドインで楽々

便利なVBAはそれぞれのBOOKにコピペして使っていたが、いちいち面倒なのでアドイン化して
右クリックメニューに追加してみました。環境はExcel2013だけどそれ以前でも大丈夫だと思う。

エクセルを起動させ、ファイル-オプション-セキュリティーセンター-セキュリティーセンターの設定から
信頼できる場所に”C:\Users\hoge\AppData\Roaming\Microsoft\AddIns”を追加しておく。
但し、これを設定すると今後外部のアドインを拾ってきた場合も全て有効になるので注意が必要。
心配なら個別に設定したほうが無難なんじゃないかな。

新規ファイルを開きVBEを起動したら、下記を書いていきます。

ThisWorkBookに記入するWorkbook_Openイベントです。
余分に5件も動作をいれてしまった・・・
--------------------------------------------------------------
Private Sub Workbook_Open()
Dim cmdBr As CommandBar
Dim RcMenu0 As CommandBarButton
Dim RcMenu1 As CommandBarButton
Dim RcMenu2 As CommandBarButton
Dim RcMenu3 As CommandBarButton
Dim RcMenu4 As CommandBarButton

'通常と改ページ表示とも「Cell」名を使っているので双方でコマンドを表示するために実行
For Each cmdBr In Application.CommandBars
If cmdBr.BuiltIn Then 'Excel既定の参照かどうかを判断。規定値はtrue
If cmdBr.Name = "Cell" Then

'Object.Add(Type, Id, Parameter, Before, Temporary)
'Type=msoControlButton、定数は1、記述方法は下記いずれもOK
Set RcMenu0 = cmdBr.Controls.Add(Type:=msoControlButton, Temporary:=True)
Set RcMenu1 = cmdBr.Controls.Add(msoControlButton, , , , True)
Set RcMenu2 = cmdBr.Controls.Add(Type:=1, Temporary:=True)
Set RcMenu3 = cmdBr.Controls.Add(1, Temporary:=True)
Set RcMenu4 = cmdBr.Controls.Add(1, , , , True)

With RcMenu0
.BeginGroup = True 'グループ化する
.OnAction = "EXTex" '動作
.Caption = "Excel終了" '表記
End With

With RcMenu1
.OnAction = "SAVEEND"
.Caption = "保存後終了"
End With

With RcMenu2
.OnAction = "ENDBK"
.Caption = "終了"
End With

With RcMenu3
.BeginGroup = True
.OnAction = "Print860"
.Caption = "№860印刷"
End With

With RcMenu4
.OnAction = "Print2800"
.Caption = "№2800印刷"
End With

End If
End If

Next


End Sub
--------------------------------------------------------------
次に標準モジュールに記入します。
今回は、自分がよく使う5件を記入した。
Excelを有無を言わさず閉じる(保存もしない)
・アクティブなBOOKを保存してから閉じる
・アクティブなBOOKを有無を言わさず閉じる
・860番と名前のついたプリンタでクイック印刷
・2800番と名前のついたプリンタでクイック印刷
--------------------------------------------------------------
Option Explicit
'Excel閉じる
Public Sub EXTex() 
Application.DisplayAlerts = False
Application.Quit

End Sub
--------------------------------------------------------------
'保存後閉じる
Public Sub SAVEEND()
On Error Resume Next
ActiveWorkbook.SAVE
Application.DisplayAlerts = False

ActiveWorkbook.Close

Exit Sub

End Sub
--------------------------------------------------------------
'BOOKの強制終了
Public Sub ENDBK()
On Error Resume Next
Application.DisplayAlerts = False
ActiveWorkbook.Close

Exit Sub

End Sub
--------------------------------------------------------------
'№860プリンタで印刷
Public Sub Print860()
On Error GoTo Errmsg
ActiveSheet.PrintOut _
Copies:=1, _
ActivePrinter:="Printers №860", _
Collate:=True
Exit Sub

Errmsg:
MsgBox "印刷するものがありません"


End Sub
--------------------------------------------------------------
'№2800プリンタで印刷
Public Sub Print2800()
On Error GoTo Errmsg

ActiveSheet.PrintOut _
Copies:=1, _
ActivePrinter:="Printers №2800", _
Collate:=True
Exit Sub

Errmsg:
MsgBox "印刷するものがありません"

End Sub

 

全て記入が終わったら、名前をつけて拡張子をアドインの「.xla」か「.xlam」にして先のユーザーアドインフォルダに保存します。
Excelを再起動すると右クリックのメニューに先ほど設定したマクロがオプション-アドイン-Excelアドインに登録されています。
有効なアドインにチェックを入れると使えるようになります。(再度Excel再起動必要?)

アドインは再度書き直そうとしても直接は開けないですが、新規BOOKを開いてみるとVBEに出てきます(<自環境では)ので再編集は可能です。

ほぼ自分用メモなので読みづらかったらゴメンナサイ。
OfficeTabを使っていと閉じる操作の度に購入を促すダイアログが出て煩わしく、そのため終了系をメインで登録してあります。

※プリンタ名は別のWin32 API関数VBAまんま拾ってきて(http://www.geocities.co.jp/Technopolis/2082/Soft/Excel/Excel_b3.htm)、取得しました。怖いんで弄くれませんw

 

 

西暦打つの面倒くさい

 

エクセルで1月1日入力すると今年の1月1日になるから - 役に立つか?VBAメモ

 

 を書いたが、12月に入ったら入力する日付がみんな2015年ばかりになった。

もう".."さえ打つのが面倒になってきたので、VBAを書き換えた。

 

TextBox1に1/10と入力したとして、
Sheet1のセルA1(書式設定”日付”)に日付を入れたい。の場合。


If CDate(TextBox1.Value) < (Date - 240) Then
Sheets("Sheet1").Range("A1").Value = DateAdd("yyyy", 1, CDate(TextBox1.Value))
Else
Sheets("Sheet1").Range("A1").Value = TextBox1.Value
End If

CDateでTextBox1の値を日付に変換(2014/1/10になる。シリアル値で41649)したものより、
今日(2014/12/1とする。シリアル値で41974)より240日前(シリアル値41974-240)の方の値が大きかったら、
A1に入れる値は、DateAddを使い日付に変換したTextBox1値の、年のところに1を足した値(2014+1/1/10)にする。
違う場合はTextBox1値をA1にそのまま入れる。

-240日は、過去の日付は一切入れないなら要らないし、用途次第で変えれば良い。

 

すごく楽になったよ。

以上

 

カレンダーつづき

f:id:jus7733:20141128101200j:plain

カレンダー作成担当者です。

カレンダーは出来ましたが、なんとも味気ないし、月の並び方が気に食わなかったです(私だけ?)。
そこで月の並びを冒頭のように3ヶ月毎に横にしました。
また、表題部にはフォントを大きくし、元号表記も追加しました。

元号表記も自動で変わっていくようにセルの書式設定からユーザー定義を選び
"("[$-411]ggge"年)"
とします。書式だけではちゃんと出ないのでセルには「=VALUE($B$1&"/1/1")」を入力します。
会社用なので社名等々も入れておきます。

また会社用で従業員に配りますので、休業日はわかりやすく更に稼動日と休日の日数を表記します。
休業日は赤塗り潰しにしました。これは大した作業ではないので手作業です。

次に稼動日と休業日の日数を数えて表示しますが、これが面倒です。

最初に案を出して、各部署を回ってるあいだや承認確定後では結構休業日が変わっていたりします。
その都度数え直しをしていては間違えてしまいます。いや過去に間違えました・・・
そこで下記のユーザー関数の出番です。

色付きセルの数を数える関数です。
エクセル術 http://excel-magic.com/post-42/
を参考にさせていただきました。

Function CountColor(計算範囲, 条件色セル)
  Application.Volatile
    CountColor = 0
      For y = 1 To 計算範囲.Columns.Count
        For x = 1 To 計算範囲.Rows.Count
   If 計算範囲.Rows(x).Columns(y).Interior.ColorIndex = 条件色セル.Interior.ColorIndex Then CountColor = CountColor + 1
  End If
     Next
        Next
End Function

ユーザー関数は自動計算してくれないので” Application.Volatile”を書入れ、下記を登録しておくといいでしょう。
毎回キーを押さなくて済みます。

Sub 再計算()
  Application.CalculateFull
End Sub

これらを標準モジュールに登録し、セルに数式を入れていきます。
休業日日数のセルには「COUNTCOLOR(範囲,検索色)」を記入します。
1月なら=COUNTCOLOR(C8:I13,C10)になります。

稼動日は単純にCOUNT(範囲)-休業日日数を記入します。
1月なら=COUNT(C8:I13)-I14になります。

これならあれこれ案を変更されても対応が簡単ですね。

Outlook予定表をエクセル

Outlookの予定表っていちいち1件ずつインプットしてくのって面倒じゃん?

Excelの表で一覧作って

 

ボタンぽちって

 

ば〜って一気に予定入れられたら楽じゃん?

 

・・・

 

・・・

 

あるよ。

三流君参考にして作った。

スゲ━━━━━━ヽ(゚Д゚)ノ━━━━━━!!!!楽らく

要る?

さくっとカレンダー

f:id:jus7733:20141127145222j:plain

どもカレンダー作成担当者です。


毎年毎年カレンダーは変わります。
当たり前です^^;
毎年年末が近づくと次年度のカレンダー作りに四苦八苦します。
その度に手入力で日にちをずらしたりするのはかなり面倒です。
ましてや365日分全てに計算用の関数を入れるなんて真平御免なすって!
そこで、テンプレートを使うわけなんですがExcelにはたくさんのカレンダーテンプレートがあります。


その年その月半期ごとなどいろいろありますが、私が使っているのはこれ。
カレンダーの構成(任意の年)
9999年までずっと使える面倒のないやつです。
(エクセルで ファイル-新規から検索してみてください)

 

しかし、コヤツそのままでは#valueを吐いて使えません。
原因は名前の定義内での関数が月日年の並びになっているためです。
そこで【数式-名前の管理-編集】とクリックして
「"7/1/"&年カレンダー!$A$1」のように月日年並びになっているところを
「年カレンダー!$A$1&"/7/1"」というように年月日並びにに12ヶ月分変更します。

又はコンパネを開き”日付と時刻”形式のカスタマイズで短い形式をMM/DD/YYYYに変更します。
が、1ファイルのために全部を変更することはないので、面倒でも先の方法がいいでしょう。

土日のフォント色を変えたり、祝日を追加したりすれば出来上がりです。

f:id:jus7733:20141127145556j:plain


ちなみに2015年の祝日一覧はこちらです。

2015/1/1 元日
2015/1/12 成人の日
2015/2/11 建国記念の日
2015/3/21 春分の日
2015/4/29 昭和の日
2015/5/3 憲法記念日
2015/5/4 振替休日
2015/5/4 みどりの日
2015/5/5 こどもの日
2015/5/6 国民の休日
2015/7/20 海の日
2015/9/21 敬老の日
2015/9/22 国民の休日
2015/9/23 秋分の日
2015/10/12 体育の日
2015/11/3 文化の日
2015/11/23 勤労感謝の日
2015/12/23 天皇誕生日

 

5連休が年2回もありますね。
・・・休みの人はいいですね。

 

ただこれだけだと未だ会社カレンダーとしては使えません。
あとひとつふたつ付け足さないといけませんね。
それは次の機会に。

 

エクセルで1月1日入力すると今年の1月1日になるから

都度2015/~ってキー打つのめんどくさい~
5文字多い~


で、調べたらオートコレクトに”..”を登録して”2015/”って出るようにするのがあった。
早速使ってみたけど、TextBoxやUserForm上では効いてくれないらしい。
そのまま”..1/5”なんてなってしまう。

仕方ないのでオートコレクトをヒントにVBAで毎年変更せずオートコレクトと同じように使えるようにしました。
TextBoxに”..1/5”と入れるとセルに”2015/1/5”と表示されるVBAで、
”..”入れないで”1/5”だと”2014/1/5”ちゃんとになります。

オートコレクト毎年変えなくてもいいから楽ちんですね~

シート(1)にTextBox1を配置し、D1に結果を表示します。

 

Private Sub TextBox1_Change()

If Left(TextBox1.Value, 2) = ".." Then
TextBox1.Value = Replace(TextBox1.Value, "..", Format(DateAdd("yyyy", 1, Date), "yyyy") & "/")
Sheets("1").Range("D1").Value = TextBox1.Value
Else
Sheets("1").Range("D1").Value = TextBox1.Value
End If

End Sub

 

 日本語で書くとこう

 

TextBox1が変わったらやることだよ

もし、TextBox1の値の左から2つ目までが「..」だったら、
TextBox1の値は、TextBox1の値の「..」を今日の日付の年に1を足して、年だけの4桁に変えて最後に「/」を加えるよ
シート1のセルD1の値は、このTextBox1の値と一緒にするよ

「..」がなかったら

そのまんまシートD1の値は、このTextBox1の値と一緒にするよ

もしもの話はこれでおしまい

 

あたまんなかでこんな風に書いてます・・・

追記

こっちのほうが楽かも?

If CDate(TextBox1.Value) < (Date - 240) Then

Sheets("1").Range("D1").Value = DateAdd("yyyy", 1, TextBox1.Value)

'CDateで文字列を日付に変換したものが8ヶ月より前だったら
'D1の値をTB1の年の位に1足したものにする