Làm sao để kiểm tra tên file , khi bị thay đổi

  • Thread starter Thread starter bdnatuan
  • Ngày gửi Ngày gửi
Liên hệ QC

bdnatuan

Thành viên mới
Tham gia
27/8/07
Bài viết
11
Được thích
0
Nghề nghiệp
Học sinh
Tôi có tham khảo file hướng dẫn : tạo Menu bằng Source code của Levanduyet

CodeMenuExcel1.jpg




Cho tôi hỏi làm sao để kiểm tra tên file ( tức là khi file đó bị thay đổi tên thì sẽ có một bảng thông báo hiện ra ) . Vấn đề chính ở đây là tôi muốn hỏi viết code (VBA) như thế nào để hiện ra một thông báo khi tên file thay đổi



Trích từ Source code của Levanduyet
CodeMenuExcel2.jpg
 
Bạn thử dùng đoạn code sau xem có giải quyết được yêu cầu của bạn không
Mã:
Private Sub Workbook_Open()
If UCase(ActiveWorkbook.Name) <> "ABC.XLS" Then
    MsgBox "Ten WorkBook da bi thay doi !" & Chr(13) & Chr(13) & "Ten WorkBook phai la : ABC.XLS"
    Application.Quit
End If
End Sub
TDN
 
Lần chỉnh sửa cuối:
Cám ơn chú nha , Nhân đây cho tôi hỏi luôn : làm sao để cho chương trình hiểu rằng file "ABC.XLS" đã đổi thành "Book1.XLS"

MSG.jpg
 
bdnatuan đã viết:
Cám ơn chú nha , Nhân đây cho tôi hỏi luôn : làm sao để cho chương trình hiểu rằng file "ABC.XLS" đã đổi thành "Book1.XLS"
Xin lỗi, mình không hiểu rõ lắm ý của bạn. Có lẽ bạn muốn hỏi làm sao biết tên WorkBook mới ? Nếu là vậy thì đó là câu lệnh này ActiveWorkbook.Name

TDN
 
Ờ đúng rồi , cám ơn nha tôi làm được rồi
 
tedaynui đã viết:
Bạn thử dùng đoạn code sau xem có giải quyết được yêu cầu của bạn không
Mã:
Private Sub Workbook_Open()
If UCase(ActiveWorkbook.Name) <> "ABC.XLS" Then
    MsgBox "Ten WorkBook da bi thay doi !" & Chr(13) & Chr(13) & "Ten WorkBook phai la : ABC.XLS"
    Application.Quit
End If
End Sub
TDN

Có cách nào thay đổi tên "Tao Menu.xls" trong đoạn code thành tên của file đang mở không nhỉ.
 
Thien đã viết:
Có cách nào thay đổi tên "Tao Menu.xls" trong đoạn code thành tên của file đang mở không nhỉ.
Chào bạn
Hoàn toàn có thể được vì mình nhớ trước đây Anh Duyệt (Levanduyet) có dạy mình một số cách thao tác với Module. Bạn dùng code này xem :
Mã:
[B]Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
MyCodeMod.Replaceline [COLOR=Red]2[/COLOR], [COLOR=SeaGreen]"Dim XYZ As Integer"[/COLOR][/B]
Nghĩa là dòng thứ 2 trong Module1 sẽ được thay thế bằng Dim XYZ As Integer

P/S : Hình như với Excel 97 thì khác tí : MyCodeMod.Replaceline (2, "Dim XYZ As Integer" )

Thân!
TDN

 
Lần chỉnh sửa cuối:
tedaynui đã viết:
Chào bạn
Hoàn toàn có thể được vì mình nhớ trước đây Anh Duyệt (Levanduyet) có dạy mình một số cách thao tác với Module. Bạn dùng code này xem :
Mã:
[B]Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
MyCodeMod.Replaceline [COLOR=Red]2[/COLOR], [COLOR=SeaGreen]"Dim XYZ As Integer"[/COLOR][/B]
Nghĩa là dòng thứ 2 trong Module1 sẽ được thay thế bằng Dim XYZ As Integer


Bạn chĩ cho mình biết đặt code đó ở đâu trong đoạn code này nhen. mình muốn khi tên file bị đổi là MS_0907.xls thì Public Const TenWB As String = "MS_0807.xls" sẽ được thay bằng Public Const TenWB As String = "MS_0907.xls"

Mã:
Public Const TenMenuSheet = "MenuSheet"
'   Ten sheet chua du lieu de tao Menu
Public Const ToolBarMenuName = "XuanThienthietke"
Public Const TenWB As String = "MS_0807.xls"

'   Ten cua ToolBar Menu
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   TAO VA DELETE MENU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Thu tuc nay duoc tong hop lai vao ngay 31/10/2004
' nham tao 3 loai menu dua tren du lieu o Sheet Menu
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub CreateMenuAll(Optional CreateMenuBar As Boolean, _
                  Optional CreateShortcutMenu As Boolean, _
                  Optional CreateToolBarMenu As Boolean)
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateMenuBar
    Dim MenuSheet As Worksheet
    Dim MenuObject As CommandBarPopup
    Dim MenuItem As Object
    Dim SubMenuItem As CommandBarButton
    Dim Row As Integer
    Dim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId
    
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateShortcutMenu
    Dim MenuSCControl As CommandBarControl
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateShortcutMenu
    Dim ToolBarMenu As CommandBar
    Dim ToolbarMenuControl As CommandBarControl
''''''''''''''''''''''''''''''''''''''''''''''''''
' Kiem tra ActiveWorkbook truoc khi thuc hien
    If ActiveWorkbook.Name <> TenWB Then
        Exit Sub
    End If
'   Assign default value if the argument is missing
'   Dua cac gia tri mac dinh vao neu cac doi so khong dua vao
    If IsMissing(CreateMenuBar) Then CreateMenuBar = False
    If IsMissing(CreateShortcutMenu) Then CreateShortcutMenu = False
    If IsMissing(CreateToolBarMenu) Then CreateToolBarMenu = False
'   Trong truong hop CreateMenuBar=True
If CreateMenuBar = True Then
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Location for menu data
'   Chi dinh Sheet de lay du lieu cho Menu
    Set MenuSheet = ThisWorkbook.Sheets(MenuSheet)
''''''''''''''''''''''''''''''''''''''''''''''''''

'   Make sure the menus aren't duplicated
'   De chac chan rang Menu khong bi trung lap
    Call DeleteMenuAll(True, False, False)
    
'   Initialize the row counter; Hang bat dau la hang thu 2
    Row = 2

'   Add the menus, menu items and submenu items using
'   data stored on MenuSheet
'   Dua vao du lieu tren MenuSheet ma xay dung Menu
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        With MenuSheet
            MenuLevel = .Cells(Row, 1)
            Caption = .Cells(Row, 2)
            PositionOrMacro = .Cells(Row, 3)
            Divider = .Cells(Row, 4)
            FaceId = .Cells(Row, 5)
            NextLevel = .Cells(Row + 1, 1)
        End With
        
        Select Case MenuLevel
            Case 1 ' A Menu
'               Add the top-level menu to the Worksheet CommandBar
'               Menu cap mot
                Set MenuObject = Application.CommandBars(1). _
                    Controls.Add(Type:=msoControlPopup, _
                    Before:=PositionOrMacro, _
                    Temporary:=True)
                MenuObject.Caption = Caption
            
            Case 2 ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = MenuObject.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = MenuObject.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = PositionOrMacro
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True
            
            Case 3 ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = PositionOrMacro
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
        End Select
        Row = Row + 1
    Loop
End If
'   Trong truong hop CreateShortcutMenu=True
If CreateShortcutMenu = True Then
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Location for shortcutmenu data
'   Chi dinh Sheet de lay du lieu cho ShortcutMenu
    Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Make sure the shortcut menus aren't duplicated
'   De chac chan rang Shortcut Menu khong bi trung lap
    Call DeleteMenuAll(False, True, False)
    
'   Initialize the row counter; Hang bat dau la hang thu 2
    Row = 2

'   Add the shortcut menus, shortcutmenu items
'   and subshortcutmenu items using
'   data stored on MenuSheet
'   Dua vao du lieu tren MenuSheet ma xay dung Menu
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        With MenuSheet
            MenuLevel = .Cells(Row, 1)
            Caption = .Cells(Row, 2)
            PositionOrMacro = .Cells(Row, 3)
            Divider = .Cells(Row, 4)
            FaceId = .Cells(Row, 5)
            NextLevel = .Cells(Row + 1, 1)
        End With
        
        Select Case MenuLevel
            Case 1 ' A Menu
'               Add the top-level shortcut menu to the Cell CommandBar
'               Menu cap mot
                Set MenuSCControl = Application.CommandBars("Cell"). _
                    Controls.Add(Type:=msoControlPopup)
                    MenuSCControl.Caption = Caption
            
            Case 2 ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = MenuSCControl.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = MenuSCControl.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = PositionOrMacro
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True
            
            Case 3 ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = PositionOrMacro
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
        End Select
        Row = Row + 1
    Loop
End If
If CreateToolBarMenu = True Then
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Location for menu data
'   Chi dinh Sheet de lay du lieu cho Menu
    Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Make sure the Toolbar menus aren't duplicated
'   De chac chan rang Toolbar Menu khong bi trung lap
   Call DeleteMenuAll(False, False, True)

'   Create Toolbar
    Set ToolBarMenu = Application.CommandBars.Add
    With ToolBarMenu
        .Visible = False
        .Name = ToolBarMenuName
        .Position = msoBarTop
        .Protection = msoBarNoCustomize
    End With

'   Initialize the row counter; Hang bat dau la hang thu 2
    Row = 2

'   Add the Toolbar menus, Toolbar menu items and submenu items using
'   data stored on MenuSheet
'   Dua vao du lieu tren MenuSheet ma xay dung Menu
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        With MenuSheet
            MenuLevel = .Cells(Row, 1)
            Caption = .Cells(Row, 2)
            PositionOrMacro = .Cells(Row, 3)
            Divider = .Cells(Row, 4)
            FaceId = .Cells(Row, 5)
            NextLevel = .Cells(Row + 1, 1)
        End With
        
        Select Case MenuLevel
            Case 1 ' A Menu
'               Add the top-level shortcut menu to the Cell CommandBar
'               Menu cap mot
                Set ToolbarMenuControl = Application.CommandBars(ToolBarMenuName). _
                    Controls.Add(Type:=msoControlPopup)
                    ToolbarMenuControl.Caption = Caption
            
            Case 2 ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = ToolbarMenuControl.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = ToolbarMenuControl.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = PositionOrMacro
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True
            
            Case 3 ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = PositionOrMacro
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
        End Select
        Row = Row + 1
    Loop
    ToolBarMenu.Visible = True
End If

End Sub
'........
...........
End Sub

TC.
 
Gởi Thiện
Để dễ làm, bạn thực hiện như sau :
1/ Ví dụ Code tạo Menu nằm trong Module1
2/ Trong Module2 bạn chép và chạy đoạn code sau :
Mã:
Sub ChangeCode()
    Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
    MyCodeMod.Replaceline 4, "Public Const TenWB As String = " & """MS_0907.xls"""
End Sub

Thân!
TDN
 
tedaynui đã viết:
Gởi Thiện
Để dễ làm, bạn thực hiện như sau :
1/ Ví dụ Code tạo Menu nằm trong Module1
2/ Trong Module2 bạn chép và chạy đoạn code sau :
Mã:
Sub ChangeCode()
    Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
    MyCodeMod.Replaceline 4, "Public Const TenWB As String = " & """MS_0907.xls"""
End Sub
Thân!
TDN

Bạn lộn rùi. File MS_0807.xls mình sẽ sữa tên thành MS_0907.xls, tất nhiên đoạn code trong file MS_0807.xls là Public Const TenWB As String = "MS_0807.xls".
Vậy khi dùng Explore để sữa tên file thành MS_0907.xls thì khi mở lên đoạn code sẽ thành Public Const TenWB As String = "MS_0907.xls".
Code tạo Menu nằm trong Module có tên là MenuModule.
Bẹn xem lại giúp nhen.
Thân chào.
 
Thien đã viết:
Bạn lộn rùi. File MS_0807.xls mình sẽ sữa tên thành MS_0907.xls, tất nhiên đoạn code trong file MS_0807.xls là Public Const TenWB As String = "MS_0807.xls".
Vậy khi dùng Explore để sữa tên file thành MS_0907.xls thì khi mở lên đoạn code sẽ thành Public Const TenWB As String = "MS_0907.xls".
Code tạo Menu nằm trong Module có tên là MenuModule.
Bẹn xem lại giúp nhen.
Thân chào.
Bạn đọc kỹ yêu cầu của bạn đi, bạn muốn khi đổi tên file là "MS_0907.xls" thì code tạo Menu cũng đổi là "MS_0907.xls" vậy thì câu lệnh của mình đâu có vấn đề gì.

Hi hi, còn Module1 hay là MenuModule là do mình đặt thôi. Bạn chỉnh lại Name hay chỉnh code cũng đều OK mà. Linh động tí chứ.

Thân!
TDN
 
Tedaynui ơi
Ý mình muốn là như vậy nè:
Mã:
Sub ChangeCode()
    Dim nName As String
    Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("MenuModule").CodeModule
    MyCodeMod.Replaceline 4, "Public Const TenWB As String = " & nName
    nName = ActiveWorkbook.Filename
End Sub

Nhưng hiện tại đang báo lỗi, chưa biết sữa thế nào. Và mình muốn là khi file mở đoạn code này tự chạy luôn nên mình cũng đã dùng lệnh Call đặt trong code tạo menu luôn nhưng vẫn chưa được.

Thông cảm nhen, đang học mà (mình đâu có biết già về VBA đâu).

TC.
 
Thien đã viết:
Tedaynui ơi
Ý mình muốn là như vậy nè:
Mã:
Sub ChangeCode()
    Dim nName As String
    Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("MenuModule").CodeModule
    MyCodeMod.Replaceline 4, "Public Const TenWB As String = " & nName
    nName = ActiveWorkbook.Filename
End Sub
Nhưng hiện tại đang báo lỗi, chưa biết sữa thế nào. Và mình muốn là khi file mở đoạn code này tự chạy luôn nên mình cũng đã dùng lệnh Call đặt trong code tạo menu luôn nhưng vẫn chưa được.

Thông cảm nhen, đang học mà (mình đâu có biết già về VBA đâu).

TC.

Mình không bàn đến code, chỉ nói đến trình tự làm việc thôi.

Khi muốn gán cho dòng lệnh này thay đổi theo nName thì phải cho biết nName là cái gì đã ???????????????????

Vì vậy dòng nName = ActiveWorkbook.Filename phải đưa lên trên cùng chứ ???????????????

Cái này đâu cần dân lập trình, cứ suy theo thông thường thì biết thôi.
Anh cho tôi quả táo thì tôi đưa anh 500 đồng
Muốn như vậy thì tôi phải cho anh biết 500 đồng là cấi gì đã. Chứ nếu không thì . . . ngu gì mà đưa táo ???

Thân!
 
Gởi Thiện
Theo mình nghĩ, ý Thiện muốn dù mình đổi tên file là gì đi nữa thì khi Open workbook, nó sẽ tự động cập nhật lại dòng khai báo tên file trong Module tạo Menu, có đúng vậy không ? Nếu là vậy, thì mình nghĩ đặt code như bạn là không hợp lý rồi. Như Hiếu nhận xét mặt Logic là chưa hợp lý và nên đặt code trong WorkBook_Open luôn.

Thân!
TDN
 
tedaynui đã viết:
Gởi Thiện
Theo mình nghĩ, ý Thiện muốn dù mình đổi tên file là gì đi nữa thì khi Open workbook, nó sẽ tự động cập nhật lại dòng khai báo tên file trong Module tạo Menu, có đúng vậy không ? Nếu là vậy, thì mình nghĩ đặt code như bạn là không hợp lý rồi. Như Hiếu nhận xét mặt Logic là chưa hợp lý và nên đặt code trong WorkBook_Open luôn.

Thân!
TDN

Bạn nói đúng ý mình rùi. Sao không sữa code dùm luôn nhỉ, làm hoài chẳng được gì?. (chắc do không có căn bản).

Giúp nhé.

TC.
 
Thien đã viết:
Bạn nói đúng ý mình rùi. Sao không sữa code dùm luôn nhỉ, làm hoài chẳng được gì?. (chắc do không có căn bản).
TC.
Đây, bạn tham khảo nhé. Mình đã test OK
Mã:
Private Sub Workbook_Open()
    Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
    MyCodeMod.Replaceline 4, "Public Const TenWB As String = " & """" & ActiveWorkbook.Name & """"
End Sub
Chúc bạn thành công
Thân
TDN
 
Dear tedaynui !.
Cảm ơn sự hướng dẫn của bạn.
Nhưng nếu sài đúng code của Anh Duyệt ở bài 1 thì cần phải chỉnh lại 1 chút code của bạn & của Anh Duyệt.
code của bạn
Mã:
Private Sub Workbook_Open()
Set MyCodeMod = ActiveWorkbook.VBProject.VBComponents("MenuModule").CodeModule
MyCodeMod.Replaceline 4, "Public Const TenWB As String = " & """" & ActiveWorkbook.Name & """"
Call CreateMenuAll(False, True, True)
MsgBox "Duoc tao boi Le Xuan Thien", vbInformation
End Sub

Code của Anh Duyệt phải bỏ đoạn
Mã:
If ActiveWorkbook.Name <> TenWB Then
        Exit Sub
    End If
.

Nếu không chỉnh 2 bước như trên thì không sử dụng được đoạn code của bạn đâu.

TC.
 
Tất nhiên là khi áp dụng vào Module của bạn thì cần điều chỉnh cho phù hợp nó mới chạy chứ (đã bảo là linh động tí mà, hi hi ). Mình chỉ tạo code chạy test thử nên Name là "Module1"
Thân!
 
Web KT

Bài viết mới nhất

Back
Top Bottom