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

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
Nhờ các bạn giúp đỡ Oanh Thơ trường hợp sau với ạ,với code sau:

Mã:
Sub MySub(ColSum1 As Integer, Optional ColSum2 As Integer = 0, Optional ColSum3 As Integer = 0)
     Dim arr()
     arr = Range("C3:F11").Value
     Range("K3").Resize(9, 1) = arr(1, ColSum1) + arr(1, ColSum2) + arr(1, ColSum3)
End Sub

Sub testMySub()
    Call MySub(1, 2)
End Sub

Khi Oanh Thơ chạy testMySub,
code báo lỗi: Subscript out of range (Error 9) tại dòng: Range("K3").Resize(9, 1) = arr(1, ColSum1) + arr(1, ColSum2) + arr(1, ColSum3)
Nguyên nhân do: MySub(1, 2) truyền vào thiếu 1 tham số.

Vậy để khắc phục lỗi này thì trong MySub phải đặt câu lệnh khắc phục lỗi như thê nào để khi chạy testMySub code vẫn hoạt động bình thường
khi Call MySub truyền đủ hoặc không đủ tham số?
 
Upvote 0
Nhờ các bạn giúp đỡ Oanh Thơ trường hợp sau với ạ,với code sau:

Mã:
Sub MySub(ColSum1 As Integer, Optional ColSum2 As Integer = 0, Optional ColSum3 As Integer = 0)
     Dim arr()
     arr = Range("C3:F11").Value
     Range("K3").Resize(9, 1) = arr(1, ColSum1) + arr(1, ColSum2) + arr(1, ColSum3)
End Sub

Sub testMySub()
    Call MySub(1, 2)
End Sub

Khi Oanh Thơ chạy testMySub,
code báo lỗi: Subscript out of range (Error 9) tại dòng: Range("K3").Resize(9, 1) = arr(1, ColSum1) + arr(1, ColSum2) + arr(1, ColSum3)
Nguyên nhân do: MySub(1, 2) truyền vào thiếu 1 tham số.

Vậy để khắc phục lỗi này thì trong MySub phải đặt câu lệnh khắc phục lỗi như thê nào để khi chạy testMySub code vẫn hoạt động bình thường
khi Call MySub truyền đủ hoặc không đủ tham số?
Dùng hàm IIF(ColSum2=0,0,arr(1, ColSum2)) gọn nhưng nghe nói chạy chậm, có thể vẫn còn lỗi
 
Upvote 0
#1549:
. Giả sử đơn giản bẫy lỗi khi chỉ số cột <1 thì trả về giá trị =0.
PHP:
Dim heso as Long
If colSum <1 then
 heso =0 
 colSum =1 
Else 
heso =1
End if
Ketqua= heso*arr(1,colSum)
 
Upvote 0
Dùng hàm IIF(ColSum2=0,0,arr(1, ColSum2)) gọn nhưng nghe nói chạy chậm, có thể vẫn còn lỗi
Chậm: phải trên chục ngàn lượt chạy mới có khác biệt.
Lỗi: IIF là một hàm. Khi gọi hàm thì VBA phải tính tất cả các tham để nạp vào. Tức là biểu thức arr(1, ColSum2) không thoát.
Chạy thử sub t sau đây thì biết
Function f1()
f1 = 1
MsgBox "f1 called"
End Function
Function f2()
f2 = 2
MsgBox "f2 called"
End Function
Sub t()
MsgBox "ket qua la " & IIf(1 > 0, f1, f2)
End Sub
 
Upvote 0
Chậm: phải trên chục ngàn lượt chạy mới có khác biệt.
Lỗi: IIF là một hàm. Khi gọi hàm thì VBA phải tính tất cả các tham để nạp vào. Tức là biểu thức arr(1, ColSum2) không thoát.
Chạy thử sub t sau đây thì biết
Function f1()
f1 = 1
MsgBox "f1 called"
End Function
Function f2()
f2 = 2
MsgBox "f2 called"
End Function
Sub t()
MsgBox "ket qua la " & IIf(1 > 0, f1, f2)
End Sub
Các bài trước bạn đã lưu ý rồi, nhưng không nhớ hết :( cảm thấy không yên tâm nên mới thòng thêm câu "có thể còn lỗi" o_O
 
Upvote 0
Web KT

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

Back
Top Bottom