2012-05-21 13 views
7

chcę zrobić coś takiego:Excel VBA: Jak rozszerzyć zakres Biorąc pod uwagę bieżący Wybór

E18-(1,1) &":" &E18+(1,1) 

Moim zamiarem jest, aby zachować wybór zakresu E18 (wartość = B) i rozszerzyć zaznaczenie do D16:F20 .

Cell_Image_Excel_Highlighted_B

Jeśli mam gamę komórce dotyczącą E18 i chcę, aby rozszerzyć zakres do D16:F20, w jaki sposób mogę to zrobić?

+2

Co masz na myśli przez przedłużenie. Jeśli znasz już swój zakres z 'D16: F20', to dlaczego nie użyć go bezpośrednio, aby go wybrać? –

+0

To jest przykład, załóżmy, że znam zakres komórki, który może znajdować się w dowolnym miejscu arkusza. Chcę dokonać wyboru obejmującego otaczający obszar tej komórki. Więc chcę rozszerzyć/rozszerzyć. – NCC

+1

ok będzie na początku tylko jedna komórka? –

Odpowiedz

2
Range(Cells(WorksheetFunction.Max(1, Selection.Row - 1), _ 
     WorksheetFunction.Max(1, Selection.Column - 1)), _ 
     Cells(WorksheetFunction.Min(Selection.Worksheet.Rows.Count, _ 
     Selection.Row + 1), _ 
     WorksheetFunction.Min(Selection.Worksheet.Columns.Count, _ 
     Selection.Column + 1))).Select 

UPD: dzięki Siddharth Pogrom na formatowanie mój wiad

13

Masz na myśli?

SYNTAX

ExpandRange [Zakres], [Ilość Col na lewo], [Liczba rzędów na szczycie], [Ilość Col na prawej], [Liczba rzędów w dół]

Sub Sample() 
    Debug.Print ExpandRange(Range("B5"), 1, 1, 1, 1)   '<~~ $A$4:$C$6 
    Debug.Print ExpandRange(Range("A1"), 1, 1, 1, 1)   '<~~ Error 
    Debug.Print ExpandRange(Range("XFD4"), 1, 1, 1, 1)   '<~~ Error 
    Debug.Print ExpandRange(Range("XFD1048576"), 1, 1, 1, 1) '<~~ Error 
    Debug.Print ExpandRange(Range("E5"), 1, 1, 1, 1)   '<~~ $D$4:$F$6 
End Sub 

Function ExpandRange(rng As Range, lft As Long, tp As Long, _ 
rt As Long, dwn As Long) As String 
    If rng.Column - lft < 1 Or _ 
     rng.Row - tp < 1 Or _ 
     rng.Column + rt > ActiveSheet.Columns.Count Or _ 
     rng.Row + dwn > ActiveSheet.Rows.Count Then 
     ExpandRange = "Error" 
     Exit Function 
    End If 

    ExpandRange = Range(rng.Offset(-1 * tp, -1 * lft).Address & ":" & _ 
         rng.Offset(dwn, rt).Address).Address 
End Function 
+0

Dziękuję za odpowiedź i tak, to jest to, czego szukałem. – NCC

+1

+1 Nicely Done :) –

3

Można użyć Application.WorksheetFunction.Offset() który jest bogatszy niż offset i robi wszystko VBA wymagane pytaniem.
Myślę, że robi to, co robi Siddharth Rout ExpandRange, bez potrzeby korzystania z UDF.

+0

Po prostu szybkie pytanie - myślę, że może właśnie post tutaj - w jaki sposób dodać ten zakres do listbox (jak wartości). Próbowałem Listbox1.List = ExpandRange("A1",0,0,1,1) Próbowałem również zdefiniować wariant, ale zwraca błąd: Nie można ustawić właściwości listy. – NCC

+1

@NCC: Co chcesz zrobić? Przypisać wartości uzyskanego zakresu do pola listy? –

+0

Tak, Siddharth Rout. Wydaje się, że nie znam tej koncepcji dobrze, ponieważ czasami mam ją, czasami nie. – NCC

6

Oto prosty kod, którego używam do zmiany rozmiaru istniejącego zaznaczenia.

Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count + 50).Select 

Doda 5 do liczby wierszy i 50 do liczby kolumn. Dostosuj się do swoich potrzeb.

0

Zamiast zwracać adres bezwzględny, modyfikuję powyższą składnię, aby zwrócić zakres. Kredyt trafia do Siddharth Rout =)

Function ExpandRG(rng As Variant, lft As Long, tp As Long, rt As Long, dwn As Long) _ 
As Range 
Set ws = rng.Parent 
If rng.Column - lft < 1 Or _ 
    rng.Row - tp < 1 Or _ 
    rng.Column + rt > ActiveSheet.Columns.Count Or _ 
    rng.Row + dwn > ActiveSheet.Rows.Count Then 
     MsgBox "Out of range" 
     Exit Function 
End If 

Set rng = ws.Range(rng.Offset(-1 * tp, -1 * lft).Address & ":" & _ 
        rng.Offset(dwn, rt).Address)       
End Function 

Sub aa() 
Dim ori_add, O_add, New_add As Range 
Set ori_add = Range("B2") 
Set O_add = ori_add 

Call ExpandRG(ori_add, 1, 1, 1, 1) 
Set New_add = ori_add 

MsgBox "Original address " & O_add.Address & ", new address is" & New_add.Address 
End Sub 
Powiązane problemy