有参数的函数,返回值为数组如何调用

l8734974 2018-06-27 05:55:10
Public Function Getwp(wPname As String, ch As String) As String
Dim i As Integer, j As Integer, a As String, szxb As Integer, aTemp() As String
szxb = 0
szxb = Len(wPname) - Len(Replace(wPname, ch, ""))
ReDim aTemp(szxb + 1)
For i = 1 To szxb

For j = 1 To Len(wPname)
a = Trim(Mid(wPname, j, 1))
If a = "," Or a = "," Then
wPname = Right(wPname, Len(wPname) - j)
Exit For
Else
aTemp(i) = aTemp(i) + a
End If
Next


Next
End Function

目的在于调用函数后,返回字符串数组,
例: "产品1,产品2,产品3,产品4......",
输入后自动分割产品入数组,以便后期直接写入数据库

才学一个月,请各位大哥看一下哪里错了,谢谢!
...全文
697 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-06-28
  • 打赏
  • 举报
回复
引用 10 楼 l8734974 的回复:
我现在是添加新纪录执行没问题!更改过后才会出现勾选少一个的问题!用msgbox却不会少字符窜!真奇怪

此贴“数组”问题已经给你解释清楚。

若有其它问题,自己仔细分析一下“代码逻辑”。
如果不能自己解决,整理好测试代码、说清楚具体问题,另开一贴提问。
l8734974 2018-06-28
  • 打赏
  • 举报
回复
我现在是添加新纪录执行没问题!更改过后才会出现勾选少一个的问题!用msgbox却不会少字符窜!真奇怪
舉杯邀明月 2018-06-28
  • 打赏
  • 举报
回复
Left(arrTemp(k), Len(arrTemp(k)) - 2) 提示“无效调用参数或过程”,是因为arrTemp(k)的值是空串或只有1个字符。
Left( )函数,其第2个参数“长度”不能为负的。

你要想“窗体复用”,也没问题。
比如你的Form1,你可以:
dim objTempForm as Form

set objTempForm = new Form1
objTempForm.Show

不过要“复用”,你就得做好“界面显示内容”的设置(赋值)问题,以及相关的事件逻辑。
l8734974 2018-06-28
  • 打赏
  • 举报
回复
意思是同一个窗体我要重复利用!
l8734974 2018-06-28
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
更正一下:
上面的字符串是从楼主的帖子中Copy的,回复后才注意到“产品2”后面的逗号是“英文”的。

3楼中的写法,会区别全角、半角字符,因此实际是:
arrTemp(0) = "产品1"
arrTemp(1) = "产品2,产品3"
arrTemp(2) = "产品4"

要达到3楼的结果,“产品2”后面的逗号应该用中文的,或者后面传第4个参数: vbTextCompare


oK ,谢谢前辈,
不过现在出现了以下的问题
'text1姓名
'text2电话
'text3地址
'text4己买产品
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Data.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False" '连接数据库
rs.Open "select * from Buyer where Buy_name='" & Text1.Text & "' and Buy_ph=" & Val(Text2.Text) & "and Buy_add='" & Text3.Text & "' and Buy_wp='" & Text4.Text & "'", conn, adOpenKeyset, adLockReadOnly '传递要修改的人名
Form1.Text1.Text = rs.Fields("Buy_name") & "," & Trim(rs.Fields("Buy_ph")) & "," & rs.Fields("Buy_add")
Dim arrTemp() As String, arrfs() As String
arrTemp = Split(Trim(rs.Fields("Buy_wp")), ",")
arrfs = Split(Trim(rs.Fields("Buy_wp")), "份,")
rs.Close
For i = 1 To 13 '13个项目中
Select Case i

Case 1 '第一个项目中
For j = 0 To Form1.Check1.UBound '所有选择
For k = 0 To UBound(arrTemp) '与物品数组比对

If Form1.Check1(j).Caption = Left(arrTemp(k), Len(arrTemp(k)) - 2) Then
Form1.Check1(j).Value = 1
Form1.Combo1(j).Text = Trim(Right(arrfs(k), 1))
End If
Next

Next
以下省略...........

我想实现的功能是:
form1是新添加买方时所用窗体,有13个fram数组,fram中有各有不定数量的check与comb
假设我现在想修改数据库中己有的买方数据,把数据库中己买的产品直接调用赋值给窗体让它是选中状态(以上代码)
现在出现一个问题就是以上代码j与K为1时,j-1,k-1执行完后,产品总是少一个没有被勾上,
j与K为0时,提示无效调用参数或过程
Left(arrTemp(k), Len(arrTemp(k)) - 2),这条是黄色
KingOfPorcupine 2018-06-28
  • 打赏
  • 举报
回复
"目的在于调用函数后,返回字符串数组,
例: "产品1,产品2,产品3,产品4......",
输入后自动分割产品入数组,以便后期直接写入数据库

才学一个月,请各位大哥看一下哪里错了,谢谢!"
楼主把例子字符串发来 我做做看 必须是实际实例
小噤 2018-06-27
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
更正一下:
上面的字符串是从楼主的帖子中Copy的,回复后才注意到“产品2”后面的逗号是“英文”的。

3楼中的写法,会区别全角、半角字符,因此实际是:
arrTemp(0) = "产品1"
arrTemp(1) = "产品2,产品3"
arrTemp(2) = "产品4"

要达到3楼的结果,“产品2”后面的逗号应该用中文的,或者后面传第4个参数: vbTextCompare



6666
舉杯邀明月 2018-06-27
  • 打赏
  • 举报
回复
更正一下:
上面的字符串是从楼主的帖子中Copy的,回复后才注意到“产品2”后面的逗号是“英文”的。

3楼中的写法,会区别全角、半角字符,因此实际是:
arrTemp(0) = "产品1"
arrTemp(1) = "产品2,产品3"
arrTemp(2) = "产品4"

要达到3楼的结果,“产品2”后面的逗号应该用中文的,或者后面传第4个参数: vbTextCompare
舉杯邀明月 2018-06-27
  • 打赏
  • 举报
回复
引用 1 楼 l8734974 的回复:
现在主要是运行完后如何引用返回的值,这个我不懂

另外,VB6本身提供了“字符串分隔成数组”的函数,没有特殊要求时,不用你自己去写吧!
Dim arrTemp() As String

arrTemp = Split("产品1,产品2,产品3,产品4", ",")
' 上面这句执行后:
' arrTemp(0) = "产品1"
' arrTemp(1) = "产品2"
' arrTemp(2) = "产品3"
' arrTemp(3) = "产品4"
舉杯邀明月 2018-06-27
  • 打赏
  • 举报
回复
引用 1 楼 l8734974 的回复:
现在主要是运行完后如何引用返回的值,这个我不懂

你的这个函数,返回的不是“数组”,最多只能是返回一个字符串。

并且,你的代码中,并没有“对函数赋值”,那么它的返回值只是相应类型的“默认值”。
 比如你这个函数,声明为“字符串类型”,那么它就是字符串类型的默认值 vbNullString 。
(函数的默认值,跟相应类型的“变量默认值”一样)

要想返回“字符串数组”,那么首先要更改函数的类型声明:
Public Function Getwp(wPname As String, ch As String) As String()


然后,在“函数返回”前,你必须把相应的“返回值”给它赋值:
在你“当前代码”的 End Function 之前,写一句: Getwp = aTemp()
Public Function Getwp(wPname As String, ch As String) As String()
' …………
' 其它代码(略)

Getwp = aTemp() ' 这儿的空括号,可以省略
End Function


需要注意的是,函数返回的“数组”,只能赋值给“动态数组”。
比如这样使用:
' 定义1个跟“函数类型”相同的动态数组变量
Dim arrTemp() As String
' 用这个数组变量接受返回值:
arrTemp = Getwp("123,abc", "ABC")

假设你定义一个“固定数组”: Dim arrTemp(100) As String
那么上面的“函数调用”是不合法的,编译不能通过。
即使你的“数组空间”比函数返回的元素数量大,也不行。
必须要“动态数组”才可以。
l8734974 2018-06-27
  • 打赏
  • 举报
回复
现在主要是运行完后如何引用返回的值,这个我不懂

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧