Các câu hỏi về Form trong Excel VBA

Liên hệ QC

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Private Sub UserForm_Initialize()
.......................
.......................
.......................
End Sub


Em xin hỏi, sự kiện khí nào mình dùng sự kiện này Initialize

Cám ơn
 
vậy trong form có tool nào nhận hình ảnh không? tool nào nhận bảng biểu vậy - anh Batman1?
xin cám ơn
Có thể nhập ảnh vào Image. Không nhập text được. Mọi cái phải ở dạng ảnh mới nhập vào Image được.
Tốt nhất hãy cho biết mục đích cuối cùng là gì. Đừng chọn một đường đi nhất định (Form+TextBox) rồi hỏi mọi người làm sao đi được.
Hãy cho biết chi tiết các trình tự thao tác. Vd. đã có Word mở? Người dùng sẽ chuyển qua lại giữa Excel và Word? Tức: chuyển sang Word -> chọn một "đoạn" (chỉ chọn hay chọn và nhấn Ctrl + C để copy vào ClipBoard?) -> chuyển sang Excel -> nhấn Ctrl + V để "dán" vào sheet?. Hoặc là thay cho Ctrl + V, vì nó cho kết quả không đúng ý, thì cần làm gì đó để được kết quả mong muốn?

Kết quả mong muốn là gì? Có cần chỉnh sửa cái vừa copy vào không? Nếu có thì văn bản phải được dán ở dạng văn bản. Nếu không có nhu cầu chỉnh sửa cái vừa dán vào thì toàn bộ có thể dán ở dạng ảnh.

Hãy mô tả tỉ mỉ để người giúp có thể chọn hướng đi thích hợp.
 
Upvote 0
Có thể nhập ảnh vào Image. Không nhập text được. Mọi cái phải ở dạng ảnh mới nhập vào Image được.
Tốt nhất hãy cho biết mục đích cuối cùng là gì. Đừng chọn một đường đi nhất định (Form+TextBox) rồi hỏi mọi người làm sao đi được.
....
Hãy mô tả tỉ mỉ để người giúp có thể chọn hướng đi thích hợp.
Rất cám ơn anh đã quan tâm điều mình đang muốn thực hiện.
Trong văn bản word, có bảng biểu (dạng cột hay biểu đồ) và hình ảnh (dạng vẽ hay dạng chụp) nhằm minh họa, rất khó đưa vào các Ô trong bảng table của word - phải làm thủ công, nên khi tổng hợp báo cáo phải thủ công lại. (xem minh họa)
1570416863611.png
Nên mình nghĩ tạo một form NHẬP LIỆU trong excel, để nhập vào form các loại hình (vẽ/chụp/biểu đồ), các loại bảng (table cột/ngang), chuyển đến trang sheet.
sau đó khi thống kê, sẽ trích xuât qua sheet khác từ sheet này.
Nguồn dữ liệu là các loại hình (vẽ/chụp/biểu đồ), các loại bảng (table cột/ngang) có thể trong một file word nào đó, hay excel nào đó, hay từ phần mềm khác (như ChemBioOffice, MatLab..)
Mục tiêu mình muốn là: từ các nguồn dữ liệu có được [các loại hình (vẽ/chụp/biểu đồ), các loại bảng (table cột/ngang)], mình sẽ Ctrl+C toàn bộ đoạn văn/hình/bảng .... đó, đem qua Form Nhập Liệu, Ctrl+V vào một tool nào đó của Form Nhập liệu này, để up dữ liệu này vào được 1 ô cell trong sheet (như form vừa gửi, mình đặt vào các ô tại cột "C").
Mong anh giúp dùm
Xin cảm ơn nhiều
 

File đính kèm

  • thu chen vao form.doc
    132.5 KB · Đọc: 9
  • thu điền vào form.xlsm
    21.1 KB · Đọc: 8
Upvote 0
Rất cám ơn anh đã quan tâm điều mình đang muốn thực hiện.
Tóm lại bạn muốn trong quá trình làm việc: chuyển sang một ứng dụng nào đó vd. Word -> chọn 1 vùng -> Ctrl + C -> chuyển sang Excel Form -> Ctrl + V vào một control nào đó -> chuyển sang ứng dụng nào đó vd. ChemBioOffice, MatLab -> chọn 1 vùng -> Ctrl + C -> chuyển sang Excel Form -> Ctrl + V vào một control nào đó -> chuyển sang ứng dụng nào đó ... vân vân và mây mây?
Nếu như trên thì tôi đã viết rồi. Nếu bạn chọn vùng có cả ảnh và/hoặc text thì khi dán vào TextBox sẽ mất ảnh. Nếu dán vào Image thì chỉ dán được ở dạng ảnh, tức cả text cũng chỉ là ảnh (một phần của ảnh gồm text và ảnh). Tức text trong ảnh không chỉnh sửa về sau được. Trong VBA không có control nào vừa viết được văn bản vừa chèn được ảnh.
 
Upvote 0
Trong Form tìm kiếm, lưu tạm thời những những mặt hàng đã chọn trong List và sắp xếp theo thứ tự đã chọn

Anh chị giúp em như sau
Ví dụ : em có đơn hàng cần phải nhập vào sheet TH (giả sử đơn hàng có 3 mặt hàng )
1/ Mặt hàng 08
2/ Mặt hàng 10
3/ Mặt hàng 01

Khi nhập em làm như sau:
Mở form rồi tìm Mặt hàng 08 -> chọn nó -> bấm nút Chọn -> cho nó gán xuống sheet TH
Rồi tiếp tục mở form để tìm Mặt hàng 10
Và tiếp tục cho đến hết
Như vậy rất mất thời gian

Bây giờ em muốn thế này
1/ Sau khi tìm được Mặt hàng 08 thì tích (chọn ) vào ô vuông bên trái và tạm lưu mặt hàng này vào đâu đó, Rồi em tiếp tục tìm Mặt hàng 10 và tích chọn vào ô vuông, sau đó tiếp tục tìm …Tìm hết những mặt hàng trong đơn hàng thì bấm CommandButton “Chọn” để nó gán các mặt hàng đã chọn gán xuống sheet TH

2/ Những mặt hàng chọn trước thì ưu tiên đứng trước trước khi gán xuống sheet TH
(giả sử 3 mặt hàng trong đơn hàng trên sẽ gán xuống sheet TH ở các dòng 10, 11, 12
Thì dòng 10 = Mặt hàng 08 (do chọn đầu tiên)
dòng 11 = Mặt hàng 10 (do chọn thứ 2)
dòng 12 = Mặt hàng 01 (do chọn thứ 3)

3/ Và sau khi gán xuống sheet TH thì trong Form sẽ xóa các mặt hàng đã lưu tạm trên để có thể tìm cho đơn hàng mới

From này do em sưu tầm
Em nhờ các anh chị giúp em, em cảm ơn
 

File đính kèm

  • Form_baman1.xlsm
    40.5 KB · Đọc: 18
Upvote 0
From này do em sưu tầm
Em nhờ các anh chị giúp em, em cảm ơn
Tập tin tên là Form_batman1.xlsm nhưng tôi e rằng code không là của tôi hoặc chỉ một vài chỗ là của tôi.
Nhìn vd.
EndR = .Cells(65000, 8).End(xlUp).Row
Arr = .Range(.Cells(10, 8), .Cells(EndR, 10)).Value
thì chắc chắn không là của tôi vì:
- tôi thường dùng lastRow
- tôi thường dùng Cells(Rows.Count, "H"), Cells(10, "H"), Cells(lastRow, "J")
- tôi thường kiểm tra xem có dữ liệu hay không. Nếu có mới nhập vào Arr.

Gọi là Form_batman1.xlsm thì tôi không dám nhận là của mình.
 
Upvote 0
Tập tin tên là Form_batman1.xlsm nhưng tôi e rằng code không là của tôi hoặc chỉ một vài chỗ là của tôi.
Nhìn vd.

thì chắc chắn không là của tôi vì:
- tôi thường dùng lastRow
- tôi thường dùng Cells(Rows.Count, "H"), Cells(10, "H"), Cells(lastRow, "J")
- tôi thường kiểm tra xem có dữ liệu hay không. Nếu có mới nhập vào Arr.

Gọi là Form_batman1.xlsm thì tôi không dám nhận là của mình.

Form này do em sưu tầm trên mạng, nhưng vừa rồi anh có giúm em sửa form ở
Em thường hay sửa = cách thêm tên người sửa vào tiêu đề code hay file mà các thành viên đã chỉnh sửa giúp để em dễ phân biệt mà thôi
Thành thật xin lỗi anh
 
Upvote 0
.............
Nếu như trên thì tôi đã viết rồi.......
Tức text trong ảnh không chỉnh sửa về sau được. Trong VBA không có control nào vừa viết được văn bản vừa chèn được ảnh.
Sory anh Batman1
nếu anh cho xin đường link bài viết mà anh đã viết rồi, cho mình tham khảo - được không?
mình có tìm trong :".. Các câu hỏi về Form trong Excel VBA"
mà không thấy!
Xin cám ơn
 
Upvote 0
Trong Form TK, lưu tạm thời những những mặt hàng đã chọn trong List và sắp xếp theo thứ tự đã chọn
Anh chị giúp em như sau
Ví dụ : em có đơn hàng cần phải nhập vào sheet TH (giả sử đơn hàng có 3 mặt hàng )
PHP:
1/ Mặt hàng 08                2/ Mặt hàng 10
3/ Mặt hàng 01
Khi nhập em làm như sau:
Mở form rồi tìm Mặt hàng 08 -> chọn nó -> bấm nút Chọn -> cho nó gán xuống sheet TH; Rồi tiếp tục mở form để tìm Mặt hàng 10
Và tiếp tục cho đến hết . . . Như vậy rất mất thời gian
Bây giờ em muốn thế này
1/ Sau khi tìm được Mặt hàng 08 thì tích (chọn ) vào ô vuông bên trái và tạm lưu mặt hàng này (1) vào đâu đó, Rồi em tiếp tục tìm Mặt hàng 10 và tích chọn vào ô vuông, sau đó tiếp tục tìm …Tìm hết những mặt hàng trong đơn hàng thì bấm CommandButton “Chọn” để nó gán các mặt hàng đã chọn gán xuống sheet TH
. . . . . . . .
(1) Chắc đó nên là 1 ListBox thứ 2
Về việc này bạn đến đây tham khảo xem sao: https://www.giaiphapexcel.com/diend...a-nội-dung-trên-litsbox-vào-file-đóng.115020/
 
Upvote 0
Sory anh Batman1
nếu anh cho xin đường link bài viết mà anh đã viết rồi, cho mình tham khảo - được không?
mình có tìm trong :".. Các câu hỏi về Form trong Excel VBA"
mà không thấy!
Ý tôi là "đã viết rồi" ở những bài trước. Cụ thể là ở bài #319 và bài #321
TextBox chỉ nhận văn bản thôi. Ảnh thì quên đi.
...
Có thể nhập ảnh vào Image. Không nhập text được. Mọi cái phải ở dạng ảnh mới nhập vào Image được.
 
Upvote 0
Em thường hay sửa = cách thêm tên người sửa vào tiêu đề code hay file mà các thành viên đã chỉnh sửa giúp để em dễ phân biệt mà thôi
Thao tác:
1. Sau mỗi lần tìm kiếm thì chọn trong ListBox 1 hoặc nhiều kết quả rồi nhấn Chọn. Lúc đó các mục được chọn sẽ được nhớ vào mảng chisochon. Nếu không nhấn Chọn thì không gì được nhớ.
2. Sau khi nhấn Chọn thì focus lại ở TextBox để tìm kiếm tiếp.
3. Sau một hồi tìm kiếm và Chọn thì nhấn nút Nhập để nhập xuống sheet. Dữ liệu sẽ được ghi xuống sheet. Tiếp theo lại có thể thực hiện Tìm -> Chon -> Nhap mới.
4. Khi muốn đóng Form thì nhấn Thoát. Nếu sau một hồi Tìm -> Chọn mà không muốn ghi xuống shett (nghĩ lại, bập bập?) thì nhấn Thoát để đóng Form.

Cách thức code phải hoạt động như thế. Nhưng có như thế hay không thì tự kiểm tra.

Xóa toàn bộ code trong Form.

Dán code sau vào Form
Mã:
Private somuc As Long, Arr(), chisochon()

Private Sub CB_Tim_Click()
Dim lastRow As Long, r As Long, c As Long, count As Long
Dim arrKQ(), chiso() As Long
Dim MaHHTim As String, timthay As Boolean
    MHList.Clear
    count = 0
    MaHHTim = UCase(Me.NhomHang.Value)
    For r = 1 To UBound(Arr) - 1
        timthay = InStr(UCase(Arr(r, 1)), MaHHTim) > 0
        If Not timthay Then
            timthay = InStr(UCase(Arr(r, 2)), MaHHTim) > 0
            If Not timthay Then timthay = InStr(UCase(Arr(r, 3)), MaHHTim) > 0
        End If
        If timthay Then
            count = count + 1
            ReDim Preserve chiso(1 To count)
            chiso(count) = r
        End If
    Next r
    If count Then
        ReDim arrKQ(1 To count, 1 To 4)
        For r = 1 To count
            c = chiso(r)
            arrKQ(r, 1) = Arr(c, 1)
            arrKQ(r, 2) = Arr(c, 2)
            arrKQ(r, 3) = Arr(c, 3)
            arrKQ(r, 4) = c
        Next r
        MHList.List = arrKQ
    Else
        MsgBox "No noi dung"
    End If
End Sub

Private Sub cmdChon_Click()
Dim k As Long
    For k = 0 To MHList.ListCount - 1
        If MHList.Selected(k) Then
            somuc = somuc + 1
            ReDim Preserve chisochon(1 To somuc)
            chisochon(somuc) = MHList.List(k, 3)
        End If
    Next
    MHList.Clear
    NhomHang.Value = Empty
    NhomHang.SetFocus
End Sub

Private Sub cmdNhap_Click()
Dim lastRow As Long, k As Long, r As Long, result()
    If somuc < 1 Then Exit Sub
    ReDim result(1 To somuc, 1 To 3)
    lastRow = ThisWorkbook.Worksheets("TH").Cells(Rows.count, "AH").End(xlUp).Row + 1
    For k = 1 To UBound(chisochon)
        r = chisochon(k)
        result(k, 1) = Arr(r, 1)
        result(k, 2) = Arr(r, 2)
        result(k, 3) = Arr(r, 3)
    Next k
    ThisWorkbook.Worksheets("TH").Cells(lastRow, "AH").Resize(UBound(result), UBound(result, 2)).Value = result
    somuc = 0
    Erase chisochon
    MHList.Clear
    NhomHang.Value = Empty
    NhomHang.SetFocus
End Sub

Private Sub Thoat_Click()
    Unload Me
End Sub

Private Sub UserForm_Initialize()
Dim lastRow As Long
    With Sheets("Note1")
        lastRow = .Cells(Rows.count, "H").End(xlUp).Row
        Arr = .Range("H10:J" & lastRow + 1).Value
    End With
    
    With Me.MHList
        .ColumnCount = 3
        .List = Arr
    End With
    somuc = 0
    Erase chisochon
    NhomHang.SetFocus
End Sub

Private Sub NhomHang_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 40 Then MHList.SetFocus
End Sub

Private Sub CB_Tim_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 40 Then MHList.SetFocus
End Sub
 
Upvote 0
Bạn tham khảo cách này, có vẻ trực quan hơn nè:
 

File đính kèm

  • Form.rar
    23.1 KB · Đọc: 21
Upvote 0
Khi nhập em làm như sau:
Mở form rồi tìm Mặt hàng 08 -> chọn nó -> bấm nút Chọn -> cho nó gán xuống sheet TH
Rồi tiếp tục mở form để tìm Mặt hàng 10
Và tiếp tục cho đến hết
Như vậy rất mất thời gian
Chỉ mở Form 1 lần và đóng khi chán Tim - Nhap.

Thực ra cũng chả cần ListBox hay mảng tạm thời. Cứ chọn xong trong ListBox thì nhấn Nhap để ghi xuống sheet thôi. Còn nếu nghĩ lại không muốn ghi thì lại tìm mới thôi. Khi nào chán thì đóng Form.

Lưu ý: Trên Form phải có 3 nút: Nút Chon của bạn đổi tên thành cmdNhap và có caption = Nhap .
Code
Mã:
Private Arr()

Private Sub CB_Tim_Click()
Dim lastRow As Long, r As Long, c As Long, count As Long
Dim arrKQ(), chiso() As Long
Dim MaHHTim As String, timthay As Boolean
    MHList.Clear
    count = 0
    MaHHTim = UCase(Me.NhomHang.Value)
    For r = 1 To UBound(Arr) - 1
        timthay = InStr(UCase(Arr(r, 1)), MaHHTim) > 0
        If Not timthay Then
            timthay = InStr(UCase(Arr(r, 2)), MaHHTim) > 0
            If Not timthay Then timthay = InStr(UCase(Arr(r, 3)), MaHHTim) > 0
        End If
        If timthay Then
            count = count + 1
            ReDim Preserve chiso(1 To count)
            chiso(count) = r
        End If
    Next r
    If count Then
        ReDim arrKQ(1 To count, 1 To 4)
        For r = 1 To count
            c = chiso(r)
            arrKQ(r, 1) = Arr(c, 1)
            arrKQ(r, 2) = Arr(c, 2)
            arrKQ(r, 3) = Arr(c, 3)
        Next r
        MHList.List = arrKQ
    Else
        MsgBox "No noi dung"
    End If
End Sub

Private Sub cmdNhap_Click()
Dim lastRow As Long, count As Long, k As Long, result()
    ReDim result(1 To MHList.ListCount, 1 To 3)
    For k = 0 To MHList.ListCount - 1
        If MHList.Selected(k) Then
            count = count + 1
            result(count, 1) = MHList.List(k, 0)
            result(count, 2) = MHList.List(k, 1)
            result(count, 3) = MHList.List(k, 2)
        End If
    Next
    If count Then
        With ThisWorkbook.Worksheets("TH")
            lastRow = .Cells(Rows.count, "AH").End(xlUp).Row + 1
            .Cells(lastRow, "AH").Resize(count, UBound(result, 2)).Value = result
        End With
    End If
    MHList.Clear
    NhomHang.Value = Empty
    NhomHang.SetFocus
End Sub

Private Sub Thoat_Click()
    Erase Arr
    Unload Me
End Sub

Private Sub UserForm_Initialize()
Dim lastRow As Long
    With Sheets("Note1")
        lastRow = .Cells(Rows.count, "H").End(xlUp).Row
        Arr = .Range("H10:J" & lastRow + 1).Value
    End With
    
    With Me.MHList
        .ColumnCount = 3
        .List = Arr
    End With
    NhomHang.SetFocus
End Sub

Private Sub NhomHang_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 40 Then MHList.SetFocus
End Sub

Private Sub CB_Tim_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 40 Then MHList.SetFocus
End Sub
 
Upvote 0
Cám ơn các anh, em sẽ nghiên cứu từng bài, nếu có thêm thắc mắc em nhờ các anh giải thích
 
Upvote 0
Bạn tham khảo cách này, có vẻ trực quan hơn nè:
Các anh cho em hỏi:
1/ Để người nhập có cơ hội sửa sai là: ví dụ người nhập vô tình chọn sai mã từ MHList gán xuống ListBox lbSelec (giả sử ListBox lbSelec có Mặt hàng08 và nhiều mặt hàng khác) bây giờ người ta muốn xóa Mặt hàng 08 thì code viết cho CommandButton "Xoa" như thế nào
2/ Tại sao anh tạo được cái Liststyle hình tròn còn em chỉ làm hình vuông (cái này không quan trọng mà em chỉ tò mò)
Các anh viết code bổ sung giùm (do cái này em điếc), em cảm ơn!
 

File đính kèm

  • 2_ListBox-Hoi.xlsm
    42.1 KB · Đọc: 6
Upvote 0
2/ Tại sao anh tạo được cái Liststyle hình tròn còn em chỉ làm hình vuông (cái này không quan trọng mà em chỉ tò mò)
Thì người ta thiết lập cho ListBox (ở trên) MultiSelect là fmMultiSelectSingle nên nó là Option (tròn). Hậu quả là ở ListBox (ở trên) chỉ chọn được 1 - chọn cái này thì cái kia mất. Nhưng do người ta dùng Click nên mỗi lần click thì mục được chọn sẽ nhập luôn vào ListBox dưới. Do vậy dù chỉ chọn được 1 nhưng không ảnh hưởng. Tuy nhiên đẻ ra vấn đề là nếu tay run run và click nhầm mục ở trên/dưới thì nó đã được nhập vào ListBox dưới rồi. Lúc này lại phải tìm cách xóa đi.
Còn bạn thiết lập MultiSelect là fmMultiSelectMulti nên nó là CheckBox. Tức có thể chọn nhiều CheckBox.

Option: chọn 1 có 1. Chọn tiếp 2 thì 2 được chọn và 1 bị mất chọn.
CheckBox: chọn 1 có 1. Chọn tiếp 2 thì có 2 và 1 vẫn được chọn.
Các anh viết code bổ sung giùm (do cái này em điếc), em cảm ơn!
Cái này bạn nhờ tác giả thôi.
 
Upvote 0
Tạm thời bạn thử 3 cách sau:
(1) (Chắc dễ làm nhất): Xóa toàn bộ dữ liệu trong ListBox lbSelect & "làm" lại thôi;
Nhớ đưa tham biến Sel về trị thích hợp & tạo lại 3 tiêu đề cột cho ListBox đó
(2) Duyệt các dòng trong ListBox này & đưa dữ liệu các dòng vô mảng (trừ dòng đang được chọn)
(Cách loại trừ dữ liệu dòng đang được chọn lại phải tham khảo cách mà ListBox MHList chọn 1 dòng)
Sau khi duyệt xong thì đưa mảng vừa có được trở thành lbSeLect.List
(3) Cùng nhau nghiên cứu tiếp hay chờ ai đó giúp cho . . . . cách nào đó hay hơn
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác đã chia sẻ, sự thật là lúc nhỏ cháu ăn nhiều chân gà lém, nên tay nó run run bẩm sinh luôn, đang bấm mà NTLH nhắn tin thì nó còn run gấp vạn ấy chứ. Để di chuyển các dòng dữ liệu có mấy cách: thêm nút bâm để ra lệnh di chuyển, click đúp vào dòng muốn di chuyển, hoặc dùng chức năng kéo thả ( cái này thấy hay mà ít người làm).
 
Upvote 0
Cảm ơn bác đã chia sẻ, sự thật là lúc nhỏ cháu ăn nhiều chân gà lém, nên tay nó run run bẩm sinh luôn, đang bấm mà NTLH nhắn tin thì nó còn run gấp vạn ấy chứ.
Ơ, tưởng đã về với nhau một nhà từ lâu rồi chứ. Hóa ra vẫn "cò cưa" thế à?
 
Upvote 0
Tay run nên cháu cưa không đổ, dạo này đang đi mài lại cưa, mài cưa còn khó hơn cả code cho chủ thớt này.
Thế thì lỗi là do tay run chứ đâu phải do cưa cùn mà phải mài lại cưa? Chữa không đúng bệnh rồi. Thảo nào mài đi mài lại cưa mà cưa vẫn không đổ. :D
 
Upvote 0
Web KT
Back
Top Bottom