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 mọi người, mọi người cho mình hỏi vấn đề này với
ví dụ mình có công thức tại cell như thế này
=ROUND(SUMIFS(M$38:$M41;$I38:$I$41;">10";I38:I41;"<=18")/1000;3)*1
giờ mình muốn code điền lại vào cell thành công thức thế này thì viết code thế nào ạ
=ROUND(SUMIFS($M$38:$M$41;$I$38:$I$41;">10";$I$38:$I$41;"<=18")/1000;3)*1
tức là thêm $ vào tất cả tham chiếu để cố định vùng lại í.
 
Upvote 0
Theo em hiểu ý bạn của trên: Làm sao xác định được ô M38 (vùng bất kỳ) mà chuyển thành dạng địa chỉ cố định.

Tức là, có một cell có chứa công thức: cell.Formula trả về 1 chuỗi.

(1): "=ROUND(SUMIFS(M$38:$M41;$I38:$I$41;">10";I38:I41;"<=18")/1000;3)*1"

Giờ cần tìm trong chuỗi trên, cứ chỗ nào là range thì chuyển về dạng địa chỉ cố định:

(2): "=ROUND(SUMIFS($M$38:$M$41;$I$38:$I$41;">10";$I$38:$I$41;"<=18")/1000;3)*1"
 
Upvote 0
Theo em hiểu ý bạn của trên: Làm sao xác định được ô M38 (vùng bất kỳ) mà chuyển thành dạng địa chỉ cố định.
Bạn ấy khong phải là thành viên mới. Đã từng hỏi ở đây trên chục bài rồi. Néu muốn nói chuyện rõ ràng thì ít nhất cũng phải cho biết cái chuỗi kia lấy ở đâu ra. Ai hơi đâu mà đoán mò giùm.

Vì bạn ấy không nói chuyện rõ ràng cho nên tôi cũng trả lời tổng quát. Ý của tôi là giải thích chung cho các bạn cần biết sự khác biệt giữa tham chiếu tương đối và tuyệt đối.
 
Upvote 0
Chào mọi người, mọi người cho mình hỏi vấn đề này với
ví dụ mình có công thức tại cell như thế này
=ROUND(SUMIFS(M$38:$M41;$I38:$I$41;">10";I38:I41;"<=18")/1000;3)*1
giờ mình muốn code điền lại vào cell thành công thức thế này thì viết code thế nào ạ
=ROUND(SUMIFS($M$38:$M$41;$I$38:$I$41;">10";$I$38:$I$41;"<=18")/1000;3)*1
tức là thêm $ vào tất cả tham chiếu để cố định vùng lại í.
Tôi viết thành add-in nên mở topic mới cho mọi người dễ tìm. Bạn vào link bên dưới xem nhé.
http://www.giaiphapexcel.com/diendan/threads/add-in-thay-đổi-kiểu-tham-chiếu-trong-công-thức.129258/
 
Upvote 0
Làm thế nào để phân biệt những chỗ mà mình muốn thay đổi kiểu? Thường thường công thức sẽ được nới dài thêm, và chúng có thể gồm cả tuyệt đối lẫn tương đối.
 
Upvote 0
Đây làm một hàm để so sánh số lớn nhất trong một vùng dữ liệu (Range) nào đó.

Nó căn cứ từ ô đầu tiên của vùng [ Ran.Cells(1, 1) ] làm chuẩn để so sánh với các ô trong vùng đó.

Với câu lệnh này:

If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)

Với d đại diện cho hàng và c đại diện cho cột, khi vòng lặp chạy lần lượt đến mỗi ô trong Vùng tham chiếu, nếu gặp ô có giá trị lớn hơn giá trị ban đầu max = Ran.Cells(1, 1) thì max sẽ nhận giá trị tại ô đó rồi tiếp tục so sánh sang ô khác, còn không thì nó vẫn giữ giá trị lớn nhất.

=============================
Cái mà tôi không hiểu gì trong hàm đó là cái này:

v = Tim(max, Ran)

Chả biết nó dùng để làm gì nữa!
nhờ anh Hoàng Trọng Nghĩa giúp đỡ bài này ! Em có 1 file quản lí thông tin khách hàng và 1 form nhập liệu chưa viết code.
Muốn nhờ anh viết hộ code để khi nhập dữ liệu vào combobox khách hàng thì dữ liệu sẽ tự tham chiếu đến Sheet khách hàng. Nếu có trường hợp thỏa mãn thì sẽ hiện hết thông tin lên list box, click vào chọn 1 hàng trong list thì dữ liệu từ list box sẽ add vào các text box bên dưới theo các mục tương ứng, có thể cập nhật và thay đổi được.
 

File đính kèm

Upvote 0
Theo mình, bạn còn thiếu 2 bảng;
1 bảng liệt kê danh sách hàng hóa, gồm [Mã hàng], [Tên hàng], . . . .
2 Bảng danh sách khách hàng; gồm [Mã KH], [Tên KH], [Ngày sinh], [SĐT], [Địa chỉ], [Ghi chú],. . . .
Một khi bạn có 2 bảng này thì trang dữ liệu hiện tại sẽ bỏ bớt các trường, nhất là dữ liệu đã có ở bảng 'DSKH' như [SĐT], [NgàySinh], . . .
Bạn nên có [Mã KH], nếu không có cái này, thì sau này bạn sẽ fải nuốt tiếc muôn tả.

Nghĩa là trước khi tạo Form hay gì, gì khác, ta fải bỏ nhiều thời gian để có 1 cấu trúc CSDL thiệc hoàn chỉnh cái đã; Theo mình chuyện này là xương sống của hoạt động 1 CSDL bình thường & chu chỉnh.

Vui nếu được trao đổi thêm cùng bạn.
 
Upvote 0
Theo mình, bạn còn thiếu 2 bảng;
1 bảng liệt kê danh sách hàng hóa, gồm [Mã hàng], [Tên hàng], . . . .
2 Bảng danh sách khách hàng; gồm [Mã KH], [Tên KH], [Ngày sinh], [SĐT], [Địa chỉ], [Ghi chú],. . . .
Một khi bạn có 2 bảng này thì trang dữ liệu hiện tại sẽ bỏ bớt các trường, nhất là dữ liệu đã có ở bảng 'DSKH' như [SĐT], [NgàySinh], . . .
Bạn nên có [Mã KH], nếu không có cái này, thì sau này bạn sẽ fải nuốt tiếc muôn tả.

Nghĩa là trước khi tạo Form hay gì, gì khác, ta fải bỏ nhiều thời gian để có 1 cấu trúc CSDL thiệc hoàn chỉnh cái đã; Theo mình chuyện này là xương sống của hoạt động 1 CSDL bình thường & chu chỉnh.

Vui nếu được trao đổi thêm cùng bạn.
Cảm ơn bạn đã tư vấn. Nhưng nếu mình tách dữ liệu ra làm 2 bảng như bạn nói thì khi find dữ liệu không biết listbox có hiển thị đầy đủ được các trường mình cần k nhỉ. Ví dụ mình nhập Mã hàng(MH) là N1A thì list sẽ hiển thị tất cả các KH, địa chỉ, sđt, ghi chú của những khách hàng đã đặt sản phẩm N1A mình chỉ việc cập nhật thêm thông tin nếu có thay đổi. Nếu tách ra mà vẫn cập nhật được như vậy thì tốt quá, nếu có thời gian bạn hãy chỉ giáo giúp, xin chân thành cảm ơn.
 
Upvote 0
Trong ListBox lúc đó chỉ có các trường [Mã Hàng], [Tên hàng], [Mã KH] & [Tên KH]
& bạn có thể thay 2 trong 4 loại dữ liệu này mà thôi.

Nếu bạn cần đổi/thay hay sửa dữ liệu của khách hàng như [Ngày Sinh], [SĐT], hay {Địa chỉ], không fải là vô lý lắm sao?
Trong quá trình vận hành, các dữ liệu này cũng cần thay đổi hay cập nhật; Nhưng lúc đó ta thực hiện bằng cách khác hơn (trực tiếp hay bằng Form khác chứ!)
 
Upvote 0
Trong ListBox lúc đó chỉ có các trường [Mã Hàng], [Tên hàng], [Mã KH] & [Tên KH]
& bạn có thể thay 2 trong 4 loại dữ liệu này mà thôi.

Nếu bạn cần đổi/thay hay sửa dữ liệu của khách hàng như [Ngày Sinh], [SĐT], hay {Địa chỉ], không fải là vô lý lắm sao?
Trong quá trình vận hành, các dữ liệu này cũng cần thay đổi hay cập nhật; Nhưng lúc đó ta thực hiện bằng cách khác hơn (trực tiếp hay bằng Form khác chứ!)
Bạn nói đúng quá, mình hiểu rồi. Mình đã sửa lại và sắp xếp lại CSDL, tiện đây bạn có thể giúp mình xem có code nào để khi mình nhập dữ liệu vào combobox thì listbox sẽ hiển thị tất cả các mã hàng có tên giống nhau không,
Vd: combobox nhập N1A thì listbox sẽ hiển thị toàn bộ sản phẩm N1A và các thông tin liên quan đến KH,SDT, địa chỉ, ghi chú.(chỉ cần hiển thị không chỉnh sửa ) Mục ghi chú và số lượng đặt thì mình có thể chọn 1 trong những KH nhất định để cập nhật ghi chú, số lượng, sau khi đã giao hàng được không .
 

File đính kèm

Upvote 0
Bạn nói đúng quá, mình hiểu rồi. Mình đã sửa lại và sắp xếp lại CSDL, tiện đây bạn có thể giúp mình xem có code nào để khi mình nhập dữ liệu vào combobox thì listbox sẽ hiển thị tất cả các mã hàng có tên giống nhau không,
Vd: combobox nhập N1A thì listbox sẽ hiển thị toàn bộ sản phẩm N1A và các thông tin liên quan đến KH,SDT, địa chỉ, ghi chú.(chỉ cần hiển thị không chỉnh sửa ) Mục ghi chú và số lượng đặt thì mình có thể chọn 1 trong những KH nhất định để cập nhật ghi chú, số lượng, sau khi đã giao hàng được không .
Mã hàng có liên quan gì đến khách hàng không bạn?
 
Upvote 0
Bạn xem file & fản hồi; Mai ta sẽ tiếp tục sớm

Vấn đề bổ sung khách hàng (KH) ngay trên form này là không nên;
Nếu thường xuyên bổ sung hay thay đổi danh sách KH thì nên thực hiện trên 1 form khác; nếu ít hay thỉnh thoảng thì nên thay trực tiếp trên trang 'DS'
Mã hàng có liên quan gì đến khách hàng không bạn?
KH đặt hàng thông qua mã hàng mà.

(Xin các bạn xem file ở bài kế tiếp của mình, xin cảm ơn nhiều)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nói đúng quá, mình hiểu rồi. Mình đã sửa lại và sắp xếp lại CSDL, tiện đây bạn có thể giúp mình xem có code nào để khi mình nhập dữ liệu vào combobox thì listbox sẽ hiển thị tất cả các mã hàng có tên giống nhau không,
Vd: combobox nhập N1A thì listbox sẽ hiển thị toàn bộ sản phẩm N1A và các thông tin liên quan đến KH,SDT, địa chỉ, ghi chú.(chỉ cần hiển thị không chỉnh sửa ) Mục ghi chú và số lượng đặt thì mình có thể chọn 1 trong những KH nhất định để cập nhật ghi chú, số lượng, sau khi đã giao hàng được không .
Tóm lại là mình cần nhất vẫn là hiển thị được tất cả các KH đã đặt mua trong 1 sản phẩm, khi click vào 1
Bạn xem file & fản hồi; Mai ta sẽ tiếp tục sớm

Vấn đề bổ sung khách hàng (KH) ngay trên form này là không nên;
Nếu thường xuyên bổ sung hay thay đổi danh sách KH thì nên thực hiện trên 1 form khác; nếu ít hay thỉnh thoảng thì nên thay trực tiếp trên trang 'DS'

KH đặt hàng thông qua mã hàng mà.
cảmcảm ơn hoang2013, DS mình k thể làm trên sheet đc vì mỗi ngày mình phải nhập hơn 100,150 người. Dữ liệu của mình lên tới hàng nghìn dòng nên chỉ có làm trên form thôi. Hiện mình đang đi làm, chiều về mình sẽ xem file bạn gửi
 
Upvote 0
(1) Tóm lại là mình cần nhất vẫn là hiển thị được tất cả các KH đã đặt mua trong 1 sản phẩm, khi click vào 1
(2) Cảm ơn hoang2013, DS mình k thể làm trên sheet đc vì mỗi ngày mình phải nhập hơn 100,150 người.
Dữ liệu của mình lên tới hàng nghìn dòng nên chỉ có làm trên form thôi.

(1) Hiển thị thì được rồi đó. Bạn còn đòi sửa 1 hay cặp trong cả 6 trường/cột nữa, phải không?
Có nghĩa là sửa mã mặt hàng (kéo theo sửa tên mặt hàng); Sửa Mã KH (kéo theo sửa tên khách hàng; Sửa số lượng đặt hàng & tình trạng thanh toán.
Như vậy thì từng dòng dữ liệu còn thiếu 1 đơn vị thông tin, mà nó không thể thay đổi (ví dụ như số thứ tự, số phiếu hay/kết hợp với ngày tháng đặt hàng.
Nếu không có nó ta chả thể làm được gì khác & chỉ sau vài ba ngày CSDL của bạn sẽ thành đống rác bốt mùi.
Vậy nên ta cần chỉnh sửa ngay từ bây giờ. Qua đó mới thấy khâu thiết kế, cấu trúc CSDL ban đầu là tối quan trọng
Tất nhiên không ai có thể tránh sai lầm 1 khi mới bắt đầu.
Vậy nên mình cũng đã sửa lại cấu trúc CSDL, bạn xem xét & cho í kiến

(2) Đồng í với bạn là làm trên Form, nhưng là form hiện có luôn hay Form khác mới là vấn đề.
Nhưng theo mình ta tiếp tục cho xong cái Form này đi đã.
 

File đính kèm

Upvote 0
(1) Hiển thị thì được rồi đó. Bạn còn đòi sửa 1 hay cặp trong cả 6 trường/cột nữa, phải không?
Có nghĩa là sửa mã mặt hàng (kéo theo sửa tên mặt hàng); Sửa Mã KH (kéo theo sửa tên khách hàng; Sửa số lượng đặt hàng & tình trạng thanh toán.
Như vậy thì từng dòng dữ liệu còn thiếu 1 đơn vị thông tin, mà nó không thể thay đổi (ví dụ như số thứ tự, số phiếu hay/kết hợp với ngày tháng đặt hàng.
Nếu không có nó ta chả thể làm được gì khác & chỉ sau vài ba ngày CSDL của bạn sẽ thành đống rác bốt mùi.
Vậy nên ta cần chỉnh sửa ngay từ bây giờ. Qua đó mới thấy khâu thiết kế, cấu trúc CSDL ban đầu là tối quan trọng
Tất nhiên không ai có thể tránh sai lầm 1 khi mới bắt đầu.
Vậy nên mình cũng đã sửa lại cấu trúc CSDL, bạn xem xét & cho í kiến

(2) Đồng í với bạn là làm trên Form, nhưng là form hiện có luôn hay Form khác mới là vấn đề.
Nhưng theo mình ta tiếp tục cho xong cái Form này đi đã.
Cảm ơn Hoang2013 đã giúp đỡ đúng ý mình, nhờ có bạn mà mình lại học được thêm kiến thức về cách xây dựng CSDL, cách xây dựng của bạn rất hợp lí. Mình có thể nhờ bạn giúp 1 chút nữa được không, mình còn 1 file nữa, bạn có thể giúp mình viết code tương tự với cbxLenh làm tiêu chuẩn tìm kiếm, nếu thỏa mãn thì list box sẽ hiện hết các thông tin từ cột A:H, và khi mình click vào 1 giá trị thì giá trị của hàng được lựa chọn sẽ add dữ liệu vào 4 textbox tương ứng bên dưới, sau đó nếu ấn cập nhật thì dữ liệu có thể trực tiếp thay đổi ở trên bảng tính có sẵn được không. Mình biết là đòi hỏi quá nhưng bạn bớt chút thời gian giúp mình với nhé. Mình xin chân thành cảm ơn !
 

File đính kèm

Upvote 0
Rất sẵn lòng! Nhưng cần bạn nói rõ vấn đề như sau:
Trên cùng của Form là 1 ComboBox; Nó sẽ lấy dữ liệu từ đâu (nguồn của nó)
Thông thường thì ComboBox giúp ta chọn 1 (dòng) trong 1 danh sách nào đó; Ở đây chắc cột [A:a] của CSDL;
Như vậy là chọn 1 trong ngàn dòng cũng mệt.
Nếu đó là 1 TextBox thì là chuyện khác; Ta có thể gõ vô đó vài ba kí tự & ấn nút lệnh tìm; Bảo VBA tìm & hiện kết quả lên ListBox
(Nếu dữ liệu nhiều ta nên chọn cách này; Vì không tài thánh nào nhớ hết trong đầu các mã lệnh không ngắn chút nào như vậy.)
 
Upvote 0
Rất sẵn lòng! Nhưng cần bạn nói rõ vấn đề như sau:
Trên cùng của Form là 1 ComboBox; Nó sẽ lấy dữ liệu từ đâu (nguồn của nó)
Thông thường thì ComboBox giúp ta chọn 1 (dòng) trong 1 danh sách nào đó; Ở đây chắc cột [A:a] của CSDL;
Như vậy là chọn 1 trong ngàn dòng cũng mệt.
Nếu đó là 1 TextBox thì là chuyện khác; Ta có thể gõ vô đó vài ba kí tự & ấn nút lệnh tìm; Bảo VBA tìm & hiện kết quả lên ListBox
(Nếu dữ liệu nhiều ta nên chọn cách này; Vì không tài thánh nào nhớ hết trong đầu các mã lệnh không ngắn chút nào như vậy.)
Hi.
Chính xác là dùng cột A của Sheet1 để tham chiếu, bạn giúp mình bằng cách nào cũng được dù là textbox hay combobox, cách nào ngắn gọn và đơn giản nhất để khi đọc mình có thể học hỏi. Còn các mã lệnh do trên phiếu mình dùng mã vạch quét nên chắc sẽ không sao.
 
Upvote 0
Rất sẵn lòng! Nhưng cần bạn nói rõ vấn đề như sau:
Trên cùng của Form là 1 ComboBox; Nó sẽ lấy dữ liệu từ đâu (nguồn của nó)
Thông thường thì ComboBox giúp ta chọn 1 (dòng) trong 1 danh sách nào đó; Ở đây chắc cột [A:a] của CSDL;
Như vậy là chọn 1 trong ngàn dòng cũng mệt.
Nếu đó là 1 TextBox thì là chuyện khác; Ta có thể gõ vô đó vài ba kí tự & ấn nút lệnh tìm; Bảo VBA tìm & hiện kết quả lên ListBox
(Nếu dữ liệu nhiều ta nên chọn cách này; Vì không tài thánh nào nhớ hết trong đầu các mã lệnh không ngắn chút nào như vậy.)
mình cũng dùng thử combobox chia làm 8 cột và tham chiếu từ cột A2:H, nếu thỏa mãn kết quả thì các đầu mục sẽ hiện tương ướng với các textbox và chỉnh sửa được nhưng khổ nỗi mình chỉ biết làm cho nó hiện được 1 mã theo thứ tự từ trên xuống, nếu có 2 mã giống nhau 1 mã đã xuất 1 mã chưa thì lại phải lăn chuột tìm chứ không hiện được danh sách như bạn để lựa chọn cái chưa xuất.
 
Upvote 0
Bạn thử với file này & mai cho biết í kiến; Xài TextBox để tìm 1 fần của "Lệnh"
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom