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:
Sao không cho i chạy từ 4 vậy ta.Mà dùng thêm biến k nữa làm gì.
Đánh nhanh thắng nhanh với vấn đề cơ bản, vấn đề khó mới nên bỏ nhiều chất xám để tư duy, và sáng tạo.
Code viết không suy nghĩ quá 0.01% của bộ não
 
Upvote 0
Ai da, cám ơn bạn nha. Mình đưa yêu cầu thiếu thông tí xíu!!!
Mình muốn đánh số thứ tự trang (page number) cho sheet thứ 4 trở đi đến hết chứ không phải số của sheet.
 
Upvote 0
Chào cả nhà
Minh đang tập tành làm VBA, mình có tạo 1 userform (file đính kèm 2019-Test). Mình đang bị dừng lại ở chỗ tạo button OK để add new workbook, mình đã lên mạng tham khảo và có được dòng code để tạo workbook mới nhưng lại không thể copy hết 2 sheets từ file "BGmau.xls" (chỉ copy được sheet ChiTiet còn sheet BGgui thì lại không copy được) .Mong mọi người tham khảo và tư vấn giúp. Thanks all
 

File đính kèm

  • 2019 - TEST.xlsm
    35.3 KB · Đọc: 2
  • BG mau.xls
    235 KB · Đọc: 2
Upvote 0
Dear All.!
Cho em hỏi : em thấy một số người viết sub dạng sau
“ sub ABC(ABC as long)”
Những sub vậy không chạy trực tiếp đc?
Vậy sub như vậy là sao ạ? Cám ơn
 
Upvote 0
Dear All.!
Cho em hỏi : em thấy một số người viết sub dạng sau
“ sub ABC(ABC as long)”
Những sub vậy không chạy trực tiếp đc?
Vậy sub như vậy là sao ạ? Cám ơn
Cái đấy thêm điều kiện đó ABC.Sub đấy là gọi ra dùng thôi.Nó vẫn chạy được với Code của bạn không liên quan đến ABC.
 
Upvote 0
Capture.PNGxin chào cả nhà, cho mình hỏi làm cách nào để tạo 2 group option như thế này vậy ạ ?
 
Upvote 0
Mình có 2 thắc mắc về combobox:
-xóa một phần tử khỏi combobox
-kiểm tra một phần tử đã có trong combobox hay chưa
các cao nhân giúp với ạ
 
Upvote 0
Chào cả nhà
Minh đang tập tành làm VBA, mình có tạo 1 userform (file đính kèm 2019-Test). Mình đang bị dừng lại ở chỗ tạo button OK để add new workbook, mình đã lên mạng tham khảo và có được dòng code để tạo workbook mới nhưng lại không thể copy hết 2 sheets từ file "BGmau.xls" (chỉ copy được sheet ChiTiet còn sheet BGgui thì lại không copy được) .Mong mọi người tham khảo và tư vấn giúp. Cảm ơn all
Nhờ mọi người giúp em với ah
 
Upvote 0
Nhờ mọi người giúp em với ah
Code của bạn sau khi copy sheet ChiTiet thì đóng tập tin BG mau.xls. Theo lôgíc thì phải sau khi thực hiện xong vòng lặp FOR để copy hết các sheet mới đóng tập tin. Tóm lại cần đưa dòng owb.Close False ra sau vòng lặp .
Tức sửa
Mã:
...
owb.Close False 'Đóng workbook nhung không th?c hi?n luu
  Next sh
...
thành
Mã:
...
Next sh
  owb.Close False 'Đóng workbook nhung không th?c hi?n luu
...

Ngoài ra xóa sFil = Dir vì nó chả làm gì cả.

Dòng sFil = Dir(sPath & "BG mau.xls") để làm gì? Vì có thực hiện thì cũng chỉ có sFil = "BG mau.xls".

Nếu bạn xóa dòng sFil = Dir(...) thì sửa
Mã:
Set owb = Workbooks.Open(sPath & sFil)

thành
Mã:
Set owb = Workbooks.Open(sPath & "BG mau.xls")

Tôi không viết lại code cho bạn. Tôi chỉ chỉ ra những chỗ sai trên tinh thần: "Học trên những lỗi đã mắc phải". Có thế mới nhớ lâu. :D
 
Upvote 0
Code của bạn sau khi copy sheet ChiTiet thì đóng tập tin BG mau.xls. Theo lôgíc thì phải sau khi thực hiện xong vòng lặp FOR để copy hết các sheet mới đóng tập tin. Tóm lại cần đưa dòng owb.Close False ra sau vòng lặp .
Tức sửa
Mã:
...
owb.Close False 'Đóng workbook nhung không th?c hi?n luu
  Next sh
...
thành
Mã:
...
Next sh
  owb.Close False 'Đóng workbook nhung không th?c hi?n luu
...

Ngoài ra xóa sFil = Dir vì nó chả làm gì cả.

Dòng sFil = Dir(sPath & "BG mau.xls") để làm gì? Vì có thực hiện thì cũng chỉ có sFil = "BG mau.xls".

Nếu bạn xóa dòng sFil = Dir(...) thì sửa
Mã:
Set owb = Workbooks.Open(sPath & sFil)

thành
Mã:
Set owb = Workbooks.Open(sPath & "BG mau.xls")

Tôi không viết lại code cho bạn. Tôi chỉ chỉ ra những chỗ sai trên tinh thần: "Học trên những lỗi đã mắc phải". Có thế mới nhớ lâu. :D
Thank bác, đúng là chỉ có vậy mới nhớ như in luôn ^^
 
Upvote 0
Thank bác, đúng là chỉ có vậy mới nhớ như in luôn ^^
Sau khi học các lỗi thì bạn có thể tham khảo một cách khác. Bạn không phải tự tạo tập tin mới, và sau đó không phải tự xóa các sheet không cần thiết.

Chú ý: Khi dùng ActiveSheet và ActiveWorkbook thì phải chắc chắn là ở thời điểm đang xét thì sheet nào, tập tin nào đang hoạt động.
Mã:
Private Sub btaddOK_Click()
Const sPath = "D:\Test VBA\"  'Đuong dan toi thu muc chua workbook dang dóng'
Dim k As Long
Dim A, B, C As String
Dim owb As Workbook
    A = ComboBox1.Value
    B = TextBox1.Value
    C = TextBox2.Value

    Application.ScreenUpdating = False
'    mo tap tin can sao chep
    Set owb = Workbooks.Open(sPath & "BG mau.xls")
'    copy sheet dau tien cua tap tin owb. Excel tu tao tap tin moi
    owb.Sheets(1).Copy
'    copy cac sheet con lai
    For k = 2 To owb.Sheets.Count
'        ActiveSheet la sheet vua copy cua tap tin moi vua duoc tao
        owb.Sheets(k).Copy ActiveSheet
    Next k
    owb.Close False
   
    Application.ScreenUpdating = True
   
'    Save New file '
    With ActiveWorkbook
        .SaveAs Filename:=sPath & A & "." & B & "." & C & ".xlsx"
        .Close
    End With
End Sub
 
Upvote 0
Sau khi học các lỗi thì bạn có thể tham khảo một cách khác. Bạn không phải tự tạo tập tin mới, và sau đó không phải tự xóa các sheet không cần thiết.

Chú ý: Khi dùng ActiveSheet và ActiveWorkbook thì phải chắc chắn là ở thời điểm đang xét thì sheet nào, tập tin nào đang hoạt động.
Mã:
Private Sub btaddOK_Click()
Const sPath = "D:\Test VBA\"  'Đuong dan toi thu muc chua workbook dang dóng'
Dim k As Long
Dim A, B, C As String
Dim owb As Workbook
    A = ComboBox1.Value
    B = TextBox1.Value
    C = TextBox2.Value

    Application.ScreenUpdating = False
'    mo tap tin can sao chep
    Set owb = Workbooks.Open(sPath & "BG mau.xls")
'    copy sheet dau tien cua tap tin owb. Excel tu tao tap tin moi
    owb.Sheets(1).Copy
'    copy cac sheet con lai
    For k = 2 To owb.Sheets.Count
'        ActiveSheet la sheet vua copy cua tap tin moi vua duoc tao
        owb.Sheets(k).Copy ActiveSheet
    Next k
    owb.Close False
  
    Application.ScreenUpdating = True
  
'    Save New file '
    With ActiveWorkbook
        .SaveAs Filename:=sPath & A & "." & B & "." & C & ".xlsx"
        .Close
    End With
End Sub
Thank bác, đây cũng là 1 cách hay, em sẽ ghi nhớ lại. Em vẫn muốn dùng For Each vì sau này trên file BGmau em sẽ còn tạo thêm nhiều sheet dữ liệu nữa ạ ^^. Sẵn đây bác có thể hưỡng dẫn thêm cho em về cách tạo nút button NEXT dc ko. Yêu cầu là: 1 báo giá (workbook vừa tạo từ btt OK) sẽ có nhiều hàng, code em viết thì chỉ lấy dữ liệu từ Form vào hàng thứ 2 thôi, nên giờ em muốn tạo thêm nút NEXT để add thêm dữ liệu vào các hàng tiếp theo. Đồng thời khi nhấn btt NEXT thì sẽ giữ lại nội dung của thẻ Khách Hàng và MĐH còn lại thì xóa trắng hết. Chân thành cảm ơn ạ
 
Upvote 0
Thank bác, đây cũng là 1 cách hay, em sẽ ghi nhớ lại. Em vẫn muốn dùng For Each vì sau này trên file BGmau em sẽ còn tạo thêm nhiều sheet dữ liệu nữa ạ ^^.
Có lẽ bạn đọc code nhưng không hiểu. Tôi đã lường trước được tình huống này. :D

Tôi luôn coi tập tin chỉ là ví dụ, còn thực tế có thể khác, vì thế tôi thường cố gắng viết cho trường hợp tổng quát. Tôi hơi khác người là vậy.

Bạn để ý thì thấy tôi không đề nghị
Mã:
Sheets(Array("ChiTiet", "BGgui")).Copy
Vì code đó chỉ copy 2 sheet, và phải đúng tên là "ChiTiet" và "BGgui". Nếu thế thì sau này khi bạn thêm nhiều sheet thì code vẫn chỉ copy 2 sheet có tên y hệt như liệt kê. Thậm chí không thêm sheet nhưng bạn đổi tên 2 sheet kia thì code sẽ có lỗi.

Code mà tôi cho bạn tham khảo không bị phụ thuộc vào sự chỉnh sửa. Nó luôn copy tất cả các sheet hiện có với tên bất kỳ.

Dòng
Mã:
owb.Sheets(1).Copy
là copy sheet đầu tiên. Mỗi tập tin luôn có ít nhất 1 sheet nên dòng trên copy sheet đầu tiên

Còn
Mã:
For k = 2 To owb.Sheets.Count
'        ActiveSheet la sheet vua copy cua tap tin moi vua duoc tao
        owb.Sheets(k).Copy ActiveSheet
Next k
là copy lần lượt từ sheet thứ 2 cho đến sheet cuối cùng. Nếu tập tin hiện hành chỉ có 1 sheet thì 2 > owb.Sheets.Count nên vòng FOR sẽ không được thực hiện.
 
Upvote 0
Có lẽ bạn đọc code nhưng không hiểu. Tôi đã lường trước được tình huống này. :D

Tôi luôn coi tập tin chỉ là ví dụ, còn thực tế có thể khác, vì thế tôi thường cố gắng viết cho trường hợp tổng quát. Tôi hơi khác người là vậy.

Bạn để ý thì thấy tôi không đề nghị
Mã:
Sheets(Array("ChiTiet", "BGgui")).Copy
Vì code đó chỉ copy 2 sheet, và phải đúng tên là "ChiTiet" và "BGgui". Nếu thế thì sau này khi bạn thêm nhiều sheet thì code vẫn chỉ copy 2 sheet có tên y hệt như liệt kê. Thậm chí không thêm sheet nhưng bạn đổi tên 2 sheet kia thì code sẽ có lỗi.

Code mà tôi cho bạn tham khảo không bị phụ thuộc vào sự chỉnh sửa. Nó luôn copy tất cả các sheet hiện có với tên bất kỳ.

Dòng
Mã:
owb.Sheets(1).Copy
là copy sheet đầu tiên. Mỗi tập tin luôn có ít nhất 1 sheet nên dòng trên copy sheet đầu tiên

Còn
Mã:
For k = 2 To owb.Sheets.Count
'        ActiveSheet la sheet vua copy cua tap tin moi vua duoc tao
        owb.Sheets(k).Copy ActiveSheet
Next k
là copy lần lượt từ sheet thứ 2 cho đến sheet cuối cùng. Nếu tập tin hiện hành chỉ có 1 sheet thì 2 > owb.Sheets.Count nên vòng FOR sẽ không được thực hiện.
Em như được đã thông kinh mạch rồi :)). Thank nhìu ạ. Chỗ tạo btt NEXT có thể tư vấn thêm cho em được ko ạ
 
Upvote 0
Bạn muốn người khác làm hộ thì phải viết cụ thể. Không thể viết chung chung được.
Sẵn đây bác có thể hưỡng dẫn thêm cho em về cách tạo nút button NEXT dc ko. Yêu cầu là: 1 báo giá (workbook vừa tạo từ btt OK) sẽ có nhiều hàng, code em viết thì chỉ lấy dữ liệu từ Form vào hàng thứ 2 thôi, nên giờ em muốn tạo thêm nút NEXT để add thêm dữ liệu vào các hàng tiếp theo. Đồng thời khi nhấn btt NEXT thì sẽ giữ lại nội dung của thẻ Khách Hàng và MĐH còn lại thì xóa trắng hết.
Hiện tại bạn đã viết code đâu? Nếu bạn đã viết mà code "chỉ lấy dữ liệu từ Form vào hàng thứ 2 thôi" thì tôi còn có cơ sở để đoán là bạn muốn sửa thế nào. Còn không thì bó tay.com.

Tóm lại thì khi nhấn NEXT thì code phải làm các bước cự thể nào. Phải liệt kê cụ thể và liệt kê hết. Tôi không chơi kểu nói chung chung, cụt lủn.

Khi nhấn NEXT thì code copy những gì, từ đâu (nếu từ Form thì từ các trường nào) , vào đâu (vào sheet nào của tập tin nào, dán vào dòng nào cột nào). Liệt kê cụ thể. Cho 1 ví dụ cụ thể.

Mà bạn nói là copy vào tập tin vừa tạo bởi OK? Tập tin đó bạn đã đóng khi thực hiện code của OK mà. Bây giờ code của NEXT mở lại tập tin vừa đóng? Thế thì trước đó tại sao lại đóng ?
 
Upvote 0
Bạn muốn người khác làm hộ thì phải viết cụ thể. Không thể viết chung chung được.

Hiện tại bạn đã viết code đâu? Nếu bạn đã viết mà code "chỉ lấy dữ liệu từ Form vào hàng thứ 2 thôi" thì tôi còn có cơ sở để đoán là bạn muốn sửa thế nào. Còn không thì bó tay.com.

Tóm lại thì khi nhấn NEXT thì code phải làm các bước cự thể nào. Phải liệt kê cụ thể và liệt kê hết. Tôi không chơi kểu nói chung chung, cụt lủn.

Khi nhấn NEXT thì code copy những gì, từ đâu (nếu từ Form thì từ các trường nào) , vào đâu (vào sheet nào của tập tin nào, dán vào dòng nào cột nào). Liệt kê cụ thể. Cho 1 ví dụ cụ thể.

Mà bạn nói là copy vào tập tin vừa tạo bởi OK? Tập tin đó bạn đã đóng khi thực hiện code của OK mà. Bây giờ code của NEXT mở lại tập tin vừa đóng? Thế thì trước đó tại sao lại đóng ?
Code đây ạ
X.Worksheets(1).Range("H2").End(xlUp).Offset(1, 0).Value = KH.Text
X.Worksheets(1).Range("G2").End(xlUp).Offset(1, 0).Value = MDH.Text
X.Worksheets(1).Range("I2").End(xlUp).Offset(1, 0).Value = TH.Text
X.Worksheets(1).Range("J2").End(xlUp).Offset(1, 0).Value = VT.Text
X.Worksheets(1).Range("Y2").End(xlUp).Offset(1, 0).Value = NCC.Text
Khi nhấn NEXT thi những dữ liệu nhập trên Form sẽ nhập tiếp vào các dòng H3,G3,I2,... của sheet ChiTiet
Em đóng new workbook tại nút OK là vì sẽ có những báo giá chỉ có 1 dòng thôi
 
Upvote 0
Web KT
Back
Top Bottom