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:
Mình sử dụng code bên dưới để copy vùng dữ liệu từ sheet1 sang sheet2., nhưng code không hoạt động. Nhờ anh chị chỉ giúp lỗi.
Cảm ơn.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Sheets("TKB").Range("C46:G53"), Target) Is Nothing Then
Sheets("1A").Range("C5:G12").Value = Sheets("TKB").Range("C46:G53").Value
End If
End Sub
 
Upvote 0
Application.EnableEvents = False
Application.EnableEvents = True
Chào các bác, cho em hỏi khi mình muốn dừng các sự kiện của worksheet thì dùng 2 câu lệnh trên,
Vậy trong userform thì mình dùng lệnh nào tương ứng ạ, ví dụ trong TextBox1_Change ạ.
 
Upvote 0
Application.EnableEvents = False
Application.EnableEvents = True
Chào các bác, cho em hỏi khi mình muốn dừng các sự kiện của worksheet thì dùng 2 câu lệnh trên,
Vậy trong userform thì mình dùng lệnh nào tương ứng ạ, ví dụ trong TextBox1_Change ạ.
Bạn sử dụng BeforeUpdate thay cho Change.
 
Upvote 0
Bạn sử dụng BeforeUpdate thay cho Change.
Đâu phải trường hợp nào cũng thay thế được đâu bạn.
Application.EnableEvents = False
Application.EnableEvents = True
Chào các bác, cho em hỏi khi mình muốn dừng các sự kiện của worksheet thì dùng 2 câu lệnh trên,
Vậy trong userform thì mình dùng lệnh nào tương ứng ạ, ví dụ trong TextBox1_Change ạ.
Bạn sử dụng 1 biến để bật tắt sự kiện.
Mã:
Private Sub TextBox1_Change()
Static bDisableEvents As Boolean
If Not bDisableEvents Then
    bDisableEvents = True
    '...
    '...
    '...
    bDisableEvents = False
End If
End Sub
 
Upvote 0
Mọi người cho mình hỏi, trong công thức VBA, cũng là tên sheet như mình thấy có lúc người ta đặt trong dấu nháy đơn, có lúc không dùng, vì sao vậy ạ?

ActiveCell.FormulaR1C1 = "='ban 1'!RC+ban2!RC"

Tại 2 vị trí in đậm. Đây là công thức chạy đúng. Ban 1 Ban2 là tên 2 sheet tồn tại.
 
Lần chỉnh sửa cuối:
Upvote 0
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

  • tim kiem.xlsm
    877.3 KB · Đọc: 13
Upvote 0
Web KT
Back
Top Bottom