[PR]ネットとスマホ OCNでまとめておトク!2つの割引で月額基本料が【永年1,300円/月割引】

Excelでユーザーフォームを作りました。

ユーザーフォームには、テキストボックスを2個、ボタンを1個("記入"という文字が入っています)置いてあります。

テキストボックスに入れた数値をSheet1のセル"C24","C25"に転記したいので、ユーザーフォームのコードを次のようにしましたが、エラーメッセージは出ないかわりに何も動いてくれません。
「どこ」と「なに」が違いどうするのが正しいのか教えて下さい。よろしくお願いします。


Private Sub Tbox1_Change()
a = Tbox1.Value
End Sub
----------------------------
Private Sub Tbox2_Change()
b = Tbox2.Value
End Sub
----------------------------
Sub 記入Button_Click()
'入力値をSheet1に転記
Dim a As Range
Dim b As Range
Sheets("Sheet1").Select
Set a = Range("C24")
Set b = Range("C25")
End Sub

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

A 回答 (4件)

こんにちは。



>Sheet1のセル"C24","C25"に転記
なら、単に、TextBox のそれぞれのControlSource に、Sheet1!C24, Shee1!C25
と書けばよいのですが。

ただ、#2さんも触れていますが、初歩的な基礎がまだ足りないようですね。1週間もすれば、この程度のコードは書けるようになりますから、何か、適当な参考書を手に入れて参照したほうがよいです。

変数のプロパティ ← 値
Set オブジェクトの変数 =実際のセル

こうして変数に格納されます。
    • good
    • 0
この回答へのお礼

Wendy02さん ありがとうございました。簡単なんですね。
ControlSourceをまだ知りませんでした。勉強いたします。

次にボタン2 の Control に移ります。またよろしくお願いします。

お礼日時:2007/06/15 09:09

Rangeの概念はよく分からないのですが、


気が付いたのは、

・a,bがプロシャージャーレベル変数であるので、
プロシャージャ[記入Button_Click(])内でしか使えず
Tbox■_changeで使用するためには、モジュールレベル変数にして、
そのモジュール全体で使用できる必要があると思います.

・オブジェクト型変数 Renge に value は代入できないのでは?
(こっちが微妙)
valueで代入するなら、変数宣言をintegerにしてみてはいかがでしょうか?

と思います.
よって、私が直したモジュールは、

---------------------------------------
Dim a As Integer'モジュールレベル変数
Dim b As Integer

Private Sub TBox1_Change()
a = TBox1.Value
End Sub

Private Sub TBox2_Change()
b = TBox2.Value
End Sub

Private Sub 記入Button_Click()

Sheets("Sheet1").Select
Range("C24") = a
Range("C25") = b
End Sub
-------------------------------------
また、今回の処理では、TBox■_Change()はあまり意味をなしません.
さらに、changeで毎回監視をしている場合、複雑な処理をする時に、
コンピュータがさらに遅くなる場合があります.
よって、tbox■_change()のプロシャージャは消去して
-----------------------------------------
Private Sub 記入Button_Click()
Dim a As Integer
Dim b As Integer
Sheets("Sheet1").Select
b = TextBox2.Value
a = TextBox1.Value
Range("C24") = a
Range("C25") = b
End Sub
-------------------------------------
または
-------------------------------------
Private Sub 記入Button_Click()
Dim a As Integer
Dim b As Integer
Sheets("Sheet1").Select
Range("C24") = TBox1.Value
Range("C25") = TBox2.Value
End Sub
-------------------------------------
だけでも良いと思います

もちろん、#1さんの形がプログラムとして一番奇麗だと思います
#1さんの Tbox1 と Tbox2 の後に.value を付けたら、数字として使用できると思います.(未確認)
    • good
    • 0
この回答へのお礼

J2Jさん ありがとうございました。
ControlSource の記述で、とりあえずの問題は片付きました。

お礼日時:2007/06/15 09:07

何も動かないのではなく、指示された通りに動作しただけです。



>「どこ」と「なに」が違いどうするのが正しいのか教えて下さい。よろしくお願いします。

変数の使い方、使われ方の理解が無いですね。

>a = Tbox1.Value

「Sub Tbox1_Change()」内部で定義した a と言う変数に値を格納。し、プロシージャの終了とともに消滅。

>Set a = Range("C24")

「Sub 記入Button_Click()」内部で定義した a と言う変数にセルC24を定義(セット)し、プロシージャの終了とともに消滅。

双方の a と言う変数は全く無関係な変数なので、同じ値を共有する事は出来ません。
また、双方とも変数への格納なので、変数の値をどこかに格納する記述がありません。

プロシージャ間で変数を共有する場合は「グローバル変数」を定義する必要があります。
    • good
    • 1
この回答へのお礼

hana-hana3さん ありがとうございました。
ControlSource の記述で、とりあえずの問題は片付きました。

変数のこと、いただいた解説でだんだんわかってきました。勉強いたします。

お礼日時:2007/06/15 09:10

Sub 記入Button_Click()


  '入力値をSheet1に転記
  Worksheets("Sheet1").Range("C24")=Me.Tbox1
  Worksheets("Sheet1").Range("C25")=Me.Tbox2
End Sub
だけで良いのでは?(未確認)
    • good
    • 0
この回答へのお礼

bonaronさん ありがとうございました。
ControlSource の記述で、とりあえずの問題は片付きました。

お礼日時:2007/06/15 09:12

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

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

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

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

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

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エクセル VBA ユーザーフォームを閉じる

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

Aベストアンサー

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

QUserFormにテキストボックスを作成してその内容をExcleに反映

初めまして。ExcelのVBAをチャレンジしています。
初心者なので良くわからないため質問させて頂きました。

今、商品登録用のユーザーフォームを作成しています。

ユーザーフォームには

TextBox1=「商品No.」
TextBox2=「商品名」
TextBox3=「単価」
TextBox3=「仕入先」
CommandButton1=「登録」
CommandButton2=「終了」

があります。

「商品No.」,「商品名」,「単価」,「仕入先」を入力し、「登録」をクリックしたらExcelに横一列(参考1)に反映させ、入力・登録を繰り返し行い(商品が入ったら随時入力)下に追加していきたいのですが、どの様にすれば宜しいでしょうか?

<参考1>
  A    B   C   D
1 商品No. 商品名 単価 仕入先
2 001   ○○○ 10円 △△ 
3 ・     ・   ・  ・
4 ・     ・   ・  ・
5 ・     ・   ・  ・

Aベストアンサー

必要最低限のコードです。
実情に合わせて変更してください。


Private Sub CommandButton1_Click()
 Dim i As Long
 i = Range("A65536").End(xlUp).Row + 1
 Range("A" & i) = Format(UserForm1.TextBox1.Value, "000")
 Range("B" & i) = UserForm1.TextBox2.Value
 Range("C" & i) = UserForm1.TextBox3.Value & "円"
 Range("D" & i) = UserForm1.TextBox4.Value
End Sub

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

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

Aベストアンサー

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

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エクセルVBA ユーザーフォームのTextBoxを日付にしたい

いつもいつも 皆様からのお返事を心待ちにしておりますNannyです。

VBAのユーザーフォームでTextBoxを日付専用入力にしたいのです。

で、入力方法が 20050219 というような形で入力して、2005/02/19という形か、平成17年2月19日というような形に持って行って、セルに貼り付けしたいのです。

出来なさそうな予感満載なのですが、皆様お返事の程宜しくお願い致します。
(出来ないのであればあきらめられるので、出来るかどうかのお返事も期待しております。

宜しくお願い致します。

Aベストアンサー

下記はTextBox1に20050219としCommandButton1をクリックするとシート1のA1に2005/2/19と出力します。
Private Sub CommandButton1_Click()
Worksheets(1).Range("A1").Value = Format(TextBox1.Text, "0000""/""00""/""00")

End Sub

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ユーザーフォームに入力したデータを保持する方法

VBA初心者です。いろいろ調べて徐々に進められていますが、、
こちらもなかなか見つからなかったので質問させていただきます。

現在、ユーザーフォームにテキストボックスをいくつか配置し、
さまざまな計算などをさせて、最終的にエクセルシートに反映させる。
といったことが出来るようにプログラムをしています。

ユーザーフォームのテキストボックスに一度入力したものを、
エクセルシートを閉じるまで残すことはできるでしょうか?

一度、×ボタンで閉じてしまうと、次に呼び出したときには初期の状態になってしまいます。

ユーザーフォームに入力し、エクセルシートで確認、
その後 再度ユーザーフォーム呼び出して修正する
といった作業をするために、一度入力したものが消えないようにしたいです。

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

Aベストアンサー

閉じるボタンで閉じるとき、Hideで閉じればいいだけの様な気がします。

UserFormのモジュールに記述します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> 1 Then
 Cancel = True
 Me.Hide
End If
End Sub

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

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

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

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

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

Aベストアンサー

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

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


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

人気Q&Aランキング