[[20190708204329]] 『マクロの起動条件に月末にだけ実行するには』(はじめて) ページの最後に飛ぶ

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

 

『マクロの起動条件に月末にだけ実行するには』(はじめて)

いつもお世話になっております
マクロの起動条件に月末にだけ実行するにはどうすればよろしいでしょうか
やることとしては
1 次の月のシートを作る
2 今月のシートにデータシートから今月分のデータをコピーする
以上2つのことをしたいです
よろしくお願いします

< 使用 Excel:Excel2010、使用 OS:Windows7 >


こんな感じにするとよいです。

1.次の月のシートがあるか確認し、あればExit Sub
2.今月分のデータが全部あるか確認し、なければExit Sub
3.今月分のデータをコピーする
4.次の月のシートを作る

(マナ) 2019/07/08(月) 21:32


ありがとうございます
まずは条件式なんですけど月末かどうかの判定式を悩んでいます
(はじめて) 2019/07/08(月) 21:43

データシートのレイアウトを説明できますか。

(マナ) 2019/07/08(月) 21:53


a b  c   d
7/7 福島 みかん 5
7/8 仙台  りんご 10
a列には日付 b列には地名 c列には品名 d列には個数です
わかりにくければすいません
(はじめて) 2019/07/08(月) 22:25

7/31のデータはいつ追加されるのですか。

(マナ) 2019/07/08(月) 22:35


当日の夜か翌日の朝です
(はじめて) 2019/07/08(月) 22:48

では、月末にマクロを実行すると
7/31のデータはコピーされないのでは?

(マナ) 2019/07/08(月) 22:53


あっそうですね
ではどうすればよろしいでしょうか
2日とかなら確実なんですかねー
(はじめて) 2019/07/08(月) 22:56

>2日とかなら確実なんですかねー

それは、わたしにはわかりません。

(マナ) 2019/07/08(月) 23:02


すいません
では毎月3日で起動する条件に変更します

(はじめて) 2019/07/08(月) 23:07


そもそも何に困っているのか、よくわかりませんが
3日に限定する必要があるのですか。

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


Sub main()
    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


ありがとうございます
お二方のコードでやりたいことはできました
あとは起動のタイミング
http://www.excel.studio-kazu.jp/kw/20190614213916.html
に近そうですがこれだと曜日になってしまうので
これを日付での判定に変えればいいと思うのですが
ひーさん質問をお借りしてすいません
(はじめて) 2019/07/10(水) 19:42

>お二方のコードでやりたいことはできました
どのコードを言ってるのかわからないけど、どのようにご自身のコードに組み込んだのか提示されたほうがよいかもしれません。

そのうえでですが、再三言われていると思いますけど、何回実行しても新しいシートを作る必要がなければ作らなきゃいいだけではないでしょうか?
極端な話、毎回判定して要らなきゃ作らない。それだけでよいはずですからなんで起動タイミングに拘っていらっしゃるのか私にはわかりません。

繰り返しになりますが、やりたいことがイマイチわからないので適当に考えて

【データ元】シート

 _______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


なるほどいろいろありがとうございます
仮に毎月第1◯曜日の場合どういう書き方したらいいでしょうか
(はじめて) 2019/07/11(木) 17:55

なんで頑なに、特定の時だけ実行っていうことに拘るのかわからないけど、第1○曜日っていうのに興味を持ったので頭の体操で考えてみました。

 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


わかりました色々ためしてみます
わからなければまた書きます
少しお待ち下さい
(はじめて) 2019/07/12(金) 18:03

遅くなりました
以前のひーさん質問をみると
        If Worksheets("管理用").Range("A1").Value <> Date Then

という条件式があったので
これを改良すればいいのですが
現在の私のスキルではわかりません すいませんヒントを頂けると幸いです
よろしくおねがいします
(はじめて) 2019/07/15(月) 15:15


>わかりました色々ためしてみます
どのようなことを色々ためしたのでしょうか?

>現在の私のスキルではわかりません すいませんヒントを頂けると幸いです
第一○曜日の"日付"を求める方法は投稿済み
本日の"日付"を求める方法は、調査済み
日付同士を比較して同じ日なのか【判定】する方法は既に理解されていると思われる

↑だとおもうのでわからない部分がわからないです。
繰り返しになりますが、自分で手を動かさずに答えがほしい場合は、別の回答者さんのほうが良いと思うのでで、私は撤退します。(と言いつつ、気が向いたら投稿するかもですが。)

(もこな2) 2019/07/15(月) 15:35


質問者さんもいつか気がつくだろうと思ってROMしていましたが、収拾がつかなくなりそうなので。

肝心なのは、質問者さんの前提、

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

ありがとうございますためしてみます
なお明日より出張で金曜以降に結果は返信します
(はじめて) 2019/07/15(月) 22:51

問いかけの形で書いちゃったから、返事いただいたとおもうのでレスしておきます。
>いろいろ考えましたが 〜
 提示されたものは、一応自分でステップ実行してみたんですよね?だとすると、疑問点がいくつか。
 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


遅くなりました BJさんの書いてた「マクロの起動条件に月末にだけ」は不可能という点理解していませんでした
なので
メインのマクロを開く度に起動

どこかのシートに日付を記録

その日付で判別する
という条件で実行するか判別するしかないと考えています
問題はIF文の書き方に悩んでいます
(はじめて) 2019/07/23(火) 20:49

 メインのマクロを開く度に起動 
 ↓ 
 どこかのシートに日付を記録 ←─この記録は何がやるのですか?(人間?、マクロ?)
 ↓               マクロなら開いた日になるでしょうから、無意味な気がしますが。
 その日付で判別する      

(半平太) 2019/07/23(火) 21:48


日付の記録はTODAY関数でやろうと考えています

(はじめて) 2019/07/23(火) 22:07


 >日付の記録はTODAY関数でやろうと考えています 

 それは、単なる当日のことですよね?
 必要なのは、正規にマクロを実行していいかどうかを判断する根拠日付なので、TODAY()は意味ないと思います。

 人間が日付を入れるなら、前月処理が終わった時(通常月初)に前月末日付をどこかのセルに入れて、目印にする筈です。

 マクロで自動的に割り出せるのかも知れないですが、回答側は情報不足で的確なロジックが分からないです。

 ※ちょっと言葉の行き違いになっているような感があるのですが、
 マクロは毎日実行するんですよ。
 ですが、その冒頭部分で正規の処理に入っていいかどうか判断して、
 まだ月末まで処理していないと判断したらそこでマクロは終了となります。
 その状態のことを「マクロを実行しない」と便宜上表現しているんです。

(半平太) 2019/07/23(火) 22:35


ああなるほど理解しました つまり日付は月初めの処理が終わったらこちらで入力するのですか

(はじめて) 2019/07/23(火) 22:45


 >つまり日付は月初めの処理が終わったらこちらで入力するのですか 

 そうすれば、確実です。

 どこのセルか決めておいて、そこに前月末日を入れる。 
 ※まぁ、日付じゃなくても、終了を意味するデータなら何でもいいです。(例:実行可)

 そんな塩梅になっているエクセルを開いた時、
 ブックのオープンイベントが作動し、上記セルに日付(または何かのデータ「例:実行可」)が
 入っているのを確認し、正規処理を続行する。

 実行し終えたら、上記セルを空白に戻す。

 毎月、このルーティーンの繰り返しです。

 それならオープンイベントのIF文は簡単ですよね。
 上記セルに日付が入っているかどうか確認して、入っていれば
 →正規処理を続行する(処理の終わりに上記セルをクリアする工程を入れるのを忘れないようにする)

 何も入って無かったら、プログラムを終了させて、何もなかったかのようにふるまう。

(半平太) 2019/07/23(火) 23:03


つまり
A1が日付とするなら
IF A1=31 THEN

という具合ですか
(はじめて) 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


皆さんいろいろありがとうございます
もこなさんが書かれてたDATE関数とはどういう意味でしょうか
(はじめて) 2019/07/24(水) 20:06

こちらをどうぞ。(VBA DATE関数 というキーワードでネット検索しました)
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/function/vba_date.html

(もこな2) 2019/07/24(水) 20:09


なるほど これによってファイルを最後に開いた日をa1に書き込むわけですね
ということは日付を書き込む処理は
閉じるときに入れればいいですね

(はじめて) 2019/07/24(水) 20:43


>なるほど これによってファイルを最後に開いた日をa1に書き込むわけですね
落ち着いて読んでほしい・・ほかの箇所でも使ってますよ
 (3)読み取った日付とDATE関数で求めた【今日】を比較して、翌月になっていたら
                    ~~~~~~~~~~~~~~~~~~~~~~~~

>日付を書き込む処理は閉じるときに入れればいいですね
それでも問題ないと思いますが、わざわざWorkbook_BeforeCloseイベントを書く必要も感じないので

 (5)最後に日付セルに【今日】を書き込む
                     ^^^^^^^^^^^^^^^^^^

つまり、一つのプロシージャで完結させることが可能だとおもいます。

(もこな2) 2019/07/24(水) 21:30


理解がいまいちできないのですが【今日】というのはファイルを最後に開いた日という意味ではないのですか理解がいまいちできなくてすいません
(はじめて) 2019/07/24(水) 21:35

>【今日】というのはファイルを最後に開いた日という意味ではないのですか
いや、マクロを実行している日じゃないでしょうか・・・

>ファイルを最後に開いた日
まぁ、普通は日中にファイル開いてマクロ実行するんでしょうから、同じ日かもしれませんが。

↓を記述したブックを 7/24 23:59に開いて、0:00に実行したらなんて出ると思います?

    Sub てすと()
        MsgBox Date
    End Sub

(もこな2) 2019/07/24(水) 22:47


実際に時計を進めてやったところ マクロを実行した日付でした
(はじめて) 2019/07/24(水) 23:06

まちがえていますでしょうか
(はじめて) 2019/07/25(木) 21:32

>まちがえていますでしょうか
何に対する問いかけか不明です。

>理解がいまいちできないのですが【今日】というのはファイルを最後に開いた日という意味ではないのですか理解がいまいちできなくてすいません
解決というか、理解できました?

(もこな2) 2019/07/25(木) 22:01


はい
昨日実験してみました
マクロを起動した日ですよね
(はじめて) 2019/07/25(木) 22:21

 わかんないかねぇ?
 何とかシートを作った日。
 作った後に日付を書き込む。
 順序ぐらいわかりそうなものだと思うけど・・・。

 人に聞いてばかりでなく、
 1度、紙に処理手順を書いた方がいいと思うよ。
 人任せだと全然身に付かないから。

(BJ) 2019/07/25(木) 22:31


作った日付とマクロを起動した日を比べて月が変わってたら新しくシートを作るんですよね
(はじめて) 2019/07/25(木) 23:05

 >月が変わってたら新しくシートを作るんですよね

 月末っていう結構あいまいなので、回答側からはっきりと言えません。
 土日、祝日、他休日が、月末に当てはまっていたら、どうするのかはっきりしていない。
 月末ってどういった位置づけですか?
 月最終日固定?
 ゴールデンウェークなんかどう処理するのでしょうか?
 月末に作れないケースだって出くわすと思います。
 その辺がはっきりしてないので、みなさん勝手に推測とかになっているんだと。
(BJ) 2019/07/26(金) 00:57

 コンビニに買い物途中で思いついた事、
 その月の該当シートが無ければ作る。
 では、だめかなぁ?

 ああ、スレ上の方はそんな考え方だった。
(BJ) 2019/07/26(金) 01:18

わかりました
では月の一番初めにファイルを開いたときに変更しますいろいろすいません
(はじめて) 2019/07/26(金) 06:28

>マクロを起動した日ですよね
言葉の綾なのかもしれないけど、【起動した】日ではないとおもいますよ・・・

>その月の該当シートが無ければ作る。
それは、再三言ったけど気に入らないらしいです。(なぜか特定の日に起動に拘っていらっしゃる)

(もこな2) 2019/07/26(金) 07:55


なぜでしょうか
(はじめて) 2019/07/26(金) 08:52

 おっと、、このトピはまだ続いていたのですね(^^;

 私は起動というのは、コードの中の分岐で↓こんなことかと思っていました。

 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

意味がわかりました
その月のシートがなければそのシートを作るという解釈で間違いないでしょうか
(はじめて) 2019/07/26(金) 16:31

えっと。。。

>なぜでしょうか

 何に対する問いかけなのか不明です。
 「【起動した】日ではないとおもいますよ・・・」に対してであれば、Date関数が返すのは、
 そのコードが実行された瞬間の(システム)日付を返すのだから、起動してからその行?に
 たどりつく前に日付が変われば、【マクロを実行した日】=【Date関数で取得した日】にはならない。 
 ただ、実際にそんなピンポイントなタイミングでマクロを実行することがない前提かもしれないから
 「言葉の綾かもしれない」とはじめに言っています。

>わかりました
>では月の一番初めにファイルを開いたときに変更しますいろいろすいません

 とりあえず、月の一番はじめに【マクロを実行したとき】で考えてください。
 (ファイルは開くけど、マクロは実行しないなんてことがあるかもしれませんので念のため)

>意味がわかりました
>その月のシートがなければそのシートを作るという解釈で間違いないでしょうか
間違いがないかどうかは、ご自身で判断されるべきでしょう。
ちなみに、その場合の考え方(処理方法の例)は、2019/07/10(水) 12:14 にお示ししています。

(もこな2) 2019/07/26(金) 23:25


だいぶ経ってしまいました色々ありがとうございます
(はじめて) 2019/08/14(水) 22:01

コメント返信:

[ 一覧(最新更新順) ]


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