H o la: Te anexo mis comentarios
1. Observo 2 cells.
H1. Range(h1. Cells(b.Row, "D"), h1. Cells(b. Row, uc))
La propiedad Range admite la celda inicial y la celda final de un rango, por ejemplo si quieres abarcar desde la celda A1 hasta la celda D10, lo puedes hacer así:
Range("A1:D10")
También puedes hacerlo así:
Range(cells(1, "A"), cells(10, "D"))
Con la segunda opción es más fácil, reemplazar los datos por variables, siguiendo con el ejemplo:
fini = 1
cini = "A"
ffin = 10
cfin = "D"
range(cells(fini, cini), cells(ffin, cfin))
Solamente con el rango:
fini = 1
cini = "A"
ffin = 10
cfin = "D"
Range(cini & fini & ":" & cfin & ffin)
En el ejemplo anterior en la columna final tengo una letra "D", pero si en lugar de la letra "D" tuviera el número de columna 4, primero tendría que convertir el 4 en letra, para evitar eso, utilizo range(cells(fila, columna), cells(fila, columna))
2. Para recorrer las filas uso esto: h1.Range("A" & Rows. Count).End(xlUp). Row
... ¿Y esto?
H1. Range(Rows.count, "A").End(xlUp). Row
Eso debe ser un error, no sé de dónde lo obtuviste, pero lo correcto es
h1.Range("A" & Rows. Count).End(xlUp). Row
Y no es para recorrer filas, es para encontrar la ultima celda con datos, de determinada columna, de abajo hacia arriba, por eso dice "XlUp"
3. Para recorrer columnas Cells(1, Columns. Count).End(xlToLeft). Column
...
Cells(Columns. Count, 1).End(xlToLeft). Column
Tampoco es para recorrer columnas, es para encontrar la última celda con datos, de determinada fila, de derecha a izquierda, por eso dice "XlToLeft".
Y lo correcto es:
cells(fila, columna).end(xltoleft).column
Si quieres obtener la última celda con datos de la fila 1, entonces es:
cells(1, columns.count).end(xltoleft).column
sal u dos