ちょっと変わったマニアな作品が集結

私どもはある組織の宿日直を総員7名でやっております、宿直も日直も2名で出勤します。
人員の配置は毎月籤を引きながらやっておりますがどうしても毎月同じ人同士の組み合わせになることが多くあります、そこで何とかEXCELLを使い皆でランダムにやる方法はないかと考えております、私も考えてみたのですがなかなかよい方法(工夫)が出来ません何方かお知恵を拝借したいと思い質問を致します。

平日(P.M.5:30~次の日のA.M.8:30まで)の宿直と土・日・祝祭日の日直を(A.M.8:30~P.M.5:30)7名で行っております(年間365日休めません)、人員の配置方法としての禁止事項は以下の通りです。
1)宿直の次に日直は出来ません(連続での出勤になりますので)。
2)宿直が連続で出来ません(出来ないことはありませんが出来ればしない方がgood!)。
3)7名の人員を宿直と日直は常にランダムで行いたい、つまり毎回出来れば同じ組み合わせ  でやりたくない。
4)年間で考えたいと思います。(月毎ですと月末と月初の組み合わせが上記の禁止事項になることがある)
以上の条件でEXCELLに拘りませんので方法がないものかと考えております、宜しくお願い致します。(人員はA・B・・・・F・Gで表現します)

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

A 回答 (10件)

↓から続きです。



'★ここから後半
If Cells(i, "D") = "" Then
Do Until myFlg = True
If myRow = endRow Then
myRow = 1
End If
myRow = myRow + 1
str1 = Left(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") - 1)
str2 = Mid(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") + 1, 10)
Set c = myRng1.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng1.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
If c Is Nothing And r Is Nothing Then
myFlg = True
Else
Cells(Rows.Count, "P").End(xlUp).Offset(1) = Cells(myRow, "I")
End If
Loop
Cells(i, "D") = Cells(myRow, "I")
myFlg = False
End If

If WorksheetFunction.CountA(Range("P:P")) > 0 Then
For k = 2 To Cells(Rows.Count, "P").End(xlUp).Row
If Cells(k, "P") <> "" Then
str1 = Left(Cells(k, "P"), InStr(Cells(k, "P"), ",") - 1)
str2 = Mid(Cells(k, "P"), InStr(Cells(k, "P"), ",") + 1, 10)
Set c = myRng2.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng2.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
If c Is Nothing And r Is Nothing Then
myFlg = True
Exit For
End If
End If
Next k
If myFlg = True Then
Cells(i, "E") = Cells(k, "P")
Cells(k, "P").ClearContents
myFlg = False
End If
End If

If Cells(i, "E") = "" Then
Do Until myFlg = True
If myRow = endRow Then
myRow = 1
End If
myRow = myRow + 1
str1 = Left(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") - 1)
str2 = Mid(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") + 1, 10)
Set c = myRng2.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng2.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
If c Is Nothing And r Is Nothing Then
myFlg = True
Else
Cells(Rows.Count, "P").End(xlUp).Offset(1) = Cells(myRow, "I")
End If
Loop
Cells(i, "E") = Cells(myRow, "I")
myFlg = False
End If
Next i
Range("P:P").ClearContents
End Sub

※ とりあえずA~Gのメンバーの年間日数はある程度バランスが取れると思います。m(_ _)m
    • good
    • 0

No.3・5です。



もう一度考えてみました。
前回のコードは消去して↓のコードにしてみてください。
(今回もシートモジュールです)
尚、P列も予備の組合せ(続けて勤務できない組合せ)用として使用していますので、
P列は使っていない状態にしてください。
今回も必要なのは前回の画像通りの配置にしておいてください。

必要なのはA~C列とG列のデータのみです。

尚、一度に投稿すると制限文字数を超えそうなので
2回に分けて投稿します。

まず前半部分です

Sub 振り分け3()
Dim i As Long, k As Long, cnt As Long, myRow As Long, lastRow As Long, endRow As Long
Dim myRng1 As Range, myRng2 As Range, myFlg As Boolean
Dim str1 As String, str2 As String, c As Range, r As Range

'▼組合せ順
endRow = Cells(Rows.Count, "I").End(xlUp).Row
If endRow > 1 Then
Range(Cells(2, "I"), Cells(endRow, "J")).ClearContents
End If
cnt = 1
For i = 2 To Cells(Rows.Count, "G").End(xlUp).Row
For k = i + 1 To Cells(Rows.Count, "G").End(xlUp).Row
cnt = cnt + 1
Cells(cnt, "I") = Cells(i, "G") & "," & Cells(k, "G")
Next k
Next i
endRow = Cells(Rows.Count, "I").End(xlUp).Row
With Range(Cells(2, "J"), Cells(endRow, "J"))
.Formula = "=RAND()"
.Value = .Value
End With
Range(Cells(1, "I"), Cells(endRow, "J")).Sort key1:=Range("J1"), order1:=xlAscending, Header:=xlYes
'▲

'▼D・E列表示
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
Range(Cells(2, "D"), Cells(lastRow, "E")).ClearContents
End If
Range(Cells(2, "L"), Cells(lastRow, "M")).Formula = "=LEFT(D2,1)"
Range(Cells(2, "N"), Cells(lastRow, "O")).Formula = "=RIGHT(D2,1)"
Range(Cells(2, "H"), Cells(Cells(Rows.Count, "G").End(xlUp).Row, "H")).Formula = "=COUNTIF(L:O,G2)"

myRow = 1
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
Set myRng1 = Cells(i - 1, "E")
Set myRng2 = Union(Cells(i - 1, "E"), Cells(i, "D"))

If WorksheetFunction.CountA(Range("P:P")) > 0 Then
For k = 2 To Cells(Rows.Count, "P").End(xlUp).Row
If Cells(k, "P") <> "" Then
str1 = Left(Cells(k, "P"), InStr(Cells(k, "P"), ",") - 1)
str2 = Mid(Cells(k, "P"), InStr(Cells(k, "P"), ",") + 1, 10)
Set c = myRng1.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng1.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
If c Is Nothing And r Is Nothing Then
myFlg = True
Exit For
End If
End If
Next k
If myFlg = True Then
Cells(i, "D") = Cells(k, "P")
Cells(k, "P").ClearContents
myFlg = False
End If
End If
'★ここまでが前半
    • good
    • 0

リンクが違っていたようなのでもう一度



https://drive.google.com/file/d/0Byv1RH48tHeaWDV …

何度もすみません
    • good
    • 0

マクロが正常動作しなかったので、修正版をUPしました



https://drive.google.com/file/d/0Byv1RH48tHeaSUN …

ダウンロードして試して下さい
    • good
    • 0

No4です



不可能だけで終わるのも何なので、一応手動で制作するシートを作ってみました

https://drive.google.com/file/d/0Byv1RH48tHeaV0U …

メインシートで選択可能なパターン一覧から【選択】をクリックして【決定】ボタンをクリックしていくだけで勤務表が追加されていきます
【取消】で一日分削除されます

パターン一覧でセルの塗りつぶし数が多いものを選択していくだけで、勤務日数/休日が平均的に割りつけされます


条件として
過去30日に同じパターンがない
過去一週間で同じペアでの日直がない
過去一週間で同じペアでの宿直がない
日直→日直の勤務がない
宿直→宿直の勤務がない
連休がない

※計算Sheetは作業用のシートなので編集しないで下さい(一応PW無しで保護してあります)

勤務表作成の参考にして下さい
    • good
    • 0

No.3です。



もう一度考えてみました。
結論としてバランスよく!は難しいと思います。

(1)~(3)重視で考えてみました。
極力同じメンバー同士の組み合わせにならないようにしてみましたが
そうすると年間出勤日数のばらつきが出てきます。

↓の画像のようにA~C列は前回同様の様式にしておいてください。
今回はD・E列に表示させてみました。

画像では色々表示されていますが、必要なのはA~C列と「メンバー表」のG列だけです。

I列はG列メンバーのすべての組合せを重複なしに表示させています。
J列はI列をランダムに並び替えるための列です。
L~O列は各行(その日)の出勤メンバーです。
H列はG列の人が年間何日の出勤か?を計算しています。
(これらはマクロで処理しています)

前回同様シートモジュールにしてみてください。

Sub 振り分け2()
Dim i As Long, k As Long, cnt As Long, myRow As Long, lastRow As Long, endRow As Long
Dim myRng1 As Range, myRng2 As Range, myFlg As Boolean
Dim str1 As String, str2 As String, c As Range, r As Range

'▼組合せ順
endRow = Cells(Rows.Count, "I").End(xlUp).Row
If endRow > 1 Then
Range(Cells(2, "I"), Cells(endRow, "J")).ClearContents
End If
cnt = 1
For i = 2 To Cells(Rows.Count, "G").End(xlUp).Row
For k = i + 1 To Cells(Rows.Count, "G").End(xlUp).Row
cnt = cnt + 1
Cells(cnt, "I") = Cells(i, "G") & "," & Cells(k, "G")
Next k
Next i
endRow = Cells(Rows.Count, "I").End(xlUp).Row
With Range(Cells(2, "J"), Cells(endRow, "J"))
.Formula = "=RAND()"
.Value = .Value
End With
Range(Cells(1, "I"), Cells(endRow, "J")).Sort key1:=Range("J1"), order1:=xlAscending, Header:=xlYes
'▲

'▼D・E列表示
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
Range(Cells(2, "D"), Cells(lastRow, "E")).ClearContents
End If
Range(Cells(2, "L"), Cells(lastRow, "M")).Formula = "=LEFT(D2,1)"
Range(Cells(2, "N"), Cells(lastRow, "O")).Formula = "=RIGHT(D2,1)"
Range(Cells(2, "H"), Cells(Cells(Rows.Count, "G").End(xlUp).Row, "H")).Formula = "=COUNTIF(L:O,G2)"
myRow = 1
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
Set myRng1 = Cells(i - 1, "E")
Set myRng2 = Union(Cells(i - 1, "E"), Cells(i, "D"))

Do Until myFlg = True
If myRow = endRow Then
myRow = 1
End If
myRow = myRow + 1
str1 = Left(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") - 1)
str2 = Mid(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") + 1, 10)
Set c = myRng1.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng1.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
If c Is Nothing And r Is Nothing Then
myFlg = True
End If
Loop
Cells(i, "D") = Cells(myRow, "I")
myFlg = False

Do Until myFlg = True
If myRow = endRow Then
myRow = 1
End If
myRow = myRow + 1
str1 = Left(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") - 1)
str2 = Mid(Cells(myRow, "I"), InStr(Cells(myRow, "I"), ",") + 1, 10)
Set c = myRng2.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng2.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
If c Is Nothing And r Is Nothing Then
myFlg = True
End If
Loop
Cells(i, "E") = Cells(myRow, "I")
myFlg = False
Next i
End Sub

※ 何度かマクロを実行して、バランスよく配置できないか?やってみましたが
日数にばらつきがどうしても出てきます。
実際に上記マクロを何度も実行してみてください。

※ パートナーの組合せが同じであれば勤労日数はバランスよく配置できますが、
いずれにしても
(1)(2)の条件と(3)の条件がネックになると思います。

※ 何度も何度もマクロを実行してみてください。
運が良ければ勤労日数がある程度均等になるかもしれません。

お手上げです。m(_ _)m
「excellで出来ないでしょうか」の回答画像5
    • good
    • 0

結論から言うと


指定された条件での勤務表作成は、非常に困難(無理)

確かに7人から2人を抜き取る組み合わせだけ考えると
21通り:Excel計算式だと=COMBIN(7,2)

例えば日直のみの勤務表なら21通りをローテすればいいのですが
これに宿直/休日の組み合わせまで加味すると話が複雑に

7人中勤務4人(日直+宿直)ということは休みが3人
7人から休みの3人を抜き出した場合の組み合わせは
35通り
例えばEFGの3人が休みの場合勤務割りは

日直宿直
ABCD
ACBD
ADBC
BCAD
BDAC
CDAB
↑の6通り

全体の組み合わせは
35*6=210通りになります

単純に210通りの組み合わせを考えた場合総当りで勤務表を作成するとその数は
210!= 1.0582362029223656378427428424335e+398

最初に一日を任意で指定た場合でも
209!= 5.039220013916026846870204011588e+395

総当りで条件に合う勤務表作成は量子コンピュータでも使わないと無理
(実際は勤務条件があるので全部計算する必要は無いのですが)


ただ勤務条件を加味した場合であっても

日直宿直
ABCD
の翌日はCDの二人は休み、日直の何方かが休み、なので勤務の組み合わせは
AEFGかBEFGの2パターン*3通り(前日日直者を宿直に配置した場合)
6通りの勤務パターンから過去6日前までの勤務状態から同じ組み合わせの含まないパターンを選択
選択した組み合わせを210通りの一覧から削除

以下同じことの繰り返しで一見可能なようですが
・前日のに直者のどちらを休みにするか
・6通りの勤務パターンから選択可能なものが複数存在する場合どれを選択するか

この選択を誤ると10日目辺りで手詰まりになります

非常に難解なパズルですw

エクセルのマクロで組むには相当の数学力が必要と思います

勤務210通り全パターン:Excelに貼り付けて勤務割作成に利用して下さい
日直宿直休日
ABCDEFG
ACBDEFG
ADBCEFG
BCADEFG
BDACEFG
CDABEFG
ABCEDFG
ACBEDFG
AEBCDFG
BCAEDFG
BEACDFG
CEABDFG
ABCFDEG
ACBFDEG
AFBCDEG
BCAFDEG
BFACDEG
CFABDEG
ABCGDEF
ACBGDEF
AGBCDEF
BCAGDEF
BGACDEF
CGABDEF
ABDECFG
ADBECFG
AEBDCFG
BDAECFG
BEADCFG
DEABCFG
ABDFCEG
ADBFCEG
AFBDCEG
BDAFCEG
BFADCEG
DFABCEG
ABDGCEF
ADBGCEF
AGBDCEF
BDAGCEF
BGADCEF
DGABCEF
ABEFCDG
AEBFCDG
AFBECDG
BEAFCDG
BFAECDG
EFABCDG
ABEGCDF
AEBGCDF
AGBECDF
BEAGCDF
BGAECDF
EGABCDF
ABFGCDE
AFBGCDE
AGBFCDE
BFAGCDE
BGAFCDE
FGABCDE
ACDEBFG
ADCEBFG
AECDBFG
CDAEBFG
CEADBFG
DEACBFG
ACDFBEG
ADCFBEG
AFCDBEG
CDAFBEG
CFADBEG
DFACBEG
ACDGBEF
ADCGBEF
AGCDBEF
CDAGBEF
CGADBEF
DGACBEF
ACEFBDG
AECFBDG
AFCEBDG
CEAFBDG
CFAEBDG
EFACBDG
ACEGBDF
AECGBDF
AGCEBDF
CEAGBDF
CGAEBDF
EGACBDF
ACFGBDE
AFCGBDE
AGCFBDE
CFAGBDE
CGAFBDE
FGACBDE
ADEFBCG
AEDFBCG
AFDEBCG
DEAFBCG
DFAEBCG
EFADBCG
ADEGBCF
AEDGBCF
AGDEBCF
DEAGBCF
DGAEBCF
EGADBCF
ADFGBCE
AFDGBCE
AGDFBCE
DFAGBCE
DGAFBCE
FGADBCE
AEFGBCD
AFEGBCD
AGEFBCD
EFAGBCD
EGAFBCD
FGAEBCD
BCDEAFG
BDCEAFG
BECDAFG
CDBEAFG
CEBDAFG
DEBCAFG
BCDFAEG
BDCFAEG
BFCDAEG
CDBFAEG
CFBDAEG
DFBCAEG
BCDGAEF
BDCGAEF
BGCDAEF
CDBGAEF
CGBDAEF
DGBCAEF
BCEFADG
BECFADG
BFCEADG
CEBFADG
CFBEADG
EFBCADG
BCEGADF
BECGADF
BGCEADF
CEBGADF
CGBEADF
EGBCADF
BCFGADE
BFCGADE
BGCFADE
CFBGADE
CGBFADE
FGBCADE
BDEFACG
BEDFACG
BFDEACG
DEBFACG
DFBEACG
EFBDACG
BDEGACF
BEDGACF
BGDEACF
DEBGACF
DGBEACF
EGBDACF
BDFGACE
BFDGACE
BGDFACE
DFBGACE
DGBFACE
FGBDACE
BEFGACD
BFEGACD
BGEFACD
EFBGACD
EGBFACD
FGBEACD
CDEFABG
CEDFABG
CFDEABG
DECFABG
DFCEABG
EFCDABG
CDEGABF
CEDGABF
CGDEABF
DECGABF
DGCEABF
EGCDABF
CDFGABE
CFDGABE
CGDFABE
DFCGABE
DGCFABE
FGCDABE
CEFGABD
CFEGABD
CGEFABD
EFCGABD
EGCFABD
FGCEABD
DEFGABC
DFEGABC
DGEFABC
EFDGABC
EGDFABC
FGDEABC
    • good
    • 0

こんばんは!



VBAになりますが、一案です。
連続2日勤続をしないようにしてみました。
↓の画像でSheet2に祝日データを作成しておきます。

そして、Sheet1のA2セルに
2015/1/1 と入力 → 「フィル」(メニューバーの右上のΣマークの下にある下向き矢印のアイコン)の右側▼をクリック
→ 連続データの作成 → 「列」を選択 → 停止値に 2015/12/31 と入力しOK

B2セルに
=TEXT(A2,"aaa")
という数式を入れ、条件付き書式 → 新しいルール → 数式を使用して・・・ → 数式欄に
=C2="日直"
という数式を入れ → 書式 → 塗りつぶしから「赤」を選択しOK
B2セルのフィルハンドルでダブルクリック(この段階では「赤」は表示されません)

C2セルに
=IF(OR(WEEKDAY(A2,2)>5,COUNTIF(Sheet2!B:C,A2)),"日直","宿直")
という数式を入れ、C2セルのフィルハンドルでダブルクリック

そして、I列1行目から「人員」を羅列しておきます。

これで下準備は完了です。

次に画面左下の「Sheet1」のSheet見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻りマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub 振り分け() 'この行から
Dim i As Long, myRow1 As Long, myRow2 As Long, myCol As Long
Dim c As Range, r As Range, myFlg As Boolean

myRow1 = 0
myRow2 = Cells(Rows.Count, "I").End(xlUp).Row + 1
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, "C") = "日直" Then
myCol = 4
Else
myCol = 6
End If
Do Until myFlg = True
If myRow1 = Cells(Rows.Count, "I").End(xlUp).Row Then
myRow1 = 0
End If
myRow1 = myRow1 + 1
Set c = Cells(i - 1, "D").Resize(, 4).Find(what:=Cells(myRow1, "I"), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
myFlg = True
End If
Loop
Cells(i, myCol) = Cells(myRow1, "I")
myFlg = False
Do Until myFlg = True
If myRow2 = 1 Then
myRow2 = Cells(Rows.Count, "I").End(xlUp).Row + 1
End If
myRow2 = myRow2 - 1
Set r = Cells(i - 1, "D").Resize(2, 4).Find(what:=Cells(myRow2, "I"), LookIn:=xlValues, lookat:=xlWhole)
If r Is Nothing Then
myFlg = True
End If
Loop
Cells(i, myCol + 1) = Cells(myRow2, "I")
myFlg = False
Next i
End Sub 'この行まで

※ とりあえず連続勤務はないようにし、全員がほぼ同じ勤務日数になると思います。
※ 日直・宿直のバランスや1週当たりの勤務日数などは無視しています。

こんな感じではどうでしょうか?m(_ _)m
「excellで出来ないでしょうか」の回答画像3

この回答への補足

スミマセン私の説明が足りなかったようです、土・日・祝祭日の日直の後も引き続き別の二名が宿直をします。それもあり
禁止事項にも以下の用にしました。
1)宿直の次に日直は出来ません(連続での出勤になりますので)。

そうなるとマクロもだいぶ変わってきますでしょうか??

補足日時:2014/12/22 16:33
    • good
    • 0
この回答へのお礼

早速のご回答ありがとう御座います、だいぶ考えて頂いたようで恐縮しております。小生の説明不足で申し訳ありません。私も考えてみます。

お礼日時:2014/12/22 16:34

>私どもはある組織の宿日直を総員7名でやっております、宿直も日直も2名で出勤します。


>7名の人員を宿直と日直は常にランダムで行いたい、つまり毎回出来れば同じ組み合わせでやりたくない。
7名の中から2名を選ぶ組み合わせは21種しかありませんので22回目は同じ組み合わせになります。
21本の籤を用意して21日毎に割り振ることになるでしょう。
貼付画像はA~G(7名相当)の中で2種(2名相当)の組み合わせを表にしたものです。

禁則になるときは21日の中で交換すれば年間での回数は均等に近づきますが完全な均等にはなりません。
同じ組み合わせは年間で約17回になります。
Excelで籤引きの代わりをするにはRAND関数、RANDBETWEEN関数(Excel 2007以降)等で乱数を発生させれば良いでしょう。
「excellで出来ないでしょうか」の回答画像2
    • good
    • 0
この回答へのお礼

早速のご回答ありがとう御座いました、仰ることは理解できるので何とかやってみようと思います。

お礼日時:2014/12/21 23:08

1か月単位の変形労働時間制ですね。

1年通しての累算が公平ににするのはわかるのですが、あくまでも1か月以内の暦日数から求まる労働時間の総枠(暦日数×40÷7)に抵触することは許されません(違法)。

で、7名でランダムに動かしてるのに、同じ人の組み合わせが固定的にできるとのこと。希望を受け付けても受付ずでも、ランダムも規則性をもたせれば固定化しないんですがね。

あと、日勤夜勤の入り乱れの勤務予定表は月で回さないで、4週(28日)で回されることです(4週ごとに勤務予定を立て年13回勤務予定を立てることになる、暦月とずれようが、休日時間外労働は各日ごとに把握できるので、月給払いに影響しない)。翌勤務予定表との切れ目は、もちろん現勤務予定表の末と睨み合わせてつるのは当然のことです。

エクセルでは、日勤夜勤を立ててない日は、色付け条件書式にて目立つようにできます。あるいは作業列(横に流すなら行)でcountif関数で確認、月間総労働時間の集計でしょう。それでモレ人数過不足がないか、チェックします。夜勤を入力してその明け休みの自動記入するにはマクロでしょうかね。解決にちょっと遠くてすみません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとう御座います、何とか工夫してやって見ます。

お礼日時:2014/12/21 22:56

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qエクセルで作成したカレンダーに「当番の名前」を自動的に入力する方法をお

エクセルで作成したカレンダーに「当番の名前」を自動的に入力する方法をおしえてください。


毎月エクセルで朝礼当番表を作っています。
土、日、祝がお休みです。
たとえば、1日に最初の人の名前を入力すると休みの日はぬかして、
順番に当番が入力されるという関数があれば教えてください。

1行目に「日にち」
2行目に「曜日」
3行目に「当番者名」

と簡単な表です。

リストからコピペしたら間違えてしまいました。

オートフィルで入力しようかと思ったのですが、休みの日を抜かすのが面倒で。


よろしくお願いします。

Aベストアンサー

>6行目(B6セル)に =IF(B6=0,MOD($B2-2+DAY(B3)-SUM($B5:B5),$B1)+1,0)
式を分解してみるとわかりやすいです。
更に
7行目に作業列 =$B2-2+DAY(B3)
    日にちごとに 日にち事に連続した番号になります。
8行目に作業列 =MOD($B2-2+DAY(B3),$B1)
    その番号を 人数で割ったあまりがでます。
9行目に作業列 =SUM($B5:B5)
    休みの数の合計がでます。

と入れて右へコピィしてみてください。
式のセルを指定する $B2 とか$マークが付く場合と付かない場合がありますよね。
絶対参照と呼びますが、意味は右へコピィしてもセルの位置を変動させないということです。
例えば
9行目の=SUM($B5:B5)の式を右へコピィした場合
=SUM($B5:B5)
=SUM($B5:C5)
=SUM($B5:D5)
・・・
と合計する範囲が広くなっていくように設定してあります。

別件ですが
カレンダーの日付をコピィの作業をしなくても良いように関数をいれておくことも出来ます。
   A     B   C   D・・・
1 人数    5   年  2010
2 最初の人  1   月   1
3 日付    10/1 10/2
4 曜日    金曜  土曜・・・
とD1セルに 年 の数値 D2セルに 月 を数値で入れます。
日付のB2セルには =DATE($D1,$D2,COLUMN(A1)) と入れて右へコピィしておきます
ここも 年と月を決める D1とD2のセルを指定するときは右へコピィしても変動しないように
$マークをつけておきます。
COLUMN(A1)はA1セルの列の番号です。右へコピィした場合に
COLUMN(B1)
COLUMN(C1) と変動する様に $マークは付けません。
*COLUMN(A1)は COLUMN(A2)でもACOLUMN(3)でもかまいません。
曜日のB3セルには =B2 と入れます。書式=>セル で表示形式のタブ ユーザ定義 で aaa
と入れると その日の表示が曜日になります。
B3セルも右へコピィします。
毎月、月の部分を変更するだけで その月のカレンダーになります。
表示形式については
http://www.excel.studio-kazu.jp/lib/e3g/e3g.html
などを参考にしてください。

>6行目(B6セル)に =IF(B6=0,MOD($B2-2+DAY(B3)-SUM($B5:B5),$B1)+1,0)
式を分解してみるとわかりやすいです。
更に
7行目に作業列 =$B2-2+DAY(B3)
    日にちごとに 日にち事に連続した番号になります。
8行目に作業列 =MOD($B2-2+DAY(B3),$B1)
    その番号を 人数で割ったあまりがでます。
9行目に作業列 =SUM($B5:B5)
    休みの数の合計がでます。

と入れて右へコピィしてみてください。
式のセルを指定する $B2 とか$マークが付く場合と付かない場合がありますよね。
絶対参照と呼び...続きを読む

Qエクセルで当番表をつくりたいのですが、簡単な関数を使ってできません。私

エクセルで当番表をつくりたいのですが、簡単な関数を使ってできません。私のレベルは中級くらいです。当番表の内容は、21名がそれぞれ所有する田んぼの面積に応じて田んぼの水を入れる当番です。当番は二人一組で、行います。面積の広い人は、回数が多く、少ない人は回数が少なくあたるようにします。公平なものにならなくてはいけません。3~4か月間の毎日です。同じ面積の人も10名位いるので、私は、全体面積に対する割合を出して、間隔日数を出す。後・・それぞれの割当たる間隔日数を崩さずに当たるようにする。・・・などあるのですが、・・私には、難しいので、どうかそんなの簡単だと思われる方は、至急回答お願いします。できたら、私でも理解しやすい表現で回答いただけたら、うれしいです。よろしくお願いします。

Aベストアンサー

#4です。以下貼り付けください。
Sub Toban()
Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet, Rng As Range
Dim r As Integer, c As Integer, p As Long, q As Long
Set Ws1 = Worksheets("Sheet1")
Set Ws2 = Worksheets("Sheet2")
Set Ws3 = Worksheets("Sheet3")
Ws1.Select
Set Rng = Cells(1, 1).CurrentRegion
With Rng
.Copy
.PasteSpecial Paste:=xlPasteValues
.Sort _
Key1:=Cells(1, 3), _
Order1:=xlDescending, _
Header:=xlNo, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
Sortmethod:=xlPinYin
End With
For r = 1 To 21
For c = 1 To Cells(r, 3)
Cells(r, c + 3).Value = Cells(r, 1) & c
Next c
Next r
Ws2.Select
Dim Hiduke As Date
Hiduke = InputBox("開始日入力。yyyy/m/d")
q = 0
For p = 0 To 178 Step 2
Range(Cells(1 + p, 1), Cells(2 + p, 1)).Value = Hiduke + q
q = q + 1
Next p
q = Ws1.Cells(1, Columns.Count).End(xlToLeft).Column
For p = 4 To q
Range(Ws1.Cells(1, p), Ws1.Cells(Rows.Count, p).End(xlUp)).Copy
Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteAll
Next p
Cells(1, 2).Delete
Set Rng = Cells(1, 1).CurrentRegion
For p = 0 To 89
Cells(p + 1, 4).Value = Cells(1, 1) + p
Cells(p + 1, 5).Value = Application.WorksheetFunction.VLookup(Cells(p + 1, 4), Rng, 2, 0)
Cells(p + 1, 6).Value = Application.WorksheetFunction.VLookup(Cells(p + 1, 4), Rng, 2, 1)
Next p
Set Rng = Cells(1, 4).CurrentRegion
Range(Cells(1, 4), Cells(1, 4).End(xlDown)).Copy Ws3.Cells(3, 1)
Range(Ws1.Cells(1, 1), Ws1.Cells(21, 2)).Copy
Ws3.Cells(1, 2).PasteSpecial Transpose:=True
Ws3.Select
Range(Columns(2), Columns(22)).ColumnWidth = 6
Dim Ret As Integer
For r = 1 To 90
For c = 5 To 6
Ret = Application.WorksheetFunction.Match(Left(Ws2.Cells(r, c), 1), Ws3.Rows(1), 0)
With Ws3.Cells(r + 2, Ret)
.Value = "■"
.HorizontalAlignment = xlCenter
End With
Next c
Next r
Set Ws1 = Nothing
Set Ws2 = Nothing
Set Ws3 = Nothing
End Sub

#4です。以下貼り付けください。
Sub Toban()
Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet, Rng As Range
Dim r As Integer, c As Integer, p As Long, q As Long
Set Ws1 = Worksheets("Sheet1")
Set Ws2 = Worksheets("Sheet2")
Set Ws3 = Worksheets("Sheet3")
Ws1.Select
Set Rng = Cells(1, 1).CurrentRegion
With Rng
.Copy
.PasteSpecial Paste:=xlPasteValues
.Sort _
Key1:=Cells(1, 3), _
Order1:=xlDescending, _
Header:=xlNo, _
Order...続きを読む

Q【大至急お願いします!!】エクセルを使ってシフト表を作成したい

【大至急です!!】
エクセルを使ったローテーションの作成方法を教えてください!!
エクセル初心者です。

人事異動で以下のような窓口当番のローテーションを作成することになりました。

会社のパソコンのセキュリティ上フリーソフトは使用できず、また、私自身のパソコンスキルからエクセルを使用して作成するよりほかないと考えています。
(私自身はマクロは使えません。)

エクセルのバージョンは2010です。

どのような方法があるか詳しくお教え下さい。

1.10名程度で2つの窓口を担当する。

2.1つの窓口に1名の担当者がつきます。

3.担当者は午前と午後で交代する。(=2名×2名で1日つき4名が必要)

4.休暇や繁忙時期を考慮する必要があるため、適宜担当できない日を考慮する必要がある。(繁忙期や休暇というのは、人によって取得日が違うため個別対応が必要という意味です。)

5.担当者の経験が分かれるため、10名を2グループに分け、なおかつ顔合わせもランダムになるようにしたいです。



ざっくりしているかもしれませんが、以上です。宜しくお願いします。

【大至急です!!】
エクセルを使ったローテーションの作成方法を教えてください!!
エクセル初心者です。

人事異動で以下のような窓口当番のローテーションを作成することになりました。

会社のパソコンのセキュリティ上フリーソフトは使用できず、また、私自身のパソコンスキルからエクセルを使用して作成するよりほかないと考えています。
(私自身はマクロは使えません。)

エクセルのバージョンは2010です。

どのような方法があるか詳しくお教え下さい。

1.10名程度で2つの...続きを読む

Aベストアンサー

>窓口が午前・午後各2名ある場合は各列にコピペして増やせば良いのでしょうか
いや、全員を2つのグループに分けてそれぞれのグループから1人ずつという風に理解していたので、その表は一人しか選びません。だって、経験によって2つのグループに分けるのですから、多分ベテランと新人のグループに分けるんでしょう?ですから、ベテラン用の表と新人用の表を2つつくってそれぞれから1人ずつ選ぶという使い方を想定しています。
もし一つの表で2人選ぶということであれば(もちろんそれが要求仕様なのですが)、根本的に作り替えなければならないので、申し訳ないですがお手伝いできないです。
ただ、別の方がアイデアをお持ちかもしれませんので、その「担当者の経験が分かれるため、10名を2グループに分け」が具体的にどういう意味なのか捕捉されておくとよいでしょう。不躾ながら正直言うとベテラン用と新人用で分けてそれぞれから一人ずつ選べばいいんじゃないかなぁ、としか思えないのです。

>お教えいただいた形の場合、何か入力するたびに再計算されるのですが、そもそもそうゆうものなのでしょうか?
そうです。ですから、エクセルの設定を手動計算にする必要があります。
リボンに「計算」というタブがあります。そこに「計算方法の設定」という項目がありますから、そこで設定します。詳しくはこちらをどうぞ↓。
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=012854
再計算するにはF9を押します。

>午後当番→同じ方が午前当番となってしまう事例が発生しています
それはそうなると知っていました。午前と午後で交代するということだけだったので、日付が変われば午後と午前でつながってもいいという意味だと思っていました。でも午後-午前も一緒に禁止する方が実装するのは簡単です。Plan Optimized の部分は第一日目の午前を除いて、全部同じにすればいいです。つまり第一日目の午後をそのままま全シフトにコピーすれば午後-午前もなくなります。
ただ前の月の最後のシフトとの関係は人間が確認しなければならないです(これは前のバージョンでも同じ)。

>何度再計算しても各人の当番回数がかなりばらついてしまいます。
そうですね。それは手で調整することを想定しています。私の手元では5人の表を作ったので何回かやるといい感じのが出てくるのですが、それでも特定の期間にかたまってしまうというようシフト表になってしまいます。10人でやるとさらに理想的なシフト表ができにくいかもしれません。でもまるっきり白紙の状態から手で作るよりはかなり楽になるのと思うのですが。
また、本質的な解決方法じゃないですが、過去の3シフトに入っていた人からは選ばない、というような条件を付け加えると、少しはましになるようです。「過去の3シフト」の縛りを加えるには、Plan Optimized の項目で第2日目の午後シフトを =If(CountIf(B24:D24,"√")>0,"x",If(E4="x","x","")) として下と右にコピーしていきます。ただし、この縛りを入れると、とても規則的なシフト表になるとか、誰も入れない日がいくつも出てくるとか、別の問題も出てきます。

>パソコンに詳しい方からすれば無茶な質問であることは理解しております。
私はそうは思いませんが、ただエクセルのファイルのままで渡せないとかいうのがありますので、こういう掲示板でやり取りするとちょっと時間かかるのはたしかですね。

>窓口が午前・午後各2名ある場合は各列にコピペして増やせば良いのでしょうか
いや、全員を2つのグループに分けてそれぞれのグループから1人ずつという風に理解していたので、その表は一人しか選びません。だって、経験によって2つのグループに分けるのですから、多分ベテランと新人のグループに分けるんでしょう?ですから、ベテラン用の表と新人用の表を2つつくってそれぞれから1人ずつ選ぶという使い方を想定しています。
もし一つの表で2人選ぶということであれば(もちろんそれが要求仕様なのですが)、根本...続きを読む

QEXCEL 当番表の作り方

条件

・13名
・1日1名
・曜日関係なし

この条件で当番表を作成したいのですが、何か関数を使用して簡単に当番表を作ることはできますか?

Aベストアンサー

当番表の様式が書かれていないので添付図の2例を想定しました。

上の表は日付ごとに名前を割り付る場合
1.黄色部分を入力する
2.5月1日の下のセルに式 =A2+1 を入力する(理由5月1日がA2)
3.この式を下までコピーする。
4.山田の下のセルに式 =B2+3 を入力する(理由青木がB2、名前3人)
5.この式を下までコピーする。

下の表は名前ごとに月日を指定する場合
1.黄色部分を入力する
2.5月1日の右のセルに式 =B10+3 を入力する(理由5月1日がB10、名前3人)
3.この式を右端までコピーする。
4.5月1日の下のセルに式 =B10+1 を入力する(理由5月1日がB10)
5.この式を表の斜め右下まで全セルにコピーする。

以上()内に理由をかきましたが、実際のセル位置人数で作成してください。

Q(Excel)あるセルに文字を入力しただけで、同じブック内のほかのワークシートにも、同じ文字が自動的に入るようにするには?

こんにちは。
質問内容はタイトルのとおりです。

あるワークシートのあるセルに文字を入力すると、ほかのワークシートのセルにも同じ文字が自動的に書き込まれる方法を知りたいです(ブックは同じ)。複数のワークシートを制御するには、やはりマクロを使うのでしょうか?

よろしくお願いします。

Aベストアンサー

clam_chowderさん、こんにちは。

Sheet1のA1にたとえば「100」と入力しますね。
Sheet2のA1に、これと同じ数値を表示するには、
 =Sheet1!A1
でOKです。

数式をいれるのが苦手なら、
Sheet2のA1セルで「=」を入力すると、数式入力状態に入りますから、
ここでSheet1のシートタブをクリックし、
リンクしたいA1セルをクリックしてEnterすると、
自動的にさきほどと同じ式が入ります。

Qエクセルで打ち込んだ数字を自動で別シートに表示したい

エクセルでセルに打ち込んだ数字を自動で別シートに表示できる方法があれば、教えてください。

例えば、シート1のC1に5を打ち込んだら、シート2のD2にシート1で打ち込んだ5が自動で表示される。

また1列すべてを自動で表示させる場合、一つのセルの時と違いがありましたら教えてください。よろしくお願いします。

Aベストアンサー

こんばんは。
入力したセルの値を合計とかでなくて、
純粋に別のシートに自動的に表示したいのであれば、
以下の方法があります。

1.1つのセルだけの場合
例)シート1のC1に5を打ち込んだら、
  シート2のD2にシート1で打ち込んだ5が自動で表示される

⇒シート2のD2のセルをアクティブにして「=」を入力
 した後、シート1のC1をクリックする。
 そうするとD2のセルに「=Sheet1!C1」と表示され、値が自動的に
 表示されるようになります。

2.1列全てコピーしたい場合。
  コピー&リンク貼り付けを使うと便利です。

例)例)シート1のC1~C5に何かを入力したら、
  シート2のD2~D7にシート1で打ち込んだものが自動で表示される

  シート1にあるコピー元のセルを範囲選択して、
  シート2のD2の上で「右クリック」⇒「形式を選択して貼り付け」
  をクリックします。

  そして出てきた小さな画面の左下にある「リンク貼り付け」という
  ボタンをクリックすると完成です。
  試してみてください。。

  念のためにリンク貼り付けを図解しているURLを載せておきます。
  参考にしてみてくださいね。。
  http://www.geocities.jp/office_inoue/excel/eq21.htm

こんばんは。
入力したセルの値を合計とかでなくて、
純粋に別のシートに自動的に表示したいのであれば、
以下の方法があります。

1.1つのセルだけの場合
例)シート1のC1に5を打ち込んだら、
  シート2のD2にシート1で打ち込んだ5が自動で表示される

⇒シート2のD2のセルをアクティブにして「=」を入力
 した後、シート1のC1をクリックする。
 そうするとD2のセルに「=Sheet1!C1」と表示され、値が自動的に
 表示されるようになります。

2.1列全てコピーしたい場合。
  コ...続きを読む

Qエクセルでの指定文字 カウントについて

エクセルで並んだデータでの指定した名前だけの個数をカウントするにはどうすればいいのでしょうか?

山田 高橋 佐藤
高橋 梅田 赤田
 西 山田 梅田
佐藤 山田 梅田

名前が並んだデータで「高橋」という名前が何個あるのかをカウントしたいのですがどうすればいいのでしょうか?

Aベストアンサー

 データは入力されているセルの範囲を「A1:C4」とすれば、

=COUNTIF(A1:C4,"高橋")

Qエクセルで、勤務表から 日付別に勤務者と勤務形態を抽出して、別シートに抽出したい

Sheet 1 勤務表(4月)
    A     B     C      D…
        4/1      4/2    4/3 …

1 赤星     早1    夜勤入り  夜勤明け …
2 関本    遅1    早1    早1   …
3 新井    休     遅1    早2   …
4 金本    夜勤入り  夜勤明け  休    …
5 ブラぜル  夜勤明け 休     遅1   …
6 桜井    休     早2    遅2   …
7 鳥谷    早2    遅2    早3   …
8 狩野    遅2    早3    休    …
9 藤川    早3    休     夜勤入り …

以上のような、勤務表、(各列には、日付、各行には、従業員の名前が9人)が、あり、毎日、早番 3種類、遅番 2種類、夜勤入り 1人、夜勤明け 2人、休み、のデータが入っています。(ずれていたら、すいません)
これを、Sheet 2以降に、日付ごとに、出勤している従業員名と、そのとなりのセルに、その従業員の勤務種別を抽出して、表示したいのです。しかも、夜勤入り、夜勤明け、休みは表示させたくありません。)例えば、こんな感じです。

Sheet 2   Sheet 3    Sheet 4
(4月1日)    (4月2日)    (4月3日)
赤星 早1     関本 早1  関本  早1
関本 遅1     新井 遅1  新井  早2
鳥谷 早2     桜井 早2   ブラぜル 遅1
狩野 遅2     鳥谷 遅2   桜井  遅2
藤川 早3     狩野 早3    鳥谷  早3 

いろいろとムシのいい話を書いて申し訳ありませんが、当方vbaの初心者で、このような場合、何から手を付けて良いのか分からず、困っております。どうか、なにとぞ、ご教授下さい。

Sheet 1 勤務表(4月)
    A     B     C      D…
        4/1      4/2    4/3 …

1 赤星     早1    夜勤入り  夜勤明け …
2 関本    遅1    早1    早1   …
3 新井    休     遅1    早2   …
4 金本    夜勤入り  夜勤明け  休    …
5 ブラぜル  夜勤明け 休     遅1   …
6 桜井    休     早2    遅2   …
7 鳥谷...続きを読む

Aベストアンサー

回答No3です。
ごめんなさい。肝心の式の表示が抜けておりました。
A15セルには次の式を入力し、下方にオートフィルドラッグします。
=ROW(A3)
B15セルには次の式を入力し右方向にオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。
=IF((IF(B3="早1",1,0)+IF(B3="早2",1,0)+IF(B3="早3",1,0)+IF(B3="遅1",1,0)+IF(B3="遅2",1,0))=0,"",MAX(B$14:B14)+1)

QExcelで勤務シフト表を作りたいのですが、セルの設定方法がわかりませ

Excelで勤務シフト表を作りたいのですが、セルの設定方法がわかりません。

シート1の「シフト表」に勤務場所A・B・Cを入力するだけで、自動的にシート2の
「配置メンバー」へ配置場所 対 人名の表が並べ替えられて出力されるようにするには、
どのセルにどのような関数を設定すればよいのでしょうか?

マクロやVBAをなどを使わず、もっとも簡単にできる方法を教えてください。
(掲載画像は関数などを使わず、手作業で入力したものです。)

Aベストアンサー

こんばんは!
続いてお邪魔します。
関数の説明ですが、

前回の数式はこちらが勝手に10行目まで対応できる数式にしていましたので
データ量によって範囲指定の領域はアレンジしてください。

=IF($A3="","",INDEX(Sheet1!$A$3:$A$10,MATCH($A3,Sheet1!B$3:B$10,0)))

の前半部分 =IF($A3="","", は
単にエラー処理のための数式です。
A3セルが空白の場合は空白にしなさい!という意味で、
A3セル(複合参照しています 「$」マークがAの前だけについています)を
オートフィルで列方向と行方向にコピーした場合、
A列は固定して行番号だけが相対参照するようにしています。
すなわち、下へコピーするたびに、A3→A4→A5・・・と数式が変更します。
列方向へはいくらコピーしてもA列を参照することになります。

そして後半の
INDEX(Sheet1!$A$3:$A$10,MATCH($A3,Sheet1!B$3:B$10,0)) の部分は
A3セルが空白でない場合の数式になります。

Sheet1のA3~A10セルは絶対参照(「$」マークが列番号と行番号の前についています)
ですので、いくら列方向や行方向にコピーしても常にこのセルを参照します
この配置で、A3セルを参照しB3~B10セル
(複合参照です、このB$3:B$10は行を固定し、列は相対参照です。行方向にコピーしても3~10行目を常に参照します。
列方向に関してはオートフィルでコピーするにしたがって、列も移動しますので
コピーした一つ右となりの列の数式をみたもらうと
C$3:C$10 となっているはずです。
結局その行内でA3と一致する行番号(INDEX関数で範囲指定した行の何行目か?)を表示させています。

これで、画像のSheet2の1日はSheet1のB2~B10を参照し、3行目は「A」と一致する「鈴木さん」
4行目は「B」と一致する「佐藤さん」・・・
という表示になる訳です。
2日も同様になりますので、
Sheet1のC2~C10を参照し、「A」と一致するのは「田中さん」「B」と一致するのは「鈴木さん」・・・
といった具合です。

以上、大変長々と書いてしまいましたが
この程度で理解いただけたでしょうか?
どうも失礼しました。m(__)m

こんばんは!
続いてお邪魔します。
関数の説明ですが、

前回の数式はこちらが勝手に10行目まで対応できる数式にしていましたので
データ量によって範囲指定の領域はアレンジしてください。

=IF($A3="","",INDEX(Sheet1!$A$3:$A$10,MATCH($A3,Sheet1!B$3:B$10,0)))

の前半部分 =IF($A3="","", は
単にエラー処理のための数式です。
A3セルが空白の場合は空白にしなさい!という意味で、
A3セル(複合参照しています 「$」マークがAの前だけについています)を
オートフィルで列方向と行方向に...続きを読む

Qエクセルで出勤表から出勤者の名前を出したいのですが。

エクセルで出勤表から出勤者の名前を出したいのですが。

介護施設に勤務しています。A~E(職員名とする)までの5人が勤務しているとします。今ここに、縦がA~E、横が月日のエクセルの表(表1とする)があるとします。
仮に6月1日はA,B,Cの3人が出勤で表の該当セルに○が入力されています。6月2日はB,D,Eが出勤で同様に○が入力されています。こんな感じで月末までの勤務表が出来ているとします。

ここで別のシートに「今日の出勤者」として当日の出勤者を表(表2)に出したいと思っています。
私が望んでいるのは、表1の希望の月日をクリック、もしくは入力すると、自動で表2のセルにその日の出勤者だけの名前が返せればいいのですが・・・。
本日の出勤者として本部に名前入りの表をあげないといけなく、これまでは表1から該当日の○を数えては、その職員名を手書きで書いて送っていました。この煩雑な作業を効率化したいと思っています。
よろしくご教授お願いいたします。

Aベストアンサー

日付をクリックした場合に実行する場合は以下のようなマクロを使用します。
使用した表と実行結果は画像の通りです。
このプログラムの場合1行目をクリックした場合に実行されます。
もしマクロで行うのであれば試してみてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer
Dim iRowNo As Integer
iRowNo = 1
If Target.Row = 1 And Target.Column <> 1 Then
Worksheets("Sheet2").Columns(2).Clear
For i = 2 To 6
If Cells(i, Target.Column).Value = "○" Then
Worksheets("Sheet2").Cells(iRowNo, 2).Value = Cells(i, 1).Value
iRowNo = iRowNo + 1
End If
Next
End If
End Sub

日付をクリックした場合に実行する場合は以下のようなマクロを使用します。
使用した表と実行結果は画像の通りです。
このプログラムの場合1行目をクリックした場合に実行されます。
もしマクロで行うのであれば試してみてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer
Dim iRowNo As Integer
iRowNo = 1
If Target.Row = 1 And Target.Column <> 1 Then
Worksheets("Sheet2").Columns(2).Clear
For i = 2 To 6
If Cells(i, Target.Col...続きを読む


人気Q&Aランキング