アプリ版:「スタンプのみでお礼する」機能のリリースについて

毎週日曜日が休日の職場でシフト表を作成しています。
元の表は残したまま元の表の数段下に曜日に「日」とつく列のセルを削除して左詰めにした表を作成したいです。

空白セルの左詰めのマクロはたくさんあったのですが、指定した文字を含む列をのセルを左詰めにするマクロがみつからなかったので、教えていただければと思います。

またシフト表が12月と1月のとき、日曜日以外の休日(12月は29日~31日、1月は1日~3日)も削除したいです。

よろしくお願いいたします。

「エクセルVBAで1ヶ月のシフト表から日曜」の質問画像

A 回答 (16件中1~10件)

まだ、No1の方の想定


 >おそらくB4・B5セルの数値を入れ替えると日付・曜日も変わるカレンダーになっているものだと思います。
にご質問者さんの確認が取れていませんので、私の解釈で進めてしまいました。

マクロで更新させてしまいますので、
E4 - 2018, E5 -月数を入れてください。
イベント・ドリブン型にするか、ボタン式にするのかどちらでもよいと思います。
その時に、別のシート(どこでもよいです)のセルに縦に、休日データを入れてください。

名前の登録で、「HOLIDAY」と付けてください。そして、呼び出せるようにしてください。

2018/8/11
2018/9/17
2018/9/24
2018/10/8
2018/11/3
2018/11/23
2018/12/23
2018/12/24
2018/12/29 ----------会社の年末・正月休み
2018/12/30
2018/12/31
2019/1/1
2019/1/2
2019/1/3 ----------会社の年末・正月休み(終了)
2019/1/14
2019/2/11
2019/3/21

質問の内容をみると、二段階で出来上がっているようです。
・表の更新と、
・日曜の列を飛ばしたデータの転載
(最初の「表の更新」は不要かもしれませんが、これがないと、2番めの表に転機は難しいかもしれません。)
なお、行末に「*」がついているところは、位置を特定する部分ですから、位置が変わったら変更しなくてはなりません。色付けは、条件付き書式で行っています。

'標準モジュール
Sub DateLists()
''表の更新
Const ItemNO As Long = 10 'データの行数 *
Dim yr As Variant
Dim mn As Variant
Dim sDate As String
Dim fDate As Date
Dim oCol As Range
Dim cnt As Long, i As Long, j As Long
yr = Range("B4").Value '*
mn = Range("B5").Value '*
If MsgBox("シートを" & mn & "月に更新しますが、よろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
sDate = yr & "/" & mn & "/" & 1
If IsDate(sDate) Then
 fDate = DateSerial(yr, mn, 1)
Else
 MsgBox "入力した日付が認識できません。", vbExclamation
End If
cnt = Day(DateSerial(yr, mn + 1, 0)) 'ひと月の日にち
Set oCol = Cells(5, Columns.Count).End(xlToLeft)
If oCol.Column > 3 Then
 Range("E5").Resize(2 + ItemNO, 31).ClearContents '決め打ち *
 Range("E19").Resize(2 + ItemNO, 31).ClearContents '決め打ち *
End If
With Range("E5").Resize(, cnt)
 .NumberFormatLocal = "d"
 .Offset(1).NumberFormatLocal = "aaa"
 .Resize(2).FormatConditions.Delete
 With .Resize(2).FormatConditions.Add(xlExpression, xlEqual, "=WEEKDAY(RC)=1")
  With .Font
  .Bold = True
  .ColorIndex = 3
  End With
 End With
 With .Resize(2).FormatConditions.Add(xlExpression, xlEqual, "=ISNUMBER(MATCH(RC,HOLIDAY,FALSE))=TRUE")
  With .Font
  .Bold = True
  .ColorIndex = 45 '色(橙色)
  End With
 End With
End With
Range("E5:E6").Value = fDate
Range("E5:E6").Offset(, 1).Resize(, cnt - 1).FormulaLocal = "= RC[-1] +1"
End Sub

Sub SecondMekeList()
''日曜の列を飛ばしたデータの転載
Dim yr As Long
Dim mn As Long
Dim sDate As String
Dim fDate As Date
Dim i As Long, j As Long
Dim cnt As Long
Const ItemNO As Long = 10 '2段目の項目数*

yr = Range("B4").Value '*
mn = Range("B5").Value '*
sDate = yr & "/" & mn & "/" & 1
fDate = DateSerial(yr, mn, 1)
cnt = Day(DateSerial(yr, mn + 1, 0))
Application.ScreenUpdating = False
For i = 1 To cnt
 With Range("E5").Offset(, i - 1)
  If .DisplayFormat.Font.ColorIndex = 1 Then
  '19行目から、日曜、祭日抜きで日付を入れる*
  Cells(19, 5 + j).Resize(2 + ItemNO).Value = .Resize(2 + ItemNO).Value
  j = j + 1
  End If
 End With
Next
Application.ScreenUpdating = True
End Sub

添付画像で、位置関係を確認してほしいです。
2番めの表は、 「'19行目から、日曜、祭日抜きで日付を入れる」というところで、位置を調整します。10行ではないでしょうから、両方のマクロも、同じ数で、任意のメンバー数を入れてください。
「エクセルVBAで1ヶ月のシフト表から日曜」の回答画像3
    • good
    • 0
この回答へのお礼

WindFallerさん

ご回答ありがとうございます。

>名前の登録で、「HOLIDAY」と付けてください。そして、呼び出せるようにしてください。
名前の登録はしましたが、呼び出せるようにとは具体的にどのような操作をするのでしょうか?

>最初の「表の更新」は不要かもしれませんが、これがないと、2番めの表に転機は難しいかもしれません。
>なお、行末に「*」がついているところは、位置を特定する部分ですから、位置が変わったら変更しなくてはなりません。
すみません、この文章が理解できませんでした。

マクロを実行してみましたが、「DateLists」はデータが全て消えてしまいます。
データを元に戻して「SecondMekeList」を実行するとうまくできたのですが、E5:AI6セルの関数が消えてしまい、
B4・B5セルに年・月を入力しても日付と曜日が変わらなくなってしまいました。
できればE5:AI6セルの関数は上書きせずに残しておきたいです。


WindFallerさんのやり方で進めていきたいのですが、また教えて頂ければと思います。
よろしくお願いいたします。

お礼日時:2018/08/26 21:23

シフト表2018.xlsm



No.13/14 を格納したエクセルファイルをFireStrageにアップロードしておきました。
ダウンロードパスワード このURLの/qa/-----.html
----の数字 106****(8桁)
http://xfs.jp/Xo2Mb (短縮URL)

アップロード期限は一応1ヶ月ぐらいです。(ミスや修正がありましたら、このファイルは削除してしまいます。)ダウンロードは、少し紛らわしいのですが、ダウンロードURLをクリックしてください。

ダウンロード後は、ファイルを選択し、右クリック・プロパティで、「アクセスブロック」を
□許可する
にしてください。

なお、マクロ不可のプロテクトや再計算を手動に設定されるなどの保護機能が働くこともありますので、随時、外してください。

このファイルは、Excel2010 と、Excel 2013で検査されています。
    • good
    • 0
この回答へのお礼

WindFaller様

お礼が遅くなり大変申し訳ありませんでした。
体調を崩し入院していたため、PCを操作することができませんでした。
こちらで質問して教えていただいた内容については今後活用していけるよう
もっと勉強したいと思っています。
本当にありがとうございました。

お礼日時:2018/12/23 13:12

No12です



投稿した後から気づきました。

NOT((WEEKDAY($E$5:$AI$5)=1)+(TEXT($E$5:$AI$5,"mmdd")<"0104")+(TEXT($E$5:$AI$5,"mmdd")>"1228")>0)

(WEEKDAY($E$5:$AI$5)=1)+(TEXT($E$5:$AI$5,"mmdd")<"0104")+(TEXT($E$5:$AI$5,"mmdd")>"1228")=0
で、充分でした。

大変失礼いたしました。
(大差はないけれど、こちらの方がほんの少しだけ単純になっていますので…)

暑さで、頭が疲れてる~~‼
    • good
    • 0
この回答へのお礼

fujillin様

お礼が遅くなり大変申し訳ありませんでした。
体調を崩し入院していたため、PCを操作することができませんでした。
こちらで質問して教えていただいた内容については今後活用していけるよう
もっと勉強したいと思っています。
本当にありがとうございました。

お礼日時:2018/12/23 13:13

環境整備用


これは、基本的には使わなくてもよいものです。
条件付き書式や数式などをマクロで書いてあげるものです。
No.13で書いたコードの下に入れてあげてください。

'//
Sub DateLists2() '環境整備
'ver1.02
'これは、更新機能はなく、単に表の設定だけの機能に絞っています。
'数式と、条件付き書式を埋め込みます。
Dim yr As Variant
Dim mn As Variant
Dim sDate As String
Dim fDate As Date
Dim oCol As Range
Dim cnt As Long, i As Long, j As Long
Dim lCol As Long

lCol = Range(FPOINT).Column
If Day(Range(SPOINT).Value) > 10 Then
 MsgBox "表2の位置が違っているようです。'DateList2'のSPOINTを修正してください。", vbCritical
 Exit Sub
End If
Call CheckNameResistered '休日データの登録のチェック

yr = Range(cnYR).Value
mn = Range(cnMN).Value
''If MsgBox("シートを" & mn & "月に更新しますが、よろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
sDate = yr & "/" & mn & "/" & 1
If IsDate(sDate) Then
 fDate = DateSerial(yr, mn, 1)
Else
 MsgBox "入力した日付が認識できません。", vbExclamation
End If
cnt = Day(DateSerial(yr, mn + 1, 0))

With Range(FPOINT).Resize(, cnt)
 .NumberFormatLocal = "d"
 .Offset(1).NumberFormatLocal = "aaa"
End With
With Range(FPOINT)
 Range(FPOINT).Resize(, 31).Resize(2).FormatConditions.Delete
 With .Offset(, 24).Resize(, 8).Resize(2).FormatConditions.Add(xlExpression, xlEqual, "=R5C2<MONTH(R5C)")
  With .Font
  .ColorIndex = 2
  End With
 End With
 With .Resize(, cnt).Resize(2).FormatConditions.Add(xlExpression, xlEqual, "=WEEKDAY(RC)=1")
  With .Font
  .Bold = True
  .ColorIndex = 3
  End With
 End With
 With .Resize(2).FormatConditions.Add(xlExpression, xlEqual, "=ISNUMBER(MATCH(RC,HOLIDAY,FALSE))=TRUE")
  With .Font
  .Bold = True
  .ColorIndex = 45
  End With
 End With
End With
Range(FPOINT).FormulaLocal = "=DATE(" & cnYR & "," & cnMN & ",1)"
Range(FPOINT).Offset(1).FormulaLocal = "=DATE(" & cnYR & "," & cnMN & ",1)"
Range(FPOINT).Resize(2).Offset(, 1).Resize(, cnt - 1).FormulaLocal = "= RC[-1] +1"
End Sub
    • good
    • 0
この回答へのお礼

Windfaller様

お礼が遅くなり大変申し訳ありませんでした。
体調を崩し入院していたため、PCを操作することができませんでした。
こちらで質問して教えていただいた内容については今後活用していけるよう
もっと勉強したいと思っています。
本当にありがとうございました。

お礼日時:2018/12/23 13:14

こんにちは。


No.8 からの続きになります。

ごちゃごちゃ書いてすみません。
少し、ポイントをまとめさせていただきます。

>他の同僚たち(パソコン初心者)が関数を上書きしてしまうことが何度もあり、
プロテクトもどきのものを、作ることも可能ですが、おそらくは、表の加工のしやすさを考慮して、単純な仕組みにしました。

休日データは、自動で入れる方法もありますが、会社の設定もあるでしょうから、手動で入れるようにしています。日にちが、経過してデータがなくなったら、警告を出すようにしています。

今回の修正ポイントは
・データの位置関係は、マクロの上部で一括設定できるようにした。
・マクロを3つにわけて、
 1.(DateLists2)「環境整備」として、表1の数式・条件付き書式を設定するようにした。(使わなくても可能)
 2.表2に転記だけするようにした。(SecondMekeList2)
  この時に、祭日などのチェックがなされます。
 3.データを削除するマクロを独立させた。(DataClear)
 4.名前の登録で休日データが古くなっていたら、更新が求められます。

実際に作られたものは、至って簡単な仕組みでしかありません。数式も簡単です。
仮に数式を削除しても、データを削除せずに、DateList2「環境整備」で、復活させることが出来ます。

なお、他のブックにコピーした場合は、ボタン・名前登録すべて登録し直してください。

'//標準モジュールのみです。したがってフォームコントロールのボタンが最適です。

Option Explicit
'************************
'ユーザー設定
Const cnYR As String = "B4" '年のボックス
Const cnMN As String = "B5" '月のボックス

Const FPOINT As String = "E5" '元の表の1日の場所
Const SPOINT As String = "E19" '表2の1日の場所

Const ItemNO As Long = 10 '人員の数 1~
'**************************
Sub SecondMekeList2()
''表2に転記するのためのマクロです
'ver 1.1 '2018/08/29
Dim yr As Long
Dim mn As Long
Dim sDate As String
Dim fDate As Date
Dim i As Long, j As Long
Dim cnt As Long, rw As Long
If FPOINT = SPOINT Then MsgBox "第2表の位置が定まっていません。", vbCritical: Exit Sub
Call CheckNameResistered
yr = Range(cnYR).Value
mn = Range(cnMN).Value
If yr < 2000 Or mn < 0 And mn > 12 Then MsgBox "日付にエラーがあります。", vbCritical: Exit Sub

fDate = DateSerial(yr, mn, 1)
cnt = Day(DateSerial(yr, mn + 1, 0))
Application.ScreenUpdating = False
For i = 1 To cnt
 With Range(FPOINT).Offset(, i - 1)
  If .DisplayFormat.Font.ColorIndex = 1 Then
  rw = Range(SPOINT).Row
  Cells(rw, 5 + j).Resize(2 + ItemNO).Value = .Resize(2 + ItemNO).Value
  j = j + 1
  End If
 End With
Next
Application.ScreenUpdating = True
End Sub

Sub CheckNameResistered()
'休日データのチェックです。単独で使うことはありません。
''Ver 1.0
Dim rng As Variant
On Error Resume Next
rng = ThisWorkbook.Names("HOLIDAY").RefersToLocal
If Err.Number > 0 Then
 MsgBox "名前の登録で、「休日・祭日」の日付を入れて'HOLIDAY'という『名前・登録』してください。", vbExclamation
 End
 Exit Sub
End If
If InStr(1, rng, "[", 1) > 0 Then
MsgBox "名前の登録の'HOLIDAY' を削除して、「休日・祭日」の日付を同名の'HOLIDAY'で『名前・再登録』してください。", vbExclamation
 End
 Exit Sub
End If
On Error GoTo 0
rng = Mid(rng, 2)
If Application.Max(Range(rng)) <= Date Then
 MsgBox rng & "範囲内で休日データを更新してください。", vbExclamation
 Application.Goto Range(rng)
 '祭日データの場所
 CreateObject("Wscript.Shell").Run "https://calendar.uic.jp/"
 Exit Sub
End If
''祭日データは、https://calendar.uic.jp/
End Sub

Sub DataClear()
'データの削除
If Range(FPOINT).CurrentRegion.Cells.Count > 5 Then
If MsgBox("表1データ及び表2のデータを消してよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
  Range(FPOINT).Offset(2).Resize(ItemNO, 31).ClearContents '決め打ち
  Range(SPOINT).Resize(2 + ItemNO, 31).ClearContents '決め打ち
 End If
End Sub

'----続く---
イメージは以下のようになります。
「エクセルVBAで1ヶ月のシフト表から日曜」の回答画像13
    • good
    • 0

No11です



>公休日は「日曜」と「年末年始(12月29日~1月3日)」のみです
その程度であれば、関数式の中に入れ込んでもびっくりするほどではないとは思いますが・・・

No11の式のうち、日曜日を除くための判別式の部分を、以下の式に変えればよいです。
NOT((WEEKDAY($E$5:$AI$5)=1)+(TEXT($E$5:$AI$5,"mmdd")<"0104")+(TEXT($E$5:$AI$5,"mmdd")>"1228")>0)

とは言っても2か所ありますので十二分に式が長くなってしまいますね。
一方で、もしも表内に記入される値が、文字列または記号だけと仮定しても良いのなら大分短くすることが可能です。

No11で提示した関数式は
 IF(タイトル部分なら、タイトルを表示,IF(表内参照="","",表内参照))
のような構成になっていて、「表内参照」部分の長い式が繰り返されている状態になっています。

関数式を利用する際に(ご経験があると思いますが)、計算で参照セルを求める場合に、被参照セルの値が空白だと参照結果が「0」になってしまいます。
本来は「セルの参照」だけですませたいところを、空白を0と表示しないがために「IF(セルの参照="","",セルの参照)」のような形式にしなければならず、関数式が長くなる原因の一つとなっています。

ただし、結果の値が上記の仮定のように「0」となることが無いと保証されているなら、素直に「セル参照」だけの式として、0の表示を空白にしてしまうという方法をとることが可能です。
メリットとしては関数式が短くなるので、複雑な式が大量にある場合などに、エクセルの反応が鈍くなったりすことを防止できる。
関数を把握しやすくなるので、修正などの際にわかりやすい。
などがあげられるでしょう。

「0」を空白表示にしてしまう方法はいくつかありますが、代表的なものを以下に挙げておきます。
・オプション設定の詳細設定で「ゼロ値のセルにゼロを表示する」のチェックをはずす
・セルの書式設定で「0;-0;;@」を設定する
後者の方が、指定したいセル範囲を限定して反映可能なので宜しいかと思いますが、このような書式を利用することで、関数式を半分近い長さにすることが可能になります。
    • good
    • 0

No9です。



>セルを削除して詰める作業が関数ではできないと思ったので質問させて頂きました。
セルの削除はさすがに関数ではできませんが、詰めて表示することは可能です。

以下に、関数式と条件付き書式による設定の例を示しておきます。
ご提示の、添付図がはっきりとは読み取れませんので、確認の意味もあり、仮定しているセルの位置関係や内容についてを記しておきます。

※日付が入っているのはE5セルから最大31日分(=一月分:AI列まで)であり、
 値はシリアル値(=エクセルの日付型)で、書式設定で日付のみ表示している。
※6行目(E列から)には「=E6」のような数式があり、書式設定で曜日を表示している。
※番号及び氏名の欄はC7:D16と仮定
※日曜を除く表は、E19セルが日付のスタートとなっていて、元のシートと同じ構成である
※現状では祝日には対応していません。(祝日に関しては後述)

1)C19セルに以下の関数式を入力
=IFERROR(IF(COLUMN()<5,IF(C5="","",C5),IF(INDEX($A5:$AI5,SMALL(IF(WEEKDAY($E$5:$AI$5)>1,COLUMN($E$5:$AI$5)),COLUMN(C5)-4))="","",INDEX($A5:$AI5,SMALL(IF(WEEKDAY($E$5:$AI$5)>1,COLUMN($E$5:$AI$5)),COLUMN(C5)-4)))),"")
入力後、Ctr+Shift+Enterで確定します。(←配列数式なので必須です)
確定すると、数式バー内の関数表示の両端に「{ }」が記されるので確認できます。
(C19セルは、確定後は空白表示になりますが、そのまま作業を続けます)

2)C19セルに条件付き書式を設定します。
「新しいルール」-「数式を使用して~~」を選択し、次の数式を~~の欄に以下の式を設定
=OR(AND(COLUMN()<5,ROW()>20,C19<>""),AND(COLUMN()>4,ROW()<21,C19<>""),AND(C$19<>"",$D19<>""))
書式の設定として、「罫線」-「外枠」を設定します。
(C19セルには罫線も表示されませんが、そのまま続けます)

3)C19セルを選択し、C19:AI30の範囲に右方、下方にフィルコピーします。
 (元データがすでに存在する場合、内容が表示されます)

4)3)までで、19行目、20行目が「###」などの表示になっていると想像しますが、書式を設定します。
 19行目に、日付表示の「d」、20行目に曜日表示の「aaa」を設定。

以上で、一応、ご質問の内容になるのではないかと思いますが、いかがでしょうか?
参考までに、テストしたシートの図を添付しておきますが、図を見てもあまり役には立たないですね(笑)
縮小されてしまいますが、なんとか判別できるのではと思います。
(元の表のほうの罫線は省略していますので悪しからず)

※表全体を3か所に分解して、それぞれに関数式や条件付き書式を設定すれば、もっと簡単な内容にすることができますが、その分だけ手順の説明が複雑になってしまうので、若干無駄が多くはなりますが、全体を長い式にまとめて手順を簡単なものとしました。


◆祝日の扱いについて
祝日を計算だけで行うことも不可能ではありませんが、個別指定の日が変わったり、追加・変更された時の対応が面倒なので、リスト化して対応する方法が一般的かと思います。
(例えば、来年の新年号化に伴う、祝日の追加等が予想されます)
検索すれば祝日の判定方法もすぐに見つかると思います。(リストをLOOKUPする定式が多いようです)
祝日をリスト化しておけば、NETWORKDAYS 関数等を利用することでも祝日の判断は可能になります。(同じ日を指定して、日にちが0なら土日祝日のいずれか)
https://support.office.com/ja-jp/article/network …
この部分を直接1)の関数式に組み込むとかなり複雑になってしまいますので、元の表の曜日の表示などの部分に組み込んでおいて、その結果に基づいて判断するようにした方が複雑にならずに済むものと思います。

上記の1)の式では、シリアル値から直接曜日を求め日曜日かどうかを判定していますが、その部分を修正することで祝日にも対応可能となるでしょう。
対象となる部分は、
 IF(WEEKDAY($E$5:$AI$5)>1 ~~
の部分で、式中に2か所あります。
 WEEKDAY関数はシリアル値から曜日を算出する関数で、日曜日が1となりますので、「>1」とすることで日曜日だけを除いているという意味になります。
https://support.office.com/ja-jp/article/weekday …
「エクセルVBAで1ヶ月のシフト表から日曜」の回答画像11
    • good
    • 0
この回答へのお礼

fujillinさん

ご丁寧な説明、ありがとうございます。
やってみたらできました。
いろいろ調べて「セルの削除(非表示)はマクロでしかできない」と思い込んでいました。

>◆祝日の扱いについて
祝日に関係なく職場の公休日は「日曜」と「年末年始(12月29日~1月3日)」のみです。
それ以外の休みは「規定の1ヶ月の休日数」から「日曜日の数」を引いた残りの「月~土曜の希望日」+「有給」なので、祝日を設定するよりも12月29日~1月3日が非表示になるような関数を教えて頂けるとありがたいです。

お礼日時:2018/08/29 19:34

No.9様のご意見を読みまして、あえてオフトピ(spin out)を許していただけるならですが。

これは、本スレとは直接関係がない内容ですが、次の私の書き込みに至る経緯としてみていただいてもよいです。

何度か、似たような場面に直面して、最終的には、ご質問者さんが、行けると思えるものなのか、どうかによって、マクロが生きるか死ぬかになってしまうものだと思います。

私が書いたものは、実は、きちんと使ってほしいと考えられて作ったものではなく、ご質問者さんが、どこまで分かって使えるか、という技量を試すような内容にできています。

それを、更に細かく作り込むべきかどうか、そういうところは様子見だったのです。
入念に作られたもの=VBA エディタ画面をあけなくて済むような設計になれば、マクロ付きシートであるかどうかは、あまり大きな違いではなくなります。

問題は、最初は何からするか、ということが、正確には回答者側(私)には見えていないのです。私は、おそらく月の更新で、画面を新しくするところだと思ったのですが、そこらで、つまづきが出てしまうと、次のステップが踏めないのです。

元の表の雛形がある→それを新しいワークシートに、貼り付ける
または、元の表に直接書き込む

 月の更新→「前のデータを消す」→新しいデータ入力→休日抜きの2番目の表に転記→印刷か保存 ...[最初に戻る]
という流れを想定していました。

でも、よく考えてみると、掲示板でこういう主張をして、9割の人は、そんなのんびりしたことをしていられるか、ということで、ボツになり、失敗しています。したがって、この後で、ダメ元でこちらが考えているものを修正して、見極めを付けてしまいます。
    • good
    • 0
この回答へのお礼

WindFallerさん

>きちんと使ってほしいと考えられて作ったものではなく、ご質問者さんが、どこまで分かって使えるか、という技量を試すような内容にできています。

私のレベルは「マクロの記録」や簡単なものをちょっと修正できる程度です。

>月の更新→「前のデータを消す」→新しいデータ入力→休日抜きの2番目の表に転記→印刷か保存 ...[最初に戻る]
という流れを想定していました。

「月の更新→「前のデータを消す」→新しいデータ入力→休日抜きの2番目の表に転記」までは想定されていた通りなのですが、日曜日と年末年始を含めない表を作成したかった理由は、この表を元に1日ごとのタイムスケジュール(誰がどの勤務に入っていて、午前と午後にどのような動きをするか)に落とし込むためです。

お礼日時:2018/08/29 15:42

こんにちは



横からですが・・・

どうやら質問者様は仕組みを作成するだけで、実際に利用するのは他の方ということのようですが、VBAではなく関数を設定しておくという方法は選択肢にはないのでしょうか?
月によって実日数の増減はあるでしょうが、罫線は条件付き書式を利用することで可変にすることもできます。

関数利用の場合の長所は、元の表に入力すれば即時に反映される。(VBAを実行する必要がない)
VBAはブラックボックス化しそうなので、何かあるとまずお手上げになる。

欠点は、数式による計算なので、セルの位置関係が限定される。
(位置を変えたりしにくい。まぁ、VBAでも結果的には同様かもですが…)
また、間違って関数式を消したりしないように、関数式の入っているセルには保護をかけて運用するなどといったことが必要かも知れません。
    • good
    • 0
この回答へのお礼

fujillinさん

ご回答、ありがとうございます。

>VBAではなく関数を設定しておくという方法は選択肢にはないのでしょうか?
セルを削除して詰める作業が関数ではできないと思ったので質問させて頂きました。
もちろん私のやりたいことができるのであればVBAではなく関数でもかまいません。

>関数式の入っているセルには保護をかけて運用するなどといったことが必要かも知れません。
他の同僚たち(パソコン初心者)が関数を上書きしてしまうことが何度もあり、「どうにかして欲しい」と頼まれたので他のエクセルファイルには保護をかけ、管理職にしかパスワードを知らせていません。

お礼日時:2018/08/29 15:35

No.6 の回答者です。



>>E5 は、=DATE($B$4,$B$5,1)
> E6 も、数式コピーで =DATE($B$4,$B$5,1) を入れてください。
>E5(日付)とE6(曜日)に同じ数式を入れるのでしょうか?

曜日の行は、書式で出していますから、E6は、同じ数式でもよいし、=E5 として同じものを表示してもよいです。

>ここまでの操作で「SecondMekeList」のみを実行しましたが、まったく同じ表がコピーされただけでした。

選り分けてコピーする機能は、条件付き書式で、色が黒になっているという条件がないといけません。色分けで区別するのが簡単だと思ったからです。条件付き書式の設定は、マクロで行っていますが、手作業で入れていただいても、1度だけで済みます。

>私はこのフォーマットを作成したら他の者に引き継ぐつもりです。
そうなると、もう少し、手を加えたほうがよいかもしれません。

1年後ぐらいに休日・祭日データを更新してもらわないといけないとか、私自身、同じようなシートを使っていますが、あまり細かく説明すると、今は理解しにくいような気がします。ただ、ブック内でシートは月ごとに作っていくとなると、シートコピーをしたほうがよいのかなって思います。
    • good
    • 0
この回答へのお礼

WindFallerさん

できました。

>1年後ぐらいに休日・祭日データを更新してもらわないといけないとか、
確かにそこがひっかかるポイントでした。

でも同じシート内に日曜日と年末年始を非表示にした表を作成してくださり、とても助かりました。
ありがとうございました。

お礼日時:2018/08/29 15:29

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