Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

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

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
đoạn codec của e không chạy được, mọi người xem giúp e với!

Đoạn If rng.Delete Then là cái quỷ gì vậy, làm sao chạy được. Muốn edit cũng chẳng ai biết đường mà sửa lại cho bạn

Làm gì có chuyện sửa thành Change2 chứ. Nếu chạy được mình sẽ ngủ mở mắt như Trương Phi
 
Lần chỉnh sửa cuối:
Upvote 0
Đoạn If rng.Delete Then là cái quỷ gì vậy, làm sao chạy được. Muốn edit cũng chẳng ai biết đường mà sửa lại cho bạn

Nó cũng giống như vầy nè, nói thì dễ nhưng cụ thể trong code thì khó, nếu delete cột D thì cột nào đó sẽ clear (có thể những công thức sẽ cho giá trị REF). Vấn đề là bằng sự kiện gì để nhận biết cột D bị delete!!!
 
Upvote 0
đoạn codec của e không chạy được, mọi người xem giúp e với!
Hiểu thí thí thì cũng làm thí thí, hên xui thôi.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Target.Column = 4 Then
    For Each Cll In Target
        If Cll.Value = "" Then
            Cll.Offset(, 1).Resize(, 15).ClearContents
        End If
    Next
End If
End Sub
 
Upvote 0
Hiểu thí thí thì cũng làm thí thí, hên xui thôi.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Target.Column = 4 Then
    For Each Cll In Target
        If Cll.Value = "" Then
            Cll.Offset(, 1).Resize(, 15).ClearContents
        End If
    Next
End If
End Sub

Thật sự mà nói thì khi DELETE cột (không phải CLEAR) thì cột sau dồn lên cột trước, như vậy CỘT CẬN CỘT BỊ XÓA SẼ TRỞ THÀNH CHÍNH NÓ!

Vì thế ta khó xác định được sự kiện nào cho phải!
 
Upvote 0
đoạn codec của e không chạy được, mọi người xem giúp e với!

Tôi không thể làm được sự kiện DELETE, nhưng tôi nghĩ chúng ta nên có 1 nút lệnh để xóa cột thì sẽ tốt hơn!

Mã:
Sub Macro1()
    If MsgBox("Ban co thuc su muon xoa cot D hay khong?", vbQuestion + vbYesNo, "THÔNG BÁO") = vbYes Then
        Sheet1.Columns("D:D").Delete Shift:=xlToLeft
        Sheet1.Columns("D:D").Resize(, 14).Clear
    End If
End Sub
 

File đính kèm

  • XoaCot.xls
    30.5 KB · Đọc: 6
Upvote 0
Đoạn If rng.Delete Then là cái quỷ gì vậy, làm sao chạy được. Muốn edit cũng chẳng ai biết đường mà sửa lại cho bạn

Làm gì có chuyện sửa thành Change2 chứ. Nếu chạy được mình sẽ ngủ mở mắt như Trương Phi
hahaha; em mơi "biết lật" trong thế giới VBA thôi bác ơi, đọc cũng nhiều nhưng không tự viết được nên mạo mụi "viết đại" để các bác sửa rồi tự rút kinh nghiệm như vậy sẽ nhớ lâu hơn; cảm ơn bác!
Hiểu thí thí thì cũng làm thí thí, hên xui thôi.
anh cho em hỏi trong một sheet1 mà có hai đoạn codec Private Sub Worksheet_Change(ByVal Target As Range) ...End sub chạy hai nội dung khác nhau được không (thấy "máy bảo" không được nhưng không biết tại sao), cái Change2 của em ở trên cũng là vậy.hihi
 
Lần chỉnh sửa cuối:
Upvote 0
hahaha; em mơi "biết lật" trong thế giới VBA thôi bác ơi, đọc cũng nhiều nhưng không tự viết được nên mạo mụi "viết đại" để các bác sửa rồi tự rút kinh nghiệm như vậy sẽ nhớ lâu hơn; cảm ơn bác!
Bạn cần kết quả thê nào thì cứ tung cái file lên đây, nói rõ ràng yêu cầu thì sẽ có code mẫu cho bạn nghiên cứu
 
Upvote 0
anh cho em hỏi trong một sheet1 mà có hai đoạn codec Private Sub Worksheet_Change(ByVal Target As Range) ...End sub chạy hai nội dung khác nhau được không (thấy "máy bảo" không được nhưng không biết tại sao), cái Change2 của em ở trên cũng là vậy.hihi

Trong sheet, chỉ có 1 sự kiện Change duy nhất mà thôi:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
End sub

Không thể có các sự kiện Change_n nào thêm nữa cả! Nếu có, nó chỉ là những thủ tục bình thường như các sub khác chứ không còn là sub chạy theo sự kiện nữa.
 
Upvote 0
Em có đoạn code được hỗ trợ trên diễn đàn
Mã:
Sub Unique()
  With Sheets("TonKho")
    Dim Maxx As Long
    Max1 = Application.WorksheetFunction.Max(Sheets("Nhap").Range("C18:C1100"))
    Sheets("Nhap").[B]Range("D17:D&Max1")[/B].AdvancedFilter 2, , .Range("C5"), True
    Max2 = Application.WorksheetFunction.Max(Sheets("TonKho").Range("C18:C1100"))
[B]   .Range("A6:N&Max2")[/B].Sort .[C6], 1, Header:=0
    End With
End Sub
Mục đích của Code là tạo list duy nhất (không trùng) và sắp xếp lại.
Vấn đề của em là em chỉ muốn vùng dữ liệu khi lọc không trùng (độ dài vùng dữ liệu trước khi lọc) vừa đúng độ dài thực của nó. Tuy nhiên em chưa biết cách ghép vùng kiểu như Range("D17:D&Max1").Range("A6:N&Max2")
Mong các bác chỉ dẫn
 
Upvote 0
Tôi không biết vùng dữ liệu của bạn như thế nào, tuy nhiên với cấu trúc: Range("D17:D&Max1").Range("A6:N&Max2")
là sai nha bạn, phải như vầy mới đúng: Range("D17:D" & Max1).Range("A6:N" & Max2)
 
Upvote 0
Tôi không biết vùng dữ liệu của bạn như thế nào, tuy nhiên với cấu trúc: Range("D17:D&Max1").Range("A6:N&Max2")
là sai nha bạn, phải như vầy mới đúng: Range("D17:D" & Max1).Range("A6:N" & Max2)

Cảm ơn bác.
GPE có đội phản ứng rất nhanh. hehee
Em chỉ cần có thế. Em đã làm được rồi
 
Upvote 0
Em sử dụng lệnh
Mã:
 ActiveSheet.Protect "password"
để khóa sheet nhưng theo mặc định nó khóa tất cả các chức năng trong sheet.
Khi Protect theo cách thủ công (dùng menu của excel) thì có những lựa chọn nào cho khóa, cái nào không (ví dụ khóa sheet nhưng vẫn cho AutoFilter..)
Vậy mong các bác chỉ dẫn các tham số cho mã Protect trên.
 
Upvote 0
Em sử dụng lệnh
Mã:
 ActiveSheet.Protect "password"
để khóa sheet nhưng theo mặc định nó khóa tất cả các chức năng trong sheet.
Khi Protect theo cách thủ công (dùng menu của excel) thì có những lựa chọn nào cho khóa, cái nào không (ví dụ khóa sheet nhưng vẫn cho AutoFilter..)
Vậy mong các bác chỉ dẫn các tham số cho mã Protect trên.
Bạn thử cái này
Mã:
AllowFiltering:=True
 
Upvote 0
Em sử dụng lệnh
Mã:
 ActiveSheet.Protect "password"
để khóa sheet nhưng theo mặc định nó khóa tất cả các chức năng trong sheet.
Khi Protect theo cách thủ công (dùng menu của excel) thì có những lựa chọn nào cho khóa, cái nào không (ví dụ khóa sheet nhưng vẫn cho AutoFilter..)
Vậy mong các bác chỉ dẫn các tham số cho mã Protect trên.

Bạn record macro quá trình protect sheet bằng tay rồi xem code sẽ tự biết
 
Upvote 0
Hàm Match trong VBA

Dear anh chi, Em có thắc mắc này nhờ ac giải thích giúp,
Em dùng hàm match trong 2 trường hợp thì có trường hợp bì lỗi, em không rõ lý do tại sao?

HTML:
Sub test() '' bi loi
Dim t As Long
Dim mydate As Date
mydate = Range("D2") + 1
t = Application.WorksheetFunction.Match(mydate, Range("B2:B14"), 0)
MsgBox t
End Sub


Sub test2() ''khong bi loi
Dim t As Long
Range("D3") = Range("D2") + 1
t = Application.WorksheetFunction.Match(Range("D3"), Range("B2:B14"), 0)
MsgBox t
End Sub
 

File đính kèm

  • MatchVBA.xlsm
    13.8 KB · Đọc: 7
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dear anh chi, Em có thắc mắc này nhờ ac giải thích giúp,
Em dùng hàm match trong 2 trường hợp thì có trường hợp bì lỗi, em không rõ lý do tại sao?

HTML:
Sub test() '' bi loi
Dim t As Long
Dim mydate As Date
mydate = Range("D2") + 1
t = Application.WorksheetFunction.Match(mydate, Range("B2:B14"), 0)
MsgBox t
End Sub


Sub test2() ''khong bi loi
Dim t As Long
Range("D3") = Range("D2") + 1
t = Application.WorksheetFunction.Match(Range("D3"), Range("B2:B14"), 0)
MsgBox t
End Sub
Thay vì Dim mydate As Date bạn sửa lại thành Dim mydate As Long xem sao nhé
 
Upvote 0
Code bị lỗi, không biết cách khắc phục

Mới tập tành viết code, viết được cái đoạn này mà sao nó không chạy ra kết quả được!

Mã:
Function Gia_tri_k(B, L, Z) As Single   
 Dim i, j As Integer
        i = B / 2
        j = L / 2
    If Z = 0 Then
        Gia_tri_k = 1
    Else
        Gia_tri_k =(2 / 3.141592654) * ((Atn((i * j) / (Z * Sqr(i * i + j * j + Z * Z))) + (i * j * Z * (i * i + j * j + 2 * Z * Z)) / ((i * i + Z * Z) * (j * j + Z * Z) * (Sqr(i * i + j * j + Z * Z)))))
    End If
End Function

Với Z khác 0 thì kết quả trả ra toàn là bằng 0. Không hiểu bị sai chỗ nào?


Sau đó nhiều lần xoá bớt, chỉ còn đoạn code như bên dưới đây thì phát hiện ra là biến j=0!
Mã:
Function Gia_tri_k(B, L, Z) As Single  
  Dim i, j As Integer
        i = B / 2
        j = L / 2
    If z = 0 Then
        Gia_tri_k = 1
    Else
        Gia_tri_k = j
    End If
End Function

Trong khi biến i thì cho kết quả đúng (Vd: nếu B=1 thì i=0.5, nhưng L=1 thì j=0!!!)

Nhờ mọi người chỉ giúp với bị sai chỗ nào, mới tập làm quen với VB nên không biết bị sai gì!
 
Upvote 0
Mới tập tành viết code, viết được cái đoạn này mà sao nó không chạy ra kết quả được!

Mã:
Function Gia_tri_k(B, L, Z) As Single   
 Dim i, j As Integer
        i = B / 2
        j = L / 2
    If Z = 0 Then
        Gia_tri_k = 1
    Else
        Gia_tri_k =(2 / 3.141592654) * ((Atn((i * j) / (Z * Sqr(i * i + j * j + Z * Z))) + (i * j * Z * (i * i + j * j + 2 * Z * Z)) / ((i * i + Z * Z) * (j * j + Z * Z) * (Sqr(i * i + j * j + Z * Z)))))
    End If
End Function

Với Z khác 0 thì kết quả trả ra toàn là bằng 0. Không hiểu bị sai chỗ nào?


Sau đó nhiều lần xoá bớt, chỉ còn đoạn code như bên dưới đây thì phát hiện ra là biến j=0!
Mã:
Function Gia_tri_k(B, L, Z) As Single  
  Dim i, j As Integer
        i = B / 2
        j = L / 2
    If z = 0 Then
        Gia_tri_k = 1
    Else
        Gia_tri_k = j
    End If
End Function

Trong khi biến i thì cho kết quả đúng (Vd: nếu B=1 thì i=0.5, nhưng L=1 thì j=0!!!)

Nhờ mọi người chỉ giúp với bị sai chỗ nào, mới tập làm quen với VB nên không biết bị sai gì!
Biến i j phải khai báo kiểu Double mới được bạn à (Integer nó là số nguyên cơ mà)
Và hàm của bạn cũng phải trả kết quả và kiểu Double mới được
Mã:
Function Gia_tri_k(B, L, Z) As Double
  Dim i As Double, j As Double
  i = B / 2
  j = L / 2
  If Z = 0 Then
    Gia_tri_k = 1
  Else
    Gia_tri_k = j
  End If
End Function
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom