• ベストアンサー

エクセルVBAで表の合体をさせたい。

エクセルにVBAってのがあると知って勉強を始めたばかりの者です。よろしくお願いいたします。 VBAで次のようなことをしたいのですが、いい方法が思いつきません。VBAに詳しい方教えて頂けないでしょうか? シートが2枚あります。 1つのシートには、 A-101,  ,  ,あ1 A-102,  ,  , A-103,  ,  ,あ2 というデーターが書き込まれています。 2つ目のシートには、 A-101-1,  , A-101-2,  , A-101-3,  , A-102-1,  , A-102-2,  , A-103-1,  , A-103-2,  , A-103-3,  , A-103-4,  , と書き込まれています。 そこで、 A-101-1,  ,あ1 A-101-2,  ,あ1 A-101-3,  ,あ1 A-102-1,  , A-102-2,  , A-103-1,  ,あ2 A-103-2,  ,あ2 A-103-3,  ,あ2 A-103-4,  ,あ2 というふうに合体させたいのですが、いい方法ないでしょうか? 一つ目のループは、4列めのセルにデータが書き込まれているかを調べて書き込まれていたら、 1列目のセルの値が含まれる2枚目のシートのセルを全てループし、該当するものがあれば書き込むって 感じかなぁ?と思うのですが、実現には、単純にループを行う力業しかないのでしょうか? いい案があれば、教えてください。宜しくお願いいたします。 ","は、セルの区切りを表しているつもりです。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >エクセルにVBAってのがあると知って勉強を始めたばかりの者です。 もし、VBAの勉強でしたら、あまり、最初から、ワークシートの処理は手は出さないほうがよいです。なかなか、難しいです。オブジェクトという範囲が、はっきり見えないうちに手を出すと、何をやっているかわけが分からなくなります。純粋に、VBAの中での処理を目指したほうが、VBAの理解や上達は早いです。 ExcelのVBAは、Cells と Range, Sheet と Worksheet, Workbook と Window と、同じ範疇なのに、その扱いやその親(Parent)のオブジェクトの違うものが、交互に現れます。初級レベルの人が行うミスとしては、Rangeの中で、Cells を用いるときに、親オブジェクトを忘れるということです。だから、動く時とそうでなくエラーを出すときがあるのです。 かなりプログラミングを知っているつもりでも、Excel独特の癖を知っていないと、おかしなマクロを書いてしまいます。エラーを出すたびに少しずつ覚えるといっても過言ではないほど、とてもややこしいのです。 以下は、初級レベルと中級レベルのマクロの書いておきますので、少し、考えてみてください。 なお、Sheet1 のC 列のデータを Sheet2 のD列に写す、と読みましたので、もし違うようでしたら、マクロの中を直してください。 初級のポイントは、Like演算子を使いました。中級のポイントは、オートフィルタを使いました。初級と中級の差は、完成スピードの差として現れます。しかし、私たちが感知できるレベルでは、それほどは違わないはずです。 '基本的に標準モジュール '------------------------------------------------ Sub TestValuesCopy()  Dim Sh1 As Worksheet  Dim Sh2 As Worksheet  Dim i As Long  Dim j As Long  Dim LastRow1 As Long  Dim LastRow2 As Long    Set Sh1 = Worksheets("Sheet1")  Set Sh2 = Worksheets("Sheet2")    Application.ScreenUpdating = False  LastRow1 = Sh1.Range("A65536").End(xlUp).Row 'シート1のA列-最後のセルを探す  LastRow2 = Sh2.Range("A65536").End(xlUp).Row 'シート2のA列-最後のセルを探す    For j = 1 To LastRow1   For i = 1 To LastRow2    If Sh2.Cells(i, 1).Value Like Sh1.Cells(j, 1).Value & "-#*" Then    'Like 演算子で比較します。# は、数字、* は、0回以上の何の文字も含む     Sh2.Cells(i, 1).Offset(0, 3).Value = Sh1.Cells(j, 1).Offset(0, 2).Value    End If   Next i  Next j  Application.ScreenUpdating = True  Set Sh2 = Nothing  Set Sh1 = Nothing End Sub '---------------------------------------------------- Sub UpperLevelValuesCopy()  Dim r1 As Range 'シート1のA1の範囲  Dim c As Range    Application.ScreenUpdating = False    With Worksheets("Sheet1")   Set r1 = .Range("A1", .Range("A65536").End(xlUp))  End With    With Worksheets("Sheet2")   'ダミーのタイトル(オートフィルタ用のタイトル行)   If .AutoFilterMode = True Then    .AutoFilterMode = False   Else    .Range("A1").EntireRow.Insert    .Range("A1").Value = "Nos"   End If   'オートフィルタを準備   With .Range("A1").CurrentRegion.Columns(1)    For Each c In r1     If VarType(c.Value) = vbString And Not IsEmpty(c.Offset(, 2)) Then     'オートフィルタを使用する      .AutoFilter Field:=1, Criteria1:=c.Value & "-*"      .Offset(, 3).Value = c.Offset(, 2).Value     End If    Next   End With   'オートフィルタを解除   .AutoFilterMode = False   .Range("A1").EntireRow.Delete  End With  Application.ScreenUpdating = True    Set r1 = Nothing End Sub '----------------------------------------------------

Excel_VBA
質問者

お礼

ご丁寧に、2例もサンプルを提示していただき有難う御座います。 がんばって、教えて頂いた内容を活用していきたいと思います。

その他の回答 (3)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

>実現には、単純にループを行う力業しかないのでしょうか? >いい案があれば、教えてください。 ということからして「単純なループでの方法」は知っているから、 それ以外の方法を知りたいということですよね? ですが、「勉強を始めたばかり」であれば基本であるその 「単純なループ」のコードをアップして、 それをベースに話しを進めた方がより勉強になると思いますが、 どうでしょう。  

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

こんなマクロではどうでしょう。アルゴリズム大会になりそうですが… Sub Matching() Dim LastRow1, Lastrow2, idxR As Long, res Dim Sheet1 As Worksheet  Set Sheet1 = Worksheets("Sheet1")  LastRow1 = Sheet1.Range("A65536").End(xlUp).Row  With Worksheets("Sheet2")   Lastrow2 = .Range("A65536").End(xlUp).Row   For idxR = 1 To Lastrow2    res = Application.Match(Left(.Cells(idxR, 1), 5), Range(Sheet1.Cells(1, 1), _      Sheet1.Cells(LastRow1, 1)), 0)    If IsNumeric(res) Then     .Cells(idxR, 3) = Sheet1.Cells(res, 4)    End If   Next idxR  End With End Sub マクロはALT+F11でVBE画面を開き、「VBAProjectエクスプローラのシート名右クリック」→「挿入」→「標準モジュール」で表示される画面にペーストして下さい。実行はALT+F8を押して、マクロ名を選択します。

  • TTak
  • ベストアンサー率52% (206/389)
回答No.1

二つ目のシートの3列目の1行目( [C1] のセルかな)に、 =IF(INDEX(Sheet1!C$1:C$3,MATCH(LEFT(A1,5),Sheet1!A$1:A$3,))=0,"",INDEX(Sheet1!C$1:C$3,MATCH(LEFT(A1,5),Sheet1!A$1:A$3,))) と入力します。 セルC1を選択した状態で、(選択セルは太枠で表示されていますね) 太枠の右下の■のとろにカーソルを合わせると、カーソルが+に変わるので、そこでダブルクリックして、下方向にコピーします。 これをマクロで記録すればできあがりです。 ただ、この記録は行数が変わった時に対応できませんので、 例えば、A列の際下段が何段目か?を得るために、 Range(Cells(ActiveSheet.Rows.Count, 1) .End(xlUp).Address).Row を用いても良いでしょう。"1"は列数です。 すなわち、このマクロにループは不要です。 VBAの勉強を始められたとのことですが、がんばってください(^^)

関連するQ&A

  • Excel VBAを使って会員検索

    Sheet1のA列に会員番号、B列に氏名、C列にフリガナ、D列に住所といったデータがあります。 Sheet2のA列に会員番号のみがあります。 この2つのデータを照合して、一致した場合のみ、Sheet1の該当会員データの横のセルに“一致”もしくは“1”などの値(上の例だとSheet1のE列に)を入力できるようなVBAを組みたいのですが、教えていただけますでしょうか?

  • EXCEL VBAで複数のシートの中から該当値を検索する方法について

    すいません、EXCEL VBAで複数のシートの中から該当する値を検索する方法について教えていただきたいことがあります。      Sheet1              A列   B列  C列   1行  11  りんご  31  2行  12  バナナ  32  3行  13  みかん  33  4行  14  ぶどう  34   ・   ・   ・     ・        Sheet2              A列   B列  C列   1行  31  すいか  11  2行  32  レモン  12  3行  33  パイン  13  4行  34  ざくろ  14   ・   ・   ・     ・ というデータが入っているブックについて 「全部のシートを検索し、A列に11の値が入っているセルの行数及びその行のB列の値」 をSheet1のD1セルとE1セルにそれぞれ返す方法はどうしたらよろしいんでしょうか。 For Each を使うのではないかと思って色々やってみたのですが、どうも上手く作動してくれません。 よろしくお願いいたします。

  • エクセルVBAで困ってます。

    エクセルVBAで困っています。 データ入力済みのシートが2つあります。 シート名を「Sheet1」「Sheet2」とします。 「Sheet1」のA列のデータが「Sheet2」のA列のデータと一致した時に それぞれのシートのセル番地を取得したいのですが出来ません。 教えて下さい。 データの並び順は「Sheet1」と「Sheet2」で異なります。

  • Excel VBAでの値の比較

    お世話になります。 Excel VBAでの値の比較方法についてご教授頂きたく存じます。 下記のような値がセルに入っていると仮定しまして、 セルA1とセルG1を比較する セルA2とセルG2を比較する セルB1とセルH1を比較する セルB2とセルH2を比較する 値が違う場合のみ、A列、又は、B列のセルの色を変更したいのですが・・・。 下記例の場合であれば、B1とA2がセルの色が変われば良いです。    A列 B列    G列 H列 1行  1  1     1   2 2行  2  2     3   2 VBAで実現したいと思います。 何卒、宜しくお願い申し上げます。

  • エクセルのVBAで

    ある列(仮にA列とします)の最終行がA30であり A25までは空白だとします。 この時に、A30の値をA29~A25=データの入力されていないセルに入力(コピー)するにはVBAでどのように記述すればいいのでしょうか? 最終行から、上にその最終行の値をデータの入力されているセルに達するまで入力(コピー)したいのですが。 分りづらい表現で申し訳ありませんが、よろしくお願い致します。

  • Excel 任意の行数・列数のデータを合体VBA

    VBAで、Sheet1のデータの最終行に Sheet2の同じ並びのデータを続けてくっつけ、 Sheet3に(Sheet1とSheet2のデータが)連続した状態をつくる場合のVBAの書き方を教えてください。 ちょうどSheet1のブルーの範囲(ただし最終行はn行=データは様々で最終行は不特定だが最終行の下にはもうデータはない、最終m列の右にはまだデータが膨大にあるが、今回はA~m列(ここではA~AX列と指定可能)をコピーしたい) に Sheet2の黄色い範囲(ただし最終行はn行=データそれぞれで不特定だが最終行の下にはもうデータはない、最終m列はSheet1と同じ構成=A~AX列) をくっつけたい。 ・アウトプットはSheet3。 (Sheet1とSheet2はいじらずそのまま残す) ・コピーして貼り付ける(複写する)のは、値だけ (罫線とか計算式は不要) です。 よろしくお願いします。

  • vbaでvlookup

    エクセルのVBAについて。 指定した範囲の中から検索条件に一致したデータを検索し、取り出してくれる関数vlookup をVBAで実現したいのですが、 目標として、エクセルのセル(列)に、値を入力されているとします。 VBAを実行するボタンをクリックすると、、、 その値に対応する文字列(事前に用意)をその値の右のセルに自動で入力させたいです。 このVBAを作ることが目標です。 vbaでvlookupを実現でなくても、それよりも簡単な方法があれば教えていただきたいです。 お手数ですが、よろしくお願いします。

  • Excel VBA 値取得について

    お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。

  • エクセルVBAでセル選択

    エクセル2000でリストを作成し、VBAで編集しようとしています。 A列に入力されているコードの先頭に「’」をつけて文字列とするための関数をB2のセルからA列のデータが入力されている最後のセルの隣までコピーしたいと思っています。 A列の最終セルを取得するVBAは分かったのですが、その値をB列の選択範囲として使用する方法がわかりません。 エクセルVBAは全くの初心者です。 どなたか教えてください!

  • エクセルVBAについて

    エクセルVBA初心者です。 以下のような処理をしたくて、色々な質問等を見て組み合わせて動かしてみたものの、なかなかうまくいかず困っております。アドバイスいただけないでしょうか? 「Sheet1」に以下のようなデータがあります。 <A列> <B列> <C列> ok59  886 ok88 ok70 777 ok75 okGG 478 ok66 ok97 358 ok58 ok69 764 ok47 ok39 368 ok40 okGG 794 ok68 ok85 463 ok75 ・    ・ ・ ・    ・ ・ A列とC列にはそれぞれ「ok+2桁の数字or文字」が入っています。 B列は特に今回は使わないデータですが、数字が入っています。 やりたいことは以下の通りです。 A列に「GG」を含む文字列(実質okGGしかない状態です)が出てきたとき、 その1つ下の行のA列とC列のセルをピックアップし、背景色をピンク色にします。 上の例だと、A列は「ok97」と「ok85」、B列は「ok58」と「ok75」のセルが該当します。 さらにピンク色にピックアップしたセルのから、頭の「ok」を除いた数字を3.5倍した数字を、 別のシートに抽出したいのです。 なので、上の例を使用した場合の抽出したデータは以下のようになります。 <A列> <B列> 339.5 203 297.5 262.5 ちょっと複雑なのですが、どのようにするのがよいのでしょうか? また、別シートに抽出したいのですが、 「Sheet1」の特定のセルに日付が入っているので、 できればその日付の名前のシートを作り、そこに抽出できたらなぁ・・・と考えています。 「Sheet1」にデータを貼り付けて、ボタンをポンっとおしたら日付の名前のシートができて、 欲しいデータが抽出されていく・・・というイメージです考えています。 どうぞよろしくお願いします。

専門家に質問してみよう