2016-11-09 89 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