- 締切済み
ExcelVBA Sheet1のデータをSheet2に並び替えるには
OfficeExcel2003を使って従業員の業務管理をているのですが、VBAを使って下記のようなことを自動化したいと思ってます。 Sheet1のA列には上から123・・・の管理番号がふっていて、B列には業務の内容が記入されています。 C列にはその業務を行う日付が入力されており、D列~G列にはその業務を行う人の名前が1名から4名の間で入力されています。 次に、Sheet2のA列には縦に全従業員の名前が入力されており、B列以降1行目にはカレンダー状にその月の日付が振ってます。 VBAを使って、Sheet1のデータを元にSheet2の各従業員が行う業務の日付のところに該当の管理番号が自動で表示されるようにしたいのです。 ユーザーフォームを使って入力できるところまではなんとか出来るようになりましたので、そのデータを元に従業員がわかりやすいフォーマットに変換しようと思ってます。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
文章を使ってだらだら書くだけでなく、下記のような実例をあげて質問すべきです。 そしてこの質問は、やりたいことだけ書いて、コードを全部回答者まかせの丸投げとなっています。規約で望ましく無いとされています。 (Sheet1) 管理番号 業務内容 実施日付 担当者1 担当者2 担当者3 1 A 5月1日 x y z 2 B 5月5日 x z 3 C 5月8日 z う 4 D 5月9日 y u ーーー (Sheet2) 結果は下記 ーーーー 色んなやり方があるが、下記を勧める。他のやり方ではもっと複雑になると思う。 分解・ソート法とでも言うべきもの。 DEFが管理番号別で1行に固まっているが、 (1)従業員ー日付ー管理番号の中間ファイルをSheet3に作る (2)従業員別にソート (3)該当日付の列に管理番号をセット ーーー Sub test01() d = Worksheets("Sheet1").Range("A65536").End(xlUp).Row MsgBox d k = 2 For i = 2 To d For j = 4 To 6 'D,、E。F列で繰り返し If Worksheets("sheet1").Cells(i, j) <> "" Then Worksheets("Sheet3").Cells(k, "A") = Worksheets("sheet1").Cells(i, j) Worksheets("Sheet3").Cells(k, "B") = Worksheets("sheet1").Cells(i, "C") Worksheets("Sheet3").Cells(k, "C") = Worksheets("sheet1").Cells(i, "A") k = k + 1 End If Next j Next i '---- d1 = Worksheets("Sheet3").Range("A65536").End(xlUp).Row MsgBox d1 Worksheets("Sheet3").Range("A2:C" & d1).Sort Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("B2"), Order2:=xlAscending End Sub ーーー 結果 担当 日付 管理番号 u 5月8日 3 u 5月9日 4 x 5月1日 1 x 5月5日 2 y 5月1日 1 y 5月9日 4 z 5月1日 1 z 5月5日 2 z 5月8日 3 ーーーー 最終作表は B1:J1に 5月1日 5月2日 5月3日 5月4日 5月5日 5月6日 5月7日 5月8日 5月9日 を作っておく ーーーー Sub test02() d = Worksheets("Sheet3").Range("A65536").End(xlUp).Row k = 2 ms = Worksheets("Sheet3").Cells(2, "A") Worksheets("Sheet2").Cells(k, "A") = ms For i = 2 To d If Worksheets("Sheet3").Cells(i, "A") = ms Then dt = Worksheets("Sheet3").Cells(i, "B") p = Worksheets("Sheet2").Range("B1:j1").Find(what:=dt).Column MsgBox p Worksheets("Sheet2").Cells(k, p) = Worksheets("Sheet3").Cells(i, "C") Else k = k + 1 dt = Worksheets("Sheet3").Cells(i, "B") p = Worksheets("Sheet2").Range("B1:j1").Find(what:=dt).Column MsgBox p Worksheets("Sheet2").Cells(k, p) = Worksheets("Sheet3").Cells(i, "C") ms = Worksheets("Sheet3").Cells(i, "A") Worksheets("Sheet2").Cells(k, "A") = ms End If Next i End Sub を実行 ーーー 結果 Sheet2 ー 5月1日 5月2日 5月3日 5月4日 5月5日 5月6日 5月7日 5月8日 5月9日 u ー ー ー ー ー ー ー 3 4 x 1 ー ー ー 2 ー ー ー ー y 1 ー ー ー ー ー ー ー 4 z 1 ー ー ー 2 ー ー 3 ー この程度のものは、すぐできる訳が無い。背伸びしすぎと思う。 >ユーザーフォームを使って入力できるところまではなんとか データ入力のことで、本質問の内容と関係ないでしょう。 ーー ワークシートの指定は set ws1=Worksheets("Sheet1")のようにして、その後wh1を使うほうが すっきりするが、上記は泥臭い方法のままにしてます。