Foxtable(狐表)用户栏目专家坐堂 → [求助] 有更好的删除表所有空行的方法吗?


  共有2194人关注过本帖树形打印复制链接

主题:[求助] 有更好的删除表所有空行的方法吗?

美女呀,离线,留言给我吧!
龙潭春早
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:676 积分:4895 威望:0 精华:0 注册:2018/3/22 16:05:00
[求助] 有更好的删除表所有空行的方法吗?  发帖心情 Post By:2020/8/3 20:28:00 [只看该作者]

一、想删除表的所有空行

下面代码执行结果的“删除前总行数 i ”,怎么会和“有数据的行数 i4”一样呢?

不应该吧?

二、有更好的删除表所有空行的方法吗?

三、代码

1、下面代码的执行结果: 总是 i = i4

删除前总行数 i = 103
删除的空行数 i3 = 50
有数据的行数 i4 = 103
总列数 = 10
删除后总行数 = 53

2、代码

MainTable = Tables("表C")

Dim i,i2,i3,i4 As Integer
Dim t As Table = Tables("表C")

t.StopReDraw

For i = 0 To t.Rows.Count - 1
    i2 = 0
    For Each c  As Col In t.Cols
        If t.Rows(i).IsNull(c) Then
            i2 = i2 + 1 ' 累计为空的列数
        Else
            Exit For ' 遇到第一个不为空的列,则退出循环'
        End If
    Next
    
    If i2 = t.Cols.Count Then ' 累计为空的列数 = 列集合数,则删除该行
        t.Rows(i).Delete()
        i3 = i3 + 1 ' 累计删除的空行数
        i = i - 1 ' 为了再次循环时,保持当前的行号
    Else
        i4 = i4 + 1 ' 累计不为空( 有数据 ) 的行数
    End If
Next

t.ResumeRedraw

output.show("删除前总行数 i = " & i)
output.show("删除的空行数 i3 = " & i3)
output.show("有数据的行数 i4 = " & i4)
output.show("总列数 = " & t.Cols.Count )
output.show("删除后总行数 = " & t.Rows.Count )

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106081 积分:539504 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/8/3 20:43:00 [只看该作者]

删除行要倒序删除

MainTable = Tables("表C")

Dim i,i2,i3,i4,cnt As Integer
Dim t As Table = Tables("表C")
cnt = t.Rows.Count
t.StopReDraw
For i = t.Rows.Count - 1 To 0 Step -1
    i2 = 0
    For Each c  As Col In t.Cols
        If t.Rows(i).IsNull(c) Then
            i2 = i2 + 1 ' 累计为空的列数
        Else
            Exit For ' 遇到第一个不为空的列,则退出循环'
        End If
    Next
    
    If i2 = t.Cols.Count Then ' 累计为空的列数 = 列集合数,则删除该行
        t.Rows(i).Delete()
        i3 = i3 + 1 ' 累计删除的空行数
    Else
        i4 = i4 + 1 ' 累计不为空( 有数据 ) 的行数
    End If
Next
t.ResumeRedraw

output.show("删除前总行数 i = " & cnt)
output.show("删除的空行数 i3 = " & i3)
output.show("有数据的行数 i4 = " & i4)
output.show("总列数 = " & t.Cols.Count )
output.show("删除后总行数 = " & t.Rows.Count )

 回到顶部
美女呀,离线,留言给我吧!
龙潭春早
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:676 积分:4895 威望:0 精华:0 注册:2018/3/22 16:05:00
  发帖心情 Post By:2020/8/7 15:14:00 [只看该作者]

嗯 看样子,是没有更好的删除表所有空行的方法了,只能是通过行、列的遍历来判断了。
[此贴子已经被作者于2020/8/7 15:17:15编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
y2287958
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:4627 积分:33767 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2020/8/7 15:37:00 [只看该作者]

加个表达式列的辅助列,然后用DeleteFor删除

 回到顶部
美女呀,离线,留言给我吧!
龙潭春早
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:676 积分:4895 威望:0 精华:0 注册:2018/3/22 16:05:00
  发帖心情 Post By:2020/8/7 16:50:00 [只看该作者]

请教大神,具体要怎么操作呢?
[此贴子已经被作者于2020/8/7 16:49:51编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
y2287958
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:4627 积分:33767 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2020/8/7 16:56:00 [只看该作者]

Dim lst As new List(of String)
For Each dc As DataCol In DataTables("表B").DataCols
    lst.Add("isnull(" & dc.Name & ",1)")
Next
Dim 表达式 As String = String.join("+",lst.ToArray)
If DataTables("表B").DataCols.Contains("aa")
    DataTables("表B").DataCols("aa").Expression = 表达式
Else
    DataTables("表B").DataCols.Add("aa",Gettype(Integer),表达式)
End If
DataTables("表B").DeleteFor("aa=" & DataTables("表B").DataCols.Count-1)


 回到顶部
美女呀,离线,留言给我吧!
龙潭春早
  7楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:676 积分:4895 威望:0 精华:0 注册:2018/3/22 16:05:00
  发帖心情 Post By:2020/8/7 18:12:00 [只看该作者]

嗯 研究一下 多谢!

 回到顶部