人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【ExcelVBA 入力規則】
良回答には200ポイント差し上げます。
(ただし、当方初心者なので、注釈をかなりたっぷりめにつけていただけると幸いです。)

画像をご覧ください。


ボタン一発で全てのシートに対して、入力規則を設定したいです。
シート[マスタ]は、入力規則に設定するリストです。
A列は、設定したいシート名。
B列は、リストの内容です。

なおかつ、A列の値が連続していさえすれば、
行を挿入・削除しても、
それぞれのシートに入力可能な値が
自動的に変化するようにする方法をご教示願います。

(セル範囲に名前を付ける方法は、
挿入する場所によっては意図するように動きませんでした。)


よろしくお願いいたします。

1246767769
●拡大する

●質問者: ykdmmm
●カテゴリ:ビジネス・経営 コンピュータ
✍キーワード:たっぷり セル ボタン ポイント リスト
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● SALINGER
●60ポイント

まず、それぞれのシートには既に入力規則が設定されているとします。

(仮に設定されていないとすると、後から設定するにはセルが指定されていないので)

それぞれのシートの入力規則は =シート名 の名前を利用します。


それで、動的に名前の範囲を変更する為にマスターシートのチェンジイベントに次のコードを記入します。

(VBEでプロジェクトエクスプローラの画面でSheet?(マスタ)をクリックして開くエリアです)

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim lastRow As Long
 Dim i As Long
 Dim startRow As Long
 Dim nc As Integer
 
  '名前の削除
 nc = Names.Count
 For i = 1 To nc
 Names(1).Delete
 Next
 
 With Worksheets("マスタ")
 lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
 startRow = 2
 For i = 3 To lastRow + 1
 If .Cells(i - 1, 1).Value <> .Cells(i, 1).Value Then
 If .Cells(i - 1, 1).Value <> "" Then
 Names.Add Name:=.Cells(i - 1, 1).Value, RefersTo:=.Range(Cells(startRow, 2), Cells(i - 1, 2))
 End If
 startRow = i
 End If
 Next
 End With
End Sub


オーバーヘッドではありますが、コードではシートが変化するたびに名前を定義しなおします。

A列の名前は連続してあることが前提です。途中で切れたり飛び飛びで同じ名前が2箇所以上あると最後のまとまりが名前の範囲となります。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ