我对宏观世界非常陌生(这里是第一篇文章),所以如果我缺少一个明显的解决方案,我深表歉意。我也一直在使用录制宏功能,所以下面的脚本可能有点混乱。
目标:创建一个自动数据清理的宏,并创建一个计算中位数和其他统计数据的数据透视表
问题:无法计算我的其中一列的中位数。错误消息是:“MEDIAN 不支持字符串/布尔值/日期类型的表达式”。
我的宏的作用和我尝试过的详细信息:
我编写了一个宏,它首先组织我的数据(连续值),然后通过从特定列中删除任何零或 40 的值来清理数据。然而,在清理步骤之后,此列大部分为空白(请参阅下面数据示例中的 metric2)。最后,该宏自动生成一个数据透视表,其中包含少数列的中位数。大部分为空白的列 (metric2) 无法在数据透视表中生成中位数,并出现上述错误消息。
数据组织步骤涉及使用 vlookup 从另一张表中查找正确的值,然后复制并粘贴为整个列的值,以中断 vlookup,以防 vlookup 的唯一标识符发生更改。
这是我用来删除列中所有 40 和零的方法:
Range("Y:Y").Select
Selection.Replace What:="40", Replacement:="", LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
Range("X:AB").Select
Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
数据清理后,我尝试将列格式设置为数字(见下文)。我检查了我的 Excel,确实关注列中的单元格被格式化为数字,但中位数函数仍然无法计算某一特定列的中位数,并输出错误“MEDIAN 不支持字符串/布尔/日期类型的表达式” ”。其他列生成中位数就好了。
Range("S:AB").Select
Selection.NumberFormat = "0.0"
这是我正在使用的数据示例。 Metric2 是难以生成中位数的列。
Metric1 Metric2
-1.2
-0.8
-0.8
-0.7
-0.9
-1.9
-1.6
-0.6
-0.7
-1.2
-1.1
-1.7
-1.2
-0.6
-1.7
-1.7
-0.9
-1.0
-0.9
-1.0
-1.2
-1.3
-1.0
-1.9
-1.0
-1.2
-1.1
-1.3
-1.3
-1.1
-1.1
-1.2
-0.9
-1.3
-1.2
-1.4
-1.3
-0.9
-1.2
-0.7
-1.1
-0.8
20.5 29.6
-0.7
-1.2
-0.3
-0.7
-0.9
我检查了我的数据 - 所有列一开始都格式化为数字,并且在清理后也以数字结束。当我手动将过滤器应用于 Metric2 列时,我注意到 Excel 想要将原始列按数字排序。在清理步骤之后(只留下几个数字,大部分是空白单元格),然后手动应用过滤器,excel 希望按字母顺序对 Metric2 进行排序。不确定这是否意味着该列实际上被格式化为其他内容,即使列中的每个单元格(标题除外)都显示格式为数字。
通过使用@MartinBrown 的建议修复
我使用 =VALUE() 修改了 vlookup 函数,以确保从另一张工作表获取的所有数据都转换为值:
Range("S2").Formula = "=VALUE(VLOOKUP(R2,Target!R:S,2,FALSE))"
谢谢大家!我现在的下一个目标是销毁所有 .select 和 .activate