excel学习库

excel表格_excel函数公式大全_execl从入门到精通

Excel 函数公式/ 连接字符串/F5定位空单元格/VBA 删除空单元格

本文于2023年8月17日首发于本人同名其他平台,更多文章案例请搜索关注!

内容提要

  • 根据不同条件,连接字符

  • VBA删除空单元格

大家好,我是冷水泡茶,今天在知乎上看到一个求助贴:

他的具体需求可以描述为:把非空单元格与表头字段合并起来。

看了他的需求,感觉有一点点奇怪,不过应该不难实现,我们一起来看一看吧:

实现过程

1、新建一个工作表,用来处理数据,格式与原表一致

2、在新表对应单元格输入公式:

=IF(OR(原表!C2=0,原表!C2=""),"",IF(原表!C$1="总价",原表!C2&"(商品总价)",原表!C$1&"*"&原表!C2))

3、看他的目标表的结果,还要把所有非空单元格都挪到左边,这个用公式可能有点难度,就不费那个脑筋了,我们采用删除空单元格的方法:

(1)选中数据区域,选择性粘贴,数值。

(2)把数据区域每一列都分列。

(3)选中数据区域,按F5或Ctrl+G定位,定位条件,空值。

(4)右键点击第一个选中的空单元格,删除,左移。

VBA方法

感觉今天的内容有点少,我就想,是不是可以用VBA呢?这样是不是有点无聊?

其实,在我的回答中,上面的第(2)步“把数据区域每一列都分列“是没有的,也就是说,没有经过分列,直接定位空值,结果会怎么样呢?

结果是定位不到空值,那就没有能达成问主的目的。

原因是看上去是空单元格,实际上它不是空值,它的值=""。

经过分列以后,它就变成空了,就可以定位到了。

虽然勉强达成目标,但是分列的操作也很繁琐。

看来用VBA也是很有必要的,我们就来试试看吧:

Sub Transfer()    Dim ws As Worksheet    Dim lastRow As Integer    Dim lastCol As Integer    Dim arr()    Set ws = ThisWorkbook.Sheets("原表")    ws.Activate    With ws        .Activate        lastRow = .UsedRange.Rows.Count        lastCol = .UsedRange.Columns.Count        arr = .Range(Cells(1, 1), Cells(lastRow, lastCol)).Value    End With    For i = 2 To lastRow        For j = 3 To lastCol            If arr(1, j) <> "总价" Then                If arr(i, j) <> 0 Then                    arr(i, j) = arr(1, j) & "*" & arr(i, j)                End If            Else                arr(i, j) = arr(i, j) & "(商品总价)"            End If        Next    Next    With ThisWorkbook.Sheets("目标")    .Activate        .Range("A1").Resize(lastRow, lastCol) = arr        For i = 2 To lastRow            For j = lastCol To 3 Step -1                If .Cells(i, j) = 0 Or .Cells(i, j) = "" Then                    .Cells(i, j).Delete Shift:=xlToLeft                End If            Next        Next    End WithEnd Sub

代码解析:

(1)假设数据源是“源表”,结果表是“目标”表。

(2)我们先把数据读入数组arr。

(3)我们从第3列开始,判断数组元素的值,如果不为0不为空,则把数组第1行对应列的元素与当前数组元素连接起来,这里还要区分标题是不是“总价”,连接方式有一点区别。

(4)接着,把“目标”表清除内容,写入数组的值。

(5)最后,把“目标”表数据区域空单元格删除,单元格左移。这里是从最右边向左循环删除,否则可能得不到正确的结果。应该跟删除工作表指定行类似,要从最大的行号开始倒着删除,否则必定报错。

总结

1、回答问题应该经过充分测试。

2、上面VBA代码删除空单元格的操作,也可以在数组中完成,然后再写入工作表。如果数据特别多,那就应该这样做。删除单元格可能速度会有点慢。

---End---

喜欢就点个、点在看留个言呗!分享一下更给力!感谢!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接