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 không đủ khả năng giải thích cho bạn rồi;

Hay bạn thử thế này đi:
Thay vì
MsgBox sRng.Row
Bạn biến thành
MsgBox Me!TB_TS1.Parent.Name, , Me.TB_TS1.Parent.Name

Xem VBE trả lời sao?
 
Upvote 0
Mình không đủ khả năng giải thích cho bạn rồi;

Hay bạn thử thế này đi:
Thay vì
MsgBox sRng.Row
Bạn biến thành
MsgBox Me!TB_TS1.Parent.Name, , Me.TB_TS1.Parent.Name

Xem VBE trả lời sao?
Đoạn MsgBox sRng.Row e edit lại cho phù hợp với công việc là:
MsgBox chrW(..)..... & sRng.Row, đại khái là có thêm tý nội dung thông báo đã trích xuất kết quả trận đấu thành công cho nó có vẻ chuyên nghiệp.
Nhưng MsgBox lại hạn chế unicode quá, nên không hiển thị chuẩn được tiếng việt có dấu.
 
Upvote 0
ActiveCell.Offset(0, 0).Range("A1").Select: ActiveCell.Value = XDate
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XSo
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XLoai


-Các bạn cho mình hỏi. Đoạn code này trong một cuốn sách, có nghĩa là nhảy ngang 1 ô sau đó gán cho ô đó một biến, sau đó nhảy ngang lại gán 1 biến nữa. Chỉ là mình không hiểu lệnh Range("A1") để làm gì, mình bỏ đi thì nó vẫn chạy như bình thường không có gì sai cả. Vậy ý nghĩa của nó là gì ?
 
Upvote 0
Mình không đủ khả năng giải thích cho bạn rồi;

Hay bạn thử thế này đi:
Thay vì
MsgBox sRng.Row
Bạn biến thành
MsgBox Me!TB_TS1.Parent.Name, , Me.TB_TS1.Parent.Name

Xem VBE trả lời sao?
1. Cách viết Me.{Method | Property}: Gọi phương thức | thuộc tính của đối tượng.

2. Cách gọi tới một Item của đối tượng (ở đây là UserForm):
PHP:
object.Item({Index | Key})

Index: là chỉ số thứ tự của Item trên object.

Key: Khóa tương ứng với Item trên object.

Nếu đã xác định được Key của Item, thì cũng có thể sử dụng toán tử truy cập từ điển (!) ("the dictionary access operator") để truy cập vào một phần tử của object mà không kèm theo dấu ngoặc đơn.
PHP:
MsgBox Me("TextBox1").Value

'Tương đương với:'

MsgBox Me!TextBox1.Value
 
Upvote 0
1. Cách viết Me.{Method | Property}: Gọi phương thức | thuộc tính của đối tượng.

2. Cách gọi tới một Item của đối tượng (ở đây là UserForm):
PHP:
object.Item({Index | Key})

Index: là chỉ số thứ tự của Item trên object.

Key: Khóa tương ứng với Item trên object.

Nếu đã xác định được Key của Item, thì cũng có thể sử dụng toán tử truy cập từ điển (!) ("the dictionary access operator") để truy cập vào một phần tử của object mà không kèm theo dấu ngoặc đơn.
PHP:
MsgBox Me("TextBox1").Value

'Tương đương với:'

MsgBox Me!TextBox1.Value
Vâng, cũng tàm tạm hiểu rồi ạ. Cảm ơn anh ạ.
 
Upvote 0
Vâng, cũng tàm tạm hiểu rồi ạ. Cảm ơn anh ạ.

Mọi người càng nói càng làm cho bạn ý khó hiểu.

Cái thứ nhất không nhất thiết phải dùng "me.", vì ta đang đứng trong nó, mặc định mọi thành viên của nó đều được ưu tiên. gõ là TB_TS2.Value là đủ.

Các form có một thuộc tính controls trả lại một tập các control đang có trên form. Thuộc tính này lại là mặc định. Nên gõ là me.controls("TB_TS2"), controls("TB_TS2") , me!TB_TS2 là cùng gọi một thuộc tính, lấy tham chiếu đến control có tên là TB_TS2, nhưng chú ý nó trả lại kiểu Object.

Nói chung là đối với những control đã có sẵn trong lúc thiết kế thì cứ gọi trực tiếp tên nó ra, không cần phải thông qua controls làm gì cho mệt
 
Upvote 0
Mọi người càng nói càng làm cho bạn ý khó hiểu.

Cái thứ nhất không nhất thiết phải dùng "me.", vì ta đang đứng trong nó, mặc định mọi thành viên của nó đều được ưu tiên. gõ là TB_TS2.Value là đủ.

Các form có một thuộc tính controls trả lại một tập các control đang có trên form. Thuộc tính này lại là mặc định. Nên gõ là me.controls("TB_TS2"), controls("TB_TS2") , me!TB_TS2 là cùng gọi một thuộc tính, lấy tham chiếu đến control có tên là TB_TS2, nhưng chú ý nó trả lại kiểu Object.

Nói chung là đối với những control đã có sẵn trong lúc thiết kế thì cứ gọi trực tiếp tên nó ra, không cần phải thông qua controls làm gì cho mệt
Vậy là nếu đứng trong form ta không cần phải nêu Name của form hoặc Me. hay Me! đúng không ạ, chỉ cần gọi tên chính xác của object nào đó là ok phải không ạ.
 
Upvote 0
Dùng toán tử chấm than (!) là một hình thức của kết nối trễ. Vì là kết nối trễ cho nên nó sẽ chậm hơn cách kết nối sớm 1 chút.

Lý do dùng kết nói trễ là vì có những phần tử mà Form chưa có lúc trình dịch rà qua code. Ví dụ những controls lúc chạy code mới thêm vào.

Chú thich: tôi chỉ giải thích lý thuyết của toán tử này mà thôi. Việc nó hoạt động trong Form như thế nào thì tôi lười viết code Form để thử lắm.
 
Upvote 0
Dùng toán tử chấm than (!) là một hình thức của kết nối trễ. Vì là kết nối trễ cho nên nó sẽ chậm hơn cách kết nối sớm 1 chút.

Lý do dùng kết nói trễ là vì có những phần tử mà Form chưa có lúc trình dịch rà qua code. Ví dụ những controls lúc chạy code mới thêm vào.

Chú thich: tôi chỉ giải thích lý thuyết của toán tử này mà thôi. Việc nó hoạt động trong Form như thế nào thì tôi lười viết code Form để thử lắm.
Chà chà, liên quan đến code chạy nhanh hay chậm là cũng quan trọng đấy ạ. Ai cũng mong muốn code được tối ưu và chạy mượt hơn ạ. Hihi.
 
Upvote 0
Thử xem qua cái này xem có áp dụng theo được không anh nhé!
Cám ơn bạn, không hẳn như thế ạ.
1. Dữ liệu ảnh của mình ở trong file Excel, ví dụ mã hàng A sẽ có tên, giá , ảnh .....
2. Khu vực lấy ảnh không liền nhau, ví dụ ở trên D3 (mã hàng sẽ ở B3), nhưng ngay dưới có thể D7 (mã hàng ở B7).
đây là một dạng đơn báo giá bạn ạ.
Rất cám ơn bạn đã dành thời gian trả lời bài viết của mình.
 
Upvote 0
Cám ơn bạn, không hẳn như thế ạ.
1. Dữ liệu ảnh của mình ở trong file Excel, ví dụ mã hàng A sẽ có tên, giá , ảnh .....
2. Khu vực lấy ảnh không liền nhau, ví dụ ở trên D3 (mã hàng sẽ ở B3), nhưng ngay dưới có thể D7 (mã hàng ở B7).
đây là một dạng đơn báo giá bạn ạ.
Rất cám ơn bạn đã dành thời gian trả lời bài viết của mình.
Dạ vâng, không có gì ạ.
Hay anh thử xem file đính kèm này của thầy Ndu đã làm ạ.
Ngoài ra anh vào đây: http://www.giaiphapexcel.com/diendan/threads/chèn-hình-ảnh-theo-điều-kiện-của-một-ô-có-trước.62266/ là mục nói về vấn đề gần giống như anh muốn theo yêu cầu của mình ạ.
 

File đính kèm

  • chen anh.xlsm
    23.2 KB · Đọc: 3
Upvote 0
Chà chà, liên quan đến code chạy nhanh hay chậm là cũng quan trọng đấy ạ. Ai cũng mong muốn code được tối ưu và chạy mượt hơn ạ. Hihi.

Với khả năng máy tính hiện nay, nhanh chậm cách nhau dưới 1 phần triệu giây. Có mượt hay không chỉ là cảm giác chủ quan thôi.
 
Upvote 0
Dạ vâng, không có gì ạ.
Hay anh thử xem file đính kèm này của thầy Ndu đã làm ạ.
Ngoài ra anh vào đây: http://www.giaiphapexcel.com/diendan/threads/chèn-hình-ảnh-theo-điều-kiện-của-một-ô-có-trước.62266/ là mục nói về vấn đề gần giống như anh muốn theo yêu cầu của mình ạ.
Mình có ngó qua thấy khá giống nhu cầu của mình, để mình thử áp dụng xem. Cám ơn bạn nhé !
 
Upvote 0
Mình mới học lập trình excel cần mọi người giúp đỡ vấn đề này:
Mình có 2 file excel cùng thư mục, một file chứa lịch sử hoạt động, file còn lại để báo cáo.
Mình muốn lập 1 hàm vba để lấy dữ liệu ngày mới nhất từ file lịch sử để đưa vào một ô trong file báo cáo.
Mã:
Public Function Solieu() As Variant
Dim s As Variant
s = GetValue(ActiveWorkbook.path, "Lichsu.xls", "8.2017", "a7")
MsgBox s
Solieu = s
End Function
Khi gọi số liệu bằng msgbox thì hiển thị được, nhưng ghi gọi bằng hàm thì lỗi #value. Mình không hiểu như thế nào. Mọi người giúp đỡ ạ
 
Upvote 0
@Quỷ Lệ Cô Thần , GetValue không phải là hàm có sẵn, bạn nói gọi bằng msgbox thì được (nếu được thì bạn đã có hàm GetValue rồi) nhưng gọi bằng hàm thì lỗi mình lại nghĩ vấn đề ở cái hàm GetValue, nên up lên thử xem có giúp ích gì cho bạn không
Mã:
Private Function GetValue(path, file, sheet, ref)
    Dim arg As String
    If Right(path, 1) <> "\" Then path = path & "\"
    If Dir(path & file) = "" Then
        GetValue = "File Not Found"
        Exit Function
    End If
    arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
      Range(ref).Range("A1").Address(, , xlR1C1)
    GetValue = ExecuteExcel4Macro(arg)
End Function
 
Upvote 0
Web KT
Back
Top Bottom