[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの起動条件に月末にだけ実行するには』(はじめて)
いつもお世話になっております
マクロの起動条件に月末にだけ実行するにはどうすればよろしいでしょうか
やることとしては
1 次の月のシートを作る
2 今月のシートにデータシートから今月分のデータをコピーする
以上2つのことをしたいです
よろしくお願いします
< 使用 Excel:Excel2010、使用 OS:Windows7 >
1.次の月のシートがあるか確認し、あればExit Sub
2.今月分のデータが全部あるか確認し、なければExit Sub
3.今月分のデータをコピーする
4.次の月のシートを作る
(マナ) 2019/07/08(月) 21:32
(マナ) 2019/07/08(月) 21:53
(マナ) 2019/07/08(月) 22:35
(マナ) 2019/07/08(月) 22:53
それは、わたしにはわかりません。
(マナ) 2019/07/08(月) 23:02
(はじめて) 2019/07/08(月) 23:07
3日に実行できなくて、4日になってしまったら問題なのですか。
あるいは
3日に実行したのに、4日にもう一度実行してしまったら何か問題あるのですか。
(マナ) 2019/07/08(月) 23:37
(もこな2) 2019/07/09(火) 07:23
3日に実行できなくて、4日になってしまったら問題なのですか。 あるいは
3日に実行したのに、4日にもう一度実行してしまったら何か問題あるのですか。
特に問題はありませんが 2度実行したら同じ名前のシートが2つ存在してしまわないかが心配です
(はじめて) 2019/07/09(火) 17:21
こんばんは!
Excelあるあるですよね。。。
私も月末になると自動で作ってくれないかぁ、、と思うSheetは確かにありますね(^^;
でも、私はそういう作りを今のところしてませんね
ところで、、月末の次の日は、必ず、、1日 なので、、その日に1日足した日付が 1日 だったら、、月末でしょう?
でも、、2回目は?とか、、前日に実行出来なかったらどうするの?とか、、結構、面倒なんですよね
で、結局のところ、、Sheetをコピーするだけなら、、手動でやった方が早いわ。。。となる
まぁ、、、どこかのコードの一部に組み込むぐらいなら、、あり?なんでしょうかね。
頑張ってくださいね。。。では、、、では、、、 (SoulMan) 2019/07/09(火) 21:27
>特に問題はありませんが 2度実行したら同じ名前のシートが2つ存在してしまわないかが心配です
もしも上記の理由から月末のみマクロを起動したいとおっしゃっているのなら、もっと簡単に、 『同じ名前のシートが存在したら処理を中止する』というのはどうでしょうか?
(虎) 2019/07/10(水) 08:41
Dim sht As Worksheet, c As Range Application.DisplayAlerts = False For Each sht In Worksheets If sht.Name <> "データシート" Then sht.Delete Next sht For Each c In Sheets("データシート").Range("A:A").SpecialCells(2) Do For Each sht In Worksheets If sht.Name = Format(c.Value, "yyyy年m月") Then sht.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, 4).Value = c.Resize(, 4).Value Exit Do End If Next sht Sheets.Add after:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = Format(c.Value, "yyyy年m月") Loop Next c End Sub (mm) 2019/07/10(水) 10:44
※書きためている間に考え方がmmさんとかぶってしまいましたが、ご容赦ください。
Sub さんぷる_いち() Const tmp As String = "2019_07" Dim SH As Worksheet Dim ふらぐ As Boolean
For Each SH In Worksheets If SH.Name = tmp Then ふらぐ = True Exit For End If Next SH
If ふらぐ Then MsgBox tmp & " シートは存在します" Else MsgBox tmp & " シートは存在しません" End If
End Sub *-------------------------------------------------* Sub さんぷる_にぃ() Const tmp As String = "2019_07" Dim SH As Worksheet
On Error Resume Next Set SH = Worksheets(tmp) On Error GoTo 0
If Not SH Is Nothing Then MsgBox tmp & " シートは存在します" Else MsgBox tmp & " シートは存在しません" End If
End Sub *-------------------------------------------------*
踏まえて、どのタイミングで実行すればいいのかは自分で考えて、対象シートが無い場合だけシートを作成する(対象シートがある場合は、作成しない)ようにすればいいのでは?
(もこな2) 2019/07/10(水) 12:14
そのうえでですが、再三言われていると思いますけど、何回実行しても新しいシートを作る必要がなければ作らなきゃいいだけではないでしょうか?
極端な話、毎回判定して要らなきゃ作らない。それだけでよいはずですからなんで起動タイミングに拘っていらっしゃるのか私にはわかりません。
繰り返しになりますが、やりたいことがイマイチわからないので適当に考えて
【データ元】シート
_______A______B_____C_____D_____ 1 年月日 産地 商品 個数 2 7/7 福島 みかん 5 3 7/8 仙台 りんご 10
↓
【2019_07】シート
_______A______B_____C_____D_____ 1 年月日 産地 商品 個数 2 7/2 千葉 落花生 20 3 7/3 青森 りんご 30 4 7/7 福島 みかん 5 5 7/8 仙台 りんご 10
みたいに月別のシートに集積していきたいのだとした場合。
Sub テキトー() Dim MySH As Worksheet Dim tmp As String
With Worksheets("データ元") tmp = Format(.Range("A2").Value, "YYYY_MM") On Error Resume Next Set MySH = Worksheets(tmp) On Error GoTo 0
'▼無い時だけシートを作る If MySH Is Nothing Then Worksheets("ひな形").Copy After:=Worksheets(Worksheets.Count) Set MySH = Worksheets(Worksheets.Count) MySH.Name = tmp End If
'▼普通にコピペするだけ .Range("A2", .Cells(.Rows.Count, "D").End(xlUp)).Copy _ MySH.Cells(.Rows.Count, "A").End(xlUp).Offset(1)
End With
End Sub
ただ、試せばわかると思いますが、あえて言っておくと【データ元】シートで複数の月が混ざっていると、上記ではマズイので、もうひと手間加える必要がありますね。
(もこな2) 2019/07/10(水) 23:31
>では毎月3日で起動する条件に変更します
上記のとおり毎月3日を条件とするなら、 If Day(Date) = 3 Then(Date関数は現在の日付を、Day関数は指定されて日付の"日"の部分を返します) とかでできそうですが、たとえば8月なんかは3日って土曜日なんですよね…(^^; もちろん日曜日になる可能性もありますし、5/3とか11/3は祝日ですが、大丈夫なんでしょうか? 毎月稼働3日目とかの意味なのかな?とも思いましたが、自分はそれを実現するのは難しそうだなと 思いました…(あくまで自分のスキルでは…です)
あとは、毎月3日に限れば何度でもマクロを実行できてしまうことになるので、それって結局、
>特に問題はありませんが 2度実行したら同じ名前のシートが2つ存在してしまわないかが心配です
ここが引っかかるところだと思います。
うーん…いろいろと自分が考えすぎてるだけですかね?(^^;
(虎) 2019/07/11(木) 08:48
Sub 第1水曜日() Dim tmp As Variant Dim i As Long
tmp = Split(InputBox("年月をカンマで区切って入力してください"), ",")
'Weekday関数を使って、1日の曜日を調べ、目的の曜日(この場合水曜日)との日数差を算出 i = 4 - Weekday(DateSerial(tmp(0), tmp(1), 1)) If i < 0 Then i = i + 7
'1日から何日後が第一水曜日か計算して表示 MsgBox Format(DateSerial(tmp(0), tmp(1), 1) + i, "yyyy月m月d日(aaa)")
End Sub
(もこな2) 2019/07/11(木) 20:01
tmp = Split(InputBox("年月をカンマで区切って入力してください"), ",") ですがインプットボックスではなく日付(仮)シートのa1に日付が出るようにしてそこで判定させることはできますでしょうか いろいろすいません (はじめて) 2019/07/11(木) 21:19
自分でやってみて、何かうまくいかない部分があるのであれば、まずそちらを提示して、どちらでどのようなエラーが出てしまうのか、エラーにならないまでも、○○となるはずなのに××となってしまったなど、ご説明いただくとアドバイスできることがあるかもしれません。
(もこな2) 2019/07/11(木) 23:16
If Worksheets("管理用").Range("A1").Value <> Date Then
という条件式があったので
これを改良すればいいのですが
現在の私のスキルではわかりません すいませんヒントを頂けると幸いです
よろしくおねがいします
(はじめて) 2019/07/15(月) 15:15
>現在の私のスキルではわかりません すいませんヒントを頂けると幸いです
第一○曜日の"日付"を求める方法は投稿済み
本日の"日付"を求める方法は、調査済み
日付同士を比較して同じ日なのか【判定】する方法は既に理解されていると思われる
↑だとおもうのでわからない部分がわからないです。
繰り返しになりますが、自分で手を動かさずに答えがほしい場合は、別の回答者さんのほうが良いと思うのでで、私は撤退します。(と言いつつ、気が向いたら投稿するかもですが。)
(もこな2) 2019/07/15(月) 15:35
肝心なのは、質問者さんの前提、
1 次の月のシートを作る
2 今月のシートにデータシートから今月分のデータをコピーする
の前に、「今月分の処理が終了している」と言う前提が抜けている事だと思います。
それがあいまいなばかりに、回り道をしています。
逆に、それが判断出来れば、何日目などという無意味な判断は不要になると思います。
一年の中にはGWなど不規則な月もあるわけですから、余計に複雑になります。
単純に、当月が締まったら、「繰越」ボタンなどを設定して、マニュアルで起動させ、次月のシートの作成、当月分のデータのコピペなどを実行させれば済む事ではないでしょうか?
自分も同様な事をやっていますが、あくまでトリガーは、人です。ただ、ボタン一つで新規シートができるので、それはそれで楽ですね。
回答者の方々もそれなりの経験からアドバイスしていると思いますので、思い込みを一旦クリアして、最前のフローを検討されるのが一番だと思います。
(渡辺ひかる) 2019/07/15(月) 16:29
根本的に解決する流れでないように思うのですが。
マクロを実行する曜日なり日にちを決めてもだめだと思いますが。
決めた日にファイルを開く保証があるのでしょうか?
ファイルを開くことも自動的に実行するのでしょうか?
パソコンを起動も自動的にしなければならないし。
1ヶ月分のデータがそろった時点で
データを1回、コピーすればいいだけなのだから
月が変わった後でマクロを手動で実行すればよいのでは
1.先月のシートが無ければ作成する
2.先月シートのデータをクリアする。(既にあった場合・再実行したときのため)
3.データをコピーする
だけのこと
もしデータが間違っていたり、漏れていたことが分かったら
元データを追加・修正してから
もう一回実行すればいいだけ
(ん) 2019/07/15(月) 16:44
Sub 第1水曜日() Dim tmp As Variant Dim i As Long
tmp = Worksheets("管理用").Range("A1").Value <> Date
'Weekday関数を使って、1日の曜日を調べ、目的の曜日(この場合水曜日)との日数差を算出 i = 4 - Weekday(Date) If i < 0 Then i = i + 7 end sub しかわかりませんでした あとはこれをどうやって条件式にすればいいのでしょうか (はじめて) 2019/07/15(月) 20:47
>マクロの起動条件に月末にだけ実行するにはどうすればよろしいでしょうか >やることとしては >1 次の月のシートを作る >2 今月のシートにデータシートから今月分のデータをコピーする >以上2つのことをしたいです
肝心のシート名の詳細が無いので、勝手に想定
Private Sub Workbook_Open() Dim ws As Worksheet, NextMonth As Date NextMonth = DateAdd("m", 1, Date) - Day(Date) + 1 '<--次月1日を求める On Error Resume Next Set ws = Sheets(Format$(NextMonth, "yyyy年mm月分")) '<--次月分のシートの有無確認 On Error GoTo 0 If Not ws Is Nothing Then Exit Sub '<--次月分該当シートが存在すれば終了、無ければ続行。 If Date >= NextMonth - 2 Then '<- 本日日付が次月1日より2日前以降であればシートを作成する。 Sheets.Add(, Sheets(Sheets.Count)).Name = Format$(NextMonth, "yyyy年mm月分") 'データのコピー 前月(今月?)シートへペースト End If End Sub (seiya) 2019/07/15(月) 22:07
提示されたものは、一応自分でステップ実行してみたんですよね?だとすると、疑問点がいくつか。 tmp = Worksheets("管理用").Range("A1").Value <> Date ・Worksheets("管理用").Range("A1")にはいつどのようなタイミングで何を書き込んでおくのですか? ・tmp という変数は【True】か【False】が格納されたとおもうのですが、どこで使ってるんですか?
If i < 0 Then i = i + 7 ・iという変数には【数値】が格納されたかとおもうのですが、どこで使ってるんですか?
>今月のシートにデータシートから今月分のデータをコピーする
再三言っているとおもいますが、【月末かどうかに関わらず】 ・【データ】シートから、年月を取得する ・取得した【年月】のシートがあるか確認する ・↑が【なければ】作成する (あれば作成しないから、「同じ名前のシートが2つ存在」なんてことにはならない) (そもそもやりたくてもできないが) ・データシートから【年月】のシートへコピぺする
ではダメなのです?
そこまで"特定のタイミングのみ実行"に異様にこだわる理由が全然ピンとこないのは私だけでしょうか・・・
(もこな2) 2019/07/16(火) 02:35
If i < 0 Then i = i + 7 ・iという変数には【数値】が格納されたかとおもうのですが、どこで使ってるんですか?
↓
If i < 0 Then i = i + 7 ・iという変数にはLong型の初期値である【0】が格納されているとおもいますが、何がしたいんですか?
(もこな2) 2019/07/16(火) 02:44
だらだらと長いスレッドに書き込みたくないけど、 1番単純なのは、 前回マクロ起動日時として、どこかのセルにでも書き込んでおけばいいんじゃないですか。 そうすれば、目でも見えるしこの日付を基準として、マクロを中断するか実行するかの判別ができると思うけど・・・。 私はめんどい事が嫌いなので、こうするけど・・・。
>マクロの起動条件に月末にだけ実行するにはどうすればよろしいでしょうか
これについて、誰も書いてないのが??だけど、「マクロの起動条件に月末にだけ」と言ったような条件を つけることはできません。タスクスケジューラを使わない方法だと、まずはマクロを起動してから、 メインプログラムを実行するかしないかの条件判定をするだけです。(必ずマクロは起動させます。) この辺を理解しているのか不明。
(BJ) 2019/07/16(火) 15:26
メインのマクロを開く度に起動 ↓ どこかのシートに日付を記録 ←─この記録は何がやるのですか?(人間?、マクロ?) ↓ マクロなら開いた日になるでしょうから、無意味な気がしますが。 その日付で判別する
(半平太) 2019/07/23(火) 21:48
(はじめて) 2019/07/23(火) 22:07
>日付の記録はTODAY関数でやろうと考えています
それは、単なる当日のことですよね? 必要なのは、正規にマクロを実行していいかどうかを判断する根拠日付なので、TODAY()は意味ないと思います。
人間が日付を入れるなら、前月処理が終わった時(通常月初)に前月末日付をどこかのセルに入れて、目印にする筈です。
マクロで自動的に割り出せるのかも知れないですが、回答側は情報不足で的確なロジックが分からないです。
※ちょっと言葉の行き違いになっているような感があるのですが、 マクロは毎日実行するんですよ。 ですが、その冒頭部分で正規の処理に入っていいかどうか判断して、 まだ月末まで処理していないと判断したらそこでマクロは終了となります。 その状態のことを「マクロを実行しない」と便宜上表現しているんです。
(半平太) 2019/07/23(火) 22:35
(はじめて) 2019/07/23(火) 22:45
>つまり日付は月初めの処理が終わったらこちらで入力するのですか
そうすれば、確実です。
どこのセルか決めておいて、そこに前月末日を入れる。 ※まぁ、日付じゃなくても、終了を意味するデータなら何でもいいです。(例:実行可)
そんな塩梅になっているエクセルを開いた時、 ブックのオープンイベントが作動し、上記セルに日付(または何かのデータ「例:実行可」)が 入っているのを確認し、正規処理を続行する。
実行し終えたら、上記セルを空白に戻す。
毎月、このルーティーンの繰り返しです。
それならオープンイベントのIF文は簡単ですよね。 上記セルに日付が入っているかどうか確認して、入っていれば →正規処理を続行する(処理の終わりに上記セルをクリアする工程を入れるのを忘れないようにする)
何も入って無かったら、プログラムを終了させて、何もなかったかのようにふるまう。
(半平太) 2019/07/23(火) 23:03
という具合ですか
(はじめて) 2019/07/23(火) 23:10
うーん、日付を入れるくらいなら、その手間で、正規マクロを実行して貰えば一番簡単なんですが、 入力者はマクロ実行は出来ない人なんですかねぇ?
当該セルに何かを入力したら、正規マクロが実行されるという作りにしてももいいですね。
上記方式だと、文字通り、マクロはその時だけ実行されます。
>IF A1=31 THEN
そりゃ、数式ですね。
マクロのブックオープンイベントだと こんな塩梅(ThisWorkbookモジュールに) ↓ Private Sub Workbook_Open() If IsDate(Sheets("Sheet1").Range("A1").Value) Then’日付が入っていたら '正規処理 End If End Sub
(半平太) 2019/07/23(火) 23:19
久々にあがったので見てみましたが話がなんかループしてる・・・
[[20190614213916]] 『マクロの起動条件に』(ひー)
一度は↑が参考になるとおもったんですよね?
ちゃんと読んだ上で判断したんでしょうか・・・・
日付をどこかに【あらかじめ】書いておく場合の処理の順番はこうじゃないでしょうか
(1)とりあえずマクロを実行する(以下、マクロの話) (2)日付セルの日付を読み取る (3)読み取った日付とDATE関数で求めた【今日】を比較して、翌月になっていたら 【今月】のシートを作成する (4)コピペ処理でもメッセージでも好きな処理をする (5)最後に日付セルに【今日】を書き込む (6)マクロ処理終了 ※日付セルに日付が入ってない場合のことは考えてません。
これなら、月替わりで初めて起動したときしか、【今月】は作成しないですよね。
(もこな2) 2019/07/23(火) 23:33
(もこな2) 2019/07/24(水) 20:09
(はじめて) 2019/07/24(水) 20:43
(3)読み取った日付とDATE関数で求めた【今日】を比較して、翌月になっていたら ~~~~~~~~~~~~~~~~~~~~~~~~
>日付を書き込む処理は閉じるときに入れればいいですね
それでも問題ないと思いますが、わざわざWorkbook_BeforeCloseイベントを書く必要も感じないので
(5)最後に日付セルに【今日】を書き込む ^^^^^^^^^^^^^^^^^^
つまり、一つのプロシージャで完結させることが可能だとおもいます。
(もこな2) 2019/07/24(水) 21:30
>ファイルを最後に開いた日
まぁ、普通は日中にファイル開いてマクロ実行するんでしょうから、同じ日かもしれませんが。
↓を記述したブックを 7/24 23:59に開いて、0:00に実行したらなんて出ると思います?
Sub てすと() MsgBox Date End Sub
(もこな2) 2019/07/24(水) 22:47
>理解がいまいちできないのですが【今日】というのはファイルを最後に開いた日という意味ではないのですか理解がいまいちできなくてすいません
解決というか、理解できました?
(もこな2) 2019/07/25(木) 22:01
わかんないかねぇ? 何とかシートを作った日。 作った後に日付を書き込む。 順序ぐらいわかりそうなものだと思うけど・・・。
人に聞いてばかりでなく、 1度、紙に処理手順を書いた方がいいと思うよ。 人任せだと全然身に付かないから。
(BJ) 2019/07/25(木) 22:31
>月が変わってたら新しくシートを作るんですよね
月末っていう結構あいまいなので、回答側からはっきりと言えません。 土日、祝日、他休日が、月末に当てはまっていたら、どうするのかはっきりしていない。 月末ってどういった位置づけですか? 月最終日固定? ゴールデンウェークなんかどう処理するのでしょうか? 月末に作れないケースだって出くわすと思います。 その辺がはっきりしてないので、みなさん勝手に推測とかになっているんだと。 (BJ) 2019/07/26(金) 00:57
コンビニに買い物途中で思いついた事、 その月の該当シートが無ければ作る。 では、だめかなぁ?
ああ、スレ上の方はそんな考え方だった。 (BJ) 2019/07/26(金) 01:18
>その月の該当シートが無ければ作る。
それは、再三言ったけど気に入らないらしいです。(なぜか特定の日に起動に拘っていらっしゃる)
(もこな2) 2019/07/26(金) 07:55
おっと、、このトピはまだ続いていたのですね(^^;
私は起動というのは、コードの中の分岐で↓こんなことかと思っていました。
Option Explicit Sub てすと() If Day(Date + 1) = 1 Then MsgBox "月末です。" Else MsgBox Day(Date + 1) & " 日です。" _ & vbCrLf & "月末ではありません" End If End Sub (SoulMan) 2019/07/26(金) 09:18
1つのプロシジャーに全て書こうと考えている人と、 構造化プログラムで、2つのプロシジャーに分けて考える人とのすれ違いがあるようです。 (初期処理、主処理)
sub 毎日起動() if その月に該当するシートがなかったら then メインプログラムを呼び出す end sub end sub
sub メインプログラム() ・・・・・ end sub (BJ) 2019/07/26(金) 11:41
↑ 多分解釈間違ってる。 (BJ) 2019/07/26(金) 11:45
>なぜでしょうか
何に対する問いかけなのか不明です。 「【起動した】日ではないとおもいますよ・・・」に対してであれば、Date関数が返すのは、 そのコードが実行された瞬間の(システム)日付を返すのだから、起動してからその行?に たどりつく前に日付が変われば、【マクロを実行した日】=【Date関数で取得した日】にはならない。 ただ、実際にそんなピンポイントなタイミングでマクロを実行することがない前提かもしれないから 「言葉の綾かもしれない」とはじめに言っています。
>わかりました
>では月の一番初めにファイルを開いたときに変更しますいろいろすいません
とりあえず、月の一番はじめに【マクロを実行したとき】で考えてください。 (ファイルは開くけど、マクロは実行しないなんてことがあるかもしれませんので念のため)
>意味がわかりました
>その月のシートがなければそのシートを作るという解釈で間違いないでしょうか
間違いがないかどうかは、ご自身で判断されるべきでしょう。
ちなみに、その場合の考え方(処理方法の例)は、2019/07/10(水) 12:14 にお示ししています。
(もこな2) 2019/07/26(金) 23:25
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.