![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
No.3ベストアンサー
- 回答日時:
まだ、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](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/1/1138040_5b810dc604c7d/M.jpg)
WindFallerさん
ご回答ありがとうございます。
>名前の登録で、「HOLIDAY」と付けてください。そして、呼び出せるようにしてください。
名前の登録はしましたが、呼び出せるようにとは具体的にどのような操作をするのでしょうか?
>最初の「表の更新」は不要かもしれませんが、これがないと、2番めの表に転機は難しいかもしれません。
>なお、行末に「*」がついているところは、位置を特定する部分ですから、位置が変わったら変更しなくてはなりません。
すみません、この文章が理解できませんでした。
マクロを実行してみましたが、「DateLists」はデータが全て消えてしまいます。
データを元に戻して「SecondMekeList」を実行するとうまくできたのですが、E5:AI6セルの関数が消えてしまい、
B4・B5セルに年・月を入力しても日付と曜日が変わらなくなってしまいました。
できればE5:AI6セルの関数は上書きせずに残しておきたいです。
WindFallerさんのやり方で進めていきたいのですが、また教えて頂ければと思います。
よろしくお願いいたします。
No.16
- 回答日時:
シフト表2018.xlsm
No.13/14 を格納したエクセルファイルをFireStrageにアップロードしておきました。
ダウンロードパスワード このURLの/qa/-----.html
----の数字 106****(8桁)
http://xfs.jp/Xo2Mb (短縮URL)
アップロード期限は一応1ヶ月ぐらいです。(ミスや修正がありましたら、このファイルは削除してしまいます。)ダウンロードは、少し紛らわしいのですが、ダウンロードURLをクリックしてください。
ダウンロード後は、ファイルを選択し、右クリック・プロパティで、「アクセスブロック」を
□許可する
にしてください。
なお、マクロ不可のプロテクトや再計算を手動に設定されるなどの保護機能が働くこともありますので、随時、外してください。
このファイルは、Excel2010 と、Excel 2013で検査されています。
WindFaller様
お礼が遅くなり大変申し訳ありませんでした。
体調を崩し入院していたため、PCを操作することができませんでした。
こちらで質問して教えていただいた内容については今後活用していけるよう
もっと勉強したいと思っています。
本当にありがとうございました。
No.15
- 回答日時:
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
で、充分でした。
大変失礼いたしました。
(大差はないけれど、こちらの方がほんの少しだけ単純になっていますので…)
暑さで、頭が疲れてる~~‼
fujillin様
お礼が遅くなり大変申し訳ありませんでした。
体調を崩し入院していたため、PCを操作することができませんでした。
こちらで質問して教えていただいた内容については今後活用していけるよう
もっと勉強したいと思っています。
本当にありがとうございました。
No.14
- 回答日時:
環境整備用
これは、基本的には使わなくてもよいものです。
条件付き書式や数式などをマクロで書いてあげるものです。
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
Windfaller様
お礼が遅くなり大変申し訳ありませんでした。
体調を崩し入院していたため、PCを操作することができませんでした。
こちらで質問して教えていただいた内容については今後活用していけるよう
もっと勉強したいと思っています。
本当にありがとうございました。
No.13
- 回答日時:
こんにちは。
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](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/c/1138040_5b876cb841382/M.jpg)
No.12
- 回答日時:
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;;@」を設定する
後者の方が、指定したいセル範囲を限定して反映可能なので宜しいかと思いますが、このような書式を利用することで、関数式を半分近い長さにすることが可能になります。
No.11
- 回答日時:
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](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/9/587726_5b865bc86ed0a/M.jpg)
fujillinさん
ご丁寧な説明、ありがとうございます。
やってみたらできました。
いろいろ調べて「セルの削除(非表示)はマクロでしかできない」と思い込んでいました。
>◆祝日の扱いについて
祝日に関係なく職場の公休日は「日曜」と「年末年始(12月29日~1月3日)」のみです。
それ以外の休みは「規定の1ヶ月の休日数」から「日曜日の数」を引いた残りの「月~土曜の希望日」+「有給」なので、祝日を設定するよりも12月29日~1月3日が非表示になるような関数を教えて頂けるとありがたいです。
No.10
- 回答日時:
No.9様のご意見を読みまして、あえてオフトピ(spin out)を許していただけるならですが。
これは、本スレとは直接関係がない内容ですが、次の私の書き込みに至る経緯としてみていただいてもよいです。何度か、似たような場面に直面して、最終的には、ご質問者さんが、行けると思えるものなのか、どうかによって、マクロが生きるか死ぬかになってしまうものだと思います。
私が書いたものは、実は、きちんと使ってほしいと考えられて作ったものではなく、ご質問者さんが、どこまで分かって使えるか、という技量を試すような内容にできています。
それを、更に細かく作り込むべきかどうか、そういうところは様子見だったのです。
入念に作られたもの=VBA エディタ画面をあけなくて済むような設計になれば、マクロ付きシートであるかどうかは、あまり大きな違いではなくなります。
問題は、最初は何からするか、ということが、正確には回答者側(私)には見えていないのです。私は、おそらく月の更新で、画面を新しくするところだと思ったのですが、そこらで、つまづきが出てしまうと、次のステップが踏めないのです。
元の表の雛形がある→それを新しいワークシートに、貼り付ける
または、元の表に直接書き込む
月の更新→「前のデータを消す」→新しいデータ入力→休日抜きの2番目の表に転記→印刷か保存 ...[最初に戻る]
という流れを想定していました。
でも、よく考えてみると、掲示板でこういう主張をして、9割の人は、そんなのんびりしたことをしていられるか、ということで、ボツになり、失敗しています。したがって、この後で、ダメ元でこちらが考えているものを修正して、見極めを付けてしまいます。
WindFallerさん
>きちんと使ってほしいと考えられて作ったものではなく、ご質問者さんが、どこまで分かって使えるか、という技量を試すような内容にできています。
私のレベルは「マクロの記録」や簡単なものをちょっと修正できる程度です。
>月の更新→「前のデータを消す」→新しいデータ入力→休日抜きの2番目の表に転記→印刷か保存 ...[最初に戻る]
という流れを想定していました。
「月の更新→「前のデータを消す」→新しいデータ入力→休日抜きの2番目の表に転記」までは想定されていた通りなのですが、日曜日と年末年始を含めない表を作成したかった理由は、この表を元に1日ごとのタイムスケジュール(誰がどの勤務に入っていて、午前と午後にどのような動きをするか)に落とし込むためです。
No.9
- 回答日時:
こんにちは
横からですが・・・
どうやら質問者様は仕組みを作成するだけで、実際に利用するのは他の方ということのようですが、VBAではなく関数を設定しておくという方法は選択肢にはないのでしょうか?
月によって実日数の増減はあるでしょうが、罫線は条件付き書式を利用することで可変にすることもできます。
関数利用の場合の長所は、元の表に入力すれば即時に反映される。(VBAを実行する必要がない)
VBAはブラックボックス化しそうなので、何かあるとまずお手上げになる。
欠点は、数式による計算なので、セルの位置関係が限定される。
(位置を変えたりしにくい。まぁ、VBAでも結果的には同様かもですが…)
また、間違って関数式を消したりしないように、関数式の入っているセルには保護をかけて運用するなどといったことが必要かも知れません。
fujillinさん
ご回答、ありがとうございます。
>VBAではなく関数を設定しておくという方法は選択肢にはないのでしょうか?
セルを削除して詰める作業が関数ではできないと思ったので質問させて頂きました。
もちろん私のやりたいことができるのであればVBAではなく関数でもかまいません。
>関数式の入っているセルには保護をかけて運用するなどといったことが必要かも知れません。
他の同僚たち(パソコン初心者)が関数を上書きしてしまうことが何度もあり、「どうにかして欲しい」と頼まれたので他のエクセルファイルには保護をかけ、管理職にしかパスワードを知らせていません。
No.8
- 回答日時:
No.6 の回答者です。
>>E5 は、=DATE($B$4,$B$5,1)
> E6 も、数式コピーで =DATE($B$4,$B$5,1) を入れてください。
>E5(日付)とE6(曜日)に同じ数式を入れるのでしょうか?
曜日の行は、書式で出していますから、E6は、同じ数式でもよいし、=E5 として同じものを表示してもよいです。
>ここまでの操作で「SecondMekeList」のみを実行しましたが、まったく同じ表がコピーされただけでした。
選り分けてコピーする機能は、条件付き書式で、色が黒になっているという条件がないといけません。色分けで区別するのが簡単だと思ったからです。条件付き書式の設定は、マクロで行っていますが、手作業で入れていただいても、1度だけで済みます。
>私はこのフォーマットを作成したら他の者に引き継ぐつもりです。
そうなると、もう少し、手を加えたほうがよいかもしれません。
1年後ぐらいに休日・祭日データを更新してもらわないといけないとか、私自身、同じようなシートを使っていますが、あまり細かく説明すると、今は理解しにくいような気がします。ただ、ブック内でシートは月ごとに作っていくとなると、シートコピーをしたほうがよいのかなって思います。
WindFallerさん
できました。
>1年後ぐらいに休日・祭日データを更新してもらわないといけないとか、
確かにそこがひっかかるポイントでした。
でも同じシート内に日曜日と年末年始を非表示にした表を作成してくださり、とても助かりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの2項目比較および...
-
【マクロ】ファイル名の一括変...
-
Excelでの表の作り方
-
【マクロ】フォルダ内にあるPDF...
-
Excelの複数条件の関数
-
Excelの条件付き書式について
-
Excelの警告について
-
【マクロ】functionプロシージ...
-
EXCELの散布図で日付が1900年に...
-
エクセルの数式バーのフォント...
-
エクセルでファイルの最終更新...
-
【Excel】版が同じ事を示す番号...
-
googleのスプレッドシート
-
エクセルの問題です。絶対値の...
-
Excelの数式について教えてくだ...
-
Excelで数値を時間数に変換する...
-
エクセルまたはGoogleスプレッ...
-
GoogleスプレッドシートでA1に...
-
2列に入っているデータを1列...
-
【マクロ】 IFERROR関数をマク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
Excelで数値を時間数に変換する...
-
エクセルの数式バーのフォント...
-
エクセルで数字の組み合わせを...
-
エクセルを使用して、円周率を...
-
Excelで特定の文字列が含まれて...
-
Excel 対象のセルに入力が無い...
-
任意の値が存在する行に名前を...
-
エクセルでファイルの最終更新...
-
index関数の説明をお願いします。
-
条件付き書式でやりたいのですが
-
重複しない値を取り出したい
-
【ExcelVBA】UTF-8(BOM無)でC...
-
【マクロ】マクロが割当てされ...
-
エクセル IF計算式?でしょうか?
-
エクセルで曜日を入れたい
-
表中の指定した条件の文字列を...
-
【Excel】版が同じ事を示す番号...
-
EXCELの散布図で日付が1900年に...
-
Excelについて。Excelに縦1列に...
おすすめ情報