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ọ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

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
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 đỡ ạ
Bạn muốn tạo hàm thì phải cho hàm các đối số.
Như ở đây bạn tạo hàm Solieu thì cho Solieu các đối số, ví dụ như
Mã:
Public Function Solieu(ByVal wPath As String, ByVal wName As String, ByVal Ngay As String, ByVal DiaChi As String) As Variant
    Dim s As Variant
    s = GetValue(wPath, wName, Ngay, DiaChi)
    Solieu = s
End Function
Khi gọi hàm Solieu thì cho phần sau vào
Mã:
ActiveWorkbook.path, "Lichsu.xls", "8.2017", "a7"
chú ý cái ActiveWorkbook.path thì chuyển thành đường dẫn cụ thể
 
Upvote 0
chỉ cần đặt tên ảnh như trong video là ok

Cám ơn Minh Tùng, mình đã làm theo cách của bạn và rất ổn, không biết nói cảm ơn thế nào.
Nhưng mình lại gặp vấn đề, trong file dữ liệu có ảnh và tên SP, giờ có khoảng 1000 cái ảnh thì có cách nào để đặt tên tự động không, chứ làm từng cái thì cũng được nhưng thủ công quá.
 
Upvote 0
Cho em hỏi Code sau:
PHP:
With Application.Workbooks("OVT Report Aug 2017.xlsm").Sheets("OVT")
Code trên dùng để xuất dữ liệu từ file mẹ sang file đang mở là OVT Report Aug 2017.xlsm. Vì vậy hàng tháng em lại phải mở code để sửa đổi phần 3 ký tự này. Có cách nào thay thế bằng ký tự chung chung kiểu như
With Application.Workbooks("OVT Report *** 2017.xlsm").Sheets("OVT") không anh chị?
 
Upvote 0
Cho em hỏi Code sau:
PHP:
With Application.Workbooks("OVT Report Aug 2017.xlsm").Sheets("OVT")
Code trên dùng để xuất dữ liệu từ file mẹ sang file đang mở là OVT Report Aug 2017.xlsm. Vì vậy hàng tháng em lại phải mở code để sửa đổi phần 3 ký tự này. Có cách nào thay thế bằng ký tự chung chung kiểu như
With Application.Workbooks("OVT Report *** 2017.xlsm").Sheets("OVT") không anh chị?
Bạn hãy đưa tên Workbook vào 1 biến dạng như


Mã:
Dim WbName as String

WbName = “OVT Report *** 2017.xlsm"


With Application.Workbooks(WbName).Sheets("OVT")


Việc thay cái *** thì bạn thay tùy ý thôi.
 
Upvote 0
Bạn hãy đưa tên Workbook vào 1 biến dạng như


Mã:
Dim WbName as String

WbName = “OVT Report *** 2017.xlsm"


With Application.Workbooks(WbName).Sheets("OVT")


Việc thay cái *** thì bạn thay tùy ý thôi.

Ý mình cái tên file OVT Report *** 2017.xlsm chỗ *** hàng tháng phải thay đổi nên trong code cũng cần thay đổi theo để nó biết làm việc với file tên là gì. Mình thử cách của bạn thì báo lỗi không thấy file nào tên thế. File hiện tên là OVT Report Sep 2017.xlsm
 
Upvote 0
Web KT

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

Back
Top Bottom