- ベストアンサー
エクセル:マクロで入力規制
メニューのマクロの中で入力規制がしたいです。 規制したいセルの場所が方々に沢山あるのでメニューの「入力規制」 Private Sub Worksheet_Change(ByVal Target As Range) Tage = Target If Tage = 1~100の自然数 Then ~~~ ElseIf Tage = 0 then ~~ Else ~~ End If End Sub 入力された値がTargetに入るので、 これをTageに入れて処理をしようと思うのですが、 ・Tageの変数型を何にしたらよいのかわかりません。 ・自然数であるか、はどのように書けばよいでしょうか。 入力される値は数字だけでなく、文字が入った時も考慮したいです。 以前上記コードでTageをInteger型にした時に「自然数かどうか」の判断を作成したのですが、 Intだから文字が入った場合に対応できませんでした。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「入力規制したい」がよく分かりません。エクセルの「データ」→「入力規則」と同等の意味であれば「ある条件以外の値は入力できなくする」ということになると思いますが、質問文のマクロでは正数、Zero値… と条件判定していますから、何をやりたいのか分からないのです 分からないなりに書くとこんな感じでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) '先頭で変更されたセルが規制対象セルかどうか調べる If 対象でないなら Exit Sub With Target If Isnumeric(.Value) Then '数値なら IF .Value > 0 And Int(.Value) = .Value Then MsgBox "自然数です" Else MsgBox "自然数じゃない" End If Else MsgBox "数値じゃない" End If End With End Sub
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
>メニューの「入力規制 この後が知りきれトンボみたいに感じるが、 メニューにあるのは、データー入力規則!では無いですか。 (1)規制・制約する区分が沢山あるなら、そう書けばよい >セルの場所が方々に沢山あるであれば、それとの関連は? 質問での表現が複雑になるのかもしれないが、・・。 入力規則では対応できないのでしょう。 (2)よく主旨を理解したとはいえませんが、思いつくところ データ性格は (A)IsNumeric, IsDate しか関数はない。 文字列 整数(これができれば自然数は>0を加えればよい) は自分でルーチンを組むしかない。 (B)値の範囲は 整数の範囲は、エクセルのVLOOKUP関数(TRUE型)を応用できそう。 Application.Worsheet.FunctionでVLOOKUP関数は使える。 TRUE型にして、区分範囲によってYかNを返し、Nが返ってくる範囲は エラーとして受け付けないのはどうでしょう。 ーー (C)変数の型は、VBですから、変数はVariant型で処理したら。 >メニューのマクロの中で VBAを使うということ?意味あいまい。自分でメニューを作る? >規制したいセルの場所が方々に沢山あるので イヤだけれど、セルのあり場所にルール性が無ければ、列挙記述にならざるを得ない。本当にプログラムにコード化(基本は繰り返し法に帰着させること)ができ無いのか、質問に内容を書いて、識者の知恵を借りては? 私なら、セルが10数個所以内ぐらいなら、Arrayに定義して、繰り回し比較をして、列挙を避ける。 >セルの場所が方々に沢山あるので 質問のコードは、この点の考慮が入っていないのではないですか。 ですから、範囲が甘くならざるを得ないのでは。 あらまほしき、「セル(範囲)と規制値」の関係を質問(補足)で文章化して、良い方法を聞いたら?
補足
回答ありがとうございます。 ANo.1さんの方にも書きましたが、質問文はご指摘の通り途中で切れてた上に、 それを差っ引いても意味不明でした。 (メニューにある項目が『入力規制』でなく『入力規則』であることは今気づきました) 要約すると、 ・入力規制をしたいので、入力した値が文字か数値か判定する記述を教えて欲しい でした。 >>セルの場所が方々に沢山あるので >質問のコードは、この点の考慮が入っていないのではないですか。 入れませんでした。 挙げたコードの先頭に「値を入力したセルが規制をしたいセルであるならば」の判定が入ります。 その部分はできていたため割愛しましたが、 必要な部分でした、申し訳ありません。 メニューの『入力規則』を上記セルに適用するには、 そのセルを1つずつ選択していかなければならないと思い、 「セルの場所が方々に沢山あるので(手間だ)」に繋がるつもりでした。 ANo.2さんに書いていただいた内容は自分の知識では正直ほとんど理解できないのですが、 「Arrayに定義して」とやらを利用すれば簡単にできたのでしょうか。 規制したいセルは、コピーで対処できそうな部分を除くと2000箇所程でした。 上に「値を入力したセルが規制をしたいセルであるならば」はできていた、と書きましたが、 これをメニューの『入力規則』のユーザー設定→「数式」に巧く書けば、 『入力規則』にも対応できたのかもしれません。 よく見たら、頭にある「メニューの」もミスでした。 この部分で伝えたかったのは、 「マクロを組んで判定したい」「メニューにある『入力規則』は使いたくない」の2点でした。 色々思慮が足りませんでした。 本当に申し訳ないです。 これにわざわざ回答していただきありがとうございました。
お礼
回答ありがとうございます。 ご指摘ごもっともです、たしかに理解してる自分以外にはまったく意味不明でした。 とりあえず、先に結論をば。 ここに挙げていただいたコードが私の欲しいものでした。 ありがとうございます。 以下、自分の投稿の解説ですので無視して構いません。 まず、2行目は説明が途中で切れてます。 よそで書いたものを入力欄に貼り付けたのですが、その際に手違いで消してしまったようです。 以下のような内容を書いたつもりでした。 ・メニューにある〔入力規制〕は、規制するセルを選択しないと使えない。 ・規制したい複数のセルが方々に散っているので、それらに同一の規制をするには、 対象のセルを全てCtrl押しながら選択したり、規制内容を1つずつ貼り付けたりしないといけない。 ・だからメニューの〔入力規制〕ではなく、マクロで入力規制を行いたい。 メニューの〔入力規制〕の使い方云々は自分の知る限りのものなので、 こちらを使っても望む結果は得られるのかもしれません。 また、こちらで提示したコードは条件分岐を書いただけでした。 規制はif文の中ですることだから、確かにそれだけじゃ規制したことになりませんね。 「入力規制をしたい」ではなく、 「入力した値が数値かどうか、数値なら自然数かどうか、を判定したい」とでも書くべきでした。 判定した先で、「文字の場合は無視する」「ゼロの場合はメッセージを出す」などと規制をするつもりだったため、 先走って「入力規制をしたい」と書きました。 意味不明な投稿をして申し訳ありません。 更に意図を考えて回答していただき、本当にありがとうございました。