'How to copy worksheet, adjust values, then populate new worksheet?

I have a macro that produces a dynamic number of new workbooks by copying a worksheet in the original workbook.

In Step-Through mode, values in the copied worksheet are correctly adjusted in the loop based on two inputs and are populated in the new worksheets.
When run normally, all new workbooks contain the original values.

I understand using .Select is bad. I don't know how to work around this.

Sub create_jvs()

    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim achWS, refWS As Worksheet
    Dim refRng, strtCell As Range
    Dim j, fRow, lRow As Integer

    Set refWS = wb.Sheets("References")
    Set achWS = wb.Sheets("ACHLinkage")

    'get first and last row of constraint range in ACHLinkage
    fRow = 2
    lRow = achWS.Columns("AB").Find("*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows, 
    LookIn:=xlValues).Row

    'loop to produce separate ach jvs
    For j = -29 To (-29 + (lRow - fRow)) Step 1
    
        ThisWorkbook.Sheets("References").Activate       'select the ref worksheet
        refWS.Range("R31").Select                        'select the first reference cell 
    
        'update formula 1
        ActiveCell.FormulaR1C1 = "=IF(ACHLinkage!R[" & j & "]C[10] = """",  """", 
        IF(ACHLinkage!R[" & j & "]C[10]=""N"",ROUNDDOWN(References!R30C19*ACHLinkage!R[" & j & 
        "]C[11],2),ROUNDUP(References!R30C19*ACHLinkage!R[" & j & "]C[11],2)))"
    
        ActiveCell.Offset(1).Select
    
        'update formula 2
        ActiveCell.FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 1 & "]C[10] = """", """", 
        IF(ACHLinkage!R[" & j - 1 & "]C[10] = ""N"", ROUNDDOWN(References!R28C19*ACHLinkage!R[" & 
        j - 1 & "]C[11],2), ROUNDUP(References!R28C19*ACHLinkage!R[" & j - 1 & "]C[11],2)))"
    
        ActiveCell.Offset(1).Select
    
        'update formula 3
        ActiveCell.FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 2 & "]C[10] = """", """", 
        IF(ACHLinkage!R[" & j - 2 & "]C[10]=""N"",ROUNDDOWN(USERFORM!R26C6*ACHLinkage!R[" & j - 2 
        & "]C[11],2),ROUNDUP(USERFORM!R26C6*ACHLinkage!R[" & j - 2 & "]C[11],2)))"
    
        ActiveCell.Offset(1).Select
    
        'update formula 4
        ActiveCell.FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 3 & "]C[10] = """", """", 
        IF(ACHLinkage!R[" & j - 3 & "]C[10]=""N"",ROUNDDOWN(USERFORM!R26C7*ACHLinkage!R[" & j - 3 
        & "]C[11],2),ROUNDUP(USERFORM!R26C7*ACHLinkage!R[" & j - 3 & "]C[11],2)))"
    
        ActiveCell.Offset(1).Select
    
        'update formula 5
        ActiveCell.FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 4 & "]C[10] = """", """", 
        IF(ACHLinkage!R[" & j - 4 & "]C[10]=""N"",ROUNDDOWN(USERFORM!R26C8*ACHLinkage!R[" & j - 4 
        & 
        "]C[11],2),ROUNDUP(USERFORM!R26C8*ACHLinkage!R[" & j - 4 & "]C[11],2)))"
    
        ThisWorkbook.Sheets("ACH JV").Copy   'copy jvWS to new wb
    
    Next j

End Sub


Solution 1:[1]

I think ACH JV is referring back to References. When you copy ACH JV, you copy the formulas too and they continue to refer back to References - they all point to the same cells on References. When you change those cells, you're changing every spawned workbook too. It seems to work when you're stepping through because you're looking at each spawned workbook right after the copy. If you were to look at the previous workbook while stepping through, it would look just like the current one.

If I'm correct, you need to turn those formulas into values after each copy. Example code below.

Sub create_jvs()

    Dim achWS, refWS As Worksheet
    Dim j As Long, lRow As Long, fRow As Long
    Dim rCell As Range
    
    Set refWS = ThisWorkbook.Sheets("References")
    Set achWS = ThisWorkbook.Sheets("ACHLinkage")
    Set rCell = refWS.Range("R31")
    
    'get first and last row of constraint range in ACHLinkage
    fRow = 2
    lRow = achWS.Columns("AB").Find("*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows, LookIn:=xlValues).Row
    
    'loop to produce separate ach jvs
    For j = -29 To (-29 + (lRow - fRow)) Step 1
    
        rCell.FormulaR1C1 = "=IF(ACHLinkage!R[" & j & "]C[10] = """",  """", IF(ACHLinkage!R[" & j & "]C[10]=""N"",ROUNDDOWN(References!R30C19*ACHLinkage!R[" & j & "]C[11],2),ROUNDUP(References!R30C19*ACHLinkage!R[" & j & "]C[11],2)))"
        rCell.Offset(1).FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 1 & "]C[10] = """", """", IF(ACHLinkage!R[" & j - 1 & "]C[10] = ""N"", ROUNDDOWN(References!R28C19*ACHLinkage!R[" & j - 1 & "]C[11],2), ROUNDUP(References!R28C19*ACHLinkage!R[" & j - 1 & "]C[11],2)))"
        rCell.Offset(2).FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 2 & "]C[10] = """", """", IF(ACHLinkage!R[" & j - 2 & "]C[10]=""N"",ROUNDDOWN(USERFORM!R26C6*ACHLinkage!R[" & j - 2 & "]C[11],2),ROUNDUP(USERFORM!R26C6*ACHLinkage!R[" & j - 2 & "]C[11],2)))"
        rCell.Offset(3).FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 3 & "]C[10] = """", """", IF(ACHLinkage!R[" & j - 3 & "]C[10]=""N"",ROUNDDOWN(USERFORM!R26C7*ACHLinkage!R[" & j - 3 & "]C[11],2),ROUNDUP(USERFORM!R26C7*ACHLinkage!R[" & j - 3 & "]C[11],2)))"
        rCell.Offset(4).FormulaR1C1 = "=IF(ACHLinkage!R[" & j - 4 & "]C[10] = """", """", IF(ACHLinkage!R[" & j - 4 & "]C[10]=""N"",ROUNDDOWN(USERFORM!R26C8*ACHLinkage!R[" & j - 4 & "]C[11],2),ROUNDUP(USERFORM!R26C8*ACHLinkage!R[" & j - 4 & "]C[11],2)))"
    
        ThisWorkbook.Sheets("ACH JV").Copy   'copy jvWS to new wb
                
        'Turn formulas into values
        ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
    
    Next j

End Sub

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dick Kusleika