前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VSTO插件功能介绍-清除空行【进化过程】

VSTO插件功能介绍-清除空行【进化过程】

作者头像
哆哆Excel
发布2024-07-12 18:53:38
460
发布2024-07-12 18:53:38
举报
文章被收录于专栏:哆哆Excel

大家看到的是完成的成果,

可能不知在其中,写码人的艰辛

今天的主要是记录【进化过程】

用于自勉,与大家共勉,努力

文章中的代码你可复制使用哦

想要的效果

若用户选择了区域,选择确定Button对此区域,进行清除空行若用户想要本表所用区域,选择取消Button,对本表所用区域,进行清除空行

思路

1. 出现对话框,用户选择区域,选择Button2. 判断用户是否选择,如果不选择,就赋值Usedrange,如果选择但行数<2行(此时用户是鼠标点在一个单元格中)赋值Usedrange,如果行数>2行,说明用户是做了选择区域啦赋值SelectRngs3. 下面要运行判断,计算行如果数据CountA=0,删除行,否则不删除

【第一版本】

代码语言:javascript
复制
'清除空行
PublicSub DeleteEmptyRowsInSelection()
Dim ActSht As Excel.Worksheet = xlapp.ActiveSheet
Dim UsedRngs As Excel.Range = ActSht.UsedRange
Dim rngs As Excel.Range
Dim oneRng As Excel.Range
Dim r AsInteger
Dim startRow AsInteger
Dim endRow AsInteger
'Dim SelectRngs As Excel.Range
On ErrorResumeNext
Dim SelectRngs As Excel.Range = xlapp.InputBox(Prompt:="选择区域:"+ vbCrLf +"1.选择、确定=你选择区域"+ vbCrLf +"2.取消=默认是本表所用区域", Title:="请选择",Default:=xlapp.Selection.address,Type:=8)
On ErrorGoTo0
If IsNothing(SelectRngs)Then
            rngs = UsedRngs
Else
If SelectRngs.Rows.Count <2Then
                rngs = UsedRngs
Else
                rngs = SelectRngs
EndIf
EndIf' 检查选择区域是否为空
'第1版本:(这种有点问题,特别是两个空行时)
For Each oneRng In rngs.Rows
If xlapp.Application.WorksheetFunction.CountA(oneRng)=0Then
' 如果没有数据,删除该行
                oneRng.EntireRow.Delete()
'oneRng.EntireRow.Interior.ColorIndex = 20
EndIf
Next
EndSub

【出现问题】

【第2版本】第2版本

代码语言:javascript
复制
With ActSht
'获取选择区域的开始和结束行号
            startRow = rngs.Row
            endRow = startRow + rngs.Rows.Count -1
' 从最后一行开始向上遍历,避免索引问题
For r = endRow To startRow Step-1
' 检查整行是否有数据
If xlapp.Application.WorksheetFunction.CountA(rngs.Rows(r - startRow +1))=0Then
' 如果没有数据,删除该行
                    .Rows(r).Delete
EndIf
Next r
EndWith
EndSub

【第2-1版本】

代码语言:javascript
复制
.CountA(rngs.CountA(rngs.Rows(r))=0

【出现问题】

一开始也不知出现在那里

后来用这个

MsgBox(.Address + "-" + r.ToString() + "-" + .Rows(r).Address)

输出相关的内容,进行检测,才能看到问题所在

后有修改成以下情况

【第2-2版本】

代码语言:javascript
复制
.CountA(rngs.CountA(rngs.Rows(r - startRow +1))=0

可以进行正确的删除

【出现问题】

因为在WithActSht中运行,所以删除是本表的行,

如果区域内的删除,就会出错连带也删除了外部的数据

【第3版本】

代码语言:javascript
复制
'第3版本
With rngs
'获取选择区域的开始和结束行号
            TotalRows = .Rows.Count
' 从最后一行开始向上遍历,避免索引问题
For r = TotalRows To1Step-1
' 检查整行是否有数据
                MsgBox(.Address +"-"+ r.ToString()+"-"+ .Rows(r).Address)
If xlapp.Application.WorksheetFunction.CountA(.Rows(r))=0Then
' 如果没有数据,删除该行
                    .Rows(r).Delete
EndIf
Next r
EndWith

在本区域中运行,不影响外部,

先计算区域的总行数,

从最大行开始逆序计算,若为CountA=0,删除本区域

完成

==提示==

插件命名:“哆哆Excel”,日前没打包,

主要是自用,提高工作效率

大部分代码,请看历史文章

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哆哆Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大家看到的是完成的成果,
  • 可能不知在其中,写码人的艰辛
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档