• ベストアンサー

データの入力規則の値をフィルタで絞った範囲を指定

エクセル2010を使用しています。 データの入力規則の元の値を、フィルタで絞り重複したレコードを無視した状態を使用する事ってできないでしょうか。 どこかのサイトに計算式と作業列を使用すれば可能なのは見かけたのですが、VBAでやりたいのです。 そもそも元の値にフィルタで絞った値が指定できないので何か別の方法がないかと思っている次第です。

  • natu0
  • お礼率60% (14/23)

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

VBAで書いてみました。 フィルタのリストはSheet1のD5から下に続くものとしています。 入力規則のセルはA1と仮定しています。 SelectionChangeイベントを利用しますので以下をシートモジュールに 書いてください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   Dim myDic As Object   Dim FR As Range, c As Range, myList As String   If Target.Address(0, 0) <> "A1" Then Exit Sub   With Worksheets("Sheet1")     Set myDic = CreateObject("Scripting.Dictionary")     For Each c In .Range("D5", .Cells(Rows.Count, "D").End(xlUp))       If c.EntireRow.Hidden = False Then         myDic(c.Value) = Empty       End If     Next     myList = Join(myDic.keys, ",")     With Target.Validation       .Delete       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _         Operator:=xlBetween, Formula1:=myList       .IgnoreBlank = True       .InCellDropdown = True       .InputTitle = ""       .ErrorTitle = ""       .InputMessage = ""       .ErrorMessage = ""       .IMEMode = xlIMEModeNoControl       .ShowInput = True       .ShowError = True     End With     Set myDic = Nothing   End With End Sub

natu0
質問者

お礼

ご回答ありがとうございます。 こちらもおもしろいですね。 これは連想配列の特性を利用しているのでしょうか? できれば解説をお願いしたい箇所がありまして、ForEachの中のIFなのですが、これは何か意味があるのでしょうか?

その他の回答 (3)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>ForEachの中のIFなのですが、これは何か意味があるのでしょうか? リストと仮定した D5セルから D列の最終行まで変数C代入してCが可視セルか判定ています。 Cの単体セルではHiddenが反応しないのでCが置かれている行全体(c.EntireRow)で可視の判定をしています。

natu0
質問者

お礼

ご回答ありがとうございます。 私の書き方が悪かったです。 IF分が無かったとしても、私がテストした限りだと同じ結果になったので、Hiddneの判定に何か特別な意味があるのかと思い伺った次第です。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

>VBAでやりたいのです VBAで作ってみました。 >フィルタで絞り重複したレコードを無視した状態 これは、 フィルターで絞った状態で重複があるので、 更に、 この重複を排除して、入力規則の候補一覧に並べたい と理解しました。 添付画像を例にすれば、こんなコードになるだろうと思います。 なお、 このマクロをどのタイミング(イベント)で実行するかを考える必要があります。 フィルターをかける一覧と、入力規則を設定するシートが同一の場合 Worksheet_SelectionChange が候補になるだろうと思うものの それだけでは不十分かもしれません。 他方、 フィルターをかける一覧と、入力規則を設定するシートが別であれば Worksheet_Activate で実行すれば十分と思います。 Sub ChgList()    Dim RowCounter As Long  Dim SelList As String    RowCounter = 4  SelList = ""    With ThisWorkbook.Sheets(1)   Do    If .Cells(RowCounter, 4).Value = "" Then Exit Do    If .Rows(RowCounter).Hidden = False Then     If SelList = "" Then      SelList = .Cells(RowCounter, 4).Value     Else      If InStr(SelList, .Cells(RowCounter, 4).Value) = 0 Then       SelList = SelList & "," & .Cells(RowCounter, 4).Value      End If     End If    End If    RowCounter = RowCounter + 1   Loop  End With    With ThisWorkbook.Sheets(1)   With .Cells(3, 6).Validation    .Delete    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _      Operator:=xlBetween, Formula1:=SelList    .IgnoreBlank = False    .InCellDropdown = True    .InputTitle = ""    .ErrorTitle = ""    .InputMessage = ""    .ErrorMessage = ""    .IMEMode = xlIMEModeNoControl    .ShowInput = True    .ShowError = True   End With    End With   End Sub

natu0
質問者

お礼

ご回答ありがとうございます。 表示されている行のセルの値を連結してそれを元の値とする方法ですか。 おもしろいですね。 参考にさせて頂きます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

>VBAでやりたいのです 関数でできますよ A列に元のリストがあり、D列に重複しないリストを作ります。 D2に =A2 D3に =IFERROR(VLOOKUP("*",IF(COUNTIF(D$2:D2,$A$2:$A$15)=0,$A$2:$A$15),1,FALSE),"") 式入力確定時に[Ctrl]+[Shift]+[Enter]で配列数式として入力します。 以下にドラッグ   A列      D列 1 品名     品名 2  パパイヤ   パパイヤ 3  バナナ    バナナ 4  マンゴー   マンゴー 5  パパイヤ   メロン 6  バナナ    レモン 7 メロン     スイカ 8 レモン 9 スイカ 10 マンゴー 11 レモン 12 メロン 13 メロン 14 バナナ 15 メロン

natu0
質問者

補足

ご回答は有難いのですが、質問にも書いてあるとおり計算式を使用する方法は存じ上げております。

関連するQ&A

  • エクセル/データの入力規則/フィルターが効かない

    お世話になります。 社員の人事データに係る20列×200行のエクセルシートがあります。 ある列に「データの入力規則」にて「入力値の種類」をリストにし、「元の値」の箱の中に3個の選択肢(例えばA,B,C)をカンマで区切って入力し、その列の入力の際にその3個の選択肢をプルダウンで選択できるようにしてから、200行(200個のセル)にAまたはBまたはCの入力をしました。 その後、1列目の項目の行にフィルターをかけ、A(またはBまたはC)が入力されたデータのみ表示させたいのですが、上から150行目まではちゃんとフィルターが掛かるのですが(即ち、A(またはBまたはC)が入力されたデータのみが表示される)、151行目以降はフィルターがかからず、A、B、C全てのデータが表示されてしまいます。 また、この時、エクセル左端の行番号の数字の色が、150行目までは青色ですが、151行目以降は黒色となっており、151行目前後で何かが違っているようです。 但し、自分自身では何かを変えたつもりは全くなく、何故151行目以降でフィルターが効かないのかが全く分かりません。 また、上記と全く同じこと(「データの入力規則」設定後に入力+フィルター)を別のエクセルファイルで行いましたが、そこでは200行全てがちゃんとフィルターが掛かっています。 何故151行目以降でフィルターが効かないのでしょうか? また、解決策は何かあるでしょうか?

  • データーの入力規則で

    エクセルにてデーターの入力規則を設定してますが 下記のようなエラーが出てきてしまいます。 どうしたらよいのでしょうか? 区切り文字でとありますが カンマで区切ってますが 元の値を参照してくれません。 区切り文字が違うのでしょうか? ちなみに元の値は「○○,△△,□□」と3つを区切ったものです。 『リストの元の値は、区切り文字で区切られたリストか、 または単一の行または列の参照でなければなりません。』 よろしくお願いいたします。

  • 【Excel】「データの入力規則」の範囲指定方法

    「元の値」での範囲指定の際、ドラッグではなく、離れたセルにあるものを選択して範囲を指定することはできますか? 例えばある列に以下のような(実際は)文字が入っているとします。 ○ - △ - □ - × - 選択範囲を○、□にしたい場合、範囲指定の際、ドラッグではなく、ひとつづつ選択する場合、どのような数式で入力すればよいでしょうか。

  • エクセル 入力規則について

    データの入力規則でリストを選んだときの”元の値”についてですが、同一シート内のどこかを選ぶと間違ってその元の値を消したりする危険性があるので、別のシートに元の値を書いておきたいのですが、そういうことは出来ないのでしょうか? また、VBAのコード上からリストを作成することは出来ないのでしょうか?

  • 入力規則とオートフィルタ

    宜しくお願いします。 例 シート2           A     B      C      1  品名   品種  業者名       2      3      .      .     400 2~400行まで品名・品種・業者名が入っています。 これをオートフィルタ→業者名で絞り、その絞ったデータだけをシート1の任意のセルに入力規則で選べるようにすることは可能でしょうか? エクセル2003 使用 VBA使えません^^;    

  • エクセル データの入力規則

    XPでエクセル2007を使っています。 会社名の列、売上の列、差額の列、請求額の列・・・というシートAがあって、別シートにある印刷書面(左上に~会社 御中)において「データ入力規則」でリストを選択し「元の値」欄にシートAの会社名列を範囲指定して入れると会社名がドロップダウンリストになります。でもこれはお客様に送付する印刷書面なので、「~会社 御中」と「御中」を付けたいのです。会社名は長い文字数と短い文字数がありバラバラなので、印刷書面の適当な欄に御中と入力しておくと、社名との間が空き過ぎたり逆に会社名が入りきらなかったりしてしまいます。シートAであらかじめ「~会社 御中」という列を作り、それをリストで「元の値」にしてしまえば解決するのかも知れませんが、シートAの会社名の列はそのままで、入力規則で選んだら「御中」が付く様な方法はないでしょうか?

  • オートフィルタ後の、マクロでの値の参照に関して

    オートフィルタ後の、マクロでの値の参照に関して 下記を悩んでいます。教えて頂ければ幸いです。 マクロで、あるデーター表から、オートフィルタを使用し、必要なデーターを 抽出し、マクロ内に戻し、その後の計算で使用したいと考えています。 A列、B列、C列にそれぞれ、検索条件を指定し、オートフィルタ後、下記のような状態になります。 参照したい値は、D列になります。 下記のような例では、2.5と2.7の値をマクロ内に戻したいです。 (例:オートフィルタ後) 1行  A▼  B▼  C▼  D 16行 **  **   **  2.5   20行 **  **   **  2.7 *2~15行目は見えなくなっています。 *17~19行目は見えなくなっています。 セルを参照し、マクロ内に戻すには、どのような構文(マクロ)の記述が必要でしょうか? 【備考】 ・上記の例では、セルはD16、D20となりますが、抽出条件によっては、行番号が変わってしまいます。 ・抽出後のD列のデーター数は、常に2つです。 よろしくお願いします。

  • エクセル IF 範囲指定

    エクセル関数についてですが、 Aは入力規則でプルダウンで1~3を選択します。 問題はBですが、IF関数を使ってA列で1もしくは2ないし3のどれかを選択した場合、B列ではA列で選んだどれかの値に基づいて指定した範囲の値しか記入できなくする方法を教えて頂きたいのですが、どなたかエクセルマスターはおりませんか? できれば、 A列            B列 1  Aで1の場合4,5,6どれかしか選択できない。 2  Aで2の場合7,8,9どれかしか選択できない。 3  Aで3の場合10,11,12どれかしか選択できない。 出来ればVBAを使わずにシンプルな方法を教えて頂きたいのですが、入力規則とかIF関数のみで実現可能でしょうか?

  • エクセルでデータ入力後の重複入力チェックについて

    エクセル初心者なので教えて下さい データを入力後 重複がないかチェックをしたいのですが どうしたら良いですか?? 自分なりにサイトを検索し 下記の方法を見つけましたが理解できません B列、C列、D列を選択。 ツールバーのデータを選択 フィルタ→フィルタオプションの設定を選択 重複するレコードは無視するにチェック 編集バーのOFFICEクリップボードを選択。 コピーして、クリップボードについたかを確認 ツールバーのフィルタ→すべて表示を選択 Deleteキーを押す。 クリップボードの貼り付けを押す ヨロシクお願いします

  • オートフィルタオプションをVBAで指定したい

    表中に、このような列があるとします。 肩ロース100g 肩ロース500g ヒレ100g ヒレ250g ヒレ500g レバー100g レバー250g 他の列には注文日や個数、小計金額があるとします。 オートフィルタをかけて、フィルタオプションで「○○で始まる」を指定し、例えばレバーの行のみを手作業で抽出することはできます。 この動作を、フィルタオプションでの設定を経由せずに行えないものでしょうか? たとえば、別の列などに「肩ロース」「ヒレ」「レバー」が記載されていて、そのデータを元にオートフィルタの▼をクリックすると「肩ロース」「ヒレ」のように抽出条件データが表示される、というふうには出来ないものでしょうか? VBA等を使用しても構いません。 抽出項目は固定ですので、コード中に記述しても構いません。 動作が要望を満たせば、オートフィルタを使用しなくても構いません。 フォームウィンドウで抽出項目を指定し、その項目をCriteria等に設定してフィルタオプションでも構いません(この方法は自力で出来そうですが)。 良い方法があれば、お教え下さい。

専門家に質問してみよう