- ベストアンサー
Excel2016で月ごとの役職を表示させたい
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
VBAを使わないで期待のことを行おうとするのであれば テーブル2は、 従業員番号別年月別役職の一覧とする必要があるものと思います。 少なくとも私には、提示されたレイアウトでは、 VBA無しには実現することができません。 以下、VBAでの解を紹介しますので、 よかったら挑戦してみてください。 Function getYakuName(Jnum As Long, y As Integer, m As Integer) As String Dim RCnt As Long With ThisWorkbook.Sheets(1) RCnt = 3 Do If .Cells(RCnt, 7).Value = "" Then Exit Do If ((.Cells(RCnt, 7).Value = Jnum) And _ (Year((.Cells(RCnt, 9).Value)) <= y) And _ (Month(.Cells(RCnt, 9).Value) <= m) And _ (Year((.Cells(RCnt, 10).Value)) >= y) And _ (Month(.Cells(RCnt, 10).Value) >= m)) Then getYakuName = .Cells(RCnt, 11).Value Exit Do End If RCnt = RCnt + 1 Loop End With End Function
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
どういうロジックでやればよいか考えることが大切で、質問者の仕事だろう。 具体的なデータやニーズは質問者にしかわからないことが多い。 ーー 私の思い付きとして、 例えばシート2を人別+月別に並べておいて 毎月の月の1日を考えて、その人の、その月の1日では役職は何か(注)を割り出し、1月あたり1行に(行を増幅して)別シートに書き出す。そして人別の表になっているが、偉いさん順(社内序列)などにしたければ、役職に偉いさん順にコードをまけって振って、それ順にソートして整理すればよいと思うが。 だだし人別+対象年月数の総なめ法なので泥臭いが。 (注)これは対象年月数だけ(過去5年なら60カ月だけ)スタート年月から1月ずつ増やしてゆき、その当月1日が、着任月日、離任月日と比べれてどこに納まるか割り出せばよいと思うが、難しいものでは無かろう。 なお、やってみると Sub test01() dt = #12/1/2014# For i = 1 To 60 dt = DateSerial(Year(dt), Month(dt) + 1, 1) Cells(i, "A") = dt Next i End Sub で「1月ずつ進めた1日」が60カ月分割り出せる、ようだ。 ーー これはエクセル関数ではむつかしいだろう。したがってVBAを使うことになろう。 ーー 質問のデータ例が少なく、全体に大雑把で、VBAコードを作ってテストしようにも、具体例が作りにくいのと、手間と時間がかかるので、ここに示せない。 質問者は回答者側のそういうことも、考えてほしい。
お礼
ご回答ありがとうございます。 私が考え付かない部分で回答者様に考えていただくのに 必要と思われる最低限の部分を私なりに考え、記載しました。 実際は記載していない部分を役職等を用い集計します。 自分で考えた中で、imogasi様にご提示いただいた方法は 全員の1~12月分を作成するといった大雑把な考えとして、 頭の中にはありました。 ですが、確認者が目視で1つ1つ確認するため、 余分な行は増やせないこと。 また、VBAを使用すると私が辞めた後、説明書を 残しても誰も分からない、といった事情があるため、 VBA以外で何か私の思いつかない方法があれば、 と質問した次第です。 回答者様には、こういったのを使えばできると思う、 といったことを安易ですが、求めていました。 そのため、全部を全部回答いただけるとは思っておりません。
- HohoPapa
- ベストアンサー率65% (455/693)
テーブル2が以下のように相当幸運なら、 添付のような関数で対応できるかもしれません。 ・従業員番号順、開始年月順に並んでいる ・従業員ごとに年月が並んでいる (J列の年月の翌月が、次行のI列に埋まっている) ・社員番号と年月を文字列として連結したときに重複が起きない) L3=G3&TEXT(YEAR(I3),"0000")&TEXT(MONTH(I3),"00") M3=K3 E3=VLOOKUP(A3&C3&TEXT(D3,"00"),$L$3:$M$6,2,1) これらを必要数下方向に複写
お礼
ご回答ありがとうございます。 似たことはやったのですが、 現在使用している役職の終了日がめちゃくちゃ 未来の日付のため、近似値でやると別の従業員の 番号の方が近くなってしまい、おかしなことになりました。 そのため、先のVBAコードを参考にしてみます。
- HohoPapa
- ベストアンサー率65% (455/693)
例えば添付画像のように、月の途中で役職が変化したときに (複数の役職がヒットしたときに) どの行を参照すればいいでしょうか? 毎月1日?、月末尾?、日数の多い行?、年月を満足する先頭の行? いろいろと考えられそうですが、いかがでしょうか? それとも、I列は必ずx年x月1日ですか? また、 VBAで作成するユーザ定義関数を使ってもいいですか? (つまり、VBAは扱えますか?)
お礼
早速のご返答ありがとうございます。 I列に関しては、1日限らないです。 J列は31日になるようです。 そのため、画像では月の途中で役職が異なる場合がありましたが、 それはなさそうです。 VBAを私自身は多少扱えますが、 他の人が全く扱えないため、使わないで済むのなら、 他の方法がよいです。
- emaxemax
- ベストアンサー率35% (44/124)
無理ですね。 なぜなら、テーブル2の期間は何年何月何日と日付指定なのにテーブル1は何年何月だけで、どのデータを持ってくればいいのか判断ができません。
お礼
ご回答ありがとうございます。 その部分でやってみたこととしては、 TEXT関数とDATE関数を使い、「2020/02」などと合わせました。 上記での値(終了月を使用)と従業員番号を結合し、終了月に一致する 月の役職は拾えたのですが、終了月以外の間の部分が拾えないので、 何かないかと伺った次第です。
お礼
ご回答ありがとうございます。 テーブル2がテーブル1のように月ごとになっていてくれたら、 こんな面倒なことにはならなかったので、そんな表しか エクスポートできないシステムを作った人に文句しかないです。 VBAコードを記載いただきありがとうございます。 挑戦してみます。