質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1175閲覧

【VBA】条件分岐の記述を簡素化したい

koburon

総合スコア30

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2023/03/01 02:42

編集2023/03/02 04:55

前提

VBAで今日現在および任意の日の社員名簿を出力するマクロを作っています。
以下の5シートを使用します。

  1. 異動DB
  2. 組織マスター
  3. 社員基本情報
  4. 社員名簿
  5. 今日現在の社員名簿

異動DB
イメージ説明
組織マスター
イメージ説明
社員基本情報
イメージ説明
社員名簿
イメージ説明
今日現在の社員名簿
イメージ説明

以下のURLを参考にしています。
社員名簿を作る~その2~

また、今回は以前に以下のURLで質問し回答いただいた内容の続きです。
過去の質問

該当のソースコード

「異動DB」「組織マスター」「社員基本情報」を参照して、

  • 過去または未来の特定の日付⇒「社員名簿」
  • 今日の日付⇒「今日時点の社員名簿」

に書き込むコードです。

VBA

1Sub meibokosin(d As Date, c As Collection, ByVal out_type As Long) 2 '複数枚のシートを合わせて並び替えた社員名簿を作る 3 'out_type 1:任意の日の社員名簿 4 'out_type 2:今日時点の社員名簿 5 6 Dim kubun As Integer, today_d As Date, str_d As Date, end_d As Date 7 Dim no As Integer, syain_no As Long 8 Dim honbu As String, bu As String, ka As String, kakari As String 9 Dim sosikicode As Long, kakuzuke As String, kakuzuke_code As Long 10 Dim yakusyoku As String, yakusyoku_code As Integer, simei As String, seibetu As String, seinengappi As Long, nyusyabi As Long, _ 11 mailadd As String, gakureki As String, kenpo_no As String, nenkin_no As String, kisonenkin_no As String 12 Dim honbucode As Long, syozoku As String, syozoku_code As Long 13 14 Const AddCol As Long = 128 '追加列数 15 Dim aval(AddCol - 1) As Variant '追加列分格納領域 16 Dim i As Long '添え字 17 18 Dim wS1 As Worksheet 19 Dim wS2 As Worksheet 20 Dim wS3 As Worksheet 21 Dim wS4 As Worksheet 22 23 'ワークシートを変数で宣言する 24 Set wS1 = Worksheets("異動DB") 25 Set wS2 = Worksheets("組織マスター") 26 Set wS3 = Worksheets("社員基本情報") 27 If out_type = 1 Then 28 Set wS4 = Worksheets("社員名簿") 29 End If 30 If out_type = 2 Then 31 Set wS4 = Worksheets("今日時点の社員名簿") 32 End If 33 34 'ワークシートに出力している間の画面更新を停止 35 Application.ScreenUpdating = False 36 wS4.Activate 37 38 '前の結果をクリアする 39 If n > 2 Then 40 wS4.Range(wS4.Cells(3, 1), wS4.Cells(n, 151)).ClearContents 41 wS4.Range(wS4.Cells(3, 1), wS4.Cells(n, 151)).Borders.LineStyle = xlLineStyleNone 42 End If 43 44 '各シートの値を変数にセットする 45 For m = 1 To c.Count 46 R = c(m) 47 48 '「異動DB」 49 With wS1 50 today_d = d 51 kubun = .Cells(R, 1) 52 str_d = .Cells(R, 2) 53 end_d = .Cells(R, 3) 54 no = R 55 syain_no = .Cells(R, 4) 56 simei = .Cells(R, 5) 57 honbu = .Cells(R, 6) 58 bu = .Cells(R, 7) 59 ka = .Cells(R, 8) 60 kakari = .Cells(R, 9) 61 kakuzuke = .Cells(R, 10) 62 yakusyoku = .Cells(R, 11) 63 syozoku = .Cells(R, 12) 64 End With 65 66 '「社員基本情報」 67 Set rcd = wS3.Range("a:a").Find(syain_no, lookat:=xlWhole) 68 If Not rcd Is Nothing Then 69 seibetu = rcd.Offset(0, 2) 70 seinengappi = rcd.Offset(0, 3) 71 nyusyabi = rcd.Offset(0, 4) 72 mailadd = rcd.Offset(0, 5) 73 gakureki = rcd.Offset(0, 6) 74 kenpo_no = rcd.Offset(0, 7) 75 nenkin_no = rcd.Offset(0, 8) 76 kisonenkin_no = rcd.Offset(0, 9) 77 78 For i = 0 To UBound(aval) 79 aval(i) = rcd.Offset(0, 10 + i) 80 Next 81 End If 82 83 '「組織マスター」 84 With wS2 85 Set rcd_honbu = .Range("a:a").Find(honbu, lookat:=xlWhole) 86 Set rcd_bu = .Range("c:c").Find(bu, lookat:=xlWhole) 87 Set rcd_ka = .Range("e:e").Find(ka, lookat:=xlWhole) 88 Set rcd_kakari = .Range("g:g").Find(kakari, lookat:=xlWhole) 89 90 Set rcd_kakuzuke = .Range("k:k").Find(kakuzuke, lookat:=xlWhole) 91 kakuzuke_code = rcd_kakuzuke.Offset(0, 1) 92 93 Set rcd_yakusyoku = .Range("m:m").Find(yakusyoku, lookat:=xlWhole) 94 yakusyoku_code = rcd_yakusyoku.Offset(0, 1) 95 96 Set rcd_syozoku = .Range("i:i").Find(syozoku, lookat:=xlWhole) 97 syozoku_code = rcd_syozoku.Offset(0, 1) 98 End With 99 100 101 Dim arr() As Variant 102 Dim flag As Boolean 103 flag = False 104 If out_type = 1 Then 105 '退職(区分:3)を除く任意の日の各社員データを書き込む 106 If (kubun <> 3 And str_d <= today_d And today_d <= end_d) Or _ 107 (str_d <= today_d And end_d = 0) Or _ 108 (kubun <> 3 And str_d > today_d And end_d = 0) Then 109 flag = True 110 End If 111 End If 112 If out_type = 2 Then 113 '今日現在の各社員データを書き込む 114 If (kubun <> 3 And str_d <= today_d And today_d <= end_d) Or _ 115 (str_d <= today_d And end_d = 0) Then 116 flag = True 117 End If 118 End If 119 If flag = True Then 120 ReDim Preserve arr(151, p) 121 arr(0, p) = no 122 arr(1, p) = syain_no 123 arr(2, p) = honbu 124 arr(3, p) = bu 125 arr(4, p) = ka 126 arr(5, p) = kakari 127 arr(6, p) = sosikicode 128 arr(7, p) = kakuzuke 129 arr(8, p) = kakuzuke_code 130 arr(9, p) = yakusyoku 131 arr(10, p) = yakusyoku_code 132 arr(11, p) = simei 133 arr(12, p) = seibetu 134 arr(13, p) = seinengappi 135 arr(14, p) = nyusyabi 136 arr(15, p) = mailadd 137 arr(16, p) = gakureki 138 arr(17, p) = kenpo_no 139 arr(18, p) = nenkin_no 140 arr(19, p) = kisonenkin_no 141 arr(20, p) = honbucode 142 arr(21, p) = syozoku 143 arr(22, p) = syozoku_code 144 For i = 0 To UBound(aval) 145 arr(23 + i, p) = aval(i) 146 Next 147 148 p = p + 1 149 End If 150 Next m 151 152 With wS4.Range("a3").Resize(p, 151) 153 .Value = Application.WorksheetFunction.Transpose(arr) 154 End With 155 156 Application.ScreenUpdating = True 157End Sub

発生している問題

上記のコードで希望通り、任意の日の社員名簿が出力できました。
マクロをレビューした際、「条件を増やしました」と説明した際、実際のコードは見せておらず、説明不足だったためか、レビュー担当者から、
「条件を増やし過ぎていないか?」「条件を1~2文まで減らせば済むのでは?」と指摘を受けました。

実現したいこと

任意の日を出力する(out_type = 1)条件は以下の通りですが、これをなるべく簡潔にしたいです。

  • 区分≠3 かつ 開始日<=今日 かつ 今日<=終了日
  • 開始日<=今日 かつ 終了日<=0
  • 区分≠3 かつ 開始日>今日 かつ 終了日<=0

試したこと

104~111行目の out_type = 1 の条件分岐で、以下のように「退職(区分:3)を除く」のみとして書きかえて実行しました。

If out_type = 1 Then '退職(区分:3)を除く任意の日の各社員データを書き込む If (kubun <> 3) Then flag = True End If End If

実行後の社員名簿を見ると一見問題なさそうですが、
この場合だと、未来の日に退職する社員が表示されないような気がします。
やはり元のコードで理解して貰うまできちんと説明すべきでしょうか。
コードというよりも論理的な質問ですが、どのように説明すれば通用するかアドバイスいただければと思います。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PC:Windows11
Excelのバージョン:Microsoft365 Excel

コメントを受けて追記

異動DBのサンプルです。
※区分は0:初期状態、1:新規入社、2:異動、3:退職です。
※サンプルでは、2022/12/31にEさんが退職、2023/4/1にCさんが異動、Fさんが新規入社した場合です。

区分開始日終了日社員番号氏名支社本部M役職所属
02022/12/11A本社管理本部総務部--部長本社管理本部総務部
02022/12/12B本社管理本部総務部総務課-課長本社管理本部総務部総務課
02022/12/12023/3/313C本社管理本部総務部総務課-一般本社管理本部総務部総務課
02022/12/14D本社管理本部総務部人事課-課長本社管理本部総務部人事課
02022/12/12022/12/315E本社管理本部総務部人事課-一般本社管理本部総務部人事課
32023/1/15E本社管理本部総務部人事課-一般本社管理本部総務部人事課
22023/4/13C本社管理本部総務部人事課-一般本社管理本部総務部人事課
12023/4/16F本社管理本部総務部人事課-派遣本社管理本部総務部人事課

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2023/03/01 03:01

データのサンプルを追記された方が良いかと思います。
logres_Fan

2023/03/01 05:51

レビュー担当者との対話が全く噛み合っていないように見えてしまいました。 >実際のコードは見せていません。 レビュー担当者に見せたものは何でしょうか?マクロ? > 条件を増やしました」と説明したところ 元の条件は?増やした条件は?
koburon

2023/03/01 07:18

logres_Fan様 >レビュー担当者に見せたものは何でしょうか?マクロ? 見せたものはマクロで、操作の流れを示したのみです。 >元の条件は?増やした条件は? 元の条件は以下の通りです。 If (kubun <> 3 And str_d <= today_d And today_d <= end_d) Or_  (str_d <= today_d And end_d = 0) Then 今日時点の社員名簿を書くのみで、未来の日付の場合が出力できない問題を指摘されたため、 任意の日の社員名簿を書くために分岐させ条件を増やしました。
koburon

2023/03/01 07:56

sazi様 >データのサンプルを追記された方が良いかと思います。 データサンプルとシートの画像を追加しました。
logres_Fan

2023/03/01 08:21

曖昧な推測なのですが、もしかして、次のような指摘だったのかしら。 today_dに今日時点の日付しか代入出来ないように見えるので、検索_dみたいな名前に変えて今日以外の日付も代入可能にしておくと、例えば、未来日付の出力もできそう。どうかしら?
koburon

2023/03/01 09:01

logres_Fan様 そうです。確かそのような感じの指摘でした。 そうなると、today_dとは別の変数を用意して書き直す必要がありますね。
tatsu99

2023/03/01 10:16 編集

>today_dとは別の変数を用意して書き直す必要がありますね。 today_dはパラメータのdを設定してるので、今日の日付ではなく、指定された日付になりますよね。 従って、検索_dとか指定_dとかに名称を変えれば良いかと。 「today_dとは別の変数を用意するのでなく、today_dとは別の変数名に書き換える」のが正しいかと。 今日時点の社員名簿を作成する場合は、dに今日の日付を設定してmeibokosinを呼び出しているわけですよね。
tatsu99

2023/03/01 10:36 編集

正しい出力条件は、 (区分≠3 かつ 開始日<=指定日 かつ 指定日<=終了日) 又は (開始日<=指定日 かつ 終了日<=0) 又は (区分≠3 かつ 開始日>指定日 かつ 終了日<=0) ではなく (区分≠3 かつ 開始日<=指定日 かつ 指定日<=終了日) 又は (区分≠3 かつ 開始日<=指定日 かつ 終了日 =0) 又は (区分=3 かつ 開始日>指定日) かと思いますがいかがでしょうか。(今日は指定日に置き換えてます)
tatsu99

2023/03/01 10:41

「今日時点の社員名簿を作成する場合は、dに今日の日付を設定してmeibokosinを呼び出している」 この前提で間違いないなら、 過去または未来の特定の日付⇒「社員名簿」 今日の日付⇒「今日時点の社員名簿」 上記の考え方で、今日の日付を与えて、「社員名簿」を呼び出せば、結果として、「今日時点の社員名簿」が作られるばずなので、作る名簿毎に、条件判断をする必要はないかと思います。 同じ条件判断文を使用できます。
tatsu99

2023/03/01 10:50

本筋とは関係ないですが '前の結果をクリアする If n > 2 Then wS4.Range(wS4.Cells(3, 1), wS4.Cells(n, 151)).ClearContents wS4.Range(wS4.Cells(3, 1), wS4.Cells(n, 151)).Borders.LineStyle = xlLineStyleNone End If の箇所のnは、共有変数としてどこかにあるのでしょうか。 又、nの値をこの関数内では更新していませんが、どこかで更新しているのでしょうか?
tatsu99

2023/03/01 11:16

出力条件ですが、誤りがありました。訂正します。 (区分=0 かつ 開始日<=指定日 かつ 指定日<=終了日) 又は (区分=0 かつ 開始日<=指定日 かつ 終了日=0) 又は (区分=1 かつ 開始日<=指定日) 又は (区分=2 かつ 開始日>指定日) 又は (区分=3 かつ 開始日>指定日) (区分が1,2,3の場合、終了日は指定されない前提です。(終了日は空白になっている))
tatsu99

2023/03/01 22:57

出力条件ですが、異動及び退職について勘違いしていました。 前回の投稿を取り消します。失礼しました。
koburon

2023/03/02 00:26 編集

tatsu様 多数の詳細なコメントありがとうございます。 >今日時点の社員名簿を作成する場合は、dに今日の日付を設定してmeibokosinを呼び出しているわけですよね。 はい、その前提で間違いありません。 >の箇所のnは、共有変数としてどこかにあるのでしょうか。 >nの値をこの関数内では更新していませんが、どこかで更新しているのでしょうか? nは最終行を取得するために設定した変数で、別のモジュールでnを宣言しているのですが、確認したところ、別のシートwS3の最終行を取得する機能しか果たしていませんでした。そのため、wS4に対してnを宣言するように以下の文を追記しました。 n = wS4.Cells(Rows.Count, 1).End(xlUp).Row
koburon

2023/03/02 00:53

>正しい出力条件は、 out_type=1の条件を以下のように変えましたがこれでよろしいでしょうか。 If out_type = 1 Then '任意の日の各社員データを書き込む If (kubun <> 3 And str_d <= today_d And today_d <= end_d) Or _ (kubun <> 3 And str_d <= today_d And end_d = 0) Or _ (kubun = 3 And str_d >= today_d) Then flag = True End If End If
tatsu99

2023/03/02 03:57 編集

ながくなるので、後で回答欄に書きたいと思います。 又、どのような運用をするか(人事異動があったとき、DBの内容がどのように変わるのか)によって、 出力条件も変わってきますので、その運用のの前提も含めて、回答欄に書きます。 変数:today_d については、レビュー担当者にみせるなら、この変数名はやめて、 指定日:spc_d(specified day)等の方が良いかと思います。(もしくは検索日:find_d等) today_dとすると今日の日付のみが検索対象となっているとレビュー担当者が誤解します。 spc_d(又はfind_d)にしておけば、指定日であることが明確であり、今日の日付で検索したい場合は、 spc_dに今日の日付を設定して、meibokosinを呼び出していますと説明することができます。
guest

回答1

0

ベストアンサー

異動DBの区分の遷移についての確認です。

1.新規入社 2023/4/1 の場合
①区分=1 開始日=2023/4/1 終了日=空白 支社=本社
このレコードが、作成された後
2023/4/1より後に異動などがあった場合、どうなるのでしょうか。

2023/10/1に支社Aに異動になったとすると
②区分=2 開始日=2023/10/1 終了日=空白 支社=支社A
となり、このレコードが出現します。

指定日が2023/9/30の場合、①のレコードを読み込んだ時、出力対象となります。
判定条件は 開始日≦指定日 かつ 終了日=0 が成立する為

指定日が2020/10/1の場合、①のレコードを読み込んだ時、出力対象外とすべきですが、
判定条件は 開始日≦指定日 かつ 終了日=0 が成立する為、①のレコードを出力してしまいます。

運用上は、②のレコードを作成するときに、①のレコード以下のように更新する必要があります。
方法1(終了日をのみを更新する)
① 区分=1(新規入社) 開始日=2023/4/1 終了日=2023/9/30 支社=本社
方法2(区分及び終了日を更新する)
① 区分=0(初期値) 開始日=2023/4/1 終了日=2023/9/30 支社=本社
上記のような運用がなされていると考えて良いでしょうか。

上記のような運用がなされていれば
区分=1(新規入社),2(異動の)のレコードの場合、
(開始日≦指定日 かつ 指定日≦指定日)又は
(開始日≦指定日 かつ 終了日=0)の場合、出力対象とする 
で良いことになります。
上記の運用が担保されない場合は、正しく判定できなくなります。

2.退職 2024/4/1 の場合
③区分=3 開始日=2024/4/1 終了日=空白
このレコードが作成された時、この人の区分=3のレコードのみが存在することはあり得ません。
必ず、区分=0,1,2の何れかのレコードがあり、
入社日が2020/4/1 なら
④区分=1 開始日=2020/4/1 終了日=2024/3/31 のようなレコードが存在するはずです。
(区分=0、2でも良い)

上記のような運用がなされていれば、
未来の日に退職するケースは、区分=3のレコードの判定で出力するのではなく、
上記の④のレコードで判定するので、出力対象となります。
もし、上記の④のレコードが存在することが担保されない場合は、正しく判定できなくなります。

3.上記の1,2の運用が担保される前提で、全ての区分を考慮した判定は、以下のようになります。
(区分≒3 かつ 開始日≦指定日 かつ 指定日≦終了日) 又は
(区分≒3 かつ 開始日≦指定日 かつ 終了日=0)
の場合、出力対象となる。

あなたが提示された
If (kubun <> 3 And str_d <= today_d And today_d <= end_d) Or _・・・・⑤
(kubun <> 3 And str_d <= today_d And end_d = 0) Or _・・・・・・・・・⑥
(kubun = 3 And str_d >= today_d) ・・・・⑦ Then
ですが、⑦は不要と考えます。
⑦は、区分が退職の場合、ですが、以下のレコードとします。2024/4/1退職予定
⑧区分=3 開始日=2024/4/1 終了日=空白  
これを採用すると、指定日が2024/4/1より前なら、出力対象なります。
指定日が2024/3/31 なら出力されます。(問題なし)
指定日が1900/1/1 なら出力されます。(入社していないので問題あり、入社日は2000/4/1とする)
従って、入社日より前の日付でも出力される問題が発生します。
これを防ぐには、
⑨区分=0 開始日=2000/4/1(入社日) 終了日=2024/3/31
のレコードが存在することが担保されていることです。
これが担保されていれば、⑦の判定は不要です。
(指定日が2000/4/1~2024/3/31の範囲は⑧のレコードで出力される為)

投稿2023/03/02 02:20

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2023/03/02 02:43

担保されるべき要件をまとめると、以下のようになります。 1.区分=0,1,2の何れかで、終了日が空白のレコードについては、 開始日よりあとに人事異動が発生した場合、終了日が必ず、設定されていること。 (人事異動とは区分=2又は3のレコードが発生すること) 例 2000/4/1入社の社員が2024/5/1に人事異動になった場合 ①区分=0 開始日=2000/4/1 終了日=空白 のレコードは、 ①区分=0 開始日=2000/4/1 終了日=2024/4/30 となり ②区分=2 開始日=2024/5/1 終了日=空白 のレコードが作成させること。 2.区分=3のレコードのみが存在することはない。 区分=3のレコードが存在する場合は、必ず、区分=0,1,2の何れかのレコードが存在し、 終了日が設定されていること。 例 2004/1入社の社員が2024/10/1に退職になった場合、 ③区分=3 開始日=2024/10/1 終了日=空白のほかに ④区分=0 開始日=2004/4/1 終了日=2024/9/30 のレコードが存在すること。 上記の要件が担保されているかどうかは、あなたがDBを確認して調査するか、 DBの管理者(又はレビュー者)に、問い合わせる必要があるかと思います。
koburon

2023/03/02 04:40 編集

回答ありがとうございます。 要件につきまして、異動情報の変更テストを何件か実施し、異動DB(wS3)を確認した結果は以下の通りです。 >1.区分=0,1,2の何れかで、終了日が空白のレコード 例えば上のサンプルで、2023/4/1入社のFさんが2024/5/1に大阪支店に異動する場合 ①区分=0 開始日=2023/4/1 終了日=空白 ⇒①区分=0 開始日=2023/4/1 終了日=2024/4/30 に更新され、 ②区分=2 開始日=2024/5/1 終了日=空白 が作成されました。 >2.区分=3のレコード 例えば上のサンプルで、2022/12/1入社のAさんが2024/10/1に退職する場合 ③区分=3 開始日=2024/10/1  終了日=空白 が作成され、 ④区分=0 開始日=2022/12/1  終了日=空白 ⇒④区分=0 開始日=2022/12/1  終了日=2024/9/30 に変更されました。 以上から、担保されるべき要件は満たしていると判断されます。 そうなると次は日付の指定ですが、これはinputboxのコードを追記して、任意の日付を入力させるようにする必要があると思いますが、これはout_type = 1の条件を指定したあと、つまり110行目のEnd Ifの直後にinputboxを入れれば良いということでしょうか。
tatsu99

2023/03/02 06:06

>そうなると次は日付の指定ですが、これはinputboxのコードを追記して、任意の日付を入力させるようにする必要があると思いますが、 >これはout_type = 1の条件を指定したあと、つまり110行目のEnd Ifの直後にinputboxを入れれば良いということでしょうか。 いいえ、呼び出し側で、inputoboxで日付を入力し、入力した日付で、meibokosinを呼び出すのです。 呼び出し側は、現状どうなってますか?
tatsu99

2023/03/02 06:14

呼び出し側のマクロで、社員名簿と今日時点の社員名簿を一度に作成する前提です。 呼び出し側のマクロのおおまかな流れは以下のようになります。 sub 呼び出し側() 指定日付をinputboxから取得する。 call meibokosin(指定日付,○,1) ・・・・out_type=1(任意の日の社員名簿) 今日の日付を取得し、指定日付に設定する。 call meibokosin(指定日付,○,2) ・・・・out_type=2(今日時点の社員名簿) ○はc as Collection相当
tatsu99

2023/03/02 06:18

meibokosinの中で、out_type毎に出力時の判定文を分けて書いてますが、 分けて書く必要はありません。out_typeが1でも2でも出力条件は同じものを使えます。 out_type=2の場合は、指定日に本日の日付が設定されているだけです。
tatsu99

2023/03/02 06:29

余裕があれば、以下のケースの時、DBの内容が期待した結果になるか確認しておいた方が良いかと思います。 (区分=0のレコードの終了日が空白から人事移動日の前日に代わるのは確認済みですが、 区分=1,2のレコードでも変わることの確認が必要かと) 1.2023/4/1 入社 支社=支社A 区分=1 開始日=2023/4/1 終了日=空白 2.2023/5/1 異動 支社=支社B 区分=1 開始日=2023/4/1 終了日=2023/4/30 区分=2 開始日=2023/5/1 終了日=空白 3.2023/6/1 異動 支社=支社C 区分=2 開始日=2023/5/1 終了日=2023/5/31 区分=2 開始日=2023/6/1 終了日=空白 4.2023/12/1 退職  区分=2 開始日=2023/6/1 終了日=2023/11/30 区分=3 開始日=2023/12/1 終了日=空白
koburon

2023/03/02 08:25 編集

>呼び出し側は、現状どうなってますか? ボタンを別シートに作成し、以下のコードを追記しています。 Sub ninimeibokosin() '任意の日の社員名簿を出力する Application.ScreenUpdating = False Dim d As Date '任意の日付を入力する d = InputBox("基準日を入力(※半角数字で入力してください。例:1990/1/1)") Call meibokosin(d, c, 1) '今日の日付の社員名簿を出力する d = Date Call meibokosin(d, c, 2) Application.ScreenUpdating = True End Sub 実行しようとすると、「コンパイルエラー:ByRef引数の型が一致しません。」が発生しました。 変数の設定が間違っているのでしょうか。
koburon

2023/03/02 09:14

ありがとうございます。 これまでの質問・回答にきちんと書かれていましたね。以下のように修正しました。 Sub ninimeibokosin() '任意の日の社員名簿を出力する Application.ScreenUpdating = False Dim d As Date Dim dval As String Dim flag1 As Boolean Dim strDateFormat As String Dim c As Collection Set c = New Collection For i = 2 To Worksheets("異動DB").Cells(Rows.Count, 1).End(xlUp).Row c.add i Next i '任意の日付を入力する Do While flag1 = False dval = InputBox("基準日を入力してください(記入例:1900/1/1)") If StrPtr(dval) = 0 Then 'キャンセル又は右上の×をクリックした場合 Exit Sub ElseIf dval = "" Then 'なにも入力しないでOKをクリックした場合 MsgBox ("何も入力されていません") ElseIf MyCheckDate(dval) <> 0 Then '入力日付が正しくない場合 MsgBox ("入力し直してください") Else '入力日付が正しい場合 '(必要があれば入力日付のチェックを行い、エラーなら再入力する) d = CDate(dval) flag1 = True End If Loop Call meibokosin(d, c, 1) '今日の日付の社員名簿を出力する d = Date Call meibokosin(d, c, 2) Application.ScreenUpdating = True End Sub 試しに過去と未来それぞれの日付でテストしたところ、 過去の日付ではまだ在籍していた社員が登場し、未来の日付では、今後入社する社員が載っていました。 また、今日時点の社員名簿は変更されることなく出力されていました。 次は提示いただいたケースでDBのレコードがどう変化するか確認したいと思います。
tatsu99

2023/03/02 09:19

>試しに過去と未来それぞれの日付でテストしたところ、 >過去の日付ではまだ在籍していた社員が登場し、未来の日付では、今後入社する社員が載っていました。 >また、今日時点の社員名簿は変更されることなく出力されていました。 今のところは、順調ということですね。了解しました。
koburon

2023/03/02 11:09

>余裕があれば、~確認しておいた方が良いかと思います。 ご提示いただいた4ケースで実行しました。 1.2023/4/1 入社 支社=支社A 区分=1 開始日=2023/4/1 終了日=空白 2.2023/5/1 異動 支社=支社B 区分=1 開始日=2023/4/1 終了日=2023/4/30 区分=2 開始日=2023/5/1 終了日=空白 3.2023/6/1 異動 支社=支社C 区分=2 開始日=2023/5/1 終了日=2023/5/31 区分=2 開始日=2023/6/1 終了日=空白 4.2023/12/1 退職  区分=2 開始日=2023/6/1 終了日=2023/11/30 区分=3 開始日=2023/12/1 終了日=空白 上記の通り表記されていました。 確認するたびにボタンを押してその日ごとに社員名簿を更新する手間はかかるので、そういう意味で解消方法は無いかコメントされるかもしれないです。 ともあれ、問題は解決されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問