[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『リストで選択した人名を表から消したい』(YOU)
人員配置表を作成したいのですが、<データー・・・入力規則・・・リスト>の方法で人名をリスト形式で入録していきます。そこで問題だったのが使用した人名が分からなくなり、ダブって配置してしまう事です。 よってすでに配置した人が一覧表の中から消えて、配置の済んでない人の名前のみ残るようにしたいのですが。
良い方法 教えてください。
(みやほりん)が2005/2/8 09:47 PM にレス上げしました。 【重複しない入力規則リスト】 A列に入力規則 B列に実際のリスト、 C列に入力規則用のリストを設定した例。 A B C 1 入力規則 リスト 入力規則用リスト 2 あああ あああ いいい 3 かかか いいい ううう 4 おおお ううう えええ 5 えええ 6 おおお 7 かかか C2セルへ下記数式。 =TEXT(INDEX($B$2:$B$101,SMALL(IF(COUNTIF($A$2:$A$101,$B$2:$B$101)=0,ROW($A$1:$A$100)),ROW(A1))),"#") 配列数式でCtrl+Shift+Enter。 C2フィルハンドルダブルクリックでフィル。。 C列にできたデータを入力規則のリスト範囲とします。 リストは上に詰まっていくのですが、数式では「クリア」にできないので、 入力規則リスト下方に空白が残っていくのが不満。 良く似たトピックがあったと思ったのですが見つからない。 (みやほりん)
フィルタオプションで重複を除いては? (INA)
連続して入力規則のリストから選択していくケースを考えたので、 その都度リストにフィルタリングするのは手間ですが、 Changeイベントを絡めればいけますね。 今、悩んでいるのは >入力規則リスト下方に空白が残っていくのが不満。 VBA使わない方法で、入力規則用のリストを必要な セル範囲だけに限定するような方法なんですが・・・ うまい数式ありませんかね。 (みやほりん)
参照するセル範囲が固定されているのなら、入力規則の範囲を =OFFSET($C$2,0,0,COUNTA($C$2:$C$7)-COUNTBLANK($C$2:$C$7),1) のようにするのはどうなんでしょう? 前に、それぐらいなら・・・・と書かれたような気がするので 何か他の方法があったと思うのですが思い出せない。 (Hatch)
同じ発想です。入力規則のリスト範囲を =OFFSET($C$2,0,0,SUMPRODUCT((LEN($C$2:$C$7)<>0)*1),1) (純丸)
TO Hatchさん なるほど、COUNTBLANKで「""」カウントしますね。 ダメかと勘違いしてました。 TO 純丸さん SUMPRODUCT&LENでもオッケーです。 リストの参照範囲で配列数式には出来ないなぁ、とこちらも思い込み。 SUMPRODUCTなら関係ないですなぁ。 ご協力感謝します。 (みやほりん)
これでも、いいみたいですよ =OFFSET($C$2,,,SUM((LEN($C$2:$C$7)<>0)*1)) (SoulMan)
いけますねぇ〜。そうか、条件に合うセルの数を数えるだけだから SUMで良いわけだ。納得。 (みやほりん)
ちょっとお遊びで作ってみました。 シートモジュールに貼り付けて、A列に何か入力してから、 B1:H10の範囲を選択してみてください。。。 例によってマニアックなので、数に限りがあるかもです。。 どうでしょう? Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim MyA As Variant, MyAry() As Variant Dim i As Long, k As Long Dim x As Variant If Target.Count > 1 Then Exit Sub If Target.Column = 1 Then Exit Sub If IsEmpty(Target.Value) Then Exit Sub Application.EnableEvents = False With Me If Application.CountA(.Range("A1", .Range("A65536").End(xlUp))) > 1 Then MyA = .Range("A1", .Range("A65536").End(xlUp)).Value x = Application.Match(Target.Value, .Range("A1", .Range("A65536").End(xlUp)), 0) If Not IsError(x) Then For i = LBound(MyA, 1) To UBound(MyA, 1) If Not IsEmpty(MyA(i, 1)) And MyA(i, 1) <> Target.Value Then k = k + 1 ReDim Preserve MyAry(1 To 1, 1 To k) MyAry(1, k) = MyA(i, 1) End If Next .Range("A:A").EntireColumn.ClearContents .Range("A1").Resize(UBound(MyAry, 2)).Value = Application.Transpose(MyAry) .Range("A1", .Range("A65536").End(xlUp)).Name = "MyList" End If Erase MyA, MyAry End If End With Application.EnableEvents = True End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count > 1 Then Exit Sub With Me .Range("A1", .Range("A65536").End(xlUp)).Name = "MyList" If Not Intersect(Target, .Range("B1:H10")) Is Nothing Then With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=MyList" .ShowError = False End With End If End With End Sub (SoulMan)
あっあ〜〜、、消してもリストが減らないように考えていたら、、自分でも わからなくなったべ( ̄□ ̄;)!! ご飯食べてこよぉ〜〜っと、、また、暇な時に考えます。(;^_^A あせあせ・・・ Option Explicit Dim SMyStr As String Dim MyB As Variant Private Sub Worksheet_Change(ByVal Target As Range) Dim MyA As Variant, MyAry() As Variant Dim C As Range Dim i As Long, k As Long, j As Long Dim x As Variant, EMyStr As String If Intersect(Target, Range("B1:H10")) Is Nothing Then Exit Sub Application.EnableEvents = False With Me If Target.Count > 1 Then For j = LBound(MyB, 2) To UBound(MyB, 2) For i = LBound(MyB, 1) To UBound(MyB, 1) x = Application.Match(MyB(i, j), .Range("A1", .Range("A65536").End(xlUp)), 0) If Not IsEmpty(MyB(i, j)) And IsError(x) Then k = k + 1 ReDim Preserve MyAry(1 To 1, 1 To k) MyAry(1, k) = MyB(i, j) End If Next Next If k > 0 Then .Range("A65536").End(xlUp).Offset(1).Resize(UBound(MyAry, 2)).Value = Application.Transpose(MyAry) .Range("A1", .Range("A65536").End(xlUp)).Sort _ Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess Erase MyAry End If Else EMyStr = Target.Value If Application.CountA(.Range("A1", .Range("A65536").End(xlUp))) > 1 Then If SMyStr <> EMyStr Then MyA = .Range("A1", .Range("A65536").End(xlUp)).Value x = Application.Match(EMyStr, .Range("A1", .Range("A65536").End(xlUp)), 0) If Not IsError(x) Then For i = LBound(MyA, 1) To UBound(MyA, 1) If Not IsEmpty(MyA(i, 1)) And MyA(i, 1) <> EMyStr Then k = k + 1 ReDim Preserve MyAry(1 To 1, 1 To k) MyAry(1, k) = MyA(i, 1) End If Next .Range("A:A").EntireColumn.ClearContents .Range("A1").Resize(UBound(MyAry, 2)).Value = Application.Transpose(MyAry) .Range("A1", .Range("A65536").End(xlUp)).Name = "MyList" Erase MyAry End If x = Application.Match(SMyStr, .Range("A1", .Range("A65536").End(xlUp)), 0) If SMyStr <> "" Then If IsError(x) Then MyA = .Range("A1", .Range("A65536").End(xlUp).Offset(1)).Value MyA(UBound(MyA, 1), 1) = SMyStr .Range("A:A").EntireColumn.ClearContents .Range("A1").Resize(UBound(MyA, 1)).Value = MyA .Range("A1").Resize(UBound(MyA, 1)).Sort _ Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess End If End If Erase MyA End If End If End If End With Application.EnableEvents = True SMyStr = EMyStr End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count > 1 Then MyB = Target.Value Else SMyStr = Target.Value With Me .Range("A1", .Range("A65536").End(xlUp)).Name = "MyList" If Not Intersect(Target, .Range("B1:H10")) Is Nothing Then With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=MyList" .ShowError = False End With End If End With End If End Sub (SoulMan)
便乗質問です。 いつもお世話になります。 >=OFFSET($C$2,,,SUM((LEN($C$2:$C$7)<>0)*1)) 上記の数式は、エクセルのメニューのデータ→入力規則→ダイアログ(設定)で 入力値の種類でリストを選択→元のデータ欄に入れればいいのでしょうか? これで確認したところ、入力済みの名前がドロップダウンリストに残ってますが 使い方間違ってるでしょうか?(EXCEL 97) (EVO7)
C列のデータが未入力のものだけ残るようになっていますか? 私の最初のレスからの流れなので、 下記の状況を満たした状況で、入力規則の「もとのデータ」に設定するものです。 【B列に全項目のリストが入力されている】 【C列へは未入力のデータを表示する数式が入力されている】 >C2へ >=TEXT(INDEX($B$2:$B$101,SMALL(IF(COUNTIF($A$2:$A$101,$B$2:$B$101)=0,ROW($A$1:$A$100)),ROW(A1))),"#") >配列数式でCtrl+Shift+Enter。 (みやほりん)
あ、そういうことだったんですね。 今、ご教授頂いた通り入力して確認しました。 空白の残りも無く、うまく入力できるようになりました。 ありがとう御座いました。 (EVO7)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.