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

Lần chỉnh sửa cuối:
Upvote 0
:{{Thử file mới thay này xem: :{{:{{
 

File đính kèm

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

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

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

Vẫn như cũ do macro mà bạn đang xài để cập nhật hay thay đổi gì đó đã viết lại đâu. Nó chưa xử với tham số dòng cần sửa mà!

Bạn thử viết bổ sung xem sao.
 
Upvote 0
Vẫn như cũ do macro mà bạn đang xài để cập nhật hay thay đổi gì đó đã viết lại đâu. Nó chưa xử với tham số dòng cần sửa mà!

Bạn thử viết bổ sung xem sao.
hi, mình không biết bổ sung như thế nào cho đúng. Bạn xem và sửa giúp mình với, vì mình chưa hiểu cách dùng table để áp dụng lên VBA, bạn viết và chú thích bên cạnh giúp để mình học hỏi với nhé.
 
Upvote 0
Em có 1 file như đính kèm. File đơn giản chỉ là trích xuất dữ liệu thắng thua của VĐV từ form vào trong sheets.
Ở file sử dụng hàm ghi dữ liệu vào dòng trống tiếp theo của cột đã chỉ định, nói chung có vẻ đã tạm ổn nếu như ta cho các cặp thi đấu theo số trận lần lượt từ 1 đến hết, như vậy Kết quả và Tỷ số sẽ kèm theo không lệch với số trận. Nhưng vấn đề xảy ra là nếu như chọn 1 trận đấu số thứ tự bất kỳ để hiện form và thi đấu thì khi nhấn nút VĐV1 hoặc VĐV 2 để trích xuất dữ liệu kết quả thì Kết quả và Tỷ số của trận đó không còn theo dòng của số trận đó nữa.
---> giải pháp nào để trích xuất dữ liệu kết quả và tỷ số theo số trận đã chọn ạ?
Cảm ơn mọi người!
 

File đính kèm

Upvote 0
Em có 1 file như đính kèm. File đơn giản chỉ là trích xuất dữ liệu thắng thua của VĐV từ form vào trong sheets.
Ở file sử dụng hàm ghi dữ liệu vào dòng trống tiếp theo của cột đã chỉ định, nói chung có vẻ đã tạm ổn nếu như ta cho các cặp thi đấu theo số trận lần lượt từ 1 đến hết, như vậy Kết quả và Tỷ số sẽ kèm theo không lệch với số trận. Nhưng vấn đề xảy ra là nếu như chọn 1 trận đấu số thứ tự bất kỳ để hiện form và thi đấu thì khi nhấn nút VĐV1 hoặc VĐV 2 để trích xuất dữ liệu kết quả thì Kết quả và Tỷ số của trận đó không còn theo dòng của số trận đó nữa.
---> giải pháp nào để trích xuất dữ liệu kết quả và tỷ số theo số trận đã chọn ạ?
Cảm ơn mọi người!
1> Đây là mục giải đáp về code, vướng chỗ code nào thì nêu chỗ đó thôi. Bê cả chương trình lên hỏi.
Như thành viên @HoangHieuxx ở trên, mang cả Form/ dự án lên hỏi, chiếm hơn 1 trang... Tại sao không lập một chủ đề riêng để hỏi?

2> Với trường hợp trong file chỉ là lựa chọn trận đấu, ghi kết quả tỉ số rồi nhập lại bảng lưu trữ thì tốn công vẽ cái Form đó làm gì. Làm luôn ngay trên bảng tính - sheet "Main" đó.
Chỉ cần một ô ghi tỉ số của trận đấu, ô kết quả vận động viên nào thắng thì phải căn cứ vào tỉ số chứ (ai to điểm hơn thì thắng chẳng hạn). Làm 2 cái nút VĐV thắng, click nhầm thì tính sao?
Căn cứ vào số "Trận" mà nhập kết qủa tương ứng với dòng đó bên sheet "DSThiDau".
 
Upvote 0
1> Đây là mục giải đáp về code, vướng chỗ code nào thì nêu chỗ đó thôi. Bê cả chương trình lên hỏi.
Như thành viên @HoangHieuxx ở trên, mang cả Form/ dự án lên hỏi, chiếm hơn 1 trang... Tại sao không lập một chủ đề riêng để hỏi?

2> Với trường hợp trong file chỉ là lựa chọn trận đấu, ghi kết quả tỉ số rồi nhập lại bảng lưu trữ thì tốn công vẽ cái Form đó làm gì. Làm luôn ngay trên bảng tính - sheet "Main" đó.
Chỉ cần một ô ghi tỉ số của trận đấu, ô kết quả vận động viên nào thắng thì phải căn cứ vào tỉ số chứ (ai to điểm hơn thì thắng chẳng hạn). Làm 2 cái nút VĐV thắng, click nhầm thì tính sao?
Căn cứ vào số "Trận" mà nhập kết qủa tương ứng với dòng đó bên sheet "DSThiDau".
Cảm ơn ạ. Mục đích là tìm giải pháp về code nên e hỏi ở đây đâu có gì sai, còn rõ ràng làm trực tiếp trên sheets thì không phải mục đích của em ạ. Ngoài ra file đơn giản, không mang tầm dự án, chỉ nói đến duy nhất mục trích xuất dữ liệu từ nút VĐV1 và VĐV2 nên chỉ cần ALT+F11 là có thể thấy ngay. Đem 1 đoạn code lên hỏi thì lại có ý kiến rằng không kèm file sao mà rõ được...
Mục đích công việc của e cần làm vậy, không cần thiết phải nói rõ vì sao mà mất công tạo form.
Mong a thông cảm nếu làm phiền và khó chịu cho a.
 
Upvote 0
1> Đây là mục giải đáp về code, vướng chỗ code nào thì nêu chỗ đó thôi. Bê cả chương trình lên hỏi.
Như thành viên @HoangHieuxx ở trên, mang cả Form/ dự án lên hỏi, chiếm hơn 1 trang... Tại sao không lập một chủ đề riêng để hỏi?
Thôi thì cho mình trả lời lần cuối:
PHP:
Private Sub cmdxuat_Click()
 Dim Sh As Worksheet, Arr()
 Dim J As Long, Rws As Long

 Set Sh = ThisWorkbook.Worksheets("CSDL")
 Arr() = Sh.[B2].CurrentRegion.Offset(1).Value
 For J = 1 To UBound(Arr())
    If Arr(J, 1) = Me!cblenh.Value And J = Me!tbDg.Value - 1 Then
        Sh.Cells(J + 1, 5).Value = Me!slnhap.Value
        Sh.Cells(J + 1, 6).Value = Me!slxuat.Value
        Sh.Cells(J + 1, 7).Value = Me!nguoixuat.Text
        Sh.Cells(J + 1, 8).Value = Me!nguoinhap.Text
        Exit For
    End If
 Next J
End Sub
Mình sẽ không tiếp tục trả lời loạt bài này nữa ở đây; Sẽ trả lời ở nơi khác thích hợp hơn!.
 
Upvote 0
Web KT

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

Back
Top Bottom