• 締切済み

エクセルVBAで質問です

下のような表を作っています。 A列に日付がある限り、B、C、D、E列それぞれの列に対して、 3行目以降のデータが検索値と同じであれば、そのひとつ上の行の 値をG、H、I、J列にそれぞれ上から順に入れていきたいのですが、 どのようになるでしょうか。 A1 月日 B1 検索値1・・・B3以降データ C1 検索値2・・・C3以降データ D1 検索値3・・・D3以降データ E1 検索値4・・・E3以降データ G2以降に検索値1で調べた値 H2以降に検索値2で調べた値 I2以降に検索値3で調べた値 J2以降に検索値4で調べた値 例えば、B1の検索値が1であり、B10に1があったとします。 この場合、ひとつ上のB9の値をG2に来るようにしたいのです。 説明下手ですが教えていただけないでしょうか。

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

>ためさせていただきました。 であれば、その結果どうだったのか、コメントが欲しいところですね。 #3のSub try()とどう違うのかちょっと『?』でしたが、検索結果が複数あるのですね。 >私なりにつくってみました。動作はするのです ...という事なので、それでいいと思いますよ。 何をもって『スマート』とするかはその人の考え方次第だと思います。 別に同じ事の繰り返しを記述していたとしても、 自分で書いたコードですから、可読性が良い事も『スマート』さの一つの要件になると思います。 でもまぁ、書いちゃったんで。 Sub try2()   Dim r As Range '基準となるA列範囲   Dim ri As Range 'For Each Loop用Object   Dim i As Long 'Loopカウンタ   Dim n As Long '値セット先   Dim x      '検索値   With ActiveSheet     Set r = .Range("A3", .Range("A3").End(xlDown))     For i = 1 To 4       x = .Cells(1, i + 1).Value       n = .Cells(.Rows.Count, i + 6).End(xlUp).Row       For Each ri In r.Offset(, i)         If ri.Value = x Then           n = n + 1           .Cells(n, i + 6).Value = ri.Offset(-1).Value         End If       Next     Next   End With   Set r = Nothing End Sub データ量が多いなら、配列を使ったりして効率を良くしたり、 オートフィルタも使ったりできるかなとちょっと思ったんですが、 その辺りはスキルに合わせて習得していかれれば良いでしょう。

  • keirika
  • ベストアンサー率42% (279/658)
回答No.5

#4です。 このような感じで良いのでしょうか。 Sub test() Call test1(2, Range("b1")) Call test1(3, Range("c1")) Call test1(4, Range("d1")) Call test1(5, Range("e1")) End Sub Sub test1(j As Integer, r As Range) Dim i As Integer i = 3 Do Until Cells(i, 1) = "" If Cells(i, j).Value = r.Value Then Range("J65536").End(xlUp).Offset(1) = Cells(i - 1, j) End If i = i + 1 Loop End Sub

  • keirika
  • ベストアンサー率42% (279/658)
回答No.4

Sub Sample() Dim Bretu As Range Dim Cretu As Range Dim Dretu As Range Dim Eretu As Range Range("g2:j2").Clear If Range("a1") = "" Then Exit Sub End If Set Bretu = Range(Cells(3, 2), Cells(3, 2).End(xlDown)) Set Cretu = Range(Cells(3, 3), Cells(3, 3).End(xlDown)) Set Dretu = Range(Cells(3, 4), Cells(3, 4).End(xlDown)) Set Eretu = Range(Cells(3, 5), Cells(3, 5).End(xlDown)) If Not IsError(Application.Match(Range("b1"), Bretu, 0)) Then Range("g2") = Cells(Application.Match(Range("b1"), Bretu, 0) + 1, 2) End If If Not IsError(Application.Match(Range("c1"), Cretu, 0)) Then Range("h2") = Cells(Application.Match(Range("c1"), Cretu, 0) + 1, 2) End If If Not IsError(Application.Match(Range("d1"), Dretu, 0)) Then Range("i2") = Cells(Application.Match(Range("d1"), Dretu, 0) + 1, 2) End If If Not IsError(Application.Match(Range("e1"), Eretu, 0)) Then Range("j2") = Cells(Application.Match(Range("e1"), Eretu, 0) + 1, 2) End If Set Bretu = Nothing Set Cretu = Nothing Set Dretu = Nothing Set Eretu = Nothing End Sub でどうでしょうか

4k3s4r3
質問者

お礼

ありがとうございました。ためさせていただきました。 私なりにつくってみました。動作はするのですが、見ての通り、同じことをコピーしているにすぎません。私の説明不足ですが、動作としてはしたのような動きをしたいのです。これ、もっとスマートにできないでしょうか? 恐縮ですが、#3の方にも同じ内容でお礼を入れさせていただきます。 宜しくお願いします。 Sub test() Dim i As Integer i = 3 Do Until Cells(i, 1) = "" If Cells(i, 2).Value = Range("B1").Value Then Range("G65536").End(xlUp).Offset(1) = Cells(i - 1, 2) End If i = i + 1 Loop i = 3 Do Until Cells(i, 1) = "" If Cells(i, 3).Value = Range("C1").Value Then Range("H65536").End(xlUp).Offset(1) = Cells(i - 1, 3) End If i = i + 1 Loop i = 3 Do Until Cells(i, 1) = "" If Cells(i, 4).Value = Range("D1").Value Then Range("I65536").End(xlUp).Offset(1) = Cells(i - 1, 4) End If i = i + 1 Loop i = 3 Do Until Cells(i, 1) = "" If Cells(i, 5).Value = Range("E1").Value Then Range("J65536").End(xlUp).Offset(1) = Cells(i - 1, 5) End If i = i + 1 Loop End Sub

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

>A列に日付がある限り という意味がわかりません。 例えば、A3:A100までの範囲で日付がはいっていたら、 『3行目以降のデータ』の範囲が、B3:B100、C3:C100...と限定されるという意味で良いですか? とりあえず推測modeで。B1:E1に検索値を入れたあとに下記マクロ実行です。 Sub try()   Dim s As String      With ActiveSheet     s = "B$3:B$" & .Cells(.Rows.Count, 1).End(xlUp).Row     With .Cells(.Rows.Count, 7).End(xlUp).Offset(1).Resize(, 4)       .Formula = "=INDEX(" & s & ",MATCH(B$1," & s & ",0)-1)"       .Value = .Value     End With   End With End Sub やってる事はINDEX/MATCH関数です。検索値が無ければ#N/Aを返します。

4k3s4r3
質問者

お礼

ありがとうございました。ためさせていただきました。 私なりにつくってみました。動作はするのですが、見ての通り、同じことをコピーしているにすぎません。私の説明不足ですが、動作としてはしたのような動きをしたいのです。これ、もっとスマートにできないでしょうか? 恐縮ですが、#4の方にも同じ内容でお礼を入れさせていただきます。 宜しくお願いします。 Sub test() Dim i As Integer i = 3 Do Until Cells(i, 1) = "" If Cells(i, 2).Value = Range("B1").Value Then Range("G65536").End(xlUp).Offset(1) = Cells(i - 1, 2) End If i = i + 1 Loop i = 3 Do Until Cells(i, 1) = "" If Cells(i, 3).Value = Range("C1").Value Then Range("H65536").End(xlUp).Offset(1) = Cells(i - 1, 3) End If i = i + 1 Loop i = 3 Do Until Cells(i, 1) = "" If Cells(i, 4).Value = Range("D1").Value Then Range("I65536").End(xlUp).Offset(1) = Cells(i - 1, 4) End If i = i + 1 Loop i = 3 Do Until Cells(i, 1) = "" If Cells(i, 5).Value = Range("E1").Value Then Range("J65536").End(xlUp).Offset(1) = Cells(i - 1, 5) End If i = i + 1 Loop End Sub

  • ingenium
  • ベストアンサー率71% (5/7)
回答No.2

すみません、No.1です。 「=IF(B2=B$1,B1,0)」 の間違いです。2つ目のBの前に$があるとJ列までコピーしたときにおかしくなってしまいます。

4k3s4r3
質問者

お礼

こんばんは。関数でもできますね。 今回はVBAで知りたいと思っています。二回にわたりありがとうございました。

  • ingenium
  • ベストアンサー率71% (5/7)
回答No.1

質問の意図をちゃんと理解できていなかったら申し訳ないのですが・・・ G2に「=IF(B2=$B$1,B1,0)」を入力して、J列までと表の下のほうまでドラッグでコピーすればいいのではないでしょうか。

関連するQ&A

  • エクセル マクロでセルを自動移動

    例1のようになっているエクセル表があります。 データは右方向、下方向へ増えます。 Cの列以降は4つ単位でしかデータは増えません。 それを例2の表のように列A,Bのデータはそのままに Cの列以降の4つのセルを区切りに下の行に移動して、 空白の列まで言ったらA2の行以降を最後の行まで繰り返しするという マクロを書くことは可能でしょうか。 出来ましたらそのマクロを教えてください。 例1 A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 G3 H3 I3 J3 K3 L3 M3 N3 例2 A1 B1 C1 D1 E1 F1 A1 B1 G1 H1 I1 J1 A1 B1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 A2 B2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 A3 B3 G3 H3 I3 J3 A3 B3 K3 L3 M3 N3

  • Excelでマクロを使用した削除に関して

    マクロ初心者です。 Excelにて、以下のような表データがあるとします。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50  a   b   c   d 3行  51  e   f    g   h    4行  52  i    j    k   l この表の中で、A列と1行目の値が同じになる交点となるセルの値"以外"を 削除して以下のように表示させたいのですが、 その方法がわかりません。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50      b       3行  51  e          h    4行  52          k    単純な行削除・列削除ではないため、 頓挫しています。お知恵を拝借したく、よろしくおねがいします。

  • エクセルVBAでのまとめ計算

     初めまして、よろしくお願いします。 データーで    A      B     C     D      E ・・・ 1              5     7      2 2              3     7      0 3 4              6     3      6 5              2     8      3 6              0     3      4 ・     ・      ・      ・      ・ ・     ・      ・      ・      ・ 100             3     4      5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。

  • EXCELの関数について

    いつもお世話になってます。ありがとうございます。 excelの関数についてお聞きしたいことがあり質問しました。      A列 B列 C列 …        a   c   e  g  i 1行 2日 ○  △ □ ● ■ となっているデータを      A列 B列 C列 …      a   b   c  d   e  f  g  h  i … 1行 1日 2行 2日 3行 3日 こんなシートに自動的に打ち込めるようにしたいのです。      A列 B列 C列 …      a   b   c  d   e  f  g  h  i … 1行 1日 2行 2日○    △    □    ●    ■ 3行 3日 が完成図イメージです。 一番上の色々なデータから表を完成させたいのですがどうすればできるでしょうか。 vlookupやhlookupでは一行ずつの打ち直しが必要になってしまいます。 よろしくお願いします。

  • エクセルVBA/抽出・貼付け

    下記を行いたいのですが、どのようなコードになるのでしょうか? シート001(入力用) (1)A1~A50、B1~B50、C1~C50、D1~D50  に数値、E1~E50に文字列 (2)F1~F50、G1~G50、H1~H50、I1~I50  に数値、J1~J50に文字列 ※空白行混在 シート002(計算用) シート001に作ったコマンドボタン:クリックにより、 シート002を表示させ、A1~E100に、 シート(1)のA1~E50とF1~J50の空白行以外を連続して 反映させたい。並べ替え用など別シートを用いずに、 VBAコード内で処理したい。

  • エクセル:複数セルからの参照

    お世話になります。 A,B,C列にデータが入っています。 D,E,F列に参照のためのデータがあります。 A,B,C列はそれぞれD,E,F列に対応しています。 A,B,C列と同じ並びのデータが入っている行をD,E,F列から探し、その隣のG列の値をH列に返す。 D,E,F列の並びが重複する行はありません。 A,D列は場所の名前、B,C,E,F列には数字が入っている。 例) A1に事務室 B1に20 C1に3 が入っているとする。 D/E/F列が 事務室/20/3 の並びになっているのが10行目の場合、H1にG10のセルの値を返す。 この場合、H列にはどんな計算式を入れておけばよいのでしょうか? A,B,C列と同じ並びのデータがD,E,F列で見つからない場合は空白をH列に返す。 ちなみにD/E/F列が 事務室/20/3 の並びになっている行は10行目しかないです。 よろしくお願いします。

  • VBA,二つのExcelのsheetにデータ保存

    VBA初心者です。 皆様のお力をお貸し頂きたく質問させて頂きます。よろしくお願いいたします。 質問内容は、下記になります。 Excelのsheet1には、縦列A,B,C・・・とデータが入っております。 sheet1の例 A B C sheet2は、入力するsheetです。 今回はA列の3行目からとします。 問題は、sheet1の縦の列をA,B,C,Dとすればデータの更新は、出来るのですが sheet1のデータのA,B,C一つ飛んでEまた一つ飛んでGという感じでsheet1のデータを 飛ばしてsheet2に表示、更新(保存)をしたいと思います。 ですので、sheet2のA列の3行目からA,B,C,飛んでE飛んでGとsheet1からデータを 表示させ、さらにsheet2の入力値が変更されると、sheet1のデータが入っている A,B,C,E,Gに更新される仕様です。 sheet1(データが入っています) A , B , C , E , G , 値1 , 値2 , 値3   , 値4 , 値5 sheet2(入力する、入力したデータは、sheet1へ更新される) A列 3行目 、sheet1の値1(A列)が入ります。 4行目 、sheet1の値2(B列)が入ります。 5行目 、sheet1の値3(C列)が入ります。 6行目 、sheet1の値4(E列)が入ります。 7行目 、sheet1の値5(G列)が入ります。 以上です。申し訳ございませんが、ご教授よろしくお願いいたします。

  • excel  複数行をまとめる 一括変換

    データ整理で困っております。 皆様のお知恵を拝借したくお願いいたします。 EXCELシートで次のようなデータがあります。   A B C D E F G H I J K 1 1 あ い 2  う え 3  お か 4  き く 5  け こ 列はA,B,Cのみにデータがあります。 行は1~5にあります。 A1は連番で数字があります。 この5行のデータが400近くあります。(約2,000行) このシートが10ほど存在します。 これらのシートを次のように1行に変換したいのです。   A B C D E F G H I J K 1 1 あ い う え お か き く け こ 2  3  4  5  行2~5はブランクのままでもかまいません。 何卒よろしくお願いいたします。

  • エクセルVBAについて教えてください

    エクセル2003 シート1     A       B      C 1  3月1日 A 100     *A列はカレンダーコントロールより選択としています 2  4月1日 B 100 3  3月1日 C 200     *B列はコンボボックスより選択としています 4  3月1日 D 200 5  4月1日 E 300     *C列は直接入力としています 6  4月1日 F 300 7  3月1日 G 100 8  4月1日 H 200 9  3月1日 I 200 10  4月1日 J 100 上記シート1の表のC列を下記シート2のC列に条件集計する シート2    A       B       C 1  3月1日   A~E     500    *選択した日付ごと及びA・B・C・D・Eの集計  2  3月1日   F~J     300    *選択した日付ごと及びF・G・H・I・Jの集計     3  4月1日   A~E     400    *選択した日付ごと及びA・B・C・D・Eの集計    4  4月1日   F~J     600    *選択した日付ごと及びF・G・H・I・Jの集計  すいませんが上記コードを教えてください 困ってます よろしくお願いします      

  • エクセルのvbaの質問

    a b c d e f g h i j k l m n 1 p1 p2 p3 2 s1 s2 s3 s4 s1 s2 s3 s4 s1 s2 s3 s4 3 あ い う お え い あ う お え い 4 10 25 20 40 25 50 10 30 20 15 17 5 6 7 p1 p2 p3 8 =a3 =b3 =c3 =d3 9 =a4 =b4 =c4 =d4 こんな感じでデータが入ってます。 p1の内訳がs1からs4という感じです。 で、a7からc3にp1,p2,p3とありますが、これをクリックしたら、 またはa7にp1とかp2と入力したら、a8からd9にそれぞれの内訳が参照されるようなマクロを組みたいのです。 どうか教えてください。 見づらいですね。 データはa1,f1,k1にそれぞれp1,p2,p3 a2からd2,f2からi2,k2からn2にそれぞれs1,s2,s3,s4 a3あ,b3い,c3う,d3"",e3"",f3お,g3え,h3い,i3あ,j3"",k3う,lお, m3え,n3い a3 10,b3 25,c3 20,d3 "",e3 "",f3 40,g3 25,h3 50,i3 10,j3 "",k3 30,l3 20,m3 15,n3 17 a7 p1,b7 p2,c7 p3 a8からd9の"=a3"から"=d4" です。 3行目、4行目は必ずしも全部埋まってなくて、スペースが入る場合があります。 よろしくお願いします。

専門家に質問してみよう