• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルの勤務表(マクロ)についての質問です。)

エクセルの勤務表から日付別に出勤者と勤務を抜き出すマクロの作成方法

dogs_catsの回答

  • ベストアンサー
  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.1

一例です。 Sub test() Dim strSerch1 As String Dim strSerch2 As String Dim LastRow As Long Dim i, j, k, m, n As Long Dim Myday As Integer Dim ws As Worksheet '検索する文字を以下の二つの変数に代入 strSerch1 = "早番" strSerch2 = "遅番" 'Sheet1に「早番」の人をリスト化するための変数を設定 '最初に入れるのが3行目なのでjに3を代入 With Worksheets("勤務表マスタ") '月の最終日を取得(1行目の最終列-1が月の最終日) Myday = .Cells(1, Columns.Count).End(xlToLeft).Column - 1 '.Cells(.Rows.Count, 1).End(xlUp).Rowで最後の行がどこなのか調べて 'LastRow変数に代入する。 LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row For i = 1 To Myday '日付シート名を変数に格納 Set ws = Worksheets("sheet" & i) '日付シートのB1に日付入力 ws.Range("B1") = Format(.Cells(1, i + 1), "m月d日") j = 3 k = 8 For m = 2 To LastRow '早番の場合は日付シートの3行目から順に入力 If .Cells(m, i + 1).Value = strSerch1 Then ws.Cells(j, 2).Value = .Cells(m, 1).Value ws.Cells(j, 3).Value = .Cells(m, i + 1).Value j = j + 1 End If '遅番の場合は日付シートの8行目から順に入力 If .Cells(m, i + 1).Value = strSerch2 Then ws.Cells(k, 2).Value = .Cells(m, 1).Value ws.Cells(k, 3).Value = .Cells(m, i + 1).Value k = k + 1 End If Next m Next i End With End Sub 日付シートのデータをクリアする事を追加しています。本ブックを翌月使用すると前月データが残る為。B3~C10を設定していますので修正下さい。

nisiyan1
質問者

お礼

返信遅くなってすいません。丁寧なご回答ありがとうございます。 自分の拙いマクロをそのまま使っていただいてありがとうございます。 書いていただくと「なるほど」と思うのですが、今の自分の実力では、全く思い浮かばず、とても参考になりました。ありがとうございました

関連するQ&A

  • Excel VBA .xlsm→.xls変換

    VBAマクロの初心者です。 Office2010で作ったプログラムをOffice2000で実行したいのですが、 *.xlsmなら問題なく実行できるプログラムが、*.xlsでは 「エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」となります。作ったプログラムの詳細は以下の通りです。 *.xlsmで実行した際も、繰り返しが多いせいかどうも遅いので、効率化できる方法がありましたら、併せてご教授いただけると幸いです。 よろしくお願いいたします。 目的:Sheet1にある表AをSheet2にある表Bに変換する。(添付画像参照)    ※年月と国名は、あらかじめSheet2に入力してあります。     また、空白にゼロを入れる作業は省いています。 以下、実行したプログラムです。 Sub paste() Dim name11 Dim name12 Dim name13 Dim name21 Dim name22 Dim name2k For i = 2 To 150 'Sheet1の行はiで定義し、2行目から150行目まで繰り返し For j = 2 To 300 'Sheet2の行はjで定義し、2行目から300行目まで繰り返し name11 = Worksheets("Sheet1").Cells(i, 1).Value 'Sheet1の"年" name12 = Worksheets("Sheet1").Cells(i, 2).Value 'Sheet1の"月" name13 = Worksheets("Sheet1").Cells(i, 3).Value 'Sheet1の"国名" name21 = Worksheets("Sheet2").Cells(j, 1).Value 'Sheet2の"年" name22 = Worksheets("Sheet2").Cells(j, 2).Value 'Sheet2の"月" For k = 3 To 100 'Sheet2の列はkで定義し、3列目から100列目まで繰り返し name2k = Worksheets("Sheet2").Cells(1, k).Value 'Sheet2の1行目(国名)※*.xlsで実行し、デバッグすると、この行がエラー1004になります。 If (name11 = name21 And name12 = name22 And name13 = name2k) Then '年と月が一致し、かつSheet1の3列目(国名)とSheet2の1行目(国名)が一致したら Worksheets("Sheet1").Cells(i, 4).Copy Destination:=Worksheets("Sheet2").Cells(j, k) 'Sheet1のi行4列目の"量"を、Sheet2のj行k列に貼り付ける。 '(j行は正しい年月の横、k列は正しい国名の下。) Exit For '検索→貼り付けのループを抜けて最初に戻る。 End If Next Next Next End Sub

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • エクセルで複数のシートに罫線を引くマクロを教えてください。

    エクセルで複数のシートに罫線を引くマクロを教えてください。 エクセルの表を担当者名でシート分割後、空白セル以外に罫線を引きたいのですが 複数シートに罫線を引くマクロを教えてください。 いくつか参考にさせていただき現状以下の様になっています。 元データというシートにAからGまで項目があります PJNo. PJ名 棟No. 棟名 取引先名  書類  担当者 1111 PJ1 10 棟1 取引先1  1 東京 1112 PJ2 11 棟2 取引先2  2 大阪 1113 PJ3 12 棟3 取引先3  3 名古屋 Sub 担当別シート作成() Application.ScreenUpdating = False For i# = 2 To Worksheets("元データ").Cells(2, 2).End(xlDown).Row j# = 1 '検索中の人のシートが既にできているかを判断する。 For Each sheet_name In Worksheets If sheet_name.Name = Worksheets("元データ").Cells(i, 7).Value Then j = 7 Exit For End If Next '検索中の人のシートがない場合、新規に作成する。 If j = 1 Then Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = Worksheets("元データ").Cells(i, 7).Value For j = 1 To 7 Worksheets(Worksheets.Count).Cells(1, j).Value = Worksheets("元データ").Cells(1, j).Value Next j End If 'データのコピー For j = 7 To 1 Step -1 Worksheets(Worksheets("元データ").Cells(i, 7).Value). _ Cells(Worksheets(Worksheets("元データ").Cells(i, 7).Value). _ Cells(65535, 1).End(xlUp).Row + 1, j).Value = Worksheets("元データ").Cells(i, j).Value Next j Next i 'それぞれのシートの列幅を最適化します。 For Each sheet_name In Worksheets sheet_name.Columns("A:G").AutoFit Next '---- Dim c As Range Range("A1").Select Set c = Selection.SpecialCells(xlCellTypeLastCell) Range(Cells(1, "A"), c).Select (省略)以下罫線を引くマクロ End Sub

  • エクセルのマクロ(データの出力について)

          12345678910・・・・ ← 日付 田中    1 1  1    中村     1  1   鈴木    11111    ・  ・  ・ 上のようになっている表を下記のように変換したいのですが、マクロがうまく書けません。 A B C D E F G H I J K L  M   1   2   3   4   5   6  7  ← 日付   田中  中村  田中  鈴木  中村  田中   鈴木  鈴木  鈴木      鈴木 Sub test01() d = Worksheets("Sheet1").Range("A65536").End(xlUp).Row r = Worksheets("Sheet1").Range("IV2").End(xlToLeft).Column k = 4 '新規作成用の行ポインター For j = 2 To r For i = 3 To d If Worksheets("Sheet1").Cells(i, j) = 1 Then Worksheets("新規作成用").Cells(k, 2 * (j - 6)) = Worksheets("Sheet1").Cells(i, 2) k = k + 1 End If Next i Next j End Sub ここまで書いていきづまってしまいました。どなたかご指南ください。

  • Excel VBAで検索する

    Excel VBAで、Sheet1に貼り付けたテキスト内から Sheet2に記載した(1列ごとの)キーワードを検索し キーワードが含まれている行をSheet3に貼り付ける処理をしているのですが、始めたばかりなので上手くいきません。 下記がソースです。 Dim moji As String Dim word As String Dim result As Integer For i = 3 To 103 For j = 2 To 21 moji = ThisWorkbook.Worksheets("Sheet1").Cells (i, 1).Value word = ThisWorkbook.Worksheets("Sheet2").Cells (j, 2).Value result = InStr(moji, word) If doResult <> 0 Then For k = 1 To 100 ThisWorkbook.Worksheets("Sheet3").Cells (k, 1).Value= moji Next k End If Next j Next i このソースでは上手くいかないのですが、どこがダメなのか分からないので、解決の糸口がつかめません。 アドバイスなどお願いします。

  • エクセル マクロ IF関数について

    Sheet1にグループボックス内で、チェックボタンで項目を選択するとA1に記載されるように作成、マクロで入力ボタン作成しボタンをクリックするとSheet2に記載されるように作りました。しかし、項目が多いためSheet2を見るとABCDEFGなどの列に空白が目立ち使いづらいです。 そこでIF関数を使い何とか出来ないでしょうか? 例)SHEET1 B2に原因のグループボックスにカテゴリー(チェックボックスにて1)入力ミス、2)人、3)機械) B3に対応のグループボックスにカテゴリー(チェックボックスにて1)外注、2)修正、3)報告) と作り、それらがチェックされていたら、A1の列に表示され入力ボタンを押したら、Sheet2のAには原因、Bには対応と記載されるようにしたいです。その時Sheet1のA列に空白があれば、Sheet2の列に表示するようにしたいです。 実際のマクロ記入 Sub 入力() Dim LastRow As Long With Worksheets("Sheet2") LastRow = Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & LastRow).Value = Worksheets("Sheet1").Range("A6").Value .Range("B" & LastRow).Value = Worksheets("Sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("Sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("Sheet1").Range("A9").Value .Range("E" & LastRow).Value = Worksheets("Sheet1").Range("A10").Value .Range("F" & LastRow).Value = Worksheets("Sheet1").Range("A12").Value .Range("G" & LastRow).Value = Worksheets("Sheet1").Range("A13").Value .Range("H" & LastRow).Value = Worksheets("Sheet1").Range("A15").Value .Range("I" & LastRow).Value = Worksheets("Sheet1").Range("A16").Value .Range("J" & LastRow).Value = Worksheets("Sheet1").Range("A19").Value End With End Sub お願いします教えてください。

  • 横にコピーするには・・。

    教えてください・・。 01.xls・02.xls・03.xlsとあり、その中のシート(01・02・03)をコピーして、全部というシートにまとめたいと思っています。 列にデータを追加したいのですが、行にデータが追加されてしまいます・・。 どうしたらいいのか教えてください。 01のシートがAからDまで 02のシートがEからGまで 03のシートがHからLまで とコピーをしたいと思っています・・。 --------- PathName = ThisWorkbook.Path & "\" ArrBook = Array("01.xls", "02.xls", "03.xls") For i = LBound(ArrBook) To UBound(ArrBook) Workbooks.Open PathName & ArrBook(i) Next Set WS(1) = Workbooks("01.xls").Worksheets("01") Set WS(2) = Workbooks("02.xls").Worksheets("02") Set WS(3) = Workbooks("03.xls").Worksheets("03") Set WS(4) = ThisWorkbook.Worksheets("全部") With WS(4) .Cells.ClearContents .Cells(1, 1) = "A" .Cells(1, 2) = "B" .Cells(1, 3) = "C" .Cells(1, 4) = "D" .Cells(1, 5) = "E" .Cells(1, 6) = "F" .Cells(1, 7) = "G" .Cells(1, 8) = "H" .Cells(1, 9) = "I" .Cells(1, 10) = "J" .Cells(1, 11) = "K" .Cells(1, 12) = "L" .Cells(1, 13) = "M" .Cells(1, 14) = "N" .Cells(1, 15) = "O" .Cells(1, 16) = "P" .Cells(1, 17) = "Q" LastRow(1) = WS(1).Range("A65536").End(xlUp).Row LastRow(2) = WS(2).Range("A65536").End(xlUp).Row LastRow(3) = WS(3).Range("A65536").End(xlUp).Row For i = 1 To 3 LastRow(4) = .Range("A65536").End(xlUp).Row + 1 WS(i).Rows("2:" & LastRow(i)).Copy .Cells(LastRow(4), 1) LastRow(4) = .Range("A65536").End(xlUp).Row End With For i = LBound(ArrBook) To UBound(ArrBook) Workbooks(ArrBook(i)).Close SaveChanges:=False Next End Sub

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • シフト表を自動で作成する方法

    指定した日付のシフト表を自動で作成する方法ですが、下記の方法を教えていただきました。 Sub シフト表作成() Dim org As Integer Dim dst As Integer Dim i As Integer Worksheets("週シフト表").Activate Range("C4:I4").Find(What:=Worksheets("日別").Range("C3").Value, _ LookAt:=xlWhole).Select Range(ActiveCell.Offset(2), ActiveCell.Offset(6)) _ .Copy Destination:=Worksheets("日別").Range("C6") Worksheets("日別").Activate For i = 6 To 10 If Range("C" & i).Value <> "休み" Then org = Application.WorksheetFunction.VLookup( _ Worksheets("日別").Range("C" & i), _ Worksheets("シフトマスタ").Range("B4:D6"), 2, False) dst = Application.WorksheetFunction.VLookup( _ Worksheets("日別").Range("C" & i), _ Worksheets("シフトマスタ").Range("B4:D6"), 3, False) Range(Cells(i, org - 5), Cells(i, dst - 5)).Interior.Color = vbBlue End If Next End Sub 日別のシートにシフトを作成しており、週シフトシートに、個々の日別の勤務(早番、遅番等)が記載されており、シフトマスタシートに各勤務の開始時刻を終了時刻が記載されています。 今は以下のような日別シートがあり、勤務に合わせてD列~P列間で色がつくようになっています。 _____A_______B________C_______D_______E_______F ・・・・ P 5_________氏名_____シフト___9時____10時____11時 ・・・・ 21時 6_________1さん_____早 7_________2さん_____遅 8_________3さん_____休 9_________4さん_____遅 10_______5さん_____遅 これを、1時間単位ではなく、30分単位(E列が9時30分、F列が10時、G列が10時30分・・・)にすると色の付く範囲がずれてしまいます。 コードをどのように変えれば良いかわからず困っております。 お手隙の方、いらっしゃいましたら何卒ご教授の程、お願い致します。

  • EXCEL VBA4行毎に枠で囲みたい

    お世話になります。 添付の様な表1があります。 これを表2のようにA1から順に4行毎に枠で囲みたいのです。 下記のようなコードを見よう見まねで書いてみましたがうまく動きません。 ごなたかご教授いただけませんでしょうか? よろしくお願い致します。 Dim i As Long Dim j As Long Dim lngYCnt As Long Dim intXCnt As Long Dim LastRow As Long ingYCnt = Worksheets("Sheet1").UsedRange.Rows.Count intXCnt = Worksheets("Sheet1").UsedRange.Columns.Count LastRow = Cells(Rows.Count, 1).End(xlUp).Row With Selection For i = 5 To LastRow Range("A" & i & ":F" & j).Select Selection.BorderAround Weight:=xlMedium j = j + 5 i = i + 5 Next End With どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 EXCEL2003 WINDOWS XP SP3