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

File đính kèm

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
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
Tôi xóa bài này vì bạn hỏi 2 nơi. Sang "bên kia" mà chờ nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi xóa bài này vì bạn hỏi 2 nơi. Sang "bên kia" mà chờ nhé.
Bài bên này em đằn lên hỏi khoảng 3 4 ngày trước rồi mà ko thấy ai trả lời với có người bảo em nên tạo topic mới để dễ theo dõi nên em mới tạo thêm. Anh thông cảm dùm em nha. Rất cám ơn sự giúp đỡ nhiệt tình của anh. Anh qua bài bên kia giúp em tiếp tục nha. E test thử rồi mà nó báo lỗi, em gửi lại file anh kiểm tra lại dùm em nha
Tôi xóa bài này vì bạn hỏi 2 nơi. Sang "bên kia" mà chờ nhé.
 

File đính kèm

Upvote 0
Hi ae, nhờ anh em viết giùm mình đoạn code sau để lọc dữ liệu từ 1 bảng khoảng vài trăm nghìn dòng:
Cho i chạy từ 2 đến 1000000
Với từng i: Nếu ô Ai chứa ký tự dấu ngoặc trái "(" hoặc ô Hi có giá trị <0 hoặc ô Ji có giá trị khác #N/A thì xóa dữ liệu dòng i.Nếu không thỏa điều kiện trên thì sẽ xuống dòng tiếp theo.
Mình mới mày mò VBA, chỉ có thể ghi lại macro để dùng, chưa biết viết code. Nhờ ae giúp đỡ :)
 
Upvote 0
Chào cả nhà,
Mình đang làm một số công việc cần trích xuất dữ liệu excel rất nhiều ra các biểu mẫu word. Mình có tìm hiểu trên mạng và lượm được 1 đoạn code theo video như sau. tuy nhiên khi mình chạy thử code chỉ tạo ra các biểu mấu mới chứ không điền dữ liệu vào được. công việc gấp và mình cũng chưa có kiến thức vba cơ bản, mong các bạn trong diễn đàn trợ giúp. Cảm ơn các bạn nhiều!
code:
Mã:
Sub bbntcv()
Dim num_of_cust As Long
Dim num_of_column As Long
Dim i As Long, j As Long
Dim template As Object
Dim t As Object

num_of_column = 14

num_of_cust = Sheet6.Cells(Rows.Count, "A").End(xlUp).Row - 1
With CreateObject("word.application")
.Visible = True

For i = 1 To num_of_cust
Set template = .documents.Open("C:\Users\NGHIALT\Desktop\New folder\BBNTCV.doc")
Set t = template.Content
For j = 1 To num_of_column
t.Find.Execute _
FindText:=Sheet6.Cells(1, j).Value, _
ReplaceWith:=Sheet6.Cells(i + 1, j).Value, _
Replace:=wdReplaceAll
Next
template.SaveAs Filename:=ThisWorkbook.Path & Application.PathSeparator & i & "-BBNTCV.doc"
Next
.Quit
End With
Set t = Nothing
Set template = Nothing

End Sub
 

File đính kèm

Upvote 0
Chào cả nhà,
Mình đang làm một số công việc cần trích xuất dữ liệu excel rất nhiều ra các biểu mẫu word. Mình có tìm hiểu trên mạng và lượm được 1 đoạn code theo video như sau. tuy nhiên khi mình chạy thử code chỉ tạo ra các biểu mấu mới chứ không điền dữ liệu vào được. công việc gấp và mình cũng chưa có kiến thức vba cơ bản, mong các bạn trong diễn đàn trợ giúp. Cảm ơn các bạn nhiều!
code:
Bạn đã vi phạm nội qui khi gửi 2 bài có cùng nội dung ở 2 nơi.

Hãy xóa bài trong chủ đề này, để lại 1 bài thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài bên này em đằn lên hỏi khoảng 3 4 ngày trước rồi mà ko thấy ai trả lời với có người bảo em nên tạo topic mới để dễ theo dõi nên em mới tạo thêm. Anh thông cảm dùm em nha. Rất cám ơn sự giúp đỡ nhiệt tình của anh. Anh qua bài bên kia giúp em tiếp tục nha. E test thử rồi mà nó báo lỗi, em gửi lại file anh kiểm tra lại dùm em nha
Tôi tưởng tôi xóa kịp nhưng hóa ra bạn đã kịp copy bài của tôi.

Tôi gõ thiếu.
Sửa
Mã:
owb = sPath & A & "." & B & "." & C & ".xlsx"
thành

Mã:
owb_filename = sPath & A & "." & B & "." & C & ".xlsx"

Tức sửa owb thành owb_filename.

Do nút NEXT mở tập tin được tạo bởi nút OK nên thứ tự phải là click OK, sau đó mới click NEXT
 
Upvote 0
Web KT

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

Back
Top Bottom