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ã:
Sub ThayThe()
For Each s In Array("x", "x.1", "n")   
    Selection.Replace What:=s, Replacement:="a", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
Next
End Sub
 
Upvote 0
Code này chạy bình thường, do record nên muốn biết cách rút gọn thôi
Tôi hỏi là vì ở trường hợp này cách rút gọn không quan trọng bằng cách triển khai. Học code theo tôn chỉ "rút gọn, chạy nhanh" là học sai đường.

Rút gọn: xem rõ cách rút ở bài #2588, chỉ rút ngắn được vài dòng. Nếu chỉ dùng 1 vài lần thì không xứng đáng bỏ công sửa code.
(nếu xét vấn đề chạy nhanh thì code "gọn hơn" có thể chạy chậm hơn vài phần tỷ giây; vì nó phải sử lý vòng lặp và dùng biến thay vì hằng)

Nhưng tôi không hề chê code ở bài #2588, chính vì lý do tôi đặt nặng "cách triển khai":

Triển khai: (lưu ý lại từ "chỉ dùng 1 vài lần" ở trên) bạn triển khai là vì bạn muốn dùng nhiều lần, và dùng cho nhu cầu tổng quát hơn một chút. Và code "rút gọn" ở bài #2588 không chỉ bớt số dòng code cho bạn. Nó tạo cơ hội cho code có thể triển khai để Find/Replace nhiều hơn. Nếu bạn vẫn còn chưa hiểu tôi nói gì thì bạn hỏi tác giả bài ấy chỉ dẫn thêm cho bạn cách đặt tham số cho hàm.
 
Upvote 0
Chào các bạn!
Hiện nay mình muốn code xã Filter cho 1 số sheet được chọn bất kỳ (các sheet này có thể có filter hoặc toàn bộ không có filter)
Code xã filter cho 1 sheet hoặc cho toàn bộ các sheet trong 1 file thì mình làm được nhưng code xã filter cho 1 số sheet được chọn bất kỳ thì mình chưa làm được
Mong các bạn hướng dẫn. Xin cảm ơn các bạn!
 
Upvote 0
Chào các bạn!
Hiện nay mình muốn code xã Filter cho 1 số sheet được chọn bất kỳ (các sheet này có thể có filter hoặc toàn bộ không có filter)
Code xã filter cho 1 sheet hoặc cho toàn bộ các sheet trong 1 file thì mình làm được nhưng code xã filter cho 1 số sheet được chọn bất kỳ thì mình chưa làm được
Mong các bạn hướng dẫn. Xin cảm ơn các bạn!
Bạn dùng code sau để duyệt các sheet được chọn.
Mã:
For Each Sh In ActiveWindow.SelectedSheets
    '...
Next
 
Upvote 0
Bạn dùng code sau để duyệt các sheet được chọn.
Mã:
For Each Sh In ActiveWindow.SelectedSheets
    '...
Next
Cảm ơn bạn, bài toán xã filter tôi đã làm được
Từ bài trên tôi muốn Unhide các cột của các sheet đã chọn, Unhide các cột từ cột I đến đến cột T (có thể 1 hay toàn bộ các sheet đã chọn có unhide cột hoặc không unhide cột, lưu ý không unhide các cột khác)
Tuy nhiên code dưới của tôi nó chỉ unhide 1 sheet (sheet chọn đầu tiên)
Mong các bạn chỉnh sửa giúp. Xin cảm ơn!
PHP:
Sub ShowUnhide()    ' Unhide cac sheet da chon
    Dim wks As Worksheet
    For Each wks In ActiveWindow.SelectedSheets
        Columns("I:T").Select
        Selection.EntireColumn.Hidden = False
        [I4].Select
    Next
End Sub
 
Upvote 0
Code trong vòng lặp For chỉ cần vầy
Mã:
wks.Columns("I:T").Hidden = False
 
Upvote 0
Các bạn cho tôi hỏi, tôi có code
Mã:
Sheets("Báo cáo").Select
        Range("C1").Select
sau đó tôi sửa thành

Mã:
Sheets("Báo cáo").Range("C1").Select
Thì bị báo lỗi, cho hỏi lý do. Xin cảm ơn!
 
Upvote 0
Lý do: Không được chọn (.Select) range trên sheet không phải sheet hiện hành. Viết vầy thì được.
Mã:
Application.Goto Sheets("Báo cáo").Range("C1")
 
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ
 
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ
Tôi không biết bạn muốn làm thế để làm gì. Nhưng nếu muốn gọi lstTenbieu_DblClick thì hãy để ý là nó có 1 tham số kiểu Boolean.
Vậy cách gọi vd.
Mã:
Dim a As MSForms.ReturnBoolean
    lstTenbieu_DblClick a
 
Lần chỉnh sửa cuối:
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ
Có hỏi về "lỗi" trong code thì nên diễn tả nguyên văn cái lỗi ấy.
Hàm lstTenbieu_DblClick được khai báo là cần một tham số. Gọi nó mà không cho nó tham số thì nó dẫy nẩy lên.
 
Upvote 0
Em có hai thủ tục sử dụng chung một đoạn code giống hệt nhau, ở thủ tục thứ 2 em sử dụng lệnh Call để gọi thủ tục 1 cho đỡ phải viết lại, nhưng không biết tại sao lệnh Call không hoạt động, VBA báo lỗi. Ai giải thích giúp và em phải sửa thế nào ?. Đoạn code như sau:
Mã:
Private Sub lstTenbieu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Select Case uf_Nhaplieu.lstTenbieu.ListIndex
    Case 0
        MultiPage1.Value = 1
    Case 1
        MultiPage1.Value = 2
    End Select
End Sub
------------------------------------------------------------------------------------------------
Private Sub lstDS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Call lstTenbieu_DblClick
End Sub
Mong thầy cô, anh chị trong diễn đàn giúp đỡ

Bạn khai báo Public cho cái Sub đó rồi gọi thử xem.
 
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 ạ.
 
Upvote 0
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
Web KT

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

Back
Top Bottom