• 締切済み

特定のセルをクリックしたらフォームを出現させたい

いつも回答して頂き、ありがとうございます。 特定のセルをクリックしたら、フォームが現れて、その特定セルを基準にして、フォームに入力された内容を各セルに記載していきたいと思っています。 この特定セルは、列は変わりませんが、行は変わります。 御教授の程宜しくお願い致します。 特定セルは黄色のセルです。赤枠で囲まれた部分が一つのフォーマットです。 下記が現状のフォームを出す記述です。 Sub 作業内容設定フォームの表示() 作業内容設定.Show End Sub

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

> その下、更にその下の作業状態をアクティブにしても、 > フォームが出る様に出来ないものでしょうか? If Not Application.Intersect(Target, Range("B1:B13")) Is Nothing Then ここの範囲を変えれば良いだけですが? 別のフォームを表示するなら、 If Not Application.Intersect(Target, Range("B1:B13")) Is Nothing Then     処理1 ElseIf Not Application.Intersect(Target, Range("範囲")) Is Nothing Then     処理2 End If のように重ねてやれば良いです。 ちなみに「B列の最終行番号」を取得してやれば、一発でできる可能性は高いですね。 つまり・・・ Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim TRow As Long Application.EnableEvents = False     TRow = Cells(Rows.Count, 2).End(xlUp).Row     If Not Application.Intersect(Target, Range("B4:B" & TRow)) Is Nothing Then         作業内容設定.Show     End If Application.EnableEvents = True End Sub こんな感じでどうかなぁ、と。 あとは適宜応用ください。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1です。 B~E列にまたがっていて、各領域のB列は結合しているといった、見分ける手段があるなら下記の様にできるでしょう。 ところで、動作確認をしていて、各領域の先頭セルをActivateしようとしてはまってしまいました。ModalなUserForm表示の前にせよ、後にせよ、先頭セルをActivateする文を入れると、UserFormのUnload Meが効かなくなってしまいます。(xl2010) DoEventsを沢山入れようが、Sleepを入れようがダメみたいです。仕方がないので、先頭セルのActivateは諦めました。 UserFormモジュール側で、ActiveCellの位置から先頭セルを計算しても良いのですが、シートモジュールで計算して渡せないかと考えてみました。結局、引数を渡す代わりに領域の先頭セルをPropertyにセットしてからModal表示させてみました。 ☆シートモジュール Private Sub Worksheet_SelectionChange(ByVal target As Range) If target.Column < 2 Or target.Column > 5 Then Exit Sub If target.Offset(0, -1 * (target.Column - 2)).MergeCells = False Then Exit Sub Load UserForm1 '引数を渡す代わりに領域の先頭セルをPropertyにセットしてみた Set UserForm1.targetRange = target.Offset(0, -1 * (target.Column - 2)).MergeArea.Cells(1).Offset(0, 1) UserForm1.Show End Sub ☆Userform1モジュール テキストボックス2個と、コマンドボタンを置いてある Dim myRange As Range Public Property Set targetRange(newRange As Range) Set myRange = newRange End Property Private Sub CommandButton1_Click() myRange.Value = TextBox1.Value myRange.Offset(1, 0).Value = TextBox2.Value Unload Me End Sub Propertyセット漏れのエラー処理が盛り込んでありません。UserForm_ActivateでmyRangeがnothingなら抜けるといった方法が考えられます。まあ、そこまで考えるなら、素直にUserFormモジュールでActivecellから算出する方が良いかも。 ご参考まで。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

質問の主旨は > 特定のセルをクリックしたらフォームを出現させたい で良いという判断での回答です。 通常、エクセルでは「セルをクリックしたら」と言うタイミングは用意されていないので 「アクティヴセルが変わったら」のタイミングを使います。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)     If Not Application.Intersect(Target, Range("B1:B13")) Is Nothing Then         作業内容設定.Show     Else         Exit Sub     End If End Sub これでできますが、キーボードの矢印キーで移動させた場合も反応してしまいます。 回避しようと思ったら、例えば図のB4:B13の範囲に大きさを合わせて 「四角」や「コマンドボタン」を配置するやり方がおそらく楽です。 コレの「クリック時イベント」にユーザーフォームを表示するように書いてやればOKです。 質問の主旨が > その特定セルを基準にして、フォームに入力された内容を各セルに記載していきたい なのだとしたら、それはタイトルと大きくかけ離れる内容ですし、 #1さんもおっしゃるように 「現状はどのように入力されているのか(あるいはその方向性)」について 一切記載がありませんので、アドバイスも難しいです。

kero1192kero
質問者

お礼

回答して頂きありがとうございました。 図を見てもらえば分かると思いますが、下にも別の作業状態を記入する箇所が用意されています。ちなみにその下に同じものがあるかもしれません。不確定です。 で、その下、更にその下の作業状態をアクティブにしても、フォームが出る様に出来ないものでしょうか? 甘えた質問だと思いますが宜しくお願い致します。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

入力規則のプルダウンがせせこましくて嫌という方のためにセルクリックでUserFormを表示させ、ListBoxから選択した値を当該セルに書き込む例です。「フォームに入力された」というのをどの様なコントロールで実現しているか書かれていないので、とりあえずご参考まで。 http://okwave.jp/qa/q7601464.html