販売の仕事をしていてシフト作成を毎月しているのですが
人数が11人分とかなり大変で作成と調整でとっても時間がかかるので
アナログ作業をなんとかデジタル処理できないかと考えています

実際に行っている作成要領としては、
1.あらかじめ個人別に希望の休みを固定して決定
2.指定休をまず5日連勤にならないようにある程度ふりわける
3.勤務の〆日が15日(社員区分によっては10日)なので
  月の前半・後半で取れる休みが決まってきます
4.一日に必要な動員数を考慮しながら休みを調整します
5.他店の応援要請もありますのでそれも調整します
6.休みが決定したらシフト(早番、遅番等)を偏らないように振り分けます

5,6の調整が出間取ります
シフト作成のみならず他の仕事が山積みなのでかなりの負担になっています。

プログラミングはまったくやったことがなく
上記の条件はこんな関数をつかったら、などがわかれば
参考書を購入して作りたいと思うのですが、どのような内容の指導書が
あればいいのかすらわからない状況です

あと仕上がりのイメージとしては、
*○月○日~×日までの指定休は何日ですか?
*希望休を入力して下さい
などの条件を入力する画面から入力した後
自動計算でラフ案のスケジュールをつくり
そこから細かい調整ができる、という作業ができればいいなと思っています

必要な関数の種類と、VBAが必要だと思うのでこの項目が掲載している
指導書を使いなさい、等のアドバイスを宜しくお願いします

ちなみにプログラミングはおろか、エクセルも初級者ですが
独学するやる気はありますので、どなたか精通した方、ご伝授ください!!
はやくスケジュール作成の苦労から解放されたいんです…

このQ&Aに関連する最新のQ&A

A 回答 (1件)

指定休の入力から考えだすと大変だと思います。

また、プログラムしづらい要素が多いので、Excelを『作業の補助をしてくれる道具』にする方針で考えてみました。土日と指定休の関係が不明なため日曜日は休みで。指定休=1ヵ月に5日としてみました。Sheet1で処理をします。

○A2に月の1日を入力します。(2001/10/1のように)
 A3は =A2+1 として、これをコピーしA32まで貼り付けます。A33に表題『指定休計』
 A2~A32まで書式を『月日』にします。これでA2に入力すれば日付が変わります。
 10月31日などがあれば消します。
○B2は =A2 として、これをコピーしB32まで貼り付けます。
 B2~B32まで書式をユーザー定義で『(aaa)』にします。曜日の表示です。
○C1~M1までは氏名を入力(11名)
 日曜日には『***』などを入力しておきます。(入力しないための目印)
○C2~M32の範囲に範囲名 Kinmu を付けます
○N1に表題『休み』、N2に算式 =COUNTIF(C2:M2,"指定休") N3からN32までコピー
○O1に表題『出勤者』、O2に算式 =COUNTA($C$1:$M$1)-N2 O3からO32までコピー
○P1に表題『必要動員数』。P2からP32については、その日の必要動員数を入力します。 
 P2に条件付き書式を設定(書式→条件付き書式)
  『数式が』『=P2>O2』として、書式→パターン→例えば赤を選択、OK、OK
  P2を選択してコピー。P3~P32に形式を選択して貼り付け→書式、OK
○Q1に表題『早番』、Q2に算式 =COUNTIF(C2:M2,"早番") Q3からQ32までコピー
○R1に表題『遅番』、R2に算式 =COUNTIF(C2:M2,"遅番") R3からR32までコピー
○C33に算式 =COUNTIF(C2:C32,"指定休")
 C33に条件付き書式を設定(書式→条件付き書式)
  『セルの値が』『次の値に等しくない』、『5』として、書式→パターン→例えば赤を選択、OK、OK
 C33を選択してコピー。D33~M33に貼り付け(指定休を1ヵ月に5日とした)

これで、範囲名Kinmuの中に『指定休』と入力すると個人の指定休の日数計と各日の出勤者が計算されます。
同時に、出勤者<必要動員数になるとP列のそのセルが赤くなります。個人の指定休計も5日にならないと赤のままです。
次に、『指定休』と入力する方法ですが面倒なので仕掛けを作ります。(Worksheet_BeforeRightClick)
ツール→マクロ→Visual Basic Editor でVBE画面に移動し、プロジェクトエクスプローラのSheet1をダブルクリックして出てきたコードウインドウに下の『Private~End Sub』をコピーして貼り付けます。
Sheet1に戻り、範囲名Kinmuの中で右クリックすると『指定休』と入力されると思います。既に『指定休』と入力されていれば、逆に消えるはずです。初期入力したあと右クリックをして調整して赤いセルが消えるようにします。

早番、遅番は『等』となっており、『偏らない』、『シフトの仕方(サイクル)』が不明なので早番、遅番についてもマウスで入力できるようにしてみました。ダブルクリックで、早番→遅番→未登録と切り替わります。(BeforeDoubleClick)
全てを1画面で見えるように調整すると作業がしやすいと思います。 ご参考に。

ツール→マクロ→Visual Basic Editor でVBE画面に移り、表示→プロジェクトエクスプローラでプロジェクトエクスプローラを表示し、Sheet1をダブルクリックして出てきたSHeet1のコードウインドウに下記モジュールを貼り付けます。(Private Sub~End Sub)

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Cells.Count <> 1 Then Exit Sub

  Dim rg As Range
  Set rg = Application.Intersect(Range("Kinmu"), Target)
  If Not rg Is Nothing Then
    With Target
      If .Value = "" Then
        .Value = "指定休"
      Else
        .Value = ""
      End If
      Cancel = True
    End With
  End If
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Cells.Count <> 1 Then Exit Sub

  Dim rg As Range
  Set rg = Application.Intersect(Range("Kinmu"), Target)
  If Not rg Is Nothing Then
    With Target
      Select Case .Value
        Case "": .Value = "早番": .HorizontalAlignment = xlLeft
        Case "早番": .Value = "遅番": .HorizontalAlignment = xlRight
        Case "遅番": .Value = ""
      End Select
      Cancel = True
    End With
  End If
End Sub

参考URL:http://www2.odn.ne.jp/excel/waza/
    • good
    • 0
この回答へのお礼

さっそくのご回答いただいていたのにもかかわらず
質問をした後のPCの調子が悪く、お礼が大変遅くなりすみません。
急ぎで回答が欲しいといいつつ、忙しく、ぜひ近いうち時間を作って
チャレンジしてみます!
もし途中で分からなくなったら、補足の回答がいただけましたら幸いです
自信がないので…
またご報告させていただきます!!

お礼日時:2001/10/10 00:14

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qシフト表を自動で作成する方法

指定した日付のシフト表を自動で作成する方法ですが、下記の方法を教えていただきました。

Sub シフト表作成()
Dim org As Integer
Dim dst As Integer
Dim i As Integer

Worksheets("週シフト表").Activate
Range("C4:I4").Find(What:=Worksheets("日別").Range("C3").Value, _
LookAt:=xlWhole).Select
Range(ActiveCell.Offset(2), ActiveCell.Offset(6)) _
.Copy Destination:=Worksheets("日別").Range("C6")
Worksheets("日別").Activate

For i = 6 To 10
If Range("C" & i).Value <> "休み" Then
org = Application.WorksheetFunction.VLookup( _
Worksheets("日別").Range("C" & i), _
Worksheets("シフトマスタ").Range("B4:D6"), 2, False)
dst = Application.WorksheetFunction.VLookup( _
Worksheets("日別").Range("C" & i), _
Worksheets("シフトマスタ").Range("B4:D6"), 3, False)
Range(Cells(i, org - 5), Cells(i, dst - 5)).Interior.Color = vbBlue
End If
Next
End Sub

日別のシートにシフトを作成しており、週シフトシートに、個々の日別の勤務(早番、遅番等)が記載されており、シフトマスタシートに各勤務の開始時刻を終了時刻が記載されています。
今は以下のような日別シートがあり、勤務に合わせてD列~P列間で色がつくようになっています。

_____A_______B________C_______D_______E_______F ・・・・ P
5_________氏名_____シフト___9時____10時____11時 ・・・・ 21時
6_________1さん_____早
7_________2さん_____遅
8_________3さん_____休
9_________4さん_____遅
10_______5さん_____遅

これを、1時間単位ではなく、30分単位(E列が9時30分、F列が10時、G列が10時30分・・・)にすると色の付く範囲がずれてしまいます。
コードをどのように変えれば良いかわからず困っております。
お手隙の方、いらっしゃいましたら何卒ご教授の程、お願い致します。

指定した日付のシフト表を自動で作成する方法ですが、下記の方法を教えていただきました。

Sub シフト表作成()
Dim org As Integer
Dim dst As Integer
Dim i As Integer

Worksheets("週シフト表").Activate
Range("C4:I4").Find(What:=Worksheets("日別").Range("C3").Value, _
LookAt:=xlWhole).Select
Range(ActiveCell.Offset(2), ActiveCell.Offset(6)) _
.Copy Destination:=Worksheets("日別").Range("C6")
Worksheets("日別").Activate

For i = 6 To 10
If Range("C" & i).Value <> "休み" ...続きを読む

Aベストアンサー

Range(Cells(i, org - 5), Cells(i, dst - 5)).Interior.Color = vbBlue
の部分が色塗りの指示部分です。
「i」行目の「org-5」列のセルから「dst-5」列のセルまでの範囲の背景色を青とする、という指示内容です。
「9」時がD列(4番目)に相当するよう、-5しているのでしょうね。

「シフトマスタ」シートの数字の方も30分刻みにしたいなら、また違う方法とらねばなりませんが、
単純に30分刻みに変更した日別シートに合わせたいのであれば、この指示行を
Range(Cells(i, 4 + (org - 9)*2, Cells(i, 4 + (dst - 9)*2).Interior.Color = vbBlue
とすれば対応できると思います。
ここでは、「9」時以降の時間増加分を2培して、D列(4列目)から増加した列を指定する形にしています。
1時間は30分×2ですからね。
これで例えば「シフトマスタ」シートの数字が「13」時なら13-9=4で、 4列目から4時間×2の8列分を増加した12列(L列)を指定していることになります。

Range(Cells(i, org - 5), Cells(i, dst - 5)).Interior.Color = vbBlue
の部分が色塗りの指示部分です。
「i」行目の「org-5」列のセルから「dst-5」列のセルまでの範囲の背景色を青とする、という指示内容です。
「9」時がD列(4番目)に相当するよう、-5しているのでしょうね。

「シフトマスタ」シートの数字の方も30分刻みにしたいなら、また違う方法とらねばなりませんが、
単純に30分刻みに変更した日別シートに合わせたいのであれば、この指示行を
Range(Cells(i, 4 + (org - 9)*2, Cells(i, 4 + (dst ...続きを読む

Q起動時シフトキーを無効にして、作成したmdbのセキュリテーを高める方法について

以下のコードは、次回起動時シフトキーを無効にする方法らしいのですが、★印のところで、型が一致しませんとエラーが出てしまいます。
どうしてでしょか?対応方法を教えてください。


Function NoShiftKey()
  ChangeProperty "AllowBypassKey", dbBoolean, False
End Function
Function ChangeProperty(strPropName As String, varPropType, varPropValue) As Integer

On Error GoTo エラー

  Dim dbs As Database, prp As Property
  Const conPropNotFoundError = 3270
  Set dbs = CurrentDb
  dbs.Properties(strPropName) = varPropValue
  ChangeProperty = True

  Exit Function

エラー:
  If Err = conPropNotFoundError Then
    Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue) '★この行でエラーがでます。
    dbs.Properties.Append prp
    Resume Next
  Else
    ChangeProperty = False
    Exit Function
  End If
End Function

以下のコードは、次回起動時シフトキーを無効にする方法らしいのですが、★印のところで、型が一致しませんとエラーが出てしまいます。
どうしてでしょか?対応方法を教えてください。


Function NoShiftKey()
  ChangeProperty "AllowBypassKey", dbBoolean, False
End Function
Function ChangeProperty(strPropName As String, varPropType, varPropValue) As Integer

On Error GoTo エラー

  Dim dbs As Database, prp As Property
  Const conPropNotFoundError = 3270
  Set dbs = C...続きを読む

Aベストアンサー

no.2回答者です。
私がAC2000で使ってたコードです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Public Function notshift()

Dim Dbs As Database
Dim prp As Property

On Error GoTo error1

Set Dbs = CurrentDb '外部DBの場合はOpenDatabaseでフルパス指定

'shiftキーが利かないようにする
E2:


If Dbs.Properties!AllowBypassKey = True Then

Dbs.Properties!AllowBypassKey = False
MsgBox ("バイパスキー使用不可になりました")
Else

Dbs.Properties!AllowBypassKey = True
MsgBox ("バイパスキー使用可になりました")
End If


Dbs.Properties.Refresh


Exit Function

error1:
If Err = 3270 Then
'プロパティーが見つからない場合createする
Set prp = Dbs.CreateProperty("AllowBypassKey", dbBoolean, True)
'プロパティーに追加する
Dbs.Properties.Append prp
Resume E2

End If

MsgBox "設定失敗しました。"



End Function

no.2回答者です。
私がAC2000で使ってたコードです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Public Function notshift()

Dim Dbs As Database
Dim prp As Property

On Error GoTo error1

Set Dbs = CurrentDb '外部DBの場合はOpenDatabaseでフルパス指定

'shiftキーが利かないようにする
E2:


If Dbs.Properties!AllowBypassKey = True Then

Dbs.Properties!AllowBypassKey = False
MsgBox ("バイパスキー使用不可になりました")
Else

Dbs.Propertie...続きを読む

QExcelで作成されたフォームをAccessにコンバージョンしたいので

Excelで作成されたフォームをAccessにコンバージョンしたいのですが、フォームのインポートはできないのでしょうか?
Accessのフォーム作成画面から、インポートを選択していって、Excelファイルを開くのですが、シートしか選択できません。
コントロールのコピペもできないみたいですが。。。
Excelで作成されたフォームはAccessにはインポートできないのですか?
コーディングをそっくり使用することはできなくても、せめてフォームのデザインはコピーしたいのですが。。。(> <)
よろしくお願いします。m(_ _)m

Aベストアンサー

質問者はプロかプロ経験者ですか。でないならこんな勉強は試みないほうが良いでしょう。
市販の書物や初心者向けの講習で説明される話題ではない。プロで会社にその辺の経験者がいたりすれば聞けるでしょうが。原理的には最熟練者の人は変換プログラムは組めるかもしれませんが、そのレベルの人は、この質問コーナーを読んでないでしょうし、無料で教えるスキルではないと思います。
WEBの記事も多分少ないでしょう。
Googleででも「エクセル フォーム アクセス 移行」で出てくる記事を参考にしてはどうでしょう。
http://www.accessclub.jp/bbs2/0080/beginter24987.html
同じ発想の人はいることはいるが。
ーー
VBAとVBのフォームはコードで扱う上で微妙に違うし、アクセスVBAとエクセルVBAでは違う点も多い。
またコントロールの生成もコードで行う方法は隠して、易しいD&Dやマウスによる移動、プロパティボックスでの入力にして易しくしています。
エクセルのUserForm1のフォームも本格的なものではないサービスのような気がする。エクセルで第3者を巻き込んだ業務の開発までは予定して無いように推測する(何でもエクセル的な過大期待が横行している)。
それにエクセルでのセルとの連携をつけた機能LinkedCell、FillいstRangweなどはエクセル特有で、RecordSourceのSQL指定やフォーム指定はアクセス特有と思います。
外観を決めるサイズや書式関係は(エクセルでフォームやコントロールの)プロパティーメモー(アクセスでのフォームやコントロールの)プロパティ設定でやや似せて移せるかもしれない。
エクセルバージョン内の相違、エクセル・アクセルで使えるコントロールの種類の相違などもあります。

質問者はプロかプロ経験者ですか。でないならこんな勉強は試みないほうが良いでしょう。
市販の書物や初心者向けの講習で説明される話題ではない。プロで会社にその辺の経験者がいたりすれば聞けるでしょうが。原理的には最熟練者の人は変換プログラムは組めるかもしれませんが、そのレベルの人は、この質問コーナーを読んでないでしょうし、無料で教えるスキルではないと思います。
WEBの記事も多分少ないでしょう。
Googleででも「エクセル フォーム アクセス 移行」で出てくる記事を参考にしてはど...続きを読む

Q件名と作成日をファイル名とするには?

エクセル2000のVBAについて質問です。
シート内に記入した、件名と年月を、ファイル名とするには、どうすれば良いでしょうか?
セルA1に件名「○○○の件」
セルB1に作成日が日付書式で「2009/12/07」 と、あるとします。
この入力情報を元にして「○○○の件(0912).xls」と言うファイル名で保存したいです。
更に欲を言うと、件名にファイル名での禁則文字(/や?など)が想定されますので、全部を全角に変換したいです。

現状は、シート内余白に
件名は「=JIS(A1)」で全角に変換。
年月は「=TEXT(B1,"yy")」と「=TEXT(B1,"mm")」で、それぞれ抽出して、
変数を定義して
ThisWorkbook.Path & "\" & 件名 & "(" & 年 & 月 & ")" & ".xls"
で、保存しています。

このシート内の関数を止めて、VBAの中だけで処理する知恵をお貸し下さい。
お願い致します。

Aベストアンサー

#1です。

>今日が12月でも、B1に書かれているのが11月ならば0911としたいです。
ThisWorkbook.Path & "\" & StrConv(Range("A1").Value,vbWide) & "(" & Format(Range("B1").Value ,"yymm") & ")" & ".xls"
ですね。

QVBで作成した実行形式の戻り値を作成したい

VBで作成した実行形式の戻り値を作成したいと考えています.
たとえば,A.exeという実行形式をVBで作成します.
このA.exeを別のプロジェクトでshell関数などで起動します.
処理が終了した時に,
A.exeの処理が成功した場合に1
A.exeの処理が失敗した場合には0を返すようにしたいと考えています.

可能でしょうか?

環境:Windows2000+SP3
Visual Basic 6.0+SP5

Aベストアンサー

多分、無理かと・・・。

DLLで作成したらいいのでは?
VBで DLLの作成は できますよ。


人気Q&Aランキング

おすすめ情報