重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

よろしくお願いします
ユーザーフォームに決定ボタンで、テキストボックスを任意の数追加しました。

追加されたテキストボックスにD1.D2.D3.D4・・・と名前をつけ、それぞれに
1.2.3と数値を記入し、

登録ボタンをクリックした後ワークシートkeyplanの
指定したセルD30~G30へ代入させようとしたところ、

「変数が定義されていません」となってしまいます。

Nameの付け方が悪いのでしょうか。転機の仕方が悪いのでしょうか。
マクロを勉強し始めて日が浅いので、対処の方法がわかりません。
ご回答よろしくお願いします。

Option Explicit

Private Sub UserForm_Initialize()
worksheets("keyplan").Select
End Sub

Private Sub 決定_Click()

Dim txt As Variant
Dim i As Integer
'テキストボックスを配置
i = nyuryokubox()
For i = 1 To i
Set txt = Me.Controls.Add("Forms.Textbox.1", , True)

With txt
.Width = 20
.Height = 18
.Top = 300
.Left = 1 + (.Width + 80) * (i + 1)
.BorderColor = &H666666
.BorderStyle = fmBorderStyleSingle
.Font.Size = 15
.Name = "D" & i
End With
Next
End Sub

Private Sub 登録_Click()
With worksheets("keyplan").Select
.Range("D30").Value = D1.text
.Range("E30").Value = D2.text
.Range("F30").Value = D3.text
.Range("G30").Value = D4.text
End With
End Sub

変数 i にはテキストボックス(nyuryokubox)に直接数値を入れるようにしています

「EXCEL VBA UserForm の」の質問画像

A 回答 (2件)

こんにちは。



>i = nyuryokubox()  
この部分は、いずれにしても、参照できませんね。
おそらく、既存のTextBpxで、ボタンで生成するTextBoxの数でしたら、nyuryokubox.Value や.Text プロパティだと思います。それは、配列です。

> For i = 1 To i
i は、ループのカウンターに使っているのですから、i 自体は、数値型で、To (定数)ですから、別の変数(例:j = nyuryokubox.value として、For i = To j など)にしないと、ループは完成しません。初歩的なミスだと思います。

それから、TextBoxのプロパティ等を調べてみましたが、マクロから、オブジェクト名を変更できなかったようですから、D1.Text は使えませんね。

Controls("D1").Text 等でしかないようです。

登録_Click()
Dim obj As Object
Dim i As Long
  With Worksheets("keyplan")
    For Each obj In Me.Controls
    If obj.Name Like "D#" Then 'Dの付いた名前を探す
     i = i + 1
     .Cells(30, i + 3).Value = Controls("D" & i).Text
    End If
    Next
   End With
 End Sub
    • good
    • 0
この回答へのお礼

WindFaller様 ご回答ありがとうございました。

 希望通りの結果が得られました。感激・感動です。

 ご指導、ご指摘いただき誠にありがとうございました。
 まだまだ勉強中ですので、またご質問させていただきますが、
 よろしくお願いします。

 

お礼日時:2015/01/17 12:23

Controls.Addで動的に追加されたオブジェクトは デザイナで追加したコントロールのように直接変数名での参照ができないようです



方法としては UserFormのクラス変数として
Dim txt(1 to 3) as MSForms.TextBox
などと宣言しておくか

.Range("D30").Value = Controls("D1").Text
といった具合に Controlsコレクションから間接的なアクセスになるようです

この回答への補足

 
redfox63様 早速ご回答いただきましてありがとうございます。
 投稿して良かったと思っています。大変勉強になります。

 >.Range("D30").Value = Controls("D1").Text
 でやってみたのですが、「オブジェクトが必要です」になってしまいます。
 ちなみに、Text→text と頭文字が大文字にならないのも何か不具合の要因でしょうか?

 > UserFormのクラス変数として
 経験が浅く的外れかもしれませんが、
 Private Sub UserForm_AddControl(ByVal Control As MSForms.Control)
  Dim txt(1 To 3) As MSForms.TextBox
 End Sub

他でもやってみましたが、違います?

補足日時:2015/01/17 10:55
    • good
    • 0

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