我有一个庞大而复杂的Excel查询,可以根据需要运行。
但是,我正在实现一些实时数据验证功能(即不需要数据刷新),我需要在查询结果的其中一列中使用常规的Excel公式。
此公式将使用工作簿中的其他工作表执行实时数据比较,故意独立于查询本身。
我可以添加没有值的自定义列吗?
我假设值null
或""
会覆盖任何预先存在的数据,所以我不能在运行查询后将excel公式输入结果表(公式不会在刷新之间保留) )。
为了进行测试,我尝试添加一个值为"=5+2"
的自定义列,以查看它的行为方式。
let
Source = Excel.CurrentWorkbook(){[Name="tblInvoicesCategorized"]}[Content],
/* ... perform numerous query actions ... */
// Use "=5+2" as a test formula
#"Added Custom13" = Table.AddColumn(#"Added Custom12", "Stale Data", each "=5+2"),
/* ... perform numerous query actions ... */
in
#"Changed Type"
查询确实输出了公式作为列中单元格的值,但Excel没有自动执行公式 我仍然需要手动将光标放入单元格并按Enter键,以使其执行公式。
对于此工作簿,不希望手动输入公式,甚至手动执行宏。
我有一种方法可以在此查询列中使用常规公式,并让它在数据刷新之间自动保留吗?
答案 0 :(得分:1)
#"Added Custom13" = Table.AddColumn(#"Added Custom12", "Stale Data", each "=5+2"),
这不符合您的预期,因为您返回的是字符串文字:“= 5 + 2”
暗示=并且不需要引号
#"Added Custom13" = Table.AddColumn(#"Added Custom12", "Stale Data", each 5+2),
这将返回7而无需手动刷新。但是,您仅限于Power Query Formulas,它具有与标准excel公式不同的功能集。
https://msdn.microsoft.com/library/1ed840b1-7e20-4419-ad2f-d82054c9b2ab
这可以使您从工作表中访问数据成为一件苦差事,但这是可能的。一些提示可以在这里找到:
答案 1 :(得分:1)
解决方法是通过某些VBA代码触发对单元格更改的重新调整...
这是我的情况,希望它有帮助...
Private Sub Worksheet_Change(ByVal Target As Range)
'
' Dim lTest As Long, cn As WorkbookConnection
' On Error Resume Next
' For Each cn In ThisWorkbook.Connections
' lTest = InStr(1, cn.OLEDBConnection.Connection, "Provider=Microsoft.Mashup.OleDb.1", vbTextCompare)
' If Err.Number <> 0 Then
' Err.Clear
' Exit For
' End If
' If lTest > 0 Then cn.Refresh
' Next cn
If Intersect(Target, Me.Range("datachange")) Is Nothing Then Exit Sub
Application.EnableEvents = False 'to prevent endless loop
'Application.Goto Reference:="Tum_Santiyelerin_Satinalinan_Malzemeleri"
Range("Tum_Santiyelerin_Satinalinan_Malzemeleri").ListObject.QueryTable.Refresh BackgroundQuery:=False
'Application.Goto Reference:="Filtre"
'Range("Filtre").ListObject.QueryTable.Refresh BackgroundQuery:=False
'Application.Goto Reference:="Filtre_Malzeme"
Range("Filtre_Malzeme").ListObject.QueryTable.Refresh BackgroundQuery:=False
'Application.Goto Reference:="Filtre_Proje"
Range("Filtre_Proje").ListObject.QueryTable.Refresh BackgroundQuery:=False
'Application.Goto Reference:="Filtre_Firma"
Range("Filtre_Firma").ListObject.QueryTable.Refresh BackgroundQuery:=False
Application.Goto Reference:="Tum_Santiyelerin_Satinalinan_Malzemeleri"
ActiveWorkbook.RefreshAll
Application.EnableEvents = True
答案 2 :(得分:0)
您无法输出将直接调用Excel公式的列。您可以在工作表中使用不同的列来调用Excel公式,并从Power Query输出的表中引用单元格。刷新Power Query表时,此单元格将刷新。
答案 3 :(得分:0)
我意识到这是一个老线程,但是想要给出我的答案,以防其他人像我一样遇到它。我偶然遇到了这个解决方案,所以我不能说它是设计还是将来会发布的错误。
如果您将具有公式的列直接添加到输出表的末尾并选择选项&#34;使用此公式覆盖此列中的所有单元格,而不是尝试在查询结果中包含公式,而不是#34;然后当您刷新查询时,公式将填充表的所有行,并将像普通工作表公式一样解析。
答案 4 :(得分:0)
我知道帖子有些旧,但是我遇到了同样的问题,无法找到解决方案。
实际上,您可以使用一个宏来完成此操作。我有18个不同的查询,其中一些需要一个公式。为了提高性能,我编写了一些vba以更快地刷新所有内容并在刷新后保存文档。看起来像这样:
Sub Aktualisieren()
Application.Calculation = xlCalculationManual
ActiveWorkbook.RefreshAll
Application.Calculation = xlAutomatic
On Error GoTo ErrorHandler
ActiveWorkbook.Save
Exit Sub
ErrorHandler: MsgBox "You can't save the file right now! This isn't a bug!", vbInformation Exit Sub
End Sub
由于我的问题,我在查询中得到了一些公式,例如 Query with formula
如果将以下代码添加到我的Sub Aktualisieren()
中,该公式将被自动激活:
Sub Aktualisieren()
Application.Calculation = xlCalculationManual
ActiveWorkbook.RefreshAll
ThisWorkbook.Sheets("Report").Range("AM2").Select
ActiveCell.FormulaR1C1 = _
"=IFERROR(VLOOKUP([@Arbeitsplatz],Verzeichnis!R3C5:R26C6,2,FALSE),"""")"
ThisWorkbook.Sheets("Report").Range("AM2").Select
Selection.AutoFill Destination:=Range("Report[Prio Anlage]")
Application.Calculation = xlAutomatic
On Error GoTo ErrorHandler
ActiveWorkbook.Save
Exit Sub
ErrorHandler: MsgBox "You can't save the file right now! This isn't a bug!", vbInformation
Exit Sub
End Sub
我使用Excel中内置的Macro maker做到了。但基本上,您可以复制该代码,只需更改 ThisWorkbook.Sheets(“ Report”)。Range(“ AM2”)。选择您的公式“ = IFERROR(VLOOKUP([@ Arbeitsplatz], Verzeichnis!R3C5:R26C6,2,FALSE),“”“”)“和自动填充目标。
希望它能对您有所帮助。