[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『月初めに起動するマクロを作るには』(ひろくん)
いつもお世話になります月初め(その月ではじめてブックを開いたとき)に起動するマクロを作るにはどうすればよろしいでしょうか
ちなみに
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
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
あぁぁぁ、これは失礼しました。お返事ありがとうございます。 では、、調子に乗って、、↓の様にすれば必ず 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
一応ツッコミどころとしては
↓だと【yyyy年mm月】というシート名で固定になるだろうし、
newSh = "yyyy年mm月"
↓だと、既存のデータ消すことになるけどそれでいいのかなぁなんて思いますが・・・・
If Sh.Name = newSh Then Worksheets(newSh).Cells.Clear
(もこな2) 2021/05/27(木) 21:42
(ひろくん) 2021/05/27(木) 22:49
まぁ、私が答えそのものを出しちゃいましたが・・・・
2番目のほう
そもそも必要な処理なのか考えてみましょう。
いずれにせよ、検証(デバッグ)作業はご自身でなさるべきですよ。
(もこな2) 2021/05/28(金) 13:38
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
(もこな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
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
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) 2021/06/14(月) 20:46
(もこな2) 2021/06/14(月) 20:56
(もこな2) 2021/06/14(月) 21:02
Worksheets.Add(before:=Worksheets(2))
(もこな2) 2021/06/14(月) 21:26
before:=Worksheets(2)
(もこな2) 2021/06/14(月) 21:58
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
Worksheets.Add (before := Worksheets(2)) シートを追加しなさい 前に (アクティブブックの)2番目のシート
つまり、アクティブブックに【1枚しか】シートがないのに、【2番目の前】にシートを追加しろって命令になっていたのでExcel君が困っちゃったわけですね。
何をやっているかちゃんと理解できていれば、ご自身でコードの問題に気づけたとおもいます。
環境に合わせて自分の手でカスタマイズするのは重要ですが、理解せずに行き当たりばったりで直すのはやめたほうが良いと思います。
■10
修正後のコードでも、例えば今日実行したとして「2021年06月記録」シートがあるが、「2021年06月成績」シートがない場合ちょっと困ったことになると思いますが、それでよいのでしょうか?
(言われていることが分からなければ■6を再読したりステップ実行したりしてみてください)
(もこな2) 2021/06/14(月) 23:09
2021年06月記録 2021年05月成績 2021年05月記録 2021年04月成績 2021年04月記録
(もこな2) 2021/06/16(水) 08:31
↑で指摘しましたが、一向に返答される兆しが無いのでこちらは放置されるのだと判断しました。
よって以降説明しませんが、指摘だけしておきます。
「■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.