Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Tôi có một đoạn code sau:
Private Sub cmdThem_Click()Dim RowCount As Long
Dim ctl As Control
Range("BB2:BH2").ClearContents
'Write data to worksheet
RowCount = Worksheets("THULY").Range("BB1").CurrentRegion.Rows.Count
With Worksheets("THULY").Range("BB1")
.Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
.Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
.Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
.Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
.Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
.Offset(RowCount, 5).Value = Me.txtSothangBC.Value
.Offset(RowCount, 6).Value = Me.txtThoigianBC.Value
End With
Unload Me
End Sub
Nhờ GPE hướng dẫn cách giúp để đoạn code trên (phần chữ màu đỏ) không Clear tất cả thông tin ở Range BB2:BH2
Mà yêu cầu là nó chỉ Replace cho những thông tin nào có thay đổi ở Range BB2:BH2
Cảm ơn mọi người ah!
 
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn, tôi có sưu tầm được trên diễn đàn 1 file ghi dữ liệu từ file đích sang file lưu trữ, file này chạy rất êm, nhưng khi tôi copy đoạn code trong module và chuyển sang 1 file khác để chạy thì bị lỗi, báo lỗi ở đoạn code này (With New Scripting.FileSystemObject). Rất mong các Thầy và các anh chị trên diễn đàn giúp đỡ chỉ cho tôi nguyên nhân tại sao khi chuyển sang file khác thì bị lỗi. Trân trọng cám ơn
 

File đính kèm

  • Ghi DL mau.rar
    17.5 KB · Đọc: 29
  • Filebiloi.rar
    20 KB · Đọc: 13
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn, tôi có sưu tầm được trên diễn đàn 1 file ghi dữ liệu từ file đích sang file lưu trữ, file này chạy rất êm, nhưng khi tôi copy đoạn code trong module và chuyển sang 1 file khác để chạy thì bị lỗi, báo lỗi ở đoạn code này (With New Scripting.FileSystemObject). Rất mong các Thầy và các anh chị trên diễn đàn giúp đỡ chỉ cho tôi nguyên nhân tại sao khi chuyển sang file khác thì bị lỗi. Trân trọng cám ơn
Chưa xem file của bạn nhưng qua mô tả tôi đoán như sau: phần bị lỗi do chưa có tham chiếu tới thư viện Scripting runtime. Vậy để sửa bạn làm như sau:
Vào cửa sổ VBE => Chọn Tool => Reference..=> Tìm đến dòng Microsoft Scripting runtime => tick vào đó và ok. Sau đó bạn chạy Code.
 
Upvote 0
Chào bác dhn46 đúng như bác phán đoán, tôi làm theo bác hướng dẫn và đã chạy được. Cám ơn bác rất nhiều!
 
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn! Nhờ các Thầy và các anh chị rút gọn rút tôi đoạn code sau. Kiến thức VBA của tôi còn rất hạn chế, nên rất mong được sự hướng dẫn chi tiết. Trân trọng cám ơn
Mã:
Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleTransparent Then
        Label2.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label3.BackStyle = fmBackStyleTransparent Then
        Label3.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label4_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label4.BackStyle = fmBackStyleTransparent Then
        Label4.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdIn_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdIn.BackStyle = fmBackStyleTransparent Then
        cmdIn.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdInSQ_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdInSQ.BackStyle = fmBackStyleTransparent Then
        cmdInSQ.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdThoat_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdThoat.BackStyle = fmBackStyleTransparent Then
        cmdThoat.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleOpaque Then
       Label2.BackStyle = fmBackStyleTransparent
    
    ElseIf Label3.BackStyle = fmBackStyleOpaque Then
       Label3.BackStyle = fmBackStyleTransparent
   
    ElseIf Label4.BackStyle = fmBackStyleOpaque Then
       Label4.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdIn.BackStyle = fmBackStyleOpaque Then
       cmdIn.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdInSQ.BackStyle = fmBackStyleOpaque Then
       cmdInSQ.BackStyle = fmBackStyleTransparent
       
       Else
  cmdThoat.BackStyle = fmBackStyleOpaque
       cmdThoat.BackStyle = fmBackStyleTransparent
    End If
End Sub
 
Upvote 0
chào anh chị,
tôi có một đoạn code nhỏ sau đây để lấy địa chỉ trong sự kiện select change
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Offset(, 2).Activate
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

khi tôi đang ở cell A1, khi kết thúc nhập liệu băng phím enter
nó báo như sau: $C$1 rồi $A$2
như vậy cái địa chỉ cuối cùng mà nó hiểu là A2, nhưng thực tế thì cell C1 đang được chọn

anh chị cho hỏi vì sao như vậy và làm cách khắc phục

cám ơn mọi người
chúc một ngày vui vẻ
 
Upvote 0
anh chị cho hỏi vì sao như vậy và làm cách khắc phục

- Vì sao như vậy: Vì bạn bắt nó làm như vậy, nó miễn cưỡng làm theo bạn nhưng không quên lời ông chủ của nó (ông Bin), Enter mặc định là xuống dòng.
- Cách khắc phục: Không hiểu bạn muốn gì, sao khắc được?
 
Upvote 0
chào anh chị,
tôi có một đoạn code nhỏ sau đây để lấy địa chỉ trong sự kiện select change
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Offset(, 2).Activate
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

khi tôi đang ở cell A1, khi kết thúc nhập liệu băng phím enter
nó báo như sau: $C$1 rồi $A$2
như vậy cái địa chỉ cuối cùng mà nó hiểu là A2, nhưng thực tế thì cell C1 đang được chọn

anh chị cho hỏi vì sao như vậy và làm cách khắc phục

cám ơn mọi người
chúc một ngày vui vẻ

Sao không làm chung 1 sự kiện mà phải tách ra 2 sự kiện chi vậy bạn?

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Target.Offset(, 2).Activate
    MsgBox ActiveCell.Address
    Application.EnableEvents = True
End Sub
 
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn! Nhờ các Thầy và các anh chị rút gọn rút tôi đoạn code sau. Kiến thức VBA của tôi còn rất hạn chế, nên rất mong được sự hướng dẫn chi tiết. Trân trọng cám ơn
Mã:
Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleTransparent Then
        Label2.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label3.BackStyle = fmBackStyleTransparent Then
        Label3.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label4_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label4.BackStyle = fmBackStyleTransparent Then
        Label4.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdIn_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdIn.BackStyle = fmBackStyleTransparent Then
        cmdIn.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdInSQ_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdInSQ.BackStyle = fmBackStyleTransparent Then
        cmdInSQ.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdThoat_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdThoat.BackStyle = fmBackStyleTransparent Then
        cmdThoat.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleOpaque Then
       Label2.BackStyle = fmBackStyleTransparent
    
    ElseIf Label3.BackStyle = fmBackStyleOpaque Then
       Label3.BackStyle = fmBackStyleTransparent
   
    ElseIf Label4.BackStyle = fmBackStyleOpaque Then
       Label4.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdIn.BackStyle = fmBackStyleOpaque Then
       cmdIn.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdInSQ.BackStyle = fmBackStyleOpaque Then
       cmdInSQ.BackStyle = fmBackStyleTransparent
       
       Else
  cmdThoat.BackStyle = fmBackStyleOpaque
       cmdThoat.BackStyle = fmBackStyleTransparent
    End If
End Sub
Tôi nghĩ chẳng có gì để rút gọn ở các sự kiện MouseMove trên, bởi như vậy đã là tương đối tối ưu, nhưng nếu bạn có thể dùng Class thì có thể rút gọn hơn cho bạn, tuy nhiên bạn cần gửi cái file có cái form đó lên đây tôi sẽ giúp cho bạn.
 
Upvote 0
Cám ơn 2 anh đã trả lời,
tôi có làm một bài cho một bạn,
bạn ấy hơi lười, nên muốn nhập liệu cột A-->enter-->nhảy qua cột C-->enter nhảy qua E--->enter quay về A
nhưng ở cột A nó có một cái listbox, nên phải sử dụng sự kiện selectionchange, để khi nào chọn cột A thì nó active cái listbox.
nhưng khi mình từ cột E quay về thì nó ko active cái listbox đó (vì khi đó nó ko hiểu là cột A được chọn, giống ví dụ ở trên).
 
Upvote 0
Cám ơn 2 anh đã trả lời,
tôi có làm một bài cho một bạn,
bạn ấy hơi lười, nên muốn nhập liệu cột A-->enter-->nhảy qua cột C-->enter nhảy qua E--->enter quay về A
nhưng ở cột A nó có một cái listbox, nên phải sử dụng sự kiện selectionchange, để khi nào chọn cột A thì nó active cái listbox.
nhưng khi mình từ cột E quay về thì nó ko active cái listbox đó (vì khi đó nó ko hiểu là cột A được chọn, giống ví dụ ở trên).
Tôi biết bạn nói về bài nào và của ai, đây cũng không phải là lười biếng mà họ muốn tiện ích, không muốn sử dụng chuột, tuy nhiên, ở cell nó không như textbox tức nó không có sự kiện Cell_Change nên rất khó thực hiện ý đồ đó.
 
Upvote 0
Cám ơn 2 anh đã trả lời,
tôi có làm một bài cho một bạn,
bạn ấy hơi lười, nên muốn nhập liệu cột A-->enter-->nhảy qua cột C-->enter nhảy qua E--->enter quay về A
nhưng ở cột A nó có một cái listbox, nên phải sử dụng sự kiện selectionchange, để khi nào chọn cột A thì nó active cái listbox.
nhưng khi mình từ cột E quay về thì nó ko active cái listbox đó (vì khi đó nó ko hiểu là cột A được chọn, giống ví dụ ở trên).

Thử như thế này rồi tính tiếp
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Left(Target.Address(0, 0), 1) = "E" Then
        Target.Offset(, -4).Activate
        MsgBox ActiveCell.Address
        ' Code cua ban
    Else
        Target.Offset(, 2).Activate
    End If
    Application.EnableEvents = True
End Sub
 
Upvote 0
Chào các anh chị em có đoạn này:

[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)If Target.Column = 1 Then
If Target.Rows.Count = 1 Then
If Target <> "" Then
Target.Offset(, 4).Value = Now
Target.Offset(, 3).FillDown
Target.Offset(, 2).Activate
Else
Target.Offset(, 1).Resize(, 4).ClearContents
End If
End If
ElseIf Target.Column = 3 Then
If Target.Rows.Count = 1 Then
If Target <> "" Then
Target.Offset(1, -2).Activate
End If
End If
ElseIf Target.Column = 2 Then
If Target.Rows.Count = 1 Then
If Target <> "" Then
Target.Offset(1, -1).Activate
End If
End If
End If
End Sub[/GPECODE][/QUOTE]

Ý em là:

-Nếu nhập dử liệu ở cột A --> enter khung chọn ô tự dời ngang qua cột C
-Tiếp tục nếu nhập dử liệu ở cột C hoặc cột B --> enter -->khung chọn tự động xuống hàng ở cột A.

Về 2 ý trên code chạy được , khi áp dụng xóa dử liệu cột A mới bị báo lổi, do em không biết VBA chỉ lượm lặt code đó đây lắp ghép lại nên không biết sai thế nào ,sửa chửa thế nào xin các anh giúp em nhé.
 

File đính kèm

  • HANGHOA.rar
    54 KB · Đọc: 23
Upvote 0
Chào các anh chị em có đoạn này:
...
Ý em là:

-Nếu nhập dử liệu ở cột A --> enter khung chọn ô tự dời ngang qua cột C
-Tiếp tục nếu nhập dử liệu ở cột C hoặc cột B --> enter -->khung chọn tự động xuống hàng ở cột A.

Về 2 ý trên code chạy được , khi áp dụng xóa dử liệu cột A mới bị báo lổi, do em không biết VBA chỉ lượm lặt code đó đây lắp ghép lại nên không biết sai thế nào ,sửa chửa thế nào xin các anh giúp em nhé.

bạn thử sắp xếp như sau thử xem:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column = 1 Then
        If Target <> "" Then
            Target.Offset(, 4).Value = Now
            Target.Offset(, 3).FillDown
            Target.Offset(, 2).Activate
        Else
            Target.Offset(, 1).Resize(, 4).ClearContents
        End If
    ElseIf Target.Column = 2 Then
        If Target <> "" Then Target.Offset(1, -1).Activate
    ElseIf Target.Column = 3 Then
        If Target <> "" Then Target.Offset(1, -2).Activate
    End If
End If
End Sub
 
Upvote 0
bạn thử sắp xếp như sau thử xem:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column = 1 Then
        If Target <> "" Then
            Target.Offset(, 4).Value = Now
            Target.Offset(, 3).FillDown
            Target.Offset(, 2).Activate
        Else
            Target.Offset(, 1).Resize(, 4).ClearContents
        End If
    ElseIf Target.Column = 2 Then
        If Target <> "" Then Target.Offset(1, -1).Activate
    ElseIf Target.Column = 3 Then
        If Target <> "" Then Target.Offset(1, -2).Activate
    End If
End If
End Sub
Em cám ơn anh phucbugis nhé, ok rồi anh ơi anh giỏi thật sửa lại vừa gọn vừa hết lỗi, anh có thể giải thích vì sao code em làm bị lỗi không anh ?
 
Upvote 0
Tôi nghĩ chẳng có gì để rút gọn ở các sự kiện MouseMove trên, bởi như vậy đã là tương đối tối ưu, nhưng nếu bạn có thể dùng Class thì có thể rút gọn hơn cho bạn, tuy nhiên bạn cần gửi cái file có cái form đó lên đây tôi sẽ giúp cho bạn.
Cám ơn Thầy đã hồi âm! form này ở trong một chương trình em đang viết có nhiều form, Thầy cho em thời gian để tách riêng form này ra và gửi lên chương trình nhờ Thầy giúp em, về Class em còn lớ ngớ lắm, rất mong Thầy quan tâm giúp đỡ. Trân trọng
 
Upvote 0
Tôi nghĩ chẳng có gì để rút gọn ở các sự kiện MouseMove trên, bởi như vậy đã là tương đối tối ưu, nhưng nếu bạn có thể dùng Class thì có thể rút gọn hơn cho bạn, tuy nhiên bạn cần gửi cái file có cái form đó lên đây tôi sẽ giúp cho bạn.
Chào thầy Nghĩa! Em gửi file giả định lên nhờ Thầy giúp đỡ. Cụ thể Thầy xem giúp em 1 số nội dung sau:
1. Khi để file chạy ở chế độ không ẩn Sheet thì có thể xem được hồ sơ trước khi in bình thường, nhưng khi em cho chạy đoạn code (If Application.Visible = True Then Application.Visible = False) thì ở chế độ Print Priview bị mờ đi không sử dụng được các nút chức năng, chỉ xem được.
2. Thực tế em mới tiếp cận với VBA từ tháng 10/2013 và không được học cơ bản, kiến thức có được chỉ từ đọc sách của Thầy Phan Tự Hướng và học từ diễn đàn, nên còn rất hạn chế. Vậy em nhờ Thầy cho ý kiến về cách sử dụng Form (về giao diện, bố trí ...).
Rất mong Thầy chỉ bảo giúp em. Trân trọng cám ơn Thầy
 

File đính kèm

  • FormGPE.rar
    19.6 KB · Đọc: 10
Upvote 0
Chào thầy Nghĩa! Em gửi file giả định lên nhờ Thầy giúp đỡ. Cụ thể Thầy xem giúp em 1 số nội dung sau:
1. Khi để file chạy ở chế độ không ẩn Sheet thì có thể xem được hồ sơ trước khi in bình thường, nhưng khi em cho chạy đoạn code (If Application.Visible = True Then Application.Visible = False) thì ở chế độ Print Priview bị mờ đi không sử dụng được các nút chức năng, chỉ xem được.
2. Thực tế em mới tiếp cận với VBA từ tháng 10/2013 và không được học cơ bản, kiến thức có được chỉ từ đọc sách của Thầy Phan Tự Hướng và học từ diễn đàn, nên còn rất hạn chế. Vậy em nhờ Thầy cho ý kiến về cách sử dụng Form (về giao diện, bố trí ...).
Rất mong Thầy chỉ bảo giúp em. Trân trọng cám ơn Thầy
Tôi làm tạm cái file này, bạn xem có thấy gì bất tiện không nhé.
 

File đính kèm

  • Tmp.xlsm
    32.3 KB · Đọc: 20
Upvote 0
Tôi làm tạm cái file này, bạn xem có thấy gì bất tiện không nhé.
Cám ơn Thầy đã quan tâm giúp đỡ em !, em đã chạy thử thấy code rất gọn, chạy êm và nhanh hơn rất nhiều, tuy nhiên khi Prin Priview vẫn bị mờ các nút chức năng Thầy ạ, hơn nữa khi thoát từ nút thoát thì vẫn không thoát hết cả phần excel. em đã thử bằng cách thêm 1 nút lệnh để mở form từ excel (Không cho mở form ngay khi Enable ) thì không mắc lỗi mờ khi Prin Priview, em không hiểu lỗi này là lỗi gì. Rất mong Thầy quan tâm giúp đỡ. Trân trọng biết ơn Thầy
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom