【お題】引っかけ問題(締め切り10月27日(日)23時)

お忙しいところすみませんが、どなたかご教授下さいましたら幸いです。

まず、現在どのような使用方法かというと以下の通りです。
(1)エクセルブック1枚で30名ほどのスタッフの日にちごとの1ヶ月間のスケジュール管理をしています
(2)予定を作成した日にちをシートに"2009/8/28"とふる
(3)翌日にはシートをコピーし(土日は行わないことがある)、変更になった箇所のみを変更し、シートを"2009/8/29"とふる

そして、当方が自動でしたい事は上記(3)の翌日になった場合若しくはブックを開いた際に、自動で前日若しくは直近の日付のシート(土日は更新しないので、土日の日付が入力されているシートがないため)をコピーしシート名を当日(YYYY/MM/DD)とふる。しかし、当日にエクセルを何回も開いたり閉じたりするので、その際に何回も当日のシートが自動作成されては困る。

以上となります。どうぞ宜しくお願い致します。

A 回答 (5件)

こんばんは



#1のrukukuです。
ryouta0429さんが、何とかやってみようと、いろいろと質問して頑張ってらっしゃるところなので、こんなことを言って申し訳ないのですが、

>配車担当者である1人のスタッフが他の事務職用に作成しております。
この担当の方に「シートのコピーと名前の変更」を教える、が一番手っ取り早いと思います。

1日1回の簡単な操作ですので、手作業で十分だと思います。


そう言っても、何か新しいことを学ぶにはきっかけが必要です。ryouta0429さんにとってマクロを学ぶきっかけになれば幸いと思い、少し補足します。

>Workbook_Open
これが、私が#1で回答した「ブックを開いたときにマクロを実行できます。」という方法です。Excelのでは、「イベント」を引き金にマクロを実行することが出来ます。
・セルの内容が書き換えられた
・別のセルが選択された
・シートがアクティブになった
など、様々なタイミングでマクロを実行することが出来ます。
「Workbook_Open」はブックが開かれたときに実行されるマクロです。

>Format関数
Excelの基本機能なら「表示形式」、関数なら「TEXT」が近いかと思います。Excelの場合、実際に持っているデータと表示されているデータが異なることがあります。特に「日付」それから「時刻」は「シリアル値」という表示されているのと全然別な形でデータを持っています。
そのようなデータを指定した形式で得るための関数です。

>Exit Sub
「自分の所属するプログラムの実行を停止せよ」という命令です。
一定の条件を満たしたときにプログラムの実行を停止させるときによく使います。
ご質問の例で言えば、シート名を一つ一つチェックしていって、同名のソートが見つかったら、未チェックのシート名を確認する意味はありません。そこで、同名のシートが見つかった時点でプログラムの実行を停止します。(ご質問の例の場合、最大で31のシートをチェックするだけですので、End Subなしでも処理時間はそんなに変わらないと思います。)



>右端にあるなら「Worksheets(Worksheets.Count)」
>左端なら「Worksheets(1)」
シートを特定するために、シートの順番を使うことが出来ます。一番左側のシートが、「Worksheets(1)」になります。以下順番に、左から二番目が「Worksheets(2)」…となっていきます。
そして、Worksheets(Worksheets.Count)ですが、「“ワークシート数”番目」という意味になります。ワークシートが3枚あれば左から3番目のワークシート、ワークシートが7枚あれば左から7枚目のワークシートになります。
(ホントはWorksheetsとSheetsの違いがあるのですが、ここでは説明のためWorksheetsを使います。)
    • good
    • 0
この回答へのお礼

お忙しいところご丁寧にありがとうございました。
何とかがんばってマクロを組んでみます。

お礼日時:2009/09/11 10:36

Excelのマクロを提示することはできますが、ご自身で勉強されないと手直しも何も出来ないままです。

それでは、ご自身のためになりません。
十分ヒントは出しているつもりですので、本やWebで調べてみてください。
    • good
    • 0
この回答へのお礼

確かに貴殿のおっしゃる通りですね。
頂きましたヒントを参考に自分でガンバってみます。
本当にどうもありがとうございました。

お礼日時:2009/08/31 08:56

先ほどのrukukuさんの回答に対するご返事をみるとVBAは全く使われたことがなさそうです。


「オープンしたときに自動的に」というのはこれから勉強していただくとして

「オープンした後明示的に今日のシートを作る」ところからはじめてはいかがでしょう。

Sub 当日シート作成()
Dim shname As String
Dim sdate As Date
' 今日の日付を取得
sdate = Now()
' 日付からシート名を生成 2008/8/30→20080830
shname = Year(sdate) & Right("00" & Month(sdate), 2) & Right("00" & Day(sdate), 2)
' 今注目しているシートのコピーをすぐ右側にコピー
ActiveSheet.Copy after:=ActiveSheet
' 今コピーしてできたシートに名前を付ける
ActiveSheet.Name = shname
End Sub

bookを開いた後前日のシートを開き上記のコードを実行すれば前日のシートの右に今日のシートができます。
コードの入力(VBE)や実行は自分で調べてください。
    • good
    • 0
この回答へのお礼

まずはご教授いただきました方法にて実行してみたいと思います。
本当にどうもありがとうございました。

お礼日時:2009/08/31 09:01

「Workbook_Open()」に、


(1)当日のシート名の存在チェックを行う(*)
(2)シートがあれば、「Exit Sub」
(3)なければ、直近のシート(**)のコピー
という処理を記述することになるでしょう。

(*)
・当日のシート名の作成方法:Format関数を使います。ちなみにシート名に「/」は使えませんので「yyyy-mm-dd」などとしましょう。
・シートの存在チェック:
http://www.nurs.or.jp/~ppoy/access/excel/xlM027. …
などを参考にしてください。

(**)
・直近のシート名の取得方法:
常に最新のシートが右端にあるなら「Worksheets(Worksheets.Count)」、左端なら「Worksheets(1)」で取得できます。
位置が固定でないなら、最大の日付を探す処理が必要です。上記URLが参考になるでしょう。

シートコピーをマクロ記録し、上記の処理を行うよう修正してみてください。

この回答への補足

こんばんは

早々にご教授誠にありがとうございます。
せっかくご教授いただいているのですが、当方エクセルは多少分かるのですが、マクロの事が分からないため、以下の語句の意味等が分かりません。
・Workbook_Open
・Format関数
・Exit Sub
・右端にあるなら「Worksheets(Worksheets.Count)」
・左端なら「Worksheets(1)」

お手数をおかけしますが、再度ご教授いただけましたら幸いです。

補足日時:2009/08/29 22:47
    • good
    • 0

こんにちは



マクロ(VBA)を使えば出来ます。
>ブックを開いた際に、自動
ブックを開いたときにマクロを実行できます。
>何回も当日のシートが自動作成されては困る
シートをコピーする前に、既に存在しているかのチェックも出来ます。
が、実際に運用するとなると、入力する人の誤操作の対応も含めたプログラムを組まなければならないので大変です。

・なぜ「1日1シート」にしているのか
・特定の人が入力を行うのか、約30名のスタッフが個別に入力をしているのか。
・実際に入力しているデータの例(社名・氏名は伏せ字でも構いません)
を教えてください。

場合によってはもっといい解決策が見つかるかもしれません。

この回答への補足

こんばんは

早々にご教授誠にありがとうございます。

お問い合わせの件ですが、
・「1日1シート」にしている理由は、ある日作成したスケジュールはどうだったかを残しておく為に、毎日スケジュールを上書きせず、別シートに作成をしていっております。(無駄かもしれませんんが・・・)
・約30名のスケジュール表は、特定のスタッフのみが作成をしております。約30名はドライバーであって、どこへ行くかを、配車担当者である1人のスタッフが他の事務職用に作成しております。
・実際に入力しているデータを見ていただきたかったのですが、どのように見ていただければ良いか、方法がわかりません。

どうぞ宜しくお願い致します。

補足日時:2009/08/29 22:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報