Tự động chạy macro hoặc ẩn hàng (cột)

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

nmhanh

Thành viên chính thức
Tham gia
5/7/07
Bài viết
82
Được thích
8
Chào các anh chị và bạn, mình đang phải xử lý một công việc cần tới sự trợ giúp của các bạn. Đó là:

1 - Làm thế nào để một macro tự chạy khi giá trị trong một ô nào đó thỏa mãn một điều kiện đặt ra. Ví dụ, trên một bảng dữ liệu và mình mong muốn chạy một macro để xử lý dữ liệu đó nếu giá trị trong một ô đã xác định rõ trên bảng dữ liệu đó thỏa mãn điều kiện nào đó.



2 - Làm thế nào để một hàng (hay một cột) sẽ tự động ẩn đi nếu có một giá trị nào đó nằm trong hàng (hay cột) đó thỏa mãn điều kiện nào đó. Giả sử có một bảng dữ liệu, nếu có một giá trinh ở một ô của đầu một hàng (hay đầu một cột) thỏa mãn điều kiện nào đó thì hàng (hay cột) đó sẽ ẩn đi.

Rất mong các anh chị và các bạn giúp đỡ sớm.

Xin cảm ơn
 
1, Bạn dùng sự kiện Worksheet_Change, ví dụ khi ô A1 có giá trị là 5 thì hiện chữ "GPE"
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value = 5 Then MsgBox "GPE"
End Sub
2, Tương tự như trên.
 
Chào bạn chibi,

Rất cảm ơn bạn đã giúp mình. Tuy nhiên, với Excel thì mình mới đạt mức độ sử dụng các hàm số và khai thác một số chức năng sẵn có thôi. Riêng về VBA thì mình chưa hiểu biết nhiều lắm. Vì vậy, trong hướng dẫn trên của bạn thì nếu muốn ẩn một hoặc vài dòng, hoặc ẩn một hoặc một vài cột, hay là chạy một macro nào đó thì dùng lệnh gì? Cú pháp câu lệnh như nào nhỉ? Vì theo như mình hiểu thì dòng lệnh Then MsgBox "GPE" là sẽ hiện ra một hộp thoại có chữ "GPE" trong hộp thoại đó.

Rất cảm ơn bạn và mong sớm được chỉ giúp.
 
Chào bạn chibi,

Rất cảm ơn bạn đã giúp mình. Tuy nhiên, với Excel thì mình mới đạt mức độ sử dụng các hàm số và khai thác một số chức năng sẵn có thôi. Riêng về VBA thì mình chưa hiểu biết nhiều lắm. Vì vậy, trong hướng dẫn trên của bạn thì nếu muốn ẩn một hoặc vài dòng, hoặc ẩn một hoặc một vài cột, hay là chạy một macro nào đó thì dùng lệnh gì? Cú pháp câu lệnh như nào nhỉ? Vì theo như mình hiểu thì dòng lệnh Then MsgBox "GPE" là sẽ hiện ra một hộp thoại có chữ "GPE" trong hộp thoại đó.

Rất cảm ơn bạn và mong sớm được chỉ giúp.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value = 5 Then MsgBox "GPE"
End Sub
Trích code của Chibi, mình sẽ chỉnh một chút cho bạn hiểu.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value = 5 Then
    Range("B:B").Select
    Selection.EntireColumn.Hidden = True
    Range("A1").Select
    End If
End Sub
Bạn có thể sửa "B:B" bằng bất kỳ cột nào. Code này được đặt vào Wooksheet nào chứa điều kiện. Khi ô A1 có giá trị bằng 5 thì cột B sẽ bị ẩn.
Thân.
 
Lần chỉnh sửa cuối:
Cảm ơn bạn minhthien321 nhiều. Mình đã chạy thử và rất ổn. Tuy nhiên, còn một phần nhỏ nhờ bạn giúp, đó là sau khi mình nhập dữ liệu là số 5 vào ô A1 thì nó ẩn cột B đi, nhưng khi xóa số 5 trong ô A1 đi thì nó không hiện lại cột B. Vậy bạn giúp cho mình code để nếu giá trị ô A1 không phải là 5 thì nó lại hiện ra cột B nhé.

Ngoài ra, như mình đã nhờ trợ giúp ngay từ đầu, đấy là làm thế nào mà một macro tự chạy khi giá trị một ô nào đó thỏa mãn một điều kiện. Ví dụ trên, nếu ô A1 = 5 thì nó chạy macro mình định sẵn. Nhưng sau đó, giá trị ô A1 thay đổi thì nó lại trả về nguyên trạng ban đầu của bảng tính khi chưa chạy macro.

Hơn nữa, nếu giá trị của ô A1 là dạng khác như: ngày, tháng, năm, hay text thì code phải viết thế nào nhỉ?

Rất mong bạn giúp mình.

Xin cảm ơn bạn.
 
Cảm ơn bạn minhthien321 nhiều. Mình đã chạy thử và rất ổn. Tuy nhiên, còn một phần nhỏ nhờ bạn giúp, đó là sau khi mình nhập dữ liệu là số 5 vào ô A1 thì nó ẩn cột B đi, nhưng khi xóa số 5 trong ô A1 đi thì nó không hiện lại cột B. Vậy bạn giúp cho mình code để nếu giá trị ô A1 không phải là 5 thì nó lại hiện ra cột B nhé.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        If Target.Value = 5 Then
            Range("B:B").EntireColumn.Hidden = True
        Else
            Range("B:B").EntireColumn.Hidden = False
        End If
    End If
End Sub
Ngoài ra, như mình đã nhờ trợ giúp ngay từ đầu, đấy là làm thế nào mà một macro tự chạy khi giá trị một ô nào đó thỏa mãn một điều kiện. Ví dụ trên, nếu ô A1 = 5 thì nó chạy macro mình định sẵn. Nhưng sau đó, giá trị ô A1 thay đổi thì nó lại trả về nguyên trạng ban đầu của bảng tính khi chưa chạy macro.
Vụ Undo này hơi phức tạp đấy.
Hơn nữa, nếu giá trị của ô A1 là dạng khác như: ngày, tháng, năm, hay text thì code phải viết thế nào nhỉ?
Cụ thể cho dễ.
 
Cảm ơn bạn chibi. Ý mình muốn hỏi ở đây là giá trị trong ô A1 là kiểu số thì mình dùng code " [FONT=&quot]If Target.Value = 5". Nhưng nếu giá trị kiểu ngày tháng (date) hay thời gian (time) hay text thì đoạn code này phải viết thế nào nhỉ?

Nhân đây, mình gặp phải vấn đề chưa xử lý được. Mình gửi kèm theo file để nhờ bạn giúp viết hộ mình một đoạn code giải quyết công việc như sau: Trong bảng tính có ô B2 để người sử dụng nhập vào tháng cần làm báo cáo. Dòng 2:2 là ngày trong tháng, dòng 3:3 là ngày (thứ) trong tuần. Nếu người dùng nhập vào tháng 1 là tháng có 31 ngày thì bảng tính sẽ có 31 cột tương ứng với 31 ngày và được format boder cho từng hàng, cột, và boder đậm cho viền của bảng. Còn các cột khác còn lại của bảng tính sẽ ẩn đi. Nhưng nếu người dùng nhập vào là tháng 2 thì bảng tính sẽ có 28 ngày (nếu tháng 2 không nhuận) hoặc 29 ngày (nếu rơi vào tháng nhuận) và các cột các dòng cũng sẽ được
[FONT=&quot]format boder cho từng hàng, cột, và boder đậm cho viền của bảng. Và các cột khác còn lại của bảng tính sẽ ẩn đi. Cứ như vậy với các tháng khác.

Rất mong sớm nhận được sự giúp đỡ của bạn.

Xin chân thành cảm ơn bạn nhiều.
[/FONT][FONT=&quot][/FONT]
[/FONT]
 

File đính kèm

From ChanhTQ@:
Bạn cứ Format hết 31 cột chứa ngày theo ý của bạn;
Việc còn lại là ẩn đi các cột 'dư thừa' hàng tháng do macro dưới đây thực hiện:
Thêm 1 lưu ý: Tại [B2] bạn nên dùng công thức: =DATE(YEAR(TODAY()),B1,1)
để yên lòng cho mọi năm tiếp sau

PHP:
 Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [b1]) Is Nothing Then
   Dim Col As Byte
 
   Columns("C:AG").Hidden = False
   Select Case Target.Value
   Case Is < 1, Is > 12
      Exit Sub
   Case 2
      If Year(Date) Mod 4 <> 0 Then _
         Columns("AD").Hidden = True
      Columns("AE:AF").Hidden = True
   Case 4, 6, 9, 11
      Columns("AF").Hidden = True
   End Select
 End If
End Sub
 
Cảm ơn bạn chibi. Ý mình muốn hỏi ở đây là giá trị trong ô A1 là kiểu số thì mình dùng code " [FONT=&quot]If Target.Value = 5". Nhưng nếu giá trị kiểu ngày tháng (date) hay thời gian (time) hay text thì đoạn code này phải viết thế nào nhỉ?

Nhân đây, mình gặp phải vấn đề chưa xử lý được. Mình gửi kèm theo file để nhờ bạn giúp viết hộ mình một đoạn code giải quyết công việc như sau: Trong bảng tính có ô B2 để người sử dụng nhập vào tháng cần làm báo cáo. Dòng 2:2 là ngày trong tháng, dòng 3:3 là ngày (thứ) trong tuần. Nếu người dùng nhập vào tháng 1 là tháng có 31 ngày thì bảng tính sẽ có 31 cột tương ứng với 31 ngày và được format boder cho từng hàng, cột, và boder đậm cho viền của bảng. Còn các cột khác còn lại của bảng tính sẽ ẩn đi. Nhưng nếu người dùng nhập vào là tháng 2 thì bảng tính sẽ có 28 ngày (nếu tháng 2 không nhuận) hoặc 29 ngày (nếu rơi vào tháng nhuận) và các cột các dòng cũng sẽ được
[FONT=&quot]format boder cho từng hàng, cột, và boder đậm cho viền của bảng. Và các cột khác còn lại của bảng tính sẽ ẩn đi. Cứ như vậy với các tháng khác.

Rất mong sớm nhận được sự giúp đỡ của bạn.

Xin chân thành cảm ơn bạn nhiều.
[/FONT]
[/FONT]
Cái này có cần thiết phải macro không nhỉ? Sao bạn không dùng Conditional Formating?
 

File đính kèm

Chào bạn ndu96081631, rất cảm ơn phương pháp sử dụng conditional formatting của bạn. Tuy nhiên, bạn có thể chỉ rõ hơn cách làm của bạn với conditional formatting trong file bạn đã gửi kèm không?

Xin cảm ơn bạn.
 
Chào bạn ndu96081631, rất cảm ơn phương pháp sử dụng conditional formatting của bạn. Tuy nhiên, bạn có thể chỉ rõ hơn cách làm của bạn với conditional formatting trong file bạn đã gửi kèm không?

Xin cảm ơn bạn.
Chọn 1 cell bất kỳ trong vùng A2:AF6 rồi vào menu Format\Conditional Formating sẽ thấy công thức
 
Xin chào bạn ndu96081631 và cả nhà, về cái conditional formatting này có bất tiện chút là khi format border thì nó không cho mình lựa chọn nhiều kiểu border (đậm, mức độ đậm, v.v...). Vậy cả nhà có cách nào không nhỉ?
 
Xin chào bạn ndu96081631 và cả nhà, về cái conditional formatting này có bất tiện chút là khi format border thì nó không cho mình lựa chọn nhiều kiểu border (đậm, mức độ đậm, v.v...). Vậy cả nhà có cách nào không nhỉ?
Conditional Formating có những hạn chế như bạn vừa nói ở trên ---> Nhưng theo tôi, bảng tính của bạn có cần thiết đến mức bắt buộc phải tô đậm Border không?
Với tôi, chỉ nhiêu đó cũng đủ trang trí cho bảng tính đẹp mê hồn rồi
 
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value = 5 Then MsgBox "GPE"
End Sub
Trích code của Chibi, mình sẽ chỉnh một chút cho bạn hiểu.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value = 5 Then
    Range("B:B").Select
    Selection.EntireColumn.Hidden = True
    Range("A1").Select
    End If
End Sub
Bạn có thể sửa "B:B" bằng bất kỳ cột nào. Code này được đặt vào Wooksheet nào chứa điều kiện. Khi ô A1 có giá trị bằng 5 thì cột B sẽ bị ẩn.
Thân.
Sao em làm đúng theo hướng dẫn rồi mà vẫn ko chạy được nhỉ ??? ( Ô A1 = 5 thì cột B sẽ bị Hide ) . Xin check dùm em với ! Thx
 

File đính kèm

Lần chỉnh sửa cuối:
Em xin hỏi trong sheet 7 em có thủ tục sau

Private Sub CommandButton1_Click()
Call FILLTERS
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$5" And Target.Value <> 0 Then
Call FILLTERS
End If
End Sub

Khi em kích combox thì macro FILLTERS chạy
Nhưng khi thay đổi giá trị trong ô A5 thì thì macro FILLTERS không chạy
Cho em hỏi thủ tục sai chỗ nào nhờ các anh chỉ giúp làm sao khi thay đổi giá trị ô A5 thì macro FILLTERS chạy. Em cảm ơn.
(Em thay đổi giá trị trong ô A5 bằng list data validasion)
 
Em xin hỏi trong sheet 7 em có thủ tục sau


Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$5" And Target.Value <> 0 Then
Call FILLTERS
End If
End Sub

Khi em kích combox thì macro FILLTERS chạy
Nhưng khi thay đổi giá trị trong ô A5 thì thì macro FILLTERS không chạy
Cho em hỏi thủ tục sai chỗ nào nhờ các anh chỉ giúp làm sao khi thay đổi giá trị ô A5 thì macro FILLTERS chạy. Em cảm ơn.
(Em thay đổi giá trị trong ô A5 bằng list data validasion)

Với hàng tô đỏ, nếu bạn xóa hoặc cho giá trị bằng 0 ở ô A5 thì sự kiện này không hoạt động.
 
Em không cho giá trị bằng 0 hoặc xoá giá trị trong ô A5 nhưng macro vẫn không chạy
 
Cho em hỏi làm cách nào mà khi ô A5 thay đổi thì sự kiện hoạt động và macro chạy
 
Web KT

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

Back
Top Bottom