Windows Form Làm thế nào để định vị cột và dòng nhập dữ liệu (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

binhtv69

Thành viên mới
Tham gia
9/5/21
Bài viết
2
Được thích
0
Chào các bác
Hiện tại mình cần nhập dữ liệu theo yêu cầu của Sếp
Sếp đưa cho1 sấp tài liệu nhiều quá mình không thể nhập tay hết được, nên mình có tìm hiểu VBA nó giúp mình làm lẹ hơn, nhưng mình mới tìm hiểu nên không rành
mong bro giúp mình viết code định vị để mình nhập dữ liệu cho nhanh với
Ví dụ Trường Dãy H, mình nhập 5 ; TT mình nhập 6, Ký tự nhập 100 thì tự động nó nhập 100 vào phần khoanh đỏ.
Mong được sự giúp đở của các bác.
Em xin cám ơn

hop.jpg
 

File đính kèm

Chào các bác
Hiện tại mình cần nhập dữ liệu theo yêu cầu của Sếp
Sếp đưa cho1 sấp tài liệu nhiều quá mình không thể nhập tay hết được, nên mình có tìm hiểu VBA nó giúp mình làm lẹ hơn, nhưng mình mới tìm hiểu nên không rành
mong bro giúp mình viết code định vị để mình nhập dữ liệu cho nhanh với
Ví dụ Trường Dãy H, mình nhập 5 ; TT mình nhập 6, Ký tự nhập 100 thì tự động nó nhập 100 vào phần khoanh đỏ.
Mong được sự giúp đở của các bác.
Em xin cám ơn

View attachment 305791
Làm như thế này thì còn lâu hơn nhập thẳng vào ô.
 
Upvote 0
Không phải bạn, Vì sếp gửi cả sấp tài liệu như dưới, nó không tuần tự, nên mình mới cần VBA như trên

1732242339820.png
 
Upvote 0
Chào các bác
Hiện tại mình cần nhập dữ liệu theo yêu cầu của Sếp
Sếp đưa cho1 sấp tài liệu nhiều quá mình không thể nhập tay hết được, nên mình có tìm hiểu VBA nó giúp mình làm lẹ hơn, nhưng mình mới tìm hiểu nên không rành
mong bro giúp mình viết code định vị để mình nhập dữ liệu cho nhanh với
Ví dụ Trường Dãy H, mình nhập 5 ; TT mình nhập 6, Ký tự nhập 100 thì tự động nó nhập 100 vào phần khoanh đỏ.
Mong được sự giúp đở của các bác.
Em xin cám ơn

View attachment 305791
Tìm hiểu phương thức offset của range
range.offset
thì sẽ hiểu và cách để áp dụng định vị theo 1 ô gốc nào đó
 
Upvote 0
nhập tay như này VBA làm gì cho lâu, cứ nhập thẳng vào ô excel là nhanh nhất
 
Upvote 0
Dùng 1 biến định vị dòng. Dùng sự kiện afterUpdate của từng textbox trên form
Thí dụ:
Public dong as long
dong = ActiveCell.Row
Sự kiện textbox1_AfterUpdate
dong = dong + 1
ActiveSheet.Cells(dong, 3) = textbox1

Sự kiện textbox2 và textbox3 không tăng dong

Trước khi mở form, đứng ở dòng cuối có dữ liệu, cột nào cũng được
 
Upvote 0
Dùng 1 biến định vị dòng. Dùng sự kiện afterUpdate của từng textbox trên form
Thí dụ:
Public dong as long
dong = ActiveCell.Row
Sự kiện textbox1_AfterUpdate
dong = dong + 1
ActiveSheet.Cells(dong, 3) = textbox1

Sự kiện textbox2 và textbox3 không tăng dong

Trước khi mở form, đứng ở dòng cuối có dữ liệu, cột nào cũng được
Bài này không cần dong = dong +1 anh.
Cứ để trống cả 2 textbox để chủ thớt tự nhập, sự kiện on enter thì lưu và xoá trắng textbox là được rồi. Thêm phím nóng cho hành động xoá sau khi nhập định vị ô cần xoá.
 
Upvote 0
Chào các bác
Hiện tại mình cần nhập dữ liệu theo yêu cầu của Sếp
Sếp đưa cho1 sấp tài liệu nhiều quá mình không thể nhập tay hết được, nên mình có tìm hiểu VBA nó giúp mình làm lẹ hơn, nhưng mình mới tìm hiểu nên không rành
mong bro giúp mình viết code định vị để mình nhập dữ liệu cho nhanh với
Ví dụ Trường Dãy H, mình nhập 5 ; TT mình nhập 6, Ký tự nhập 100 thì tự động nó nhập 100 vào phần khoanh đỏ.
Mong được sự giúp đở của các bác.
Em xin cám ơn

View attachment 305791
Gửi nhầm file rồi bạn.
 
Upvote 0
Bài này không cần dong = dong +1 anh.
Cứ để trống cả 2 textbox để chủ thớt tự nhập, sự kiện on enter thì lưu và xoá trắng textbox là được rồi. Thêm phím nóng cho hành động xoá sau khi nhập định vị ô cần xoá.
Tất nhiên là lưu và xóa trắng, quay lại nhập tiếp (setFocus chẳng hạn). Nhưng lưu xuống đâu? Nhập 100 dòng dữ liệu từ giấy mà tham số dong không + 1 thì lưu mãi vào 1 chỗ sao?
Còn nút xóa tôi chưa nói tới: Phải chọn dòng trước rồi mới xóa bằng Refedit hoặc Inputbox.
 
Upvote 0
Tất nhiên là lưu và xóa trắng, quay lại nhập tiếp (setFocus chẳng hạn). Nhưng lưu xuống đâu? Nhập 100 dòng dữ liệu từ giấy mà tham số dong không + 1 thì lưu mãi vào 1 chỗ sao?
Còn nút xóa tôi chưa nói tới: Phải chọn dòng trước rồi mới xóa bằng Refedit hoặc Inputbox.
Chủ thớt nói gõ tham số dòng cột vào 2 textbox rồi đó anh.
 
Upvote 0
Chủ thớt nói gõ tham số dòng cột vào 2 textbox rồi đó anh.
Tôi xin lỗi chưa xem file và xem hình chưa kỹ nên tưởng nhập liệu 3 thông tin trên 3 cột.

Tuy nhiên cách tiếp cận dòng cột kiểu tự chọn STT, chọn dãy H mấy thì sẽ tốn công hơn. Sẽ phải find STT lấy dòng, find lớp lấy cột. Một lần nhập liệu 1 con số là phải tìm. Tại sao không nhập hết 1 dòng rồi qua dòng mới, hoặc nhập hết 1 cột rồi qua cột mới?

Tôi đưa ra giải pháp cho việc nhập liệu theo từng cột:
- Có 1 textbox hoặc combobox chọn dãy lớp. Dùng hàm Find để xác định Column. Lúc này sẽ nhập liệu từng cột. Đổi giá trị combobox sẽ nhập liệu cột mới.
- Khi vừa chọn dãy lớp, tìm dòng cuối có dữ liệu của cột đó, gán cho biến dong như bài trên. Có lẽ vẫn cần biến public.
- Do chỉ nhập liệu 1 ô (chứ không phải 3 ô như tôi nhầm), thì chỉ 1 textbox nhập liệu:
sự kiện exit hoặc Before Update, tăng dong lên 1, ghi xuống dong mới tăng và cột ở gạch đầu dòng thứ nhất. Xóa trắng và nhập giá trị mới.

Ghi chú là sử dụng đúng sự kiện để:
- Giữ con trỏ lại trong textbox
- với keyCode hoặc KeyASCII nào đó sẽ nhảy lên (focus vào) combobox để sửa cột, hoặc đóng form, ...
 
Upvote 0
. . . .
(1) Hiện tại mình cần nhập dữ liệu theo yêu cầu của Sếp
Sếp đưa cho1 sấp tài liệu nhiều quá mình không thể nhập tay hết được, nên mình có tìm hiểu VBA nó giúp mình làm lẹ hơn, nhưng mình mới tìm hiểu nên không rành
mong bro giúp mình viết code định vị để mình nhập dữ liệu cho nhanh với
Ví dụ Trường Dãy H, mình nhập 5 ; TT mình nhập 6, Ký tự nhập 100 thì tự động nó nhập 100 vào phần khoanh đỏ.
Mong được sự giúp đở của các bác.
. . . .
Bạn viết thừa cụm từ 'của Sếp'; Ở cồng đồng này người ta không cần đếm xỉa đến Sếp của bạn;
Cái cần là bạn nhập vào tên trang tính nào trong 14 trang tính thì lại không đề cập đến; & như vậy vô hành chung bạn làm khó thêm cho những người có nhã ý giúp bạn rồi còn gì!
Nếu là mình thì cần viết là dùng form nào (trong 16 cái form của bạn (chứng tỏ bạn chưa tôn trọng người mà bạn cầu để được giúp đỡ; ngược lại mình cho rằng bạn đem Sếp (của bạn) có í để hù dọa cộng đồng này;

& như mình thì thanh lọc bớt file (bỏ bớt những trang không hay chưa liên quan đến nhập liệu) cũng nhưng bớt các form không liên quan để tránh làm loãng câu hỏi;
Những mong lần sau bạn chú ý hơn!

CHÚC MỌI NGƯỜI VUI KHỎE TRONG NHỮNG NGÀY CUỐI TUẦN!
 
Upvote 0
ngược lại mình cho rằng bạn đem Sếp (của bạn) có í để hù dọa cộng đồng này;
Tôi thì cho rằng người ta chỉ đang kể khổ chứ không phải "hù dọa". Anh nhạy cảm quá mức. Hãy nghĩ đơn giản cho người ta trước khi suy diễn và gán tánh xấu cho họ.
 
Upvote 0
Tôi thì cho rằng người ta chỉ đang kể khổ chứ không phải "hù dọa". Anh nhạy cảm quá mức. Hãy nghĩ đơn giản cho người ta trước khi suy diễn và gán tánh xấu cho họ.
Than vãn, kể lể không phải là tánh xấu à?
Cỡ nữa ram giấy (250 tờ) này tôi nhai gọn. Thay vì Vê-Bê-A này nọ thì tự ngồi gõ có lẽ xong từ ngày thứ bảy.

Đừng nói với tôi là cuối tuần người ta chở vợ đi ăn cao lâu, thảy cái đề bài cho bọn rỗi rảnh gõ dữ liệu và code VBA giùm.
 
Upvote 0
Tôi xin lỗi chưa xem file và xem hình chưa kỹ nên tưởng nhập liệu 3 thông tin trên 3 cột.

Tuy nhiên cách tiếp cận dòng cột kiểu tự chọn STT, chọn dãy H mấy thì sẽ tốn công hơn. Sẽ phải find STT lấy dòng, find lớp lấy cột. Một lần nhập liệu 1 con số là phải tìm. Tại sao không nhập hết 1 dòng rồi qua dòng mới, hoặc nhập hết 1 cột rồi qua cột mới?

Tôi đưa ra giải pháp cho việc nhập liệu theo từng cột:
- Có 1 textbox hoặc combobox chọn dãy lớp. Dùng hàm Find để xác định Column. Lúc này sẽ nhập liệu từng cột. Đổi giá trị combobox sẽ nhập liệu cột mới.
- Khi vừa chọn dãy lớp, tìm dòng cuối có dữ liệu của cột đó, gán cho biến dong như bài trên. Có lẽ vẫn cần biến public.
- Do chỉ nhập liệu 1 ô (chứ không phải 3 ô như tôi nhầm), thì chỉ 1 textbox nhập liệu:
sự kiện exit hoặc Before Update, tăng dong lên 1, ghi xuống dong mới tăng và cột ở gạch đầu dòng thứ nhất. Xóa trắng và nhập giá trị mới.

Ghi chú là sử dụng đúng sự kiện để:
- Giữ con trỏ lại trong textbox
- với keyCode hoặc KeyASCII nào đó sẽ nhảy lên (focus vào) combobox để sửa cột, hoặc đóng form, ...
Cho em hỏi cũng tương tự là cột và hàng đều sử dụng combobox thì dùng hàm gì để xác định vị trí ô cần nhập dữ liệu vậy anh?
Em đang tìm kiếm cách làm tương tự như chủ thớt nhưng thay vì dùng textbox1 và textbox2 để xác định vị trí ô cho textbox3 nhập liệu thì em sẽ dùng combobox1 và combobox2 để cung cấp dữ liệu xác định vị trí ô textbox3 ạ.
Nếu em có gì diễn đạt chưa rõ ràng thì mọi người nhắc nhở để em trình bày thêm nhé. Em cảm ơn ạ.
 

File đính kèm

Upvote 0
Nếu tên bộ phận đúng như trong file, (nghĩa là 'Bộ phận XXX' thì ta xài TextBox có lẽ tiện hơn; Khi đó nhập '1' sẽ tương đương cột C (cột thứ 3),. . . .
Còn tên mặt hàng thì chắc không như trong trang tính của bạn; lúc đó xài ComboBox là tiện rồi; Chịu khó tua chuột để tìm đúng tên là được thôi;
Sau khi nhập mặt hàng thì ta tìm dòng chưa tên (mặt hàng) nhờ phương thức FIND() trong VBA, hay duyệt trong vòng lặp từ đầu đến cuối thôi;
 
Upvote 0
Cho em hỏi cũng tương tự là cột và hàng đều sử dụng combobox thì dùng hàm gì để xác định vị trí ô cần nhập dữ liệu vậy anh?
Em đang tìm kiếm cách làm tương tự như chủ thớt nhưng thay vì dùng textbox1 và textbox2 để xác định vị trí ô cho textbox3 nhập liệu thì em sẽ dùng combobox1 và combobox2 để cung cấp dữ liệu xác định vị trí ô textbox3 ạ.
Nếu em có gì diễn đạt chưa rõ ràng thì mọi người nhắc nhở để em trình bày thêm nhé. Em cảm ơn ạ.
Tham khảo . (làm theo gợi ý của anh @SA_DQ )
Trong form bạn nên thêm 1 nút commadButton để nhấn vào nút này dữ liệu ở Textbox 1 sẽ được gán vào sheet1
 

File đính kèm

Upvote 0
Vẻ vời cách tìm cột của bộ phận cần nhập dữ liệu như sau:
PHP:
 Dim GPE As String, Col As Integer

GPE = Me!ComboBox1.Text
Col = 2 + Int(Mid$(GPE, 1 + InStrRev(GPE, " "), 3))
MsgBox Col
 
Upvote 0
. . . .
Trong form bạn nên thêm 1 nút commadButton để nhấn vào nút này dữ liệu ở Textbox 1 sẽ được gán vào sheet1
Trong Form của bạn có xài phương thức FIND()
Nhưng cách xài như vậy chỉ đúng thôi, chưa đủ chắc chắn lắm ở mọi lúc, mọi nơi;
Thường phương thức FIND() trong VBA phải viết chân phương vầy mới đặng:
PHP:
 Dim Rng As Range, sRng As Range
Set Rn=[A1].resize( Sheet1.UsedRange.Rows.Count)
Set sRng=Rng.Find(. . . )
If Not sRng Is Nothing Then
' . . . . '

Có vậy mới khỏi bị kiện cáo đến cuối đời (của macro hay người viết macro)!
:D :D :D
 
Upvote 0
Trong Form của bạn có xài phương thức FIND()
Nhưng cách xài như vậy chỉ đúng thôi, chưa đủ chắc chắn lắm ở mọi lúc, mọi nơi;
Thường phương thức FIND() trong VBA phải viết chân phương vầy mới đặng:
PHP:
 Dim Rng As Range, sRng As Range
Set Rn=[A1].resize( Sheet1.UsedRange.Rows.Count)
Set sRng=Rng.Find(. . . )
If Not sRng Is Nothing Then
' . . . . '

Có vậy mới khỏi bị kiện cáo đến cuối đời (của macro hay người viết macro)!
:D :D :D
Cảm ơn anh đã hướng dẫn và chỉ bảo cặn kẽ.
Trong bài tôi cũng đã định làm như anh hướng dẫn, nhưng xét thấy, Combobox được lấy từ chính các dòng và các cột của trang cần gán kết quả, nên nghĩ rằng không có thể có chuyện là find không tìm thấy kết quả.
 
Upvote 0
Đầu tiên, em rất cảm ơn mọi người đã cho em nhiều gợi ý để hiểu rõ hơn về hàm FIND() để áp dụng thành công vào công việc em đang làm. Em muốn hỏi thêm về một vấn đề về sự kiện change của combobox1 và combobox2.
Trước đây em có thử sử dụng sự kiện change của combobox để các textbox được gán dữ liệu của các ô cùng hàng với ô chứa dữ liệu gán cho Combobox và may mắn là đã hoạt động đúng như em mong muốn.
Hiện tại em đang tìm hiểu cách tạo hai sự kiện change của Combobox1 và Combobox2 thì textbox1 được gán dữ liệu từ ô giao nhau từ dữ liệu của Combobox1 và Combobox2. Em muốn hỏi là suy nghĩ theo chiều hướng này có khả thi để thực hiện không ạ? Nếu không khả thi thì mong mọi người gợi ý cho em một hướng khác để em nguyên cứu ạ.
Em xin phép được đưa ra một ví dụ để diễn giải cho dễ hiểu ạ.
Ví dụ: Combobox1 chọn MẶT HÀNG 099 và Combobox2 chọn BỘ PHẬN 10, giá trị ô đó đang có là 5. Em muốn khi đã chọn 2 combobox xong thì số 5 sẽ được gán vào textbox1 và người nhập dữ liệu có thể dựa vào số 5 đấy để cập nhật dữ liệu mới cho đúng ạ.
 
Upvote 0
Hiện tại em đang tìm hiểu cách tạo hai sự kiện change của Combobox1 và Combobox2 thì textbox1 được gán dữ liệu từ ô giao nhau từ dữ liệu của Combobox1 và Combobox2.
Việc này đơn giản thôi bạn. Bạn cứ đảo ngược cái code tôi lưu từ textbox xuống ô Excel là được rồi.
 
Upvote 0
Việc này đơn giản thôi bạn. Bạn cứ đảo ngược cái code tôi lưu từ textbox xuống ô Excel là được rồi.
Dạ, việc đảo ngược code lưu từ textbox xuống ô Excel thì em có nghĩ đến và thực hiện thành công với sự kiện change của 1 combobox. Nhưng trường hợp này là 2 combobox nên em chưa nghĩ được cách thực hiện, anh @ongke0711 có thể gợi ý thêm được không?
 
Upvote 0
Đầu tiên, em rất cảm ơn mọi người đã cho em nhiều gợi ý để hiểu rõ hơn về hàm FIND() để áp dụng thành công vào công việc em đang làm. . . . . .
Mình xin nhấn mạnh thêm lại 1 lần nữa: FIND() là 1 phương thức; không phải là 1 hàm trong VBA;

Chúc mọi người vui vẻ & thành công nguyên ngày!
 
Upvote 0
. . . . .x. Nhưng trường hợp này là 2 combobox nên em chưa nghĩ được cách thực hiện,. . . .
Thông thường bạn sẽ tiến hành nhập dữ liệu theo hàng hay theo cột?
Nếu là mình thì (theo hình bài 1 của bạn) mình sẽ nhập theo từng cột. & chuyện này cũng có nghĩa lả tạm thời cố định 1 ComboBox (cho đến khi nhập xong DL của 1 cột
 
Upvote 0
Dạ, việc đảo ngược code lưu từ textbox xuống ô Excel thì em có nghĩ đến và thực hiện thành công với sự kiện change của 1 combobox. Nhưng trường hợp này là 2 combobox nên em chưa nghĩ được cách thực hiện, anh @ongke0711 có thể gợi ý thêm được không?
Bạn copy thêm đoạn code này.

JavaScript:
Private Sub cboBoPhan_Change()
    laySoLuong
End Sub

Private Sub cboMatHang_Change()
    laySoLuong
End Sub

Sub laySoLuong()
    If Len(Trim(Me.cboBoPhan)) = 0 Or Len(Trim(Me.cboMatHang)) = 0 Then Exit Sub
    Me.txtSoLuong.Value = sht.Cells(Me.cboMatHang.ListIndex + startRow, Me.cboBoPhan.ListIndex + startCol).Value
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sự khác nhau giữa phương thức và hàm:
- Phương thức là 1 hành động, sinh ra hệ quả. Hàm là 1 biểu thức cho ra 1 kết quả là 1 giá trị hoặc 1 tập hợp giá trị.
- Phương thức có thể có tham số, nhưng không có mở/ đóng ngoặc. Hàm chứa các tham số trong cặp dấu ngoặc.
- Có thể gán kết quả 1 hàm cho 1 biến, nhưng phương thức không có kết quả nên không thể gán cho 1 biến


Đối với Find của VBA: Đó là hàm. Có cặp dấu ngoặc ()

- nếu không có cặp dấu (), chỉ là tìm kiếm. Tìm thấy hay không cũng chẳng biết, cũng không báo lỗi
Mã:
Sheet2.Range("A1:A100").find "abc"
- Nếu không gán kết quả hàm cho 1 biến, thì không thể tìm được thuộc tính trực tiếp từ Find. Chỉ có thể Find xong rồi select nó, sau đó lấy thuộc tính của ActiveCell. Nếu không tìm thấy mà select sẽ báo lỗi.
Mã:
Sheet2.Range("A1:A100").Find("abc").Select
Không tìm thấy thì nguyên mệnh đề có giá trị là Nothing. Thử bằng câu lệnh sau
Mã:
If Sheet2.Range("A1:A100").find("abc") Is Nothing Then MsgBox "Not found"
- Nếu gán giá trị của hàm cho 1 biến, giá trị nhận được là 1 đối tượng loại Range. đối tượng này có đầy đủ các thuộc tính của Range. Nếu không tìm thấy, kết quả là biến nhận giá trị Nothing chứ không lỗi.
Mã:
Set Cll = Sheet2.Range("A1:A100").find("abc")
 
Upvote 0
Copilot:
Trong VBA Excel, FIND() là một phương thức (method), không phải là một hàm (function).
Cụ thể, phương thức FIND() là một phần của đối tượng Range, được sử dụng để tìm kiếm một giá trị cụ thể trong một phạm vi ô.

XYZ:
Có, làm sao phân biết giữa 1 hàm & 1 phương thức?

Để phân biệt giữa hàm (function) và phương thức (method), chúng ta hãy xem qua các đặc điểm chính của mỗi cái:

Hàm (Function)​

  1. Độc lập: Hàm là một đoạn mã độc lập có thể thực thi và trả về giá trị. Nó không phụ thuộc vào đối tượng nào.
  2. Gọi trực tiếp: Hàm có thể được gọi trực tiếp từ bất kỳ đâu trong chương trình mà không cần một đối tượng cụ thể.
  3. Trả về giá trị: Hàm thường trả về một giá trị thông qua từ khóa Return.

    Phương thức (Method)
    1. Thuộc về đối tượng: Phương thức là một hàm được liên kết với một đối tượng. Bạn cần có một thể hiện của đối tượng để gọi phương thức.
    2. Truy cập thông qua đối tượng: Phương thức được gọi thông qua một đối tượng cụ thể.
    3. Thao tác trên đối tượng: Phương thức thường thực hiện các thao tác trên dữ liệu nội tại của đối tượng hoặc có liên quan đến đối tượng đó.
 
Upvote 0
Phương thức (Method)
  1. Thuộc về đối tượng: Phương thức là một hàm được liên kết với một đối tượng. Bạn cần có một thể hiện của đối tượng để gọi phương thức.
Dạ, "Phương thức là 1 hàm được liên kết" (sic)
Nhưng vẫn có chỗ sai. Phương thức có khi là 1 hàm, có khi chẳng phải hàm, chỉ là 1 hành động. Chẳng hạn phương thức copy, Save, AutoFilter, ...
 
Upvote 0
Như thế này gọi là máy móc, không nắm chắc lý thuyết rồi.
Có thể là vậy. Là nói về máy móc có hay không có dấu ngoặc khi sử dụng.

Nhưng bài 32 và 34 chỉ nói về hàm và phương thức của VBA, không phải hàm tự tạo và thủ tục (sub)
Một đoạn code hoàn chỉnh, bỏ trong hàm, rồi trong code cứ gán giá trị cho biến bất kỳ thì đó không gọi là kết quả của hàm. Biến Giatrimoi không phải kết quả của hàm.
Cũng đoạn code đó bỏ trong thủ tục (Sub) thì chỉ là hành động và là hành động gán giá trị cho 1 biến.

Cũng thí dụ như bài 35, cũng Msgbox Giatrimoi thì được, nhưng Msg Hamday không dấu ngoặc thì lỗi ngay khi đang viết lệnh. Nếu bỏ trong ngoặc thì được giá trị là "Hi hi"

1732762344365.png
 
Upvote 0
Một đoạn code hoàn chỉnh, bỏ trong hàm, rồi trong code cứ gán giá trị cho biến bất kỳ thì đó không gọi là kết quả của hàm. Biến Giatrimoi không phải kết quả của hàm.
Cũng đoạn code đó bỏ trong thủ tục (Sub) thì chỉ là hành động và là hành động gán giá trị cho 1 biến.

Như thế này chắc chắn là máy móc rồi.
Cũng thí dụ như bài 35, cũng Msgbox Giatrimoi thì được, nhưng Msg Hamday không dấu ngoặc thì lỗi ngay khi đang viết lệnh. Nếu bỏ trong ngoặc thì được giá trị là "Hi hi"

Lý thuyết về phương thức/ thủ tục/ hàm không có chỗ nào nói về cái dấu ngoặc để phân biệt cả.
Anh cần vận dụng thật nhiều thì sẽ biết cách sử dụng uyển chuyển.
 
Upvote 0
Bạn copy thêm đoạn code này.

JavaScript:
Private Sub cboBoPhan_Change()
    laySoLuong
End Sub

Private Sub cboMatHang_Change()
    laySoLuong
End Sub

Sub laySoLuong()
    If Len(Trim(Me.cboBoPhan)) = 0 Or Len(Trim(Me.cboMatHang)) = 0 Then Exit Sub
    Me.txtSoLuong.Value = sht.Cells(Me.cboMatHang.ListIndex + startRow, Me.cboBoPhan.ListIndex + startCol).Value
End Sub
Dạ cảm ơn anh @ongke0711
Sau khi em cập nhật lại giá trị của của startCol, startRow và tùy chỉnh cho phù hợp thì đã áp dụng thành công với em.
Em muốn hỏi thêm về một dòng code làm treo ứng dụng excel đang hoạt động ạ.
Vì em xóa đi dòng code đó thì file hoạt động rất ổn định còn nếu giữ nguyên như code ban đầu của anh @ongke0711 hướng dẫn thì chỉ dùng được vài lần nhập liệu thì file Excel sẽ bị treo và ứng dụng Excel sẽ bị khởi động lại. Anh @ongke0711 có thể giúp em hiểu lý do vì sao không ạ?
Mã:
Private Sub cmdNhap_Click()
    sht.Cells(Me.cboMatHang.ListIndex + startRow + 2, Me.cboBoPhan.ListIndex + startCol + 1).value = Me.txtSoLuong.value
    'Me.cboBoPhan.SetFocus (Dòng code làm ứng dụng Excel bị treo và tự khởi động lại ứng dụng)
    Me.cboBoPhan = ""
    Me.cboMatHang = ""
    Me.txtSoLuong = ""
End Sub
 
Upvote 0
Lý thuyết về phương thức/ thủ tục/ hàm không có chỗ nào nói về cái dấu ngoặc để phân biệt cả.
Cứ coi như là vận dụng hàm để tạo hành động và không dùng dấu ngoặc. (gọi là uyển chuyển, nhưng hơi gượng).
Cũng như dùng hàm Find như là 1 phương thức.
Dù sao thì hàm vẫn trả về 1 kết quả, và muốn lấy kết quả đó thì phải có dấu ngoặc. Phương thức thì không có kết quả, mà chỉ có hệ quả của hành động. Chẳng hạn như phương thức Copy, Move, Save, FillDown
 
Upvote 0
Trên thực tế hàm chả khác gì phương thức ngoài cái tính năng hàm thì có thể trả về một giá trị.

Nếu dịch "hàm" là Function, và "phương thức" là procedure (tiếng mới) hay subroutine (tiếng cũ) thì nó chỉ vỏn vẹn vậy. Lý do tại sao lại phân biệt Func/Sub thì phải hỏi IBM, lão này mới là chúa của cách hoạt động máy tính. Hầu hết các tiêu chuẩn đều từ một cái gì đó của lão IBM.
Riêng bọn Unix thì không muốn lệ thuộc cho nên các ngôn ngữ về sau này đều coi subroutine là Function. JavaScript dùng từ khóa void để cho biết rằng hàm không cần phải trả về cái gì cả.

Những tên gọi khác của Function và Sub chỉ là cách người ta diễn giải theo LT HĐT.

Chat GPT trả lời như hạch. Không còn chỗ bào chữa. Có lẽ tiêu chí AI là không đọc sách và không chấp nhận những gì thuộc về thế kỷ trước.

(*) Procedure = phương thức
subroutine = routine (nhóm lệnh) con
 
Upvote 0
Trên thực tế hàm chả khác gì phương thức ngoài cái tính năng hàm thì có thể trả về một giá trị.

Nếu dịch "hàm" là Function, và "phương thức" là procedure (tiếng mới) hay subroutine (tiếng cũ) ...
Tôi cũng nói như vậy. Trong VBA thì tôi đang nói về find là 1 hàm dùng như 1 method, hay chỉ là 1 method giống như Save, copy, Move, ... (mở rộng ra Sub và Function thì tôi biết thêm, nhưng không phải ý chính tôi muốn nói.
Find trả về 1 giá trị, vậy nó là hàm. Hàm gắn vào đối tượng gì gì đó rồi gọi là method thì đồng ý, nhưng bản chất nó cứ là hàm. Ấy vậy mà khi tôi gọi hàm Find thì sinh ra cuộc thảo luận này.
 
Upvote 0
Bạn copy thêm đoạn code này.

JavaScript:
Private Sub cboBoPhan_Change()
    laySoLuong
End Sub

Private Sub cboMatHang_Change()
    laySoLuong
End Sub

Sub laySoLuong()
    If Len(Trim(Me.cboBoPhan)) = 0 Or Len(Trim(Me.cboMatHang)) = 0 Then Exit Sub
    Me.txtSoLuong.Value = sht.Cells(Me.cboMatHang.ListIndex + startRow, Me.cboBoPhan.ListIndex + startCol).Value
End Sub
Anh @ongke0711 cho em hỏi một chút về Activecell.Offset().Active với ạ.
Em muốn ô vừa được nhập liệu sẽ trở thành Activecell nhưng sau khi em thử nghiệm với dòng code như sau thì không hề có thông báo lỗi nào nhưng Activecell vẫn không thay đổi
Mã:
Private Sub cmdNhap_Click()
sht.Cells(Me.cboMatHang.ListIndex + startRow + 2, Me.cboBoPhan.ListIndex + startCol + 1).value = Me.txtSoLuong.value
ActiveCell.Offset(Me.cboMatHang.ListIndex + startRow + 2, Me.cboBoPhan.ListIndex + startCol + 1).Activate  'di chuyển activecell đến ô vừa nhập liệu
TestComment 'tạo note cho activecell
Me.cboBoPhan = ""
Me.cboMatHang = ""
Me.txtSoLuong = ""
End Sub
Em nghĩ là em đã hiểu sai về Activecell, hi vọng anh @ongke0711 có thể chia sẽ cho em thêm chút kiến thức về Activecell ạ.
Em cảm ơn ạ.
 
Upvote 0

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

Back
Top Bottom