2016-12-11 96 views
0

我動態地創建一個名爲UserForm1的用戶表單。在其中,我生成了文本框,這些文本框將由用戶手動填充。之後我想閱讀它們的價值,但我不知道如何調用(文本框的值)。在vba excel中讀取userform中動態命名的文本框的語法?

下面的代碼位被用於創建和命名文本框:

With UserForm1 'scaling userform 
    .Height = max_width 
    .Width = 600 
End With 

For test1 = 1 To nr_of_zeros + 1 'create textboxes 
    Set ctextbox = Controls.Add("forms.textbox.1", test1) 'creating textbox 
    With ctextbox 'scaling textbox 
     .Height = 20 
     .Width = 40 
     .Top = 40 + 25 * test1 
     .Left = 400 
    End With 

所以文本框將有多少名的test1(整數或長?)。

我嘗試了下面的句子,試圖將文本框的值讀入:absorb_text但目前爲止還沒有成功。有沒有人知道調用上面創建的文本框的正確完整方式?

'ctextbox.name = Controls.Add("forms.textbox.1", test1) 'creating textbox 
    'absorb_text = forms("textbox").Controls(test1).Value 

    'absorb_text = forms.("UserForm1").textbox.(test1).value 
    forms.textbox.1.(test1) 
    strname = TextBox1(test1).Text 

(模擬到,一個不叫細胞 「A2」 通過)

.range("A2") 

Thisworkbook.worksheets("sheetname").range("A2").text 
Thisworkbook.worksheets("sheetname").range("A2").value 
Thisworkbook.worksheets("sheetname").cells(2,1).text 
Thisworkbook.worksheets("sheetname").cells(2,1).value 

非常感謝您!我仍然想知道爲什麼/ 1"forms.textbox.1"中做了什麼,因爲它的工作原因,但它被它的功能弄糊塗了。

同樣根據您的討論如下:我相信,從技術上說,代碼不會查找等於/號1的控件名稱,而是查找恰好等於字符1的字符串字符。不等於一個數字而是一個字符。

*反對的論點是,它仍然適用於:`如果ctrl.Name = 1那麼'在這種情況下,我會認爲1被視爲一個數字。

+0

嘗試以下 –

回答

2

當你在你的代碼行創建了TextBox ES: Set ctextbox = Controls.Add("forms.textbox.1", test1)你的文本框的名稱是1,2,3,等

爲了讀你TextBox ES(在運行時創建的)我循環遍歷User_Form的所有控件,檢查它是否爲TextBox,並檢查控件的Name屬性。

代碼

Option Explicit 

Private Sub ReadRunTimeTextBox() 

Dim ctrl   As Control 
Dim absorb_text  As String 

' loop through all control in user form 
For Each ctrl In Me.Controls 
    ' check if control is type TextBox 
    If TypeName(ctrl) = "TextBox" Then 
     ' if control name is 1 (first created TextBox in your array) 
     If ctrl.Name = "1" Then 
      absorb_text = ctrl.Text 

      ' the message box is for debug only 
      MsgBox absorb_text 
     End If 
    End If 
Next ctrl 

End Sub 
+1

我的答案代碼@ThomasInzina嘗試運行這段代碼,它的正常工作 –

+0

我希望你接受我謙卑的道歉。評論撤回。 –

+0

@ThomasInzina大聲笑,只有當你+1 :) –

1

這裏有兩個辦法可引用動態添加的控制

Const nr_of_zeros = 4 
For test1 = 1 To nr_of_zeros + 1 'create textboxes 
    Debug.Print Controls(test1) 
Next 

Debug.Print Me![1] 
Debug.Print Me![2] 
Debug.Print Me![3] 
Debug.Print Me![4]