• 締切済み

VBAのコードを教えていただけないでしょうか。

VBAのコードを教えていただけないでしょうか。 概要はリスト形式のデータの複数の条件に合うデータをオートフィルタで抽出して、その結果を別ファイルにする、というものです。用途は建設業のデータ入力です。 リスト形式のシート「記入用」は次のようになっています。 ・B5:Qはデータを記入する領域。(Qの下の行はどれだけになるかわかりませんが、今は500ぐらいまです) ※5行目は見出し行です。 ・C3に仕入れ先の会社を入力 ・E3・F3はそれぞれ年月日を入力して、検索するときに何月何日から何月何日の間、というようにするためのセルです。E3が調べたい年月日の始めの日、F3は調べたい年月日の終わりの日です。 ・「支払い月」の列はB列 上記の調べたい年月日の対象となるデータです。 ・「仕入先」はF列 エクセルは2003を使っていますが、2007でも使用します。 以上の条件ですが、実現したいことは、 (例) ●2010/4/1から2010/7/31までの間で、仕入先が〇〇工務店のデータを抽出 ●その抽出結果に名前をつけて別ファイルで保存。その保存名は検索した年月日(from to)+仕入先名  この例の場合、[20100401~20100731 〇〇工務店]というファイル名 こんな夢のことができるコードを教えていただけないでしょうか。周りにはエクセルができる人はいますが、このようなVBAのコードが書ける人はおらず、なかなか進みません。 どなたかよろしくお願い致します。

  • wait4u
  • お礼率45% (619/1365)

みんなの回答

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

で。 質問者さんが自分でメンテできるようになるにはどうすればいいかという話でしょうか。 ことExcelVBAに関しては 1)「新しいマクロの記録」の活用 2)VBE(VisualBasicEditor)、調べたい語句にマウスキャレットあてて[F1]キーでのHELPクイックアクセス 3)VBE[F8]キーでのステップ実行 4)VBE[Alt][v][s]の[ローカルウィンドウ]で変数調査 5)google検索 あとは「時間」と、労を厭わない「やる気」、があれば大抵の事は自力解決できるはず。 ...って思ってます。 いろいろと試行錯誤しながら自分でやってみる事が大事。 とも。 まずはそのコードが何をやってるか理解するところからですね。 その過程で >[フィルタオプション]を使うと別Bookにもダイレクトに抽出できるので調べてみると良いです。 http://www11.plala.or.jp/koma_Excel/contents6/mame6042/mame604201.html http://support.microsoft.com/kb/402757/ja などのサイトも参考になるでしょう。 マクロ、VBAについて初歩から系統だてて身につけていきたい場合は 書籍を探すのもいいですし http://excelvba.pc-users.net/ http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/index.html http://www.asahi-net.or.jp/~ef2o-inue/top01.html など、基礎から学べるサイトもいっぱいあります。 実務に即して必要性に駆られ、自ら学ぶ姿勢があり、『実践』すれば 何事も身についていくものだと思います。 では。 がんばってください :)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.7

>周りにはエクセルができる人はいますが、 >このようなVBAのコードが書ける人はおらず、なかなか進みません。 作成してもらったこのコードを今後どう保守していきますか?。 使用状況、条件が変わったりした場合対処できますか?。 もしここで回答者にもあなたにも何か見落としがあり、 それが重大なものなら仕事に支障があり取引先との損害賠償になりかねない。 自分ではなく他の人に作ってもらうという手段を選んではいるものの この処理内容、結果に責任をもってください。 少なくともコメントを付与していただくなど、 何かあったときは回答者でなくあなた自身で解決できるように 心掛けましょう。 > end-uさんありがとうございます。これはすごいです!! 感心している場合ではないでしょう。 なんかこういう気でいるときが一番不具合を見落としそうなので コメントさせてもらいました。

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

ぁ、失礼orz >「支払い月」の列はB列 上記の調べたい年月日の対象となるデータです。    AA  AB   AC 1 仕入先 支払い月  支払い月 2 =C3   =">="&E3 ="<="&F3 でお願いします。 もしくは方針をちょっと変えて Q1:Q2 を作業列に。 特に事前設定は要りません。 Sub Macro2()   Const xlExcel8 = 56 'ver2007での2003互換FileFormat   Dim wb    As Workbook   Dim data   As Range   Dim criteria As Range   Dim fName  As String   Dim ver   As Long   Dim x    As Long   On Error GoTo extLine      With ThisWorkbook.Sheets("Sheet1")     '最終行     x = .Cells(.Rows.Count, "F").End(xlUp).Row     'データ範囲     Set data = .Range("B5:Q" & x)     '検索条件範囲     .Range("Q1").ClearContents     .Range("Q2").Formula = "=AND($C$3=F6,$E$3<=B6,B6<=$F$3)"     Set criteria = .Range("Q1:Q2")     '抽出後Book名     fName = Format(.Range("E3").Value, "yyyymmdd~") _        & Format(.Range("F3").Value, "yyyymmdd ") _        & .Range("C3").Value   End With   '新規Book   Set wb = Workbooks.Add(xlWBATWorksheet)   '[フィルタオプション]   data.AdvancedFilter Action:=xlFilterCopy, _             CriteriaRange:=criteria, _             CopyToRange:=wb.Sheets(1).Range("A1"), _             Unique:=False   '抽出なし   If wb.Sheets(1).UsedRange.Rows.Count = 1 Then     MsgBox "no data"     wb.Close False   Else     'Versionチェック     If Val(Application.Version) < 12 Then       ver = xlNormal     Else       ver = xlExcel8     End If     wb.SaveAs Filename:=ThisWorkbook.Path & "\" & fName, _          FileFormat:=ver   End If extLine:   Set criteria = Nothing   Set data = Nothing   Set wb = Nothing   If Err.Number <> 0 Then     MsgBox Err.Number & " : " & Err.Description   End If End Sub

noname#192382
noname#192382
回答No.5

すでに幾つかの回答がありますが、私も答えさせてください。マクロで組みました。データ数をデータとして与えるようにしています。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2010/8/20 ユーザー名 : ' Dim mygyo As Integer, mygyo2 As Integer, gyoend As Integer 'シート2にタイトルコピー Sheets("Sheet1").Select Range("B5:Q5").Select Selection.Copy Sheets("Sheet2").Select Range("B5:Q5").Select ActiveSheet.Paste '抽出条件をシート2にコピー Sheets("Sheet1").Select Range("C3:F3").Select Selection.Copy Sheets("Sheet2").Select Range("C3:F3").Select ActiveSheet.Paste '最終データを入力 gyoend = 10 '条件に合うデータをシート2にコピー mygyo2 = 6 For mygyo = 6 To gyoend Sheets("Sheet1").Select If Cells(mygyo, 2) > Cells(3, 5) And Cells(mygyo, 2) < Cells(3, 6) And Cells(mygyo, 6) = Cells(3, 3) Then 'If Cells(mygyo, 6) = Cells(3, 3) Then Range(Cells(mygyo, 2), Cells(mygyo, 15)).Select Selection.Copy Sheets("Sheet2").Select Range(Cells(mygyo2, 2), Cells(mygyo2, 15)).Select ActiveSheet.Paste mygyo2 = mygyo2 + 1 'MsgBox mygyo.Value Else End If Next '

wait4u
質問者

お礼

ありがとうございました。こちらもすごく参考になりました。

  • aloha8761
  • ベストアンサー率12% (11/89)
回答No.4

Sub 抽出() Dim i As Long Dim atai As Variant i = 6 Do Until Cells(i, 2).Value = "" If Cells(i, 2).Value >= 開始セル値 And cell(i, 2).Value <= 終了セル値 And Cells(i, 6).Value = 仕入れ先のセル値 Then atai = Range(Cells(i, 2), Cells(i, 最後のフィールド行数).Value) '転記先のセル範囲をここに書くべし! End If i = i + 1 Loop End Sub これでataiにセル範囲のデータが格納されました! 日本語で書いたところは自分でセル値をあてがってください! 日付の判定はシリアル値で行います! これをあとどう使うかです!

wait4u
質問者

お礼

ありがとうございました。大変参考になりました。

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

[フィルタオプション]を使うと別Bookにもダイレクトに抽出できるので調べてみると良いです。 抽出条件用の作業エリアとして未使用セルを使います。 仮に AA1:AC2 とします。    AA  AB   AC 1 仕入先 年月日  年月日 2 =C3   =">="&E3 ="<="&F3 条件とする列の項目名を1行目に入力。 それぞれの条件を入力したセルを参照する数式を2行目に入力。 あとは Sub Macro1()   Const xlExcel8 = 56 'ver2007での2003互換FileFormat   Dim wb    As Workbook   Dim data   As Range   Dim criteria As Range   Dim fName  As String   Dim ver   As Long   Dim x    As Long   On Error GoTo extLine   With ThisWorkbook.Sheets("Sheet1")     '最終行     x = .Cells(.Rows.Count, "F").End(xlUp).Row     'データ範囲     Set data = .Range("B5:Q" & x)     '検索条件範囲     Set criteria = .Range("AA1:AC2")     '抽出後Book名     fName = Format(.Range("E3").Value, "yyyymmdd~") _        & Format(.Range("F3").Value, "yyyymmdd ") _        & .Range("C3").Value   End With   '新規Book   Set wb = Workbooks.Add(xlWBATWorksheet)   '[フィルタオプション]   data.AdvancedFilter Action:=xlFilterCopy, _             CriteriaRange:=criteria, _             CopyToRange:=wb.Sheets(1).Range("A1"), _             Unique:=False   '抽出なし   If wb.Sheets(1).UsedRange.Rows.Count = 1 Then     MsgBox "no data"     wb.Close False   Else     'Versionチェック     If Val(Application.Version) < 12 Then       ver = xlNormal     Else       ver = xlExcel8     End If     wb.SaveAs Filename:=ThisWorkbook.Path & "\" & fName, _          FileFormat:=ver   End If extLine:   Set criteria = Nothing   Set data = Nothing   Set wb = Nothing   If Err.Number <> 0 Then     MsgBox Err.Number & " : " & Err.Description   End If End Sub こんな感じです。 シート名などは適宜変更してください。

wait4u
質問者

お礼

申し訳ありません。私の認識違いでした。ばっちりです。 もう少し確認させてくださいね。ありがとうございます。

wait4u
質問者

補足

end-uさんありがとうございます。これはすごいです!! 一点、実行してみたところ、結果が指定期間が抽出されず、仕入先名だけ抽出されているみたいです。 私の設定の勘違いかわかりませんが・・・

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

対先ほど抜き出しの質問に答えました http://okwave.jp/qa/q6123068.html の#3です。 マクロの記録を開始して、そこに書いてある操作を、質問者の場合に合わせて行い、マクロの記録を採ってください。 ここで今後変えるべき個所はコードを修正してください。 その場合、最低、元データの範囲はEnd(xlup).RowやUsedRange、CurrentRegionを調べて勉強のこと。 他ファイルへのコピー貼り付けは、シートタブで右クリックし、「シートの移動またはコピー」で「移動先」を他ブックを指定し、「コピーを作成する」を択ぶ。 この操作のマクロの記録を採ってください。 ーー 条件による、抜き出し方法(コード)は色々なロジックがが考えられるが、エクセルにあるものを使うのは、安定している(バグがない)。 質問者は、VBAにあまり詳しくないようなので、色々書かない。 ーー 外に年月日の前後は、エクセルではセルの値は、日付シリアル値という正の整数なので、そういう考えで 対処すること。日付が文字列だと変換してからの話になる。 http://www11.plala.or.jp/koma_Excel/contents6/mame6043/mame604303.html に日付の前後の設定例が載っている。「より小さい」は日付列条件列を別に設ける(AND条件だから) 例 D1:E2 日付 日付 >2010/8/2 <2010/8/7

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

特定の日付以上かる特定の日付以下のフィルタを行った操作をマクロの記録で記録すれば基本的なコードが取得できますが、具体的にどの部分がわからないのでしょうか? 簡便には、条件の部分をセルの値に置き換えればよいと思います。 このままの質問では、まさにマクロコード全体を作成する丸投げ質問のように思われますが、このようなQ&Aサイトはプログラム作成を請け負いしているわけではないので、わからない部分をピンポイントで絞って質問されたほうが良いと思います(そうしないと、プログラムのバグやミスなどに自分で対応できないことになり重大なエラーに結び付く可能性があります)。

関連するQ&A

  • エクセル VBA ワークシート作成?

    仕入単価未決とゆうエクセルファイルがドライブDにあり このファイルを開いて元データーファイルとする。 このファイルのA列にはコード        B列には仕入先名        C列には品番        D列には品名 などが入力されております。 このファイルを仕入単価決定書とゆう名前のファイルの 決定書原紙とゆうワークシートに作成したフォーム内の テキストボックス1で仕入単価未決のファイルを選択し コマンドボタンをクリックしたら コード=仕入先名(B列)でワークシートを作成し 各仕入先(コード)ごとに各データーが入力されるように したいのですが、どのように行えばいいでしょうか? 文章は長いですが、説明が不足しておりましたら 指摘の程宜しくお願いいたします。

  • 多数のExcelファイルからVBAのコードを抽出したい

    Excelで過去に作成したVBAのコード自体を抽出したいのですが,可能でしょうか? 仕事のパソコンを更新する際,Excelのデータファイルを思い切って整理したいのですが,ちょこちょこVBAを使ったものがあり,そのコードは残したいのです。数が多いので手作業では現実的ではありません。 指定フォルダ内のExcelファイルからVBAのコードだけをコピーして集約できればベストですが,コードそのものの参照が無理なら,コードが含まれるファイルだけをリストアップするような代案でも可です。

  • 画像挿入のVBAのコードについて教えてください

    ご存じの方がいらっしゃいましたら、教えていただけますと幸いです。 画像挿入を可能にするVBAが組まれたエクセルファイルと画像が、同レベルの階層に格納されているとします。添付の例をもちいると、B列「File」に格納した画像名がドロップダウンリストで表示され、選択するとA列「Image」にその画像が表示されるような、VBAのコードが知りたいです。 よろしくお願いいたします。

  • EXCEL2000:上書きするVBAのコードを教えてください。

    EXCEL2000のマクロを使用して以下のようなことをやりたいと考えています。 VBAに記載するコードを教えていただけますでしょうか。 ●シート構成 1.データシート A列:各データを識別するコード(3桁で000、001等) B列:氏名 C列:年齢 D列:性別 2.入力シート A列:各データを識別するコード(3桁で000、001等) B列:氏名 C列:年齢 ●やりたいこと 1.「入力シート」に識別コードをふり、データを入力しています。 2.そのデータとは別に、「データシート」にもデータを入力しています。 3.「データシート」に存在するデータに関しては、入力シート上のA列:識別コードと同じデータのB列:氏名とC列:年齢を、「入力シート」上のそれぞれの列に上書きします。 4.「データシート」に存在しないデータに関しては、「入力シート」上に存在するデータをそのまま残します。 マクロを作動させると、上記一連の作業が完了するようにできればと考えています。 まとめますと、「データシート」上にデータが存在すればそれを「入力シート」上に表示し、存在しなければ「入力シート」のデータをそのまま表示するというような仕組みにできればと考えています。 ご回答よろしくお願い致します。

  • VBA初心者です。 非常に困っております。

    VBA初心者です。 非常に困っております。 Excel 2003を使用しております。VBAにて下記のリスト表があるとします。 2010/04/05 りんご 30円 2010/04/12 みかん 20円 2010/06/12 もも  15円 2010/05/21 ぶどう 20円 2010/05/09 みかん 20円 このデータをExcelシートに入力されている場合、VBAのコンボボックスを使用して、 4月・・5月といったリスト表にて5月のデータのみを抽出するにはどうすればよろしいでしょうか? オートフィルタみたいな感じで結構です。さらに抽出した5月分のデータの計算を求めればどうすれば良いでしょうか?→合計値は、任意のセルに入れば良いです。 すいませんが、分かる方、丁寧なご回答のほどよろしくお願いいたします。 

  • 実行時エラー1004がでてしまう(VBA)

    実行時エラー1004「RangeクラスのAutoFilterメソッドが失敗しました」が出てしまいます。 (1)とあるシートのL列に"判定"を作り、そこに、D列の名称の中に、特、SO、FRが入っていないものには〇をL列に入力し、〇が付くものを抽出するというものを作ったのですがエラーが出てしまいます。(この内容は@の範囲になります)解決策を教えていただけないでしょうか? (2)またこのVBAを行った際に、本ファイルの処理リストのデータと評価リストのデータが消えてしまいます。(データがうまく表示されていない状態で行間をダブルクリックすれば全て出てくる)解決策を教えていただけないでしょうか? ちなみに自分はVBA初心者です。 Sub 抽出() Dim フォルダ, ファイル名, 基本ファイル名 Dim i, j As String i = ActiveWorkbook.Name j = ActiveSheet.Name Application.DisplayAlerts = False '警告ダイアログボックスを表示しない 基本ファイル名 = Sheets("データリスト").Range("B8").Value '基本ファイル名(欲しいデータがあるBook)を定義 Workbooks.Open 基本ファイル名 '基本ファイル名(欲しいデータがあるBook)を開く Worksheets(1).Range("A1:O400").Copy '基本ファイル名内にある履歴データシートの内容をコピー Workbooks(i).Worksheets("処理リスト").Range("A1:O400").PasteSpecial '基本ファイル名のコピーを本ファイルの処理リストに貼り付ける Workbooks(基本ファイル名).Close SaveChanges:=False '基本ファイル名を閉じる Sheets(j).Select With Worksheets("処理リスト") .Range("A1").AutoFilter _ Field:=10, _ Criteria1:="003", _ Operator:=xlOr, _ Criteria2:="004" End With '本ファイルの処理リストのA列からの10列目の"003"もしくは"004" を抽出 'Dim k As Long …@ Range("L1") = "判定" For k = 2 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(k, 4).Interior If .Cells(k, 4) <> "" * 特 * "" And .Cells(k, 4) <> "" * SO * "" And .Cells(k, 4) <> "" * FR * "" Then Cells(k, 12) = "〇" End If End With Next k Range("A1").AutoFilter 12, "〇" →ここでエラーが出る …@ Dim データ範囲 As Range Dim 抽出列 As Variant Dim l As Long Set データ範囲 = Worksheets("処理リスト").Range("A1").CurrentRegion 抽出列 = Array(3, 4, 5, 10) For l = 0 To UBound(抽出列) データ範囲.Columns(抽出列(l)).Copy Sheets("評価リスト").Range("D7").Offset(0, l) Next '本ファイルの処理リストの3,4,5,10列を本ファイルの評価リストのD7に貼り付け Application.DisplayAlerts = True '警告ダイアログボックスを表示するに戻す MsgBox ("履歴データを取り込みました") End Sub

  • VBAのコードについて

    いつもお世話になっております。 VBAを勉強中の初心者です。 以下の動作をするVBAコードを御教授ください。 添付ファイルのように シート記事数のB列に新聞名 C列に記事数が記載されているシートがあります。 例えば、下野新聞の記事数が3の場合は、下野新聞の行が3行作成されるようにしたいのですが。 どなたかご指導よろしくお願いたします。

  • vbaコードについて

    vbaのコードについて教えて下さい。 以下のようなリストがあります。 「Aグループ 全て」にチェックをいれると 4行目から7行目にある「Aグループ」の文字列を含む全てにチェックがつく、 同じように、「Bグループ 全て」にチェックをいれると 9行目から12行目にある「Bグループ」の文字列を含む全てにチェックがつくコードを書きたいです。 どなたかご教示いただけますでしょうか? よろしくお願いいたします。

  • VBAを使用したデータの抽出について

    sheet1に下記のような(例)データベースがありA~N列までデータが入力されています。 A B  C  D  E   F  G  H I J  N 1 ○○様 ○○  2名  車   可 東京 *** *** *** 2015/7/1 2 ○○様 ××  3名  車  不可 埼玉 2015/8/1 3 ○○様 ×□  2名  電車 不可 愛知 2015/8/12 4 ○○様 □□  4名  バス  可  新潟 2015/7/13 5 ○○様 ○×  3名  バス  可  宮城 2015/6/1 6 ○○様 ○□  4名  車  不可 大阪 2015/8/21 7 ○○様 □○  2名  バス  可  山梨 2015/8/7 「sheet1」B列のデータを元にして、別シート(sheet2)のA2列に抽出したいもの(例:バス)を入力し、 フォームボタン(例:抽出)で検索し、抽出された結果のsheet1のA列~G列、N列のみ(H列~J列は不要)をSheet2のA11以下へ表示したいと考えています。 A  B  C  D  E   F  G   N 4 ○○様 □□  4名  バス  可  新潟 2015/7/13 5 ○○様 ○×  3名  バス  可  宮城 2015/6/1 7 ○○様 □○  2名  バス  可  山梨 2015/8/7 どのようなVBAのコードを使用すれば良いでしょうか。 宜しくお願いします。

  • 商品コード一覧表をエクセルVBAで作成したいのです

    「商品コード一覧表」の作成を自動でしたいのです。 商品は6面の箱状のものです。(ルービックキューブみたいなものです。) 各面の色を自由に選択できるようになっています。 色は4種から選べるのですが、各面ごとに選べる色は異なっています。 たとえば・・・ 6面をそれぞれA面、B面・・・F面として、色の選択方法は以下のようになります。 A面はA1~A4の4色から1つを選択 B面はB1~B4の4色から1つを選択 C面はC1~C4の4色から1つを選択 ・ ・ F面はF1~F4の4色から1つを選択 このようにA面からF面まで、1つずつ色を選択して商品コードを作成します。 作成する商品コードは色を6つ横に並べた形になります。 (例1) 「A1B1C1D1E1F1」 (例2) 「A1B2C1D3E4F2」 (例3) 「A4B1C3D2E1F4」 商品コードのパターンは、各面4色ずつ選べるので、 4×4×4×4×4×4=4096 となります。 全部でパターンは4096通りあるのですが、 商品として製造するのは、このうち400~500種になります。 全体からすると、約1割程度のパターンを使って製造するのですが、 抽出方法に決まりがある訳では無く、適当にランダムに選び出します。 400個の商品コードを400行のテキストデータにして、 商品コード一覧(1つのファイル)として作成し、保存する。 これまで、これらの作業をエクセルを使ってせっせと作成していました。 最近になって本屋でエクセルVBAなるものを知り、自分でやろうと頑張ってみたのですが、 どうも、思うようなものを作ることができません。 VBAを使って自動でしたい内容は以下の点です。 1)作成する「商品コード一覧」の保存ファイル名を任意に設定できるようにする。  ・エクセルシートの(A1)セルに任意に入力(手作業で) 2)色のコードはあらかじめセル(4種×6面で24個のセル)に入力しておく(手作業で)  ・エクセルシートのA列に、たてに24個を入力  ・セル( A3~ A6)にA面の色コード  ・セル( A8~A11)にB面の色コード  ・セル(A13~A16)にC面の色コード  ・セル(A18~A21)にD面の色コード  ・セル(A23~A26)にE面の色コード  ・セル(A28~A31)にF面の色コード 3)作成する商品コードの「数」を指定する  ・基本的に400ですが、任意の数値を指定できるようにする  ・作成する数を400にしても500にしても、どの色コードも平均的に使用するようにしたい 4)「商品コード一覧」をテキストデータで保存する  ※商品コードごとに改行する(400個にした場合、400行のテキストデータ) 5)テキストデータの形    保存ファイル名,商品コード1    保存ファイル名,商品コード2    保存ファイル名,商品コード3    保存ファイル名,商品コード4     ・     ・    保存ファイル名,商品コード400  ※各行の先頭には「保存ファイル名」←セル(A1)に入力したもの   ↑どの行にも同じ「保存ファイル名」を入れる  ※保存ファイル名を商品コードの間にカンマを入れる 以上、よろしくお願い申し上げます。

専門家に質問してみよう