[[20150213140844]] 『月末の集計表を自動で保存したい』(お母さん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『月末の集計表を自動で保存したい』(お母さん)

いつも、いろいろと教えていただいております。
また、ちょっとわからないことがあったので、質問させていただきました。
計算式の入った集計表を月末に値を確定してシートを保存したいと思っております。
自分なりに調べて作ってみたのですが、わからないことがあって、教えて頂きたく、投稿しました。

仕様
・計算式の入っているシートは、クラス別集計表です。
・クラス別集計表の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


>・書いてみたコードの最初のIF文が赤文字でエラーになるのはなぜか?
Then が無いからでは?

>・月末に自動で上記のマクロを実行するには、どのようにしたらよいか?
勝手に動かれても困るので、ボタン押下すると動作する、等が良いのでは?

>・月末の判断をするようにしたいが、今日現在月末ではないが、実行のテスト?をする方法があるのか?
Date関数を直接使用せず、日付型の変数に代入し、これを使うように変更。
その上で、変数に代入する値を、任意の日付にすれば良いのでは?
(???) 2015/02/13(金) 14:33


YearやMonthは必要ない
MsgBox DateSerial(2015, 5, 0) 2015/4/30
MsgBox DateSerial(Year(2015), Month(5) + 1, 0) 1905/01/31

となります

関数で=(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

すいません先ほどの私が間違えていました
DateSerial(Year(Date), Month(Date) + 1, 0)で正しかったです

申し訳ありませんでした
(デイト) 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


コメント、閲覧ありがとうございます。
MOOkさんから教えていただいたコードを試してみたのですが、疑問点が2点あります。
修正箇所がわかれば教えて頂けますか?

 ?@値のコピーについて・・・。
  シートの値がコピーされると思ったのですが、結果は、計算式が入ったままで、値がコピーされていませんでした。コードをいろいろ調べたのですが、理論的にはあっているような気がします・・・。何か修正箇所がわかるようでしたら教えていただけますか?

 ?Aシート名について
  シートの名前はMonthと”月末”となっているので、今月だと2月末になると思うのですが、なぜか12月末というシート名になります。こちらも原因がわからず・・・。もし、解決策がわかるようでしたらお願いいたします。

自分でも、調べてみたのですが、わからなかったので、すみませんが、よろしくお願いいたします。
(お母さん) 2015/02/17(火) 15:51


実行しているマクロはクラス別集計表で行っていますか?

念のため以下のようにしても12月末となりますか?

作成シート名 = Month(Worksheets("クラス別集計表").Range("I1").Value) & "月末"

(デイト) 2015/02/17(火) 16:12


すみませんでした・・・。
クラス別集計表を開いている状態で実行してみると、正常に実行できました。
ありがとうございます。
(お母さん) 2015/02/17(火) 16:47

何度もすみません・・・。
マクロ実行時の条件(月末?)を考えていたのですが、なかなか良い案が思い浮かばずにいます。
考えた案は2つあるのですが、どちらも問題があり、実行できずにいます。何か良い案があれば教えていただけますか?

その1・・・タスクから自動実行を・・・と考えましたが、管理者権限?で拒否されるため、できませんでした・・・。(管理者に確認したところ、使用NGでした。)

その2・・・月末シート作成日というシートをつくり、作成したい日付をA列に羅列して入力し、その日付と同じ日付ならマクロを実施するようにしてみようと思ったのですが、ファイルが共有ブックになっており、たくさんの人がファイルをしょっちゅう開くときもあれば、誰も開かない日もあるので、何度もマクロを実行する?のも現実的ではないし、逆に誰も開かないときは、そのままスルーしてしまうということになりそうで・・・。私の個人カレンダーに書いておいても良いのですが、事情があり急にお休みをいただくことが多いので、何とかできないかな・・・思っております。

他に思いつく良い実行案がありましたら、どうか教えてください。
よろしくお願いします。

(お母さん) 2015/02/19(木) 11:08


自動実行を止めて、ボタン押下で実行にしてはいかがです?
ボタンは、最新情報を見たい人が押せばいい。それくらいは誰でもできますよね。
(というか、Excelブックの自動実行で解決しようとする発想が、ちょっと無茶かと…)
(???) 2015/02/19(木) 11:37

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.