2014-10-14 4 views
1

나는 "GO"버튼과 "EXIT"버튼 만 가지고있는 "userform1"폼이있는 프로젝트를 가지고 있습니다. 숫자에 대한 입력 상자를 통해 사용자 입력을 요구합니다. 그런 다음 코드를 사용하여 그 수의 레이블과 텍스트 상자로 양식을 채우고 작성된 텍스트 상자를 편집 할 수 있도록 양식을 표시합니다. 이 시점까지 모든 것이 잘 작동합니다. 그런 다음 "GO"버튼을 사용하여 다른 위치에서 사용할 textbox.text 값이있는 배열을 채우기를 원합니다. 이것은 내가 문제가있는 곳입니다.코드 생성 된 텍스트 상자에서 textbox.text 값을 가져올 수없는 이유

정상적으로 (Xstring = UserForm1.Box1.Text와 같은) 텍스트가 검색되지 않았습니다. 작동하지 않았습니다. 그래서 나는 폼 컨트롤을 통해 순환했다. UserForm1.Controls.index(), 내 Textbox .names가 있는지 확인하여 존재하는지 확인합니다. 나는 그것들을 발견 했으므로 색인 (3), .name = "Box1"을 골랐다. 아래를 참조

Dim tText As String 
tText = UserForm1.Box1.Text 
MsgBox tText 

'메서드 나 데이터 구성원을 찾을 수 없습니다'오류를 반환하지만이로 변경하는 경우 :

Dim x As Object 
Dim tText As String 
Set x = UserForm1.Controls.Item(3) 
tText = x.Text 
MsgBox tText 

MSGBOX이는 .text 값을 반환

그래서 QUESTION이 정상적으로 처리되지 않는 이유는 무엇입니까? 인덱스 배열과 배열을 채우기위한 이름을 알아내는 데 필요한 모든 추가 단계를 거치지 않아도됩니다.

참조를 위해, 아래의 레이블/텍스트 상자를 만들기위한 내 서브의 부분적인 코드는 다음과 같습니다

For i = Data(x, 1) To z 
    Lab = "forms.label.1" 
    Box = "forms.textbox.1" 
    Set newlabel = UserForm1.Controls.Add(Lab) 
    Set newtextbox = UserForm1.Controls.Add(Box) 
    lbl1 = ("Label" + CStr(i)) 
    With newlabel 
     .Name = lbl1 
     .Caption = "No. " + CStr(i) 
     .Left = Data(x, 3) 
     .top = top 
     .Height = 20 
     .Width = 30 
    End With 
    lbl2 = ("Box" + CStr(i)) 
    With newtextbox 
     .Name = lbl2 
     .Text = CStr(i) 
     .Left = (Data(x, 3) + 35) 
     .top = top 
     .Height = 20 
     .Width = 36 
    End With 
    top = top + 25 
Next i 

답변

0

UserForm1 런타임 전에 그 이름의 방법 또는 데이터 멤버가 없습니다. 따라서 VBA 통역사는 의미가 무엇인지 해석 할 수 없습니다.

당신은 그럼에도 불구하고 같은 중 인덱스 번호 또는 컨트롤 이름을 색인 자식 컨트롤의 컬렉션을 통해 항목에 액세스 할 수 있습니다 Cor_Blimey에서 주석을 읽은 후

Dim myTxtBox As MSForms.TextBox 

Me.Controls.Add bstrProgId:="Forms.Textbox.1", Name:="My Runtime Textbox" 

Set myTxtBox = Me.Controls("My Runtime Textbox") 

myTxtBox.Text = "Hello" 
+0

귀하의 제안에 따라 텍스트 상자 만들기 작업을 다시했습니다. 그것은 'userfom1.textbox1.text'가 여전히 결과를 산출하지 않는다는 점에서 차이를 만드는 것처럼 보이지 않았습니다. 그것도 다치게하지 않았다 ... –

+0

@HarryToes'userfom1.textbox1.text'는'textbox1'이 디자인 타임에 생성되지 않으면 (즉, 텍스트 상자를 폼으로 드래그하여 이름을 "textbox1"로 지정하지 않으면 작동하지 않을 것입니다. 모든 텍스트 상자를 찾으려는 것처럼 보입니다. 컨트롤의 이름을 기반으로 '추측'하는 대신 컨트롤의 개체 유형을 '내 각 cntrl에 대해'와 같이 테스트하십시오. 컨트롤 : typeof cntrl이 TextBox 인 경우 'do some stuff : end if : next' –

0

, 이것은 내가 지금에서 일하고있는 것입니다

Dim i As Integer, num As Integer, ctr As Integer 
Dim oCntl As Object 
Dim tText() as String 

num = UserForm1.Controls.Count 
ReDim tText(num) 
For Each Control In UserForm1.Controls 'loops thru each control 
    If TypeOf Control Is TextBox Then 
     ctr = ctr + 1 
     tText(ctr) = Control.Text 
    End If 
Next Control 
ReDim Preserve tText(ctr) 

는 .text가 배열 순차적으로 기록되고있다 (인덱스 번호로, 주문 텍스트 상자가 생성 된) 미래에서 , 나는이 개 값을 고려해 볼 수 있습니다 : 내 프로그램을 검색하기위한 코드는 textbox.text 데이터를 생성 ~ 안에 배열, .name에 대해서는 1, .text에 대해서는 1입니다.

관련 문제