Windows Form Làm thế nào để định vị cột và dòng nhập dữ liệu

Liên hệ QC
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

  • nhapphieu.xlsm
    1.9 MB · Đọc: 8
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
Một cách khác không cần dùng vòng lặp. Dùng index của ComboBox.
 

File đính kèm

  • NHAPLIEU_ongke0711.xlsb
    30.2 KB · Đọc: 6
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
 
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
Web KT

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

Back
Top Bottom