2016-09-05 5 views
0

Я создал UserForm в VBA следующим образом: enter image description hereПосмотрите данные, основанные на нескольких переменных в VBA UserForm

Когда пользователь заполняет форму, запись будет сохранена на «Лист2». Для каждого идентификатора управления должно быть 3 возможных действия. Что я хочу сделать, так это то, что после того, как пользователи будут вводить имя Control ID и Activity, форма будет заполнена существующими данными из «Sheet2». Вот что я придумал, используя «Index»/«Match», но он возвращается с ошибкой «Тип несоответствия».

Private Sub Reg3_AfterUpdate() 

With Me 
.Reg2 = Application.WorksheetFunction.Index(Sheet2.Columns(3), Application.WorksheetFunction.Match(1, (Sheet2.Columns(2) = CLng(Me.Reg1)) * (Sheet2.Columns(4) = CLng(Me.Reg3)), 0)) 

End With 

End Sub 

Reg1 - это идентификатор управления, расположенный в столбце 2; Reg2 - полное имя, указанное в колонке 3; и Reg3 is Деятельность, расположенная в колонке 4.

Может кто-нибудь, пожалуйста, помогите мне?

ответ

0

Нечто подобное вы могли бы получить на трассе

      '-- lets assume you want value from row 1, column 3 
          ' from "Sheet2" 
Dim wb As Workbook 
Dim ws As Worksheet 

Dim row As Integer, column As Integer 

Set wb = ActiveWorkbook 
Set ws = wb.Sheets("Sheet2") 
row = 1 
col = 3 

Me.Reg2.Text = ws.Cells(row, col) 
+0

спасибо за Ваш ответ. Однако предположение, что вы делаете, слишком жесткое. Я знаю только столбцы, в которые входят все переменные, но я не знаю строк. Вот почему я использовал «Index/Match». Мне нужно искать значения на основе двух условий (идентификатор управления и активность) – Cypress

+0

У Томаса хорошее решение, вы также можете установить цикл – Felix

1

Томас имеет хорошее решение. Если вы хотите, чтобы использовать только (без функции Excel) VBA, вы можете также установить поисковую петлю так:

With ws 
    For row = fisrtRow To lastRow 
     val = .Cells(row, col) 
     If val = controlID And val = activity Then 
      '.... 
     Else 
      '... 
     End If 
    Next row 
End With 
+0

Фактически я не учитывал второе условие. Правильное решение. +1 –

0
here is the best solution for you 


write the following code ih the after update event 

Private Sub Reg3_AfterUpdate() 
SheetS("SHEET2").Range("A1:C4").Select 
Selection.AutoFilter 
    SheetS("SHEET2").Range("$A$1:$C$4").AutoFilter Field:=1, Criteria1:="=Product no", Operator:=xlAnd 

    SheetS("SHEET2")..Range("$A$1:$C$4").AutoFilter Field:=1, Criteria1:="=Activity", Operator:=xlAnd 

'add your code to get the value from range(a2:c2) like the following 
FULLNAME.TEXT=SHEETS("sheet2").range("B2) 
End Sub 



'in this example I assume that the data is stored in range(A1:C4) 
'SO AFTER YOU APPLY THE FILTER YOU WILL GET ONE UNIQUE ROW REPRESENTING 
'YOUR 'DATA .THEN YOU JUST NEED TO IMPORT THE DATA FROM THE sheet2 CELLs 

'and so on