• ベストアンサー

ExcelVBAを使っての振り分け処理

「ALLDATA」というシートに 店名 商品コード 数量 金額 という項目があり、 日々、データを400件位入力しています。 (データ件数は日々変動) これを商品コードを見て、その商品コードと同じシート名の表に、 データをコピーし振り分けていく処理をボタン一つで 出来るようにしたいのです。 振り分け出来なかったデータは、(商品コードの入力ミスなど) 同じファイルの「エラー」シートに振り分けられるようにしたいのです。 何かいい方法はないでしょうか?

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

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

aube2003さん こんばんは。Wendy02です。 >早速試させて頂きました。全角だとうまくいきませんでしたので、半角に直してみると・・・。 >大・大感動です。 私は驚きです。本当は、うまくいくほうが、30%ぐらいだと思っていましたから。気になる点は、クリアできないかもしれないと思っていましたから。方法はあるのですが、すごく面倒になるのです。 >このプログラムに興味があると言うか、 これは、以前、オートフィルタでコピー&ペーストすると、非表示のものはコピーされないことに気が付いたときに、この方法を思いつきました。それと、私のコードから余計なものを取り去ると、「なんだ」こんなことかって思われるかと思います。 自分だけのものには、そんな面倒なことはしません。 掲示板で、相手の環境が見えない状態で、文字だけでやり取りする以上、最低限のエラー処理というのが、だんだん膨らんできて、現在のスタイルになっているわけで、本当は、ものすごく初歩的なことしかしていないのです。だから、ちょっとしたアイデアだけなのですね。 よかったです。

aube2003
質問者

お礼

こんばんは。入力ミスによるエラーの振り分けができるのがほんとうに嬉しいです。 助かりました。さっそく使っています。 どうもありがとうございました。

その他の回答 (5)

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

こんにちは。Wendy02です。 気がかりな点は、一番最後に書いておりますが、とりあえず試してみてください。 うまくいかない場合は、全面的に変更するか、こちらの方で、別のチェックプログラムを提示いたします。 取り付け方: AllData シートに、表示-ツールバーで、コントロールツールボックスを出して、その中の「CommandButton(コマンドボタン)」を取り付けてください。貼り付けたら、コントロールツールバーの中の 青い三角定規が凹んでいることを確認して、そのボタンをダブルクリックしてください。 画面が、VB Editor 画面になりますから、Private Sub ~ End Sub の文字が現れていますから、その中に、以下を貼り付けてください。 '(ALLDATAのシートのモジュールに) Private Sub CommandButton1_Click() '-------------------------------------   Call AllDataDivising  '←この部分を貼り付けます。 '------------------------------------- End Sub 次に、VB Editoの画面のメニューの挿入-[標準モジュール] がありますから、それをクリックして、以下を貼り付けてください。貼り付け終わったら、上の凹んだ青い三角定規がでていたら、戻してください。 そして、Alt + Q で、この画面を閉じます。 コントロールツールバーが出ていたら、それは、邪魔ですから、見えないようにしてください。 '(標準モジュールへ) '--------------------------------------------- Sub AllDataDivising()   'データの切り分けプログラム   Dim ShAllData As Worksheet   Dim sh As Variant   Dim i As Long   Dim j As Long   Dim shNames() As Variant   Dim ret As Integer   Dim LastCol As Integer '元データの右端の列数を取っておく   Dim TopCell As Range     On Error GoTo ErrMsg   '全角半角は、注意してください。   Set ShAllData = Worksheets("ALLDATA") '※     'A1 から始まる場合は、変更する必要なし   Set TopCell = ShAllData.Range("A1")   Application.Goto TopCell   If ShAllData.AutoFilterMode = True Then TopCell.AutoFilter     For Each sh In ThisWorkbook.Worksheets    'ALLDATA/エラーではない場合ものの名前をストック    If sh.Name <> ShAllData.Name And sh.Name <> "エラー" Then      ReDim Preserve shNames(i)      shNames(i) = sh.Name '※      i = i + 1    End If   Next sh   Application.ScreenUpdating = False   With TopCell    .End(xlToRight).Offset(, 1).Value = "済" '済判を入れる    LastCol = .End(xlToRight).Column        'フィルタモードチェック    If .Parent.AutoFilterMode = False Then      .AutoFilter    End If        'ループ    For j = LBound(shNames) To UBound(shNames) + 1      If j < UBound(shNames) + 1 Then       TopCell.AutoFilter Field:=2, Criteria1:=shNames(j) '※       Else       .Parent.ShowAllData       TopCell.AutoFilter Field:=LastCol, Criteria1:="<>x", Operator:=xlAnd 'xが入らない場合      End If      On Error Resume Next      ret = Empty      ret = Range(TopCell, Cells(65536, TopCell.Column).End(xlUp)).SpecialCells(xlCellTypeVisible).Count      On Error GoTo 0      If ret > 1 Then       If j < UBound(shNames) + 1 Then         TransferData .Range(TopCell, TopCell.End(xlDown).Resize(, LastCol)), shNames(j), LastCol         Else         TransferData .Range(TopCell, TopCell.End(xlDown).Resize(, LastCol)), "エラー", LastCol       End If      End If    Next    .Parent.AutoFilterMode = False    .CurrentRegion.Columns(LastCol).ClearContents   End With   Application.ScreenUpdating = True ErrMsg:   'エラー処理   Set TopCell = Nothing: Set ShAllData = Nothing   If Err.Number > 0 Then    MsgBox Err.Number & " :" & Err.Description    Else    MsgBox "終了しました。", vbInformation   End If End Sub Sub TransferData(rng As Range, shName As Variant, LastCol As Integer) '貼り付け用サブルーチン Dim dummy As Variant   dummy = Evaluate(shName & "!A1")   On Error GoTo ErrMsg  If Not IsError(dummy) Then   With rng   .Offset(1).Resize(.Rows.Count - 1).Copy _   Worksheets(shName).Range("A65536").End(xlUp).Offset(1) '※   .Offset(1, LastCol - 1).Resize(rng.Rows.Count - 1, 1).Value = "x"   End With  End If  Exit Sub ErrMsg:  MsgBox Err.Number & " :" & Err.Description End Sub '--------------------------------------------- ※ なお、シート・商品コードともに、全角を用いるのは、失敗する可能性が高くなります。もし、全角・半角を間違えた場合は、出力の途中では、その部分のシートだけが出力せずに、終わります。一応、コードの中で、全角・半角で影響を受ける部分を「※」で表示しておきました。 また、最初にこの種のエラーが出るときは、「9 : インデックスが有効範囲にありません」と出力します。

aube2003
質問者

お礼

こんばんは。 早速試させて頂きました。全角だとうまくいきませんでしたので、半角に直してみると・・・。 大・大感動です。 これがまさにボタン一つでやりたかったことです。 ほんとうにありがとうございます。 このプログラムに興味があると言うか、こういう言いい方は変ですが、 流れを一つ一つ理解できるように勉強させていただきます。 ほんとうにありがとうございました<(_ _)>

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

こんばんは。Wendy02です。 返事が遅くなってすみません。 1つだけ問題が発生してしまいました。それは、  AAA/BBB/CCC 実際には、シート名には、全角・半角の区別があるので、それが、はっきりしないと、前に進まないのです。例えば、セルには、全角・半角で書いているけれども、ワークシートは半角ですとか、全角ですとか、決まっていないとちょっとややこしくなります。出来なくはないのですが、その分、最初の入り口のところでコードが変ってきてしまいます。

aube2003
質問者

補足

こんばんは。回答ありがとうございます。 商品コード、シート名ともに全角で入力しています。 言葉足らずで申し訳ありません。 どうぞ宜しくお願い致します。

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

こんにちは。 ちょっと、私からもアドバイス これは、Excelですので、やり方は、ある程度決まってきます。 まず、コードのベースになる 「商品コードと同じシート名の表」を用意します。 これは、私ですと、Public CONST で、使う時に、配列変数に置き換えますが、難しいようでしたら、どこかにリストを置いてください。 これを使って、「ALLDATA」のデータをオートフィルターで、分けて、それをコピーしていきます。 フィルターオプションでもよいのですが、オートフィルタのほうが、簡単です。コピーしていくたびに、補助列に、チェッカー(例:1)などを付けていきます。 そして、最後に、そのチェッカーがついていないものを、オートフィルターで選び出して、「エラー」シート送りにします。 まあ、記録マクロでは、ループがうまくいかないかと思いますが、ひとつ、サンプルと全体のデータのレイアウトを公開していただければ、他の人でも作れると思います。今の段階では、アイデアだけになってしまいます。

aube2003
質問者

補足

アドバイスありがとうございます。 オートフィルタは普段使っていますが、マクロで動かしたことがなく、 エラーの部分と毎回変わるセル範囲の取得でつまずいていました。 お言葉に甘えて少しサンプルを書いてみます。 [ALLDATA]シート 店名  商品コード  数量   金額 東京  AAA     1   100 東京  BBB     2   600 東京  AAA     1   100 大阪  CCC     5  2000 大阪  AAA     1   100 名古屋 CCC     5  2000 東京          3   300 大阪  DDD     1   100 名古屋 AAA     1   100 ↓振り分け後 [AAA]シート 東京  AAA     1   100 東京  AAA     1   100 大阪  AAA     1   100 名古屋 AAA     1   100 [BBB]シート 東京  BBB     2   600 [CCC]シート 大阪  CCC     5  2000 名古屋 CCC     5  2000 [エラー]シート 東京          3   300 大阪  DDD     1   100 ・・・とこのような処理をしたいのです。 宜しくお願い致します<m(__)m>

回答No.2

実装するには、それなりのプログラム記述がいるように思います。 大まかにいうと(そのままになっちゃいますが(汗)) 1)ALLDATAシートの商品コードを1件ずつ取得 2)取得した商品コードで該当するシートを検索。 3)該当したシートに情報を記述   該当しなければ「エラー」シートに記述 てなかんじでしょうか。 エクセルのマクロ記録機能をつかえば、 それなりのサンプルソースができるので、実装しやすいと思います。 でも、 商品コードが何件あるか? 新しい商品コードができた場合、シートを作成するのか? とか疑問もあります。 商品コード単位で状況を確認するなら、入力をアクセスに するのもひとつの手かもしれません。

aube2003
質問者

補足

ご回答ありがとうございます。 流れはそのような感じです。 商品コードはMAX10件くらいです。 マクロ機能を使いながら、いろいろ改良しているのですが、 素人にはハードルが高くて・・・。

  • azzu0707
  • ベストアンサー率46% (62/132)
回答No.1

Select Caseでよいのでは?

aube2003
質問者

補足

VBA初心者で、マクロの記録機能を参考にしていたため、 Select Case の後の構文でつまづいてしまいます。 ですが、条件分岐の方法はいろいろありそうですので、 もう少しいろいろ試してみます。 ご回答ありがとうございます。

関連するQ&A

  • エクセル

    1.表を「店名」の昇順、フリガナを使って並べ替えてください。 2.表を「商品名」の昇順、「数量」の多い順に並べ替えてください。 3.表をテーブルに変更しオートフィルタを使って各店舗のデータの件数を調べ空白に書き込んでください。 4.全てのデータを表示し次の形式で書き込んでください。 ・金額が50000円以上のデータ件数 ・数量が20より大きいデータ件数 5.金額の上位3位のデータを調べ次の形式で空白に書き込んでください。 ・1位 商品名( ) 店名( ) 金額( ) ・2位 商品名( ) 店名( ) 金額( ) ・3位 商品名( ) 店名( ) 金額( ) 6.フィルタを解除してください。 このような問題があるのですが最初からやり方がわかりません。写真見づらくて大変申し訳無いのですがわかるかた教えていただきたいです。

  • EXCELVBAで表の作成

    はじめて質問いたします。今、とても困っています。 EXCELで表(集約)の作成を任されたのですが、いろいろホームページやマクロ、VBA関連書籍を見て 参考にして作成したいと思いまいしたが いいサンプルがありませんでした。 EXCELマクロで試してみたのですが、動作しませんでした。 内容は、ファイル内のSheet2に集約表を作成し Sheet1(全体)に形式の違う表をコピーして 各項目のセル(文字)をコピーしてSheet2の項目にリンクする表を作成することです。 なお、Sheet1のセルは結合されていて、コピーしたい項目は複数ありsheet1の表とsheet2の表の項目の場所は違います。 Sheet1コピーした表のセル(結合)を項目でコピー⇒Sheet2の項目に張付(リンク) ※項目は文字列-記号(○、△、×等)も入っています。 わかる方がいましたら プログラムを教えてください。 回答をお願いします。

  • ExcelVBAで二つのデータを比較して違う場合は別シートへ

    こんばんは! Sheet1「元データ」    A   B    C   D   コード 商品  店名  納入日   5 0360 メロン  D店 4/1 1 0001 みかん  A店  3/1  6 0112 きんかん  Sheet2「最新データ」   A   B    C   D コード 商品  店名  納入日  1 0001 みかん  A店  3/1 5 0360 メロン  D店 2/1 6 0112 きんかん  11/2 とデータがあるときに、納入日が元データと最新データで異なっている場合は、Sheet3へデータを写したいばあいは、どの様にすればよいのでしょうか?

  • excel VBAを使って、データを自動的に表示させたい!

    excelのVBA・マクロの書き方について教えてください!! たとえば、商品データ(商品名、数量、産地、担当者、商品コード)を入力したシートがあります。 別のシートに、商品名と数量を入力するだけで、商品データを参照して、産地・担当者・商品コードが自動で入力されるマクロを作成したいです。 「商品名」だけを入力して、表示させることはできたのですが、 商品名が同じで、数量が違うものがあると、片方のものしか表示されません。 A・B列に「商品名」・「数量」を入力して、自動でデータが表示される方法はありますか??

  • EXCELで入力用シートをまとめる

    Excelで10名が同じ書式の入力用シートを各自別々にファイルで持ち、 使っています。 それを、別のシートで一つの表にまとめる方法があれば、どうぞ教えてください。 できれば、まとめたシートは当日分と毎日のデータを溜めていけるものを 作りたいと思っています。 統合やってみたのですが、単価、受注数量、得意先codeが合計数量で 出てしまいます。 例いとうSHEET1 種類 商品CODE 単価 受注数量 得意先CODE ああ ABCDEF  100    125        3440 例すずきSHEET1 種類 商品CODE 単価 受注数量 得意先CODE いい GHIJKLMN  500     99        3330 これを、下記のようにまとめたいのです。 例合計SHEET1 種類 商品CODE 単価 受注数量 得意先CODE ああ ABCDEF  100     125        3440 いい GHIJKLMN  500     99        3330

  • エクセルで最新データのみ表示させたい

    Excel2003を使用しています。 毎日データを入力している表があるのですが、それを月末に最新データのみの一覧表にしたいのです。 A      B     C     D     E      F     G   H 日付 店舗コード 店舗名 商品コード 商品名 数量 単価 金額 店舗名・商品名は別シートにコード一覧表があり、そこからVLOOKUPで表示させています。 日付・店舗ごとに小計行を入れています。 件数は3000近くあります。これを商品名ごとに最新のデータ行のみを表示した表にしたいのです。 フィルタオプションの重複データを無視するや集計などやってみましたがうまくいきません。 VBAは書くことは出来ませんが、簡単な修正は出来ると思います。 どういった方法がありますでしょうか? よろしくお願い致します。

  • エクセル2000(マクロ)を使っていくつかの処理を一度にしたい・・・

    A列に下記の例のようなデータがあり、件数は毎日変わります。 マクロに登録したいのは (1)B列にはA列の最終行まで、(例えば)1、2と繰り返し入力させたい (2)B列に2のデータが入っているものだけを抽出し、抽出したA列のデータだけをコピーし、別のシートに貼り付けたい というところまでを一つのマクロで処理させたいのですが、うまくいきません。 A列のデータ数は必ず偶数で、数字のみで出てきています。貼付け先は日々のデータを月ごとに表にしていくため、毎日変わります。 ※土日祝日分はデータがでてきませんが、項目には記載がありますので、土日祝日は飛ばさなければいけないようになっています。 別シートは行の項目が日付で、列に抽出したデータを入れるようなレイアウトになっています。 A列   B列 1    1 1    2 2    1 0    2 10    1 2    2 13    1 2    2 ちなみに私が取得するデータはA列のデータだけなので、B列に入れるデータは1、2でなくてもなんでも大丈夫です。また処理や他にいい考え方等があれば教えてください。 宜しくお願いします。

  • エクセル2007 VBA シート1に入力されている項目をシート2の中で

    エクセル2007 VBA シート1に入力されている項目をシート2の中で検索し、新規シートにコピーする方法についてです。 例) シート1 A        B  C 取引先名 品目C 数量 A      1-1 25 B      あ12  5 C      T-8 10 :       :    : シート2 A       B    C      D    E 得意先C 取引先名 製品名  品目C  数量 001    (株)B    ケーブル あ12  10 002    (株)A    箱     1-1  20 002    (株)A    箱     1-1   7 002    (株)A    箱     1-1   5 :       :     :      :     : 上記の状態で、シート1の項目をシート2から検索します。 ・取引先名は一部分でも一致するあいまい検索で、品目Cは完全一致で検索したいです。 ・シート2には検索項目のデータが複数あるのですが、結果が一致する行を選択し新規シートにコピーペーストしたいです。 出来れば下記の処理も実行したいです。 *シート1の数量を、シート2の1行目から順に検索したデータから計算して、シート1の数量に満たした分だけをコピーペーストしたいです。  シート1の数量に満たさない場合も取り敢えずシート2にある分のデータをコピーペーストして、処理が終わったら不足している項目データに印をつける。  取引先Aの場合→数量が20個と7個の行をコピーペーストする感じです。 グーグルで調べたのですが、調べ方が悪いのか最初から躓いてしまいました。 今回はコードを記入していなくてすみません。 サンプルコードありで教えていただけるととても助かります。よろしくお願いします。

  • VBAを使ってセルを検索後別シートのデータを自動入力したいです。

    見ていただきありがとうございます。 エクセルの2000VBAを使って次のようなことを考えています。 シート2に以下のようなデータがあります。 2006/7/20 コード 数量  100  200   200  400 データの数は日によって違います。 シート1には以下の表があります。横軸にはコード縦軸には日付が入っており各対応するセルに数量が入っています。       100  200  300  400 ....←コード 2006/7/1  20  40  100  800 2006/7/2  50  60  200  500   .   .   . 2007/6/30  このような場合、シート2にコマンドボタンを設けて押したときシート2の日付とコード番号によりシート1の表の検索を行って対応するセルにシート2のデータを転記したいのです。シート2のデータは本日分のデータが入った時点でシート1への転記を行います。(1日一回です) また、シート1の表は2007/6/30(これ以降は必要ないので)までの日付がすでに入力されており明日以降のデータの入るセルは空白になっております。 よろしくお願いします。

  • accessでの2つの表を使った更新のしかた

    Access2003を使っています。 2つの表を使って更新をする方法が分かりません。 たとえば、キャンペーン商品(数品)の支店別(8支店)販売実績を作成するのに、下記のようなテーブルを用意した場合。 A表,売上表の項目(支店コード、商品コード、数量) B表,キャンペーン表の項目(商品コード、商品名、支店項目x8) 更新クエリでの”レコードの更新”欄で,A表の支店コードの値でB表の該当支店項目へ加算したいのですが,されません。どのようにすべきでしょうか。 IIf(支店コード=1 支店項目1+数量) と入力していますが,できていません。これではダメですか。 ご教授下さい。 これではダメだと別の方法を考えるとしたらどうすべきでしょうか?。

専門家に質問してみよう