es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Código VBA “For Each” para el formato del borde izquierdo en 366 columnas.

He estado buscando en la red por todas partes, pero no puedo encontrar ninguna solución para esto. Debe haber una forma de acortar drásticamente este código VBA (ver abajo). Las celdas en la fila 4, comenzando con H4, están relacionadas con las celdas en la fila 5, que contienen fechas. Si H5 es el primer día del mes, H4 tiene el valor “Ja” (en sueco significa “Sí”). Si la declaración es VERDADERA, entonces el rango H7:H106 debe tener un borde izquierdo en color negro, y si es FALSA, el mismo rango debe tener un borde izquierdo en color blanco. En mi código, tengo que usar rangos definidos y referencias de celdas únicas. ¡La cosa es que necesito este código para 365 columnas! Aquí está mi versión:

Sub FirstDayLine()

Dim r1, r2, r3, r4, r5 As Range

Set r1 = Range("H7:H106")
Set r2 = Range("I7:I106")
Set r3 = Range("J7:J106")
Set r4 = Range("K7:K106")
Set r5 = Range("L7:L106")

If Range("H4").Value = "Ja" Then
r1.Borders(xlEdgeLeft).Color = vbBlack
Else
r1.Borders(xlEdgeLeft).Color = vbWhite
End If

If Range("I4").Value = "Ja" Then
r2.Borders(xlEdgeLeft).Color = vbBlack
Else
r2.Borders(xlEdgeLeft).Color = vbWhite
End If

If Range("J4").Value = "Ja" Then
r3.Borders(xlEdgeLeft).Color = vbBlack
Else
r3.Borders(xlEdgeLeft).Color = vbWhite
End If

If Range("K4").Value = "Ja" Then
r4.Borders(xlEdgeLeft).Color = vbBlack
Else
r4.Borders(xlEdgeLeft).Color = vbWhite
End If

If Range("L4").Value = "Ja" Then
r5.Borders(xlEdgeLeft).Color = vbBlack
Else
r5.Borders(xlEdgeLeft).Color = vbWhite
End If

End Sub

Sé que todo esto podría resolverse mediante algún código “Para Cada”, pero no puedo hacerlo correctamente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Excel VBA, hay una forma de acortar drásticamente el código proporcionado utilizando un bucle For Each. Aquí tienes un ejemplo de cómo hacerlo:

    Sub PrimerDiaLinea()
    
        Dim i As Integer
        Dim r As Range
    
        For i = 7 To 106
            Set r = Range(Cells(i, 8), Cells(i, 8 + 365))
            If Cells(4, i - 1 Mod 365) = "Ja" Then
                r.Borders(xlEdgeLeft).Color = vbBlack
            Else
                r.Borders(xlEdgeLeft).Color = vbWhite
            End If
        Next i
    
    End Sub
    

    Este código utiliza un bucle For Each para iterar a través de las filas 7 a 106 y establecer la variable de rango en consecuencia. La función Cells se utiliza para determinar dinámicamente el número de columna en función de la variable de bucle i. El operador de módulo se utiliza en i para recorrer los días del año (1 a 365). Si la celda en la fila 4 y la columna correspondiente es “Ja”, entonces se le da un borde izquierdo negro al rango, de lo contrario se le da un borde izquierdo blanco.

    Este código debería reducir drásticamente el tamaño del código VBA y hacerlo más eficiente.

Comments are closed.