Lỗi Run-time error '1004'

Liên hệ QC

duong_nam_dao

Thành viên chính thức
Tham gia
2/3/08
Bài viết
89
Được thích
44
Em có 1 tài liệu kèm theo. Em muốn ẩn 1 số cột cùng lúc, nhưng có cột ẩn được, có cột ẩn thì báo lỗi Run-time error '1004'. Đôi khi các cột ẩn được nhưng khi khóa trang thì lại báo lỗi trên. Các bác xem giúp hộ em. Cám ơn các bác nhiều !

Lúc trước em đã gửi cả file lên nhưng không biết sao không được. Em đã gửi lại, nhờ các bác xem hộ
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn gỡ Unhide cho các cột từ BI đến IV đi là code chạy được liền.
Mình nghĩ cái này do vấn đề của Excel thôi!
Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bác, nhưng khi khóa trang thì lại báo lỗi. Bác xem lại hộ em xem sửa thế nào ?
 
Upvote 0
Lổi này xuất hiện vì có sự xuất hiện của các Comment ở phía bên phải bảng tính... Bạn xóa hết chúng thì sẽ hết lổi!
Bạn có thể thí nghiệm: Khi bạn ẩn giai đoạn 3 bằng tay, sau đó ẩn giai đoạn 4 thử xem... Ngay cả bằng tay cũng làm không đựoc thì code sao xử lý nổi ---> Lổi loại này đã từng đề cập trên diển đàn rồi, và chính Microsoft cũng chứng thực việc ẩn cột bị lổi có liên quan đến sự tồn tại của các Ọbect đấy (mà cụ thể là Comment)
Nói thêm: Code này tôi thấy... hơi kỳ kỳ... Cố gắng sửa lại cho "ngọt" hơn 1 chút
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bác hoang_B nhưng form anhien này em lại dùng cho 4 trang khác nhau. Nếu mở khóa rồi lại khóa trang lại thế này thì chỉ dùng được cho 1 trang thôi. Bác nghiên cứu hộ em.
Còn bác ndu96081631 ơi, em mới học vba nên chưa hiểu ý tưởng của bác. Bác thông cảm, thôi em nhờ bác sửa giùm em. Chờ tin các bác
 
Upvote 0
Vậy bạn thay Sheet7 thành chữ ActiveSheet là được nhưng với điều kiện là các sheet ấy phải chung pass nha! Khác nhau thì phải làm cách trên thôi.
Chúc vui.
 
Upvote 0
Tiếp tục nói về lổi không thể ẩn cột ở trên (để các bạn tin rằng nói có sách mách có chứng)
Ta thí nghiệm như sau:
1> Tìm đến cell IR1 và add 1 Comment
2> Giờ hãy ẩn 1 cột bất kỳ
3> Tiếp theo ẩn 1 cột khác
Ngay khi ta thực hiện bứơc 3 sẽ nhận 1 thông báo lổi rằng : "Cannot shift objects off sheet"
Hãy xem file đính kèm tôi đang làm thí nghiệm
Và thông tin về lổi này tại Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;en-ca;211769
Còn bác ndu96081631 ơi, em mới học vba nên chưa hiểu ý tưởng của bác. Bác thông cảm, thôi em nhờ bác sửa giùm em. Chờ tin các bác
Ví dụ bạn có thể sửa 1 trong các code như sau:
PHP:
Private Sub CheckBox1_Click()
   ActiveSheet.Columns("Q:T").Hidden = CheckBox1
End Sub
Nhưng tôi vẩn cãm giác là chưa hài lòng vì thật ra cấu trúc của 4 đoạn code là như nhau... Tôi đang mường tượng đến 1 vòng lập For quét xuyên qua các CheckBox, đại khái như là:
PHP:
..............
For i = 1 to....
ActiveSheet.OLEObjects("CheckBox" & i).Object......
..........
Nghĩ vậy nhưng vẩn chưa làm đựoc (Nói thật tôi vẩn còn rất kém những vụ có liên quan đến UserForms)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em có 1 tài liệu kèm theo. Em muốn ẩn 1 số cột cùng lúc, nhưng có cột ẩn được, có cột ẩn thì báo lỗi Run-time error '1004'. Đôi khi các cột ẩn được nhưng khi khóa trang thì lại báo lỗi trên. Các bác xem giúp hộ em. Cám ơn các bác nhiều !

Lúc trước em đã gửi cả file lên nhưng không biết sao không được. Em đã gửi lại, nhờ các bác xem hộ

Chào bạn,
Với yêu cầu Hide cột như thế, mình thiết nghĩ chẳng cần viết Code làm gì, Dùng trực tiếp chức năng Group của excel cho nhanh (vào Data/Group and Outline). Dù gì cũng phải Click, Click đúng không? Chức năng này sẽ tạo các Group Item tương ứng với các cột/dòng do ta quy định. Bạn nghiên cứu thử xem, bảo đảm dễ hơn rất nhiều so với cách bạn đang làm.
 
Upvote 0
Như tôi đã nói với bạn duong_nam_dao, tôi cãm thấy 4 đoạn code có cấu trúc giống nhau nên có ý tưởng sẽ gộp chúng thành 1 thông qua vòng lập For... Each
Tôi đã làm được vòng lập For cho các checkbox (tức dùng 1 code duy nhất cho tất cả checkbox)... nhưng vẩn chưa hài lòng lắm, nhờ các cao thủ chỉnh sửa giúp chổ này:
File của tôi chỉ khi bấm nút Exit nó mới thực hiện ẩn cột ---> Có cách nào giúp nó thực hiện code lập tức ngay khi tôi vừa check vào CheckBox không?
Code ở đây:
PHP:
Sub An_Hien_Cot()
  Dim CB As Control
  Dim Rng As Range
  Dim k As Byte
  UserForm1.Show
  
  For Each CB In UserForm1.Controls
    If TypeName(CB) = "CheckBox" Then
        k = Right(CB.Name, 1) * 1
        Set Rng = [D2].Offset(, (k - 1) * 4).Resize(, 4)
        Rng.EntireColumn.Hidden = CB.Value
    End If
  Next CB
End Sub
PHP:
Private Sub CommandButton1_Click()
    Me.Hide
End Sub
Và mời xem file đính kèm
 

File đính kèm

Upvote 0
To: ndu96081631,

Mã:
Sub An_Hien_Cot()
  Dim CB As Control
  Dim Rng As Range
  Dim k As Byte
  
  UserForm1.Show
  
  For Each CB In UserForm1.Controls
    If TypeName(CB) = "CheckBox" Then
        k = Right(CB.Name, 1) * 1
        Set Rng = [D2].Offset(, (k - 1) * 4).Resize(, 4)
        Rng.EntireColumn.Hidden = CB.Value
    End If
  Next CB
End Sub
Trong đoạn code trên của bạn, bạn gọi
Mã:
UserForm1.Show
Điều này có nghĩa chỉ khi nào bạn thoát form thì mới thực hiện lệnh kế tiếp.
Vậy bạn có thể:
1. Bỏ đoạn code gọi form trong thủ tục trên.
2. Thêm một thủ tục khi người dùng Click vào nút lệnh
Mã:
Sub show_form()
   UserForm1.Show
End Sub
3. Gọi thủ tục trên mỗi khi người dùng click vào các CheckBox.
Mã:
Private Sub CheckBox1_Click()
Call An_Hien_Cot
End Sub

Private Sub CheckBox2_Click()
Call An_Hien_Cot
End Sub

Private Sub CheckBox3_Click()
Call An_Hien_Cot
End Sub

Private Sub CheckBox4_Click()
Call An_Hien_Cot
End Sub
Lê Văn Duyệt
 
Upvote 0
Nhất trí với ý kiến của bác levanduyet. Tôi đã sửa file của ndu theo ý bác thì chạy tốt. Tôi gửi lên để các bác khác tham khảo. Cám ơn các bác đã chỉ giáo.
 

File đính kèm

Upvote 0
To: ndu96081631,

Mã:
Sub An_Hien_Cot()
  Dim CB As Control
  Dim Rng As Range
  Dim k As Byte
  
  UserForm1.Show
  
  For Each CB In UserForm1.Controls
    If TypeName(CB) = "CheckBox" Then
        k = Right(CB.Name, 1) * 1
        Set Rng = [D2].Offset(, (k - 1) * 4).Resize(, 4)
        Rng.EntireColumn.Hidden = CB.Value
    End If
  Next CB
End Sub
Trong đoạn code trên của bạn, bạn gọi
Mã:
UserForm1.Show
Điều này có nghĩa chỉ khi nào bạn thoát form thì mới thực hiện lệnh kế tiếp.
Vậy bạn có thể:
1. Bỏ đoạn code gọi form trong thủ tục trên.
2. Thêm một thủ tục khi người dùng Click vào nút lệnh
Mã:
Sub show_form()
   UserForm1.Show
End Sub
3. Gọi thủ tục trên mỗi khi người dùng click vào các CheckBox.
Mã:
Private Sub CheckBox1_Click()
Call An_Hien_Cot
End Sub

Private Sub CheckBox2_Click()
Call An_Hien_Cot
End Sub

Private Sub CheckBox3_Click()
Call An_Hien_Cot
End Sub

Private Sub CheckBox4_Click()
Call An_Hien_Cot
End Sub
Lê Văn Duyệt
Nếu làm vầy thì cũng... như không! Mục đích của tôi là rút ngắn code khi ta có nhiều checkBox... Với 20 cái CheckBox cho trước mà làm kiểu này chẳng hóa ra code còn dài hơn!
Thật ra nếu tôi cho code trên vào sự kiện UserForm_Click thì cũng OK, có điều thấy buồn cười vì mổi khi check vào checkbox ta lại phải CLICK 1 cái
Có cách nào hoàn mỹ không nhỉ?
 
Upvote 0
Web KT

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

Back
Top Bottom