Nhờ sửa Code: Mặc định thư mục khi mở hộp thoại Open

  • Thread starter doquanglam
  • Ngày gửi
D

doquanglam

Sơ cấp
25/6/08
16
0
1
52
Bạc Liêu
Dưới đây là code dùng để chọn tập tin .mbd trên ổ đĩa. Mình xin nhờ các cao thủ sửa code dùm mình nhé. Ý mình muốn là khi bấm vào nút cmdOpen thì hộp thoại chọn tập tin .mdb mạc định luôn là D:\KeToan

Private Sub cmdOpen_Click()
txtPath.Value = getFile("Select Data File", "data file", "*.mdb")
End Sub

Xin cám ơn rất nhiều.
 
Khóa học Quản trị dòng tiền
N

nguoiconxunui

Khách vãng lai
29/6/04
1,280
215
63
Bình Định
aso2pc.co.cc
Dưới đây là code dùng để chọn tập tin .mbd trên ổ đĩa. Mình xin nhờ các cao thủ sửa code dùm mình nhé. Ý mình muốn là khi bấm vào nút cmdOpen thì hộp thoại chọn tập tin .mdb mạc định luôn là D:\KeToan

Private Sub cmdOpen_Click()
txtPath.Value = getFile("Select Data File", "data file", "*.mdb")
End Sub

Xin cám ơn rất nhiều.

Không biết cái function Getfile của bạn như thế nào ? ncxn gửi bạn cái funtion thường dùng :
Mã:
Public Function GetOpenFile(Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant) As Variant

    ' Here's an example that gets an Access database name.
    Dim strFilter As String
    Dim lngFlags As Long
    Dim varFileName As Variant

    ' Specify that the chosen file must already exist,
    ' don't change directories when you're done
    ' Also, don't bother displaying
    ' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_FILEMUSTEXIST Or _
                ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If IsMissing(varDirectory) Then
        varDirectory =[b] "D:\thư mục"[/b]
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = "CHON DATABASE"
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    strFilter = ahtAddFilterItem(strFilter, _
                "Access (*.mdb)", "*.MDB;*.MDA")

    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=True, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    Flags:=lngFlags, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetOpenFile = varFileName
End Function
 
D

doquanglam

Sơ cấp
25/6/08
16
0
1
52
Bạc Liêu
Nguoiconxunui ơi, mình muốn gửi file lên để bạn xem và kiểm tra dùm nhưng không biết gửi lên, bạn cho mình xin địa chỉ email được không. Cám ơn bạn nhiều
 
N

nguoiconxunui

Khách vãng lai
29/6/04
1,280
215
63
Bình Định
aso2pc.co.cc
gửi thẳng lên diễn đàn đi bạn, nếu không có gì là bí mật
-
P/S: trên này cao thủ nhiều như mây, ncxn chỉ mới tập sự thôi
 
N

nguoiconxunui

Khách vãng lai
29/6/04
1,280
215
63
Bình Định
aso2pc.co.cc
Bàn thêm về file của bạn nhé:
Hình như bạn viết theo cuốn sách nào đó , ncxn có đọc một lần
Chú ý các vấn đề sau đây:
1. Link or Relink tbl with password (backend protected)
Ghi chú:
- mỗi lần mở chương trình sẽ kiểm tra kết nối đến db và thông báo nếu không tìm thấy dữ liệu gốc (hoặc db không phù hợp)
- cho người dùng chọn lại db để làm việc
- Code như sau: phần pass mình để trực tiếp trong code , đê pro hơn bạn nên viết lại một chút, ví dụ cho nhập vào hoặc lưu đâu đó trong db
. Kiểm tra :
Mã:
Public Sub CheckLinkTbales()
    ' Tests a linked table for valid back-end.
      On Error GoTo Err_Form_Open
      Dim strTest As String, db As DAO.Database
      Dim td As DAO.TableDef
      Set db = CurrentDb
      For Each td In db.TableDefs
         If Len(td.Connect) > 0 Then   ' Is a linked table.
            On Error Resume Next   ' Turn off error trap.
            strTest = Dir(Mid(td.Connect, 11))   ' Check file name.
            On Error GoTo Err_Form_Open   ' Turn on error trap.
            If Len(strTest) = 0 Then   ' No matching file.
               If MsgBox("Couldn't find the back-end file " & _
                  Mid(td.Connect, 11) & ". Please choose new data file.", _
                  vbExclamation + vbOKCancel + vbDefaultButton1, _
                  "Can't find backend data file.") = vbOK Then
                     Call linkAllTbles
                     Exit Sub                          ' to refresh links
               Else
                  MsgBox "The linked tables can't find their source. " & _
                  "Please log onto network and restart the application."
                  Exit Sub
               End If
            End If
        End If
      Next   ' Loop to next tabledef.
    
Exit_Form_Open:
      Exit Sub
Err_Form_Open:
      MsgBox Err.Number & ": " & Error.Description
      Resume Exit_Form_Open
      End Sub

. Tiến hành link (chú ý có một đoạn mình dùng để xóa liink có sẵn rồi link trở lại, nếu bạn nào dùng 2 db trở lên thì xóa đoạn code này đi
Mã:
Public Function LinkAllTbl()
Dim wrk As Workspace
Dim dbBack As Database
Dim dbFront As Database
Dim dbData As CurrentData
Dim rst As Recordset
Dim tdf As TableDef
Dim strTable As String
Dim strFilename As String
Dim strPassword As String

Set wrkDefault = DBEngine.Workspaces(0)
strFilename = GetOpenFile
strPassword = "admin"
Set dbBack = wrkDefault.OpenDatabase(strFilename, False, False, "MS Access;PWD=" & strPassword)
Set dbFront = CurrentDb
Set dbData = Application.CurrentData

DoCmd.SetWarnings False
    For i = 0 To dbFront.TableDefs.Count - 1
        Set tdf = dbFront.TableDefs(i)
        If tdf.Properties(4) <> "" Then
            If Left(tdf.Name, 4) <> "conf" Then
                DoCmd.DeleteObject acTable, tdf.Name
            End If
        End If
    Next i

For Each tdf In dbBack.TableDefs
    If Left(tdf.Name, 4) <> "MSys" Then
        DoCmd.TransferDatabase acLink, "Microsoft Access", "" & dbBack.Name & "", acTable, tdf.Name, tdf.Name, , True
    End If
Next tdf

Set rst = Nothing
Set dbBack = Nothing
Set dbFront = Nothing
Set dbData = Nothing
Set wrk = Nothing

End Function

2. Open files Or Open Save file
Ghi chú:
- Thông thường các bạn kích hoạt thư viện của Access lên để dùng, tuy nhiên ncxn thường đăng ký files thư viện trực tiếp trong code
- Trong thủ tục này các bạn có thể thay đổi các yếu tố sau: thư mục mặc định, Title, phần mở rộng file...
- Code như sau: chú ý code này viết lại theo yêu cầu của bạn (mở mặc định thư mục D:\ketoan) , nếu không tồn tại thư mục này nó sẽ thông báo bạn có muốn tạo hay không?
Mã:
Option Compare Database

'***************** Code Start **************
' This code was originally written by Ken Getz.
' It is not to be altered or distributed, 'except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code originally courtesy of:
' Microsoft Access 95 How-To
' Ken Getz and Paul Litwin
' Waite Group Press, 1996
' Revised to support multiple files:
' 28 December 2007
' Do not edit or Replace anything below
Type tagOPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    strFilter As String
    strCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    strFile As String
    nMaxFile As Long
    strFileTitle As String
    nMaxFileTitle As Long
    strInitialDir As String
    strTitle As String
    Flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    strDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" _
    Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean

Declare Function aht_apiGetSaveFileName Lib "comdlg32.dll" _
    Alias "GetSaveFileNameA" (OFN As tagOPENFILENAME) As Boolean
Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long

Global Const ahtOFN_READONLY = &H1
Global Const ahtOFN_OVERWRITEPROMPT = &H2
Global Const ahtOFN_HIDEREADONLY = &H4
Global Const ahtOFN_NOCHANGEDIR = &H8
Global Const ahtOFN_SHOWHELP = &H10
'You won't use these.
'Global Const ahtOFN_ENABLEHOOK = &H20
'Global Const ahtOFN_ENABLETEMPLATE = &H40
'Global Const ahtOFN_ENABLETEMPLATEHANDLE = &H80
Global Const ahtOFN_NOVALIDATE = &H100
Global Const ahtOFN_ALLOWMULTISELECT = &H200
Global Const ahtOFN_EXTENSIONDIFFERENT = &H400
Global Const ahtOFN_PATHMUSTEXIST = &H800
Global Const ahtOFN_FILEMUSTEXIST = &H1000
Global Const ahtOFN_CREATEPROMPT = &H2000
Global Const ahtOFN_SHAREAWARE = &H4000
Global Const ahtOFN_NOREADONLYRETURN = &H8000
Global Const ahtOFN_NOTESTFILECREATE = &H10000
Global Const ahtOFN_NONETWORKBUTTON = &H20000
Global Const ahtOFN_NOLONGNAMES = &H40000
' New for Windows 95
Global Const ahtOFN_EXPLORER = &H80000
Global Const ahtOFN_NODEREFERENCELINKS = &H100000
Global Const ahtOFN_LONGNAMES = &H200000

Public Function GetOpenFile(Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant) As Variant

    ' Here's an example that gets an Access database name.
    Dim strFilter As String
    Dim lngFlags As Long
    Dim varFileName As Variant
    ' You define Directory here: that mean dir you want to open by defaul
    varDirectory = "D:\ketoan"
    ' MakeFolder (varDirectory)
    ' Specify that the chosen file must already exist,
    ' don't change directories when you're done
    ' Also, don't bother displaying
    ' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_FILEMUSTEXIST Or _
                ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If Dir(varDirectory, vbDirectory) = vbNullString Then
        msg = MsgBox("Dir not found! Do you want to make the same dir?", vbYesNo, "This is test")
        If msg = vbYes Then
            MakeFolder (varDirectory)
        End If
        Else
            varDirectory = "D:\ketoan"
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = "CHON DATABASE"
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    strFilter = ahtAddFilterItem(strFilter, _
                "Access (*.mdb)", "*.MDB;*.MDA")

    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=True, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    Flags:=lngFlags, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetOpenFile = varFileName
End Function

Function ahtCommonFileOpenSave( _
            Optional ByRef Flags As Variant, _
            Optional ByVal InitialDir As Variant, _
            Optional ByVal Filter As Variant, _
            Optional ByVal FilterIndex As Variant, _
            Optional ByVal DefaultExt As Variant, _
            Optional ByVal FileName As Variant, _
            Optional ByVal DialogTitle As Variant, _
            Optional ByVal hwnd As Variant, _
            Optional ByVal OpenFile As Variant) As Variant

    ' This is the entry point you'll use to call the common
    ' file open/save dialog. The parameters are listed
    ' below, and all are optional.
    '
    ' In:
    ' Flags: one or more of the ahtOFN_* constants, OR'd together.
    ' InitialDir: the directory in which to first look
    ' Filter: a set of file filters, set up by calling
    ' AddFilterItem. See examples.
    ' FilterIndex: 1-based integer indicating which filter
    ' set to use, by default (1 if unspecified)
    ' DefaultExt: Extension to use if the user doesn't enter one.
    ' Only useful on file saves.
    ' FileName: Default value for the file name text box.
    ' DialogTitle: Title for the dialog.
    ' hWnd: parent window handle
    ' OpenFile: Boolean(True=Open File/False=Save As)
    ' Out:
    ' Return Value: Either Null or the selected filename
    Dim OFN As tagOPENFILENAME
    Dim strFilename As String
    Dim strFileTitle As String
    Dim fResult As Boolean

    ' Give the dialog a caption title.
    If IsMissing(InitialDir) Then InitialDir = CurDir
    If IsMissing(Filter) Then Filter = ""
    If IsMissing(FilterIndex) Then FilterIndex = 1
    If IsMissing(Flags) Then Flags = 0&
    If IsMissing(DefaultExt) Then DefaultExt = ""
    If IsMissing(FileName) Then FileName = ""
    If IsMissing(DialogTitle) Then DialogTitle = ""
    If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp
    If IsMissing(OpenFile) Then OpenFile = True
    ' Allocate string space for the returned strings.
    strFilename = Left(FileName & String(256, 0), 256)
    strFileTitle = String(256, 0)
    ' Set up the data structure before you call the function
    With OFN
        .lStructSize = Len(OFN)
        .hwndOwner = hwnd
        .strFilter = Filter
        .nFilterIndex = FilterIndex
        .strFile = strFilename
        .nMaxFile = Len(strFilename)
        .strFileTitle = strFileTitle
        .nMaxFileTitle = Len(strFileTitle)
        .strTitle = DialogTitle
        .Flags = Flags
        .strDefExt = DefaultExt
        .strInitialDir = InitialDir
        ' Didn't think most people would want to deal with
        ' these options.
        .hInstance = 0
        '.strCustomFilter = ""
        '.nMaxCustFilter = 0
        .lpfnHook = 0
        'New for NT 4.0
        .strCustomFilter = String(255, 0)
        .nMaxCustFilter = 255
    End With
    ' This will pass the desired data structure to the
    ' Windows API, which will in turn it uses to display
    ' the Open/Save As Dialog.
    If OpenFile Then
        fResult = aht_apiGetOpenFileName(OFN)
    Else
        fResult = aht_apiGetSaveFileName(OFN)
    End If

    ' The function call filled in the strFileTitle member
    ' of the structure. You'll have to write special code
    ' to retrieve that if you're interested.
    If fResult Then
        ' You might care to check the Flags member of the
        ' structure to get information about the chosen file.
        ' In this example, if you bothered to pass in a
        ' value for Flags, we'll fill it in with the outgoing
        ' Flags value.
        If Not IsMissing(Flags) Then Flags = OFN.Flags
        If Flags And ahtOFN_ALLOWMULTISELECT Then
            ' Return the full array.
            Dim items As Variant
            Dim value As String
            value = OFN.strFile
            ' Get rid of empty items:
            Dim i As Integer
            For i = Len(value) To 1 Step -1
              If Mid$(value, i, 1) <> Chr$(0) Then
                Exit For
              End If
            Next i
            value = Mid(value, 1, i)

            ' Break the list up at null characters:
            items = Split(value, Chr(0))

            ' Loop through the items in the "array",
            ' and build full file names:
            Dim numItems As Integer
            Dim result() As String

            numItems = UBound(items) + 1
            If numItems > 1 Then
                ReDim result(0 To numItems - 2)
                For i = 1 To numItems - 1
                    result(i - 1) = FixPath(items(0)) & items(i)
                Next i
                ahtCommonFileOpenSave = result
            Else
                ' If you only select a single item,
                ' Windows just places it in item 0.
                ahtCommonFileOpenSave = items(0)
            End If
        Else
            ahtCommonFileOpenSave = TrimNull(OFN.strFile)
        End If
    Else
        ahtCommonFileOpenSave = vbNullString
    End If
End Function

Function ahtAddFilterItem(strFilter As String, _
    strDescription As String, Optional varItem As Variant) As String

    ' Tack a new chunk onto the file filter.
    ' That is, take the old value, stick onto it the description,
    ' (like "Databases"), a null character, the skeleton
    ' (like "*.mdb;*.mda") and a final null character.

    If IsMissing(varItem) Then varItem = "*.*"
    ahtAddFilterItem = strFilter & _
                strDescription & vbNullChar & _
                varItem & vbNullChar
End Function

Private Function TrimNull(ByVal strItem As String) As String
    Dim intPos As Integer

    intPos = InStr(strItem, vbNullChar)
    If intPos > 0 Then
        TrimNull = Left(strItem, intPos - 1)
    Else
        TrimNull = strItem
    End If
End Function

Private Function FixPath(ByVal path As String) As String
    If Right$(path, 1) <> "\" Then
        FixPath = path & "\"
    Else
        FixPath = path
    End If
End Function
Function MakeFolder(strPath As String)
    On Error GoTo MakeFolder_Err
    If Dir(strPath, vbDirectory) > vbNullString Then
        Exit Function
    End If
    MkDir strPath
    MakeFolder = True
    Exit Function
MakeFolder_Err:
    MsgBox "Folder """ & strPath & """ cannot be created."
    MakeFolder = False
End Function

'************** Code End *****************

Vậy là trả lời 2 vấn đề của bạn rồi nhé!
 
Sửa lần cuối:
D

doquanglam

Sơ cấp
25/6/08
16
0
1
52
Bạc Liêu
Ncxn ơi, làm ơn xem lại dùm code có sai chỗ nào không mình liên kết đến file mdb có mật khẩu được nhưng khi thoát ra kiểm tra lại file được liên kết (Data01.mdb) lại mất mật khẩu luôn.
'KÕt nèi d÷ liÖu d¹ng exclusive
Dim TempDb As Database
Dim P As String 'Password
P = "admin"
On Error Resume Next
Set TempDb = OpenDatabase(CurrentProject.path & "\" & "Data01.MDB", True, False, "MS Access;PWD=" & P)
'Xo¸ mËt khÈu ®i
TempDb.NewPassword P, ""
TempDb.Close

'TiÕn hµnh liªn kÕt d÷ liÖu
LinkTable "T-Bieu thue", txtPath
LinkTable "tblBCDKT", txtPath

'Cµi l¹i mËt khÈu cò
Set TempDb = OpenDatabase(CurrentProject.path & " \" & "Data01.MDB", True, False)
TempDb.NewPassword "", P
TempDb.Close
Set TempDb = Nothing



Cám ơn nhiều nhé.
 
N

nguoiconxunui

Khách vãng lai
29/6/04
1,280
215
63
Bình Định
aso2pc.co.cc
Ncxn ơi, làm ơn xem lại dùm code có sai chỗ nào không mình liên kết đến file mdb có mật khẩu được nhưng khi thoát ra kiểm tra lại file được liên kết (Data01.mdb) lại mất mật khẩu luôn.
'KÕt nèi d÷ liÖu d¹ng exclusive
Dim TempDb As Database
Dim P As String 'Password
P = "admin"
On Error Resume Next
Set TempDb = OpenDatabase(CurrentProject.path & "\" & "Data01.MDB", True, False, "MS Access;PWD=" & P)
'Xo¸ mËt khÈu ®i
TempDb.NewPassword P, ""
TempDb.Close

'TiÕn hµnh liªn kÕt d÷ liÖu
LinkTable "T-Bieu thue", txtPath
LinkTable "tblBCDKT", txtPath

'Cµi l¹i mËt khÈu cò
Set TempDb = OpenDatabase(CurrentProject.path & " \" & "Data01.MDB", True, False)
TempDb.NewPassword "", P
TempDb.Close
Set TempDb = Nothing



Cám ơn nhiều nhé.

Dùng cái code trên kia kìa, cái này ông noname bên CSTH hướng dẫn , ncxn cũng đã comment là không có khả thi rùi. Vì sao thì cứ đặt câu hỏi " vì sao phải đặt pass ở db?" biết . Trong lúc làm việc dùng code này liên kết nó xóa pass mất tiêu thì lúc đó người ta mở db lên cũng được vậy đặt pass làm gì nữa.
Trên kia đã cho cái code rõ ràng thía sao không dùng.
 
D

doquanglam

Sơ cấp
25/6/08
16
0
1
52
Bạc Liêu
Ncxn ơi, thông cảm cho mình nhé, mình không được học hành bài bản, ai chỉ sao thì làm vậy thôi. Thấy code của bạn mình nhìn vào như đám rừng, với khả năng của mình thì khó mà thực hiện được.
 
N

nguoiconxunui

Khách vãng lai
29/6/04
1,280
215
63
Bình Định
aso2pc.co.cc
Ncxn ơi, thông cảm cho mình nhé, mình không được học hành bài bản, ai chỉ sao thì làm vậy thôi. Thấy code của bạn mình nhìn vào như đám rừng, với khả năng của mình thì khó mà thực hiện được.

Có ai học mấy thứ này đâu, có học cũng có ai dạy đâu
Yên tâm đi trong mỗi dòng người ta đều comment cả rồi, mà copy nguyên cục đó cũng xài được nữa
 

Xem nhiều