Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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 在每列上应用函数的Power Query_Excel_Powerbi_Powerquery_Excel 2016_M - Fatal编程技术网

Excel 在每列上应用函数的Power Query

Excel 在每列上应用函数的Power Query,excel,powerbi,powerquery,excel-2016,m,Excel,Powerbi,Powerquery,Excel 2016,M,我正在尝试编写一个查询,它接受一个表,并将表中的每个数字乘以100。我已经接近了,但是我很难将它正确地应用到每一列。下面是我到目前为止的代码。以ReplaceTable开头的行是我为一个列工作的行,下面的行是我试图让它为其他列工作的行。我目前正在处理一个小的子集,但是实际数据可能有大约100列,所以我不想手工完成。如果有更好的方法来完成这项任务,请让我知道。我不熟悉Power Query,因此如果可以,请解释我的错误/解决方案,以便我可以学习。谢谢 let Source = Excel.

我正在尝试编写一个查询,它接受一个表,并将表中的每个数字乘以100。我已经接近了,但是我很难将它正确地应用到每一列。下面是我到目前为止的代码。以ReplaceTable开头的行是我为一个列工作的行,下面的行是我试图让它为其他列工作的行。我目前正在处理一个小的子集,但是实际数据可能有大约100列,所以我不想手工完成。如果有更好的方法来完成这项任务,请让我知道。我不熟悉Power Query,因此如果可以,请解释我的错误/解决方案,以便我可以学习。谢谢

let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    //Organization will always be of type text.  The others will be should be numbers, unless user error
    #"Changed Type" = Table.TransformColumnTypes(Source, {{"Organization", type text}, {"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}}),
   //function to replace all values in all columns with multiplied values
   MultiplyReplace = (DataTable as table, DataTableColumns as list) =>
     let
        Counter = Table.ColumnCount(DataTable),
        ReplaceCol = (DataTableTemp, i) =>
            let
                colName = {DataTableColumns{i}},
                col = Table.Column(DataTableTemp, colName),
                //LINE THAT WORKS- want this functionality for ALL columns
                ReplaceTable = Table.ReplaceValue(DataTableTemp, each[A], each if [A] is number then [A]*100 else [A], Replacer.ReplaceValue, colName)
                //ReplaceTable = Table.ReplaceValue(DataTableTemp, each col, each if col is number then col*100 else col, Replace.ReplaceValue, colName)
            in
                if i = Counter-1 then ReplaceTable else @ReplaceCol(ReplaceTable, i+1)
     in
        ReplaceCol(DataTable, 0),
    allColumns = Table.ColumnNames(#"Changed Type"),
    #"Multiplied Numerics" = MultiplyReplace(#"Changed Type", allColumns)
    //#"Restored Type" = Value.ReplaceTypes(#"Multiplied Numerics", #"Changed Type")
in
    #"Multiplied Numerics"

这个问题涉及函数和变量的范围

对于硬编码的列名(如[a]),代码理解为实际意思是
\uUA]
。在
Table.ReplaceValue
函数中,
引用当前记录或行。但是,
col
变量引用的是整个表列。在replacer函数中使用时,会导致错误。(不幸的是(?),replacer函数中的错误被忽略,没有错误消息,因此问题很难跟踪。)

在更正的代码中,我去掉了
col
变量,因为它被确定在错误的范围级别。我将
colName
更改为文本而不是列表,然后将
Record.Field
函数与
\uu
一起使用(表中的当前记录.ReplaceValue
函数)以及文本值
colName
,以提取所需的记录,用于使用
Table.ReplaceValue
函数本身进行计算

已更正的代码



该代码适用于1列(示例中的A列)。但是,我需要将其应用于表中的每一列。我有一行评论出来,这是我试图这样做。因此,在运行代码的最后,A、B和C列都应该乘以100。非常好,非常感谢!我也非常感谢你的解释。帮助清理了Record.Field函数中发生的事情。@Zoopzoop不客气。
\uuu
的棘手之处在于,它的含义可能会根据所使用的功能而变化。我有一些表级函数,其中
\u
表示特定字段而不是记录。
let
    Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
    //Organization will always be of type text.  The others will be should be numbers, unless user error
    #"Changed Type" = Table.TransformColumnTypes(Source, {{"Organization", type text}, {"A", Int64.Type}, {"B", Int64.Type}, {"C", Int64.Type}}),
   //function to replace all values in all columns with multiplied values
   MultiplyReplace = (DataTable as table, DataTableColumns as list) =>
     let
        Counter = Table.ColumnCount(DataTable),
        ReplaceCol = (DataTableTemp, i) =>
            let
                colName = DataTableColumns{i},
                //LINE THAT WORKS- want this functionality for ALL columns
                ReplaceTable = Table.ReplaceValue(DataTableTemp,each Record.Field(_, colName), each if Record.Field(_, colName) is number then Record.Field(_, colName)*100 else Record.Field(_, colName),Replacer.ReplaceValue,{colName})
                //ReplaceTable = Table.ReplaceValue(DataTableTemp, each col, each if col is number then col*100 else col, Replace.ReplaceValue, colName)
            in
                if i = Counter-1 then ReplaceTable else @ReplaceCol(ReplaceTable, i+1)
     in
        ReplaceCol(DataTable, 0),
    allColumns = Table.ColumnNames(#"Changed Type"),
    #"Multiplied Numerics" = MultiplyReplace(#"Changed Type", allColumns)
    //#"Restored Type" = Value.ReplaceTypes(#"Multiplied Numerics", #"Changed Type")
in
    #"Multiplied Numerics"