请求将Excel数据归一化VBA脚本转换为Power BI的DAX表达式
将Excel VBA归一化逻辑转换为Power BI的DAX表达式
我已将名为“Export”的Excel数据表导入Power BI,希望创建第二个数据表来展示数据的归一化结果。现有一段他人编写的Excel VBA脚本,但不知如何将其转换为DAX表达式,示例中V列对应铝、X列对应硼。
原VBA代码
Dim User As String Dim LastRow As Long Dim Ws As Worksheet Set Ws = ActiveSheet LastRow = Ws.Cells(Ws.Rows.Count, "A").End(xlUp).Row '****Aluminum Range("V:V").EntireColumn.Insert (Shift = xlToRight) Range("V1").Value = "Norm_Al" Range("v2:V" & LastRow).Formula = "=IfError(Sum(U2 / O2 * 100), """"")" Range("v2:V" & LastRow).Formula = Range("v2:V" & LastRow).Value '****Boron Range("X:X").EntireColumn.Insert (Shift = xlToRight) Range("X1").Value = "Norm_B" Range("X2:X" & LastRow).Formula = "=IfError(Sum(W2 / O2 * 100), """"")" Range("X2:X" & LastRow).Formula = Range("X2:X" & LastRow).Value
预期结果
生成包含Norm_Al和Norm_B两列的数据表:
Norm_Al列:每行U列数值除以O列数值后乘以100,计算出错时返回空值Norm_B列:每行W列数值除以O列数值后乘以100,计算出错时返回空值
DAX解决方案
方法1:保留原表所有列并添加归一化列
使用ADDCOLUMNS函数,基于原Export表创建新表,添加两个归一化列:
归一化数据表 = ADDCOLUMNS( Export, "Norm_Al", DIVIDE([U], [O], BLANK()) * 100, "Norm_B", DIVIDE([W], [O], BLANK()) * 100 )
方法2:自定义保留列(仅保留需要的列)
如果不需要原表全部列,用SELECTCOLUMNS指定要保留的原列和新增列(示例中保留原表A列作为标识,可根据需求调整):
归一化数据表 = SELECTCOLUMNS( Export, "标识列", [A], "Norm_Al", DIVIDE([U], [O], BLANK()) * 100, "Norm_B", DIVIDE([W], [O], BLANK()) * 100 )
逻辑说明
- VBA中的
Sum是冗余的(仅单单元格计算),DAX直接用DIVIDE函数处理除法,第三个参数指定错误时返回BLANK(),对应VBA里的空字符串效果 - 乘以100的逻辑和VBA一致,将比值转为百分比形式
- 新建数据表后,可直接在Power BI中使用该表进行后续分析或可视化
内容的提问来源于stack exchange,提问作者James K
相关产品推荐
相关产品推荐

