Hỏi nhanh - Đáp nhanh về macro (dành cho các thành viên mới học lập trình)

Liên hệ QC

tuananhya2

Thành viên mới
Tham gia
18/8/12
Bài viết
8
Được thích
0
Co ai chỉ dùm cách tạo pass marco với
 
Em có code Protect & unprotect toàn bộ các Sheet trong 1 File
Mã:
Sub Khoa_Mo()
    Dim sh As Worksheet, shapes
    Application.ScreenUpdating = False
    On Error Resume Next
    With shapes("Button 1").TextFrame.Characters
        For Each sh In ThisWorkbook.Worksheets
            sh.Protect "hv" = .Text = "Khoa"
        Next
        .Text = IIf(.Text = "Khoa", "Mo", "Khoa")
    End With
    Application.ScreenUpdating = True
End Sub
Em có nút Button 1, để khi nhấn thì nó hiện chữ " Khoa", "Mo"
Không biết code còn sai chỗ nào mà nó kh chạy & nút Button 1 không hiện chữ " Khoa", "Mo"
Em nhờ Thầy cô & anh chị giúp em, em cảm ơn!
 
Upvote 0
Em có code Protect & unprotect toàn bộ các Sheet trong 1 File
Mã:
Sub Khoa_Mo()
    Dim sh As Worksheet, shapes
    Application.ScreenUpdating = False
    On Error Resume Next
    With shapes("Button 1").TextFrame.Characters
        For Each sh In ThisWorkbook.Worksheets
            sh.Protect "hv" = .Text = "Khoa"
        Next
        .Text = IIf(.Text = "Khoa", "Mo", "Khoa")
    End With
    Application.ScreenUpdating = True
End Sub
Em có nút Button 1, để khi nhấn thì nó hiện chữ " Khoa", "Mo"
Không biết code còn sai chỗ nào mà nó kh chạy & nút Button 1 không hiện chữ " Khoa", "Mo"
Em nhờ Thầy cô & anh chị giúp em, em cảm ơn!

Sai nhiều chổ quá! Lý ra bạn nên bỏ dòng On Error Resume Next để biết lỗi ở đâu chứ
-------------
Tôi viết lại theo kiểu khác:
Mã:
Sub WksProtected(ByVal isLock As Boolean, ByVal sPW As String)
  Dim wks As Worksheet
  For Each wks In ThisWorkbook.Worksheets
    If isLock Then
      wks.Protect sPW, [COLOR=#ff0000]False[/COLOR]
    Else
      wks.Unprotect sPW
    End If
  Next
End Sub
Mã:
Sub Main()
  With ActiveSheet.shapes("Button 1").TextFrame.Characters
    WksProtected (.Text = "Khoa"), "hv"
    .Text = IIf(.Text = "Khoa", "Mo Khoa", "Khoa")
  End With
End Sub
Assign Macro Button 1 cho Sub Main rồi nhấn nút thí nghiệm
---------------
Lưu ý chữ False màu đỏ nhé ---> Có nó mới có thể thay đổi chuổi trên Button 1 được
---------------
Hoặc code y chang của bạn:
Mã:
Sub Khoa_Mo()
  Dim sh As Worksheet, shp As Shape
  Application.ScreenUpdating = False
  Set shp = ActiveSheet.shapes("Button 1")
 ' On Error Resume Next
  With shp.TextFrame.Characters
    For Each sh In ThisWorkbook.Worksheets
      If .Text = "Khoa" Then
        sh.Protect "hv", [COLOR=#ff0000]False[/COLOR]
      Else
        sh.Unprotect "hv"
      End If
    Next
    .Text = IIf(.Text = "Khoa", "Mo", "Khoa")
  End With
  Application.ScreenUpdating = True
End Sub
Nhưng theo tôi thì cách 1 hay hơn, khả năng tùy biến cao hơn
 
Lần chỉnh sửa cuối:
Upvote 0
GIÚP EM SỬA LỖI CODE
--------------------
Trong File em có 2 sheet là "ToKhai" Và "MuaVao"
Tại G7 của Sheet "ToKhai" em có đặt List Validation
Trong Sheet "ToKhai" em có code như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Target.Address = [g7].Address Then
        If Target.Value <> Sheets("MuaVao").Range("G7").Value Then MsgBox " So Chua chinh xac"


    End If
    Application.ScreenUpdating = True
End Sub
Mục đích em khi chọn cell G7 của sheet "ToKhai" mà có giá trị khác với giá trị cell G7 của sheet "MuaVao" thì thông báo "So Chua chinh xac"
Nhưng code em chưa chính xác! nên nó kg thèm thông báo!
Nhờ Thầy cô & anh chị giúp em.Em cảm ơn!
 
Upvote 0
GIÚP EM SỬA LỖI CODE
--------------------
Trong File em có 2 sheet là "ToKhai" Và "MuaVao"
Tại G7 của Sheet "ToKhai" em có đặt List Validation
Trong Sheet "ToKhai" em có code như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Target.Address = [g7].Address Then
        If Target.Value <> Sheets("MuaVao").Range("G7").Value Then MsgBox " So Chua chinh xac"


    End If
    Application.ScreenUpdating = True
End Sub
Mục đích em khi chọn cell G7 của sheet "ToKhai" mà có giá trị khác với giá trị cell G7 của sheet "MuaVao" thì thông báo "So Chua chinh xac"
Nhưng code em chưa chính xác! nên nó kg thèm thông báo!
Nhờ Thầy cô & anh chị giúp em.Em cảm ơn!
Mình không rành lắm trong chuyện nhìn code đoán ý đồ nhưng mình thấy câu lệnh này kỳ kỳ bạn ạ :

If Target.Address = [g7].Address

Sao không viết là :

If Target.Address = "$G$7"

Nếu có thể cho mình ngó cái file được không???
 
Upvote 0
GIÚP EM SỬA LỖI CODE
--------------------
Trong File em có 2 sheet là "ToKhai" Và "MuaVao"
Tại G7 của Sheet "ToKhai" em có đặt List Validation
Trong Sheet "ToKhai" em có code như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Target.Address = [g7].Address Then
        If Target.Value <> Sheets("MuaVao").Range("G7").Value Then MsgBox " So Chua chinh xac"


    End If
    Application.ScreenUpdating = True
End Sub
Mục đích em khi chọn cell G7 của sheet "ToKhai" mà có giá trị khác với giá trị cell G7 của sheet "MuaVao" thì thông báo "So Chua chinh xac"
Nhưng code em chưa chính xác! nên nó kg thèm thông báo!
Nhờ Thầy cô & anh chị giúp em.Em cảm ơn!
Mình thấy code không sai. Có thể do nguyên nhân khác. Gởi file lên xem thử thì biết liền
If Target.Address = [g7].Address
Sao không viết là :
If Target.Address = "$G$7"
Nếu có thể cho mình ngó cái file được không???
Câu lệnh này tương đương nhau bé Còi ơi
 
Lần chỉnh sửa cuối:
Upvote 0
Mình không rành lắm trong chuyện nhìn code đoán ý đồ nhưng mình thấy câu lệnh này kỳ kỳ bạn ạ :

If Target.Address = [g7].Address

Sao không viết là :

If Target.Address = "$G$7"

Nếu có thể cho mình ngó cái file được không???
Cảm ơn HMTC, làm từ nãy đến giờ nó không thông báo, mở file định gởi lên mạng thì nó hiện thông báo!!!
Chắc nó sợ HMTC!!!
 
Upvote 0
Mình thấy code không sai. Có thể do nguyên nhân khác. Gởi file lên xem thử thì biết liền

Câu lệnh này tương đương nhau bé Còi ơi
I see nhưng em cứ thích sửa thành thế đó, làm gì được nhau nào? he he...Nói vậy thôi chứ đó là thói quen của em mà, anh có công nhận sửa thế trông code nó đẹp hơn và chính tắc hơn không?
Cảm ơn HMTC, làm từ nãy đến giờ nó không thông báo, mở file định gởi lên mạng thì nó hiện thông báo!!!
Chắc nó sợ HMTC!!!
+ + Ẹ..........:p
 
Upvote 0
Cảm ơn HMTC, làm từ nãy đến giờ nó không thông báo, mở file định gởi lên mạng thì nó hiện thông báo!!!
Chắc nó sợ HMTC!!!

Sự kiện Change nó hơi nhạy cảm! Đôi lúc ta test code bị lỗi, sửa lại code đúng rồi nhưng cái sự kiện Change ấy vẫn cứ trở trơ ra
Kinh nghiệm của tôi: Đóng và lưu file, xong mở lại rồi test tiếp
 
Upvote 0
Sự kiện Change nó hơi nhạy cảm! Đôi lúc ta test code bị lỗi, sửa lại code đúng rồi nhưng cái sự kiện Change ấy vẫn cứ trở trơ ra
Kinh nghiệm của tôi: Đóng và lưu file, xong mở lại rồi test tiếp
Theo kyo nghĩ là tại dòng Application.ScreenUpdating = False nên nó mới bị trơ trơ đây. Do nó chưa được True (tức là chưa làm xong hết) thì hoặc là code lỗi và người dùng stop lại hoặc nó đang chạy giữa chừng đi break nó nên nó đơ luôn.
Nếu thấy đơ cứ lôi Immediate Window ra cho nó True là xong.
 
Upvote 0
Em có sưu tầm 1 số code của Thầy Ndu như:
Khóa_Mở (Protect Sheet ), Show all Sheet
Mã:
Sub Khoa_Mo()
    Dim sh As Worksheet, shp As Shape
    Application.ScreenUpdating = False
    Set shp = ActiveSheet.Shapes("Button 2")
    
    With shp.TextFrame.Characters
        For Each sh In ThisWorkbook.Worksheets
            If .Text = "Mo" Then
                sh.Unprotect "HV"
                
            Else
                sh.Protect "HV", False
                
            End If
        Next
        .Text = IIf(.Text = "Mo", "Khoa", "Mo")
    End With
    Application.ScreenUpdating = True
End Sub
Mã:
Sub ShowAllShs_T()    Dim sh As Worksheet
    Application.ScreenUpdating = False
    On Error Resume Next
    With Sheet4.Shapes("Button 1").TextFrame.Characters
        For Each sh In ThisWorkbook.Worksheets
            If sh.Name <> "Main" Then
                sh.Visible = .Text = "SHOW ALL"
            End If
        Next
        .Text = IIf(.Text = "SHOW ALL", "HIDE ALL", "SHOW ALL")
    End With
    Application.ScreenUpdating = True
End Sub
Và em dùng Sub Auto_Open, để khi mở File thì nó ẩn các Sheet (Trừ Main) và khóa toàn bộ Sheet
Mã:
Sub Auto_Open()
    Dim wks As Worksheet, shp1 As Shape, shp2 As Shape
    Set wks = Worksheets("Main")
    Set shp1 = wks.Shapes("Button 1")
    If shp1.TextFrame.Characters.Text = "HIDE ALL" Then ShowAllShs_T
    '******************
    Set shp2 = wks.Shapes("Button 2")
    If shp2.TextFrame.Characters.Text = "Khoa" Then Khoa_Mo
End Sub
-------------
Nhưng khi mở File và Disable thì em vẫn có thể mở các sheet bằng cách Format/sheet/Unhide
Vậy cho em hỏi có cách nào khi mở File nếu không Enable thì không thể nào làm hiện các Sheet bằng Format/sheet/Unhide? Giống như các Sheet bị ẩn bởi Very Hidden !
Em cảm ơn!
 

File đính kèm

  • Show_Khoa.xls
    34 KB · Đọc: 12
Upvote 0
Theo kyo nghĩ là tại dòng Application.ScreenUpdating = False nên nó mới bị trơ trơ đây. Do nó chưa được True (tức là chưa làm xong hết) thì hoặc là code lỗi và người dùng stop lại hoặc nó đang chạy giữa chừng đi break nó nên nó đơ luôn.
Nếu thấy đơ cứ lôi Immediate Window ra cho nó True là xong.

Không đâu, vụ này tôi biết chứ. Và thêm nữa, chẳng mấy khi tôi dùng ScreenUpdating, nhất là với sự kiện Change
Nói chung là hiếm khi nào mà tôi viết code 1 phát được ngay. Thế nào cũng bị một vài lỗi gì đó... và khi code bị lỗi này lại là code của sự kiện WorksheetChange thì y như rằng nó hay bị đơ...
Cũng chính thế mà tôi cũng rất ngại dùng sự kiện này (nhất là viết cho người khác dùng)
 
Upvote 0
Em có sưu tầm 1 số code của Thầy Ndu như:
Mã:
Sub ShowAllShs_T()    Dim sh As Worksheet
    Application.ScreenUpdating = False
    On Error Resume Next
    With Sheet4.Shapes("Button 1").TextFrame.Characters
        For Each sh In ThisWorkbook.Worksheets
            If sh.Name <> "Main" Then
                [COLOR=#ff0000][B]sh.Visible = .Text = "SHOW ALL"[/B][/COLOR]
            End If
        Next
        .Text = IIf(.Text = "SHOW ALL", "HIDE ALL", "SHOW ALL")
    End With
    Application.ScreenUpdating = True
End Sub
Nhưng khi mở File và Disable thì em vẫn có thể mở các sheet bằng cách Format/sheet/Unhide
Vậy cho em hỏi có cách nào khi mở File nếu không Enable thì không thể nào làm hiện các Sheet bằng Format/sheet/Unhide? Giống như các Sheet bị ẩn bởi Very Hidden !
Em cảm ơn!
Sửa đoạn màu đỏ thành vầy sh.Visible = (.Text = "SHOW ALL") + 2
 
Upvote 0
Trong code làm sao quy định nó lớn hơn 0,001 (Không phẩy không không một) được
Ex:
Mã:
 If Array(I, 3) > 0,001 Or Array(I, 4) > 0,001  Then
Mình làm như trên thì báo lỗi
Vậy cho hỏi code trên sửa như thế nào?
Cảm ơn các bạn!
 
Upvote 0
Trong code làm sao quy định nó lớn hơn 0,001 (Không phẩy không không một) được
Ex:
Mã:
 If Array(I, 3) > 0,001 Or Array(I, 4) > 0,001  Then
Mình làm như trên thì báo lỗi
Vậy cho hỏi code trên sửa như thế nào?
Cảm ơn các bạn!
Bạn đưa File chứa Code của bạn lên xem bị lỗi là do nào. Tôi tạm đoán do dấu cách thập phân của bạn không đúng với quy định trong máy (có thể thay dấu , bằng .).
 
Upvote 0
Bạn đưa File chứa Code của bạn lên xem bị lỗi là do nào. Tôi tạm đoán do dấu cách thập phân của bạn không đúng với quy định trong máy (có thể thay dấu , bằng .).

Nếu tôi nhớ không lầm thì cho dù ta Set định dạng number trong Control Panel thế nào đi nữa thì trong VBA vẫn theo chuẩn Mỹ (tức dấu chấm là dấu thập phân và dấu phẩy là dấu phân cách ngàn)
Thí nghiệm xem!
 
Upvote 0
Nếu tôi nhớ không lầm thì cho dù ta Set định dạng number trong Control Panel thế nào đi nữa thì trong VBA vẫn theo chuẩn Mỹ (tức dấu chấm là dấu thập phân và dấu phẩy là dấu phân cách ngàn)
Thí nghiệm xem!
Dạ tại bạn ấy nói là "Lỗi" nhưng không nói là lỗi do công đoạn nào. VBA luôn hiểu dấu phân cách là dấu chấm nên nếu lỗi tại cửa sổ lập trình thì do bạn ấy dùng dấu phẩy (lỗi ngay tại quá trình viết Code chứ chưa có Run Code). Em đoán là như vậy thầy ah.
 
Upvote 0
Dạ tại bạn ấy nói là "Lỗi" nhưng không nói là lỗi do công đoạn nào. VBA luôn hiểu dấu phân cách là dấu chấm nên nếu lỗi tại cửa sổ lập trình thì do bạn ấy dùng dấu phẩy (lỗi ngay tại quá trình viết Code chứ chưa có Run Code). Em đoán là như vậy thầy ah.
1/ Định dạng number trong Control Panel của tôi là: dấu phẩy dùng ngăn cách số thập phân. Dấu chấm phẩy dùng để ngăn cách trong công thức
2/ Khi nhập 0,001 trong cửa sổ VBA thì bị báo lỗi dòng màu đỏ là "Expected Then or GoTo" (chứ không phải Run code mới báo lỗi)
 
Upvote 0
1/ Định dạng number trong Control Panel của tôi là: dấu phẩy dùng ngăn cách số thập phân. Dấu chấm phẩy dùng để ngăn cách trong công thức
2/ Khi nhập 0,001 trong cửa sổ VBA thì bị báo lỗi dòng màu đỏ là "Expected Then or GoTo" (chứ không phải Run code mới báo lỗi)

Thì đúng vậy rồi. "Nó" tưởng dấu phẩy của bạn là dấu phân cách các thành phần trong VBA rồi phân tích.. cuối cùng là đếch hiểu bạn viết gì nên "nó" cự thôi
Ẹc... Ẹc...
Tóm lại: Bạn set gì trong Control Panel thì cứ thây kệ đi, trong VBA cứ theo chuẩn Mỹ là được
 
Upvote 0
Hỏi về cách nhập dữ liệu theo điều kiện bắt buộc.

Xin chào mọi người.
Em đang sử dụng cái combox của Thầy Quang Hải
Nhưng em thấy vẫn chưa yên tâm về một chỗ đó là Em muốn hỏi làm sao có thể bắt buộc nhập dữ liệu theo những điều kiện trong list ở các dòng màu xanh.(không cho nhập lung tung).
Kiểu là dạng như datavalition trong vùng màu đỏ đấy ạ.

Mọi người xem file đính kèm và giúp em với ạ, Xin cám ơn!
 

File đính kèm

  • Combox.xls
    43.5 KB · Đọc: 9
Upvote 0
Web KT
Back
Top Bottom