1 要解决的问题:删除某列中的空单元格/空行

暂时只实现了删除一列中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的

1.1 需求分析

用VBA删除如下内容,解决思路都不同

  1. 删除1列的空行(本文要做的)
  2. 删除整个区域内的空行
  3. 删除整个区域内的空格(这个一般很少有这种需求,用处不大----可用currentregion .specialcells()解决)
  4. 下面是原始数据,下面看看如何处理

2 如果是删除全表/某区域的空单元格, 直接在当前列删除

简洁代码:删除区域内所有空单元格 cells ---实际需要少,so用处不大

使用 sheet.usedrange / region.currentregion .specialcells()

  • 删除,表格页面内使用区域的空格所在的行
  • 局限性就是表格的上方,左边还会存在一些空行空列,不过这个手动删下就可以了
  • 这个只是删除了空的cells 并不是删除了空行

Sub 删空单元格()
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Delete
End Sub

3 如果是删一列的空行

3.1 代码1:基础代码,假设确认知道这列的长度,关键是倒着删

  • 熟悉 isempty() 或者用 if xxxx=""
  • 删除单元格后,要设置属性 shift:=xlup等
  • 需要倒着删除,否则会因为一边删除行,一遍重新排列有问题

Sub 删一列的空行()
For i = 20 To 1 Step -1 '需要倒着删除
If IsEmpty(Cells(i, 1)) Then
Cells(i, 1).Delete shift:=xlUp
End If
Next i
End Sub

3.2 改进版: 先查这一列的非空最大行数

Sub jackma_delete_row()
For i = Range("c65536").End(xlUp).Rows To 1 Step -1
If IsEmpty(Cells(i, 3)) Then
rows(i).Delete shift:=xlUp
End If
Next i
End Sub

3.3 也可以不用 isempty() 函数,直接判断 if cells()=""

  • 直接判断 if cells(i,j) =""
  • 这种删除整行不合适 rows(i) .delete,会影响其他列的元素

Sub ponyma_del_row1()
For i = Range("c65536").End(xlUp).Row To 1 Step -1
If Cells(i, 3) = "" Then
Cells(i, 3).Delete
' Rows(i).Delete
End If
Next i
End Sub

4 不动原数据,将非空数据放到另外一列

4.1 错误版:

要明白“写入列”的循环数,明显和“输出列”的循环数 应该不同!
这么写相当于 输出列 那行为空的时候,只是不往 写入列写,所以没覆盖,也是空的
Sub jackma_delete_row2()
For i = 1 To Range("c65536").End(xlUp).Rows
If Not IsEmpty(Cells(i, 3)) Then
Cells(i, 9) = Cells(i, 3)
End If
Next i
End Sub

4.2 正确版: 写入列/输出列,应该是单独的循环变量!

Sub jackma_delete_row2()
k = 1
For i = 1 To Range("c65536").End(xlUp).Rows
If Not IsEmpty(Cells(i, 3)) Then
Cells(k, 9) = Cells(i, 3)
k = k + 1
End If
Next i
End Sub

5 先写入数组array中,再写到其他地方,据说这样能大幅提高速度!

把需要的筛选的数据,存在数据,然后从数组写到需要的地方,这是个好习惯

第1版:局限性很大,没有自动查这列的 元素个数,以及 最大非空行是多少

Sub 删除空格4()
Dim arr1() '定义了一个数组,并且是动态数组,因为没指定大小
ReDim arr1(11) '动态数组,使用前必须重新redim,数组大小
j = 0 'j=1开始,不会越界,但arr1(0)为空,因为赋值跳过了它
For i = 1 To 11 Step 1
If Not IsEmpty(Cells(i, 1)) Then
arr1(j) = Cells(i, 1)
j = j + 1
End If
Next i
For j = 0 To UBound(arr1())
Cells(j + 1, 9) = arr1(j) '单元格得从1开始,arr(),默认得从0开始,但可以改
Next j
End Sub

第2版重写

注意debug.print用来监测的时候,需要注意,放在循环的位置,尤其是在k=K+1这种变化时,和放在哪个for循环之内外!

Sub ponyma_array22()
Dim arr1() '当数组定义,且默认开始的index为0! preserve时需要有0的index
'dim arr1 当变量定义
k = 1
m = 1
ReDim arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
For i = 1 To Range("c65536").End(xlUp).Row Step 1
If Cells(i, 3) <> "" Then
Debug.Print Cells(i, 3)
arr1(k) = Cells(i, 3)
Debug.Print arr1(k)
k = k + 1
' Debug.Print arr1(k),写在这里问题1:k已经变了,下一个k还没赋值为空,2最后的k越界
' 循环是很精巧的,放的地方很讲究,放得不对,就错误百出
' Debug.Print arr1(k) 如果放在k=K+1 后,就看起来没打印出东西,因为都打印的arr1的空元素
End If
Next i
For j = 1 To UBound(arr1(), 1)
Cells(m, 10) = arr1(j)
m = m + 1
Next j
End Sub

第3版

Option Explicit
Sub ponyma1()
Dim arr1()
Dim k1, k2, k
Dim i, j
k1 = WorksheetFunction.CountA(Range("a:a"))
k2 = Range("a65536").End(xlUp).Row
Debug.Print "这列非空数据个数k1=" & k1
Debug.Print "这列最后1个有数据的行数k2=" & k2
'arr1(0) = 1
'ReDim Preserve arr1(1, k)
'这样会越界,因为你需要preserve数据。但是index系不符合
'但是,如果不preserve 就无所谓
'或者虽然 dim arr1() 是动态数据从index0开始,但是arr1()一直为空,preserve也不会出现index越界问题
ReDim Preserve arr1(1 To k1)
'ReDim Preserve arr1(1, k1) 这样就会越界。。。因为语法是2维数组了!
'ReDim Preserve arr1(1 to k1) 这样就对的
k = 1
For i = 1 To k2
If Cells(i, 1) <> "" Then
arr1(k) = Cells(i, 1)
Debug.Print arr1(k)
k = k + 1
End If
Next i

————————————————

版权声明:本文为CSDN博主「奔跑的犀牛先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:【原创】VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法

删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...相关推荐

  1. Excel中的空单元格怎么批量删除

    今天跟大家分享一下Excel如何批量删除空白单元格 1.如下图Excel表格中含有部分空单元格,现在我们想要批量删除这些空单元格. 2.首先我们选中单元格区域 3.然后点击下图选项(Excel工具箱, ...

  2. Excel复制粘贴——跳过空单元格案例

    要将表一与表二合并为表3. 有两步要走,第一步就是将表1与表2的第一列填充完整,第二步就是将表1和表2的内容进行合并. 将表2第一列补充完整.选中表2A列,即E5:E15.[开始]选项卡[查找与选择] ...

  3. 谷歌表格_如何计算Google表格中的空白或空单元格

    谷歌表格 When you're analyzing data in a spreadsheet, counting empty or blank cells could help you focus ...

  4. html每个段落空前空两格,科普:为什么段落开始要空两格(两个汉字)?

    小時候寫作文,老師都要你每段空兩格,你就照著做了,因為國語課本也是這樣,社會課本也是.長大以後開始做編輯,你編書也是段首空兩格,因為作者交來的稿子就是這樣,六百字稿紙上,前兩格不寫,句子總是從第三字才 ...

  5. asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...

    VBA编程经常和"对象"打交道,其中最频繁的对象大概就是"单元格"了.(听说您还没有对象?那--我想你大概需要一份Excel,包邮988--) 今天我们就来聊一 ...

  6. 实现Excel行插入行删除特殊处理,单元格合并及动态条件单元格公式自动计算功能的VBA 宏示例

    最近的项目中,用到了很多Excel的VBA宏功能,用户的新需求也有很多需要用VBA宏来实现.为满足业务需求, 自己搜索网上的相关资料,尝试不同的解决方法,最终解决了用户的需求,在此记录下来,做一个总结 ...

  7. Excel VBA:删除行、列或单元格

    应用于"应用于"列表中 Range 以外的对象的 Delete 方法. 删除指定的对象. expression.Delete 表达式 必需.该表达式返回上述对象之一. 应用于 Ra ...

  8. Excel VBA 学习笔记13:单元格的格式

    Excel VBA 学习笔记13:单元格的格式 NumberFormat 属性 (Excel) vba excel 单元格格式设置 Excel VBA 单元格格式 python解决SNIMissing ...

  9. 如何删除UITableView中的空单元格? [重复]

    本文翻译自:How to remove empty cells in UITableView? [duplicate] This question already has an answer here ...

最新文章

  1. 刚出炉的一套面试题(JAVA岗)
  2. 第四代测序(纳米孔测序)有望全面代替边合成边测序吗?
  3. 模板方法及策略设计模式实践
  4. 实验二简化版C语言中文理解程序文法
  5. 索引---B+Tree
  6. c treelist绑定mysql_TreeList 绑数据
  7. Greenplum 集群部署
  8. caffe+GPU︱AWS.G2+Ubuntu14.04+GPU+CUDA8.0+cudnn8.0
  9. 太强了!这款轻量级的数据库中间件完美解决了SpringBoot中分库分表问题?
  10. matlab怎么表示x的平方,用matlab算多项式x平方
  11. 高德地图react版本开源库react-amap与react-amap-next分析
  12. 2020最新版python基础入门学习视频教程
  13. 用python画分析曲线图
  14. Cocos Creator 位图字体(艺术数字资源、BMFont、自定义位图字体、插件)
  15. office移动端_告别微软全家桶,手机版「三合一」的 Office 终于来了
  16. CAD二次开发资料汇总
  17. Firebird的好工具——FlameRobin
  18. java 网页数据_JAVA获取网页数据
  19. access odbc oracle数据库,vb连接数据库(ODBC,oracle,sqlserver,access)
  20. flash移动整体元件

热门文章

  1. Node.js 入门详解 (三)
  2. 小程序开发(6)-之自定义导航栏
  3. microsoft账号登陆一直在加载_英雄联盟手游下载,附带拳头账号注册教程
  4. html邮件和纯文本邮件区别,邮件营销必读系列五--纯文本和HTML邮件类型——哪一种邮件类型更适合你?...
  5. Python chr 函数 - Python零基础入门教程
  6. BugkuCTF-MISC题split
  7. java创建读取文件_Java实现文件的创建、读取、写入操作-Fun言
  8. c# 微服务学习_资深架构师学习笔记:什么是微服务?
  9. 计算机上网英语词汇,计算机网络专用英语词汇1500词
  10. 微型计算机中的奔四指的是,2015云南省计算机等级考试二级理论考试试题及答案...