質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

5779閲覧

セルに値を入れたら隣のセルにボタンを自動生成させる方法

horik

総合スコア44

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2016/07/28 12:47

編集2016/07/28 17:50

失礼しました。
詳しく用途をご説明します。

B列とC列のセルに何かしらの値をいれると
A列にBC列の値を引数とした関数を呼び出すボタンを生成させます。
また、
BとCどちらかでも欠けていたらボタンは生成しない。
値を消したらボタンも消えるようにしたいです。
生成されたボタンの名前は「ボタン2」のようになりますが、
「login」のように別の文字列に変えたいです。

用途としては、
特定サイトのアカウント情報の管理です。
B列にアカウントID、C列にパスワードを入れてボタンを押すと
IEでログインページに行ってフォームを入力する作業をさせたいと考えています。

↓完成のイメージです↓
イメージ説明

------修正前の質問--------
そのボタンを押すと、セルに入れた値を引数として関数を呼び出すようにしたいです。

いろいろ検索してみましたが解決策が見つからなかったのでここで質問させてもらいました。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mr_Roboto

2016/07/28 13:13

関数はボタンを押さなくても適切に入れれば呼び出されると思うのですが、具体的にどうしたいかもう少し詳しく書いて頂けますか?
Mr_Roboto

2016/07/28 13:13

あと、タイトルと質問の内容が違うように思います。
horik

2016/07/28 17:21

失礼しました。詳しい内容を追記しました。
guest

回答2

0

ベストアンサー

こんな感じでしょうか。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 3 With Target 4 ' BCセル以外は無視 5 If .Column <> 2 And .Column <> 3 Then Exit Sub 6 7 ' 一旦削除 8 Dim btn As Shape 9 For Each btn In ActiveSheet.Shapes 10 If btn.Name = "btn" & .Row Then 11 btn.Delete 12 End If 13 Next btn 14 15 ' 両方入力されてたら作成 16 If Cells(.Row, 2) <> "" And Cells(.Row, 3) <> "" Then 17 Buttons.Add(Cells(.Row, 1).Left, Cells(.Row, 1).Top, Cells(.Row, 1).Width, Cells(.Row, 1).Height).Select 18 Selection.Name = "btn" & .Row 19 Selection.Text = "login" 20 Selection.OnAction = "'" & ActiveSheet.Name & ".onButton """ & Cells(.Row, 2) & """,""" & Cells(.Row, 3) & """'" 21 End If 22 23 .Select 24 25 End With 26 27End Sub 28 29Sub onButton(b As String, c As String) 30 MsgBox b & "," & c 31End Sub 32

投稿2016/07/29 00:46

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

horik

2016/07/29 12:32

ありがとうございます! 期待通りの動きになりました。
guest

0

質問文の内容に回答するとこんな感じになると思います。

Sub ボタン1_Click() 'シートからセルの値を取得 Dim strVal As String strVal = ActiveSheet.Cells(1, 1) '取得した値を元にtest関数を呼び出す Call test(strVal) End Sub Private Sub test(vVal As String) '引数の内容をメッセージ表示 MsgBox vVal End Sub

質問タイトルの内容とは全く異なりますが・・・。

質問タイトルの内容だとこんな感じでしょうか?(・・・かなりやっつけですが。)

Private Sub Worksheet_Change(ByVal Target As Range) Dim nextCell As Range Set nextCell = Cells(Target.Row, Target.Column + 1) ActiveSheet.Buttons.Add(nextCell.Left, nextCell.Top, nextCell.Width, nextCell.Height).Select Selection.OnAction = "test" End Sub

投稿2016/07/28 13:36

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

horik

2016/07/28 17:25

ありがとうございます。 Microsoft Excel個のオブジェクト→Sheet1(sheet1)に 上のコードを書いたらボタンが生成されるようになりました。 しかしボタンを押すと以下の警告が出てしまします。 マクロ 'ブック1!test' が見つかりません。
jawa

2016/07/29 01:14

エラーが発生しているのは、ボタンを押したときに呼び出すことにしているtest関数が、参照できる範囲に存在していないからです。 サンプルコードでは仮に"test"関数を呼び出すことにしていますが、本来はlogin_click関数のようなものを作成して呼び出すことになると思います。 また、セルの位置にあわせてボタンを生成していますが、ボタン自体は自分がどのセルに張り付いているのかを知りません。 どのボタンを押しても同じ関数を呼び出すのであれば、関数の中でどの行に対応するボタンが押されたのかを判別する必要があります。 例えば、ボタンの名前(表示名ではなくオブジェクト名)を"Button_"+行番号のようにすると判別ができるようになります。 その他、質問本文の変更を受けて実装が必要と思われるものを洗い出してみました。 ①B列・C列の変更時のみボタン生成する  ⇒Target.Colmnで判定して対象外なら何もしない ②同じ行にボタンを作成しない  ⇒既に存在するボタン名なら作成しない ③B/C列が未入力ならボタンを消す  ⇒②と同様に、ボタン作成済みかを判断してあればボタンを消す 以上のことを行うために、以下のサイトが参考になると思います。 [Excel-Excel!](http://www.excel-excel.com/tipsctr/vbac_8.html) がんばってみてください。
horik

2016/07/29 12:35

ありがとうございます。 さらにカスタマイズできそうな感じがしてきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問