• ベストアンサー

VBAで列名で判定して列データを取得したい。

Exel2003のマクロで特定の列データを別のシートに貼り付けたいのですが。 初めて、BVAを触るのでどのような命令があるのかさえ把握しきれてません。 流れとしては、以下でよいのでしょうか? (1)列名で判定して列を特定する (2)(1)で特定した列のデータを取得する それとも、一発で出来る関数があるのでしょうか?

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 「特定の列」の条件が判らなければ、列の特定ができませんので、やり方だけ・・・ Sheet1の1行目が項目行になっていて、列方向に色々な項目が入っているとします。 その中の一つの項目をSheet2のA列にコピー&ペーストするコードです。 Alt+F11キー → VBE画面が出ますので画面左下にある「This Workbook」をダブルクリック →  ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim j As Long Dim str As String Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") str = InputBox("抽出したい項目名を入力") If WorksheetFunction.CountIf(ws1.Rows(1), str) Then j = WorksheetFunction.Match(str, ws1.Rows(1), False) ws1.Columns(j).Copy Destination:=ws2.Cells(1, 1) Else MsgBox ("検索項目がありません。") Exit Sub End If End Sub 'この行まで ※ あくまでたたき台ですので、条件等が具体的に判ればもっと適切な回答が得られると思いますよ。 この程度で失礼します。m(_ _)m

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

初心者だろうに、データ実例も挙げて、質問しないから、何のことを言って居るか、正確にわからない。聞くほどのことでもないと効いていることの予想が難しい。 >特定の列 B列とかC列とか考えるのか? その他の指定なのか。例えばデータの最も右の列をとらえたい、なんていうのもあるのだ。 まず単数列か複数列かが肝心。 Range(”A1:B10”).Copy 貼り付けも含めて、の書きかたは Sub test02() Range("A1:A10").Copy Range("H1") End Sub ーー Sub test02() Range("A1:B10").Copy Range("H1") End Sub のようにかけるが、質問者のセルの指定はどうしようとしているのか。 >初心者は「特定の」が好きだが、むしろ、A列の1行目から10行目までとか、1つの場合の記述で説明して、質問し、回答に対し、質問者が類推を働かせて、実際の質問者の場合のコードを作り上げるほうがよかろう。 ーー ここへ質問して有効なのは、VBAの初級を卒業してから。 それまでは、解説書を繰り返し読むか、スクールへ通うこと。 ーー 二ーズがまずあって、勉強もしてないのに、当たろうとしても無理です。 職人仕事でも、初めは、そばで付いて指導する人が必要でしょう。どうしてプログラムだけは、聞いて何とかなるように思うのか。 VBAはすべて他人(マイクロソフト)が作った約束事なのに、ほとんど覚えるほか無いのに。

akaginoyama
質問者

お礼

質問が抽象的で失礼いたしました。 皆様から教えていただいたコード内の命令を一つずつ調べております。 一つずつ動作を確認して時間が掛かってますが。 ほぼ実現できそうです。 本来は基本から勉強するべきでしたがやっつけでこれ1本の急ぎと言う 現実があり不躾な質問申し訳ありませんでした。 質問の回答は、ほぼ得られたました。 あまり、情報が増えると処理しきれないので解決とさせていただきます。 皆様のコードが参考になったのにベストアンサーは1人さましか選べないのが残念です。 お許しください。

全文を見る
すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

たとえば目的の列が「必ず1つある」のか「1つもない場合もある」のか「該当する列は実はいくつもある」のか,そういったそもそもアナタの実際のデータがどうなっているのかを,ご自分で一番によく把握しなくては始まりません。 また「判定」とは一体全体具体的にどういう事なのか,たとえば「データの完全一致」なのか,それとも「セルに色が塗ってある」だとかそういう事を見たいのかといった,「アナタのヤリタイことは一体何ですか」というのもご自分でキチンと理解してからでないと,何も出来ません。 作成例: sub macro1()  dim h as range ’探す  set h = range("1:1").find(what:="abc", lookin:=xlvalues, lookat:=xlwhole) ’見つからないときは終了する  if h is nothing then   msgbox "NOT FOUND"   exit sub  end if ’コピーする(とりあえず1列)  h.entirecolumn.copy destination:=worksheets("Sheet2").range("A1") end sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで列名の取得

    一定でないデータ範囲の最後の列でソートするマクロを作りたいのですが、列名の取得はどうしたらいいのでしょうか ActiveCell.Columnでは列番号になってしまいます。 教えてください。

  • 列名の取得方法は?

    VB6.0 ORACLE10g Win20003Server WinXP開発 よろしくお願いします。 列名(フィールド名称)を取得する方法(SQL)がありましたら、お願いします。 データの内容はわかるんですが、列名(どの列に入っているのか)を知りたいと思っています。 よろしくお願いします。

  • Excel;取得した列データーの使用法

    エクセルマクロで ある列のデーターの最終行を求め、 となりの列の最終行からその行までLOOKUP関数を オートフィルで貼り付け、更にその関数で参照した データーを文字列にして再読込じの負荷を軽減する マクロを考えています。 最終行をもとめるのマクロはよく見ますが、 その使用方法がわかりません。 どうやって代入すればよいのか・・・ マクロの勉強を始めたばかりで、出来れば明日くらいに このマクロを作りたいのですが・・・ お願いします。

  • エクセルVBAで特定文字列の個数を高速に調べたい

    文字列の入っている変数内で特定の文字列(今回はvbCrLf)が何個発生しているかを、高速に調べたいのですが、どのような方法があるでしょうか? 現在以下のことをやっています。 数千件のテキストファイルから特定文字列を検索しています。 検索を高速化するために、テキストファイルをバイナリーモードで1つの変数に読み込み、instr関数で検索しています。 見つかった場合、その位置から前にあるvbCrLfをInStrRev関数で、後ろにあるvbCrLfをinstr関数で位置を調べ、元の変数からmid関数で該当ラインを取り出しています。 検索はこれで可能ですが、特定文字列を調べたinstr関数の戻り値がテキストファイルの先頭からの位置(何桁目)なので、検索した文字列が何行目にあるか分かりません。 変数の検索文字が見つかった位置までの部分でvbCrLfが何個発生しているかが分かれば行数が判定できます。 vbCrLfを調べるinstr関数を何回も繰り返せば行数の判定は可能ですが、もっと高速に(一つの関数・命令で)調べることはできないでしょうか? また他に行数を特定する良い方法があったら教えてください。 よろしくお願い申し上げます。

  • VBA

    基本中の基本かも知れませんが、Wordファイルの特定の位置の文字列をExelファイルの特定の位置のセルに書き込むマクロの作成法を教えて下さい。

  • VBAでB列のファイルパスにリンクを貼りたい

    いつもお世話になっております。 特定のフォルダ内にエクセルファイルが毎月増えていくのですが、このフォルダに入っているエクセルファイルのフルパスの一覧を別のエクセルシートのB列に毎月コピペしています。 月10-20のエクセルファイルがリストに追加されていきます。 この増分のパス(B列)にリンクを貼りたいのです。 B列には既に400件以上のファイルパスが入っているので、毎回上からB列の全部のセルにリンクを貼り直すのではなく、増分(B列の最下行+1行目)以下のセルにリンクを張るBVAを教えて頂きたいのです。 当方教えて頂いたコードとマクロの記録の組み合わせがどうにか出来るレベルなので宜しくお願いします。 但し、B列の140行目迄には空白を含むパス以外の文字が入っています。 パスは141行目以降に空白なく入っていきます。

  • 【VBA】複数シートから抜き出したデータを集約

    【Excel2010】の  ●同一ブック内で、  ●sheet1~9の同一列から、  ●sheet10の任意列へ、  ●データを抜き出して、続けて表示させたい と思っています。 手動オートフィルタや、関数で試しましたが、 作業のたびにかなりの手間になります。 願わくばVBAマクロで対応できればと思っているのですが、 知識不足のため、うまくできませんでした。 具体的な画面も添付させていただきます。 ご教示いただきたく、よろしくお願いいたします。 <補足> sheet1~9のデータ行範囲は作業ごと・シートごとに変わります。 (データ列は固定です)

  • Excel Vba でデータの範囲を知るには?

    Excelを使用していますが、マクロ(VBA)で、シートのデータの範囲を知るにはどうすればよいのでしょうか。  印刷プレビューを行うと、自動的にページ数が求めらていますが、これは、シートのデータの範囲(列及び行の最大値)を判別しているからできるのだと思います。  これを、VBAで行、及び列のMAX値を取得したいのですが、そのメソッド(プロパティ)を知りたいのです。  どなたかご教授ください。

  • VBAでのデータ並び替え、条件判断について

    Excel2003、VBA6.5でマクロに挑戦しているVBA初心者です。 学生時代にプログラムはかじった事があるのですが、マクロは勝手が分からず、 以下のようなマクロを組みたいのですが、そもそもプログラムはどこの ウィンドウに書くのか?という辺りから調べ出す始末のため、皆様の お知恵をお借りしたく、投稿しました。 【目的】 Sheet1に貼り付けられたデータを、精査(並び替え、条件判断)し、結果をSheet2に出力させたい。 Sheet1(入力データ) 1行目は項目名 データA1,データB1,データC1,データD1,データE1 データA2,データB2,データC2,データD2,データE2 … … データA11,データB11,データC12,データD11,データE11 データA12,データB12,データC12,データD12,データE12 ※データEのみ、整数型で後は文字データになります。  また行数というか、データ量は20~30行程度を想定してます。 Sheet2(出力データ) 1行目は項目名 日付,データB1+データC1の文字列を結合,固定値2,条件判断結果1(データD1より条件判断) 日付,データB2+データC2の文字列を結合,固定値2,条件判断結果2(データD2より条件判断) … ※Sheet1のデータ1行は、すべてが必要でありません。一部のみがあればOKです。  上記の例だと、Sheet1のデータAとEはSheet2では不要です。 ※日付…マクロを走らせた日付をMM/DD形式で出力させたい ※条件判断結果…(データD1がAMだったら09:00、PMだったら13:00、PM2だったら15:00という値を返すようにしたい) 流れを考えてみましたが、 1)データ型を宣言して、 2)1行を配列に読み込む 3) a)データB列、C列の文字列を結合  b)データD列の条件分岐 4)配列からデータを書き出す 5)Sheet1の行が空白だったら処理完了 という感じかと思っているのですが、具体的にマクロにできず(関数をうまく使えず)、困っています。 Findメソッドか、Vlookupあたりで必要になるデータだけ、Sheet1で検索した結果をSheet2に埋めて 行く形でもできるのかな、とも思いましたが、こちらも具体的にマクロにできません。 特に処理スピードにこだわるわけではないですが、あとあと見返して勉強およびメンテできるような、 シンプルなカタチ(1行にコマンドを詰め込んだ複雑な形ではなく)にしていただけると助かります。 どうぞご教授いただけませんでしょうか。 よろしくお願いいたします。

  • マクロである文字以降の文字列を取得するには?

    2枚のシートの一部ずつを条件に合わせ取り入れ新シートを作るマクロを作っています。 そこで1つ問題な列があります。 D列の各セルには「,」で区切られて2つのデータが入っています。 123 , 456 55 , 67 8 , 1 678 , 9      の様な形です。 「,」の両側にはスペースが入っています。 このうちの「,」の右側の数値を変数に入れたいんですが、文字数が行によって違います。 右側がスペースを含めて3文字に決まっているなら、   変数 = Right(Cells(i, 4), 3) の様な感じになりますが、一桁から三桁まであります。 こういう場合、「,」の右側を取得する関数とか有るんでしょうか? それとも他の方法を取るんでしょうか?

専門家に質問してみよう