Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 无法更改单元格上的公式?_Excel_Powershell_Excel Formula - Fatal编程技术网

Excel 无法更改单元格上的公式?

Excel 无法更改单元格上的公式?,excel,powershell,excel-formula,Excel,Powershell,Excel Formula,从开始,我尝试将在许多工作簿中找到的所有公式上的$B$1替换为文本($B$1,“0000”)。现在我已经解决了.save()问题,我又遇到了另一个问题(事实上,这应该是第一个问题):我似乎无法更改.Formula值,无论我做什么尝试 PS C:\> $Search.Formula = $Search.Formula -replace '\$B\$1','TEXTO($B$1,"0000")' Exceção ao definir "Formula": "Exceção de HRESULT

从开始,我尝试将在许多工作簿中找到的所有公式上的
$B$1
替换为
文本($B$1,“0000”)
。现在我已经解决了.save()问题,我又遇到了另一个问题(事实上,这应该是第一个问题):我似乎无法更改
.Formula
值,无论我做什么尝试

PS C:\> $Search.Formula = $Search.Formula -replace '\$B\$1','TEXTO($B$1,"0000")'
Exceção ao definir "Formula": "Exceção de HRESULT: 0x800A03EC"
No linha:1 caractere:1
+ $Search.Formula = $Search.Formula -replace '\$B\$1','TEXTO($B$1,"0000")'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterSetValueTI
公式是:

=PROCV(("A"&ANO($A6)&"M"&MÊS($A6)&"P"&$B$1);BASE!$A:$P;9;FALSO)
在英语中,如果我正确地记住了相关性:

=VLOOKUP(("A"&YEAR($A6)&"M"&MONTH($A6)&"P"&$B$1);BASE!$A:$P;9;FALSE)
预期的产出将是

=VLOOKUP(("A"&YEAR($A6)&"M"&MONTH($A6)&"P"&TEXT($B$1,"0000"));BASE!$A:$P;9;FALSE)

你提供的东西有几方面的问题。乍一看,您似乎在使用反斜杠作为转义字符,以使美元符号文字化。PowerShell中的转义字符是back tick或grave(例如,`)

如果我在Excel中执行此操作,我可能会在工作表中找到并用
文本($B$1,“0000”)
替换每个
$B$1
。在我看来,它足够强大,可以在不使用PowerShell的
-replace
方法的情况下处理操作。工作表方法在某种程度上依赖于可用的
$B$1
开始,但由于它也在替换中,因此您需要事先知道要替换什么。如果此脚本留给临时用户使用,则可能需要在该区域进行一些错误控制

$excel = New-Object -comobject Excel.Application
$FilePath = "c:\temp\example.xlsx"
$workbook = $excel.Workbooks.Open($FilePath)
$excel.Visible = $true
$worksheet = $workbook.worksheets.item("Sheet1")
#set some Find & Replace vars
$what = "`$B`$1"
$with = "text(`$B`$1, `"0000`")"
#use worksheet-wide Find & Replace to change formula
$worksheet.usedrange.replace($what, $with, 2)
#formula(s) should be changed. now Find it and display it
$fnd = $worksheet.usedrange.find($what, $worksheet.range("A1"), -4123, 2)
Write-Output $fnd.formula
$workbook.save()
$workbook.close()
$excel.quit()
我已经通过在操作后查找并显示公式来证明了这一点,并且更广泛地使用了grave escape字符,而不是在带引号的字符串中在单引号和双引号之间来回交换

上面的代码使用我测试过的EN-US版本。区域设置的实际替换文本似乎是

$with = "texto(`$B`$1; `"0000`")"

你需要给我们看更多的代码。如何定义
$search
?错误的英文版本也会有帮助,因为不需要正则表达式,所以替换可能更好。斜杠不是为了逃出PowerShell,而是为了逃出regex引擎。“所有公式”的复数形式让我朝着这个方向前进。好吧,我注意到在这个问题上做的第一件错事是我没有“区域化”回EN-US——因此公式
=PROCV((“a”和ANO($A6)和“M”&MÊs($A6)和“P”和$B$1);BASE!$a:$P;9;FALSO)
应该是
=VLOOKUP((“a”&YEAR($A6)和“M”&MONTH($A6)和“P”&B$1),BASE!$a:$P:$P,FALSE)
而不是我留下的那堆乱七八糟的东西。第二,是的,这似乎是一个过度的解决方案-如果这是要做的只有一个或几个文件-但我有超过100个这些=p我会尝试这周一,让你知道结果!是 啊它似乎不起作用,@Jeeped=($fnd.formula仍检索$B$1结果,而不是所需的替换“文本”)=(