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:
Xin lỗi, chính xác là Cells(r, a).Value = 0 không chạy
"không chạy" tức là sao?
hỏi mà đưa chi tiết nhỏ giọt vậy ai trả lời nổi?

Đoán già đoán non (*):
Đây là 1 hàm. Người hỏi không hề cho biết hàm được dùng/gọi ở đâu và tham số được nạp vào là gì.
Dựa vào cái lệnh Application.ThisCell thì đoán mò là hàm UDF, được áp dụng vào một cell hay range (hàm mảng) nào đó trên sheet.
Mà luật của hàm UDF thì đương nhiên là không cho sửa bảng tính rồi.

(*) bản thân tôi không thích đoán mò. Tôi chỉ cốt ý giải thích cho bạn ở bài #1591 thôi
 
Upvote 0
"không chạy" tức là sao?
hỏi mà đưa chi tiết nhỏ giọt vậy ai trả lời nổi?

Đoán già đoán non (*):
Đây là 1 hàm. Người hỏi không hề cho biết hàm được dùng/gọi ở đâu và tham số được nạp vào là gì.
Dựa vào cái lệnh Application.ThisCell thì đoán mò là hàm UDF, được áp dụng vào một cell hay range (hàm mảng) nào đó trên sheet.
Mà luật của hàm UDF thì đương nhiên là không cho sửa bảng tính rồi.

(*) bản thân tôi không thích đoán mò. Tôi chỉ cốt ý giải thích cho bạn ở bài #1591 thôi
Cám ơn bạn.
Mình có 1 bài như file đính kèm, thử đoạn code trên nhưng chưa được, bạn có thể giúp đỡ đc ko?
 

File đính kèm

  • Book1.xlsm
    15.6 KB · Đọc: 6
Upvote 0
Có hai kiểu nói chuyện mà tôi từ chối, thứ nhất là dùng tiếng Tây và thứ hai là dùng ngôn ngữ tét - viết tắt tùm lum.
 
Upvote 0
Xin chào các bạn,
Khi Oanh Thơ khai báo 1 hằng,ví dụ :
Public Const Var2 = 20
Có code nào sau khi chạy thì dòng trên sẽ chuyển thành dòng sau không?
Public Const Var2 = 25
 
Upvote 0
Lý do tại sao bạn muốn nó là hằng?
Từ tên đến bản chất, cái bạn muốn là biến mà!
 
Upvote 0
Lý do tại sao bạn muốn nó là hằng?
Từ tên đến bản chất, cái bạn muốn là biến mà!
Chào Bác VetMini,
Dạ, tại vì cháu muốn sử dụng rộng ở các module khác nên cháu khai báo chung như vậy.
Nhưng trong trường hợp nào đó cháu muốn nó thay đổi nên cháu hỏi để hiểu thêm ạ.
Cháu đặt tên như vậy là vì cháu đã xem các bài viết ở bài viết này:
https://www.giaiphapexcel.com/diendan/threads/bài-4-biến-trong-vba.130732/#post-891460

nên cháu copy qua bên này luôn ạ, cháu nghĩ nếu hỏi bên chủ đề đó sẽ không tiện lắm ạ.
Cháu hỏi chỉ để tham khảo chưa có mục đích gì ạ.

Cháu Cảm ơn Bác VetMini đã quan tâm.
Nếu có cách bào Bác chỉ cho cháu ạ.
 
Upvote 0
Xin chào các bạn,
Khi Oanh Thơ khai báo 1 hằng,ví dụ :
Public Const Var2 = 20
Có code nào sau khi chạy thì dòng trên sẽ chuyển thành dòng sau không?
Public Const Var2 = 25
constant = bất biến, không thay đổi. Nếu được như trên thì hóa ra Var2 là hằng "nhái" à?

Hay là tôi không cập nhật thông tin?
 
Upvote 0
constant = bất biến, không thay đổi. Nếu được như trên thì hóa ra Var2 là hằng "nhái" à?

Hay là tôi không cập nhật thông tin?
Hình như cô ta muốn khởi trị. Biến VBA trước khi khởi trị thì nó có mặc định (0 cho số).

Nếu muốn vậy thì làm như sau:

Public Var1 As Integer
Public Var2 As Integer
...

Public Sub KhoiTri()
Var1 = 20
Var2 = 21
...
End Sub

Trong sự kiện Workbook_Open, đặt thêm câu này ngay đầu hàm:
KhoiTri

Sau đó, muốn thay đổi nó ở đâu tuỳ thích.

Chú: bản chất của Const là không thay đổi. Người đọc code LUÔN LUÔN tin rằng nó không bao giờ thay đổi.
Nếu, với một thủ thuật vặn vẹo nào đó mà bạn thay đổi được nó thì có phải bạn tự làm mất niềm tin của người khác chăng?
 
Upvote 0
constant = bất biến, không thay đổi. Nếu được như trên thì hóa ra Var2 là hằng "nhái" à?

Hay là tôi không cập nhật thông tin?

Bác!
Dạ, vâng cháu hiểu rồi khi đã khai báo và gán cho hằng một giá trị nhất định thì không thể thay đổi được ạ.
Cảm ơn Bác nhiều ạ.
 
Upvote 0
Hình như cô ta muốn khởi trị. Biến VBA trước khi khởi trị thì nó có mặc định (0 cho số).

Nếu muốn vậy thì làm như sau:

Public Var1 As Integer
Public Var2 As Integer
...

Public Sub KhoiTri()
Var1 = 20
Var2 = 21
...
End Sub

Trong sự kiện Workbook_Open, đặt thêm câu này ngay đầu hàm:
KhoiTri

Sau đó, muốn thay đổi nó ở đâu tuỳ thích.

Chú: bản chất của Const là không thay đổi. Người đọc code LUÔN LUÔN tin rằng nó không bao giờ thay đổi.
Nếu, với một thủ thuật vặn vẹo nào đó mà bạn thay đổi được nó thì có phải bạn tự làm mất niềm tin của người khác chăng?
cháu tưởng là khi biến vào 1 chương trình con thì nó có thể nhận giá trị của chương trình con đó khi thoát ra ngoài chương trình thì nó lại trở về giá trị biến toàn cục nhỉ bac.
 
Upvote 0
Hình như cô ta muốn khởi trị. Biến VBA trước khi khởi trị thì nó có mặc định (0 cho số).

Nếu muốn vậy thì làm như sau:

Public Var1 As Integer
Public Var2 As Integer
...

Public Sub KhoiTri()
Var1 = 20
Var2 = 21
...
End Sub

Trong sự kiện Workbook_Open, đặt thêm câu này ngay đầu hàm:
KhoiTri

Sau đó, muốn thay đổi nó ở đâu tuỳ thích.

Chú: bản chất của Const là không thay đổi. Người đọc code LUÔN LUÔN tin rằng nó không bao giờ thay đổi.
Nếu, với một thủ thuật vặn vẹo nào đó mà bạn thay đổi được nó thì có phải bạn tự làm mất niềm tin của người khác chăng?

Chú: bản chất của Const là không thay đổi. Người đọc code LUÔN LUÔN tin rằng nó không bao giờ thay đổi.
Đây là vấn đề cháu muốn hỏi ạ.
ý cháu khi đã gán hằng một giá trị riêng biệt ở một module khác thì có các nào thay đổi giá trị đó được không giống như mình phải mở cửa sổ alt+f11 lên và tìm đến giá trị đó xóa đi và sửa lại ấy ạ. Giống như chạy code để sửa giá trị trong name ấy ạ.
Híc, Có lẽ là do sự kém hiểu biết nên cháu hỏi buồn cười. Giờ cháu đã hiểu.
Cháu cảm ơn hai bác Siwtom và Vetmini nhiều ạ.
 
Upvote 0
cháu tưởng là khi biến vào 1 chương trình con thì nó có thể nhận giá trị của chương trình con đó khi thoát ra ngoài chương trình thì nó lại trở về giá trị biến toàn cục nhỉ bac.
Cái bạn nói trên là THAM SỐ, và là THAM TRỊ.
Khi vào chương trình con (Sub/Function), VBA copy tất cả các tham trị. Bên trong chương trình con, các tham trị được coi như là biến nội.

Biến toàn cục là ...toàn cục. Bất cứ hàm nào có thể chạm vào nó đều có thể thay dổi trị của nó. Public có nghĩa là cho phép mọi hàm đều chạm vào được. Chính vì tính chất này mà dân lập trình chân chính luôn sử dụng biến toàn cục một cách hết sức dè dặt và cẩn trọng.
 
Upvote 0
Cái bạn nói trên là THAM SỐ, và là THAM TRỊ.
Khi vào chương trình con (Sub/Function), VBA copy tất cả các tham trị. Bên trong chương trình con, các tham trị được coi như là biến nội.

Biến toàn cục là ...toàn cục. Bất cứ hàm nào có thể chạm vào nó đều có thể thay dổi trị của nó. Public có nghĩa là cho phép mọi hàm đều chạm vào được. Chính vì tính chất này mà dân lập trình chân chính luôn sử dụng biến toàn cục một cách hết sức dè dặt và cẩn trọng.
vâng ạ.
 
Upvote 0
cháu tưởng là khi biến vào 1 chương trình con thì nó có thể nhận giá trị của chương trình con đó khi thoát ra ngoài chương trình thì nó lại trở về giá trị biến toàn cục nhỉ bac.
Nếu là câu hỏi (về biến số) thì hãy nói trọn câu, rõ nghĩa. Có ai hiểu ở trên nói gì cụ thể không? Hiểu chứ không phải đoán mò.

Còn nếu
Mã:
Public Var1 As Long
...

Sub hichic (...)
...
End Sub

Mà bạn muốn truyền Var1 vào hichic thì còn tùy.
Mã:
Public Var1 As Long

Sub hichic(ByVal a As Long)
    a = 1000
End Sub

Sub test()
    Var1 = 2
    hichic Var1
    MsgBox Var1
End Sub

Sau khi chạy test thì Var1 = 2, tức như trước khi chạy test

Nếu
Mã:
Public Var1 As Long

Sub hichic(ByRef a As Long) ' hoặc a As Long
    a = 1000
End Sub

Sub test()
    Var1 = 2
    hichic Var1
    MsgBox Var1
End Sub
Thì sau khi chạy test Var1 = 1000
 
Upvote 0
Em có chút rắc rối với file này ạ
Chạy code nó cứ báo lỗi type Missmatch ạ

Mục đích là lọc dữ liệu theo yêu cầu ạ
Mã:
Sub test()

Dim sArr(), dArr() As Long, i As Long, j As Long
Dim dieukien As Variant, day As Variant, cot As Long

With Sheets(1)

dieukien = Range("I1").Value
cot = Range("J1").Value

sArr = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Resize(, 10).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To UBound(sArr, 2) + 2)
For i = 1 To UBound(sArr, 1)
If sArr(i, 2) = "" Then day = sArr(i, 1)

If dieukien = sArr(i, cot) Then dArr(i, 1) = day
   
    For j = 1 To UBound(sArr, 2)
    dArr(i, j + 1) = sArr(i, j)
    Next j
    End

Next i
Sheets("filter").Delete
Sheets.Add Application.Sheets(1)
Sheets(1).Name = "filter"
Sheets(1).Range("A1").Resize(, UBound(dArr, 2)) = dArr

End With
End Sub
 

File đính kèm

  • Book1.xlsm
    16 KB · Đọc: 12
Upvote 0
Bạn sửa dòng lệnh đầu tiên thành vầy, chắc được:
Mã:
Dim sArr(), dArr() As Variant, I As Long, J As Long
 
Upvote 0
Web KT
Back
Top Bottom