AIと戦って、あなたの人生のリスク診断 >>

OfficeExcel2003を使用しています。
ユーザーフォームのテキストボックスやコンボボックスに文字や数値を入力し、OKボタンを押せばエクセルのセルに記入できるようにしようと思ってます。
フォームはなんとか(形だけですが..)作成できたのですが、そのフォームを呼び出す方法として、入力したい行のA列のセルをクリックすればユーザーフォームが表示されるようにしたいのです。
ネット上でいろいろ検索してみましたがなかなか見つけることができませんでした。
初歩的な質問かもわかりませんが、教えて頂けないでしょうか。
宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

シートモジュールに下記を入れる。


A列をダブルクリックするとユーザーフォームが起動
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column <> 1 Then Exit Sub
UserForm1.Show
End Sub
    • good
    • 3
この回答へのお礼

ありがとうございました。
教えて頂いた方法でできました。

お礼日時:2008/05/04 16:34

厳密には「セルをクリックすればユーザーフォームが表示」させるイベントはありません。

その代わりに#01さんが書かれているダブルクリックイベント(BeforeDoubleClick)を使うか、#02さんのSelection_Changeイベントを使うことになります。ただしSelection_Changeイベントは矢印キーでアクティブセルを移動させてもイベントが発生しますから「マウスのクリック」に限定できません。

でもryunohitomiさんだけがそのブックを操作するならどちらの方法でもあまり気にする必要はないですが、もし他人にも操作をさせるなら「何もないセルをクリックすることが操作のきっかけになる」というGUI設計は、そのルールを知らないと操作できませんから好ましくないですね。

やはりシート上にコマンドボタンを配置して、明らかに「これをクリックすればよい」ことがわかる方が親切な設計ではないでしょうか。
もしシートが「スクロールするのでボタンが見えなくなる」というならウィンドゥ枠の固定を行って、スクロールしないエリアにボタンを配置すればよいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
いろいろな方法があるのですね。
今回は私個人がほとんど使用するものですので、見た目がシンプルな方法で考えてました。
アドバイスありがとうございました。

お礼日時:2008/05/04 16:40

ユーザーフォームを1つ挿入します。

VBE画面で。
(1)ユーザーフォーム
(A)その上にテキストボックスを1つ貼り付けます(実際は複数個でも可。例題を簡単にするため)
(B)またその上にテキストボックスを1つ貼り付けます(実際は複数個でも可)
(C)コマンドボタンを1つ貼り付けます。入力完了通知用。
コンボのプロパティはRowSourceにF1:F3といれ、F1:F3のセルには
東京
名古屋
大阪
と入れておく。エクセル向きに書いたもの。プログラムからも設定できる。
ユーザーフォームはShowModalをFalseにしておく。
(2)イベント・プロシ
(A)コマンドボタンのクリックイベントに
Private Sub CommandButton1_Click()
ActiveCell = UserForm1.TextBox1.Text
ActiveCell.Offset(0, 1) = UserForm1.ComboBox1.Text
'---
UserForm1.TextBox1.Text = ""
UserForm1.ComboBox1.Text = ""
UserForm1.Hide
End Sub
を作ります
(B)別にシート(Sheet1)のelectionChangeイベントに
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 1 Then
UserForm1.Show
End If
End Sub
====
操作について

A列を選択
フォームが出る
氏名を入力、支店名を選択
コマンドボタンをクリック
値がクリックしていたセルのA列とB列にセットされる
フォームが消える
以上繰り返し。
A列の行範囲を限定もコードを変えると可能。
    • good
    • 0
この回答へのお礼

ありがとうございました。
教えて頂いた方法でもできるようになりました。

お礼日時:2008/05/04 16:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qエクセルで各セルをダブルクリックで各入力フォームが出る

エクセルで顧客管理ソフトのようなものを作っています。本来アクセスが良いと思うのですが、導入できない環境です。
またVBAに関しては初心者ですが、懸命に勉強しております。

今回作っているものは、実際に使用するのはエクセル初心者(文字入力程度しか出来ない人)が使用することになるため、極力分かりやすいように出来ればと思っています。

A   B   C   D   E
ID  姓   名   所属  性別

このような表があったとき、IDのセルをダブルクリックすると、そのIDの人の入力フォーム(姓名、所属、性別等)が出るようにしています。
例えばA2セルをダブルクリックでフォーム1(ID:001用)が出るという感じです。

が、このデータが大体1000人弱くらいあります。
このような場合、A3のセルはID:002のフォームが出るように、手作業で入力していかないといけないのでしょうか。(入力フォームを人数分用意しないといけないでしょうか)

出来れば人数が増えた時など「フォームの追加」などで、追加できればよいと思っています。このボタン一つで、対応したフォームが作成され、A列には「ダブルクリックで対応したフォームが開く」というような感じにすることは可能でしょうか。

また、入力フォームで入力した内容がシートにリストとなって表示されていますが、いくつかの条件をもとにそれに合う人を抽出する場合、VLOOKUPが使われることが多いと思いますが、これも「検索フォーム」のようなもので、条件を入力(もしくはプルダウンリストから選ぶ等)して表示させることは可能ですか?

分かりづらい点がありましたら補足いたします。
ご教授いただければと思います。

エクセルで顧客管理ソフトのようなものを作っています。本来アクセスが良いと思うのですが、導入できない環境です。
またVBAに関しては初心者ですが、懸命に勉強しております。

今回作っているものは、実際に使用するのはエクセル初心者(文字入力程度しか出来ない人)が使用することになるため、極力分かりやすいように出来ればと思っています。

A   B   C   D   E
ID  姓   名   所属  性別

このような表があったとき、IDのセルをダブルクリックすると、そのID...続きを読む

Aベストアンサー

ユーザーフォームに
Private Sub UserForm_Initialize()
GYOU = ActiveCell.Row
TextBox1.Value = Range("A" & GYOU).Value
TextBox2.Value = Range("B" & GYOU).Value
End Sub
Private Sub cndEntry_Click()
GYOU = ActiveCell.Row
Range("A" & GYOU).Value = TextBox1.Value
Range("B" & GYOU).Value = TextBox2.Value
End Sub
を貼り付けてみてください。
出来るだけわかりやすく記載していますので、何が起きているのか利害できると思います。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

Qエクセル A列のセルをクリックするとフォームが出て

A列のセルをクリックするとフォームAが出てリストBOXの値をクリックするとA列のクリックしたセルに値を返す また同じようにB列のセルをクリックすると違うフォームBが出てリストBOXの値をクリックするとB列のクリックしたセルに値を返す そんなことが実現出来るのでしょうか ご指南ください。

Aベストアンサー

Worksheet_BeforeDoubleClickでもかまわないですよ

ご質問時に『ダブルクリックで』起動と明記されていなかったのでSelectionChangeを薦めたわけです

選択はどのように行いますか?
やるならUserFormのイベントではなく ListBoxのイベントで処理します
MouseUp,KeyUp あたりでしょう

Private Sub ListBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyReturn And Shift = 0 Then
    Unload Me
  End If
End Sub

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If Button = 1 And Shift = 0 Then
   Unload Me
  End If
End Sub
といった具合です

Worksheet_BeforeDoubleClickでもかまわないですよ

ご質問時に『ダブルクリックで』起動と明記されていなかったのでSelectionChangeを薦めたわけです

選択はどのように行いますか?
やるならUserFormのイベントではなく ListBoxのイベントで処理します
MouseUp,KeyUp あたりでしょう

Private Sub ListBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyReturn And Shift = 0 Then
    Unload Me
  End If
End Sub

Private Sub ListBox...続きを読む

Qexcelのリストボックスで選択した項目をアクティブセルに入力方法

もしかしたら既出かもしれませんが・・・
フォームコントロールのリストボックスで入力範囲の指定したリストをリンクするセルをワークシート上にクリックしたセルに入力させる方法はありますか?
もし、不可能でしたら、ActiveXコントロールのリストボックスでも構いません。よろしくお願いいたします。

Aベストアンサー

そのリストボックスの、コードの表示で
Private Sub ListBox1_Click()
ActiveCell = ListBox1.List(ListBox1.ListIndex)
End Sub
と入れるだけ。
コントロールツールボックスのコントロールを、ワークシートに直接
貼り付けた場合。
WEBや解説書で、ListboxとかListindexなど調べましたか。

QEXCEL(VBA) セルをクリックしたときの処理

何度もお世話になります。

A5:A20のどれかをクリックしたときに
クリックしたセルが値が入力済みか確認してから
ファイルを名前を付けて保存したいのですが
クリックしたという情報(イベント?)の取得方法が
わかりません。

(1)どのようにチェックすればよいのでしょうか?
(2)また、皆さんはどのようにしてこのような問題を解決してるのでしょうか?

よろしくお願いします。

Aベストアンサー

Sheet1だとして、
Sheet1のマクロで

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
If Target.Column = 1 And Target.Row >= 5 And Target.Row <= 20 Then
If Target.Value <> "" Then MsgBox "入力済み"
End If
'
End Sub

と入れると、クリックしたセルがA5からA20のどれかで
かつセルに値が入っているときのみ”入力済み”とメッセージが表示されます。
このメッセージ表示の部分を、「名前を付けて保存」の処理に置き換えてはいかがでしょうか。

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qユーザーフォームの入力をシートに反映

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついたのが、「ひとつ下のセルに記述する」ということでした。
で、本を見ながら考えたのが、
With Sheets(2)
Range("A1").Select
ActiveCell.Offset(1, 0).Value = TextBox1.Text
ActiveCell.Offset(1, 0).Value = TextBox2.Text
ActiveCell.Offset(1, 0).Value = TextBox3.Text
まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

(2)フォームOKボタンを押して、上記の処理をしても、フォームに記入したものが次にフォームを開いた時に消えていないように、
Me.Hide
End Sub
で終わらせたのですが、次に開いても残っていません。

無知でお恥ずかしいですが、宜しく御願い致します。

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついた...続きを読む

Aベストアンサー

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(2).Range("A1")
    .Offset(1, 0).Value = TextBox1.Text
これでSheet2のA2から書き出すはずです。(未確認です)

>で終わらせたのですが、次に開いても残っていません。
『残っていない』のではなく、最初にデザインした状態が再度表示されているわけです。

残すためには、プロパティ『ControlSource』にセルを指定する必要があります。
または、下の例示のように『Initializeイベント』で値を取得する必要があるでしょう。



質問では、オプションボタンやテキストボックスが沢山あるみたいですが、一括で処理する例です。

オプションボタン1~80の値をA1~A80に、
テキストボックス1~80の値をB1~B80に 書き込んでいます。

説明を簡略化するために、オプションボタン等の番号と書き出すセルの行番号を一致させています。

終了後、最後フォームを開いた時に書き込んだ値を取得するために、『Unload』で終わり、
『UserForm_Initialize』で取り込んでいます。コード表現は書き込みと逆ですね。


'Sheet2へ書き込む
Private Sub CommandButton1_Click()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を書き出し
    For i = 1 To 80
      .Range("A" & i) = UserForm1.Controls("OptionButton" & i).Value
    Next
    'テキストボックスの値を書き出し
    For i = 1 To 80
      .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text
    Next
  End With
End Sub


'Formを呼び出したとき、Sheet2から読み込む
Private Sub UserForm_Initialize()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を読み込み
    For i = 1 To 80
      UserForm1.Controls("OptionButton" & i).Value = .Range("A" & i)
    Next
    'テキストボックスの値を読み込み
    For i = 1 To 80
      UserForm1.Controls("TextBox" & i).Text = .Range("B" & i)
    Next
  End With
End Sub


'終了ボタン
Private Sub CommandButton2_Click()
  Unload Me
End Sub

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング