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:
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
Cảm ơn anh, tối em test ạ
Bài đã được tự động gộp:


Cảm ơn anh nhé, để em test luôn
Test luôn nè:
Mã:
Function TT(rg As Range) As Double
Dim cl As Range
Dim LT As Double, Tg As Double
For Each cl In rg
    LT = LT + cl ^ 3
    Tg = Tg + cl
Next
    TT = Sqr(LT / Tg)
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn sử dụng hàm Trim để loại bỏ những khoảng trắng mà sao em viết như thế này code không chạy, cũng không báo lỗi.
Mã:
Private Sub txtHoten_AfterUpdate()
    Application.WorksheetFunction.Trim (txtHoten.Text)
End Sub
Em phải viết như nào cho đúng ?
 
Upvote 0
Em muốn sử dụng hàm Trim để loại bỏ những khoảng trắng mà sao em viết như thế này code không chạy, cũng không báo lỗi.
Mã:
Private Sub txtHoten_AfterUpdate()
    Application.WorksheetFunction.Trim (txtHoten.Text)
End Sub
Em phải viết như nào cho đúng ?
À mình làm được rồi, phải viết như này
Mã:
Function XoaKT(ByVal txt As MSForms.TextBox)
    With Application.WorksheetFunction
        txt = .Trim(.Proper(txt))
    End With
End Function
 
Upvote 0
À mình làm được rồi, phải viết như này
Mã:
Function XoaKT(ByVal txt As MSForms.TextBox)
    With Application.WorksheetFunction
        txt = .Trim(.Proper(txt))
    End With
End Function
Nên về học kỹ lại lý thuyết về controls và đối tượng trước khi nghĩ đến những chuyện màu mè thế này.
Cũng nên tìm hiểu thêm về khác biệt giữa Sub và Function.
 
Upvote 0
Mã:
Private Sub chkList_Change()
    If uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.chkList.Value = True Then
        Me.lstTenbieu.ListIndex = -1
        Me.lstDS.RowSource = ""
    Elseif uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.lstTenbieu.ListIndex >= 0 then
        uf_Nhaplieu.chkList.Value = False
    End If
End Sub
Giúp em với, sub trên em viết sai chỗ nào mà chỉ chạy được điều kiện If đến phần Elseif thì sub không chạy; em phải sửa lại như thế nào ?
 
Upvote 0
Mã:
Private Sub chkList_Change()
    If uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.chkList.Value = True Then
        Me.lstTenbieu.ListIndex = -1
        Me.lstDS.RowSource = ""
    Elseif uf_Nhaplieu.MultiPage1.Value = 0 And uf_Nhaplieu.lstTenbieu.ListIndex >= 0 then
        uf_Nhaplieu.chkList.Value = False
    End If
End Sub
Giúp em với, sub trên em viết sai chỗ nào mà chỉ chạy được điều kiện If đến phần Elseif thì sub không chạy; em phải sửa lại như thế nào ?
Tách 2 If độc lập với nhau
 
Upvote 0
Web KT

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

Back
Top Bottom