• ベストアンサー

エクセル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)表に記載する ☆日付、曜日、氏名は既に入っていて、日付と氏名の交差する所に行先を入れる。 ☆夜勤の場合、行先の前に『*』を入れる。 説明が下手ですみません。分かる方いらっしゃいましたらお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#192382
noname#192382
回答No.3

すでに回答がありますが、私も考えてみましたので回答させてください。 第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

hikaruj22
質問者

お礼

やっぱりVBAはすごいですね。私も徐々に勉強したいと思います。こんなにたくさんアルファベットが並んでると、書くの大変だったんじゃないかなーと思ってしまいます。本当にありがとうございました!!!

その他の回答 (3)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

ほんとこれは条件が多いので作業用のシート作ってみました(関数案) (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案でていましたね。取合えず試してね!!

hikaruj22
質問者

お礼

分かりやすくて、すぐ出来ました!関数でも出来るんですね!ありがとうございました^^

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.2

配列計算を利用して関数式だけでも出来そう、計算式が文字制限以内に収まりかどうかは微妙だけど。 たとえば(1)の各項目に名前付けして =INDEX(行先,MATCH(1,INDEX((担当者=C$3)*(内容="出張")*(DATEVALUE(LEFT(日付,3))=$A2),0),0)) C2:F8に貼り付ければ出張の初日のみですが行先が表示される 改良とエラー処理で何とか出来そうですよね?

noname#91724
noname#91724
回答No.1

内容(セルB2?)が「出張」なら、以下の作業をする、というIF文が書けます。 時間(セルI2?)が「夜勤」なら、行先(セルH2?)の値に*を付ける、というIF文が書けます。 担当者(セルC2?)が田中さんならD列に、鈴木さんならE列に、というSELECT CASE文が書けます。 日付(セルD2?)の値を取得しそれを日数(セルG2?)分繰り返す、という(例えば)DO..LOOP文が書けます。 (余談:日付は最初の日だけ入力すれば用が足りるのでは?) 以上が1行(データの入力されている最初の行=2行目)に対する処理で、 それを行数分繰り返す、という(例えば)FOR..NEXT文が書けます。 出来る、出来ない、で言えば「出来る」ですのでがんばって。 一度に全部やろうとしないで、☆を一つずつつぶしていく感じで。 まずは同じシート内に(2)表を作って、そこに転記させてみると良いと思います。

関連するQ&A