第一次用VBA,就遇到一个怪问题

enhydraboy 2003-12-10 02:53:16
请看下面的代码,在窗体1上,
Option Explicit
Private colCustomerID As New Collection
Public pCustomerID As String
Public pYear As Long
Public lRet As Long

Private Sub CommandButton1_Click()
lRet = vbOK
pYear = Val(cmbYear.Text)
pCustomerID = colCustomerID.Item(cmbCustomers.ListIndex + 1)

Unload Me
End Sub

Private Sub CommandButton2_Click()
lRet = vbCancel
Unload Me
End Sub

我的另外一个宏里调用
Public Sub GetCustomerSaleDetail()
Dim sSQL As String
Dim rs As ADODB.Recordset
Dim i As Long
Dim j As Long
Dim mFrm As New QueryCustomerYearSales

mFrm.Show vbModal
If mFrm.lRet = vbCancel Then
Exit Sub
End If
'在这里mFrm.pCustomerID得到的结果是空的。
..............
end sub

mFrm.pYear和mFrm.lRet都有内容,可是mFrm.pCustomerID缺是空的。
感觉奇怪,在unload me前设置断点,pCustomerID的确赋值了内容。
...全文
30 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
enhydraboy 2003-12-17
  • 打赏
  • 举报
回复
我就是觉得这和VB不一样。
如果说collection在unload的时候,会被自动released,那么pCustomerID竟然只是指向collection中的某个地址。后来,我改成Public colCustomerID As New Collection,结果照旧,看来VBA还是有很多地方需要研究了。
wuhanfengchao 2003-12-12
  • 打赏
  • 举报
回复
恩,不好意思,看错了。
另一个原因:
Private colCustomerID As New Collection
……
pCustomerID = colCustomerID.Item(cmbCustomers.ListIndex + 1)
我们来看看上面一句。
打个不恰当的比方:colCustomerID是你自己,=是镜子,pCustomerID是镜子中的虚象你。
窗体UNLOAD后,colCustomerID就“消失”——因为他是Private 的。
你都消失了,镜子中的虚象还在吗?
即是说pCustomerID是关联在colCustomerID上的。
那么解决方案就是将Private colCustomerID As New Collection改为
Public colCustomerID As New Collection。
如果不行的话,你就要重新考虑改变你的程序思路了:)

——希望对你有帮助!——
wuhanfengchao 2003-12-12
  • 打赏
  • 举报
回复
请先看看
Public pCustomerID As String
这句定义是否在窗体1的代码中,
即你定义pCustomerID的范围错误,
只是模块级,不是全局的。
——你把他移到模块中,将他变成全局变量,再试试。
klbt 2003-12-11
  • 打赏
  • 举报
回复
奇怪的问题,帮你顶。

5,139

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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