Cómo seleccionar una columna entera en una macro

23/01/2005 - 21:01 por Teletreks | Informe spam
Hola a todos, mi problema es el siguiente:

tengo una base de datos que obtengo mediante una consulta sobre un programa
de contablidad. Desués la "pormateo" con una makro, pero siempre tengo dos
columnas (cuyo tamaño nunca serà igual) en las que existen celdas en blanco.
Cómo puedo hacer para que la macro seleccione las dos columnas (que siempre
estarán en el mismo sitio) con independencia de las filas que contengan?

Muchas gracias por anticipado.

Preguntas similare

Leer las respuestas

#1 KL
23/01/2005 - 21:20 | Informe spam
Hola Teletreks,

Para seleccionar una columna entera hay varias formas, p. ej:

ActiveSheet.Columns(1).Select
o
ActiveSheet.Columns("A:B").Select
o
ActiveSheet.Range("A:B").Select
o
ActiveSheet.Range("A1:B1").EntireColumn.Select
etc.

Por otro lado, por lo q intuyo de tu mensaje a lo mejor estas seleccionando
columnas donde no es estrictamente necesario. Si expones el codigo aqui,
procuraremos ayudarte a depurarlo.

Saludos,
KL



"Teletreks" wrote in message
news:
Hola a todos, mi problema es el siguiente:

tengo una base de datos que obtengo mediante una consulta sobre un
programa
de contablidad. Desues la "pormateo" con una makro, pero siempre tengo dos
columnas (cuyo tamano nunca sera igual) en las que existen celdas en
blanco.
Como puedo hacer para que la macro seleccione las dos columnas (que
siempre
estaran en el mismo sitio) con independencia de las filas que contengan?

Muchas gracias por anticipado.
Respuesta Responder a este mensaje
#2 Teletreks
23/01/2005 - 21:37 | Informe spam
Gracias por tu interés KL, he probado con esto (en base a tu respuesta), pero
el problema es que no me selecciona adecuadamente todas las filas de las
columnas K..M que continen datos, a veces se pasa o se queda corto.

' ActiveSheet.Range("K:M").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "0"
End Sub

Te agradezco tu interés, de paso (si no es abusar) me podrías recomendar
algún sitio o libro para aprender a manejarme en esto de las macros (en
realidad esta es mi primera eperiencia).

Gracias


"KL" escribió:

Hola Teletreks,

Para seleccionar una columna entera hay varias formas, p. ej:

ActiveSheet.Columns(1).Select
o
ActiveSheet.Columns("A:B").Select
o
ActiveSheet.Range("A:B").Select
o
ActiveSheet.Range("A1:B1").EntireColumn.Select
etc.

Por otro lado, por lo q intuyo de tu mensaje a lo mejor estas seleccionando
columnas donde no es estrictamente necesario. Si expones el codigo aqui,
procuraremos ayudarte a depurarlo.

Saludos,
KL



"Teletreks" wrote in message
news:
> Hola a todos, mi problema es el siguiente:
>
> tengo una base de datos que obtengo mediante una consulta sobre un
> programa
> de contablidad. Desues la "pormateo" con una makro, pero siempre tengo dos
> columnas (cuyo tamano nunca sera igual) en las que existen celdas en
> blanco.
> Como puedo hacer para que la macro seleccione las dos columnas (que
> siempre
> estaran en el mismo sitio) con independencia de las filas que contengan?
>
> Muchas gracias por anticipado.



Respuesta Responder a este mensaje
#3 KL
23/01/2005 - 23:28 | Informe spam
Teletreks,

Respuestas entre lineas...

"Teletreks" wrote in message...
el problema es que no me selecciona adecuadamente todas las filas de las
columnas K..M que continen datos, a veces se pasa o se queda corto.



Vayamos por partes:
1) Si llamas "columna" un rango determinado de tu tabla (p.ej.: K1:K100)
entonces es normal q se pase por q el codigo q te he recomendado selecciona
la columna de la hoja entera o sea K1:K65536

2) Es imposible q quede corto por la instruccion q te he recomendado (por lo
mencionadop mas arriba). El problema debe estar en
SpecialCells(xlCellTypeBlanks).

3) Como te he dicho mas arriba, el problema se tiene q buscar en la
instruccion "Selection.SpecialCells(xlCellTypeBlanks).Select" Si tu rango
tiene mas de 8192 celdas vacias no adyacentes esta instruccion falla (para
mas informacion mirate esto: http://support.microsoft.com/kb/832293/es ).

' ActiveSheet.Range("K:M").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "0"
End Sub



De todas maneras antes de hacer un diagnostico definitivo, prueba esto:

'-Inicio Codigo-
Sub Test1()
Dim rng As Range

'Buscamos la inteseccion del Rango Usado,
'las columnas K,L,M y las celdas vacias.
With ActiveSheet
On Error Resume Next
Set rng = Intersect(.Range("K:M"), .UsedRange, _
.Cells.SpecialCells(xlCellTypeBlanks))
On Error GoTo 0
End With

'Si la interseccion resulta en un rango valido
'asignamos el valor 0 a todas las celdas del rango.
If Not rng Is Nothing Then rng = 0
End Sub
'-Fin Codigo-

Ojo - este codigo asume q no se han aplicado ningunos formatos, ni se han
introducido valores o formulas a celdas fuera de la tabla q sirve de base de
datos.
Si este no es el caso, entonces podrias probar lo siguiente:

'-Inicio Codigo-
Sub Test2()
Dim rng As Range
Dim uCelda As String
Dim rngUsado As Range

With ActiveSheet
On Error Resume Next

'Encontramos la Ultima Celda del Rango Usado
'usando la funcion LastCell (mas abajo).
uCelda = LastCell.Address

'Asumiendo q la tabla empieza en la celda A2 y
'usando la Ultima Celda determinamos el Rango Usado.
Set rngUsado = .Range("A2:" & uCelda)

'Reducimos el Rango Usado a la inteseccion de ese,
'las columnas K,L,M y las celdas vacias.
Set rng = Intersect(.Range("K:M"), rngUsado, _
.Cells.SpecialCells(xlCellTypeBlanks))
On Error GoTo 0
End With

'Si la interseccion resulta en un rango valido
'asignamos el valor 0 a todas las celdas del rango.
If Not rng Is Nothing Then rng = 0
End Sub

Function LastCell(Optional ws As Worksheet) As Range
'Esta funcion busca la ultima celda del Rango Usado.
If ws Is Nothing Then Set ws = ActiveSheet
Set rng = ws.Cells
Set LastCell = rng(1)
On Error Resume Next
Set LastCell = Intersect( _
rng.Find("*", rng(1), xlValues, xlWhole, xlByRows, _
xlPrevious).EntireRow, _
rng.Find("*", rng(1), xlValues, xlWhole, xlByColumns, _
xlPrevious).EntireColumn)
End Function
'-Fin Codigo-

Finalmente, decirte q existe otra manera de hacer lo q tu buscas y es la
siguiente:

1) Selecciona tu base datos
2) Ve al menu Edicion>Ir a...
3) Pulsa el boton Especial
4) Selecciona la opcion Vacias (primera columna, cuarta opcion desde abajo)
5) Pulsa el boton Aceptar
6) Coloca el cursor dentro de la Barra de Formulas y escribe 0
7) Aguanta la tecla "Ctrl" y pulsa "Enter"
8) Disfruta

...me podrias recomendar
algun sitio o libro para aprender a manejarme en esto de las macros (en
realidad esta es mi primera eperiencia).




Este sitio (creado por Fernando Arroyo) aparte de mucha informacion muy
interesante tambien contiene una lista de enlaces super utiles:
http://www.excelsp.com/index.htm

Intenta encontrar los siguientes libros en tu area:

EXCEL 2003 BIBLE (John Walkenbach) en ingles
http://www.casadellibro.com/fichas/...55,00.html

MICROSOFT EXCEL 2003 PROGRAMACION CON VBA (John Walkenbach) en castellano o
en ingles
http://www.casadellibro.com/fichas/...56,00.html

Saludos,
KL



Respuesta Responder a este mensaje
#4 KL
23/01/2005 - 23:43 | Informe spam
Teletreks,

Se me olvido mencionar q existe otra forma de detectar las dimensiones del
Rango usado. El siguiente codigo asume q la fila 1 de tu hoja no puede tener
celdas vacias intercaladas (p.ej.encabezados de columnas) ni la columna A
tampoco (p.ej. encabezados de filas o codigos de empleado/producto/factura,
etc.).

Saludos,
KL

'-Inicio Codigo-
Sub Test3()
Dim rng As Range
Dim uFila As Long
Dim uCol As Integer
Dim rngUsado As Range

With ActiveSheet
On Error Resume Next

'Encontramos la Ultima Fila usada en la columna A
uFila = .Cells(.Rows.Count, 1).End(xlUp).Row

'Encontramos la Ultima Columna usada en la fila 1
uCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

'Asumiendo q la tabla empieza en la celda A2 y
'usando la Ultima Fila y la Ultima Columna
'determinamos el Rango Usado.
Set rngUsado = .Range(Cells(2, 1), Cells(uFila, uCol))

'Reducimos el Rango Usado a la inteseccion de ese,
'las columnas K,L,M y las celdas vacias.
Set rng = Intersect(.Range("A:I"), rngUsado, _
.Cells.SpecialCells(xlCellTypeBlanks))
On Error GoTo 0
End With

'Si la interseccion resulta en un rango valido
'asignamos el valor 0 a todas las celdas del rango.
If Not rng Is Nothing Then rng = 0
End Sub
'-Fin Codigo-




"Teletreks" wrote in message
news:
Gracias por tu interes KL, he probado con esto (en base a tu respuesta),
pero
el problema es que no me selecciona adecuadamente todas las filas de las
columnas K..M que continen datos, a veces se pasa o se queda corto.

' ActiveSheet.Range("K:M").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "0"
End Sub

Te agradezco tu interes, de paso (si no es abusar) me podrias recomendar
algun sitio o libro para aprender a manejarme en esto de las macros (en
realidad esta es mi primera eperiencia).

Gracias


"KL" escribio:

Hola Teletreks,

Para seleccionar una columna entera hay varias formas, p. ej:

ActiveSheet.Columns(1).Select
o
ActiveSheet.Columns("A:B").Select
o
ActiveSheet.Range("A:B").Select
o
ActiveSheet.Range("A1:B1").EntireColumn.Select
etc.

Por otro lado, por lo q intuyo de tu mensaje a lo mejor estas
seleccionando
columnas donde no es estrictamente necesario. Si expones el codigo aqui,
procuraremos ayudarte a depurarlo.

Saludos,
KL



"Teletreks" wrote in message
news:
> Hola a todos, mi problema es el siguiente:
>
> tengo una base de datos que obtengo mediante una consulta sobre un
> programa
> de contablidad. Desues la "pormateo" con una makro, pero siempre tengo
> dos
> columnas (cuyo tamano nunca sera igual) en las que existen celdas en
> blanco.
> Como puedo hacer para que la macro seleccione las dos columnas (que
> siempre
> estaran en el mismo sitio) con independencia de las filas que
> contengan?
>
> Muchas gracias por anticipado.



Respuesta Responder a este mensaje
#5 KL
23/01/2005 - 23:55 | Informe spam
Bueno, ya me estoy durmiendo :-) - el ultimo codigo q postee tenia un pequno
problema y debe sustituirse con el siguiente.

Saludos,
KL

'-Inicio Codigo-
Sub Test3()
Dim rng As Range
Dim uFila As Long
Dim uCol As Integer
Dim rngUsado As Range

With ActiveSheet
On Error Resume Next

'Encontramos la Ultima Fila usada en la columna A
uFila = .Cells(.Rows.Count, 1).End(xlUp).Row

'Encontramos la Ultima Columna usada en la fila 1
uCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

'Asumiendo q la tabla empieza en la celda A2 y
'usando la Ultima Fila y la Ultima Columna
'determinamos el Rango Usado.
Set rngUsado = .Range(.Cells(2, 1), .Cells(uFila, uCol))

'Reducimos el Rango Usado a la inteseccion de ese,
'las columnas K,L,M y las celdas vacias.
Set rng = Intersect(.Range("K:M"), rngUsado, _
.Cells.SpecialCells(xlCellTypeBlanks))
On Error GoTo 0
End With

'Si la interseccion resulta en un rango valido
'asignamos el valor 0 a todas las celdas del rango.
If Not rng Is Nothing Then rng = 0
End Sub
'-Fin Codigo-


"KL" wrote in message
news:%
Teletreks,

Se me olvido mencionar q existe otra forma de detectar las dimensiones del
Rango usado. El siguiente codigo asume q la fila 1 de tu hoja no puede
tener celdas vacias intercaladas (p.ej.encabezados de columnas) ni la
columna A tampoco (p.ej. encabezados de filas o codigos de
empleado/producto/factura, etc.).

Saludos,
KL

'-Inicio Codigo-
Sub Test3()
Dim rng As Range
Dim uFila As Long
Dim uCol As Integer
Dim rngUsado As Range

With ActiveSheet
On Error Resume Next

'Encontramos la Ultima Fila usada en la columna A
uFila = .Cells(.Rows.Count, 1).End(xlUp).Row

'Encontramos la Ultima Columna usada en la fila 1
uCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

'Asumiendo q la tabla empieza en la celda A2 y
'usando la Ultima Fila y la Ultima Columna
'determinamos el Rango Usado.
Set rngUsado = .Range(Cells(2, 1), Cells(uFila, uCol))

'Reducimos el Rango Usado a la inteseccion de ese,
'las columnas K,L,M y las celdas vacias.
Set rng = Intersect(.Range("A:I"), rngUsado, _
.Cells.SpecialCells(xlCellTypeBlanks))
On Error GoTo 0
End With

'Si la interseccion resulta en un rango valido
'asignamos el valor 0 a todas las celdas del rango.
If Not rng Is Nothing Then rng = 0
End Sub
'-Fin Codigo-




"Teletreks" wrote in message
news:
Gracias por tu interes KL, he probado con esto (en base a tu respuesta),
pero
el problema es que no me selecciona adecuadamente todas las filas de las
columnas K..M que continen datos, a veces se pasa o se queda corto.

' ActiveSheet.Range("K:M").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "0"
End Sub

Te agradezco tu interes, de paso (si no es abusar) me podrias recomendar
algun sitio o libro para aprender a manejarme en esto de las macros (en
realidad esta es mi primera eperiencia).

Gracias


"KL" escribio:

Hola Teletreks,

Para seleccionar una columna entera hay varias formas, p. ej:

ActiveSheet.Columns(1).Select
o
ActiveSheet.Columns("A:B").Select
o
ActiveSheet.Range("A:B").Select
o
ActiveSheet.Range("A1:B1").EntireColumn.Select
etc.

Por otro lado, por lo q intuyo de tu mensaje a lo mejor estas
seleccionando
columnas donde no es estrictamente necesario. Si expones el codigo aqui,
procuraremos ayudarte a depurarlo.

Saludos,
KL



"Teletreks" wrote in message
news:
> Hola a todos, mi problema es el siguiente:
>
> tengo una base de datos que obtengo mediante una consulta sobre un
> programa
> de contablidad. Desues la "pormateo" con una makro, pero siempre tengo
> dos
> columnas (cuyo tamano nunca sera igual) en las que existen celdas en
> blanco.
> Como puedo hacer para que la macro seleccione las dos columnas (que
> siempre
> estaran en el mismo sitio) con independencia de las filas que
> contengan?
>
> Muchas gracias por anticipado.









Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida