- ベストアンサー
Excel2013 1日1回だけリセットする方法は
1日1回だけ特定セルをリセットしているのですが、データファイルを複数で共有しているので、2回以上押してしまうことがあります。 現在は、特定のセルをリセットするためのリセットボタンを押すとボタンの色が変わるようにマクロを組んでいるのですが、それでも、2回押す場合があります。 問: リセットスイッチを1日1回だけアクティブになるようにするにはどうしたらよいのでしょうか。(リセットスイッチを1回押すと、日付が変わらないと再度アクティブ状態にならないようにする。) よろしく、ご指導お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 'ボタン'は、シート上に配置したActiveXコントロールのコマンドボタン である、という前提でとりあえずお応えします。 (もしもフォームコントロールやユーザーフォームだった場合は、 ボタン等のオブジェクト名と現在登録中のマクロの記述を追加提示してください。) 幾つか方法はありそうですが、管理に悩まないで済みそうな方法として。 ◆'リセット'を実行した日付を、どこか失われない所に保管する。 例では、コマンドボタンのキャプション。 オプションとして、.TopLeftCell に記録する方法もあり。 ◆'リセットスイッチを1回押すと、日付が変わらないと再度アクティブ状態にならないようにする。' 例では、.Enabledプロパティで、ボタンアクションの有効/無効を切り替える。 オプションとして、.Visibleプロパティで、表示/非表示を切り替える方法もあり。 但し、'リセット'した後で必ず、ブックを上書き保存する、 という前提になります。 もっとも'リセット'の処理内容がそのボタンが置かれたブックの外に影響しないものであれば、 上書き保存しない場合は、'リセット'処理も取り消される、という結果で、 特に問題ありません。 尚、▲opt1▲opt2と選べるように書き添えていますが、必ずどちらかに統一してください。 ' ' シートモジュール========================= Private Sub CommandButton1_Click() ' ■コントロール名を正確に指定■ ' ■ここに 'リセット'処理の記述■ With CommandButton1 ' ■コントロール名を正確に指定■ .Caption = CStr(Date) ' ▼opt1/2(要統一#1) ' .TopLeftCell.Value = Date ' ▲opt2/2 .BackColor = vbRed ' 色はお好みで .Enabled = False ' .Enabled または .Visible(要統一#2) End With End Sub ' ' ================================= ' ' ThisWorkbookモジュール====================== Private Sub Workbook_Open() With Sheets("Sheet1").CommandButton1 ' ■シート名・コントロール名を正確に指定■ If .Caption = CStr(Date) Then Exit Sub ' ▼opt1/2(要統一#1) ' If .TopLeftCell.Value = Date Then Exit Sub ' ▲opt2/2 .Caption = "リセット" .BackColor = vbYellow ' 色はお好みで .Enabled = True ' .Enabled または .Visible(要統一#2) End With End Sub ' ' ================================= 実装前に、テスト用のブックを作成して動作仕様を確認し、 他のシステムとの整合性をシミュレートするようにしてください。 以下にあるテスト支援用マクロ('リセット'した日付を昨日にします)を 実行して、上書き保存と共にブックを閉じる→再度開く。 ' ' テスト支援用マクロ======================== Sub Yesterdy() With Sheets("Sheet1").CommandButton1 ' ■シート名・コントロール名を正確に指定■ .Caption = CStr(Date - 1) ' ▼opt1/2(要統一#1) ' .TopLeftCell.Value = Date - 1 ' ▲opt2/2 End With End Sub ' ' ================================= テストしてみて、不足があれば、補足欄にでも書いてみてくだい。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
#1と同じような回答になりますが、リセットスイッチを押された日付(システム日付Date)を、システム設計者が自分が決めたテキストファイルに保存する。 日付進行ボタンを押されたとき、記録されたテキストファイルを読み、現在日付と同じなら何もしない(効果なし)、違う(進んだ日付)の場合のみ、所定の効果(特定のセルをリセット)をするようにする。 特定の効果を実行したときは、テキストファイルも同時に書き換え、保存する。 数ステップ増えますが、エクセルと離れた(別の)ファイルに、状態(リセットした日付)を記録して行かなければならない。そのほかにはよい方法はないと思います。 使わない部分のセルに記録する手もあるが、どうしても、利用者に邪魔な場面や触られる場面が考えられるので、特別フィル(その中で一番簡単なテキストファイル)を設けます。。 エクセルでは、日付は、日付シリアル値で、20世紀初めからの経過日数の整数です。日の経過とともに増えます。システム日付をシリアル値に変換して、テキストファイルに記録している日付シリアル値と比べて、以上なら、日が進んだということであり、同じなら同じ1日に2回目で、コメントメセージを出して何もしない。 VBA関数のDate,DateSerial,DateValueを調べてください。 ついでにリセットボタン制度でなくDate関数(最新の日づけ)ではだめなのか、特定のセルのChangeイベントやSelectionChangeイベントを捉えて、上記のことができないか検討してみてください。 ーー 質問では「特定の」とせず、仕組みをはっきり記述してください。コマンドボタンとそのクリックイベントを使っているのかどうかが明確でない。2度押すとどう不都合なのか質問では明確でない。
お礼
ご回答ありがとうございました。ご指摘のように、質問が具体的でなっかたことについては反省しております。ご回答を参考に、工夫してみます。
- kanemoto_s
- ベストアンサー率45% (112/244)
1.ボタンを押したときに、押した日付をどこかのセルに記憶し、ボタンを押せなくします。 2.ボタンのシートが表示されたときのイベントプロシージャで、現在の日付と前回押した日付を比べて、異なっていたらボタンを有効にします 3.ボタンを押したときも、現在の日付と前回押した日付を比べて同じ場合は何もしないようにします こんな感じで行けると思います。 やり方が分からない場合は補足願います。
お礼
早々の、ご回答ありがとうございます。ご教授の内容に沿ってマクロを作ってみました。下記マクロをリセットボタンに登録して実行してみましたら、使用できそうな感覚を得ました。お礼申し上げます。 Sub test() Range("A1").Value = Date ▼当日の日付を「A1」セルに登録 If Range("A1") > Range("A2") Then ▼前日の日付セル「A2」と比較 Range("E8:F8").Select ▼正論であれば「E8、F8」のセル内容をクリア Selection.ClearContents Range("A1").Select ▼当日の日付「A1}を「A2」にコピー Selection.Copy Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValues Else MsgBox "クリック済みです。" ▼2度押し警告 End If End Sub
お礼
具体的なご回答に感謝です。現在の私の力量は、ANo.1さんやANo.3さんにお礼申し上げたレベルです。realbeatinさんの具体例にそって、もう少しコマンドを勉強してスキルUPを図ります。大変ためになりました。ありがとうございました。