Tạo Form nhập liệu để điền dữ liệu vào bảng có ô được gộp

Liên hệ QC

Cát Lượng

Thành viên tiêu biểu
Tham gia
14/11/18
Bài viết
403
Được thích
66
Em chào các anh/chị.
Xin được nhờ anh/chị giúp em Form nhập liệu để lấy dữ liệu từ bảng trong Sheet(VL Dau Vao) vào để điền dữ liệu tương ứng trong các cột vào bảng trong Sheet(PL_Ttr-QD Vat Lieu).
Dữ liệu được lấy chọn như kiểu khi lập dự toán (tích vào ô cần lấy) trong Form hiện lên.
và cho em xin một nút tìm kiếm kiểu Google với từ khóa lấy ở "Tên Vật Liệu"
Rất mong anh/chị giúp đỡ.
11111.png22222.png
 

File đính kèm

  • NC.xlsm
    54.9 KB · Đọc: 17
Lần chỉnh sửa cuối:
Em chào các anh/chị.
Xin được nhờ anh/chị giúp em Form nhập liệu để lấy dữ liệu từ bảng trong Sheet(VL Dau Vao) vào để điền dữ liệu tương ứng trong các cột vào bảng trong Sheet(PL_Ttr-QD Vat Lieu).
Dữ liệu được lấy chọn như kiểu khi lập dự toán (tích vào ô cần lấy) trong Form hiện lên.
và cho em xin một nút tìm kiếm kiểu Google với từ khóa lấy ở "Tên Vật Liệu"
Rất mong anh/chị giúp đỡ.
View attachment 230198View attachment 230199
Dùng tạm
copy code vào sheet VL Dau Vao
Chọn chuột vào Tên vật liệu chạy code
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Rng As Range, eRow&, i&, iK&
  If Target.Column = 4 Then
    If Target.Count = 1 Then
      If Target.Value <> Empty Then
        Msg = "Ban Muon copy Vat Lieu ?"
        Style = vbYesNo + vbCritical + vbDefaultButton2
        If MsgBox(Msg, Style) = vbYes Then
          With Sheets("PL_Ttr-QD Vat Lieu")
            For i = 17 To 27
              If .Range("C" & i) = Empty Then
                .Range("C" & i) = i - 16
                .Range("E" & i) = Target.Value
                .Range("O" & i) = Target.Offset(, 1).Value
                Exit Sub
              End If
            Next i
          End With
        End If
      End If
    End If
  End If
End Sub
 
Dùng tạm
copy code vào sheet VL Dau Vao
Chọn chuột vào Tên vật liệu chạy code
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Rng As Range, eRow&, i&, iK&
  If Target.Column = 4 Then
    If Target.Count = 1 Then
      If Target.Value <> Empty Then
        Msg = "Ban Muon copy Vat Lieu ?"
        Style = vbYesNo + vbCritical + vbDefaultButton2
        If MsgBox(Msg, Style) = vbYes Then
          With Sheets("PL_Ttr-QD Vat Lieu")
            For i = 17 To 27
              If .Range("C" & i) = Empty Then
                .Range("C" & i) = i - 16
                .Range("E" & i) = Target.Value
                .Range("O" & i) = Target.Offset(, 1).Value
                Exit Sub
              End If
            Next i
          End With
        End If
      End If
    End If
  End If
End Sub
Em cảm ơn anh!
Anh ơi cho em hỏi có thể chọn được nhiều tên vật liệu cùng lúc không anh?
Hiện tại em đang chọn từng tên một, giả sử có nhiều dữ liệu thì em chọn sẽ không nhớ cái nào mình đã chọn hay chưa? nếu chọn không theo thứ tự sẽ dễ bị nhầm. và chọn rồi không bỏ chọn được.
Nếu Form thì có thể chọn được đúng không anh?
Mong anh và các anh chị trên FPE giúp đỡ!


muon.png
 
Lần chỉnh sửa cuối:
Em cảm ơn anh!
Anh ơi cho em hỏi có thể chọn được nhiều tên vật liệu cùng lúc không anh?
Hiện tại em đang chọn từng tên một, giả sử có nhiều dữ liệu thì em chọn sẽ không nhớ cái nào mình đã chọn hay chưa? nếu chọn không theo thứ tự sẽ dễ bị nhầm. và chọn rồi không bỏ chọn được.
Nếu Form thì có thể chọn được đúng không anh?
Mong anh và các anh chị trên FPE giúp đỡ!


View attachment 230202
Chỉnh code
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Rng As Range, VatLieu$, r&, i&, iK&
  If Target.Column = 4 Then
    Msg = "Ban Muon copy Vat Lieu ?"
    Style = vbYesNo + vbCritical + vbDefaultButton1
    If MsgBox(Msg, Style) = vbYes Then
      For r = 1 To Target.Rows.Count
        VatLieu = Target(r, 1).Value
        If VatLieu <> Empty Then
          With Sheets("PL_Ttr-QD Vat Lieu")
            For i = 17 To 27
              If .Range("E" & i) = VatLieu Then Exit For
              If .Range("C" & i) = Empty Then
                .Range("C" & i) = i - 16
                .Range("E" & i) = VatLieu
                .Range("O" & i) = Target.Offset(, 1).Value
                Exit For
              End If
            Next i
          End With
        End If
      Next r
    End If
  End If
End Sub
Bỏ format in đậm vùng kết quả là ổn
 
Chỉnh code
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Rng As Range, VatLieu$, r&, i&, iK&
  If Target.Column = 4 Then
    Msg = "Ban Muon copy Vat Lieu ?"
    Style = vbYesNo + vbCritical + vbDefaultButton1
    If MsgBox(Msg, Style) = vbYes Then
      For r = 1 To Target.Rows.Count
        VatLieu = Target(r, 1).Value
        If VatLieu <> Empty Then
          With Sheets("PL_Ttr-QD Vat Lieu")
            For i = 17 To 27
              If .Range("E" & i) = VatLieu Then Exit For
              If .Range("C" & i) = Empty Then
                .Range("C" & i) = i - 16
                .Range("E" & i) = VatLieu
                .Range("O" & i) = Target.Offset(, 1).Value
                Exit For
              End If
            Next i
          End With
        End If
      Next r
    End If
  End If
End Sub
Bỏ format in đậm vùng kết quả là ổn
Dạ! Code chọn được theo kiểu liên tục liền nhau (không thể chọn nhiều dữ liệu như kiểu nhấn Ctrl trong trường hợp muốn chọn ngắt quãng bỏ qua 1 ô chả hạn) và khi chọn rồi không bỏ chọn được.
Cách của anh rất hay nếu dữ liệu ít.
Cảm ơn anh đã giúp em!
 
Chỉnh code
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Rng As Range, VatLieu$, r&, i&, iK&
  If Target.Column = 4 Then
    Msg = "Ban Muon copy Vat Lieu ?"
    Style = vbYesNo + vbCritical + vbDefaultButton1
    If MsgBox(Msg, Style) = vbYes Then
      For r = 1 To Target.Rows.Count
        VatLieu = Target(r, 1).Value
        If VatLieu <> Empty Then
          With Sheets("PL_Ttr-QD Vat Lieu")
            For i = 17 To 27
              If .Range("E" & i) = VatLieu Then Exit For
              If .Range("C" & i) = Empty Then
                .Range("C" & i) = i - 16
                .Range("E" & i) = VatLieu
                .Range("O" & i) = Target.Offset(, 1).Value
                Exit For
              End If
            Next i
          End With
        End If
      Next r
    End If
  End If
End Sub
Bỏ format in đậm vùng kết quả là ổn
Lần đầu tiên thấy code kiểu vậy!
Sáng tạo quá anh! nhưng dữ liệu nhiều thì thấy Form vẫn ưu thế.
 
Dạ! Code chọn được theo kiểu liên tục liền nhau (không thể chọn nhiều dữ liệu như kiểu nhấn Ctrl trong trường hợp muốn chọn ngắt quãng bỏ qua 1 ô chả hạn) và khi chọn rồi không bỏ chọn được.
Cách của anh rất hay nếu dữ liệu ít.
Cảm ơn anh đã giúp em!
Lần đầu tiên thấy code kiểu vậy!
Sáng tạo quá anh! nhưng dữ liệu nhiều thì thấy Form vẫn ưu thế.
Xóa code trước
Tự tạo Nút lệnh hoặc phím tắt chạy code
Dùng chuột chọn vùng tên nguyên liệu nhiều dòng liên tục hoặc ngắt quảng, chạy code
Mã:
Sub AddNVL()
  Dim sRng As Range, iCel As Range, VatLieu$, i&
  Set sRng = Selection
  For Each iCel In sRng
    If iCel.Column = 4 Then
      VatLieu = iCel.Value
      If VatLieu <> Empty Then
        With Sheets("PL_Ttr-QD Vat Lieu")
          For i = 17 To 27 'Ket qua tu dong 17 toi dong 27
            If .Range("E" & i) = VatLieu Then Exit For
            If .Range("C" & i) = Empty Then
              .Range("C" & i) = i - 16
              .Range("E" & i) = VatLieu
              .Range("O" & i) = iCel.Offset(, 1).Value
              Exit For
            End If
          Next i
        End With
      End If
    End If
  Next iCel
  Set sRng = Nothing: Set iCel = Nothing
End Sub
 
Xóa code trước
Tự tạo Nút lệnh hoặc phím tắt chạy code
Dùng chuột chọn vùng tên nguyên liệu nhiều dòng liên tục hoặc ngắt quảng, chạy code
Mã:
Sub AddNVL()
  Dim sRng As Range, iCel As Range, VatLieu$, i&
  Set sRng = Selection
  For Each iCel In sRng
    If iCel.Column = 4 Then
      VatLieu = iCel.Value
      If VatLieu <> Empty Then
        With Sheets("PL_Ttr-QD Vat Lieu")
          For i = 17 To 27 'Ket qua tu dong 17 toi dong 27
            If .Range("E" & i) = VatLieu Then Exit For
            If .Range("C" & i) = Empty Then
              .Range("C" & i) = i - 16
              .Range("E" & i) = VatLieu
              .Range("O" & i) = iCel.Offset(, 1).Value
              Exit For
            End If
          Next i
        End With
      End If
    End If
  Next iCel
  Set sRng = Nothing: Set iCel = Nothing
End Sub
Anh nhiều chiêu thật!
Cám ơn anh đã tận tình chỉ bảo.
Khi nào anh có thời gian, nếu có thể nhờ anh giúp em tạo Form mới nhé! để em tham khảo và vận dụng để làm việc.
Em quản lý vật tư nên rất cần. Dữ liệu em tầm 200 tên vật tư, tuy không nhiều lắm nhưng nhiều khi chọn rồi, bỏ đi và chọn lại.
Chúc anh nhiều sức khỏe và may mắn!
 
Xóa code trước
Tự tạo Nút lệnh hoặc phím tắt chạy code
Dùng chuột chọn vùng tên nguyên liệu nhiều dòng liên tục hoặc ngắt quảng, chạy code
Mã:
Sub AddNVL()
  Dim sRng As Range, iCel As Range, VatLieu$, i&
  Set sRng = Selection
  For Each iCel In sRng
    If iCel.Column = 4 Then
      VatLieu = iCel.Value
      If VatLieu <> Empty Then
        With Sheets("PL_Ttr-QD Vat Lieu")
          For i = 17 To 27 'Ket qua tu dong 17 toi dong 27
            If .Range("E" & i) = VatLieu Then Exit For
            If .Range("C" & i) = Empty Then
              .Range("C" & i) = i - 16
              .Range("E" & i) = VatLieu
              .Range("O" & i) = iCel.Offset(, 1).Value
              Exit For
            End If
          Next i
        End With
      End If
    End If
  Next iCel
  Set sRng = Nothing: Set iCel = Nothing
End Sub
Trân trọng cám ơn anh!
 
Anh nhiều chiêu thật!
Cám ơn anh đã tận tình chỉ bảo.
Khi nào anh có thời gian, nếu có thể nhờ anh giúp em tạo Form mới nhé! để em tham khảo và vận dụng để làm việc.
Em quản lý vật tư nên rất cần. Dữ liệu em tầm 200 tên vật tư, tuy không nhiều lắm nhưng nhiều khi chọn rồi, bỏ đi và chọn lại.
Chúc anh nhiều sức khỏe và may mắn!
Bạn tự tạo 1 Form với 2 ListBox, ListBox1 là dữ liệu nguồn, Listbox 2 là kết quả, thêm 3 nút lệnh Add , ReMove và Up Date
Tham khảo code trên mạng viết lệnh cho 3 nút lệnh
 
Bạn tự tạo 1 Form với 2 ListBox, ListBox1 là dữ liệu nguồn, Listbox 2 là kết quả, thêm 3 nút lệnh Add , ReMove và Up Date
Tham khảo code trên mạng viết lệnh cho 3 nút lệnh
Vâng, cơ bản về code em không hiểu nên khó mà chế được, nhiều khi sai một dấu chấm hay dấu phẩy cũng không được, huống chi em không am hiểu về code.
Em nhìn vào đó như đọc chữ tàu, mà chữ tàu còn có google để dịch, giá mà code cũng dịch được thì hay anh nhỉ! _)()(-
Em sử dụng code anh giúp bài 7 để làm nốt báo cáo để mai có bài nộp
Cảm ơn anh!
 
mình nghĩ nếu bạn muốn tạo chương trình cho riêng bạn thì bạn phải tự lực là chính, còn nếu muốn nhập dữ liệu lẹ thì sử dụng cái Addin nhập dữ liệu của anh @huuthang_bd
 
mình nghĩ nếu bạn muốn tạo chương trình cho riêng bạn thì bạn phải tự lực là chính, còn nếu muốn nhập dữ liệu lẹ thì sử dụng cái Addin nhập dữ liệu của anh @huuthang_bd
Vâng, em cảm ơn chị!
Bài đã được tự động gộp:

mình nghĩ nếu bạn muốn tạo chương trình cho riêng bạn thì bạn phải tự lực là chính, còn nếu muốn nhập dữ liệu lẹ thì sử dụng cái Addin nhập dữ liệu của anh @huuthang_bd
Chị gửi link add in đó cho em xin được không ạ?
 
Em nhìn vào đó như đọc chữ tàu, mà chữ tàu còn có google để dịch, giá mà code cũng dịch được thì hay anh nhỉ!
Em sử dụng code anh giúp bài 7 để làm nốt báo cáo để mai có bài nộp Cảm ơn anh!
Bạn tham khảo file dưới đây xem sao:
 

File đính kèm

  • Form.rar
    26.9 KB · Đọc: 25
Đầu tiên sẽ là 1 dòng nội dung của macro này:
PHP:
Private Sub Worksheet_Activate()
 FormDMDG.Show  'Dùng để Form khi trang tính hiện thời được kích hoạt   '
End Sub
Kế tiếp ngay sau đó sẽ là macro sau:
Mã:
Private Sub UserForm_Initialize()
    Dim EndR As Long
    ReDim Ar0(1 To 13, 1 To 3)
1    With Sheets("Note1")
        EndR = .Cells(65000, 8).End(xlUp).Row
3        Arr = .Range(.Cells(10, 8), .Cells(EndR, 10)).Value
    End With
5    With Me.MHList
        .ColumnCount = 3:                  .List = Arr
7    End With
    Ar0(1, 1) = "Tên Hàng Hóa":                 Ar0(1, 2) = "DVT"
9    Ar0(1, 3) = "Só Luong"
    Me!lbSelect.List = Ar0()
11    NhomHang.SetFocus:                          Erase Arr
End Sub
Các câu lệnh trước D1: Khai báo các biến dùng trong chương trình, trong đó có 1 biến mảng 13 dòng & 3 cột;
D1: Tuyên cáo làm việc với trang tính có tên 'Note1'
Tuyên cáo này kết thúc ở D4
D2: Đem chỉ số dòng cuối của cột thí 8 (của trang tính hiện hành) gán vô tham biến (đã khai báo) dùng chung (trong Form)
D3: Đem vùng giới hạn bỡi Dòng 10 của cột 8 & dòng cuối (có dữ liệu) (chứa trang tham biến) của cột thứ 10 (cột H & J tương ứng) gán vô tham biến mảng.
D5 Tuyên cáo sẽ làm việc với Control có tên là 'MHList' trên form (đó chính là ListBox lớn phía trên)
Tuyên cáo này kết thúc tại D7
D6 (gồm 2 mệnh đề lệnh) Mệnh đề đầu: Ấn định số cột (của ListBox) là 3
Mệnh đề sau: Lấy ữ liệu trong biến mảng làm nguồn cho ListBox (này)
D8; Mệnh đề đầu: Ấn định chuỗi 'Tên HH' vô dòng đầu cột thứ 3 của mảng
Mệnh đề sau: (Cũng tương tự) gán chuỗi 'DVT' vô dòng đầu & cột thứ 2
D9: Gán chuỗi tương tự trên
D10: Lấy mảng này làm nguồn cho ListBox thứ 2 (phía dưới hơn của ListBox 'MHList'
D11: MĐ dầu: (Cho) Control có tên là 'NhomHang nhận Focus
MĐ sau: Xóa dữ liệu trang mảng Arr()
 
Macro tiếp theo sẽ là macro sẽ 'chạy' 1 khi ta bấm chuột vô ListBox (lớn bên trên)
PHP:
Private Sub MHList_Click()
Dim W As Integer
1  On Error GoTo LoiCT
lbID = Me!MHList.ListIndex
3 SeL = SeL + 1
For W = 0 To 2
5    Me!lbSelect.List(SeL, W) = Me!MHList.List(lbID, W)
Next W
7 Err_:           Exit Sub
LoiCT:
9 If Err = 381 Then
    MsgBox "Quá Dòng", , "Chào Ban!"
11    Resume Next
Else
13    Resume Err_
End If
End Sub
Dòng trước D1: Khai báo 1 biến chứa số liệu (kiểu Integer)
D1: Nếu chương trình chạy mà gặp lỗi bất kỳ thì đến nhãn 'LoiCT' để thực hiện tiếp
(Nhã đó có mã dòng lệnh là 8)
D2: Đem chỉ số dòng trong ListBox có tên là MHList gán vô tham biến (đã khai báo dùng chung (trong Form))
D3: Tăng 1 đơn vị cho tham biến dùng chung 'Sel'
D4: Tạo vòng lặp duyệt từ 0 cho tới 2
Vòng lặp này kết thú ở D6
D5: đưa các trị dữ liệu tương ứng của 3 cột của dòng được chọn (lbID) trong ListBox trên xuống ListBox dưới (mà đưa vô dòng có chỉ số mới vừa tăng 1 đơn vị)
D7 Err_ là 1 cái nhãn, như biển báo chỉ đường ngoài phố; Khi gặp biển báo này chương trình sẽ kết thúc bỡi lệnh 'Thoát'
D8 là 1 cái nhãn (chỉ đường)
D9: Đ/kiện nếu mã lỗi đang là 381 thì thực hiện 2 lệnh kế tiếp
D10: Hiện họp thoại báo thông tin (cho người dùng)
D11: Thực hiện lệnh kế tiếp
D12: Đ/Kiện không đạt thì thực hiện D13: Trở lại nhãn có tên Err_

( Để biết lỗi có mã 381 là gì ta cần vô cửa sổ Immediate & gỏ dòng lệnh ?Error(381) bạn sẽ được VBE giải đáp)
 
Web KT
Back
Top Bottom