[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『月末の集計表を自動で保存したい』(お母さん)
いつも、いろいろと教えていただいております。
また、ちょっとわからないことがあったので、質問させていただきました。
計算式の入った集計表を月末に値を確定してシートを保存したいと思っております。
自分なりに調べて作ってみたのですが、わからないことがあって、教えて頂きたく、投稿しました。
仕様
・計算式の入っているシートは、クラス別集計表です。
・クラス別集計表のI1セルにはToday関数が入っています。
やりたいこと
・月末になったら、自動でクラス別集計表を末尾にコピーして、値を確定し、シート名に○月末という名前をつけたい。
書いてみたコード
Sub 月末〆のシートを作成()
'
' 月末かどうかを判断
'
If DateSerial(Year(Date),Month(Date) + 1, 0) = Range("I1") Sheets("クラス別集計表").Select Sheets("クラス別集計表").Copy After:=Sheets(Worksheets.Count) Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveSheets.Name = ("DateSerial(Year(Date),Month(Date)&末") Else Exit Sub End If End
わからないこと
・書いてみたコードの最初のIF文が赤文字でエラーになるのはなぜか?
・月末に自動で上記のマクロを実行するには、どのようにしたらよいか?
・月末の判断をするようにしたいが、今日現在月末ではないが、実行のテスト?をする方法があるのか?
わからないことばかりで申し訳ないですが、どうぞよろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
取り敢えず、
・書いてみたコードの最初のIF文が赤文字でエラーになるのはなぜか?
は、Then が無いからですね。
・月末に自動
は、ブックを開いた時に判定するのか、月末に自動的にブックを開いてマクロを実行
するのか、どちらにするのか決めないと。
・月末の判断をするようにしたいが、今日現在月末ではないが、実行のテスト?をする方法があるのか?
PCの時刻設定を一時的に月末にしておくとかでは?
(ウッシ) 2015/02/13(金) 14:32
>・月末に自動で上記のマクロを実行するには、どのようにしたらよいか?
勝手に動かれても困るので、ボタン押下すると動作する、等が良いのでは?
>・月末の判断をするようにしたいが、今日現在月末ではないが、実行のテスト?をする方法があるのか?
Date関数を直接使用せず、日付型の変数に代入し、これを使うように変更。
その上で、変数に代入する値を、任意の日付にすれば良いのでは?
(???) 2015/02/13(金) 14:33
となります
関数で=(DATE(YEAR(2015),MONTH(5)+1,0))と入力しているのと一緒になります
(デイト) 2015/02/13(金) 14:41
<変更点>
一応、月末のシートが既にあるかどうか判断する文を追加
<問題点>
月末のシートがあったとしても、Exit Subしてくれずに、エラーがでる。
値をコピーしてくれずに、式がそのまま残っている。
<その他>
DateSerialのYearなどを抜こうとしたのですが、なぜかエラーになるので、そのままにしています。
自動で保存したいのは、ファイルを開かずとも、自動で、勝手に保存してくれるようにしてほしいということになります。(月末に保存することを忘れるため、月末ごとの集計比較ができないので、今回このマクロをつくることになりました。
<変更したコード>
Sub 月末〆のシートを作成()
'
' 月末のシートが既にあるかどうか判断
'
' シートの有無を確認する (1) '
Dim xWsheet As Worksheet
Dim xFlag As Boolean
For Each xWsheet In Worksheets
If xWsheet.Name = Sheets("クラス別集計表").Range("I1").NumberFormatLocal = "m" & "月末" Then xFlag = True Next xWsheet
If xFlag = True Then
' 該当のシートがある場合の処理 ' Exit Sub ' 該当のシートがない場合の処理 ' ' '月末のシートがまだ作成されていなかったら、今日が月末かどうか判断する ElseIf DateSerial(Year(Date), Month(Date) + 1, 0) = Range("I1") Then ' '月末だったら、シートを作成して値をコピーする Sheets("クラス別集計表").Select Sheets("クラス別集計表").Copy After:=Sheets(Worksheets.Count) Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveSheet.Name = Month(Range("I1")) & "月末" Else Exit Sub End If (お母さん) 2015/02/13(金) 16:39
申し訳ありませんでした
(デイト) 2015/02/13(金) 16:52
エラーは出ないかもしれないですが、これは無茶ですね。 If xWsheet.Name = Sheets("クラス別集計表").Range("I1").NumberFormatLocal = "m" & "月末" Then xFlag = True
条件比較も代入も、基本は 〇 = △ で 〇 = △ = □(〇 < △ < □ なども) とは出来ません。
ところで、気になったのですが月末判定は、どのようにするのでしょうか。 ・I1 にはいつでも処理した日が入っているのですか? ・月末がお休みだったらどうですのでしょうか?
フラグを使用しても良いですが、対象シートが見つかったらそこで処理を終了すれば 良いように思います。 (Mook) 2015/02/13(金) 16:54
とりあえずのたたき台ですが、I1 の日付を使ってシートを作成する例です。 シートがあれば、再作成(削除&作成)をするか、確認する仕様です。
Sub 月末〆のシートを作成() Dim 作成シート名 As String 作成シート名 = Month(Range("I1").Value) & "月末"
Dim シート As Worksheet On Error Resume Next '// シートがないときエラーになるのでエラーを無視に設定 Set シート = Worksheets(作成シート名) On Error GoTo 0 '// エラーを有効に戻す
If Not シート Is Nothing Then '// Exit Sub '// シートがある場合終了するのであれば、If の中はこの一行だけにする。
'// No を選んだら終了 If MsgBox(作成シート名 & "が既に存在します" & vbNewLine & "再作成しますか?", vbYesNo, "再作成確認") = vbNo Then Exit Sub '// 一旦シートを削除 Application.DisplayAlerts = False シート.Delete Application.DisplayAlerts = True End If
'// シートを作成 Worksheets("クラス別集計表").Copy After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = 作成シート名 End Sub
月末判定で自動作成にしたいのであれば、どうやれば月末の判定が出来るかを 明確にする必要があると思います。 (Mook) 2015/02/13(金) 17:05
DateSerial(Year(Date), Month(Date), 0) = Range("I1")
として月初に動かしたら作成という形にするというのはどうでしょうか?
(デイト) 2015/02/13(金) 17:13
シートに数式があったようですね。 先にあげたたたき台は、数式のままなので、値に変換しないといけなそうですね。 そのような処理の残骸はあったのですが、機能していなさそうだったので削ってしまいました。
Worksheets(Worksheets.Count).Name = 作成シート名 の後ろに、 Worksheets(作成シート名).Cells.Copy Worksheets(作成シート名).Cells.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Worksheets(作成シート名).Range("A1").Select Worksheets("クラス別集計表").Activate などを付ける感じでしょうか。
ただ I1 =TODAY() などとなっていると、月末を逃すと処理が大変そうです。 ・ファイルは年単位の運用でしょうか。 ・1月は(年をまたぐと)期待通りにならないと思いますが、問題ないでしょうか。 など、他にも気になる点がありますが、とりあえず。
(Mook) 2015/02/13(金) 19:05
?@値のコピーについて・・・。
シートの値がコピーされると思ったのですが、結果は、計算式が入ったままで、値がコピーされていませんでした。コードをいろいろ調べたのですが、理論的にはあっているような気がします・・・。何か修正箇所がわかるようでしたら教えていただけますか?
?Aシート名について
シートの名前はMonthと”月末”となっているので、今月だと2月末になると思うのですが、なぜか12月末というシート名になります。こちらも原因がわからず・・・。もし、解決策がわかるようでしたらお願いいたします。
自分でも、調べてみたのですが、わからなかったので、すみませんが、よろしくお願いいたします。
(お母さん) 2015/02/17(火) 15:51
念のため以下のようにしても12月末となりますか?
作成シート名 = Month(Worksheets("クラス別集計表").Range("I1").Value) & "月末"
(デイト) 2015/02/17(火) 16:12
その1・・・タスクから自動実行を・・・と考えましたが、管理者権限?で拒否されるため、できませんでした・・・。(管理者に確認したところ、使用NGでした。)
その2・・・月末シート作成日というシートをつくり、作成したい日付をA列に羅列して入力し、その日付と同じ日付ならマクロを実施するようにしてみようと思ったのですが、ファイルが共有ブックになっており、たくさんの人がファイルをしょっちゅう開くときもあれば、誰も開かない日もあるので、何度もマクロを実行する?のも現実的ではないし、逆に誰も開かないときは、そのままスルーしてしまうということになりそうで・・・。私の個人カレンダーに書いておいても良いのですが、事情があり急にお休みをいただくことが多いので、何とかできないかな・・・思っております。
他に思いつく良い実行案がありましたら、どうか教えてください。
よろしくお願いします。
(お母さん) 2015/02/19(木) 11:08
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.