2012-05-21 58 views
7

quiero hacer algo como:Excel VBA: Cómo ampliar un rango determinado de una selección actual

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

Mi intención es la de mantener la selección del rango E18 (valor = B) y ampliar la selección a D16:F20 .

Cell_Image_Excel_Highlighted_B

Si tengo rango de una célula de E18 y quiero ampliar la gama de D16:F20, ¿cómo puedo hacer esto?

+2

¿Qué quiere decir con extender. Si ya conoce su rango ex 'D16: F20', ¿por qué no usarlo directamente para seleccionarlo? –

+0

Este es un ejemplo, supongo que si conozco un rango de la celda que puede estar en cualquier lugar de la hoja. Y quiero hacer una selección que incluya el área circundante de esta celda. Entonces quiero extender/expandir. – NCC

+1

¿habrá una sola célula para comenzar? –

Respuesta

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: gracias Siddharth Rout para formatear mi msg

13

¿Te refieres a esto?

La sintaxis de

ExpandRange [Rango], [Número de Col a la izquierda], [Número de filas on Top], [Número de Col a la derecha], [número de filas hacia abajo]

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

Gracias por la respuesta y sí, es lo que busqué. – NCC

+1

+1 Hecho bien :) –

3

Puede usar Application.WorksheetFunction.Offset() que es más rico que el Offset de VBA y hace todo lo que requiere la pregunta.
Creo que hace lo que hace Siddharth Rout ExpandRange, sin la necesidad de un UDF.

+0

Pregunta rápida, creo que podría publicar aquí, cómo agrego este rango a un cuadro de lista (como valores). Intenté Listbox1.List = ExpandRange("A1",0,0,1,1) También traté de definir una variante, pero devuelve un error: No se pudo establecer la propiedad de la lista. – NCC

+1

@NCC: ¿Qué quieres hacer? Asignar los valores del rango resultante a un cuadro de lista? –

+0

Sí, Siddharth Rout. Parece que no conozco bien este concepto porque a veces lo hago funcionar, otras veces no. – NCC

6

Aquí está el código simple que utilizo para cambiar el tamaño de una selección existente.

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

Esto agregará 5 al recuento de filas y 50 al recuento de columnas. Adapte para adaptarse a sus necesidades.

0

En lugar de devolver una dirección absoluta, modifico la sintaxis anterior para devolver un rango. El crédito va a 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 
Cuestiones relacionadas