QlikView中AddField函数异常:TableBox字段缺失问题求助
问题根源分析与解决方案
一、问题到底出在哪?
咱们先拆解两个现象的原因:
原循环丢最后一个字段:
VBScript里UBound(arrFF)返回的是数组最后一个元素的索引值。比如你的字段数组有3个元素,索引是0、1、2,UBound(arrFF)就是2。原循环写For j=0 To (arrFFCount - 1),相当于只循环到1,自然漏掉了索引为2的最后一个字段。改循环后空TableBox+假死:
这大概率是你存储字段的arrFields(i)字符串末尾多了个多余的,(逗号空格),比如字段串是"field1, field2, field3, "。用Split拆分后,最后一个元素会是空字符串""。当你循环到这个空元素时,TB.AddField ""会尝试添加一个不存在的无效字段,QlikView处理这种无效操作时会卡住,看起来像无限执行,同时生成的TableBox因为没有有效字段显示为空。
你用Msgbox测试时可能没注意到最后一个弹窗是空白的,误以为所有字段都正常显示了。
二、修复代码方案
方案1:修正循环范围+清理无效字段串
' 遍历所有表 For i=1 To arrTCount ' 先清理字段字符串末尾多余的", " Dim fieldStr fieldStr = arrFields(i) If Right(fieldStr, 2) = ", " Then fieldStr = Left(fieldStr, Len(fieldStr) - 2) End If ' 拆分字段数组 arrFF = Split(fieldStr, ", ") arrFFCount = UBound(arrFF) ' 创建TableBox Set TB = ActiveDocument.Sheets("Main").CreateTableBox ' 修正循环范围:从0到arrFFCount(覆盖所有元素索引) For j=0 To arrFFCount ' 跳过空字段,避免无效操作 If Trim(arrFF(j)) <> "" Then TB.AddField arrFF(j) End If Next ' 设置TableBox属性 Set tboxprop = TB.GetProperties tboxprop.Layout.Frame.ObjectId = "TB" + CStr(i) TB.SetProperties tboxprop Next
方案2:用For Each遍历数组(更省心,不用管索引)
直接遍历数组元素,彻底规避索引计算错误:
' 遍历所有表 For i=1 To arrTCount Dim fieldStr fieldStr = arrFields(i) If Right(fieldStr, 2) = ", " Then fieldStr = Left(fieldStr, Len(fieldStr) - 2) End If arrFF = Split(fieldStr, ", ") Set TB = ActiveDocument.Sheets("Main").CreateTableBox ' 直接遍历每个字段名 For Each fieldName In arrFF If Trim(fieldName) <> "" Then TB.AddField fieldName End If Next Set tboxprop = TB.GetProperties tboxprop.Layout.Frame.ObjectId = "TB" + CStr(i) TB.SetProperties tboxprop Next
三、更可靠的替代实现方式
手动维护arrFields字段列表容易出错,推荐直接从QlikView的元数据里读取表和字段,完全不用手动拼接字段串:
Dim doc, targetTable, newTB, tbProps Set doc = ActiveDocument ' 遍历QlikView中加载的所有表(跳过系统表) For Each targetTable In doc.Tables If Left(targetTable.Name, 2) <> "$" Then ' 创建TableBox Set newTB = doc.Sheets("Main").CreateTableBox ' 自动添加当前表的所有字段 For Each field In targetTable.Fields newTB.AddField field.Name Next ' 设置唯一ID(用表名命名更直观) Set tbProps = newTB.GetProperties tbProps.Layout.Frame.ObjectId = "TB_" & targetTable.Name newTB.SetProperties tbProps End If Next
这个方法的优势是完全依赖QlikView自身的表元数据,不会出现字段遗漏或无效字段的问题,适合批量处理多张表的场景。
内容的提问来源于stack exchange,提问作者Madison Scodelario
相关产品推荐
相关产品推荐

