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:
Dùng dây buộc lại xem nó còn có sức dẫy lẩy lên không bác nhỉ.
Bài đã được tự động gộp:

sub Ahihi()

Select Case uf_Nhaplieu.lstTenbieu.ListIndex
Case 0
MultiPage1.Value = 1
Case 1
MultiPage1.Value = 2
End Select

end sub

Có thể nhét phần code chung vào một sub , rồi "call" nó từ hai thủ tục sự kiện còn lại.
 
Upvote 0
Học vba vất vả quá, như học tiếng anh vậy. Thầy cô có thể cho em biết nguyên tắc để sử dụng lệnh Call được không ạ.
Nếu cứ muốn dùng, hoặc nếu ai dí súng vào đầu bắt dùng Call thì
Mã:
Dim a As MSForms.ReturnBoolean
    Call TextBox1_DblClick(a)
So sánh 2 cách gọi của tôi và chịu khó tư duy thì thấy chỗ khác nhau thôi.
 
Upvote 0
Nhiều khi lười mà hay bỏ qua cái call, tức là dùng cách 1, bác "Rơi" cho cháu hỏi có sự khác biệt hay cần lưu ý gì về hai cách viết này không?
Từ khóa Call không bắt buộc. Tức có thể bỏ Call, nhưng lúc đó sẽ có chút khác biệt về cú pháp:
1. Nếu hichic có tham số thì khi dùng Call phải cho các tham số vào trong cặp ngoặc (). Khi không dùng Call thì không được phép dùng cặp ngoặc.
2. Giả sử ta có hàm hichic trả về kết quả:
2.1. Nếu ta không quan tâm tới kết quả thì Call hichic(...) hay hichic ... đều được.
2.2. Nếu ta cần kết quả mà hichic trả về thì phải là a = hichic(...). Không có kiểu a = Call hichic(...) hay Call a = hichic(...).
Tóm lại nếu cần giá trị trả về bởi hàm, vd. hàm người dùng, thì không thể dùng Call được.

Người hỏi kêu khó. Mấu chốt là VBA có quyển help hơi bị to nhưng nhiều người không chịu đọc rồi cứ kêu là học khó.
 
Upvote 0
Bạn khai báo Public cho cái Sub đó rồi gọi thử xem.
Em đã thử nhưng ko được
Bài đã được tự động gộp:

Từ khóa Call không bắt buộc. Tức có thể bỏ Call, nhưng lúc đó sẽ có chút khác biệt về cú pháp:
1. Nếu hichic có tham số thì khi dùng Call phải cho các tham số vào trong cặp ngoặc (). Khi không dùng Call thì không được phép dùng cặp ngoặc.
2. Giả sử ta có hàm hichic trả về kết quả:
2.1. Nếu ta không quan tâm tới kết quả thì Call hichic(...) hay hichic ... đều được.
2.2. Nếu ta cần kết quả mà hichic trả về thì phải là a = hichic(...). Không có kiểu a = Call hichic(...) hay Call a = hichic(...).
Tóm lại nếu cần giá trị trả về bởi hàm, vd. hàm người dùng, thì không thể dùng Call được.

Người hỏi kêu khó. Mấu chốt là VBA có quyển help hơi bị to nhưng nhiều người không chịu đọc rồi cứ kêu là học khó.
Dạ help toàn tiếng anh, em chỉ thạo tiếng việt thôi ạ. Tiếng anh em có nhìn rõ, nghe rõ nhưng ko hiểu hichic
 
Upvote 0
Tiếng Anh tôi đọc được. Tiếng Việt tôi đọc được. Chỉ tiếng Việt viết tắt là làm tôi bối rối.

Lập trình và chát chít là hai cơ sở khác nhau. Hấu hết người chuyên lập trình rất kỵ đọc ngôn ngữ chát chít.
 
Upvote 0
Tiếng Anh tôi đọc được. Tiếng Việt tôi đọc được. Chỉ tiếng Việt viết tắt là làm tôi bối rối.

Lập trình và chát chít là hai cơ sở khác nhau. Hấu hết người chuyên lập trình rất kỵ đọc ngôn ngữ chát chít.
Không so sánh được. Tiếng Việt viết tắt mà bác, tức con người, còn không hiểu thì máy, tức gú gồ, làm sao hiểu được. Nhưng tiếng Anh không hiểu thì có gú gồ. Chỉ cần gú gồ dịch được 50%, còn lại là đoán dựa vào ngữ cảnh. Một bên là bó tay toàn tập, còn bên kia là lười. So sánh làm sao được. Trình độ tiếng Anh của tôi ở mức "luôn cầm từ điển trong tay" nhưng tôi không bao giờ kêu ca là không hiểu.
 
Upvote 0
Không so sánh được. Tiếng Việt viết tắt mà bác, tức con người, còn không hiểu thì máy, tức gú gồ, làm sao hiểu được. Nhưng tiếng Anh không hiểu thì có gú gồ. Chỉ cần gú gồ dịch được 50%, còn lại là đoán dựa vào ngữ cảnh. Một bên là bó tay toàn tập, còn bên kia là lười. So sánh làm sao được. Trình độ tiếng Anh của tôi ở mức "luôn cầm từ điển trong tay" nhưng tôi không bao giờ kêu ca là không hiểu.
Nhiều người Việt tự có cách viết tắt cho tiếng Anh luôn cả bác ơi.
Điển hình: rum, com, down, up,...
 
Upvote 0
Nhiều người Việt tự có cách viết tắt cho tiếng Anh luôn cả bác ơi.
Điển hình: rum, com, down, up,...
Ý tôi khác. Bác đọc bài mà người ta viết tắt thì dĩ nhiên là bác không hiểu. Tôi có thể cảm thông cho bác. Vì lúc đó thì gú gồ hay cha của gú gồ cũng bó tay. Nhưng ai kêu là help toàn tiếng Anh nên không hiểu thì tôi không thông cảm được. Vì trong help người ta không viết tắt. Vậy thì cứ gú gồ thôi.
 
Upvote 0
Thầy cô cho em hỏi cách viết code đường dẫn đầy đủ cho một workbook mà dùng codename là thế nào ? Ví dụ em làm việc với nhiều workbook em muốn userform chỉ truyền dữ liệu tới workbook chứa code thì phải viết code làm sao? Em đã thử như sau: sheet chứa dữ liệu có tên DL1(TK1) trong đó DL1 là codename, em viết thisworkbook.sheets(“TK1”).range(“...”) thì code chạy; nhưng nếu viết thisworkbook.DL1.range(“...”) thì code báo lỗi ? Mong thầy cô giúp đỡ.
 
Upvote 0
Thầy cô cho em hỏi cách viết code đường dẫn đầy đủ cho một workbook mà dùng codename là thế nào ? Ví dụ em làm việc với nhiều workbook em muốn userform chỉ truyền dữ liệu tới workbook chứa code thì phải viết code làm sao? Em đã thử như sau: sheet chứa dữ liệu có tên DL1(TK1) trong đó DL1 là codename, em viết thisworkbook.sheets(“TK1”).range(“...”) thì code chạy; nhưng nếu viết thisworkbook.DL1.range(“...”) thì code báo lỗi ? Mong thầy cô giúp đỡ.
Khi khai báo DL1, bạn đã phải khai đường dẫn tới sheet rồi, VD: Set DL1 = ThisWorkbook.Sheets("XYZ") hoặc Workbooks("ABC").Sheets("XYZ"). Giờ chồng thêm 1 lần thisworkbook nữa thì bị lỗi là phải rồi.
 
Upvote 0
Nhờ thầy cô trong diễn đàn chuyển giúp đoạn code sau thành hàm (Function) để có thể sử dụng cho nhiều textbox. TxtNgayQD là TextBox nằm trong UserForm có tên uf_Nhaplieu.
Mã:
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, ".", "/")
If Len(Me.txtNgayQD.Text) = 8 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 2) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 7 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 6 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 1) & "/" & Mid(Me.txtNgayQD.Text, 2, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
End If
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, "//", "/")
Em cảm ơn nhiều. Em đã thử theo cách này nhưng Code báo lỗi Type Mismatch
Mã:
Function DinhDangTime (DNgay as TextBox)
With uf_Nhaplieu
DNgay.Text = Replace(DNgay.Text, ".", "/")

If Len(DNgay.Text) = 8 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 2) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 7 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 1) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 6 Then

    DNgay.Text = Left(DNgay.Text, 1) & "/" & Mid(DNgay.Text, 2, 1) & "/" & Right(DNgay.Text, 4)

End If

DNgay.Text = Replace(DNgay.Text, "//", "/")
End With
End Function
 
Upvote 0
Nhờ thầy cô trong diễn đàn chuyển giúp đoạn code sau thành hàm (Function) để có thể sử dụng cho nhiều textbox. TxtNgayQD là TextBox nằm trong UserForm có tên uf_Nhaplieu.
Mã:
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, ".", "/")
If Len(Me.txtNgayQD.Text) = 8 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 2) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 7 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 2) & "/" & Mid(Me.txtNgayQD.Text, 3, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
ElseIf Len(Me.txtNgayQD.Text) = 6 Then
    Me.txtNgayQD.Text = Left(Me.txtNgayQD.Text, 1) & "/" & Mid(Me.txtNgayQD.Text, 2, 1) & "/" & Right(Me.txtNgayQD.Text, 4)
End If
Me.txtNgayQD.Text = Replace(Me.txtNgayQD.Text, "//", "/")
Em cảm ơn nhiều. Em đã thử theo cách này nhưng Code báo lỗi Type Mismatch
Mã:
Function DinhDangTime (DNgay as TextBox)
With uf_Nhaplieu
DNgay.Text = Replace(DNgay.Text, ".", "/")

If Len(DNgay.Text) = 8 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 2) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 7 Then

    DNgay.Text = Left(DNgay.Text, 2) & "/" & Mid(DNgay.Text, 3, 1) & "/" & Right(DNgay.Text, 4)

ElseIf Len(DNgay.Text) = 6 Then

    DNgay.Text = Left(DNgay.Text, 1) & "/" & Mid(DNgay.Text, 2, 1) & "/" & Right(DNgay.Text, 4)

End If

DNgay.Text = Replace(DNgay.Text, "//", "/")
End With
End Function
Ai giúp em với
 
Upvote 0
Nếu chỉ nói về cái bạn hỏi thì sửa thành
Mã:
Function DinhDangTime(ByVal DNgay As MSForms.TextBox)

hoặc

Function DinhDangTime(DNgay As MSForms.TextBox)
Em cảm ơn thầy. Thầy cho em hỏi thêm câu nữa, trong form em có nhiều optionbutton và checkbox, có phương pháp nào để có thể dùng vòng lặp duyệt cho từng opt và chk và điền dữ liệu vào từng cell không ?
 
Upvote 0
Capture.JPG
Các bạn, anh chỉ hộ mình chỗ này với.
Mình muốn viết 1 function TT với công thức tính toán như hình
TT(A1:A3) sẽ thực hiện phép tính "SQRT((A1^3+A2^3+A3^3)/(A1+A2+A3))"
TT(A4:A6) sẽ thực hiện phép tính "SQRT((A4^3+A5^3+A6^3)/(A4+A5+A6))"
TT(A7:A8) sẽ thực hiện phép tính "SQRT((A7^3+A8^3)/(A7+A8))"
Mày mò mãi chưa xử được. Mình xin cảm ơn trước nhé...
 
Upvote 0
Em cảm ơn thầy. Thầy cho em hỏi thêm câu nữa, trong form em có nhiều optionbutton và checkbox, có phương pháp nào để có thể dùng vòng lặp duyệt cho từng opt và chk và điền dữ liệu vào từng cell không ?
Muốn người khác giúp thì phải mô tả cụ thể, câu hỏi cụ thể, đính kèm tập tin (vấn đề của mình thì bỏ công soạn tập tin). Muốn dùng vòng lặp thì cho các tên hoặc vd. thuộc tính TAG có số thứ tự liên tiếp.
Vd. có CheckBox1, ..., CheckBox20. Lúc đó vd. trong code của UserForm:
Mã:
Dim k As Long
    For k = 1 To 20
        If Me.Controls("CheckBox" & k).Value Then MsgBox "CheckBox" & k & " duoc chon"
    Next kFor i = 1
 
Upvote 0
View attachment 240894
Các bạn, anh chỉ hộ mình chỗ này với.
Mình muốn viết 1 function TT với công thức tính toán như hình
TT(A1:A3) sẽ thực hiện phép tính "SQRT((A1^3+A2^3+A3^3)/(A1+A2+A3))"
TT(A4:A6) sẽ thực hiện phép tính "SQRT((A4^3+A5^3+A6^3)/(A4+A5+A6))"
TT(A7:A8) sẽ thực hiện phép tính "SQRT((A7^3+A8^3)/(A7+A8))"
Mày mò mãi chưa xử được. Mình xin cảm ơn trước nhé...
Thử hàm này xem
Mã:
Function test(dl As Range) As Double
Dim mang
Dim spt
Dim i, j, k
mang = dl
spt = UBound(mang)
For i = 1 To spt
    j = j + mang(i, 1)
    k = k + mang(i, 1) ^ 3
Next i
test = (k / j) ^ (1 / 2)
End Function
 
Upvote 0
Mời bạn thử: (Chậm chân rồi!)
PHP:
Function TT(Rng As Range) As Double
Dim Cls As Range
Dim J As Long, Tng1 As Double, Tng2 As Double

For J = 1 To Rng.Rows.Count
    Tng1 = Tng1 + (Rng(J).Value) ^ 3
    Tng2 = Tng2 + (Rng(J).Value)
Next J
TT = (Tng1 / Tng2) ^ (1 / 2)
End Function
 
Upvote 0
Thử hàm này xem
Mã:
Function test(dl As Range) As Double
Dim mang
Dim spt
Dim i, j, k
mang = dl
spt = UBound(mang)
For i = 1 To spt
    j = j + mang(i, 1)
    k = k + mang(i, 1) ^ 3
Next i
test = (k / j) ^ (1 / 2)
End Function
Cảm ơn anh, ok rồi anh ạ....
Bài đã được tự động gộp:

Mời bạn thử: (Chậm chân rồi!)
PHP:
Function TT(Rng As Range) As Double
Dim Cls As Range
Dim J As Long, Tng1 As Double, Tng2 As Double

For J = 1 To Rng.Rows.Count
    Tng1 = Tng1 + (Rng(J).Value) ^ 3
    Tng2 = Tng2 + (Rng(J).Value)
Next J
TT = (Tng1 / Tng2) ^ (1 / 2)
End Function
Cảm ơn anh nhé, ok rồi anh ạ
 
Upvote 0
Web KT
Back
Top Bottom