我正在修改现有的Access 2003应用程序,有些机器使用Access 2010而不是2003.
我有一个连续的表单,其中包含一个未绑定的文本框,其中包含"文件夹"。文本框有一个onClick事件,用于打开与当前记录相关的文件夹。
对于每一行,我想向用户表明该行是否存在文件夹。我喜欢这样做的方式是,如果一行没有文件夹,那么该文件夹就是'文本框是空白的,如下所示:
Quote Ref Customer Cust.Ref
14-243 | Smiths |CR342 | Folder |
14-269 | Cox & Son |0002634 | |
14-314 | RedBox |436R | Folder |
14-314 | JTG PRs |63462 | |
文件夹名称由前3个字段组成: " S:/ path / 14-243 Smiths CR342 / "
我最初尝试在 form_current 事件上添加一些代码来更改文本框的可见性,但这会将所有行设置为相同。
Private Sub Form_Current()
If Len(Dir("S:/path/" & [quote_no] & " " & [customer] & " " & [cust_ref], vbDirectory) = 0) Then
Me.txtFolder.Visible = False
Else
Me.txtFolder.Visible = True
End If
End Sub
所以我尝试将此代码放入控件源
=iif(Len(Dir("S:/path/" & [quote_no] & " " & [customer] & " " & [cust_ref],vbDirectory)) =0,"","Folder")
但Access假设vbDirectory是一个控件并在其周围放置方括号,这会破坏语法。因此我假设dir()不能用在控制源上。
你能建议我如何实现我的目标吗?
谢谢!
答案 0 :(得分:2)
你可以像这样FileSystemObjec
FolderExists
函数制作包装器
Dim fso As FileSystemObject 'So a new object is not created on every call to FolderExists
Private Sub Form_Load()
Set fso = New FileSystemObject
End Sub
Function FolderExists(folderPath As String) As Boolean
FolderExists = fso.FolderExists(folderPath)
End Function
要使用FileSystemObject
,您需要添加对Microsoft Scripting Runtime
然后在文本框的控件源中有一个像这样的函数调用
=FolderExists("S:/path/" & [quote_no] & " " & [customer] & " " & [cust_ref])
甚至
=IIF(FolderExists("S:/path/" & [quote_no] & " " & [customer] & " " & [cust_ref]),"Click","")
然后在文本框的点击事件中检查它是否可点击
Private Sub Text1_Click()
If Text1.Text = "Click" Then
Debug.Print "Do some work"
Else
Debug.Print "Do nothing"
End If
End Sub
答案 1 :(得分:0)
转到VBA中的“调试”窗口,然后键入? vbDirectory
。这将返回常量的值(实际上是16)
将常量替换为控制源表达式中的值
不确定Dir功能是否存在于VBA之外。如果不使用包装(无论如何这可能是一个更好的主意)。
我怀疑在连续表格上使用这么慢的功能会使它非常慢 如果这适合您的用例,我建议将控件放在表单的页眉或页脚中。这样,只计算当前记录(如果使用包装器版本,则也有效)。