1

I am having below code in powershell which I am using to populate the data in excel

    # Apply the formula in column O for all rows
    $lastRowO = $sheet1.UsedRange.Rows.Count
    for ($rowO = 2; $rowO -le $lastRowO; $rowO++) {
        $cellO = $sheet1.Cells.Item($rowO, 15)
        $formulaO = '=IF($N2<>"",XLOOKUP($N2,BACKUP!$C:$C,BACKUP!$B:$B),"")'
        $cellO.Formula = $formulaO

        #$sheet1.range("O$rowO:O$rowO").formula = '=IF($N2<>"",XLOOKUP($N2,BACKUP!$C:$C,BACKUP!$B:$B),"")'
    }

when I am executing the code, it is working fine. if I go to sheet I am able to see the formula in cell but it is not populating the data.

If I manually click on the cell with the same pasted formula, it is populating the data.

Please let me know what is the issue.

Below is the entire code


"Start time is: $((Get-Date).ToString())"

$excelFilePath = "C:\VLAN.xlsx"

# Create an instance of the Excel application
$excel = New-Object -ComObject Excel.Application


try {
    # Open the workbook
    $workbook = $excel.Workbooks.Open($excelFilePath)
    
    # Check if the "USER" sheet exists
    $sheetExists = $false
    foreach ($sheet in $workbook.Sheets) {
        if ($sheet.Name -eq "USER") {
            $userSheet = $sheet
            $sheetExists = $true
            break
        }
    }

    if (-not $sheetExists) {
        throw "Sheet 'USER' not found in the workbook."
    }

    # Add a new sheet named "Sheet1"
    $sheet1 = $workbook.Sheets.Add()
    $sheet1.Name = "Sheet1"

    # Copy data from "USER" sheet to "Sheet1"
    $userSheet.UsedRange.Copy()
    $sheet1.Range("A1").PasteSpecial(-4163) # -4163 is the Excel constant for xlPasteAll

    # Define the headers to be added starting from column N
    $headers = @("BckpSG-VLanID", "Bckpnetwork-label", "BckpSubnet", "BckpNetmask", "BckpGateway", "BckpNetwork")

    # Set the headers in Sheet1 starting from column N (14th column)
    for ($i = 0; $i -lt $headers.Length; $i++) {
        $sheet1.Cells.Item(1, 14 + $i).Value2 = $headers[$i]
    }

    # Apply the formula in column N for all rows
    $lastRow = $sheet1.UsedRange.Rows.Count
    for ($row = 2; $row -le $lastRow; $row++) {
        $cellN = $sheet1.Cells.Item($row, 14)
        $formulaN = '=IFERROR(IFS(MID($C' + $row + ',1,1)="2",XLOOKUP(NUMBERVALUE(MID($C' + $row + ',2,3)),BACKUP!$C:$C,BACKUP!$C:$C),MID($C' + $row + ',1,1)="3",XLOOKUP($C' + $row + '+300,BACKUP!$C:$C,BACKUP!$C:$C)),"")'
        $cellN.Formula = $formulaN
    }
    

    # Apply the formula in column O for all rows
    $lastRowO = $sheet1.UsedRange.Rows.Count
    for ($rowO = 2; $rowO -le $lastRowO; $rowO++) {
        #$cellO = $sheet1.Cells.Item($rowO, 15)
        #$formulaO = '=IF($N2<>"",XLOOKUP($N2,BACKUP!$C:$C,BACKUP!$B:$B),"")'
        #$cellO.Formula = $formulaO

        $sheet1.range("O$rowO:O$rowO").formula = '=IF($N2<>"",XLOOKUP($N2,BACKUP!$C:$C,BACKUP!$B:$B),"")'
    }

    # Force Excel to calculate all formulas in the sheet
    $sheet1.Calculate()


    # Save and close the workbook
    $workbook.Save()
    $workbook.Close()

    Write-Output "Sheet 'Sheet1' has been created with the 'USER' data, headers added, and formulas applied."
} catch {
    Write-Error $_.Exception.Message
} finally {
    # Quit the Excel application
    $excel.Quit()

    # Release the COM objects
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($sheet1) | Out-Null
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($userSheet) | Out-Null
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook) | Out-Null
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null

    # Suppress the final output
    Remove-Variable -Name sheet1, userSheet, workbook, excel
}

1
  • In my opinion, you have complicated the excel operations. I'd rather ask you to use Doug Finke's PS Excel module for ease of operations. Here is the Link Commented Jul 9 at 10:54

1 Answer 1

2

Excel doesn't know that your cells need to be recalculated. Inside your loops, right after you set the formula, mark the cell as "dirty" and when you recalculate the sheet it should update the data.

    for ($row = 2; $row -le $lastRow; $row++) {
        $cellN = $sheet1.Cells.Item($row, 14)
        $formulaN = '=IFERROR(IFS(MID($C' + $row + ',1,1)="2",XLOOKUP(NUMBERVALUE(MID($C' + $row + ',2,3)),BACKUP!$C:$C,BACKUP!$C:$C),MID($C' + $row + ',1,1)="3",XLOOKUP($C' + $row + '+300,BACKUP!$C:$C,BACKUP!$C:$C)),"")'
        $cellN.Formula = $formulaN
        $cellN.Dirty()
    }


    # Apply the formula in column O for all rows
    $lastRowO = $sheet1.UsedRange.Rows.Count
    for ($rowO = 2; $rowO -le $lastRowO; $rowO++) {
        #$cellO = $sheet1.Cells.Item($rowO, 15)
        #$formulaO = '=IF($N2<>"",XLOOKUP($N2,BACKUP!$C:$C,BACKUP!$B:$B),"")'
        #$cellO.Formula = $formulaO

        $sheet1.range("O$rowO:O$rowO").formula = '=IF($N2<>"",XLOOKUP($N2,BACKUP!$C:$C,BACKUP!$B:$B),"")'
        $sheet1.range("O$rowO:O$rowO").Dirty()
    }

    # Force Excel to calculate all formulas in the sheet
    $sheet1.Calculate()

Not the answer you're looking for? Browse other questions tagged or ask your own question.