• ベストアンサー

エクセル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

  • エクセルVBAの質問です

    sample.xlsがあり内容は下記のように A列に名前、B列に数字が入り、行数は一定でありません 田中一郎 3 鈴木健一 5 佐藤太郎 8 田中一郎 5 田中一郎 2 佐藤太郎 7 鈴木健一 3 佐藤太郎 9 鈴木健一 54 佐藤太郎 8 田中一郎 9 このエクセルシートにコマンドボタンを付け、VBAでコマンドボタンを押した場合 指定したエクセルファイル”kekka.xls”に 田中一郎 19 鈴木健一 62 佐藤太郎 32 と言うように、名前別でその氏名の横の数字の合計を表示させたいと考えています。 何卒お知恵をお貸しください、お願いします。

  • エクセルで一覧作成

    エクセルで一覧作成 エクセルで以下のデータを作成したいのですが どのような関数を使用したらよいのでしょうか?    A   B  C  D 1 東京 田中 鈴木 小林 2 東京 鈴木  3 大阪 伊藤 鈴木  4 東京 佐藤 5 三重 小林 田中        ↓    A   B   C   D   E   F   G 1 東京 田中 鈴木 小林 鈴木 佐藤 2 大阪 伊藤 鈴木 3 三重 小林 田中 よろしくお願いします。

  • EXCELマクロVBAについて

    Excel2007、XPを使用しています。 AからE列に下記のような情報が入力されています。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/10 11111 / 田中 / 東京都 / 00000000000 / 2012/08/09 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/11 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 A列のIDでくくったとして、 E列の注文日が最大のみの行を表示させたいです。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 このようなことはマクロで可能なのでしょうか? 恐れ入りますがご教授お願い致します。

  • エクセル表からの抽出して別の表を作る

    探し方が悪いのか、エクセルならできそうなのに答えが見つからず苦戦しています。どなたかお知恵をお貸しください。 1/1   1/2 佐藤 車    自転車 田中 バイク   加藤      バイク 吉田 車    車 山田 自転車  車 伊藤 バイク  車 鈴木 車    自転車 このような一覧表があります。これを基にして、次のような表を作りたいのです。    バイク  車   自転車 1/1  田中   佐藤  山田     伊藤   吉田          鈴木 1/2  加藤   吉田  佐藤          山田  鈴木          伊藤 最初の表は非常に細かく、半年分が1枚のシートになっているため見にくく、月単位で見やすい表に変えているのですが作業が面倒なのでなんとかならないかと考えています。 どうぞよろしくお願いいたします。

  • エクセル 最新日付以外のデータを合計する

    下表があるとしまして、 氏名 日付 買上金額 鈴木 5月5日 10 鈴木 5月6日 60 鈴木 5月7日 100 鈴木 5月9日 400 田中 5月4日 100 田中 5月7日 200 山田 5月1日 600 山田 5月2日 200 山田 5月3日 300 1970 氏名毎に、最新日付以外の合計を計算したいのです。 この場合、鈴木さんが170 田中さんが100 山田さんが800の合計1070がそれぞれの氏名の最新以外データの合計となりますが、これらを自動的に計算できないでしょうか? よろしくおねがいします。

  • エクセルについて

    こんばんは。 いつも質問ばかりでごめんなさい。 ちょっとお聞きしたいのですが下記のような表があるとします。 カードの方のみの名前と金額を別のセル(または別シート)に表示させたいのですがどのようにしたらよろしいのでしょうか? 日付 名前  現金  カード 2/5  田中  12000 2/5  佐藤  18000 2/5  鈴木       32000 2/5  木村  25000 2/5  山田       22000 ↓このようにしたいのですが。 カード決済 日付 名前  金額 2/5  鈴木  32000 2/5  山田  22000 お手数おかけしますがよろしくお願いいたします。

  • 【エクセル】縦に続いた表を横にして整理したい

    表題の通りですが、エクセル2003で、以下のようなことがしたいです。 [元データ]   A     B       1  氏名   田中 2  住所   東京 3  電話番号 *** 4  登録日  *** 5 6  氏名   鈴木 7  住所   埼玉 8  電話番号 *** 9  登録日  *** 10 11  氏名   佐藤 12  住所   埼玉 13  電話番号 *** 14  15 氏名   工藤 のように一人分のデータが、空白セル1マス空けて、延々と続いた様な表があります(3万行くらい)。 これを下記のように変更したいのです [整理後]   A    B    C    D    E 1 氏名   住所   電話番号  登録日 1 田中   東京   ***   *** 2 鈴木   埼玉   ***   *** 3 佐藤   埼玉   ***   (空白) 4 工藤    5 のような感じです。 3つ目の佐藤氏のデータのように元データに登録日という項目が無い場合があります。 それ以外の項目に関して順番や有無の違いはありません、1データの最終行にある登録日という 項目だけ有ったり無かったりします。 項目だけは縦のものを横に貼り付け、で出来たのですが、それが意外のデータを効率よく移すには どうしたら良いでしょうか。 関数、マクロを教えていただけたらありがたいです。こうしたら良いというアイデアだけでも助かります。どうか宜しくお願いします。 (説明不足のところがありましたらすいません…補足致します)

  • エクセルで条件に一致したセルの隣のセルを取得したい

    下のような「得点」という名前のシートがあります。 (「田中」のセルがA1です。)  [ 田中 ][ 10 ][ 200 ]  [ 山田 ][ 21 ][ 150 ]  [ 佐藤 ][ 76 ][ 250 ]  [ 鈴木 ][ 53 ][ 350 ] 別のシートのA1セルに、「佐藤」と入力すると、  [ 佐藤 ] 「得点」シートから「佐藤」の列を見つけて、B1、C1に  [ 佐藤 ][ 76 ][ 250 ] のように表示させたいのですが、B1、C1にはどのような式を書けば良いのでしょうか。 「得点」シートでは氏名が重複する事はありません。 IF文を使うと思うのですが、いまいち良く分かりませんでした。 よろしくおねがい致します。

  • MYSQLであるレコードを取得したいのですが

    MYSQL5.0.33を使用しています。 今「ID(primary key)」「name」の二つのカラムのテーブルがあり、そのレコードの中から2の倍数と3の倍数のレコードをそれぞれ取得したいのです。 しかし、レコードが削除される可能性があり、なるべく均等に取得することができません。 ================= (例) 1 佐藤 2 鈴木 3 (削除されたレコード) 4 田中 5 小林 6 (削除されたレコード) 7 阿部 8 吉田 9 (削除されたレコード) ================= 上記のような状態ですと、3の倍数のレコードは一つも取得できません。 素人の感覚的な話になってしまうのですが、 ================= (例) 1 佐藤 2 鈴木 3 田中 4 小林 5 阿部 6 吉田 ================= このような感じにして、 「2の倍数は『鈴木』『小林』『吉田』」 「3の倍数は『田中』『吉田』」 で取得はできないものかと思い質問させて頂きました。 できなければ、何か方法や苦肉の策等ありましたらご教授頂けませんでしょうか。 どうか宜しくお願い致します!

  • エクセルで別シートを参照していて、参照元のデータを変更した場合

    エクセルで別シートを参照したいのですがうまくいきません。 (1)Sheet1には顧客データが入っています。 【Sheet1】   A   B   C 1 氏名 住所 性別  2 小川 東京 男 3 佐藤 大阪 女 4 鈴木 福岡 女 (2)Sheet2ではSheet1の顧客データの一部+獲得ポイントのデータが入っています。Sheet2のA列とB列に「=Sheet1!A2」とういう風に関数を入れてSheet1を参照しています。C列~は手入力でデータを入力しています。 【Sheet2】   A   B    C    D 1 氏名 住所  12/1 12/15  2 小川 東京  1    5 3 佐藤 大阪  1    5 4 鈴木 福岡  1    5 (3)Sheet1に新たに顧客情報を入れますが、氏名は五十音順にしたいので行を挿入して入力します。(行3に加藤さんを入れました) 【Sheet1】   A   B   C 1 氏名 住所 性別  2 小川 東京 男 3 加藤 沖縄 男 4 佐藤 大阪 女 5 鈴木 福岡 女 (4)私の希望としては、(3)をしたらSheet2は↓のようになってほしいのですが、実際には(2)の状態のままです。 【Sheet2】   A   B    C    D 1 氏名 住所  12/1 12/15   2 小川 東京  1    5 3 加藤 沖縄   4 佐藤 大阪  1    5 5 鈴木 福岡  1    5 (5)Sheet1の変更結果をSheet2に反映することは無理なのでしょうか?

専門家に質問してみよう