2010-02-04 14 views
17

Tengo un pequeño script en Excel/VB que estoy tratando de poner en funcionamiento. Todo lo que quiero hacer es seleccionar un rango dinámico de datos para copiar, pero parece que no puedo encontrar ninguna ayuda/código sobre cómo obtener los datos de la grilla (como A11).Obtenga la celda actual en Excel VB

Aquí está el código que tengo de grabación de macros que selecciona el rango de datos:

Range("D291:D380").Select 

Tenía la esperanza de que sólo podía hacer Range(Current).Select o algo, pero que no funciona.

Cualquier ayuda es apreciada.

+1

App.ActiveCell;) –

Respuesta

20

Ha intentado:

Para una celda:

ActiveCell.Select 

Para múltiples celdas seleccionadas:

Selection.Range 

Por ejemplo:

Dim rng As Range 
Set rng = Range(Selection.Address) 
+2

Creo " Acto iveCell.Address "funcionará. Tengo un MsgBox que muestra los datos variables que estoy tratando de obtener. –

+0

@Apps Agregué un poco más. Echale un vistazo. –

+0

Para expandir esta respuesta, una vez que estableces 'rng' puedes obtener' rng.Cells.Column' y 'rng.Cells.Row'. Para expandir 'ActiveCell.Address', si' Dim s como String: s = ActiveCell.Address' devolverá (por ejemplo) "$ E $ 3". – Barniferous

2

Si está tratando agarrar un rango con un dynami camente generada cadena, a continuación, sólo tiene que construir la cadena como esta:

Range(firstcol & firstrow & ":" & secondcol & secondrow).Select 
+0

App.ActiveCell. –

2

Esto no puede ayudar a responder a su pregunta directamente, pero es algo que he encontrado útil cuando se trata de trabajar con rangos dinámicos que pueden serle de ayuda.

Supongamos que en su hoja de trabajo que tiene los números 100 a 108 en las celdas A1: C3:

  A B C 
1  100 101 102 
2  103 104 105 
3  106 107 108 

A continuación, para seleccionar todas las celdas que puede utilizar el CurrentRegion propiedad:

Sub SelectRange() 
Dim dynamicRange As Range 

Set dynamicRange = Range("A1").CurrentRegion 

End Sub 

La ventaja de esto es que si agrega nuevas filas o columnas a su bloque de números (por ejemplo, 109, 110, 111), entonces CurrentRegion siempre hará referencia al rango ampliado (en este caso, A1: C4).

He usado CurrentRegion bastante en mi código VBA y creo que es más útil cuando se trabaja con rangos de tamaño dinámico. También evita tener rangos de código duro en su código.

Como nota final, en mi código verás que utilicé A1 como celda de referencia para CurrentRegion. También funcionará sin importar a qué celda haga referencia (intente: reemplazar A1 por B2, por ejemplo). El motivo es que CurrentRegion seleccionará todas las celdas contiguas en función de la celda de referencia.

2

La palabra clave "Selección" ya es un objeto Range de VBA para que pueda utilizarlo directamente, y usted no tiene que seleccionar las celdas a copiar, por ejemplo, puede estar en Hoja1 y emitir estos comandos:

ThisWorkbook.worksheets("sheet2").Range("namedRange_or_address").Copy 
ThisWorkbook.worksheets("sheet1").Range("namedRange_or_address").Paste 

Si se trata de una selección múltiple se debe utilizar el objeto Área en un bucle for:

Dim a as Range 
For Each a in ActiveSheet.Selection.Areas 
    a.Copy 
    ThisWorkbook.worksheets("sheet2").Range("A1").Paste 
Next 

Saludos

Thomas

+0

Debe ser 'Dim a As Range' – barrowc

+0

Corregido gracias! – Thomas

1

Prueba este

Dim app As Excel.Application = Nothing 
Dim Active_Cell As Excel.Range = Nothing 

Try 
      app = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application) 
Active_Cell = app.ActiveCell 

Catch ex As Exception 
      MsgBox(ex.Message) 
      Exit Sub 
     End Try 

'    .address will return the cell reference :) 
0

Sé que esto no se aplica directamente desde el título de la cuestión, sin embargo algunas formas de lidiar con una gama variable podría ser la de seleccionar la gama cada vez que el código se ejecuta - especialmente si está interesado en un rango seleccionado por el usuario. Si es interesado en esa opción, puede usar la Application.InputBox (página de documentación oficial here). Una de las variables opcionales es 'tipo'. Si el tipo se establece igual a 8, InputBox también tiene una opción de selección de rango estilo Excel. Un ejemplo de cómo utilizarlo en el código sería:

Dim rng as Range 
Set rng = Application.InputBox(Prompt:= "Please select a range", Type:=8) 

Nota:

Si asigna el valor Cuadro de entrada a una variable no-gama (sin la palabra clave Set), en lugar de los rangos , serán asignados los valores de las gamas, como en el código de abajo (aunque la selección de varios rangos en esta situación puede requerir los valores a asignar a una variante):

Dim str as String 
str = Application.InputBox(Prompt:= "Please select a range", Type:=8) 
Cuestiones relacionadas