[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートフィルターについて』(maki)
Excelの超初心者です。解説本と首っ引きで取り組んでいたのですが、
どうにもわからず、皆様のお知恵をお借りできればと思い質問させていただきました。
現在、会社毎に1シート内に、セルA〜Dに販売商品、セルF〜Iに購入商品をまとめた、
20枚前後の伝票をexcelで作成しています。
A社伝票シートの販売分表記例としては下記のようになります。
A列が販売社名、B列が単価、C列が商品名、D列が販売個数を表しています。
A │ B │ C │D
B社│\100│商品A│1
C社│\120│商品B│5
B社│\500│商品C│2
D社│\900│商品D│3
これをB社伝票シートの購入分に下記のように自動入力できるようにしたいと考えています。
F列が購入社名、G列が単価、H列が商品名、I列が購入個数を表しています。
F │ G │ H │I
A社│\100│商品A│1
A社│\500│商品C│2
オートフィルターを使用すれば良いというところまではたどり着けたのですが、
フィルタオプションの指定で「指定した範囲」にチェックを入れ、
下記のように入力したのですが「参照が正しくありません」という
エラーメッセージが出て来てしまい、そこから先に進めません…。
リスト範囲 A社シート名$A$10:$A$35(※販売社名の入る範囲です)
検索条件範囲 B社シート名$A$1(※B社の社名の入るセルです)
抽出範囲 B社シート名$F$10(※購入社名の入る始点のセルです)
大変恐縮ですが、どこが間違っているのかご指摘いただけるとありがたいです。
また、他に簡単な方法があるのであればご教授いただけますと幸いです。
よろしくお願いいたします!
< 使用 Excel:Excel2013、使用 OS:Windows8 >
まず、データの1行目は、項目名を挿入することです。 A社シートは、
A B C D 10 販売社名 単価 商品 数量 11 B社 \100 商品A 1 12 C社 \120 商品B 5 13 B社 \500 商品C 2 14 D社 \900 商品D 3
B社シートは、
A 1 販売社名 2 B社
検索条件には、どの項目名が検索条件なのか 教えてあげなければなりませんね。
Excelでデータベースをするなら、各列の先頭には、項目名を入れる習慣をつけてください。 色々便利なことが多いですからね!!
ここからです。
・B社シートをアクティブにしてください。 ・リボンのデータタブの並べ替えとフィルタの「詳細設定」をクリックしてください。 ・列見出しの特定ができない というエラーが出るかもしれませんが、かまわず「はい」を選択してください。
・フィルタオプション設定ダイアログが表示されます。
・抽出先は、指定した範囲を選択してください。 ・リスト範囲は、A社シート名$A$10:$D$35 を指定してください(項目名も含めたセル範囲を指定する)。
・検索条件範囲は、B社シート名$A$1:$A$2 を指定すること これも項目名まで含めて指定する。
・抽出範囲 B社シート名$F$10 を指定します。
これでOKボタンで 条件に合ったデータがB社シート名$F$10から、表示されるはずです。
ポイントは、データ(検索条件も含む)には、項目名を入れること。
フィルタオプションの最初は、抽出シートをアクティブにしてから、開始すること
以上です。
(ichinose) 2014/03/22(土) 16:57
マクロ案です。(素人コードですが)
1)シート名を
A社・B社・C社・D社 にする。
2)A社シート A1セルに抽出先シート名を入力 (B社・C社・D社)入力規則が簡単です。
3)販売社名の入る範囲・A社シート、A10:D35
抽出先範囲・F10:I列抽出分
4)下記マクロを標準モジュールに貼り付けて下さい。
A社シートにボタン配置して下記 販売分表記 をボタンに登録。
セルA1に抽出先シート選択してボタン押下すれば抽出転記されます。
5)下記のように項目名入れてください。
A B C D
10 販売社名 単価 商品 購入個数 11 B社 \100 商品A 1 12 C社 \120 商品B 5 13 B社 \500 商品C 2 14 D社 \900 商品D 3
Sub 販売分表記()
Select Case Range("A1") Case "B社": B社伝票シート Case "C社": C社伝票シート Case "D社": D社伝票シート End Select End Sub Sub B社伝票シート()
Sheets("B社").Range("F9").CurrentRegion = Empty Sheets("B社").Range("F9:I9") = Array("購入社名", "単価", "商品名", "購入個数") Dim i As Long, n As Long, m As Long n = 9 For i = 10 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(i, "A").Value = "B社" Then n = n + 1 With Sheets("B社") .Cells(n, 6).Value = "A社" .Cells(n, 7).Value = Cells(i, 2).Value .Cells(n, 8).Value = Cells(i, 3).Value .Cells(n, 9).Value = Cells(i, 4).Value
End With End If Next End Sub Sub C社伝票シート()
Sheets("C社").Range("F9").CurrentRegion = Empty Sheets("C社").Range("F9:I9") = Array("購入社名", "単価", "商品名", "購入個数") Dim i As Long, n As Long, m As Long n = 9 For i = 10 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(i, "A").Value = "C社" Then n = n + 1 With Sheets("C社") .Cells(n, 6).Value = "A社" .Cells(n, 7).Value = Cells(i, 2).Value .Cells(n, 8).Value = Cells(i, 3).Value .Cells(n, 9).Value = Cells(i, 4).Value End With End If Next End Sub Sub D社伝票シート()
Sheets("D社").Range("F9").CurrentRegion = Empty Sheets("D社").Range("F9:I9") = Array("購入社名", "単価", "商品名", "購入個数") Dim i As Long, n As Long, m As Long n = 9 For i = 10 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(i, "A").Value = "D社" Then n = n + 1 With Sheets("D社") .Cells(n, 6).Value = "A社" .Cells(n, 7).Value = Cells(i, 2).Value .Cells(n, 8).Value = Cells(i, 3).Value .Cells(n, 9).Value = Cells(i, 4).Value End With End If Next End Sub (ゆず) 2014/03/23(日) 15:45
ゆずさんへ コード拝見しました。老婆心ながら、コードの問題点について。
>Sub 販売分表記() > Select Case Range("A1") > Case "B社": B社伝票シート > Case "C社": C社伝票シート > Case "D社": D社伝票シート > End Select >End Sub
このコード、コード内に直接検索する販売社名がCase文で記述されていますが、 これだと、会社が100あると、Case文が100必要になってしまいます。
会社が増えるたびに又、会社名が変更になったときにコードを変更しなければなりませんよね!! 検索条件(販売社名)はセルA1にあるのですから、販売社名とデータを書きこむシート名との関係の 規則性を考える(規則性作る)と、このCase文が要らなくなると思いますよ!!
xx社伝票シート というプロシジャーも 同じように会社が増えるたびにプロシジャーを増やさなければならない構造になっていますよね?
xx社伝票シート というプロシジャーは、殆ど同じような内容ですよね!! 書きこむシートとデータを検索する会社名以外は、同じですよね!!
でしたら、検索する販売社名を変数化すれば、プロシジャーは、一つで済むと思います。
このように同種のデータの増加・更新により、コードも変更しなくてはならないのが 問題点です。
転記しているコードは、Excelの機能というより、プログラムの基本的なループコードなので、 これはこれでよいと思いますので、ちょっとした変更でもっと使いやすくメンテしやすくなると思いますよ。
(ichinose) 2014/03/24(月) 07:27
(ゆず) 2014/03/24(月) 10:28
Sub 伝票シート() Dim v v = Sheets("A社").Cells(1, 1)
Sheets(v).Range("F10").CurrentRegion = Empty Sheets(v).Range("F10:I10") = Array("購入社名", "単価", "商品名", "購入個数") Dim i As Long, n As Long n = 10 For i = 10 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(i, "A").Value = v Then n = n + 1 With Sheets(v) .Cells(n, 6).Value = "A社" .Cells(n, 7).Value = Cells(i, 2).Value .Cells(n, 8).Value = Cells(i, 3).Value .Cells(n, 9).Value = Cells(i, 4).Value
End With End If Next End Sub (ゆず) 2014/03/24(月) 11:54
迅速かつ明快なご回答、ありがとうございます。
お二方にご提案いただいたマクロを実行してみたのですが、
再び躓いてしまっております…。
手順は下記になります。
////////////////////////////////////////////
1)シート名をA社・B社・C社・D社にする。
2)A社シートA1セルに抽出先シート名である
B社・C社・D社と入力。
3)表示→マクロ→マクロの表示で
ゆず様がichinose様のご提案で修正されたマクロをコピペし、
macroAとして登録
4)ボタン登録の方法がわからなかったので、
マクロ→マクロの記録で「macroA」として
ショートカットキー登録しようとしたら
「macroAという名前は既に定義されています。
既存のマクロと置き換えますか」というメッセージが
出てきたので「はい」とする。
5)A社シートA1セルのB社以外の社名を削除し、
ショートカットキーを押す。
6)B社シートに変化なし。表示→マクロ→記録の終了をクリック。
7)再びショートカットキーを押すと
「スタック領域が不足しています」のメッセージ。
8)デバッグをクリックすると下記の表示。
Application.Run "'A社.xlsm'!macroA" Sheets("A社").Select End Sub
度々の質問で大変恐縮です…。
間違いをご指摘いただけますと幸いです。
よろしくお願いいたします。
(maki) 2014/03/24(月) 16:23
>3)表示→マクロ→マクロの表示で
>ichinose様のご提案で修正されたマクロをコピペし、
>macroAとして登録
macroAとして登録 ?というのがわからないのですが?
標準モジュールに修正されたマクロを貼り付けて下さい。
’-----ここから
Sub 伝票シート()
コード
End sub
'------ここまで
貼り付けが終りましたら、一旦エクセル画面に戻ります。
A社シートにボタン(図形の四角でも丸でも星形でも)を配置(大きさ,配置場所はお好きな所)
図形にマウスポインターを合わせて、すばやく右クリック→マクロ登録クリック→
上段に細長い四角形、下段に大きめの四角形があります、下段に標準モジュールに貼り付けたマクロ、
(伝票シート)と表示されているはずです、それをクリック、すると上段四角にも(伝票シート)と
表示されます、下のOKボタンを押す。それで登録完了です。
ボタン(図形)をクリックすればマクロ実行されます。
1)2)はその通りに設定してください。4-8は不要となります。
(ゆず) 2014/03/25(火) 01:32 一部訂正 03:15
ボタンの詳細な作成方法をご教授いただき、
ありがとうございました。
改めてトライしてみたところ、
無事抽出ができました。
ありがとうございました!
ichinose様もありがとうございました。
お二方の適切なアドバイス、本当に助かりました!
(maki) 2014/03/26(水) 13:05
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.