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:
nhờ các anh chỉ giúp cách lấy địa chỉ cell

em lên mạng tìm mãi nhưng không thấy điều cần tìm và tại đây em thấy nó gần giống nên em hỏi luôn các bác ai biết thì chỉ giùm em với nhe
em có biến B và khi msgbox "cell là" & B
thì nó cho em là r5c6
vạy tại cell hiện tại activecell.value = rang(b).value thì em phải làm sao để tách được 5,6 để làm trong công thức activecell.value = rang(r5c6).value
 
Upvote 0
Nhờ các bạn giúp tôi câu lệnh xoá dấu kiểm trong Match entire cell contents. Thanks!
 

File đính kèm

  • Find2.rar
    109.8 KB · Đọc: 24
Upvote 0
Lần sau bạn dùng chức năng Record Macro để ghi lại rồi tham khảo câu lệnh của chính Excel nó thực hiện rồi vận dụng vào trường hợp của mình. Ví dụ mình ghi ở đây

Mã:
[B][COLOR=Red]Cells.Find(What:="c"[/COLOR][/B], After:=ActiveCell, LookIn:=xlFormulas, [B][COLOR=Blue]LookAt:= _
        xlWhole[/COLOR][/B], SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Activate

Mã:
[B][COLOR=Red]Cells.Find(What:="c"[/COLOR][/B], After:=ActiveCell, LookIn:=xlFormulas,[COLOR=Blue][B] LookAt:= _
        xlPart[/B][/COLOR], SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Activate

Trong 2 câu lệnh Find trên thì đoạn màu đỏ là bắt buộc, phần còn lại nếu không có thì thực hiện theo mặc định.
Đoạn màu xanh chính là yêu cầu của bạn, đoạn 1 là có dấu kiểm và đoạn 2 là xoá dấu kiểm
 
Upvote 0
Cố định hàm today()

Các bạn viết cho mình code như sau nhé: nếu tại cột G ghi bất cứ thông tin gì thì cột H tương ứng sẽ ghi thời gian (ngày tháng + giờ) ghi dữ liệu.
Nếu dùng hàm today() bằng công thức thì sẽ được nhưng thời gian bị thay đổi liên tục. Vì vậy tôi muốn dùng code để cố định nó lại.

Thời gian trước đã có bạn viết cho mình code này rồi nhưng do máy bị virus va diễn đàn thay đổi giao diện nên giờ không thể tìm lại nữa. Các bạn viết lại giùm nhé! Thanks!
 
Upvote 0
Các bạn viết cho mình code như sau nhé: nếu tại cột G ghi bất cứ thông tin gì thì cột H tương ứng sẽ ghi thời gian (ngày tháng + giờ) ghi dữ liệu.
Nếu dùng hàm today() bằng công thức thì sẽ được nhưng thời gian bị thay đổi liên tục. Vì vậy tôi muốn dùng code để cố định nó lại.

Thời gian trước đã có bạn viết cho mình code này rồi nhưng do máy bị virus va diễn đàn thay đổi giao diện nên giờ không thể tìm lại nữa. Các bạn viết lại giùm nhé! Thanks!
Bạn cần phải nói rõ thêm vài điểm:
- Nếu có thay đổi dữ liệu tại cột G thì có cần cập nhật lại thời gian cho cột H hay không?
- Nếu xóa dữ liệu tại cột G thì có cần xóa luôn dữ liệu ở cột H không?
 
Upvote 0
Có chứ ạ, nếu thay đổi tại cột G thì sẽ cập nhật lại dữ liệu tại cột H. Còn nếu xoá dữ liệu tại cột G thì không cần phải thay đổi. Trong mọi trường hợp thì cột H vẫn có thể thay đổi bằng tay được. Cám ơn anh!
 
Upvote 0
Có chứ ạ, nếu thay đổi tại cột G thì sẽ cập nhật lại dữ liệu tại cột H. Còn nếu xoá dữ liệu tại cột G thì không cần phải thay đổi. Trong mọi trường hợp thì cột H vẫn có thể thay đổi bằng tay được. Cám ơn anh!
Thì dùng code này thử xem:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  If Not Intersect([G:G], Target) Is Nothing Then
    For Each Clls In Target
      If Clls <> "" Then Clls(, 2) = Now
      Clls(, 2).NumberFormat = "dd/mm/yyyy hh:mm:ss"
    Next
  End If
End Sub
 
Upvote 0
Hình như bạn chỉ cần cập nhật 1 ô thuộc cột 'H' liền kề mà thôi?!

Các bạn viết cho mình code như sau nhé: nếu tại cột G ghi bất cứ thông tin gì thì cột H tương ứng sẽ ghi thời gian (ngày tháng + giờ) ghi dữ liệu.
Nếu dùng hàm today() bằng công thức thì sẽ được nhưng thời gian bị thay đổi liên tục. Vì vậy tôi muốn dùng code để cố định nó lại.

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Columns("G:G")) Is Nothing Then
   If Target.Count = 1 And Target.Value <> "" Then
      Target.Offset(, 1).Value = CStr(Format(Date, "MM/dd/yyyy hh"))
 End If:      End If
End Sub
 
Upvote 0
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Columns("G:G")) Is Nothing Then
   If Target.Count = 1 And Target.Value <> "" Then
      Target.Offset(, 1).Value = CStr(Format(Date, "MM/dd/yyyy hh"))
 End If:      End If
End Sub
Code này không được đâu sư phụ ơi ---> Vì còn trường hợp người ta copy từ nơi khác paste vào cột G, hoặc kéo fill trên cột G thì sao?
Túm lại, em nghĩ phải vòng lập For mới xong!
 
Upvote 0
Anh Ndu sửa lại giúp em với. Khi em xoá đi hoặc thêm vào một dòng thì bị báo lỗi. Nếu thêm một dòng thì không ảnh hưởng gì nhiều nhưng nếu xoá đi một dòng thì toàn bộ dữ liệu của dòng phía trên bị thay đổi hết.
 
Upvote 0
Anh Ndu sửa lại giúp em với. Khi em xoá đi hoặc thêm vào một dòng thì bị báo lỗi. Nếu thêm một dòng thì không ảnh hưởng gì nhiều nhưng nếu xoá đi một dòng thì toàn bộ dữ liệu của dòng phía trên bị thay đổi hết.
Bạn thêm On Error GoTo Thoat ở đâu code thử xem!
Tức là vầy:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error GoTo Thoat
  If Not Intersect([G:G], Target) Is Nothing Then
    For Each Clls In Target
      If Clls <> "" Then Clls(, 2) = Now
      Clls(, 2).NumberFormat = "dd/mm/yyyy hh:mm:ss"
    Next
  End If
Thoat:
End Sub
Gặp lổi sẽ thoát ngay, không làm gì cả! Đúng chứ?
 
Upvote 0
Không phải vậy đâu ah. Anh làm thế nào để khi insert hoặc delete một hoặc nhiều dòng sẽ như lúc bình thường khi chưa có code này. Thanks!

Em da thu code moi cua anh, no khong bao loi nua. Khi them dong thi ok nhung neu trong nhieu dong lien tiep ma xoa di mot so dong se bi loi (toan bo cac cot phia sau cot H cua dong vua xoa se xuat hien ngay gio).
 
Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia thêm Code của Ndu có 2 điểm:
1/ Nên dùng lệnh Find "*" hiệu quả và tốc độ cao hơn.
2/Nó Reset lại toàn bộ thời gian cột H chứ không phải ở dòng tương ứng. Nhập từng ô thì đơn giản nhưng Paste hay Fill thì thật khó. Phải tìm ra các ô thay đổi để thay đổi giờ tương ứng
 
Upvote 0
Không phải vậy đâu ah. Anh làm thế nào để khi insert hoặc delete một hoặc nhiều dòng sẽ như lúc bình thường khi chưa có code này. Thanks!

Em da thu code moi cua anh, no khong bao loi nua. Khi them dong thi ok nhung neu trong nhieu dong lien tiep ma xoa di mot so dong se bi loi (toan bo cac cot phia sau cot H cua dong vua xoa se xuat hien ngay gio).
Đúng là sự cố này rắc rối thật... cũng may còn có INTERSECT
Ẹc... Ẹc...
Thử code này xem:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error GoTo Thoat
  If Not Intersect([G:G], Target) Is Nothing Then
    For Each Clls In Target
      If Clls <> "" Then
        With Intersect(Clls, [G:G]).Offset(, 1)
          .Value = Now
          .NumberFormat = "dd/mm/yyyy hh:mm:ss"
        End With
      End If
    Next
  End If
Thoat:
End Sub
 

File đính kèm

  • AutoAddDate.xls
    19 KB · Đọc: 24
Upvote 0
Em có file dữ liệu có 2 cột A, B chiều dài dữ liệu chứa trong 2 cột đó thì đa phần là 12 nhưng cũng có vài ô có chiều dài khác 12. Vậy em muốn delete hoặc xoá những ô có chiều dài không phải 12 thì mình dùng code như thế nào em nghĩ mình nên dùng vòng lặp mà không biết dùng như thế nào mong Anh Chị trên diễn đàn giúp đỡ. Thanks
 
Upvote 0
Em có file dữ liệu có 2 cột A, B chiều dài dữ liệu chứa trong 2 cột đó thì đa phần là 12 nhưng cũng có vài ô có chiều dài khác 12. Vậy em muốn delete hoặc xoá những ô có chiều dài không phải 12 thì mình dùng code như thế nào em nghĩ mình nên dùng vòng lặp mà không biết dùng như thế nào mong Anh Chị trên diễn đàn giúp đỡ. Thanks

Dùng hàm tự tạo này

Mã:
Function XoaCell(Rng As Range)
    Dim Cll As Range
    For Each Cll In Rng.Cells
        If Len(Cll) <> 12 Then Cll.ClearContents
    Next
End Function
 
Upvote 0
Dùng hàm tự tạo này

Mã:
Function XoaCell(Rng As Range)
    Dim Cll As Range
    For Each Cll In Rng.Cells
        If Len(Cll) <> 12 Then Cll.ClearContents
    Next
End Function
Ngộ nha! UDF mà cũng làm được công việc "dọn rác" sao ta?
Bạn làm vào file rồi đưa lên đây xem thử ---> Vụ này tôi chưa thấy bao giờ!
Chứ tôi thì dùng cách nông dân hơn:
- Tạo 1 cột phụ với hàm LEN
- AutoFilter cột phụ này theo điều kiện gì đó
- Xóa dòng không cần thiết
Thế thôi!
 
Upvote 0
Ngộ nha! UDF mà cũng làm được công việc "dọn rác" sao ta?
Bạn làm vào file rồi đưa lên đây xem thử ---> Vụ này tôi chưa thấy bao giờ!
Chứ tôi thì dùng cách nông dân hơn:
- Tạo 1 cột phụ với hàm LEN
- AutoFilter cột phụ này theo điều kiện gì đó
- Xóa dòng không cần thiết
Thế thôi!
To Anh Ndu
Nếu mình dùng macro được không anh, mình chỉ delete dữ liệu trong những ô của 2 cột A, B thôi (giống như mình chọn những ô có dữ liệu chiều dài khác 12 nhấn
chuột phải chọn delete > shift cell up vầy đó) còn dữ liệu ở mấy cột khác có nếu có chiều dài khác 12 thì giữ nguyên không được delete. Em dùng record macro mà làm không được
To Bạn Minh Nguyệt Cảm ơn bạn quan tâm nhưng đoạn code bạn mình sử dụng không được
 
Lần chỉnh sửa cuối:
Upvote 0
To Anh Ndu
Nếu mình dùng macro được không anh, mình chỉ delete dữ liệu trong những ô của 2 cột A, B thôi (giống như mình chọn những ô có dữ liệu chiều dài khác 12 nhấn
chuột phải chọn delete > shift cell up vầy đó) còn dữ liệu ở mấy cột khác có nếu có chiều dài khác 12 thì giữ nguyên không được delete. Em dùng record macro mà làm không được
To Bạn Minh Nguyệt Cảm ơn bạn quan tâm nhưng đoạn code bạn mình sử dụng không được

Bạn chép đạn code trên vào một modul. Bạn muốn xoá dữ liệu ở Sheet1 thì làm một commandbutton có tên là Xoa(cho đơn giản) trên Sheet1 rồi ghi sự kiện click của nó như sau
Mã:
Private Sub Xoa_Click()
     Call XoaCell(Range("A1:B20")
End Sub
UDF này chỉ xoá nội dung trong ô mà không delete ô. Bạn muốn delete ô theo kiểu shift ceel up thi thay câu Cll.ClearContents bằng Cll.Delete Shift:=xlUp
Ngộ nha! UDF mà cũng làm được công việc "dọn rác" sao ta?
Bạn làm vào file rồi đưa lên đây xem thử ---> Vụ này tôi chưa thấy bao giờ!
Chứ tôi thì dùng cách nông dân hơn:
- Tạo 1 cột phụ với hàm LEN
- AutoFilter cột phụ này theo điều kiện gì đó
- Xóa dòng không cần thiết
Thế thôi!
Cái hàm này giống như cách của thầy vậy đó. Thầy xem thử nha
 

File đính kèm

  • XoaCell.xls
    31.5 KB · Đọc: 16
Lần chỉnh sửa cuối:
Upvote 0
Bạn chép đạn code trên vào một modul. Bạn muốn xoá dữ liệu ở Sheet1 thì làm một commandbutton có tên là Xoa(cho đơn giản) trên Sheet1 rồi ghi sự kiện click của nó như sau
Mã:
Private Sub Xoa_Click()
     Call XoaCell(Range("A1:B20")
End Sub
Cái hàm này giống như cách của thầy vậy đó
Vậy không ăn thua đâu (bạn thử sẽ biết liền)
Có chăng thì phải vầy:
PHP:
Sub XoaCell()
  Dim Cll As Range, TempRng As Range
  For Each Cll In Range("A1:A20")
    If Len(Cll) <> 12 Then
      If TempRng Is Nothing Then
        Set TempRng = Cll
      Else
        Set TempRng = Union(TempRng, Cll)
      End If
    End If
  Next
  TempRng.Delete
End Sub
Thay TempRng.Delete thành TempRng.EntireRow.Delete nếu muốn xóa nguyên dòng
 
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