[[20210524221724]] 『月初めに起動するマクロを作るには』(ひろくん) ページの最後に飛ぶ

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

 

『月初めに起動するマクロを作るには』(ひろくん)

いつもお世話になります月初め(その月ではじめてブックを開いたとき)に起動するマクロを作るにはどうすればよろしいでしょうか
ちなみに
1 月初めに起動
2 新しいシートを先頭に追加
3 シートの名前は「◯月記録」にしたい
以上の流れのマクロにしたいです
よろしくおねがいします

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 とりあえずは、マクロの自動記録してみてください。
 記録できない部分もありますので、変数を組み込ん
 でみたり、条件分岐したりするように改変することに
 なります。
(通りすがり) 2021/05/24(月) 22:54

詰まっている部分が分からないのでアイデアだけ。
>月初め(その月ではじめてブックを開いたとき)に起動する
とりあえず、起動してしまってから前回起動日(どこかのセルに書いておく)をチェックして同じ月内なら即終了すればよいでしょう。

>新しいシートを先頭に追加
マクロの記録で必要な命令にあたりを付けることができます。

>シートの名前は「◯月記録」にしたい
マクロの記録で必要な命令にあたりをつけることができます。
ただ、1年経ったらどうするのかを考えておかないとダメですね。
(同じシート名になっちゃうので。。。)

(もこな2) 2021/05/24(月) 23:13


 アイデアだけですが。

 >月初め(その月ではじめてブックを開いたとき)に起動するマクロ

 その月にマクロを起動したことがあるか否かで判定するのではなく、
 その月のシートが存在するか否かで判定したほうが楽ですね。
(通りすがり) 2021/05/25(火) 07:35

>その月のシートが存在するか否かで判定したほうが楽ですね。
たしかにそうですね。ご指摘ありがとうございます。

(もこな2 ) 2021/05/25(火) 09:31


 私のコメントは質問者さんにあてたもので、もこな2さんへ
 あてたものではありません。というか他の回答者の方の
 コメントに指摘のコメントを付けるようなおこがましいこと
 はできまへん(そこまでの力量は私にはありません・・・。)
(通りすがり) 2021/05/25(火) 18:26

シート挿入部分はマクロの記録でとれました
    Sheets("Sheet1").Select
    Sheets.Add
あとは条件分岐ですが・・・・・・・・・
(ひろくん) 2021/05/25(火) 20:30

 (1) ブックを開くとき毎回起動する
    → Workbook_Open イベントプロシジャを使う
 (2) 新しいシート名になる文字列 "○月記録" を生成するして変数に入れる
    → Date とか Now() とかをFormat関数で
 (3) (2)の文字列の名前のシートがあるか確認して条件分岐する
       → 検索しましょう
     (3-1) もしなかったら、ワークシートを追加して名前を変更
       → OKですか?
     (3-2) もしあったら、なにもしない

 シートの有無を確認する方法は、このページの上の 校内全文検索 で
 適切なキーワード入れればヒットしますよ
(´・ω・`) 2021/05/25(火) 20:53

 条件分岐するより、もしその名前のシートがあったら終了する方針の方が楽かも

 (1) ブックを開くとき毎回起動する
    → Workbook_Open イベントプロシジャを使う
 (2) 新しいシート名になる文字列 "○月記録" を生成するして変数に入れる
    → Date とか Now() とかをFormat関数で
 (3) 全シートをループして、シート名が(2)の文字列と一致したらプロシジャ終了
 (4) シートを追加して、名前変更
(´・ω・`) 2021/05/25(火) 21:03

既に必要な助言は頂いているので解決済みかもしれませんが。

■1
ブックが開かれたときにマクロが起動するようにするには、すでに案内のあった「Workbook_Open」のほかに「Auto_Open」を使うという手もあります。
https://excel-ubara.com/excelvba4/EXCEL239.html

■2
シートの有無を判定する方法はいくつかありますが、最近だと↓でそのような話をしましたので、余力があれば確認されるとよいと思います。
[[20210503222756]] 『複数のシートのデータを一つにまとめたい(他サイメx(ギラくん)

■3
ということを踏まえると、マクロを起動する方法は別にして、中身についてはこんな感じでもよいとおもいます。

    Sub さんぷる()
        Dim シート名 As String
        Dim SH As Worksheet

        シート名 = Format(Date, "yyyy年mm月")

        On Error Resume Next
        Set SH = Worksheets(シート名)
        On Error GoTo 0

        If SH Is Nothing Then Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = シート名
    End Sub

(もこな2) 2021/05/25(火) 22:23


少し難しそうですががんばってみます
また連絡します
(ひろくん) 2021/05/26(水) 17:42

ギラくんさんのを参考に作ってみました
 Sub sh_check改()
   Dim newSh As String
   Dim Sh As Worksheet, myFlag As Boolean
     newSh = "yyyy年mm月"  '---月のシート名です
     myFlag = False  '---のシートが有ったら True /無かったら False にするフラッグです
     For Each Sh In ThisWorkbook.Worksheets
         If Sh.Name = newSh Then
             myFlag = True
             Worksheets(newSh).Cells.Clear  
             Worksheets(newSh).Move before:=Sheets(1)
             Exit For
         End If
     Next Sh
       If myFlag = False Then
         ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
     End If
 End Sub
いかがでしょうか
(ひろくん) 2021/05/27(木) 20:07

 こんばんは!
最近、無視されることが多くなった私ですが、、、無視しないでくださいね(^^;
シートを追加する場合の私のお気に入りはseiyaさんに教えてもらった↓これです。。

 If Not Evaluate("=ISREF(" & newSh & "!A1)") Then Sheets.Add.Name = newSh

 まぁ、、ひとそれぞれですけど、、、
(SoulMan) 2021/05/27(木) 20:21

SoulManさん コメントありがとうございます 無視してないですよm(_ _)m
(ひろくん) 2021/05/27(木) 20:46

 あぁぁぁ、これは失礼しました。お返事ありがとうございます。
では、、調子に乗って、、↓の様にすれば必ず newSh が先頭にあることになるように思います。。未検証(^^;

 If Not Evaluate("=ISREF(" & newSh & "!A1)") Then ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
Worksheets(newSh).Move before:=Sheets(1)
(SoulMan) 2021/05/27(木) 20:55

■4
>いかがでしょうか
ちょっと意味が分からないんですが、これでよいか見てくれってことでしょうか?
【ご自身で検証した結果】問題がなければそれでよいでしょう。

一応ツッコミどころとしては
↓だと【yyyy年mm月】というシート名で固定になるだろうし、

 newSh = "yyyy年mm月"

↓だと、既存のデータ消すことになるけどそれでいいのかなぁなんて思いますが・・・・

 If Sh.Name = newSh Then Worksheets(newSh).Cells.Clear

(もこな2) 2021/05/27(木) 21:42


もこな2さん 
すいませんこれでよいか見てほしくて ただ指摘箇所については私も気づきませんでした
でもこの2つについてどうすればいいかわかりません
すいませんがよろしくおねがいします

(ひろくん) 2021/05/27(木) 22:49


最初のほう
(´・ω・`)さんの 「2021/05/25(火) 21:03」の(2)は読んだのですか?
 まぁ、私が答えそのものを出しちゃいましたが・・・・

2番目のほう
そもそも必要な処理なのか考えてみましょう。

いずれにせよ、検証(デバッグ)作業はご自身でなさるべきですよ。

(もこな2) 2021/05/28(金) 13:38


おそくなりました
Sub sh_check改2()
   Dim newSh As String
   Dim Sh As Worksheet, myFlag As Boolean
     newSh = "Format(Date, "yyyy年mm月"  '---月のシート名です
     myFlag = False  '---のシートが有ったら True /無かったら False にするフラッグです
     For Each Sh In ThisWorkbook.Worksheets
         If Sh.Name = newSh Then
             myFlag = True
         End 
     Next Sh
       If myFlag = False Then
         ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
     End If
 End Sub
としました
これでよいか見てほしくてよろしくおねがいします
(ひろくん) 2021/05/31(月) 19:09

>これでよいか見てほしくて
ご自身の検証ではokでしたか?先にそれを教えてください。

(もこな2 ) 2021/05/31(月) 19:26


悩むかもしれませんのでちょっとだけヒント
   newSh = "Format(Date, "yyyy年mm月"
 シート名 = Format(Date, "yyyy年mm月")

変数名は別にして、どこが違うかよく見比べてみてはいかがですか?

(もこな2 ) 2021/05/31(月) 19:50


おそくなりました
実行してみました

Sub sh_check改2()

 Dim newSh As String
   Dim Sh As Worksheet, myFlag As Boolean
     newSh = Format(Date, "yyyy年mm月")  '---月のシート名です
     myFlag = False  '---のシートが有ったら True /無かったら False にするフラッグです
     For Each Sh In ThisWorkbook.Worksheets
         If Sh.Name = newSh Then
             myFlag = True
         End 
     Next Sh ← 
       If myFlag = False Then
         ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
     End If
 End Sub
矢印部分でNextに対応するForがありませんと出てしまいます
どうすればよろしいでしょうか

(ひろくん) 2021/06/01(火) 19:35


まずそちらでしたか・・・・
ちょっとわかりづらいですが↓が適切でないため、構文としておかしいことになっています。
 End

If の相方ですから End だけではないですよね。

(もこな2) 2021/06/01(火) 19:48


 横から失礼します。

 参考HPです。

http://officetanaka.net/excel/vba/statement/End.htm
(通りすがり) 2021/06/01(火) 20:46


Sub sh_check改2()
 Dim newSh As String
   Dim Sh As Worksheet, myFlag As Boolean
     newSh = Format(Date, "yyyy年mm月") '---月のシート名です
     myFlag = False  '---のシートが有ったら True /無かったら False にするフラッグです
     For Each Sh In ThisWorkbook.Worksheets
         If Sh.Name = newSh Then
             myFlag = True
         End If
     Next Sh
       If myFlag = False Then
         ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
     End If
 End Sub

でできました皆さんありがとうございました
(ひろくん) 2021/06/02(水) 20:04


出来たと仰ってるし、追いかけてまで言うことでもないですが一応。

■5
↓についてBoolean型の初期値は「False」なので無くても大丈夫です

 myFlag = False

■6
↓について、条件に一致した段階でそれ以上探す必要はないので、myFlag = Trueの部分でループを抜けても問題ないです。

 For Each Sh In ThisWorkbook.Worksheets
     If Sh.Name = newSh Then
         myFlag = True
     End If
 Next Sh

さらにいうと、ループを抜けるのではなくプロシージャ自体を終了しても構いませんし、プロシージャを終了するのであれば、フラグをたてる必要もないですね。(以降は無条件で実行されないので)

■7
既に述べているところですが【ブックを開いたときに】マクロを起動させるなら、Workbook_Openイベントなどを使います。

■8
ということを踏まえると、【ThisWorkbookモジュール】に↓のように記述すれば目的は達成できるとおもいます。

    Private Sub Workbook_Open()
        Dim newSh As String
        Dim Sh As Worksheet

        newSh = Format(Date, "yyyy年mm月記録")
        For Each Sh In Worksheets
            If Sh.Name = newSh Then Exit Sub
        Next Sh

        Worksheets.Add(before:=Worksheets(1)).Name = newSh
    End Sub

(もこな2) 2021/06/05(土) 22:48


大変遅くなりました
もこな2さんのを参考にして仮に2つのシートを作るとすれば
    Private Sub Workbook_Open()
        Dim newSh As String
        Dim newSh2 As String
                Dim Sh As Worksheet

        newSh = Format(Date, "yyyy年mm月記録")
        For Each Sh In Worksheets
            If Sh.Name = newSh Then Exit Sub
        Next Sh

        Worksheets.Add(before:=Worksheets(2)).Name = newSh2 ←ここ
newSh2 = Format(Date, "yyyy年mm月成績")
        For Each Sh In Worksheets
            If Sh.Name = newSh2 Then Exit Sub
        Next Sh

        Worksheets.Add(before:=Worksheets(2)).Name = newSh2
    End Sub
としましたが
矢印部分でインデックスが有効範囲にありません。と出ますどうすればよろしいでしょうか
(ひろくん) 2021/06/14(月) 20:16

スマホからなので試してないですが、そのマクロを動かす直前に、ブックに2枚以上のシートがあるのは、間違いないですか?

(もこな2) 2021/06/14(月) 20:46


なるほど新しいブックを作って試してました
失礼しました
(ひろくん) 2021/06/14(月) 20:53

何がマズかったのか理解できているのですか?

(もこな2) 2021/06/14(月) 20:56


1枚だけのシートの状態で実行してました
(ひろくん) 2021/06/14(月) 20:58

【再掲】
何が(コードの何処が)マズかったのか理解できているのですか?

(もこな2) 2021/06/14(月) 21:02


それは理解できてません
すいません教えていただけたら助かります
よろしくお願いします
(ひろくん) 2021/06/14(月) 21:10

↓はどういう命令に命令になっているとおもいますか?
 Worksheets.Add(before:=Worksheets(2))

(もこな2) 2021/06/14(月) 21:26


先頭(左)から2番めにシートを追加しなさい でしょうか
違ってたらすいません
(ひろくん) 2021/06/14(月) 21:53

おしいでず
↓に注目しましょう
 before:=Worksheets(2)

(もこな2) 2021/06/14(月) 21:58


 Worksheets.Add(before:=Worksheets(1)).Name = newSh

 Worksheets.Add(before:=Worksheets(2)).Name = newSh2 ←ここ
になぜ書き換えたんですか。(2つ目は良いとして)

 Dim Sh As Worksheet が記載されていません。

(RT) 2021/06/14(月) 22:10


単純ミスです
すいません
    Private Sub Workbook_Open()
        Dim newSh As String
        Dim newSh2 As String
        Dim Sh As Worksheet

        newSh = Format(Date, "yyyy年mm月記録")
        For Each Sh In Worksheets
            If Sh.Name = newSh Then Exit Sub
        Next Sh

        Worksheets.Add(before:=Worksheets(2)).Name = newSh
    newSh2 = Format(Date, "yyyy年mm月成績")
        For Each Sh In Worksheets
            If Sh.Name = newSh2 Then Exit Sub
        Next Sh

        Worksheets.Add(before:=Worksheets(3)).Name = newSh2
    End Sub

で動きましたありがとうございます
(ひろくん) 2021/06/14(月) 22:19


■9
>動きましたありがとうございます
まぁ好きにすればいいですが、↓のようになっていました。 ​
   Worksheets.Add      (before :=        Worksheets(2))
​ シートを追加しなさい     前に     (アクティブブックの)2番目のシート

つまり、アクティブブックに【1枚しか】シートがないのに、【2番目の前】にシートを追加しろって命令になっていたのでExcel君が困っちゃったわけですね。

何をやっているかちゃんと理解できていれば、ご自身でコードの問題に気づけたとおもいます。
環境に合わせて自分の手でカスタマイズするのは重要ですが、理解せずに行き当たりばったりで直すのはやめたほうが良いと思います。

■10
修正後のコードでも、例えば今日実行したとして「2021年06月記録」シートがあるが、「2021年06月成績」シートがない場合ちょっと困ったことになると思いますが、それでよいのでしょうか?
(言われていることが分からなければ■6を再読したりステップ実行したりしてみてください)

(もこな2) 2021/06/14(月) 23:09


10の書かれてることがわからないのですこし考えさせてください
(ひろくん) 2021/06/15(火) 19:07

>10の書かれてることがわからない
たとえば、↓のようなシート構成のときに問題がないか実験してみてはどうですか?
 2021年06月記録
 2021年05月成績
 2021年05月記録
 2021年04月成績
 2021年04月記録

(もこな2) 2021/06/16(水) 08:31


[[20210625225354]] 『シートの並べ替えで』(ひろくん)

↑で指摘しましたが、一向に返答される兆しが無いのでこちらは放置されるのだと判断しました。
よって以降説明しませんが、指摘だけしておきます。

「■6」で説明のとおり、「Exit Sub」以降は無条件で実行されないので、仮に「2021年06月記録」シートがあるが「2021年06月成績」シートがないといったい場合、「2021年06月成績」は生成されないのが問題でしょう。

(もこな2) 2021/06/30(水) 21:37


コメント返信:

[ 一覧(最新更新順) ]


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