Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 10135|回复: 9

[已解决]function 返回数组问题

[复制链接]
发表于 2013-11-8 22:38 | 显示全部楼层 |阅读模式
本帖最后由 ebbe 于 2013-11-9 09:35 编辑

我想从Arr数组中的m列查找一些和sTxt相同的数,并将该数所在数组中的行数返回另外一个数组中,储存起来。

我写的代码如下:

Private Sub commandbutton1_Click()
On Error Resume Next
Dim Arr()
Dim m As Integer, sTxt As String
m=1
sTxt="希望"
LastRow = Sheets("sheet1").Cells(Rows.Count, i).End(xlUp).Row
Arr = Sheets("sheet1").Range("A1:E" & LastRow)
Call GetValue(m, sTxt, Arr())
End Sub


Function GetValue(i As Integer, sTr As String, Ar() )
dim Ar1()
For j = 1 To UBound(Arr)
    If sTr Like Ar(j, i) Then
       j = j + 1
        ReDim Preserve Ar1(n)
         Ar1(n) = j
    End If
Next j
GetValue = Ar1
End Function


这些代码有问题:

如果我不定义dim Arr(),那么就弹出来对话框说,类型不匹配:缺少数组或用户自定义类型。
如果我定义了dim Arr(),那么Arr()就如法将单元格的内容放进数组中去,请问,代码是哪里出现了问题,该如何修改?
非常感谢
最佳答案
2013-11-9 00:26
你这代码错误很多、很多,几乎无法运行。


不过就你出错的原因来说,倒是很简单:
Dim arr() 以后arr就会是一个数组变量而无法进行单元格区域赋值了(只有Variant变量可以进行赋值)

解决办法是,去掉所有括号,不事先定义为数组变量即可。


Private Sub CommandButton1_Click()
    On Error Resume Next
    Dim Arr    Dim m As Integer, sTxt As String
    m = 1
    sTxt = "希望"
    LastRow = Sheets("sheet1").Cells(Rows.Count, i).End(xlUp).Row
    Arr = Sheets("sheet1").Range("A1:E" & LastRow)
    Call GetValue(m, sTxt, Arr)
End Sub

蓝色是改过的,红色是有错误的部分……因为不知道你的思路,无法帮你修改。

Function GetValue(i As Integer, str As String, Ar)
Dim Ar1()
For j = 1 To UBound(Ar)
    If str Like Ar(j, i) Then
       j = j + 1
        ReDim Preserve Ar1(n)
         Ar1(n) = j
    End If
Next j
GetValue = Ar1
End Function


红色部分变量没有赋值,所以代码无法正常工作。呵呵。
发表于 2013-11-8 23:09 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-11-8 23:17 | 显示全部楼层
那么的帅 发表于 2013-11-8 23:09
提供数据附件,以便于测试

已经附上代码,请测试。谢谢!


代码测试用表格.rar

8.89 KB, 下载次数: 11

回复

使用道具 举报

发表于 2013-11-8 23:40 | 显示全部楼层
本帖最后由 那么的帅 于 2013-11-8 23:42 编辑
ebbe 发表于 2013-11-8 23:17
已经附上代码,请测试。谢谢!


看错。
回复

使用道具 举报

 楼主| 发表于 2013-11-9 00:04 | 显示全部楼层
那么的帅 发表于 2013-11-8 23:40
看错。

啥意思?
回复

使用道具 举报

发表于 2013-11-9 00:26 | 显示全部楼层    本楼为最佳答案   
你这代码错误很多、很多,几乎无法运行。


不过就你出错的原因来说,倒是很简单:
Dim arr() 以后arr就会是一个数组变量而无法进行单元格区域赋值了(只有Variant变量可以进行赋值)

解决办法是,去掉所有括号,不事先定义为数组变量即可。


Private Sub CommandButton1_Click()
    On Error Resume Next
    Dim Arr    Dim m As Integer, sTxt As String
    m = 1
    sTxt = "希望"
    LastRow = Sheets("sheet1").Cells(Rows.Count, i).End(xlUp).Row
    Arr = Sheets("sheet1").Range("A1:E" & LastRow)
    Call GetValue(m, sTxt, Arr)
End Sub

蓝色是改过的,红色是有错误的部分……因为不知道你的思路,无法帮你修改。

Function GetValue(i As Integer, str As String, Ar)
Dim Ar1()
For j = 1 To UBound(Ar)
    If str Like Ar(j, i) Then
       j = j + 1
        ReDim Preserve Ar1(n)
         Ar1(n) = j
    End If
Next j
GetValue = Ar1
End Function


红色部分变量没有赋值,所以代码无法正常工作。呵呵。
回复

使用道具 举报

 楼主| 发表于 2013-11-9 08:51 | 显示全部楼层
本帖最后由 ebbe 于 2013-11-9 10:25 编辑
香川群子 发表于 2013-11-9 00:26
你这代码错误很多、很多,几乎无法运行。

确实,我为了让大家好懂我的程序,我在原程序上做了简单的修改,你 提出来的很正确。我按照你做的,修改了一下代码

Private Sub CommandButton1_Click()
On Error Resume Next
Dim Arr
Dim m As Integer, sTxt As String
m = 1
sTxt = "*希望*"
LastRow = Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
Arr = Sheets("sheet1").Range("A1:E" & LastRow)
Call GetValue(m, sTxt, Arr)

End Sub


Option Base 1
Function GetValue(i As Integer, str As String, Ar)
Dim Ar1()
n = 1
For j = 1 To UBound(Ar)
    If Ar(j, i) Like str Then
        ReDim Preserve Ar1(n)
         Ar1(n) = j
         n = n + 1
    End If
Next j
GetValue = Ar1
End Function


这个程序运行无错误,并且是我想要的结果。。。非常非常的感谢

回复

使用道具 举报

 楼主| 发表于 2013-11-9 09:36 | 显示全部楼层
本帖最后由 ebbe 于 2013-11-9 10:25 编辑
香川群子 发表于 2013-11-9 00:26
你这代码错误很多、很多,几乎无法运行。

又出现问题了,我想将得到的getvalue数组返回到过程中去。怎么把数值传过去?
谢谢!

我会了
回复

使用道具 举报

发表于 2013-11-9 10:25 | 显示全部楼层
GetValue是个函数,你用一个变量=GetValue就可以了
回复

使用道具 举报

 楼主| 发表于 2013-11-9 10:26 | 显示全部楼层
fffox 发表于 2013-11-9 10:25
GetValue是个函数,不能用Call,你用一个变量=GetValue就可以了

Function GetValue(i As Integer, str As String, Ar)

改为Function GetValue(i As Integer, str As String, Ar) as integer()就OK了
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 17:33 , Processed in 0.373742 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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