役に立つか?VBAメモ

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

西暦打つの面倒くさい

 

エクセルで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足したものにする