Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em chào Anh Chị,
Em đang học code. Em thấy trong phần khai báo biến mảng mọi người hay dùng TmpArr as Variant. Vậy Tmp là viết tắt của cụm từ gì? Mong A/C chỉ bảo!
 
Upvote 0
Bạn cứ nghĩ đó là rút gọn của từ Temp đi cũng được!
:D
 
Upvote 0
Upvote 0
Chào mọi người.
Công thức của Excel của em nó là như này:
Mã:
=IF(D21="",0,PRODUCT(IFERROR(TRIM(MID(SUBSTITUTE(" " & TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D21,"m",""),"t",""),"x"," "))," ",REPT(" ",99)),99*ROW($1:$10),99))*1,1)))
E viết vào VBA dạng như này:
Mã:
"=IF(D21="""",0,PRODUCT(IFERROR(TRIM(MID(SUBSTITUTE("" "" & TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D21,""m"",""""),""t"",""""),""x"","" "")),"" "",REPT("" "",99)),99*ROW($1:$10),99))*1,1)))""
Nhưng khi chạy code thì nó ra công thức như này, giống nhau hết, nhưng dư ký tự @ trước hàm row:
Mã:
=IF(D21="",0,PRODUCT(IFERROR(TRIM(MID(SUBSTITUTE(" " & TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D21,"m",""),"t",""),"x"," "))," ",REPT(" ",99)),99*(@ROW($1:$10)),99))*1,1)))

Mọi người cho em hỏi là vì sao vậy ạ, và có thể sửa như thế nào ạ?
 
Upvote 0
Em chào A/C,
Em có thực hành thử đoạn code copy công thức ở hàng D2:E2 rồi dán công thức vào các ô từ D3:E10. Nhưng khi code chạy đến đoạn copy công thức thì đang bị sai tọa độ dòng.
- Ở dòng 2 công thức D2 =B2*C2
- Khi code copy xuống dòng 3 thì công thức D3 = B2*C2 bị sai tọa độ dòng (đúng thì nó phải là =B3*C3)

Mã:
Sub ThanhTien()
Dim i As Integer
i = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
Sheet1.Range("D3:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Sheet1.Range("D3:E" & i).Value = Sheet1.Range("D3:E" & i).Value
End Sub

Em sửa code như này thì code chạy đúng dòng: Sheet1.Range("D2:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Em muốn hỏi thêm A/C còn có giải pháp nào thêm nữa ko ạ. Tks Anh Chị nhiều!
1601722762093.png
 
Upvote 0
Em chào A/C,
Em có thực hành thử đoạn code copy công thức ở hàng D2:E2 rồi dán công thức vào các ô từ D3:E10. Nhưng khi code chạy đến đoạn copy công thức thì đang bị sai tọa độ dòng.
- Ở dòng 2 công thức D2 =B2*C2
- Khi code copy xuống dòng 3 thì công thức D3 = B2*C2 bị sai tọa độ dòng (đúng thì nó phải là =B3*C3)

Mã:
Sub ThanhTien()
Dim i As Integer
i = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
Sheet1.Range("D3:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Sheet1.Range("D3:E" & i).Value = Sheet1.Range("D3:E" & i).Value
End Sub

Em sửa code như này thì code chạy đúng dòng: Sheet1.Range("D2:E" & i).Formula = Sheet1.Range("D2:E2").Formula
Em muốn hỏi thêm A/C còn có giải pháp nào thêm nữa ko ạ. Tks Anh Chị nhiều!
View attachment 246697
Bạn thử:
PHP:
With Sheet1
        .Range("D2").FormulaR1C1 = "=RC[-2]*RC[-1]"
        .Range("d2:d" & .Range("A" & Rows.Count).End(xlUp).Row).FillDown
    End With
 
Upvote 0
Bạn thử:
PHP:
With Sheet1
        .Range("D2").FormulaR1C1 = "=RC[-2]*RC[-1]"
        .Range("d2:d" & .Range("A" & Rows.Count).End(xlUp).Row).FillDown
    End With
Cái này chỉ cần 1 dòng:
PHP:
Sheet1.Range("d2:d" & Sheet1.Range("A" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=RC[-2]*RC[-1]"
 
Upvote 0
Em chào A/C,

Hiện tại em muốn extract date dựa trên kết quả Find. Code hiện tại như sau:

Sub Findingthelastregistrationdates()
Sheet1.Select

For X = 1 To 11
Rng = Sheets("Reference").Cells(131 + X, 8).Value
If Not Rng = "0" Or Rng = "" Then
Cells.Find(What:=Rng, After:=Range("A1"), LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Select
ActiveCell.Offset(0, 9).Value = ActiveCell
End If
Next
End Sub

Vấn đề là Excel ko tìm thấy kết quả như của dòng code:
1602505925740.png
Như ở hình trên thì đang ở Cell H137 của sheet Reference:
1602506357772.png

Nhưng em đã thử find manual thì vẫn tìm thấy date là 13/08/2019:
1602506117312.png
Mong các a/c giúp đỡ ạ.
 

File đính kèm

  • 1602506314316.png
    1602506314316.png
    71.5 KB · Đọc: 1
Upvote 0
Thứ nhất: Bạn xài phương thức FIND() như câu lệnh là không chắc chắn & nguy cơ sẽ dẫn bạn đến lỗi 1 khi không tìm ra ô có chứa dữ liệu cần tìn
Muốn phòng ngừa lỗi cần phải viết chân phương hơn.

Thứ hai: Khi tìm một trị kiểu Ngày-tháng-năm, vùng tìm & ngày cần tìm phải ở dạng "MM/DD/YYYY" trước khi FIND()

Bạn thử nghiền ngẫm hàm này 1 hồi xem sao:
PHP:
Function NgayKT(Rng As Range) As Date
Dim Dem As Integer, J As Integer, W As Integer, Dat As Date
Dim sRng As Range

If UCase$(Rng(1).Value) = "X" Then
    If UCase$(Rng(4).Value) = "NT" Then
        Dem = 5
    ElseIf UCase$(Rng(4).Value) = "NGT" Then
        Dem = 7
    End If   
    For J = 0 To 35
        Dat = Rng(5).Value + J
        Set sRng = Range("NgayLe").Find(Format(Rng(5), "MM/DD/yyyy"), , xlValues, xlWhole)
        If Weekday(Dat) > 1 Or sRng Is Nothing Then
            Dem = Dem - 1
            If Dem = 0 Then
                NgayKT = Dat:           Exit Function
            End If
        End If
    Next J
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
em muốn nhờ các anh làm giúp em form tìm kiếm từ số thẻ hiện lên thông tin của nhân viên trong danh sách, gồm có nhóm máu... sức khỏe theo từng năm, em làm quản lý hồ sơ sức khỏe mong các a chị giúp đỡ
 

File đính kèm

Upvote 0
Thứ nhất: Bạn xài phương thức FIND() như câu lệnh là không chắc chắn & nguy cơ sẽ dẫn bạn đến lỗi 1 khi không tìm ra ô có chứa dữ liệu cần tìn
Muốn phòng ngừa lỗi cần phải viết chân phương hơn.

Thứ hai: Khi tìm một trị kiểu Ngày-tháng-năm, vùng tìm & ngày cần tìm phải ở dạng "MM/DD/YYYY" trước khi FIND()

Bạn thử nghiền ngẫm hàm này 1 hồi xem sao:
PHP:
Function NgayKT(Rng As Range) As Date
Dim Dem As Integer, J As Integer, W As Integer, Dat As Date
Dim sRng As Range

If UCase$(Rng(1).Value) = "X" Then
    If UCase$(Rng(4).Value) = "NT" Then
        Dem = 5
    ElseIf UCase$(Rng(4).Value) = "NGT" Then
        Dem = 7
    End If  
    For J = 0 To 35
        Dat = Rng(5).Value + J
        Set sRng = Range("NgayLe").Find(Format(Rng(5), "MM/DD/yyyy"), , xlValues, xlWhole)
        If Weekday(Dat) > 1 Or sRng Is Nothing Then
            Dem = Dem - 1
            If Dem = 0 Then
                NgayKT = Dat:           Exit Function
            End If
        End If
    Next J
End If
End Function
Thanks bác,
Sau khi kiểm tra lại thì vấn đề nằm ở chỗ các dữ liệu Date là dữ liệu actual Date được Excel ghi nhận dưới dạng 1 con số nhất định tương ứng với từng thời điểm, trong khi dữ liệu Date của sheet Reference lại là dạng string. Sau khi convert dữ liệu Date về string, code đã hoạt động ổn định.
 
Upvote 0
Hi các bác,

Hiện tại em đang gặp phải lỗi Run time error 1004:
Picture 1.JPG
Phía dưới là dòng code lỗi:
Picture 2.JPG
Tại thời điểm xảy ra lỗi này là loop X = 3 và ActiveCell là "R5". Các bác giúp em lỗi này với ạ ?
 
Upvote 0
Nửa đêm mà chơi quả hình đau mắt quá.
SheetA.Range(Cells(1, 1), Cells(2, 2)) lỗi khi SheetA không phải là sheet hiện hành.
 
Upvote 0
Nửa đêm mà chơi quả hình đau mắt quá.
SheetA.Range(Cells(1, 1), Cells(2, 2)) lỗi khi SheetA không phải là sheet hiện hành.
Nếu muỗn trích xuất dữ liệu từ 1 sheet khác để tính toán cho ActiveCell của sheet hiện hành thì phải code thế nào hả bác ?
Như phía trên thì đang trích xuất theo loop cho hàm Sum từ Cells(4 * X - 3,16) cho đến Cells(4 * X,16) của sheet "Reference"
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu muỗn trích xuất dữ liệu từ 1 sheet khác để tính toán cho ActiveCell của sheet hiện hành thì phải code thế nào hả bác ?
Như phía trên thì đang trích xuất theo loop cho hàm Sum từ Cells(4 * X - 3,16) cho đến Cells(4 * X,16) của sheet "Reference"
Nên viết rõ ràng, tường minh. Đặc biệt là khi code rối như tơ vò và khó nhận biết ở từng thời điểm thì sheet nào, cell nào đang active.
Trong vd. kiểu SheetA.Range(Cells(1, 1), Cells(2, 2)) thì dụng ý Cells(1, 1) và Cells(2, 2) thuộc sheet nào? Nếu dụng ý là thuộc sheetA mà sheetA ở thời điểm đó không active thi TEO rồi. Vì viết không tường minh kiểu đó thì Cells(1, 1) và Cells(2, 2) thuộc ActiveSheet. TEO có nghĩa là thậm chí nếu không có lỗi thì kết quả cũng là từ trên trời rớt xuống.

Nếu là lấy dữ liệu từ Reference thì
Mã:
Sheets("Reference").Range(Sheets("Reference").Cells(4 * X - 3, 16), Sheets("Reference").Cells(4 * X, 16))

hoặc

With Sheets("Reference")
    .Range(.Cells(4 * X - 3, 16), .Cells(4 * X, 16))
End With

Nên nhớ là với những vấn đề kiểu này thì không chỉ đính kèm ảnh. Ảnh chỉ để xem cho sướng mắt thôi. Mà ảnh kiểu này thì xem đau mắt chứ sướng gì.
 
Upvote 0
Nên viết rõ ràng, tường minh. Đặc biệt là khi code rối như tơ vò và khó nhận biết ở từng thời điểm thì sheet nào, cell nào đang active.
Trong vd. kiểu SheetA.Range(Cells(1, 1), Cells(2, 2)) thì dụng ý Cells(1, 1) và Cells(2, 2) thuộc sheet nào? Nếu dụng ý là thuộc sheetA mà sheetA ở thời điểm đó không active thi TEO rồi. Vì viết không tường minh kiểu đó thì Cells(1, 1) và Cells(2, 2) thuộc ActiveSheet. TEO có nghĩa là thậm chí nếu không có lỗi thì kết quả cũng là từ trên trời rớt xuống.

Nếu là lấy dữ liệu từ Reference thì
Mã:
Sheets("Reference").Range(Sheets("Reference").Cells(4 * X - 3, 16), Sheets("Reference").Cells(4 * X, 16))

hoặc

With Sheets("Reference")
    .Range(.Cells(4 * X - 3, 16), .Cells(4 * X, 16))
End With

Nên nhớ là với những vấn đề kiểu này thì không chỉ đính kèm ảnh. Ảnh chỉ để xem cho sướng mắt thôi. Mà ảnh kiểu này thì xem đau mắt chứ sướng gì.
Em đã thử viết như trên nhưng nó vẫn báo lỗi :(
range("J10").Value = Application.WorksheetFunction.Sum(Sheets("Reference").range(Sheets("Reference").Cells(4 * X - 3, 16), Sheets("Reference").Cells(4 * X, 16)))
Vẫn là Run time error 1004
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom