Cambiar bucle para escribir resultados en celdas adicionales


0

He estado usando el siguiente código por un tiempo pero necesito ayuda para hacer un cambio. Lo he intentado y lo he intentado, pero no funcionará. Si alguien puede echarle un vistazo, mi investigación dice que estoy buscando un "ciclo de cambio para escribir resultados en celdas adicionales". Por favor, vea mi imagen de Excel a continuación.

En este momento, el código encuentra todos los números coincidentes ingresados ​​en la celda A1 y los publica en las celdas apropiadas L1: l12. Necesito el código para publicar la misma información en solo una de las siguientes celdas: C17, C18, F17, F18. Además, si el código podría copiar y pegar el número en la celda debajo del número correspondiente (de la celda A1), vea el resultado de la muestra a continuación a la izquierda del pegado del bucle de cambio anterior en las siguientes celdas: B17, B18, E17, E18.

Ejemplo con resultado esperado según la muestra de la imagen de Excel. El número 8 se ingresó en la celda A1 y se encontraron 8 en la celda A34. Entonces, 8-15 se copiarían y pegarían a L8 y C17. También copiaría el número 7 de la celda A35 (el siguiente número) a la celda B17. El código también haría lo mismo para las celdas F20 y E21. Después de haber copiado y pegado, todas las celdas B34, C34 y D34 deben eliminarse, por lo que estarán en blanco. Lo mismo para F20, G20 y H20. Espero que esto quede claro, si no, por favor avise y lo aclararé.

Mi código de trabajo está debajo y mi intento está debajo de ese código.

Excel sheet

Código de trabajo:

Sub do_it()

    Dim n, sht As Worksheet, cell As Range, num, tmp, rngDest As Range

    Set sht = ActiveSheet

    n = sht.Range("A1")

    For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells

        tmp = cell.Offset(0, 1).Value

        If cell.Value = n And tmp Like "*#-#*" Then

            'get the first number
            num = CLng(Trim(Split(tmp, "-")(0)))
            Debug.Print "Found a positive result in " & cell.Address
 'find the next empty cell in the appropriate row
         Set rngDest = sht.Cells(num, sht.Columns.Count).End(xlToLeft).Offset(0, 1)
            'make sure not to add before col L
            If rngDest.Column < 12 Then Set rngDest = sht.Cells(num, 12)

            cell.Offset(0, 1).Copy rngDest

        End If
    Next

End Sub

Mi intento:

Sub do_it()

    Dim n, sht As Worksheet, cell As Range, num, tmp, rngDest As Range

    Set sht = ActiveSheet

    n = sht.Range("A1")

    For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells

        tmp = cell.Offset(0, 1).Value

        If cell.Value = n And tmp Like "*#-#*" Then

            'get the first number
            num = CLng(Trim(Split(tmp, "-")(0)))
            Debug.Print "Found a positive result in " & cell.Address
 'find the next empty cell in the appropriate row
         Set rngDest = (“ C17, C18, F17, F18’)
             cell.Offset(0, 1).Copy rngDest

        End If
    Next

End Sub

Respuestas:


0

Puede que no sea bonito o escalable, pero como no estoy seguro de lo que está intentando lograr a largo plazo, esto es algo que debería funcionar.

Primero de, la fila For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells no corresponde con las celdas utilizadas en su ejemplo, así que cambié eso a:

For Each cell In sht.Range("A20:A34,E20:E34,I20:I34").Cells

Luego secuestré la variable tmp al final, porque ya no se usa, y la configuré para encontrar la última celda de la columna donde encontró una coincidencia, como la siguiente:

Set tmp = sht.Cells(Cells(Rows.Count, cell.Column).End(xlUp).Row, cell.Column)

Luego debemos especificar los nuevos cuadros y asegurarnos de que solo llenamos cada uno una vez. Puede hacerlo comprobando si el primero está vacío o con un contador. De cualquier manera, solo funcionará correctamente siempre y cuando encuentres menos de 4 coincidencias.

El resultado final fue este, modificar según sea necesario;

Sub do_it()

Dim sht As Worksheet, n As String, cell, num, tmp, rngDest As Range, i As Integer
Set sht = ActiveSheet
n = sht.Range("A1").Value
i = 0
For Each cell In sht.Range("A20:A34,E20:E34,I20:I34").Cells
    tmp = cell.Offset(0, 1).Value
    If cell.Value = n And tmp Like "*#-#*" Then
       'get the first number
        num = CLng(Trim(Split(tmp, "-")(0)))
        'find the next empty cell in the appropriate row
        Set rngDest = sht.Cells(num, sht.Columns.Count).End(xlToLeft).Offset(0, 1)
        'make sure not to add before col L
        If rngDest.Column < 12 Then Set rngDest = sht.Cells(num, 12)
        cell.Offset(0, 1).Copy rngDest

' This is getting the next number in A/E/I----
        Set tmp = cell.Offset(1, 0)

' This is filling up B17 - F18 in order until filled
        If sht.Range("B17").Value = "" Then
            sht.Range("C17").Value = cell.Offset(0, 1).Value
            sht.Range("B17").Value = tmp.Value
        ElseIf sht.Range("B18").Value = "" Then
            sht.Range("C18").Value = cell.Offset(0, 1).Value
            sht.Range("B18").Value = tmp.Value
        ElseIf sht.Range("E17").Value = "" Then
            sht.Range("F17").Value = cell.Offset(0, 1).Value
            sht.Range("E17").Value = tmp.Value
        ElseIf sht.Range("E18").Value = "" Then
            sht.Range("F18").Value = cell.Offset(0, 1).Value
            sht.Range("E18").Value = tmp.Value
        End If
  '---- This clears the BCD/FGH/JKL columns after using the value ----
        'cell.Offset(0, 1).Resize(, 3).Value = ""


   End If
Next cell
End Sub

Hola, Christofer. Muchas gracias por tu ayuda en esta macro. Acabo de probar la adición y esto es lo que está sucediendo: - Parece que la macro ya no usa el número ingresado en la celda A1. Copia todo en las celdas L1: L12: los números en las celdas A20: A34, E20: E34, I20: I34 no se están copiando, se están moviendo (solo se necesita la parte de copia). Así que si pudiera ayudar en estos dos temas sería genial.
KAREN KENDALL

Ups, he fallado una línea. 'Si ny tmp me gusta " # - # "Entonces 'debería ser' Si cell.Value = n And tmp Like" # - # "Entonces 'actualizaré el código. Eso evitará que no se use A1 correctamente. No estoy seguro de qué quiere decir con" no se están copiando, se están moviendo ". No estoy tocando los valores en la columna A , E y I. Si te refieres a los valores en "B, C, D" / "F, G, H" / "J, K, L", entonces los estoy copiando y eliminando. Dijiste que los querías en blanco ? Si no desea eliminar los valores, comente la parte 'cell.Offset (0, 1) .Resize (, 3) .Value = ""' part.
Christofer Weber

Lo sentimos, hay otro error. Pensé que quería específicamente el número "A35" cuando se encontró la entrada en la columna A, y E35 cuando se encontró en la columna E. Esto se puede cambiar muy fácilmente, pero ¿qué se supone que sucede si no hay un número a continuación?
Christofer Weber

Lo siento, no estaba tan claro como debería haber sido. Para el rango: A20: A34, E20: E34, I20: I34, el número encontrado podría ubicarse en cualquiera de estas celdas, por lo que siempre use la siguiente celda hacia abajo (siempre será un número). Por favor vea la hoja de muestra de Excel. Gracias, de nuevo, por toda su ayuda.
KAREN KENDALL

Ok, bueno, así es como debería funcionar ahora, inténtalo.
Christofer Weber
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.