以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  列内容提取数值  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=170176)

--  作者:ganlan
--  发布时间:2021/7/14 22:09:00
--  列内容提取数值
例如列的内容如下:
337、10月2日 李四(13500000000)成人1张
338、10月2日 李四(13500000000)儿童2张
想在成人数量(A列)填入1,儿童数量(B列)填入2
名字填入李四(C列),联系电话(D列)填入13500000000
能用表达式做到吗
[此贴子已经被作者于2021/7/17 10:44:29编辑过]

--  作者:ganlan
--  发布时间:2021/7/15 0:01:00
--  
If e.DataCol.Name = "内容" AndAlso e.DataRow.isnull("内容") = False AndAlso e.DataRow("内容").Contains ("(") = True Then 
Dim ar() As String = e.DataRow("内容").split("(")
Dim ac() As String =  ar(0).split("日")
If ac.length > 1 Then e.DataRow("名字") = ac(1).Trim()
End If
我用这个代码,好像判断是否含"("没起作用,即使不含"(",也一样提取了

--  作者:有点蓝
--  发布时间:2021/7/15 8:51:00
--  
应该是中文的括号,不是英文括号,看看:http://www.foxtable.com/webhelp/topics/1273.htm
--  作者:ganlan
--  发布时间:2021/7/15 15:04:00
--  
知道原因了,前面如果有内容了,不包含(的时候代码不会变
所有需要加个else
If e.DataCol.Name = "内容" And e.DataRow("内容").Contains ("(") = True AndAlso e.DataRow.isnull("内容") = False Then 
Dim ar() As String = e.DataRow("内容").split("(")
Dim ac() As String =  ar(0).split("日")
If ac.length > 1 Then e.DataRow("名字") = ac(1).Trim()
Else
If e.DataCol.Name = "内容" And e.DataRow("内容").Contains ("(") = False Then 
e.DataRow("名字") = Nothing
End If
End If

--  作者:ganlan
--  发布时间:2021/7/15 15:57:00
--  
但是提取张数的哪里弄不了,一直提示出错,是不是提取出的不是数值是文本吗
--  作者:有点蓝
--  发布时间:2021/7/15 16:16:00
--  
字符串提取的内容肯定也是字符串,可以做一下转换:http://www.foxtable.com/webhelp/topics/1513.htm
--  作者:ganlan
--  发布时间:2021/7/15 21:39:00
--  
If e.DataCol.Name = "内容" And e.DataRow("内容").Contains ("张") = True AndAlso e.DataRow.isnull("内容") = False Then 
Dim cr1() As String = e.DataRow("内容").split("成人")
Dim cr2() As String =  cr1(0).split("张")
If cr2.length > 1 Then e.DataRow("成人") = CDbl(cr2(1))
Else
If e.DataCol.Name = "内容" And e.DataRow("内容").Contains ("张") = False Then 
e.DataRow("成人") = Nothing
End If
End If

用这个代码,重置列后提示出错Exception has been thrown by the target of an invocation.

--  作者:有点蓝
--  发布时间:2021/7/15 21:51:00
--  
首先split只能使用单个字符

其次建议取成人门票和张之间的字符,学学IndexOfSubString的用法:http://www.foxtable.com/webhelp/topics/1338.htm

--  作者:ganlan
--  发布时间:2021/7/17 10:45:00
--  
应该是字符转换不对,看了例子,红色字那样转换对吗?
If e.DataCol.Name = "内容" And e.DataRow("内容").Contains ("张") = True AndAlso e.DataRow.isnull("内容") = False Then 
Dim cr1() As String = e.DataRow("内容").split("人")
Dim cr2() As String =  cr1(0).split("张")
If cr2.length > 1 Then e.DataRow("成人") = CDbl(cr2(1))
Else
If e.DataCol.Name = "内容" And e.DataRow("内容").Contains ("张") = False Then 
e.DataRow("成人") = Nothing
End If
End If
[此贴子已经被作者于2021/7/17 10:45:43编辑过]

--  作者:有点蓝
--  发布时间:2021/7/17 11:08:00
--  
如果cr2(1)是数字,肯定没有问题

If cr2.length > 1 Then 
msgbox(cr2(1))
e.DataRow("成人") = CDbl(cr2(1))
else
……