ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1118|回复: 8

[求助] 提取数据的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-23 16:49 | 显示全部楼层 |阅读模式
本帖最后由 bzzxsgzc 于 2019-10-23 16:54 编辑

如图
请教怎么用公式把表中C4:J63区域中的非空数据提取到sheet2工作表的C列,谢谢!
2ca58bba579b2a32ac0c3a94938d4dc.png

提取单元格值.zip

19.69 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2019-10-23 16:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. =INDIRECT("Sheet1!"&TEXT(AGGREGATE(15,0,IF(Sheet1!$C$4:$J$63<>"",ROW($4:$63)*10+COLUMN($C$3:$J$3),10099),ROW(A1)),"R#C0"),)
复制代码

TA的精华主题

TA的得分主题

发表于 2019-10-23 17:09 | 显示全部楼层
卡卡的=INDIRECT("sheet1!"&TEXT(SMALL(--TEXT((Sheet1!$C$4:$J$63>0)*ROW($4:$63)/1%+COLUMN(C:J),"[>63]#;!65536"),ROW(A1)),"r0c00"),)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-23 17:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢!但有错误值和最后的0值怎么处理
7247b0645b1683d26635eb28c7c942e.png
c8d84205e02ba06d7bf83207d184857.png

TA的精华主题

TA的得分主题

发表于 2019-10-23 23:22 | 显示全部楼层
代码不卡,
Sub 提取()
Dim rng As Range, a, b, c, d
For Each rng In Sheet1.[c4:j63]
If rng <> "" Then
   a = a + 1
If a = 1 Then
   Set b = rng
Else
    Set b = Union(b, rng)
        c = b.Address
    End If
End If
Next
For Each rngs In b
    d = d + 1
Sheet2.Cells(d, 3) = rngs
Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-24 10:48 | 显示全部楼层
1055751654 发表于 2019-10-23 23:22
代码不卡,
Sub 提取()
Dim rng As Range, a, b, c, d

谢谢!如果提取到sheet2工作表的C列第三行开始,代码怎么修改

TA的精华主题

TA的得分主题

发表于 2019-10-24 11:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
bzzxsgzc 发表于 2019-10-24 10:48
谢谢!如果提取到sheet2工作表的C列第三行开始,代码怎么修改

Sub 提取()
Dim rng As Range, a, b, c, d
For Each rng In Sheet1.[c4:j63]
If rng <> "" Then
   a = a + 1
If a = 1 Then
   Set b = rng
Else
    Set b = Union(b, rng)
        c = b.Address
    End If
End If
Next
For Each rngs In b
    d = d + 1
Sheet2.Cells(d, 3).Offset(2, 0) = rngs
Next
End Sub

TA的精华主题

TA的得分主题

发表于 2019-10-24 11:34 | 显示全部楼层
再来种方法,有点好玩
Sub 提取()
Dim rng As Range, a, b, s
For Each rng In Sheet1.[c4:j63]
    If rng <> "" Then
       a = rng
       b = b & rng & ","
   End If
Next
a = Split(b, ",")
For i = 0 To UBound(a)
s = s + 1
Sheet2.Cells(s, 3).Offset(2, 0) = a(i)
Next
End Sub

TA的精华主题

TA的得分主题

发表于 2019-10-24 14:40 | 显示全部楼层
本帖最后由 1055751654 于 2019-10-24 16:32 编辑

再加一句清空语句比较好,执行前覆盖上次执行的

刚在小猪猪那学了段代码,很简短
Sub tiqu()
Sheet2.[c3:c65536].ClearContents
For x = 4 To 63
For y = 3 To 10
  If Sheet1.Cells(x, y) <> "" Then
    cnt = cnt + 1
    Cells(cnt, 3).Offset(2, 0) = Sheet1.Cells(x, y)
  End If
Next
Next
End Sub

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 11:01 , Processed in 0.043466 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表