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:
Vấn đề thứ nhất: Giả sử từ hàng 1 đến hàng 100 có 2 hàng trống là hàng 2 và hàng 3. Khi bạn cho i chạy từ 1 đến 100, khi i bằng 2 thì thỏa mãn điều kiện bạn xóa hàng 2 đi, vậy hàng 3 bây giờ đố bạn là hàng mấy? Và khi i bằng 3 đố bạn điều kiện có thỏa mãn hay không? bạn trả lời được 2 câu hỏi của tôi thì bạn hiểu được vấn đề do đâu.
Vấn đề thứ hai: Muốn chạy xong lệnh xóa hàng và chờ 1 giây mới chạy tiếp thì thêm lệnh sau vào sau lệnh xóa hàng.
Mã:
Application.Wait Now + #0:00:01#
Em đã hiểu vì sao em phải chạy sub nhiều lần rồi ạ.
Em cảm ơn anh đã hỗ trợ ạ
Bài đã được tự động gộp:

Vấn đề thứ nhất: Giả sử từ hàng 1 đến hàng 100 có 2 hàng trống là hàng 2 và hàng 3. Khi bạn cho i chạy từ 1 đến 100, khi i bằng 2 thì thỏa mãn điều kiện bạn xóa hàng 2 đi, vậy hàng 3 bây giờ đố bạn là hàng mấy? Và khi i bằng 3 đố bạn điều kiện có thỏa mãn hay không? bạn trả lời được 2 câu hỏi của tôi thì bạn hiểu được vấn đề do đâu.
Vấn đề thứ hai: Muốn chạy xong lệnh xóa hàng và chờ 1 giây mới chạy tiếp thì thêm lệnh sau vào sau lệnh xóa hàng.
Mã:
Application.Wait Now + #0:00:01#
Anh cho em hỏi thêm về vấn đề 2.
Em đã thêm code Application.Wait Now + #0:00:01# , nhưng sau khi xuống dòng thì lại hiện thành
Application.Wait Now + #12:00:01 AM#
Có cách nào hiện đúng 1s không ạ, và nếu em muốn chờ 0,5s sau mới chạy tiếp chẳng hạn thì sẽ để định dang như thế nào ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn biết tụi Tây hồi xưa nó có câu chuyện vui (xin lỗi rất là Tây, bởi vì nó rất kỳ thị chủng tộc):
Đem tất cả dân Tàu sắp hàng đi xuống biển thì cái hàng ấy sẽ không bao giờ dứt.

Bằng ý tưởng đó, nếu muốn xoá dòng thì phải làm ngược từ dưới lên:
For i = 100 to 1 step -1
 
Upvote 0
Bạn biết tụi Tây hồi xưa nó có câu chuyện vui (xin lỗi rất là Tây, bởi vì nó rất kỳ thị chủng tộc):
Đem tất cả dân Tàu sắp hàng đi xuống biển thì cái hàng ấy sẽ không bao giờ dứt.

Bằng ý tưởng đó, nếu muốn xoá dòng thì phải làm ngược từ dưới lên:
For i = 100 to 1 step -1
Cũng được nhưng cách làm này nếu dữ liệu nhiều đợi nó chạy xong mệt xỉu luôn. Cách để nó chạy nhanh là khi điều kiện thỏa mãn thì đưa hàng đó vào một biến vùng (Biến này để lưu hàng trống), khi xong vòng For dùng lệnh xóa một lần, Thứ hai nửa là bạn nên đưa dữ liệu vào mảng duyệt mảng sẽ nhanh hơn duyệt Cell.
 
Upvote 0
Bạn biết tụi Tây hồi xưa nó có câu chuyện vui (xin lỗi rất là Tây, bởi vì nó rất kỳ thị chủng tộc):
Đem tất cả dân Tàu sắp hàng đi xuống biển thì cái hàng ấy sẽ không bao giờ dứt.

Bằng ý tưởng đó, nếu muốn xoá dòng thì phải làm ngược từ dưới lên:
For i = 100 to 1 step -1
Em cảm ơn anh đã hướng dẫn ạ.
Nhưng em chưa hiểu câu chuyện của tụi Tây sao lại suy ra được code kia ạ
 
Upvote 0
Em đã hiểu vì sao em phải chạy sub nhiều lần rồi ạ.
Em cảm ơn anh đã hỗ trợ ạ
Bài đã được tự động gộp:


Anh cho em hỏi thêm về vấn đề 2.
Em đã thêm code Application.Wait Now + #0:00:01# , nhưng sau khi xuống dòng thì lại hiện thành
Application.Wait Now + #12:00:01 AM#
Có cách nào hiện đúng 1s không ạ, và nếu em muốn chờ 0,5s sau mới chạy tiếp chẳng hạn thì sẽ để định dang như thế nào ạ.
Dùng lại thế này xem sao?
Mã:
Application.Wait (Now + TimeValue("0:00:01"))
Có chắc là 0,5 giây không hay hướng dẫn xong lại 0,15 giây... Lúc đầu chỉ hỏi 1 giây bây giờ lại 0,5 giây, trước khi hỏi bạn nên lường trước trường hợp đặc biệt chứ. Gợi ý bạn tìm hàm API Sleep để sử dụng.
 
Upvote 0
Dùng lại thế này xem sao?
Mã:
Application.Wait (Now + TimeValue("0:00:01"))
Có chắc là 0,5 giây không hay hướng dẫn xong lại 0,15 giây... Lúc đầu chỉ hỏi 1 giây bây giờ lại 0,5 giây, trước khi hỏi bạn nên lường trước trường hợp đặc biệt chứ. Gợi ý bạn tìm hàm API Sleep để sử dụng.
Ban đầu em muốn để chờ 1s. Sau đó thử giảm xuống 0,5s xem lệnh có chạy không. Em thấy không được nên mới hỏi cho trường hợp <1s để nếu lần sau muốn dùng hoặc thậm chí dùng ngay ở lần này, coi như là tích lũy thêm kiến thức ạ.
Em sẽ tìm kiếm hàm API Sleep và tìm hiểu về nó ạ.
Em cảm ơn anh nhiều ạ!
 
Upvote 0
Chào các bạn, tôi có 1 sheet HD có 5 cột Tên hàng, MHH, SL, DGiá, thành tiền và các dữ liệu đã được liên kết với nhau để khi nhập vào dữ liệu của MHH và SL thì các số liệu khác sẽ thể hiện tương ứng (sheet HD có 3 liên của 1 hóa đơn trình bày trên cùng 1 trang chứ không phải 3 Hóa đơn khác nhau) và 1 sheet TH cũng có 5 cột y như ở sheet HD dùng để copy các dữ liệu trong từng Hóa đơn (vùng được tô màu vàng của Hóa đơn) nối tiếp nhau để sau đó tổng hợp lại thành lượng bán trong ngày của từng mặt hàng. Số lượng hóa đơn mỗi ngày khá nhiều nên copy thủ công rất vất vả, các bạn có thể chỉ giúp đoạn code VBA hoặc Macro để khi nhập số liệu vào các sheet HD thì sheet TH cũng chép các số liệu tương ứng và dữ liệu của Hóa đơn sau nối tiếp và nằm dưới dữ liệu của Hóa đơn trước, xin cảm ơn nhiều.
 

File đính kèm

  • HDBH09102018.xlsx
    143.1 KB · Đọc: 5
Upvote 0
Chào các bạn, tôi có 1 sheet HD có 5 cột Tên hàng, MHH, SL, DGiá, thành tiền và các dữ liệu đã được liên kết với nhau để khi nhập vào dữ liệu của MHH và SL thì các số liệu khác sẽ thể hiện tương ứng (sheet HD có 3 liên của 1 hóa đơn trình bày trên cùng 1 trang chứ không phải 3 Hóa đơn khác nhau) và 1 sheet TH cũng có 5 cột y như ở sheet HD dùng để copy các dữ liệu trong từng Hóa đơn (vùng được tô màu vàng của Hóa đơn) nối tiếp nhau để sau đó tổng hợp lại thành lượng bán trong ngày của từng mặt hàng. Số lượng hóa đơn mỗi ngày khá nhiều nên copy thủ công rất vất vả, các bạn có thể chỉ giúp đoạn code VBA hoặc Macro để khi nhập số liệu vào các sheet HD thì sheet TH cũng chép các số liệu tương ứng và dữ liệu của Hóa đơn sau nối tiếp và nằm dưới dữ liệu của Hóa đơn trước, xin cảm ơn nhiều.
Muốn truy vấn dữ liệu của từng Hóa đơn thì sheet theo dõi của bạn phài có cột số Hóa đơn và ngày Hóa đơn.
Bạn có thể tham khảo cách làm trong bài viết ở Link sau:
https://www.giaiphapexcel.com/diendan/threads/giúp-lưu-hóa-đơn-từ-sheet1-vào-sheet-theo-dõi-và-xuất-sheet-theo-dõi-ra-file-mới-để-import-dữ-liệu-vào-phần-mềm.138276/

Hoặc Link sau:
https://www.giaiphapexcel.com/diend...iếu-thu-chi-từ-dữ-liệu-của-sheet-data.138272/
 
Upvote 0
Các anh/chị cho em hỏi chút.
Em có 2 file tương ứng với 2 sub test1 và test2
Giờ em mở file 1 lên chạy sub test1.
Vậy có cách nào để khi em chạy sub test1 thì file 2 mở lên và chạy sub test2 cho file số 2 không ạ?
 
Upvote 0

Bạn thử code bên dưới xem có được không ạ?

Mã:
'code de trong module file 1

Sub tes1_file1()

    Workbooks.Open Filename:=ThisWorkbook.Path & "\file2.xls"

End Sub


'code de trong ThisWorkbook file 2

Private Sub Workbook_Open()

    tes2_file2

End Sub

Sub tes2_file2()

    'code cua tes2_file2

    'lam ji do tuy ban...

End Sub
 
Upvote 0
Bạn thử code bên dưới xem có được không ạ?

Mã:
'code de trong module file 1

Sub tes1_file1()

    Workbooks.Open Filename:=ThisWorkbook.Path & "\file2.xls"

End Sub


'code de trong ThisWorkbook file 2

Private Sub Workbook_Open()

    tes2_file2

End Sub

Sub tes2_file2()

    'code cua tes2_file2

    'lam ji do tuy ban...

End Sub
bạn ơi! code như trên có nghĩa là. File1 đang mở, file2 đang đóng. Mình chạy sub test1_file1, thì file 2 sẽ mở lên và chạy sub test2_file2 cho file thứ 2 đúng ko?
 
Upvote 0
bạn ơi! code như trên có nghĩa là. File1 đang mở, file2 đang đóng. Mình chạy sub test1_file1, thì file 2 sẽ mở lên và chạy sub test2_file2 cho file thứ 2 đúng ko?

Dạ hình như là vậy ạ, bạn chạy thử xem có đúng ý không ạ?
Nhưng với điều kiện là 2 file cùng để chung trong 1 thư mục bạn nhé và file 2 phải có tên là "file2.xls" hoặc nếu bạn muốn sửa tên file 2 thì sửa trong code ạ.
còn file 1 đang mở bạn có thể đặt tên gì cho file 1 cũng được.
 
Upvote 0
Bạn thử code bên dưới xem có được không ạ?

Mã:
'code de trong module file 1

Sub tes1_file1()

    Workbooks.Open Filename:=ThisWorkbook.Path & "\file2.xls"

End Sub


'code de trong ThisWorkbook file 2

Private Sub Workbook_Open()

    tes2_file2

End Sub

Sub tes2_file2()

    'code cua tes2_file2

    'lam ji do tuy ban...

End Sub
Mình chạy không được rồi. hiện ra thông báo Macro disable
 
Upvote 0
Mình chạy không được rồi. hiện ra thông báo Macro disable
Ôi,... thế này thì lâu lắm !
Vậy bạn thử vào link sau tìm hiểu thêm về cách cho tập tin hoạt động khi có chứa macro,
https://www.giaiphapexcel.com/diendan/threads/bài-0-kiến-thức-chung-về-vba.130635/

hoặc link:
https://support.office.com/vi-vn/ar...p-office-12b036fd-d140-4e74-b45e-16fed1a7e5c6

để tham khảo thêm ạ.
 
Upvote 0
Bài đã được tự động gộp:

mình đang vận dụng hướng dẫn của bạn, rất cám ơn sự giúp đở của bạn, chúc bạn ngày mới an lành.
 
Upvote 0
Xin chào các bạn, nhờ các bạn giúp đỡ 1 vấn đề sau ạ:
Oanh Thơ (OT) tạo 1 sub có tên MySub:
Mã:
Sub MySub(shTongHop As String, shList As String, shData As String, _
        colSum1 As Integer, colSum2 As Integer, colSum3 As Integer, _
        rngKQ As String)

    'code...

End Sub



Và OT tạo thêm 1 sub testMySub để gọi và truyền các tham số như bên dưới

Sub testMySub()
    Call MySub("Sheet1", "Sheet2", "Sheet3", 5, 7, , "A9")
End Sub

Code báo lỗi: Argument not optional (Error 449)
Nguyên nhân là do Call MySub("Sheet1", "Sheet2", "Sheet3", 5, 7, , "C5") thiếu 1 tham số sau số 7.
---
Mong muốn khai báo các biến trong MySub như thế nào để có thể nhập hoặc không nhập ạ.
Bài đã được tự động gộp:
 
Upvote 0
Lệnh gọi trên báo lỗi vì bạn chưa truyền tham biến
colSum3 As Integer
Để như bạn muốn ta cần khai báo:
PHP:
Sub MySub(ShTH As String, ShList As String, ShData As String, _
        ColSum1 As Integer, ColSum2 As Integer, Optional ColSum3 As Integer= 0, _
                 Optional RngKQ As String = "GPE.COM")

    'code...     '
End Sub
 
Upvote 0
Lệnh gọi trên báo lỗi vì bạn chưa truyền tham biến
colSum3 As Integer
Để như bạn muốn ta cần khai báo:
PHP:
Sub MySub(ShTH As String, ShList As String, ShData As String, _
        ColSum1 As Integer, ColSum2 As Integer, Optional ColSum3 As Integer= 0, _
                 Optional RngKQ As String = "GPE.COM")

    'code...     '
End Sub

A, thêm Optional trước biến.
Dạ ,cháu cảm ơn bác SA_DQ
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom