- ベストアンサー
複数店舗の人員管理を効率化する方法
- VBEを使用して複数店舗の人員管理を効率化する方法を教えてください。
- タイムカード状のシートから一覧表を作成する方法を教えてください。
- D1:F1,G1:I1を結合するかどうかについてアドバイスをお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No2です。作成すべき一覧表のフォーマットを誤解していました。 次のように訂正します。 Sub test1() Dim r1 As Long Dim r2 As Long Dim c1 As Integer Dim km km = Array("日", "曜日", "応援先", "氏名", "入", "退") Sheets("Sheet2").Cells.ClearContents Sheets("Sheet2").Columns("A:A").NumberFormatLocal = "m/d;@" '月日(=A)列の表示形式設定 For k = 0 To 5 if k>=4 Then Sheets("Sheet2").Cells(6, k + 1).Value = km(k) '項目名表示 Columns(n * 4 + k + 3).NumberFormatLocal = "h:mm;@" '入/退時刻列の表示形式設定 End If Next k For r1 = 3 To Sheets("Sheet1").Range("A65536").End(xlUp).Row '3行目から下の行に移動 For c1 = 4 To 256 Step 3 '4列目(D列)から3列おきに右の列に移動 If Sheets("Sheet1").Cells(r1, c1) <> "" Then 'r1行のそれぞれの応援先欄のセルにデータがあるなら r2 = Sheets("Sheet2").Range("A65536").End(xlUp).Row + 1 '書き込みセルの行No Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r1, 1) '日を転記 Sheets("Sheet2").Cells(r2, 2).Value = Sheets("Sheet1").Cells(r1, 3) '曜日を転記 Sheets("Sheet2").Cells(r2, 3).Value = Sheets("Sheet1").Cells(r1, c1) '応援先を転記 Sheets("Sheet2").Cells(r2, 4).Value = Sheets("Sheet1").Cells(1, c1) '氏名を転記 Sheets("Sheet2").Cells(r2, 5).Value = Sheets("Sheet1").Cells(r1, c1 + 1) '入時刻を転記 Sheets("Sheet2").Cells(r2, 6).Value = Sheets("Sheet1").Cells(r1, c1 + 2) '退時刻を転記 End If Next c1 Next r1 msg = MsgBox(prompt:="終了しました", Buttons:=vbExclamation + vbOKOnly, Title:="") End Sub
その他の回答 (3)
- pc_knight
- ベストアンサー率66% (52/78)
No.3です。 小生のパソコンではご指摘のエラーは起きませんでした。 故意にコードを変え、「型が一致しません。」エラーが起きるのか試行錯誤しましたが、「型が一致しません。」エラーが起きる要因は見つかりませんでした。 エラーメッセージ画面が出た際、「デバッグ」ボタンをクリックして見るとエラー行が黄色く色塗りされます。 「型が一致しません。」エラーが生じた際、色塗りされたのは「If Sheets("Sheet1").Cells(r1, c1) <> "" Then 'r1行のそれぞれの応援先欄のセルにデータがあるなら」の行だったでしょうか。 この行では「型が一致しません。」エラーは起きることはないように思います。 再確認をお願いします。 ただ回答したコードでは、作成したい一覧表の形式に沿っていないところがありましたので次の通り訂正します。(10行目と11行目の入れ替え) (誤) (10行) if k>=4 Then (11行) Sheets("Sheet2").Cells(6, k + 1).Value = km(k) '項目名表示 (正) (10行) Sheets("Sheet2").Cells(6, k + 1).Value = km(k) '項目名表示 (11行) if k>=4 Then
お礼
遅くなり申し訳ありません。 もう一度はじめから作り直したら、うまくいきました。 ありがとうございます。
- pc_knight
- ベストアンサー率66% (52/78)
質問というより、依頼の感ですが(笑)、お困りのご様子なので・・ 質問内容にて仰っている「下記の表」と作成したい「一覧表」が各シートとも一枚のシートという前提でなら、次のVBAでいかがでしょう。 Sub test() Dim r1 As Long Dim r2 As Long Dim c1 As Integer Dim km km = Array("応援先", "氏名", "入", "退") Sheets("Sheet2").Cells.ClearContents Sheets("Sheet2").Columns("A:A").NumberFormatLocal = "m/d;@" '月日(=A)列の表示形式設定 Sheets("Sheet2").Cells(6, 1).Value = "日" Sheets("Sheet2").Cells(6, 2).Value = "曜日" For n = 0 To 62 For k = 0 To 3 Sheets("Sheet2").Cells(6, n * 4 + k + 3).Value = km(k) '項目名表示 If k >= 2 Then Columns(n * 4 + k + 3).NumberFormatLocal = "h:mm;@" '入/退時刻列の表示形式設定 End If Next k Next n For r1 = 3 To Sheets("Sheet1").Range("A65536").End(xlUp).Row '3行目から下の行に移動 r2 = Sheets("Sheet2").Range("A65536").End(xlUp).Row + 1 '書き込みセルの行Noを探し Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r1, 1) '日を転記 Sheets("Sheet2").Cells(r2, 2).Value = Sheets("Sheet1").Cells(r1, 3) '曜日を転記 For c1 = 4 To 256 Step 3 '4列目(D列)から3列おきに右の列に移動 If Sheets("Sheet1").Cells(r1, c1) <> "" Then '応援先が空欄でないなら c2 = Sheets("Sheet2").Cells(r2, 256).End(xlToLeft).Column + 1 '書き込セルみ列番号を探し Sheets("Sheet2").Cells(r2, c2).Value = Sheets("Sheet1").Cells(r1, c1) '応援先を転記 Sheets("Sheet2").Cells(r2, c2 + 1).Value = Sheets("Sheet1").Cells(1, c1) '氏名を転記 Sheets("Sheet2").Cells(r2, c2 + 2).Value = Sheets("Sheet1").Cells(r1, c1 + 1) '入時刻を転記 Sheets("Sheet2").Cells(r2, c2 + 3).Value = Sheets("Sheet1").Cells(r1, c1 + 2) '退時刻を転記 End If Next c1 Next r1 msg = MsgBox(prompt:="終了しました", Buttons:=vbExclamation + vbOKOnly, Title:="") End Sub
- assault852
- ベストアンサー率48% (1364/2797)
※私の意見に対しての批判は、あえてお受け致しますが返答は致しませんので、何卒ご了承ください。 この時間まで、回答がないところを見ると、VBAで処理するにしてもかなり難しいのではないでしょうか。 よしんば、プログラムを書ける人がしたとしても、実際に検証してからでないと回答として出せないでしょうし。 あなた自身も、うまくいかないからといって、プログラムを修正するためのやり取りに時間を割くのは惜しいはず。 地道な作業で間に合わないとおっしゃるなら、間に合わないなりの仕事の進め方(善後策)があるのではありませんか。 更に個人的な意見を言わせて頂ければ、規模はわかりませんが、複数店舗の勤怠管理(就業管理)をExcelで、しかもこのような大変な思いをされて扱われているのは、非常に心苦しいです。 今はパソコンでも簡単に扱える就業管理ソフトはいくらでもありますので、御社でも是非導入を進められるように切に望みます。 ※大変生意気なことを申しておりますことをお詫び致します。
お礼
親切にご回答いただきありがとうございます。 返答が遅くなり申し訳ありません。 VBEを見れば、何となく分かるのですが、VBEの組立てになると、いまいち分からなくなってしまうんですよね。(^^;) エラー表示が出てしまったのですが、 >If Sheets("Sheet1").Cells(r1, c1) <> "" Then 'r1行のそれぞれの応援先欄のセルにデータがあるなら 型が一致しませんと表示されてしまいました。Sheet名も合っているのですが、原因が分かりません。分かりましたらお願いします。