2016-11-09 92 views
1

所以我试图做一个样本选择器。VBA根据相关行号和范围列表选择特定的行

我有的当前变量是用户指定的范围。

Settings.AmountColumn是一个看起来像B1:H100线条的范围。 SampleRefArr是一个行号数组,相对于Settings.AmountColumn的第一行。例如,如果我的SampleRefArr显示(3,4,7),那么我需要采取以下范围(B4:H4,B5:H5,B8:H8)并将它们复制到新的电子表格中。我已经建立了下面的代码,但没有选择正确的单元格...

counter = UBound(SampleRefArr, 1) 

For i = 1 To counter 

    rowSelector = SampleRefArr(i) - Settings.AmountColumn.Cells(1, 1).Row + 2 
    'Settings.AmountColumn.Cells(rowSelector, 1).EntireRow.Select 
    Settings.AmountColumn(Cells(rowSelector, 1), Cells(rowSelector, 10)).Select 
Next i 
+1

你写道(3,4,7)将定义范围(B4:H4,B5:H5,B8:H8),这意味着你有一行的移位。我没有看到这种转变的证据。我错过了什么吗? – FDavidov

+0

可能是一个标题行,这对应于数据行3 –

+0

它就像范围(“b2:h1000”)。row(SampleRefArray(0)) –

回答

1

,你可以这样做:

Sub RangeSelector(rng As Range, refArr As Variant) 
    Intersect(rng, rng.Range("A" & Replace(Join(refArr, ","), ",", ",A")).EntireRow.Offset(1)).Select 
End Sub 

被称为像:

RangeSelector Range("B1:H100"), Array(3, 4, 7) 

这将返回细胞 “B4:H5” 和 “B8:H8” 选择

+0

嗨!不幸的是,这段代码有点问题......当我在不同的工作簿上运行它时,它给了我以下错误“应用程序定义的对象定义的错误” 任何想法是什么造成这种情况? –

+0

这是因为必须在当前_active_工作表中的某个范围上调用'Select'方法。所以你应该在'Intersect(rng,...'语句之前加上'rng.Parent.Activate',顺便说一句,你应该避免基于'Select' /'Selection' /'Activate' /'ActiveXXX'的任何编码并使用例如你可以将'Sub'变成'Function',返回所需的范围,例如:'Range RangeSelector(rng As Range,refArr As Variant)As Range \ Set RangeSelector = Intersect(rng,rng.Range (“A”&Replace(Join(refArr,“,”),“,”,“,A”))。EntireRow.Offset(1))\'End Function' – user3598756

+0

好的,谢谢你!当我可以RangeSelector我得到一个范围回来,然后我不得不打电话选择? –

0

也许这样?

counter = UBound(SampleRefArr, 1) 

For i = LBound(samplrefarr,1) To counter 
    With Settings.AmountColumn 
     rowSelector = SampleRefArr(i) - .Cells(1, 1).Row + 2 
     'Settings.AmountColumn.Cells(rowSelector, 1).EntireRow.Select 
     .Range(.Cells(rowSelector, 1), .Cells(rowSelector, 10)).Select 
    End With 
Next i