2014-10-26 46 views
-2

我该如何避免select,我真的需要使用该功能还是有更好的功能。 谢谢你的时间。避免选择,两阶段公式,更快

Sub Makro3() 
     Range("D5").Select: ActiveCell.FormulaR1C1 = "=INDEX(S_Skills_1[L],(MATCH(16622,S_Skills_1[ID])))" 
    x = Range("D5").Value 
     Range("D5").Select: ActiveCell.FormulaR1C1 = "=INDEX(S_Skills_2[L],(MATCH(16622,S_Skills_2[ID])))" 
    y = Range("D5").Value 
     Range("D5").Value = Application.WorksheetFunction.max(x, y) 

     Range("D6").Select: ActiveCell.FormulaR1C1 = "=INDEX(S_Skills_1[L],(MATCH(3446,S_Skills_1[ID])))" 
    A = Range("D6").Value 
     Range("D6").Select: ActiveCell.FormulaR1C1 = "=INDEX(S_Skills_2[L],(MATCH(3446,S_Skills_2[ID])))" 
    B = Range("D6").Value 
     Range("D6").Value = Application.WorksheetFunction.max(x, y) 
    End Sub 
+3

更好?你在找什么? – 2014-10-26 20:23:07

回答

3

试试这个。 UNTESTED

Sub Makro3() 
    X = Evaluate("=INDEX(S_Skills_1[L],(MATCH(16622,S_Skills_1[ID])))") 
    Y = Evaluate("=INDEX(S_Skills_2[L],(MATCH(16622,S_Skills_2[ID])))") 
    Range("D5").Value = Application.WorksheetFunction.Max(X, Y) 

    A = Evaluate("=INDEX(S_Skills_1[L],(MATCH(3446,S_Skills_1[ID])))") 
    B = Evaluate("=INDEX(S_Skills_2[L],(MATCH(3446,S_Skills_2[ID])))") 
    Range("D6").Value = Application.WorksheetFunction.Max(X, Y) 
End Sub 
+2

+1 - 但是等等,没有[链接发布关于不使用主动和选择](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) ? :-) – 2014-10-26 20:25:58

+0

lol @ PortlandRunner:我在考虑是否发布该链接:D有点厌倦这样做......但无论如何,你做到了这么酷! – 2014-10-26 20:26:48

+0

@PortlandRunner啊谢谢你,我的回答中仍然存在一个小错误,为命名数组定义'SP1'范围。 – 2015-05-02 11:26:21

0

这是我最后的代码。如果你想知道所需要的东西我。感谢@Siddharth Rout

Sub FindMatchingValue() 
    Dim dat1 As Variant: Dim dat2 As Variant 
    Dim SP1 As Range:  Set SP1 = [T5:V500] 'Range("S_Skills_1") why I cant use named areas for columns ? 
    Dim SP2 As Range:  Set SP2 = [W5:Y500] 
    Dim i As Long 

    Find1 = 16622 
    dat1 = SP1.Value 
    dat2 = SP2.Value 
    Find2 = 3446 

Range("D5, D6, D12, D13").Value = 0 

FirstCheck: 
    For i = 1 To 300 
    If dat1(i, 1) = Find1 Then _ 
    X = (dat1(i, 3)) 
    If dat2(i, 1) = Find1 Then _ 
    Y = (dat2(i, 3)) 
    Next 

SecondCheck: 
If Not X = 5 Or Y = 5 Then GoTo NoMore: 

FullSkill: 
    For i = 1 To 300 
    If dat1(i, 1) = Find2 Then _ 
    A = (dat1(i, 3)) 
    If dat2(i, 1) = Find2 Then _ 
    B = (dat2(i, 3)) 
    Next 
Range("D5, D12").Value = 5 
Range("D6, D13").Value = Application.WorksheetFunction.max(A, B) 
GoTo Finish: 

NoMore: 
Range("D5, D12").Value = Application.WorksheetFunction.max(X, Y) 
Range("D6, D13").Value = 0 

Finish: 
Call L_Set 
Call LockS 
Range("D1").Select 

End Sub