[[20151217194320]] 『プルダウンで一度選択したものを他のセルで表示さ』(sone) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『プルダウンで一度選択したものを他のセルで表示させないようにしたい』(sone)

soneです。お手数をおかけします。

データシートのA2からA14までに記載している以下部署名を、表紙シートのD4からD8に
プルダウン選択させる際に、一度選択した部署名を他のセルで選択出来なくすることは可能でしょうか?

FAG
SD
NOC
TC_ネットワーク
TC_レンタル
NWG1
NWG2
オンサイト
サービス基盤
人事
営サポ
受付
情シス

マクロやVBAは使用したことがなく勉強不足は自覚しておりますが、ご教授の程よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


>表紙シートのD4からD8にプルダウン選択させる際に、
>一度選択した部署名を他のセルで選択出来なくすることは可能でしょうか?
上に既に入力済みのものが見えるのだから、
そんな必要があるんだろうか、過剰サービスな気がする。

changeイベントで選択肢から削除していけばいいんだろうが、
修正入力などのあることを考えれば、複雑なことになる。
であるからして、
そうしたことが本当に必要か、苦労に見合うことなのか、よく考えた方がよいと思う。
例えば、条件付き書式で重複をチェックするくらいが落としどころではないか。

# 言いたい放題書いて申し訳ないが、一つの意見として書き付けておきます。
# 気に入らなければ、スキップしてください。
(γ) 2015/12/17(木) 22:21


 どこかに入力可能リストを作った方がストレスなさそうです。

 VBA案ではなく、Z列に入力可能リストを数式で作る案です。
 (リストが目障りならZ列を非表示にする。場所の選定はあくまで例示)

 1.数式を入力する
 (1) Z1セル =COUNTIF(Z2:Z14,"*?")

 (2) Z2セル =IFERROR(INDEX(A:A,AGGREGATE(15,6,ROW($A$2:$A$14)/(COUNTIF($D$4:$D$8,$A$2:$A$14)=0),ROW(Z1)))&"","")
   Z14セルまでコピーする

 2.D4:D8セルに入力規則を設定する。
   リスト形式
   元の値ボックスに =OFFSET($Z$2,0,0,$Z$1) と入力する

 <結果例図>
  行 _______A_______ _B_ _C_ ___D___ _E_ _Y_ ______ Z ______
   1                                                8
   2 FAG                                     SD             
   3 SD                                      TC_ネットワーク
   4 NOC                     FAG             TC_レンタル    
   5 TC_ネットワーク         NWG2            NWG1           
   6 TC_レンタル             人事            オンサイト     
   7 NWG1                    NOC             サービス基盤   
   8 NWG2                    情シス          営サポ         
   9 オンサイト                              受付           
  10 サービス基盤                                           
  11 人事                                                   
  12 営サポ                                                 
  13 受付                                                   
  14 情シス                                                 

(半平太) 2015/12/17(木) 23:23


マクロで実現できなくはないですし、選んでいけないものは表示しないほうがマンマシンインターフェースとして優れているので、良い案とは思います。
しかし、ロジックが難しい部類ですので、VBAを使った事がない人が扱いきれるものではないと思います。

一応、データシートのB列を作業列として使った例を書いてみます。

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long
    Dim j As Long
    Dim iMax As Long
    Dim cw As String

    If Target.Count <> 1 Then Exit Sub
    If Intersect(Target, Range("D4:D8")) Is Nothing Then Exit Sub

    With Sheets("データシート")
        iMax = .Cells(.Rows.Count, "A").End(xlUp).Row
        .Range("B2:B" & iMax).ClearContents

        For i = 2 To iMax
            For j = 4 To 8
                If .Cells(i, "A").Value = Cells(j, "D").Value Then
                    .Cells(i, "B").Value = 1
                    Exit For
                End If
            Next j
        Next i

        For i = 2 To iMax
            If .Cells(i, "B").Value = "" Then
                If cw <> "" Then
                    cw = cw & ","
                End If
                cw = cw & .Cells(i, "A").Value
            End If
        Next i
    End With

    With Range("D4:D8").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=cw
        .IgnoreBlank = True
        .InCellDropdown = True
    End With
 End Sub

しかし、お薦めはこういう凝ったコーディングではなく、プルダウンからの入力には制限をかけないでおいて、
最終的に実行ボタン等を押したときに重複していないか調べることです。これくらいならば、初心者向けな難易度です。
(???) 2015/12/18(金) 09:43


書き忘れました。

リストから選択した場合だけ考慮したため、値をコピペされた場合には対応していないロジックです。
コピペまで考慮すると、もう少し長くなりますので。
(???) 2015/12/18(金) 09:47


γ様
ご指摘ありがとうございます。
自己能力を考慮し再考してみます。

???様、半平太様
お二人に頂いた内容は個人的に勉強する際に参考にさせて頂きます。

今回は重複した項目を選択した場合エラーとなる様な入力規則を追加することにしました。
皆様、ご協力頂きありがとうございました。
(sone) 2015/12/18(金) 14:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.