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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

4回答

9193閲覧

初めてのVBAで勤務表作成

YSzk

総合スコア8

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

1グッド

0クリップ

投稿2015/12/17 05:14

編集2022/01/12 10:55

イメージ説明

この図をご覧になっていただき、再度質問に対する回答をお願いします。

・ドロップダウンで出勤・休暇種の中から有休や各種特別な休暇(申請書の提出が必要)を選択するようにし、選んだ種目と未提出or提出済みが入力されるという処理を行いたい(自動で、連動して)。

・そして、すべて記入を終え提出ファイル作成ボタンを押したときに、提出し忘れた申請書はないか、メッセージを表示するようにしたい。
(予め用意されているVBAについては下記のとおりです。自分のイメージでは、この構文に加筆して追加するイメージです。しかし、目的を達成するために良い方法(難しくない、簡単、シンプル)があれば、そちらも教えていただければと思います。)

最低限、これらの方法を達成する方法とそれに必要な関数など御教授いただければと思います。

Sub 提出用ファイル作成()
If Range("D2") = Range("A41") + Range("F41") + Range("U33") And Range("A36") - Range("A37") = Range("C36") Then
MsgBox "提出用のファイルを作成します。"
Else
MsgBox "誤りがあります。"
Exit Sub
End If
Dim ReturnBook As String, TargetBook As String
Dim ReturnSheet As String, TargetSheet As String

ReturnBook = ActiveWorkbook.name ReturnSheet = ActiveSheet.name 'Call 新しいブックを開く Workbooks.Add TargetBook = ActiveWorkbook.name TargetSheet = ActiveSheet.name Workbooks(ReturnBook).Worksheets(ReturnSheet).Range("A1:AB41").Copy Workbooks(TargetBook).Worksheets(TargetSheet).Range("A1").PasteSpecial Paste:=xlPasteValues Workbooks(TargetBook).Worksheets(TargetSheet).Range("A1").PasteSpecial Paste:=xlPasteFormats Application.DisplayAlerts = False Workbooks(ReturnBook).Worksheets(ReturnSheet).Rows("41").Copy Workbooks(TargetBook).Worksheets(TargetSheet).Rows("41").PasteSpecial Paste:=xlPasteFormulas Workbooks(ReturnBook).Worksheets(ReturnSheet).Range("O2").Copy Workbooks(TargetBook).Worksheets(TargetSheet).Range("O2").PasteSpecial Paste:=xlPasteFormulas

Call 保存

End Sub

Private Sub 保存()

Dim fname As String
Dim tuki As String
Dim name As String
Dim Mnumber As String

ActiveSheet.Range("A1").Value = Format(Range("A1"))
tuki = Format(Range("$A$6"), "m")
name = Format(Range("$F$1"))
Mnumber = Format(Range("$D$1"))

fname = Application.GetSaveAsFilename( _
InitialFileName:=Mnumber + name + "勤務表_" + tuki + "月", _
FileFilter:="Excelファイル, *.xlsx", _
Title:="勤務表ファイルの保存")

If fname <> "False" Then
ActiveWorkbook.SaveAs Filename:=fname
Else
MsgBox "キャンセルされました"

End If

End Sub

退会済みユーザー👍を押しています

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

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

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

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

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

izkn

2015/12/17 07:40

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答4

0

数式+条件付き書式の方が、費用対効果が高いと思います。

Changeイベントは、初心者がコーディングすると、
頻繁にチェンジイベントが実行される事になり、
バグが起きた時に致命的なエラーになる可能性があります。

投稿2015/12/17 11:15

ExcelVBAer

総合スコア1175

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

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

YSzk

2015/12/18 02:02

回答ありがとうございます。 調べてみた結果、やたら長い式が羅列されることが判明しました。 そうなった場合に一から式を見直し、修正という作業の効率の悪さも分かり勉強になりました。
guest

0

まずはVBAでやるのが主題だと思うのですが、別にワークシート関数の組み合わせだけで済ませていいのならそうした方がよくないですか?
極端な話ですが届出の有無のなんて、提出日(承認日)or届出の処理Noを入れれば届出済とみなすとすれば...

投稿2015/12/17 12:19

dojikko

総合スコア3939

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

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

YSzk

2015/12/18 02:24

届け出欄のセルはプルダウンで届け出(出勤・休暇種と同じ)を選ぶようにしてあるので、その欄はプルダウンを辞めて簡単な処理になるように考えてます。
guest

0

さきに苦言を述べさせていただきますが、ご自分でどこまで努力し、どういう部分でつまづいたのかが質問内容から見て取れません。
そのため自分が任されたプログラム改修をこの場に丸投げし、親切な回答者から正解ソースをもらおうとしているように見えてしまいます。
そういう意味でマイナス評価がついてしまったのだと思いますので、質問の仕方にはご注意ください。
※努力してないでしょ?と言っているわけではなく、その過程が見えないという話です。

あと、この改修が業務であるのなら安易にオープンな場に出すべきではありません。私なら最終手段です。
自力では解決できない問題に対し、周囲の方の協力を引き出すことも必要な能力です。
周囲にExcelやVBAのことを聞ける上司や先輩がいるのなら、まず相談してみましょう。
※周囲に相談できる方がいないけど解決しなければならない状況でしたらすみません。


ここから本題。

ドロップダウンで出勤・休暇種の中から有休や各種特別な休暇(申請書の提出が必要)を選択するようにし、選んだ種目と未提出or提出済みが入力されるという処理を行いたい(自動で、連動して)。

「未提出」「提出済み」の判断条件がわからないのでなんとも言えませんが、その判断材料となるデータの持ち方次第ではVLOOKUPなどのExcel関数で連動させることができるかもしれません。

提出ファイル作成ボタンを押したときに、提出し忘れた申請書はないか、メッセージを表示するようにしたい。

提示いただいたソースコードでは

VBA

1If Range("D2") = Range("A41") + Range("F41") + Range("U33") And Range("A36") - Range("A37") = Range("C36") Then 2 ~正常 3Else 4 ~エラー 5 Exit Sub 6End If

の部分でエラー判定を行っていると思いますが、この判定文やU33セルが参照している36行目以降のセル内容がイメージ説明の画面上では見て取れないため何とも言い難いです。

おそらく月の所定日数と入力した日数をチェックして入力漏れのチェック等しているのではないかと思いますが、既にAndを使った複数条件のチェックを1行で行っており、コメント等での説明もないようなので、ここに新たな条件を追記したらさらにわかりにくいIf文になってしまいます。

なのでここはチェック処理自体を関数化することをお勧めします。
その際に今回追加したい未提出エラーの条件文も追加すればよいと思います。

投稿2015/12/24 04:12

jawa

総合スコア3013

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

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

0

質問のような内容をするのであれば下記のような内容で実現できると思います。

・出勤・休暇種のプルダウンが変更された際に、届け出が必要な種を選んだ場合、メッセージを表示する
⇒Changeイベントを使用すれば実現できると思います。

・出勤・休暇種で届け出が必要なものを選んだ場合に、届け出欄も提出した場合と未提出の場合で区別がつく
⇒届出のセルに条件書式を設定して、背景色を変える?

ただ、既存のものを改良する場合、
・使用している人にとってどこが使いにくいのか?
・どのような機能が追加されたら楽になるのか?
を検討されてからの方がよいと思います。
現時点では、何が実現したいのか少しわかりにくいです。

投稿2015/12/17 05:55

tomo.ina

総合スコア357

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

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

YSzk

2015/12/17 06:26

回答いただき、誠にありがとうございます。 一応、三人寄れば文殊の知恵?のように初級者同士ながら、改善点を出し合った結果「ここ必要ということで」この項目を追加することにしました。 ほかにいくつか改善事項等も出しましたが、私たちの技術で解決できそうもない関数や式を使いそうなものは見送ることにしました。 ご提案いただいた、セルの条件書式設定ですが、当初チェックボックスを設置しようと考えていましたが、処理が重くなるため別の方法を模索しているところです。 Changeイベントについて、早速参照させていただきます。
tomo.ina

2015/12/18 00:19

既に改善点を出し合ったのなら良いと思います。 目的を達成する方法は無数にあるので、その中で自分たちにできる 最前の方法を探していってください。 疑問に思ったことがあれば遠慮せず質問してください。 新人には聞く権利があるので笑
YSzk

2015/12/18 02:06

ありがとうございます。 皆さま方、先輩の意見とGoogle先生、書籍等使える資源はフルに活用させていただきますので(笑)、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問