dポイントプレゼントキャンペーン実施中!

大変困っています。
9月の連休に向けて、勤務シフトを組むにあたり、
Excelで入力シートを作っています。
何月何日→○、×をリストから選んでもらう形式です。
そこで、たとえばすべて×という選択ができないように設定したいのです。

当方100人規模のシフトを作っており、
全員に口頭で言うのもなんですので、デフォルトで全部×を禁じたいのです。
いろいろ調べていますが、
プルダウン設定で「入力規則」を使用しており、
範囲内で「×」の個数を数え、一定数以上ならあるセルに「FALSE」が
出るようにはしたのですが、
「入力規則」で違ったデータを入力したときのように、
別ウインドウで禁止テロップを出したいのです。

何か方法ありますでしょうか???

A 回答 (4件)

今家にあるのはExcel2002なので、それで説明します。



(1)メニューの「ツール:マクロ:Visual Basic Editor」をクリックする。
(2)「Microsoft Visual Basic - ブック名」の画面が表示されるので、左側に表示されている「Sheet1(シート名)」をダブルクリックする。
(3)表示される「ブック名 - Sheet1(コード)」の画面に下記のマクロを記述する。(コピー&ペーストしてください)

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Row >= 5 And Target.Row <= 35 And Target.Column >= 4 And Target.Column <= 5 Then
    If Not Cells(44, 14).Value Then
      MsgBox "エラーメッセージ"
    End If
  End If
End Sub

("エラーメッセージ"の部分は表示したいメッセージを記述してください。)

以上で完了です。


Excel2003はExcel2002と同じですが、Excel2007は画面のメニューやボタンがExcel2003とは大幅に変わっています。
Excel2007の場合、「Microsoft Visual Basic - ブック名」の画面を表示できれば後は同じです。

もしどうしても「Microsoft Visual Basic - ブック名」の画面を表示できない場合は明日また回答しますので、状況を知らせてください。


I5:K35の部分は意味が分からなかったので無視しています。
    • good
    • 0
この回答へのお礼

大変ご丁寧な指導、本当にありがとうございました!!
アルファベットの列が数字に置き換わるわけですね。
理想どおりにエラーメッセージが出て満足しています。
甘えついでにもう少しお願いです。あつかましくてすいません。

例えば、このままだと、別に×のままでもエラーをスルーすれば
保存できるわけですが、×を解除しないと次に進めないような
設定ってできますか???

お礼日時:2009/07/20 17:20

>×を解除しないと次に進めないような設定ってできますか?



次に進めないような設定というのは分かりませんが、別の方法として次の2つが考えられます。

1.メッセージを出した後に×を強制的に消す。
2.終了するときに再度チェックして、エラーなら終了できないようにする。


1の方法は、
MsgBox "エラーメッセージ"
の後に、
Target.Value = ""
を追加してください。
そうすると、OKを押した直後×がクリアされます。


2の方法は、次のコードをThisWorkbookのコード画面に記述してください。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If Not Cells(44, 14).Value Then
    MsgBox "エラーメッセージ"
    Cancel = True
  End If
End Sub

上記の「Cancel = True」で閉じる処理がキャンセルされますので、エラーを解消しない限り終了することができなくなります。

ThisWorkbookのコード画面は、「Microsoft Visual Basic - ブック名」の画面の左側に表示されている「ThisWorkbook」をダブルクリックすると表示されます。
    • good
    • 0
この回答へのお礼

もう、お見事としかいいようがないです。
連休中になんとかなりそうで、助かりました!!!

本当にありがとうございました。

お礼日時:2009/07/21 05:08

>適当なセルを選択しておいて、「マクロ」を選んで、この構文を入力した後に、どうすれば登録できるのでしょう??



マクロの登録はそういう方法ではありません。
Excelのバージョンによっても操作方法が少し違います。お使いのExcelのバージョンは何でしょうか。

また、前述のマクロのコードは完全ではありません。マクロ初心者ということであれば、必要ならある程度使えるものを作ってみますので次のことを教えてください。
・日付は横に並べているのですか?それとも縦ですか?
・○、×を入力するセルの範囲は?
・「FALSE」を表示するセルの範囲は?
・「FALSE」を表示するセルの計算式は?
・禁止テロップを出したいシートは1つだけですか?複数ありますか?
・複数ある場合、禁止テロップを出す必要がないシートもありますか?
・禁止テロップを出す必要がないシートがある場合、出すか出さないかをシート名で区別できますか?


なお、前述のマクロのコードで、1行目が間違ってました。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ではなくて、
Private Sub Worksheet_Change(ByVal Target As Range)
でした。
    • good
    • 0
この回答へのお礼

大変親切にありがとうございます。
それではお言葉に甘えさせていただきます。
Excelは2007ですが、2003対応の職員もいるので、両方対応できるようにとは思っています。

・日付は縦に並んでおり、時間枠5枠(2+3)が横に並んでいます。
・○・×に関しては、D5:E35と、I5:K35(31日間の場合)になります。
 このセルではすべてリストから○×を選ぶ方式です。
・FALSEを出すために、N43くらいを=COUNTIF(D5:E35,"×")として
 N44くらいに=IF(N43<20,TRUE,FALSE)で、多くの枠で×を選択しすぎ
 るとN44にFALSEが表示されます。
・シートはひとつだけですので、禁止テロップはそのシートだけでOKです。

休みの日に大変な親切に敬服しております。
どうぞよろしくお願いします。

お礼日時:2009/07/20 07:48

BVAで、セルが変更されたときに「FALSE」になったかどうかを調べてメッセージを出すことができます。



Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Cells(?, ?) = "FALSE" Then
MsgBox "エラーメッセージ"
End If
End Sub

引数のTargetは変更されたセルのRangeですので、誰の分を入力したかを判断することもできます。
    • good
    • 0
この回答へのお礼

本当にありがとうございます。
マクロはスーパー初心者な私ですので、
ちょこっと基礎的なことをお教えいただけると幸いです。

適当なセルを選択しておいて、
「マクロ」を選んで、この構文を入力した後に、
どうすれば登録できるのでしょう??

お礼日時:2009/07/19 22:59

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