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:
Upvote 0
Vậy phải xem giá trị của bạn trả về là gì? dùng msgbox thì convert giá trị về string trước.

Dạ giá trị trả về kiểu String ạ,OT cũng đã khai báo một biến txt as string, sau đó gán
txt = Application.Evaluate(ThisWorkbook.Names("MyName").Value)
MsgBox txt
Nhưng vẫn báo lỗi Type mismatch ạ.
 
Upvote 0
Muốn thử thì dùng Debug.Print chứ đừng dùng MsgBox
Sub Thu()
Dim GiaTri
GiaTri = Application.Evaluate(ThisWorkbook.Names("MyName").Value)
Debug.Print GiaTri
End Sub

Chạy code xem thử trong cửa sổ Immediate nó nói gì
 
Upvote 0
Muốn thử thì dùng Debug.Print chứ đừng dùng MsgBox
Sub Thu()
Dim GiaTri
GiaTri = Application.Evaluate(ThisWorkbook.Names("MyName").Value)
Debug.Print GiaTri
End Sub

Chạy code xem thử trong cửa sổ Immediate nó nói gì
Cảm ơn bạn đã quan tâm ạ, code lỗi ngay tại dòng gán này rồi ạ:
GiaTri = Application.Evaluate(ThisWorkbook.Names("MyName").Value)
 
Upvote 0
Debug thì phải thử từ trong ra ngoài chứ.
nếu lỗi ở:
vw = cái gì đó & cái gì đó thứ 2
abc = def( xyz( vw ) )
thì đầu tiên hết phải debug vw, nếu thoả mãn thì tiếp theo là xyz( vw )...
 
Upvote 0
Thử xem:

Debug.print Join(Application.Evaluate(ThisWorkbook.Names("MyName").Value) ) ' Áp dụng khi kết quả trả về dạng array

Hoặc, add watch :

1577507255102.png
 
Lần chỉnh sửa cuối:
Upvote 0
Debug thì phải thử từ trong ra ngoài chứ.
nếu lỗi ở:
vw = cái gì đó & cái gì đó thứ 2
abc = def( xyz( vw ) )
thì đầu tiên hết phải debug vw, nếu thoả mãn thì tiếp theo là xyz( vw )...

Cảm ơn Bác đã quan tâm và chỉ dẫn cho con.

Thử xem:

Debug.print Join(Application.Evaluate(ThisWorkbook.Names("MyName").Value) ) ' Áp dụng khi kết quả trả về dạng array
Dạ code vẫn bị lỗi như cũ Bạn ạ

Name này chỉ trả về một giá trị, ví dụ:
(s.FDATE >= N'201912211') and (s.FDATE <= N'201912241') and (s.BUMO Like N'%BUR-%')

OT làm thử như sau:
Dim txt as string
Range("A1").Value = "=MyName"
txt = Range("A1").Value
Debug.Print txt

Giá trị trả về đúng ý OT ạ:
(s.FDATE >= N'201912211') and (s.FDATE <= N'201912241') and (s.BUMO Like N'%BUR-%')
 
Upvote 0
Dạ giá trị trả về kiểu String ạ,OT cũng đã khai báo một biến txt as string, sau đó gán
txt = Application.Evaluate(ThisWorkbook.Names("MyName").Value)
MsgBox txt
Nhưng vẫn báo lỗi Type mismatch ạ.
Name trong Excel sử dụng Macro4.0 lỗi thời:
Application.ExecuteExcel4Macro(ThisWorkbook.Names("MyName").Value)
 
Upvote 0
Cảm ơn HeSanbi, OT viết:
txt = Application.ExecuteExcel4Macro(ThisWorkbook.Names("MyName").Value)
Debug.Print txt
Code thông báo lỗi tại txt=...
1. ExecuteExcel4Macro chưa được kích hoạt
2. Phương thức Macro4.0 chưa chắc đã gọi được trong VBA.
3. Vì sao không chuyển Name kia thành hẳn VBA?

s.FDate OT hiểu nó như thế nào?

Vì sao phải dùng đến phương thức Execute
 
Upvote 0
1. ExecuteExcel4Macro chưa được kích hoạt
2. Phương thức Macro4.0 chưa chắc đã gọi được trong VBA.
3. Vì sao không chuyển Name kia thành hẳn VBA?

s.FDate OT hiểu nó như thế nào?

Vì sao phải dùng đến phương thức Execute

Dạ "s.FDate" s được gán cho một Bảng trong môi trường SQL còn FDATE là trường của bảng đó ạ.
chuyển Name kia thành hẳn VBA thì viết sao vậy HeSanbi, nhờ bạn giúp đỡ ạ.
 
Upvote 0
Dạ "s.FDate" s được gán cho một Bảng trong môi trường SQL còn FDATE là trường của bảng đó ạ.
chuyển Name kia thành hẳn VBA thì viết sao vậy HeSanbi, nhờ bạn giúp đỡ ạ.
Phương thức Execute Sẽ tìm kiếm Hàm và phương thức đã được khởi tạo trước đó.

Đoạn này là một chuỗi phải không?

(s.FDATE >= N'201912211') and (s.FDATE <= N'201912241') and (s.BUMO Like N'%BUR-%')

s.FDATE và s.BUMO thuộc môi trường SQL đã được tạo để VBA hiểu chưa.

Vậy Execute sẽ tìm s.FDate ở đâu?

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

Khởi tạo toàn bộ kết nối SQL sau đó:

Dim SQL As String
SQL = "(s.FDATE >= N'201912211') and (s.FDATE <= N'201912241') and (s.BUMO Like N'%BUR-%')"


Chuyển đoạn:
"(s.FDATE >= N'"&TEXT(PRODUCTION!$B$2,"yyymmdd")&"1') and (s.FDATE <= N'"&TEXT(PRODUCTION!$B$3,"yyymmdd")&"1')"& IF(PRODUCTION!$F$3<>""," and (s.BUMO Like N'%"&PRODUCTION!$F$3&"%')","")&IF(PRODUCTION!$D$3<>""," and (s.LOTNAME Like N'%" &PRODUCTION!$D$3& "%')","")& IF(PRODUCTION!$D$2<>""," and (s.CODE Like N'%"&PRODUCTION!$D$2& "%')","")&IF(PRODUCTION!$F$2<>""," and (s.PORDER Like N'%"&PRODUCTION!$F$2&"%')","")

Thành:
1. Sửa Range:
PRODUCTION!$B$2​
-> Dim B2 As String: B2 = Application.Text(Worksheets("PRODUCTION").[B2].Value, "yyymmdd")​
2. Sửa Hàm:
TEXT -> Application.Text Hoặc VBA.Format​
IF -> VBA.IFF​

Kết quả:
SQL = "(s.FDATE >= N'" & B2 & ...
 
Upvote 0
Khi thiết lập một câu SQL có nhiều thông số/tham số thì người có kinh nghiệm sẽ không dùng thể loại:
Lệnh & 'tham số 1' & lệnh & tham số 2 & ....
Một đống &, đóng quote mở quote tùm lum. Xác suất viết sai khá cao.

Để tránh viết sai, và cũng dễ đọc câu SQL, người ta dùng cách SQL động giả (emulate) command parameters:
Const SQLCOMMAND = "lệnh <tham1> lệnh <tham2> ..."
SQLstr = Replace(Replace(SQLCOMMAND, "<tham1>", tham số 1), "<tham2>", tham số 2)
Có bao nhiêu tham số thì bấy nhiêu Replace.
Câu SQLCOMMAND đọc dễ hiểu hơn nhiều.
 
Upvote 0
Mong các anh chị giúp đỡ ạ.
Em có đoạn code sưu tầm như dưới, khi em nhập dữ liệu từ ô thì code hoạt động tốt nhưng khi em copy và paste 2 dòng trở lên thì báo lỗi, mong các anh chị giúp đỡ thêm giúp em thuộc tính copy paste, và hướng dẫn em ạ. Em cảm ơn ạ.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nhom, r As Long, rw As Long, c As Long

nhom = Sheet1.Range("c5:d10000").Value
rw = 0

If Target.Column = 5 And Target.Row > 6 Then
For r = 1 To UBound(nhom)
If nhom(r, 2) = Target.Value Then
rw = r
Exit For
End If
Next r

If rw <> 0 Then
Sheet3.Cells(Target.Row, 4).Value = nhom(r, 1)
Else
MsgBox "Khong Co Ten model  Nay"
End If

End If
End Sub
 

File đính kèm

Upvote 0
Mong các anh chị giúp đỡ ạ.
Em có đoạn code sưu tầm như dưới, khi em nhập dữ liệu từ ô thì code hoạt động tốt nhưng khi em copy và paste 2 dòng trở lên thì báo lỗi, mong các anh chị giúp đỡ thêm giúp em thuộc tính copy paste, và hướng dẫn em ạ. Em cảm ơn ạ.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nhom, r As Long, rw As Long, c As Long

nhom = Sheet1.Range("c5:d10000").Value
rw = 0

If Target.Column = 5 And Target.Row > 6 Then
For r = 1 To UBound(nhom)
If nhom(r, 2) = Target.Value Then
rw = r
Exit For
End If
Next r

If rw <> 0 Then
Sheet3.Cells(Target.Row, 4).Value = nhom(r, 1)
Else
MsgBox "Khong Co Ten model  Nay"
End If

End If
End Sub
Code này mà Copy Paste một lần hàng trăm ô thì hơi bị "Rùa".
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Nhom(), Cll As Range, r As Long
    Nhom = Sheet1.Range("c5", Sheet1.Range("d10000").End(xlUp)).Value
If Target.Column = 5 And Target.Row > 6 Then
    For Each Cll In Target
        For r = 1 To UBound(Nhom)
            If Nhom(r, 2) = Cll.Value Then
                Cll.Offset(, -1).Value = Nhom(r, 1)
                Exit For
            End If
        Next r
    Next Cll
End If
End Sub
 
Upvote 0
Giải thích giúp mình đoạn code này
Mã:
ArrData = Sheet1.Range(Sheet1.Cells(10, 126), Sheet1.Cells(&H100000, 2).End(xlUp)).Value

Mình ko hiểu chỗ này: Sheet1.Cells(&H100000, 2) (dấu & có ý nghĩa gì)

Giúp mình giải thích luôn toàn bộ ý nghĩa câu lệnh này, do ko hiểu chỗ dấu & nên ko biết nó muốn thể hiện lệnh nào

Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Giải thích giúp mình đoạn code này
Mã:
ArrData = Sheet1.Range(Sheet1.Cells(10, 126), Sheet1.Cells(&H100000, 2).End(xlUp)).Value

Mình ko hiểu chỗ này: Sheet1.Cells(&H100000, 2) (dấu & có ý nghĩa gì)

Giúp mình giải thích luôn toàn bộ ý nghĩa câu lệnh này, do ko hiểu chỗ dấu & nên ko biết nó muốn thể hiện lệnh nào

Cảm ơn
Bạn có thể cung cấp (truyền) mỗi một giá trị Long bằng 2 cách: nhập số ở dạng thập phân hoặc ở dạng hex (hệ 16). Vd. số 15 ở dạng hex là 0F. Nhưng nhập 15 thì được còn nhập 0F thì không được. Bạn phải thêm tiền tố là &H (H <- Hex) để chỉ ra đó là số ở dạng hex. Tức trong ví dụ là phải nhập - truyền &H0F.

&H100000 (dạng hex) = 1048576 (thập phân).

Vậy thì
Mã:
ArrData = Sheet1.Range(Sheet1.Cells(10, 126), Sheet1.Cells(&H100000, 2).End(xlUp)).Value
tương đương với
Mã:
ArrData = Sheet1.Range(Sheet1.Cells(10, 126), Sheet1.Cells(1048576, 2).End(xlUp)).Value

Sheet1.Cells(10, 126) là ô ở dòng 10 và cột 126, tức ô ở dòng 10 và cột DV, tức là ô DV10 trong Sheet1.

Sheet1.Cells(1048576, 2).End(xlUp) là ô cuối cùng có dữ liệu ở cột 2 - cột B. Diễn giải là: hãy xuất phát từ ô ở dòng 1048576 và cột 2, tức ô B1048576 (thường thì là ô trống) và đi lên trên (xlUp) cho tới khi gặp ô <> trống thì dừng. Muốn xác định ô cuối cùng có dữ liệu trong một cột nào đó thì ô xuất phát - ô B1048576 trong ví dụ phải rỗng. Thường thì những ô ở những dòng cuối cùng của trang tính là rỗng nên có thể yên tâm.

Lúc này thì
Mã:
ArrData = Sheet1.Range(Sheet1.Cells(10, 126), Sheet1.Cells(&H100000, 2).End(xlUp)).Value

có nghĩa là: lấy vùng dữ liệu (lấy giá trị) xác định bởi DV10 và ô cuối cùng có dữ liệu ở cột B từ Sheet1 vào mảng ArrData
------------
Sheet1.Cells(1048576, 2).End(xlUp) có thể thay bằng Sheet1.Cells(Rows.Count, 2).End(xlUp) hoặc
Sheet1.Range("B" & 1048576).End(xlUp) hoặc Sheet1.Range("B" & Rows.Count).End(xlUp), bởi Rows.Count trong Excel >= 2007 trả về giá trị 1048576 (số dòng trong trang tính)
---------
Bạn có thể định nghĩa hằng số theo 2 cách tương đương như sau:

Const MySecretNumber = 15
Const MySecretNumber = &H0F
 
Upvote 0
Web KT

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

Back
Top Bottom