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

  • GPE.rar
    18.7 KB · Đọc: 13
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

  • nhovietcode_quanlixuathang.xlsm
    19.7 KB · Đọc: 9
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

  • GPE.rar
    17.7 KB · Đọc: 15
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"
Hoang2013 ơi về mặt hiển thị thì và tìm kiếm thì đúng rùi, nhưng file này mình muốn trực tiếp thay đổi được trên sheet CSDL , dù điền thêm hay xóa đi 4 mục ở dưới thì CSDL cũng sẽ cập nhật theo, tức là khi ấn cập nhật thì dữ liệu sẽ trực tiếp tác động lên hàng được lựa chon và thay đổi. Bạn thử sửa lại giúp mình nhé.
 
Upvote 0
Hiện tại khi ân vô nút lệnh 'Cập nhật' thì những gì bạn thay đổi trên 4 textBox bên dười sẽ được lưu trên trang tính mà!

Chỉ có điều trên ListBox thì chưa; Muốn có fải thêm vài thao tác nữa, bạn thử xem.
 
Upvote 0
Hiện tại khi ân vô nút lệnh 'Cập nhật' thì những gì bạn thay đổi trên 4 textBox bên dười sẽ được lưu trên trang tính mà!

Chỉ có điều trên ListBox thì chưa; Muốn có fải thêm vài thao tác nữa, bạn thử xem.
Đúng là có cập nhật được nhưng nếu giá trị cột A có 2 lệnh giống nhau khi nhập text sẽ hiển thị lên 2 dòng, lúc mình click dòng thứ 1 sửa thử thì dữ liệu cho phép sửa hàng thứ 1, nhưng mình chọn dòng thứ 2 sửa thì khi cập nhật dữ liệu vẫn tự sửa dòng thứ 1 bạn ơi.
 
Upvote 0
tiện đây cho mình hỏi luôn tác dụng của Sheet GPE với, mình thấy code viết liên quan rất nhiều đến sheet GPE. Có phải mục đích để tham chiếu không vậy bạn?
 
Upvote 0
(**)Đúng là có cập nhật được nhưng nếu giá trị cột A có 2 lệnh giống nhau khi nhập text sẽ hiển thị lên 2 dòng, lúc mình click dòng thứ 1 sửa thử thì dữ liệu cho phép sửa hàng thứ 1, nhưng mình chọn dòng thứ 2 sửa thì khi cập nhật dữ liệu vẫn tự sửa dòng thứ 1 bạn ơi
(*)tiện đây cho mình hỏi luôn tác dụng của Sheet GPE với, mình thấy code viết liên quan rất nhiều đến sheet GPE. Có phải mục đích để tham chiếu không vậy bạn?
(*) Trong trang tính đó có 1 bảng dữ liệu được tạo ra từ 1 macro của 1 Control nào đó trong Form (bạn có thể tự tìm hiểu); Nó làm nguồn cho ListBox để bạn ngó thây 1 cách trực diện dữ liệu bạn iêu cầu cung cấp (Kết quả của công cuộc tìm kiếm theo lệnh của bạn)

(**) Một khi có 2 dòng dữ liệu cùng giống nhau về 'lệnh' thì fải có 1 trường/cột nào đó ghi nhận sự khác biệt của 2 dòng dữ liệu này.
Nếu không thì CSDL của bạn đang là đồ dỡm, trước sau gì cũng quay lại hại bạn mà thôi.
 
Upvote 0
(*) Trong trang tính đó có 1 bảng dữ liệu được tạo ra từ 1 macro của 1 Control nào đó trong Form (bạn có thể tự tìm hiểu); Nó làm nguồn cho ListBox để bạn ngó thây 1 cách trực diện dữ liệu bạn iêu cầu cung cấp (Kết quả của công cuộc tìm kiếm theo lệnh của bạn)

(**) Một khi có 2 dòng dữ liệu cùng giống nhau về 'lệnh' thì fải có 1 trường/cột nào đó ghi nhận sự khác biệt của 2 dòng dữ liệu này.
Nếu không thì CSDL của bạn đang là đồ dỡm, trước sau gì cũng quay lại hại bạn mà thôi.
Uhm vấn đề này khó quá, tại cty mình 1 mã lệnh có số lượng 100 có thể bị chia ra nhập làm nhiều lần, lần 1 là 50 ,lần 2 là 30, lần 30 là 20 và xuất theo thời gian khác nhau nên mới xảy ra trường hợp trùng như vậy. Mình sử dụng combobox thì có thể sửa trực tiếp , nhưng lại phải lắn chuột đi tìm chứ không hiển thị được như listbox. Để mình tìm lại dữ liệu mình từng làm gửi cho bạn tham khảo và xây dựng giúp mình nhé.
 
Upvote 0
Vậy hai dòng giống nhau về mã lệnh đó có 'mã hàng' hay 'mã chỉ thị' khác nhau hay không?
Nếu vẫn không có thì chỉ còn cách tạo thêm 1 trường nữa để ghi nhận sự khác biệt giữa chúng.
Chẳng hạn như số thứ tự hay ngày giờ nhập dữ liệu, . . . .
Nhưng đến lúc đó thì không thể trông mong vô trường 'Lệnh' này làm gì nữa; nên vứt đi thì hơn bạn à!
 
Upvote 0
Vậy hai dòng giống nhau về mã lệnh đó có 'mã hàng' hay 'mã chỉ thị' khác nhau hay không?
Nếu vẫn không có thì chỉ còn cách tạo thêm 1 trường nữa để ghi nhận sự khác biệt giữa chúng.
Chẳng hạn như số thứ tự hay ngày giờ nhập dữ liệu, . . . .
Nhưng đến lúc đó thì không thể trông mong vô trường 'Lệnh' này làm gì nữa; nên vứt đi thì hơn bạn à!
Xin lỗi vì mình cứ lòng vòng làm tốn thời gian và công sức của bạn, mình gửi bạn file ban đầu mình làm, mình vừa lên cty lấy về. Bạn có thể thử sửa 3 dòng đầu bằng Form sẽ hiểu ý minhg (2,3,4 trên Form) vấn đề lớn nhất là Combobox không thể hiển thị hết nếu mình chỉ quét mã số vào thì các textbox chỉ hiển thị mã đầu tiên, mã trùng thứ 2 và thứ 3 thì lại phải click để chọn trong combobox chứ không tự hiện ra nhiều lựa chọn cho mình đc . Nếu như có sự giúp đỡ của bạn làm hiển thị hết từ combobox lên list box tương tự thì tốt quá.
 

File đính kèm

  • quanlixuathang (3).xlsm
    21.7 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
:{{Thử file mới thay này xem: :{{:{{
 

File đính kèm

  • GPE.rar
    19.4 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
đúng ý mình rùi

--=0--=0--=0 nhưng chỗ hiện ra lựa chọn sau khi nhập thử chỉnh sửa dòng 3 thì nó lại sửa dòng 1, :{{:{{ với lại sao mình gõ lệnh nào cũng còn 2 cái dòng 3, 4 k đúng mã vẫn hiện lên ấy, kiểu như mặc định mà mình k tìm được chỗ sửa, mình xóa thử 2 dòng dưới bên Sheet GPE mà bạn tạo 1 talbe DLieu và tham chiếu thành Listbox cũng k sửa được cho mất đi . Bạn xem qua lại giúp mình chit có 2 vấn đề này nữa thui.
 

File đính kèm

  • Form Tìm_2.xls
    61 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Mình mới thay file mới; Trong đó có thêm nút lệnh để hiện dữ liệu lên ListBox sau khi chọn 'Lệnh' mở ComboBox.

Bạn thử xem sao.
 
Upvote 0
Chuẩn rùi Hoang2013 ơi, vấn đề lisbox hiển thị đã được giải quyết, chỉ còn vấn đề là như 3 dòng đầu mình đã nói, khi mình nhập mã 10026579 xong cập nhật list hiển thị 3 dòng , mình click chọn dòng 2 hoặc 3 khi nhập dữ liệu vào vẫn bị update vào dòng 1 của 3 mã giống nhau ấy( tức là dù hiển thị lên đủ tất cả các dòng có cùng mã nhưng khi sửa thì tất cả chỉ update vào dòng đầu tiên, còn các dòng khác không thay đổi)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem lúc đó biến r của bạn tạo ra là bao nhiêu & biến Dg (do mình đề ra) là bao nhiêu
& quan trọng là có liên quan gì đến dòng cần thay đổi hay cập nhật hay không;

Nhưng dù sao cách này cũng tồn tại nhiều rủi ro cực kỳ.

Chắc chắn hơn, ta cần tạo thêm 1 trường/cột trong listBox (8->9) lưu lại chỉ mục dòng của dòng dữ liệu.
(& tất nhiên sẽ hiển thị trên TextBox để ta tìm đến & thay thế hay cập nhật)

Nên vầy không?
 

File đính kèm

  • GPE.rar
    18.6 KB · Đọc: 20
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem lúc đó biến r của bạn tạo ra là bao nhiêu & biến Dg (do mình đề ra) là bao nhiêu
& quan trọng là có liên quan gì đến dòng cần thay đổi hay cập nhật hay không;

Nhưng dù sao cách này cũng tồn tại nhiều rủi ro cực kỳ.

Chắc chắn hơn, ta cần tạo thêm 1 trường/cột trong listBox (8->9) lưu lại chỉ mục dòng của dòng dữ liệu.
(& tất nhiên sẽ hiển thị trên TextBox để ta tìm đến & thay thế hay cập nhật)

Nên vầy không?
như vậy để phân biệt cũng hợp lí, ta cũng có thể nắm được số đơn hàng trùng nhau là bao nhiêu khi hiển thị số thứ tự luôn. Nhưng mình vừa thử hình như vẫn vậy, chon dòng 2,3 thì dữ liệu vẫn đổ vào dòng 1 :p:p:p
 
Upvote 0
Web KT
Back
Top Bottom