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

d028b028b34d74d0282b04957bf7b6c5.png

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

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

1.1 需求分析

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

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

b5e432c6e31ae5a69d9e54459414deba.png

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种方法:删除法,转移到其他列方法,数组方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

winpe制作u盘启动盘_怎么制作u盘启动盘 u盘启动盘制作方法【介绍】

使用u盘装系统时就需要先将u盘制作成一个启动u盘&#xff0c;这样才能够通过u盘启动装系统操作&#xff0c;那么 如何制作u盘启动盘 呢?为此&#xff0c;今天我们就为小伙伴们详细的介绍 怎样制作u盘启动盘 的操作。制作u盘启动盘准备工作&#xff1a;① 、准备一个空间容量大…

插入空行_如何一键插入表格空行,这个方法才最高级!

100万职场人都在看后台回复礼包领199元职场干货很久很久之前&#xff0c;小可教过大家如何一键删除空行&#xff0c;回顾请戳→《如何一键删除表格空行&#xff0c;这个方法才最高级&#xff01;》这次&#xff0c;小可反过来&#xff0c;教大家如何一键插入很多空行&#xff0…

的控制台主题_【12.11最新版】芯片机/大气层主题软件NXThemesInstaller

Switch的主题的安装和管理主要通过自制软件——NXThemesInstaller软件地址&#xff1a;https://github.com/exelix11/SwitchThemeInjector本文只传了工具&#xff0c;主题需要自行去下载&#xff0c;可以按照自己喜欢的更换&#xff01;&#xff01;教程简单概括如下这是最常见…

数据卡片_E015 如何批量汇总工作簿数据,形成独立工作簿信息卡片

Hi&#xff0c;How are you doing?我是职场编码&#xff08;CodeVoc&#xff09;。在E000中&#xff0c;我们介绍了Node.js、Ruby、Electron等工具下载安装。这期&#xff0c;给你演示一下由Electron联合Ruby制作的小工具。知乎视频​www.zhihu.com借助Electron官方Demo&#…

redis哨兵模式没有切换主机_Redis哨兵(Sentinel)模式

Redis哨兵(Sentinel)模式在这里插入图片描述一、主从复制高可用当我们使用主从复制出现的问题手动故障转移写能力和存储能力受限主从复制 -master 宕机故障处理主从切换技术的方法是&#xff1a;当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;…

mysql rpm 安装6_linux6.5 RPM方式安装 mysql5.6

步骤一、检查下linux是不是已经安装了MySQL# rpm -qa|grep mysqlmysql-libs-5.1.71-1.el6.x86_64# rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64 //卸载# find / -name mysql//有mysql文件夹的话&#xff0c;把mysql的文件夹删掉步骤二、下载需要的安装包&#xff0c;下载地…

阿里云rds for mysql平台介绍_阿里云RDS for MySQL 快速入门——笔记

1初始化配置1.1设置白名单创建RDS实例后&#xff0c;需要设置RDS实例的白名单&#xff0c;以允许外部设备访问该RDS实例。默认的白名单只包含默认IP地址127.0.0.1&#xff0c;表示任何设备均无法访问该RDS实例。设置白名单包括两种操作&#xff1a;设置IP白名单&#xff1a;添加…

mysql数据库下载压缩包_mysql 8.0.22 zip压缩包版(免安装)下载、安装配置步骤详解...

大家好&#xff0c;今天我在学习 MySQL 8.0.22安装及配置遇到了一些问题&#xff0c;特地将我整个安装过程分享出来希望可以帮助不会安装的小伙伴&#x1f61c;。参考链接第一步 MySQL的下载进入MySQL官网下载&#xff0c;按下图所示步骤操作&#xff0c;耐心等待下载完成就可以…

mysql 5.5 主从同步问题_MySQL 5.5 主从复制异步、半同步以及注意事项详解

大纲一、前言二、Mysql 基础知识三、Mysql 复制(Replication)四、Mysql 复制(Replication)类型五、Mysql 主从复制基本步骤六、Mysql 主从复制(异步)七、Mysql 主从复制(半同步)八、Mysql 复制工具九、Mysql 复制注意事项十、Mysql 复制过滤一、前言从这一篇博客开始我们就来学…

mysql导入xml 工具下载_XML导入Mysql工具下载|XmlToMysql 最新版v2.1 下载_当游网

XmlToMysql是一款十分不错的XML导入Mysql工具&#xff0c;它可以帮助用户们将XML中的数据快速的导入到MySQL数据库中&#xff0c;可以直接跳过解析环节&#xff0c;因此可以有效的提升程序员传输数据的效率&#xff0c;让程序员可以拥有更多的时间去处理其他环节的事宜。所以喜…

mysql忽略表名大小写_Mysql 表名忽略大小写-连接字符集随笔记录

1.参数说明&#xff1a;lower_case_table_names0表名存储为给定的大小和比较是区分大小写的lower_case_table_names 1表名存储在磁盘是小写的&#xff0c;但是比较的时候是不区分大小写lower_case_table_names2表名存储为给定的大小写但是比较的时候是小写的unix,linux下lower_…

ddl是什么意思网络语_DDL(数据定义语言)

DDL&#xff0c;是对数据库内部的对象进行创建&#xff0c;删除&#xff0c;修改等的操作语言。它和DML语言最大的区别是DML只是对表内部数据的操作&#xff0c;而不涉及到表的定义&#xff0c;结构的修改&#xff0c;更不会涉及到其它对象。1.连接数据库:注:1.mysql代表客户端…

测试网络的带宽指令_单机千万级MQTT服务器测试报告

目标&#xff1a;测试创建1000万客户端连接到Coolpy7 MQTT服务器端&#xff0c;服务器操作系统 Linux(任意一款发行版服务器版本)。分别在两台硬件一样的服务器&#xff0c;其中一台用于服务器端运行&#xff0c;另一台用于创建千万客户端连接客户端机器。在硬件一致的情况下请…

查看redis aof内存_Redis持久化问题定位与优化技巧

今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。这里主要CPU、内存、磁盘在三个维度去分析问题&#xff01;Fork操作当Redis做RDB或AOF重写时&#xff0c;一个必不可少的操作就是执行fork操作创建子进程&#xff0c;对于大多数操作系统来说fo…

windows设置mysql使用率_Windows下配置Mysql

这里说的配置Mysql&#xff0c;是在安装时进行的&#xff0c;请先查看&#xff1a;Windows平台下安装Mysql紧接上文&#xff0c;安装完成后将配置选项打上对勾&#xff0c;按下“Finish”&#xff0c;出现下面的界面&#xff0c;这里有一个很好的功能&#xff0c;mysql配置向导…

mysql 云无忧ps教程_华为云数据库MySQL一键开通读写分离,无忧应对企业业务高峰情景...

业务大促&#xff0c;订单暴增&#xff0c;网站流量暴涨几倍&#xff0c;数据库服务器容量又要扛不住了&#xff0c;眼睁睁看着生意白白溜走&#xff0c;再苦逼也无法解决&#xff0c;“肿”么办&#xff1f;别担心&#xff0c;一键开通读写分离&#xff0c;而且只需一个连接地…

python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...

最近&#xff0c;用Python脚本提取&#xff0c;在基因号已知&#xff0c;位置已知条件下&#xff0c;相对应位置的基因序列时发现&#xff0c;这样很简单但是很实用的脚本&#xff0c;在网上却比较难找。而且&#xff0c;能被找到的脚本&#xff0c;相对于具有初级编程能力的人…

python是强定义语言吗_python是强类型语言吗

强弱是对类型而言的。强类型&#xff0c;你有一个值之后这个值是什么类型是确定&#xff0c;比如n1&#xff0c;n的类型是确定的(字符串)&#xff0c;因此你不能在Python做n3 mn1运算。而弱类型就不是这样的&#xff0c;值的类型可以在需要的时候再去确定&#xff0c;比如PHP里…

深入java核心_Java核心(五)深入理解BIO、NIO、AIO

导读&#xff1a;本文你将获取到&#xff1a;同/异步 阻/非阻塞的性能区别&#xff1b;BIO、NIO、AIO 的区别&#xff1b;理解和实现 NIO 操作 Socket 时的多路复用&#xff1b;同时掌握 IO 最底层最核心的操作技巧。BIO、NIO、AIO 的区别是什么&#xff1f;同/异步、阻/非阻塞…

java arraylist底层实现原理_ArrayList和LinkedList底层原理

ArrayList和LinkedList都是List的实现类&#xff0c;是在日常开发中经常被使用到的两个集合&#xff0c;我们来结合源码看下两个集合的不同之处。先来看下ArrayList的源码&#xff1a;// 默认的初始化大小private static final int DEFAULT_CAPACITY 10;ArrayList的底层数数组…