VBA excel 提取K列单元格逗号之间的数据,并把这些数据复制到F列的表格里。

Function zdy(K1 As String, i As Integer)
Dim temp
temp = Split(K1, ",")
zdy = temp(i)
End Function
使用:=zdy(K2,1)就可以得到日期

请问哪里错误了。

同时询问下,当A列有几格数据,那么B列就用“2012-00-00 ”写入。

第一个问题:
1、函数代码必须放到模块中使用。
2、temp = Split(K1, ",")代码中使用的是汉语逗号,如果K2单元格中日期的逗号为英文状态则报错
第二个问题:你是想要用"2012-00-00"格式表示日期吧?
这个问题有一定难度,关键是你没有给定日期来源,同时,EXCEL没有实时监测单元格是否输入的设置。
1、如果有数据来源,你可以通过函数来实现。例如:
=IF(A2="","",DATE(zdy(F2,0),zdy(F2,1),zdy(F2,2)))
然后在【设置单元格格式】数字中自定义格式为:yyyy-mm-dd
2、如果没有数据来源,建议你用“数据有效性”来设置。打开【数据】菜单下的【有效性】对话框
1)有效性条件:
允许:日期
数据:介于
开始日期:2012-1-1
结束日期:2012-12-31
2)警告信息:自己填写
3)确定退出
4)然后在【设置单元格格式】数字中自定义格式为:yyyy-mm-dd追问

很感谢您的答案, 如果单元格数据只有一组逗号的话, 函数可以实现。我现在在做一个方便工作的软件,正在尝试各种方法。现在前台已经做好,就是后面这些个问题困扰我了。

追答

如果是第一个问题,我测试的结果不是只有一组逗号(看下图),同样可以实现。

我觉得关键是要看你的逗号状态是中文还是英文!

因此,在你的函数代码基础上略微做了修改,使得中文逗号、英文逗号都可以得到正确结果。

Function zdy(K1 As String, i As Integer)
    Dim temp
    K1 = Replace(K1, ",", ",")
    temp = Split(K1, ",")
    zdy = temp(i)
End Function

 

追问

可以成功提取了。但是后面还是会有其他类型的数据。
我(K2,1的数据是:,2012-09-03 08:14:10已派单:CMCC-GD-GZCL-20120903-01646,2012-09-03 08:12:15,林某某
用你给我修改后的代码输入后。 在单元格 ==zdy(k2,1) 后。单元格内容:2012-09-03 08:14:10已派单:CMCC-GD-GZCL-20120903-01646 。
我只想提取里面的那个时间,第一组“逗号”里面的第一个时间。
求大神帮助!!

追答

哎,你早点说呀~~ 绕了半天才明白你的大概意图(仍不清楚你要提取的是日期还是时间)。。
下面代码供参考,i参数指定查找第几个中文逗号,j参数指定提取什么
Function zdy(K1 As String, i As Integer, Optional j As Integer)
' 参数j为可选参数
Dim temp
temp = Split(K1, ",")
If j = 0 Then
' 如果参数j为0或者未指定
' 只提取日期
zdy = Left(temp(i), 10)
ElseIf j = 1 Then
' 只提取时间
zdy = Mid(temp(i), 12, 8)
ElseIf j = 2 Then
' 提取日期和时间
zdy = Left(temp(i), 19)
End If
End Function

追问

2012-09-03 08:12:15 我需要的是这个。大神,这个是算 日期+时间? 不好意思,没说明白。可否加邮箱或者QQ请教?

追答

如果用我最后给出的代码,可使用下面的公式:=zdy(K2,2,2)
邮箱我的资料里面有。。QQ从来不用的。。。不过,最近忙,可能回复你邮件慢些。。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-04
这是一个自定义(ZDY)函数,代码没有错误,注意 i 不要超出数据个数。
目的是:取出某单元格(K1)中以逗号(注意代码中是区分的全角逗号,那么K1中数据也应该用全角逗号分隔)分隔的第 i+1 个数据。
如果 K2 = "xxx,2012,33"
那么 zdy(K2,1) 就返回 2012
zdy(K2,0) 就返回 xxx
zdy(K2,2) 就返回 33
第2个回答  2012-09-04
说实话,我实在没看懂你的代码什么意思,你的所有代码就这些么?还有为什么“使用:=zdy(K2,1)就可以得到日期”这个我也看不懂,为什么会得到日期?
下面是我根据你的题目写的,split里的逗号是半角的,你可以按照你的需求换成全角的
Sub test()
Dim rs As Range
For Each rs In Sheet1.Range("k:k").CurrentRegion
a = Split(rs.Value, ",")
Range("f" & rs.Row) = a(1)
Next
End Sub
这个是如果A列有数据那么B列的相同行写入2012-00-00
Sub test()
Dim rs As Range
For Each rs In Sheet1.Range("a:a").CurrentRegion
Cells(rs.Row, 2) = "2012-00-00"
Next
End Sub追问

先感谢你的回答,如果这两个宏合在一起怎么弄。其实我是想,把那个提取到的逗号里的数据,同时能放在F列相对的行的单元格。目标表是:源文件数据

就是说,K2 提取的数据放到F2. 那个逗号里面的数据,格式:2012-09-03 17:59:07。 是时间格式的。 能否加你好友跟您学习一下。

追答

那你发个表到我邮箱吧,写几个数据并举个例子出来, lkshome@sohu.com,加上我的HI百度就可以了,我经常在

本回答被提问者采纳
第3个回答  2012-09-04
Function zdy( 【K1 As String】, i As Integer)

你这里定义的是string是字符串。应该定义单元格。因为你下面=zdy(k2,1)这里引用的单元格。

temp = Split(K1, ",") 注意后面的分隔符是中文逗号还是英文的。

Function zdy(K1 As Range, i As Integer)
Dim temp
temp = Split(K1.Value, ",")
zdy = temp(i)
End Function追问

可以成功提取了。但是后面还是会有其他类型的数据。
我(K2,1的数据是:,2012-09-03 08:14:10已派单:CMCC-GD-GZCL-20120903-01646,2012-09-03 08:12:15,林某某
用你给我修改后的代码输入后。 在单元格 ==zdy(k2,1) 后。单元格内容:2012-09-03 08:14:10已派单:CMCC-GD-GZCL-20120903-01646 。
我只想提取里面的那个时间,第一组“逗号”里面的时间。
求大神帮助!!

追答

真服了,你是豆号分开的,当然提出来的是整个了。如果你时间是固定的。那更简单了。
Function zdy(K1 As Range, i As Integer)
Dim temp
temp = Split(K1.Value, ",")
zdy = Left(temp(i), 11)'这里加个left函数,取左11位就是时间了。11可以自己改下。
End Function
看看是不是这样的。

相似回答