Tengo un script VBA que copia datos de una hoja a otra. Los datos copiados se colocan en una fórmula y la cantidad calculada se vuelve a copiar en la hoja original. Estoy tratando de obtenerlo para que el script VBA haga esto para cada fila. Tengo 1000 filas de datos.

Sub Rating()
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Worksheets("SoapUI - Single")
Set ws2 = Worksheets("STpremcalc")

        ws2.Range("B3").Value = ws1.Range("B3").Value

        ws2.Range("B4").Value = ws1.Range("C3").Value

        ws2.Range("B5").Value = ws1.Range("D3").Value

        ws2.Range("B6").Value = ws1.Range("E3").Value

        ws2.Range("E3").Value = ws1.Range("F3").Value

        ws2.Range("E4").Value = ws1.Range("G3").Value

        ws2.Range("E5").Value = ws1.Range("H3").Value

        ws2.Range("E6").Value = ws1.Range("I3").Value

        ws2.Range("G3").Value = ws1.Range("J3").Value

        ws2.Range("G4").Value = ws1.Range("K3").Value

        ws2.Range("G5").Value = ws1.Range("L3").Value

        ws2.Range("J3").Value = ws1.Range("N3").Value

        ws2.Range("J4").Value = ws1.Range("O3").Value

        ws2.Range("J6").Value = ws1.Range("P3").Value

        ws2.Range("B9").Value = ws1.Range("Q3").Value

        ws2.Range("C9").Value = ws1.Range("R3").Value

        ws2.Range("D9").Value = ws1.Range("S3").Value

        ws2.Range("E9").Value = ws1.Range("T3").Value

        ws2.Range("B10").Value = ws1.Range("U3").Value

        ws2.Range("C10").Value = ws1.Range("V3").Value

        ws2.Range("D10").Value = ws1.Range("W3").Value

        ws2.Range("E10").Value = ws1.Range("X3").Value

        ws2.Range("B11").Value = ws1.Range("Y3").Value

        ws2.Range("C11").Value = ws1.Range("Z3").Value

        ws2.Range("D11").Value = ws1.Range("AA3").Value

        ws2.Range("E11").Value = ws1.Range("AB3").Value

        ws1.Range("AW3").Value = ws2.Range("M4").Value

        ws1.Range("AX3").Value = ws2.Range("M5").Value

        ws1.Range("AY3").Value = ws2.Range("M6").Value

End Sub

También entiendo que esta puede ser una forma muy ineficiente de realizar esta tarea, pero no sé cómo mejorarla. Entonces, si tiene una forma de hacer esto más eficiente, sería muy apreciado.

Editar: Código de actualización según el consejo de @ user3598756

1
Ross 26 jul. 2016 a las 11:03

2 respuestas

La mejor respuesta

No soy un fanático del procedimiento de copiar / pegar, pero si debe usarlo, entonces las siguientes declaraciones

Sheets("SoapUI - Single").Range("B3").Copy
Sheets("STpremcalc").Range("B3").PasteSpecial Paste:=xlValues

Sheets("SoapUI - Single").Range("C3").Copy
Sheets("STpremcalc").Range("B4").PasteSpecial Paste:=xlValues

Sheets("SoapUI - Single").Range("D3").Copy
Sheets("STpremcalc").Range("B5").PasteSpecial Paste:=xlValues

Sheets("SoapUI - Single").Range("E3").Copy
Sheets("STpremcalc").Range("B6").PasteSpecial Paste:=xlValues

Se puede simplificar en

Sheets("SoapUI - Single").Range("B3:E3").Copy
Sheets("STpremcalc").Range("B3").PasteSpecial Paste:=xlValues, Transpose:=True

Aparte de lo anterior, puede simplificar

    Sheets("SoapUI - Single").Range("Q3").Copy
    Sheets("STpremcalc").Range("B9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("R3").Copy
    Sheets("STpremcalc").Range("C9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("S3").Copy
    Sheets("STpremcalc").Range("D9").PasteSpecial Paste:=xlValues

    Sheets("SoapUI - Single").Range("T3").Copy
    Sheets("STpremcalc").Range("E9").PasteSpecial Paste:=xlValues

En

    Sheets("SoapUI - Single").Range("Q3:T3").Copy
    Sheets("STpremcalc").Range("B9:E9").PasteSpecial Paste:=xlValues

Creo que puedes hacer el resto tú solo.


EDITAR: Dado que el OP edita su pregunta. Lo siguiente se puede simplificar

    ws2.Range("B3").Value = ws1.Range("B3").Value

    ws2.Range("B4").Value = ws1.Range("C3").Value

    ws2.Range("B5").Value = ws1.Range("D3").Value

    ws2.Range("B6").Value = ws1.Range("E3").Value

    ws2.Range("E3").Value = ws1.Range("F3").Value

    ws2.Range("E4").Value = ws1.Range("G3").Value

    ws2.Range("E5").Value = ws1.Range("H3").Value

    ws2.Range("E6").Value = ws1.Range("I3").Value

Mediante el procedimiento de bucle como este

For i = 1 To 4
    ws2.Cells(i + 2, 2) = ws1.Cells(3, i + 1)    'Or you can use `ws1.Cells(3, i + 1).Value2` if you only need the value without its format like date or currency
    ws2.Cells(i + 2, 5) = ws1.Cells(3, i + 5)
Next i

El resto es tuyo.

3
Anastasiya-Romanova 秀 26 jul. 2016 a las 08:46

No hay mucho que hacer pero ese poco puede ser:

  • usar variables para hacer referencia a hojas de trabajo y mejorar tanto la legibilidad como la eficiencia del código

    Dim ws1 As Worksheet, ws2 As Worksheet    
    Set ws1 = Worksheets("SoapUI - Single")
    Set ws2 = Worksheets("STpremcalc")
    
  • use el patrón Range1.Value = Range2.Value para copiar / pegar valores entre rangos it '

    ws2.Range("B3").Value = ws1.Range("B3").Value
    ws2.Range("B4").Value = ws1.Range("C4").Value
    ...
    
1
user3598756 26 jul. 2016 a las 08:12