Saltar al contenido

Ultima celda con datos por la derecha


Recommended Posts

publicado

Buenos días,

 

Tengo una tabla en una hoja y estoy intentando saber cual es la ultima celda vacia por la derecha de cada fila.

Puede haber filas que estén completas (con datos en todas sus columnas o no)

Estoy utilizando este código que supuestamente me da el numero de columna que no está vacia, pero parece comportarse erroneamente, ya que siempre me lee la ultima celda de la fila aunque esté vacia. Creo que puede ser por la propia definicion de tabla en excel?

 

UltCol = Datos.Cells(3, Datos.Columns.Count).End(xlToLeft).Column

 

Siempre me da la posicion 33 que es la columna AG. Alguna idea ?

 

imagen.thumb.png.ed7007a1e4f818aec741fd9c2fcb8a1f.png

 

Gracias

publicado

Tu código evalúa siempre la fila 3, prueba con el código adjunto.

Suponiendo que la variable Fila contiene el número de fila a evaluar:

   UltCol = Datos.Cells(Fila, Columns.Count).End(xlToLeft).Column

 

publicado
Hace 1 hora, Antoni dijo:

Tu código evalúa siempre la fila 3, prueba con el código adjunto.

Suponiendo que la variable Fila contiene el número de fila a evaluar:

   UltCol = Datos.Cells(Fila, Columns.Count).End(xlToLeft).Column

 

Si, evalua siempre la fila 3, porque estaba haciendo pruebas con distintas filas a mano.

Con tu codigo me hace lo mismo siempre me cuenta 33 que es el numero de columnas que tiene la Tabla. Yo creo que tiene que ver con el que es una Tabla como tal.

He probado fuera de esa tabla con el mismo codigo (fila 38, que está fuera del rango de la Tabla) y si que funciona como se espera.

 

Gracias de todos modos

publicado

Buenas ,  soy nuevo en Macros 

seguro que el codigo que te paso es muy largo  y no muy limpio y se podra hacer con la mitad de codigo (como te digo desconozco  muchos objetos de excel) , pero por aportar mi granito te paso mi codigo comentado en cada linea. 

Espero que alguna idea puedas  aprovechar.

Sub ultima_cada_fila()
' ejemplo con tabla nombre "Tabla1" , rango de la tabla $D$2:$AG$10
Dim rango, primera_celda, Ultima_Celda, primera_letra, ultima_letra, primer_n, Ultimo_n, c As String
Dim numero_columnas, i, ii, b As Integer

 rango = Replace(Range("Tabla1").CurrentRegion.Address, "$", "") ' obtenemos el rango de la tabla eliminado los $ (D2:AG10)
 numero_columnas = Range(rango).Columns.Count ' numero de las columnas de la tabla (30)

 primera_celda = Mid(rango, 1, InStr(1, rango, ":") - 1)        ' cogemos la direccion de la 1 celda, Desde donde trabajara el offset(D2)
  Ultima_Celda = Mid(rango, Len(primera_celda) + 2, Len(rango)) ' cogemos la direccion de la 2 celda(AG10)


For i = 1 To Len(primera_celda)      ' proceso para desglosar la letra y el numero de la 1 celda(D2)
c = Mid(primera_celda, i, 1)         ' analizamos caracter a caracter
 If IsNumeric(c) Then                ' si el caranter es un numero ..
   primer_n = primer_n & c           ' capturamos el numero(2)
   Else
   primera_letra = primera_letra & c ' capturamos el caracter(D)
 End If
Next

For i = 1 To Len(Ultima_Celda)       ' proceso para desglosar la letra y el numero de la 2 celda(AG10)
c = Mid(Ultima_Celda, i, 1)          ' analizamos caracter a caracter
 If IsNumeric(c) Then                ' si el caranter es un numero ..
   Ultimo_n = Ultimo_n & c           ' capturamos el numero (1,0)
   Else
   ultima_letra = ultima_letra & c   ' capturamos el caracter(A,G)
 End If
Next

b = 0
For i = primer_n To Ultimo_n - 1                                      ' proceso que recorre las filas
  b = b + 1
   For ii = primer_n To numero_columnas + 1                           ' proceso que recorre las columnas por cada fila
     If Range(primera_celda).Offset(b, ii - primer_n).Value = "" Then ' si la celda esta vacia ..
      Range(primera_celda).Offset(b, ii - primer_n).Select            ' seleccionamos la celda vacia
      MsgBox Selection.Address                                        ' muestra la direccion de la celda vacia
      Exit For                                                        ' salimos de la busqueda ya que encontremos la celda vacia
     End If
   Next
Next

Suerte.

publicado

Hola,

esta es mi solución

    Dim UltCol As Long
    With Datos
         If .Cells(fila, .Columns.Count) <> "" Then
             UltCol = .Columns(1).Column + .Columns.Count - 1
         Else
             UltCol = .Cells(fila, .Columns.Count).End(xlToLeft).Column
         End If
    End With

image.thumb.png.8947b6b260842cd0d92a7043dffc5a13.png

LastColumn_Table.xlsm

publicado

Algo no encaja, porque el código que te he pasado funciona, si o si.

Sube tu archivo  y explica con un ejemplo de que es lo que quieres hacer.

publicado

Hola a todos!

Hace 13 horas, gogua dijo:

Tengo una tabla en una hoja y estoy intentando saber cual es la ultima celda vacia por la derecha de cada fila.

Puede haber filas que estén completas (con datos en todas sus columnas o no)

Siendo que es basado a formato tabla, te adjunto una alternativa como solución con VBA

Tiene la ventaja que no importa donde este posicionada la tabla en la hoja de Excel, siempre te dará  la ultima columna con datos, a lado de la misma tabla 

 

Saludos 

Ultima columna con datos - tabla de Excel VBA_GP.xlsm

publicado
Hace 22 horas, JasallBcn dijo:

Buenas ,  soy nuevo en Macros 

seguro que el codigo que te paso es muy largo  y no muy limpio y se podra hacer con la mitad de codigo (como te digo desconozco  muchos objetos de excel) , pero por aportar mi granito te paso mi codigo comentado en cada linea. 

Espero que alguna idea puedas  aprovechar.

Sub ultima_cada_fila()
' ejemplo con tabla nombre "Tabla1" , rango de la tabla $D$2:$AG$10
Dim rango, primera_celda, Ultima_Celda, primera_letra, ultima_letra, primer_n, Ultimo_n, c As String
Dim numero_columnas, i, ii, b As Integer

 rango = Replace(Range("Tabla1").CurrentRegion.Address, "$", "") ' obtenemos el rango de la tabla eliminado los $ (D2:AG10)
 numero_columnas = Range(rango).Columns.Count ' numero de las columnas de la tabla (30)

 primera_celda = Mid(rango, 1, InStr(1, rango, ":") - 1)        ' cogemos la direccion de la 1 celda, Desde donde trabajara el offset(D2)
  Ultima_Celda = Mid(rango, Len(primera_celda) + 2, Len(rango)) ' cogemos la direccion de la 2 celda(AG10)


For i = 1 To Len(primera_celda)      ' proceso para desglosar la letra y el numero de la 1 celda(D2)
c = Mid(primera_celda, i, 1)         ' analizamos caracter a caracter
 If IsNumeric(c) Then                ' si el caranter es un numero ..
   primer_n = primer_n & c           ' capturamos el numero(2)
   Else
   primera_letra = primera_letra & c ' capturamos el caracter(D)
 End If
Next

For i = 1 To Len(Ultima_Celda)       ' proceso para desglosar la letra y el numero de la 2 celda(AG10)
c = Mid(Ultima_Celda, i, 1)          ' analizamos caracter a caracter
 If IsNumeric(c) Then                ' si el caranter es un numero ..
   Ultimo_n = Ultimo_n & c           ' capturamos el numero (1,0)
   Else
   ultima_letra = ultima_letra & c   ' capturamos el caracter(A,G)
 End If
Next

b = 0
For i = primer_n To Ultimo_n - 1                                      ' proceso que recorre las filas
  b = b + 1
   For ii = primer_n To numero_columnas + 1                           ' proceso que recorre las columnas por cada fila
     If Range(primera_celda).Offset(b, ii - primer_n).Value = "" Then ' si la celda esta vacia ..
      Range(primera_celda).Offset(b, ii - primer_n).Select            ' seleccionamos la celda vacia
      MsgBox Selection.Address                                        ' muestra la direccion de la celda vacia
      Exit For                                                        ' salimos de la busqueda ya que encontremos la celda vacia
     End If
   Next
Next

Suerte.

Gracias por tu aporte, yo estoy muy pez en cierto tipo de programación también.

 

 

 

Hace 21 horas, Frank2021 dijo:

Hola,

esta es mi solución

    Dim UltCol As Long
    With Datos
         If .Cells(fila, .Columns.Count) <> "" Then
             UltCol = .Columns(1).Column + .Columns.Count - 1
         Else
             UltCol = .Cells(fila, .Columns.Count).End(xlToLeft).Column
         End If
    End With

image.thumb.png.8947b6b260842cd0d92a7043dffc5a13.png

LastColumn_Table.xlsm 18.58 kB · 0 descargas

 

Gracias, entre tu solución y la última voy a poder hacer un mix.

 

 

 

Hace 21 horas, Antoni dijo:

Algo no encaja, porque el código que te he pasado funciona, si o si.

Sube tu archivo  y explica con un ejemplo de que es lo que quieres hacer.

 

Antoni, basicamente es lo que conté en el primer mensaje, recorrer una fila dentro de una Tabla hasta que no haya datos en esa fila para no tener que evaluar todas las celdas de esa fila/s.

Por lo que veo según los aportes de los compañeros, hay que definir la tabla como tal en el codigo para luego poder trabajar. De todas formas, voy a probar tu código de otra forma y os digo tambien.

 

 

Hace 14 horas, Gerson Pineda dijo:

Hola a todos!

Siendo que es basado a formato tabla, te adjunto una alternativa como solución con VBA

Tiene la ventaja que no importa donde este posicionada la tabla en la hoja de Excel, siempre te dará  la ultima columna con datos, a lado de la misma tabla 

 

Saludos 

Ultima columna con datos - tabla de Excel VBA_GP.xlsm 17.81 kB · 0 descargas

Gracias tambien por tu aporte, además me va a servir otra cosa que he visto que haces y que yo "desconocía" o no me acordaba que se podía hacer.

 

 

 

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.