ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:marky2 関数とリスト
困り度:
  • 困っています
お世話になってます。

エクセル2003で、
経理の書類を作っています。

そのなかで、A2に1−(1)、1−(2)といったコードを入れています。
5種類ほどあり、たとえば、同じ消しゴムでも1−(1)だったり1−(2)だったりします。

しかし、A1に○がついている物品(30品ほど)のときは
コードが常に2−(1)になります。

コードはいつも入力規則のリストから選んでいるのですが、
A1に○があるときは、常にA2に○が表示され、
それ以外のときはリストから選べるようにする
ということはかのうでしょうか?

よろしくおねがいします。
質問投稿日時:08/07/02 15:19
質問番号:4145818
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:Masa2072 > 実際には、A1にあたるのは、L54:P54 (セルの結合しています。) B2は、R53:V53 (結合)です。

リストボックスを表示させるセルはR53(R53:B53)だけでよろしいのでしょうか?
処理対象セルをL54、R53に限定した場合のソースは以下の様になります

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$L$54" Then
If Target.Value = "○" Then
Range("R53").Value = "2-(1)"
End If
ElseIf Target.Address = "$R$53" Then
If Range("L54").Value = "○" And Target.Value <> "2-(1)" Then
Target.Value = "2-(1)"
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Me.ListBox1
'R53にリスト外の文字が入っているとエラーになるので、エラーはスキップさせる
On Error Resume Next
'セル結合を行っているためTarget.Addressは$R$53ではない
If Target.Address = "$R$53:$V$53" Then
If Range("L54").Value = "○" Then
.Visible = False
Target.Value = "2-(1)"
Exit Sub
End If
.Top = Target.Top
.Left = Target.Offset(0, 1).Left
.LinkedCell = Target.Address
.Visible = True
Else
.LinkedCell = vbNullString
.Visible = False
End If

End With
End Sub
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/02 18:10
回答番号:No.7
この回答へのお礼新しいコードを作っていただきありがとうございました。
正しく作動しました。
ありがとうございました。

回答

良回答10pt

回答者:imogasi 質問の内容が全貌が見えないが、
特にA2だけを問題にしてよいのか、A3,A4・・はどうなるのか質問に書いてないから不安だが
ーー
質問内容に忠実にやるとVBAが必要になり、コードは下記。
リストはE列にある例で、コードの後半Range("A2").Select
以下はマクロの記録をとって手直しすれば出来上がる。
シートのChangeイベントに入れる。
ーー
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Range("A2") = ""
If Target = "○" Then
Range("A2").Validation.Delete
Range("A2") = "2-(1)"
Else
Range("A2").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$E$1:$E$7"
.IgnoreBlank = False
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.IMEMode = xlIMEModeNoControl
.ShowInput = True
.ShowError = True
End With
End If
End If
End Sub
ーー
これに、効果上で極く近いのが、#4のご回答と思う。
A1にXを入れないとダメな点が少し違う。
上記例では○以外の場合、A1の値は○以外であればよいので、A1は空白でも、例えばaでも1でもスペースでもよい。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/02 17:46
回答番号:No.6
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:Masa2072 ANo3です。
> 「左のツリー」がわかりません。
Visual Basic Editorを開くと画面が左(1/4)、右(3/4)くらいに分かれていて
左側のほうに
VBAProject (Book1)
 Microsoft Excel Object
  Sheet1 (Sheet1)
  Sheet2 (Sheet2)
  Sheet3 (Sheet3)
  ThisWorbook

といったリストが無いでしょうか?
なければキーボードでCtrlキーを押しながらRを押してみてください。
(表示メニュー − プロジェクト エクスプローラー  でもOKです。)

あと、先ほどのコードには一部不具合がありB列を手で編集し、リスト以外の値を入力すると、次回選択時にエラーが発生します。
Worksheet_SelectionChang(・・・・の下に
On Error Resume Nextと追加してください。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/02 17:18
回答番号:No.5
この回答への補足とてもわかりやすい説明ありがとうございます。
消えていた状態でした。

申し訳ないのですが、さきほどのA1,A2は
便宜上のもので、
実際には、A1にあたるのは、L54:P54 (セルの結合しています。)
B2は、R53:V53 (結合)です。

もしお時間がおありでしたら、セルの位置の直し方を教えていただきたく思います。
 
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:mshr1962 Sheet2
 A    B
1 ×    ○   
2 1-(1) 2-(1)
3 1-(2)
4 1-(3)
5 1-(4)
6 1-(5)
として「挿入」「名前」「作成」で「上端行」のみチェックでOK

A2の入力規則にて
入力値の種類「リスト」
元の値「=INDIRECT(IF(COUNTIF(A1,"*○*"),"○","×"))」

これでA1に○の付く品名が入ると2-(1)しか選べなくなります。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/02 16:43
回答番号:No.4
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:Masa2072 入力規則やリストですと条件によって、表示・非表示の切り替えができません。
コントロールオブジェクトのリストボックスを使用しVBAを利用することで可能になります。
1.ワークシートにリストボックスを作成します。
  表示メニュー − ツールボックス − コントロール ツールボックスを表示し
  ワークシート上にリストボックスを作成
2.ListBox1のプロパティ変更
  ListFillRangeに入力するデータの一覧があるセル範囲のアドレスを入力する
 仮にSheet1のF1〜F5に入っていれば Sheet1!F1:F5
  VisibleをFalseに変更
3.デザインモードを終了
  コントロール ツールボックスの「デザインモードの終了」ボタンをクリック(三角定規のマーク)
4.ツールメニュー − マクロ − Visual Basic Editorを開きマクロを記述
  ※以下ブックがBook1.xls シートがSheet1だと仮定
  左側のツリーよりVBA Project(Book1)の下Microsoft Excel Objectのさらに下にあるSheet1 (Sheet1)を選択し右クリックから「コードの表示」し以下のソースを貼り付けする

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
If Target.Value = "○" Then
Target.Offset(0, 1).Value = "2-(1)"
End If
ElseIf Target.Column = 2 Then
If Target.Offset(0, -1).Value = "○" And Target.Value <> "2-(1)" Then
Target.Value = "2-(1)"
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Me.ListBox1

If Target.Column = 2 Then
If Target.Offset(0, -1) = "○" Then
.Visible = False
Target.Value = "2-(1)"
Exit Sub
End If
.Top = Target.Top
.Left = Target.Offset(0, 1).Left
.LinkedCell = Target.Address
.Visible = True
Else
.LinkedCell = vbNullString
.Visible = False
End If

End With
End Sub

以上で準備が完了です。
動きとしてはB列を選択するとリストが表示、B列以外を選択でリストが非表示になります。
A列に○を入力すると隣のセルに2-(1)を自動で入力
B列を変更した際に隣のA列セルに○が入力されていれば、2-(1)に戻す。
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/07/02 16:25
回答番号:No.3
この回答への補足ありがとうございます。
VBEを開くところまではできましたが、
「左のツリー」がわかりません。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:mu2011 条件によってリスト選択する方法は駄目でしょうか。
(1)「○」又は「2−(1)」リストの名前定義(仮にリスト1)と他データリストの名前定義(リスト2)を別シートに設定
(2)入力規則で「リスト」選択、元の値欄に=IF($A$1="○",リスト1,リスト2)
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/02 16:18
回答番号:No.2
この回答への補足ありがとうございます。
だいぶ楽になりました。

高望みなのかもしれませんが、
教えていただいた方法は、2−(1)でも一度リストから
選ばなくてはならないです。
A1に○がある段階で、A2に2−(1)と表示される方法はありませんか?
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:hallo-2007 例えば
  A   B                 C
1   =IF(A$1="○","2−(1)",C1)  1−(1)
2                       1−(2)
・・・・
とB列に式を入れて下フィル
入力規則のリストの範囲をB列を指定する
とA1に○を入れると、A2のリストは 2−(1)
しか表示されない
A1に○以外だと、C列のリストが表示される
いうトリックではダメでしょうか。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/02 15:45
回答番号:No.1
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示良回答のみ表示