- ベストアンサー
エクセルVBAについて教えて下さい。
エクセルVBAの質問です。 (1)の一覧から「出張」の項目のみを抽出し、別シートへ(2)のような形で記載したいのですが、VBA初心者なのでこれが出来るのかもよく分かりません。もし出来るならやり方を教えてください。 (1) A B C D E F G H I JOB NO 内容 担当者 日付 日数 行先 時間 02AAA001 出張 田中 2/2 ~ 2/4 3日間 名古屋 日勤 02AAA002 出張 佐藤 2/3 ~ 2/4 2日間 大阪 夜勤 02AAA003 作業 鈴木 2/5 ~ 2/8 4日間 工場 日勤 02AAA004 出張 吉田 2/4 ~ 2/6 3日間 東京 夜勤 ・ ・ ↓↓ (2) A B C D E F 佐藤 田中 鈴木 吉田 2/1 日 2/2 月 名古屋 2/3 火 *大阪 名古屋 2/4 水 *大阪 名古屋 *東京 2/5 木 *東京 2/6 金 *東京 2/7 土 ・ ・ ☆出張の場合のみ(2)表に記載する ☆日付、曜日、氏名は既に入っていて、日付と氏名の交差する所に行先を入れる。 ☆夜勤の場合、行先の前に『*』を入れる。 説明が下手ですみません。分かる方いらっしゃいましたらお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
すでに回答がありますが、私も考えてみましたので回答させてください。 第1シートにもとの表をかきます。この場合日付は初めと終わりを分けて2列にします。 マクロ1を実行すると、第2シートに出張のデータだけ抽出されます。 このシートの第20行に手作業で第2列から担当者名を順に入れておきます。 また21行から下に日付を入れておきます。日付は書式をdateにします。 しーと2を開いていて、まくろ2を実行するとシート2の20行から下にご希望の表2と同じ物が得られます。 Option Explicit Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/2/17 ユーザー名 : ' ' Range("B2:H5").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="出張" Range("A2:H5").Select Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin End Sub Sub Macro2() ' ' Macro2 Macro ' マクロ記録日 : 2009/2/17 ユーザー名 : ' Dim igyo As Integer, tanto As String, ihi1 As Date, jtanto As Integer, iigyo As Integer, i As Integer, nissu As Integer For igyo = 2 To 4 tanto = Cells(igyo, 3) Cells(10, 1) = tanto ihi1 = Cells(igyo, 4) Cells(10, 2) = ihi1 '担当者の列番号 jtanto = 1 Do jtanto = jtanto + 1 Loop Until Cells(20, jtanto) = tanto Cells(10, 3) = Cells(20, jtanto) '日付1の行 iigyo = 21 Do iigyo = iigyo + 1 Loop Until Cells(iigyo, 1) = ihi1 Cells(10, 4) = Cells(iigyo, 1) '行き先の書き込み nissu = Cells(igyo, 6) For i = 1 To nissu Cells(iigyo, jtanto) = Cells(igyo, 7) iigyo = iigyo + 1 Next i Next igyo ' End Sub
その他の回答 (3)
- hallo-2007
- ベストアンサー率41% (888/2115)
ほんとこれは条件が多いので作業用のシート作ってみました(関数案) (1)の表はSheet1 という名前で 作業用のシートを 作業用という名前 (2)と同じ表を準備 A B C D E F 佐藤 田中 鈴木 吉田 2/1 日 0 0 0 0 2/2 月 2 0 0 0 2/3 火 2 3 0 0 C2セルに =SUMPRODUCT(($A2>=Sheet1!$D$2:$D$10)*($A2<=Sheet1!$F$2:$F$10)*(C$1=Sheet1!$C$2:$C$10)*ROW(A$2:A$10)) といれて、右へコピィ、下へコピィすると条件にあった人の行番号がでます。 (2)のシートの C2セルには =IF(OR(作業用!C2=0,INDEX(Sheet1!$B:$B,作業用!C2)="作業"),"",IF(INDEX(Sheet1!$I:$I,作業用!C2)="夜勤","*","")&INDEX(Sheet1!$H:$H,作業用!C2)) 右へコピィ、下へコピィでご希望の表示になりました。 ひとつのシートにまとめて256文字以内に出来るかは?です。 多分、この方が再計算で時間の負担が少ないと思います。 作業用のシートが目障りならシートごと非表示にしておく手も有ります。 作業用のシートの日付とか名前は =(2)のシート名!A1 とかでリンクしておくのも良いでしょう。 あれま、のんびり考えていたら VBA案でていましたね。取合えず試してね!!
お礼
分かりやすくて、すぐ出来ました!関数でも出来るんですね!ありがとうございました^^
- web2525
- ベストアンサー率42% (1219/2850)
配列計算を利用して関数式だけでも出来そう、計算式が文字制限以内に収まりかどうかは微妙だけど。 たとえば(1)の各項目に名前付けして =INDEX(行先,MATCH(1,INDEX((担当者=C$3)*(内容="出張")*(DATEVALUE(LEFT(日付,3))=$A2),0),0)) C2:F8に貼り付ければ出張の初日のみですが行先が表示される 改良とエラー処理で何とか出来そうですよね?
内容(セルB2?)が「出張」なら、以下の作業をする、というIF文が書けます。 時間(セルI2?)が「夜勤」なら、行先(セルH2?)の値に*を付ける、というIF文が書けます。 担当者(セルC2?)が田中さんならD列に、鈴木さんならE列に、というSELECT CASE文が書けます。 日付(セルD2?)の値を取得しそれを日数(セルG2?)分繰り返す、という(例えば)DO..LOOP文が書けます。 (余談:日付は最初の日だけ入力すれば用が足りるのでは?) 以上が1行(データの入力されている最初の行=2行目)に対する処理で、 それを行数分繰り返す、という(例えば)FOR..NEXT文が書けます。 出来る、出来ない、で言えば「出来る」ですのでがんばって。 一度に全部やろうとしないで、☆を一つずつつぶしていく感じで。 まずは同じシート内に(2)表を作って、そこに転記させてみると良いと思います。
お礼
やっぱりVBAはすごいですね。私も徐々に勉強したいと思います。こんなにたくさんアルファベットが並んでると、書くの大変だったんじゃないかなーと思ってしまいます。本当にありがとうございました!!!