2014-06-11 69 views
2

我修改現有的Access 2003應用程序,通過一些機器具有的,而不是2003年檢查文件夾中訪問窗體連續型

我有一個連續的形式,包括與字的文本框綁定Access 2010的「文件夾」 。該文本框有一個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:/路徑/ 14-243史密斯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()不能用於控制源。

你能建議我該如何實現自己的目標?

謝謝!

回答

2

您可以爲FileSystemObjecFolderExists函數包裝這樣

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 
+0

謝謝,這樣做的工作!我花了一段時間纔開始工作 - 我最終發現我需要添加Microsoft腳本運行時引用。現在工作正常(雖然速度很慢)。 – andy295

+0

啊是的!對不起,我沒有提到。搞清楚了。 – Brad

0

轉到VBA調試窗口,鍵入? vbDirectory。這會返回常量的值(實際上是16)。
將該常量替換爲控件源表達式中的值。
不確定Dir函數是否存在於VBA之外。如果不使用包裝(無論如何這可能是一個更好的主意)。

我懷疑在一個連續的窗體上使用這樣一個緩慢的函數會讓它非常慢。
如果適合您的用例,我建議將控件放在表單的頁眉或頁腳中。這樣,只計算當前記錄(如果使用包裝版本,也是有效的)。

+0

發出'#名稱'錯誤。好的建議,但我認爲迪爾被認可是當時的瓶頸 – Brad