2016-11-09 1 views
1

Ich versuche also, einen Beispielselektor zu erstellen.VBA Auswählen bestimmter Zeilen basierend auf der Liste der relativen Zeilennummern und des Bereichs

Die aktuellen Variablen, die ich habe, sind ein Bereich, der vom Benutzer angegeben wurde.

Settings.AmountColumn ist ein Bereich, der ähnlich wie B1: H100 aussieht. SampleRefArr ist ein Array von Zeilennummern relativ zur ersten Zeile von Settings.AmountColumn.

Zum Beispiel, wenn meine SampleRefArr (3,4,7) zeigt, dann muss ich die folgenden Bereiche (B4: H4, B5: H5, B8: H8) nehmen und sie in eine neue Tabelle kopieren. Ich habe den folgenden Code gebaut, aber das wählt nicht die richtigen Zellen ...

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

Sie schreiben (3,4,7) würde die Bereiche definieren (B4: H4, B5: H5, B8: H8), was bedeutet, dass Sie eine Verschiebung von einer Zeile haben. Ich sehe nirgends Beweise für diese Verschiebung. Fehle ich etwas? – FDavidov

+0

Wahrscheinlich eine Kopfzeile, dies entspricht der Datenzeile 3 –

+0

Es wäre wie Bereich ("b2: h1000"). Row (SampleRefArray (0)) –

Antwort

1

Sie diese verwenden:

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

wie genannt zu werden:

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

, welche Zellen "B4: H5" zurückkehren würde und "B8: H8" ausgewählt

+0

Hi! Ich habe leider ein kleines Problem mit diesem Code ... wenn ich ihn auf einer anderen Arbeitsmappe ausprobiere gibt er mir den folgenden Fehler "application defined object defined error" Irgendeine Idee, was das verursacht? –

+0

liegt daran, dass die 'Select'-Methode für einen Bereich im aktuellen _active_-Arbeitsblatt aufgerufen werden muss. Also sollten Sie 'rng.Parent.Activate' direkt vor der 'Intersect (rng, ...' Anweisung hinzufügen. BTW sollten Sie jegliche Kodierung auf Basis von' Select'/'Selection' /' Activate'/'ActiveXXX' vermeiden und verwenden B. den Substantiv in eine Funktion umwandeln, die den gewünschten Bereich zurückgibt: 'Function RangeSelector (rng Als Bereich, refArr als Variante) Als Bereich \ Set RangeSelector = Intersect (rng, rng.Range ("A" & Ersetzen (Join (refArr, ","), ",", "," A)). EntireRow.Offset (1)) \ 'End Function' – user3598756

+0

Ok danke dafür, also aus Gründen der Klarheit, jetzt wenn ich rangeSelector kann bekomme ich einen bereich zurück, den ich dann später anrufen muss anwählen? –

0

Vielleicht das?

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 
Verwandte Themen