Các câu hỏi về Form trong Excel VBA (1 người xem)

Liên hệ QC

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

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
 
CQ bạn đang có ngàn người; Hãn hữu mới có được cao nhất là 30 người trùng tên nhau;

Vậy nên 98 dòng là thừa để chứa bằng í người trùng tên trong đơn vị.
Còn số cột ấy ư?, Sẽ bằng với số cột trong 'Data' của bạn thôi.

Bạn thử với Form này xem sao; Đang tìm theo f. name & chỉ cần nhập vài 3 từ của f. name & nhấn vô nút lệnh có mũi tên;
 

File đính kèm

Upvote 0
CQ bạn đang có ngàn người; Hãn hữu mới có được cao nhất là 30 người trùng tên nhau;

Vậy nên 98 dòng là thừa để chứa bằng í người trùng tên trong đơn vị.
Còn số cột ấy ư?, Sẽ bằng với số cột trong 'Data' của bạn thôi.

Bạn thử với Form này xem sao; Đang tìm theo f. name & chỉ cần nhập vài 3 từ của f. name & nhấn vô nút lệnh có mũi tên;
Em cảm ơn bác đã giúp đỡ em!
Bác có thể giúp em thêm vấn đề này nữa được không ạ?
Như bác nói là chỉ cần đánh 3 ký tự của trường F.name rồi kích tìm kiếm là ok. Bác có thể sửa code khi em gõ 3 ký tự tìm kiếm thì trong List Box sẽ hiện tất cả những người có 3 ký tự giống như 3 ký tự tìm kiếm tự hiện lên mà không phải kích vào nút lệnh tìm kiếm, tương tự em gõ 4-20 ký tự tìm kiếm thì tự động hiện danh sách trong list Box, trường hợp ngược lại sau khi gỗ tìm kiếm em xóa từng ký tự tại ô tìm kiếm thì ở List Box cũng hiện lên danh sách thỏa mãn chuỗi ký tự còn lại không ạ?
Em cảm ơn bác nhiều, bác có thể cho em xin SĐT của bác được không ạ?
 
Upvote 0
Bạn lười quá mất rồi!

Có thể làm theo cách này: Thêm macro này (Macro sự kiện) khi nhập gì lên TextBox có tên (mình gán) là tbTim

Private Sub tbTim_Change()
CmdTim_Click
End Sub
Để khỏi báo lỗi khi nhiều dòng (quá 98) được tìm thấy, ta sửa macro cho nút lệnh mũi tên tìm như sau:
PHP:
Private Sub CmdTim_Click()
 Dim Rng As Range, sRng As Range
 Dim Rws As Long, W As Integer, Cot As Integer
 Dim MyAdd As String
 ReDim Arr(1 To 98, 1 To 6)
 [AA2].Resize(98, 6).Value = Arr()
 Rws = [b2].CurrentRegion.Rows.Count
 Set Rng = [b1].Resize(Rws)
 Set sRng = Rng.Find(Me!tbTim.Text, , xlFormulas, xlPart)
 If sRng Is Nothing Then
    MsgBox "Không tìm Ra!", , "GPE.COM Xin Chào!"
 Else
    MyAdd = sRng.Address
    Do
        W = W + 1:                  If W = 98 Then GoTo GPE         '*'
        For Cot = 0 To 5
            With Cells(sRng.Row, "A")
                Arr(W, Cot + 1) = .Offset(, Cot).Value
            End With
        Next Cot
        Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
GPE:                                '**'
    If W Then
        [AA2].Resize(W, 6).Value = Arr()
    End If
 End If
End Sub

Chúc vui!
 
Upvote 0
Bạn lười quá mất rồi!

Có thể làm theo cách này: Thêm macro này (Macro sự kiện) khi nhập gì lên TextBox có tên (mình gán) là tbTim

Private Sub tbTim_Change()
CmdTim_Click
End Sub
Để khỏi báo lỗi khi nhiều dòng (quá 98) được tìm thấy, ta sửa macro cho nút lệnh mũi tên tìm như sau:
PHP:
Private Sub CmdTim_Click()
 Dim Rng As Range, sRng As Range
 Dim Rws As Long, W As Integer, Cot As Integer
 Dim MyAdd As String
 ReDim Arr(1 To 98, 1 To 6)
 [AA2].Resize(98, 6).Value = Arr()
 Rws = [b2].CurrentRegion.Rows.Count
 Set Rng = [b1].Resize(Rws)
 Set sRng = Rng.Find(Me!tbTim.Text, , xlFormulas, xlPart)
 If sRng Is Nothing Then
    MsgBox "Không tìm Ra!", , "GPE.COM Xin Chào!"
 Else
    MyAdd = sRng.Address
    Do
        W = W + 1:                  If W = 98 Then GoTo GPE         '*'
        For Cot = 0 To 5
            With Cells(sRng.Row, "A")
                Arr(W, Cot + 1) = .Offset(, Cot).Value
            End With
        Next Cot
        Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
GPE:                                '**'
    If W Then
        [AA2].Resize(W, 6).Value = Arr()
    End If
 End If
End Sub

Chúc vui!
Cảm ơn bác nhiều ạ! Bác thông cảm, em không hiểu code đâu ạ, chỉ bặp bẹ copy thôi chứ không phải em lười đâu :-)
Bác có thể cho em xin SĐT để em cảm ơn Bác được không ạ?

Code rất chuẩn và phù hợp với công việc của em

Về phần
Private Sub tbTim_Change()
CmdTim_Click
End Sub

Nếu tại trường first_name mà là tiếng việt thì khi gõ vào tbTim sẽ không thể tìm được. Nếu copy vào rồi kích tìm kiếm thì lại được bác ạ. Bác xem có thể sửa nốt hộ em vấn đề này được không? Cảm ơn Bắc nhiều, chúc bác sức khỏe và công tác tốt ạ!
 
Upvote 0
Cho em hỏi muốn Use form hiện góc phải làm thế nào ạ! em xin cảm ơn
 
Upvote 0
Tôi có file nhập liệu đính kèm, hỏi nhờ các anh chị em trên diễn đàn cách khi click nhập nhiều mã hiệu (lớn hơn 1 mã hiệu) thì gộp các mã hiệu và nội dung tương ứng đó vào 1 ô như thế nào ạ, xin cảm ơn
 

File đính kèm

Upvote 0
Xin cho mình hỏi trường hợp này:
Mình thiết kê form nhập dự liệu vào sheet khác trên cùng một workbook. Dử liệu mình copy từ file bên ngoài gồm 12 ô vào form mình cùng tạo 12 ô để nhập liệu nhưng mình không thể copy rồi paste một phát vào form đc mà chỉ đánh vào từng ô thì tốn thời gian quá có cách nào khác phục không mấy bạn! Thân ái
 
Upvote 0
Tôi có file nhập liệu đính kèm, hỏi nhờ các anh chị em trên diễn đàn cách khi click nhập nhiều mã hiệu (lớn hơn 1 mã hiệu) thì gộp các mã hiệu và nội dung tương ứng đó vào 1 ô như thế nào ạ, xin cảm ơn
Làm vậy thì chả mấy chốc CSDL của bạn sẽ thành đống rác mà thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi khi load xong dữ liệu lên listbox, mình chọn dữ liệu trên listbox thực hiên lệnh ghi vào sheet. đồng thời xóa các item trên listbox thì phải làm sao vậy?
 
Upvote 0
Mình có cái form như trên File, Form có tác dụng là khi mình đánh dấu vùng K11:p11 hay K12:p12 hoặc Q13:Q16 nhấn Ctrl+C thì vùng dự liệu cần dán đã có trong ClipBoard rồi mình chỉ việc gọi UerForm lên và AddClipBoard thì dư liệu xẻ đc đưa vào từng textbox rồi chép giá trị đó đến các sheet chị định vào tưng ô trong các Sheet tuy vào ngày trong thang tương ứng khi ta muốn thay thế giá trị hay thêm giá trị .
----- Nhưng mình vẩn chưa làm đc việc đó, nó chỉ chép đc 1 textbox còn các texbox kac không có giá trị
-----nếu là ô có chứa giá trị như K27 thì đưa vào Form thì đc nhưng khi gia trị muốn addClipboard không đủ 6 số thì code vẩn chưa làm đc .
--- Bác nào có phương án nào sử lý việc này xin chỉ giáo e cảm ơn .
 

File đính kèm

Upvote 0
(1) Sao bạn không chép trực tiếp từ trang 'Index' đến các trang kia theo ngày đã định mà fải thông qua Form chi cho rườm rà làm vậy?

(2) Sao không chép trực tiếp từ các ô dữ liệu đã chọn đến các TextBox tương ứng, mà fải qua Clipboard cho mệt thần xác thêm làm chi?

(3) Sao lại fải 31 trang tính cho các ngày trong tháng; 1 trang cho dữ liệu trong tháng không được hay sao?

Bạn sẽ gặp trỡ ngại gì khi thực hiện 3 điều nêu trên?
 
Upvote 0
(1) Sao bạn không chép trực tiếp từ trang 'Index' đến các trang kia theo ngày đã định mà fải thông qua Form chi cho rườm rà làm vậy?

(2) Sao không chép trực tiếp từ các ô dữ liệu đã chọn đến các TextBox tương ứng, mà fải qua Clipboard cho mệt thần xác thêm làm chi?

(3) Sao lại fải 31 trang tính cho các ngày trong tháng; 1 trang cho dữ liệu trong tháng không được hay sao?

Bạn sẽ gặp trỡ ngại gì khi thực hiện 3 điều nêu trên?
Thât ra mình làm bên ky thuât cứ 4 tiếng mình cập nhật thông số khá nhiều và phải chuyển đi chuyện lại hơn 30 sheets nên mình có ý định làm cái form trên sheet main cho tiện và file mình up lên chỉ là demo thôi.
- mình kiểm tra code thì data clipboard qua sử lý code trim(text) thì khoảng trắng là các ô vuông mình không biết làm thế nào để sử lý đoạn text đó.
- sau khi đưa vào textbox mình phải viết code cho nó vào sheet tương ứng gồm nhiều mảng theo điều kiện nữa
- file làm việc chính do cty tạo cho nó khoá hết và nó khá chuối ( mấy thằng tây nó làm cho i mà)
 
Upvote 0
Thât ra mình làm bên ky thuât cứ 4 tiếng mình cập nhật thông số khá nhiều và phải chuyển đi chuyện lại hơn 30 sheets nên mình có ý định làm cái form trên sheet main cho tiện và file mình up lên chỉ là demo thôi.
(*) Mình kiểm tra code thì data clipboard qua sử lý code trim(text) thì khoảng trắng là các ô vuông mình không biết làm thế nào để sử lý đoạn text đó.

(*) Bạn có muốn mình thử giúp bạn macro để chép từ trang nhập đến trang ngày nào đó không?

Để vậy, ta có thể đổi tên các trang tính thành N01, N02,. . . ,N31 không?
(Chẳng qua để tiện trong việc viết macro mà thôi)
Việc quan trọng là các 31 trang chứa dữ liệu các ngày cần có cấu trục như nhau cả về hàng lẫn cột chứa dữ liệu.


Chờ í kiến từ bạn & thân ái!
 
Lần chỉnh sửa cuối:
Upvote 0
(*) Bạn có muốn mình thử giúp bạn macro để chép từ trang nhập đến trang ngày nào đó không?

Để vậy, ta có thể đổi tên các trang tính thành N01, N02,. . . ,N31 không?
(Chẳng qua để tiện trong việc viết macro mà thôi)
Việc quan trọng là các 31 trang chứa dữ liệu các ngày cần có cấu trục như nhau cả về hàng lẫn cột chứa dữ liệu.


Chờ í kiến từ bạn & thân ái!
Mình mới tìm tòi vba đc 1 tuần nên cũng hạn ý trong đâu . Nên vẫn chưa có cách làm sao có bạn giúp thì còn gì bằng.
— về việc đổi tên sheet thì chắc là không đc file làm việc cũa mình do mấy thăng tây nó tạo ra nó liên quan tới nhiêu thứ nên mình không thể đề nghị đổ đc
— dư liêu các sheet thì hoàn toàn đồng nhất. Chỉ có 2 sheet tổng hợp thì khác nhưng mình vẫn chưa quan tâm tới 2 sheets đó.
Thân ái
 
Upvote 0
Mình có cái form như trên File, Form có tác dụng là khi mình đánh dấu vùng K11:p11 hay K12:p12 hoặc Q13:Q16 nhấn Ctrl+C thì vùng dự liệu cần dán đã có trong ClipBoard rồi mình chỉ việc gọi UerForm lên và AddClipBoard thì dư liệu xẻ đc đưa vào từng textbox rồi chép giá trị đó đến các sheet chị định vào tưng ô trong các Sheet tuy vào ngày trong thang tương ứng khi ta muốn thay thế giá trị hay thêm giá trị .
----- Nhưng mình vẩn chưa làm đc việc đó, nó chỉ chép đc 1 textbox còn các texbox kac không có giá trị
-----nếu là ô có chứa giá trị như K27 thì đưa vào Form thì đc nhưng khi gia trị muốn addClipboard không đủ 6 số thì code vẩn chưa làm đc .
--- Bác nào có phương án nào sử lý việc này xin chỉ giáo e cảm ơn .
Chưa hiểu bạn muốn làm cái gì, nhưng theo tôi với File này thì chỉ làm 1 sheet theo dõi, muốn ngày hoặc tháng nào thì lọc nó ra.
Nếu lọc tháng xong thì thêm code tách ngày của tháng đó.

Nói chung chỉ cần 2 sheet là đủ: 1 sheet theo dõi và 1 sheet lọc.
 
Upvote 0
Bạn chép macro này vô Module1; Tạo cho nó 1 tổ hợp để chạy như {CTRL}+{SHIFT}+C
PHP:
Sub ChuyenDuLieuTheoNgay()
 Dim Sh As Worksheet, Cls As Range

 Set Sh = ThisWorkbook.Worksheets(CStr(Day([I1].Value)))
 For Each Cls In Range("K11:P12")
    Sh.Cells(Cls.Row, Cls.Column - 8).Value = Cls.Value
 Next Cls
 For Each Cls In Range("Q13:Q16")
    Sh.Cells(Cls.Row + 1, "J").Value = Cls.Value
 Next Cls
 MsgBox "Chép Xong Ròi!"
End Sub

Nhập số liệu vô vùng qui định của 'Index' & bấm tổ hợp fím & kiểm tra lại chuyện chép

Chúc thành công!
 
Upvote 0
Chưa hiểu bạn muốn làm cái gì, nhưng theo tôi với File này thì chỉ làm 1 sheet theo dõi, muốn ngày hoặc tháng nào thì lọc nó ra.
Nếu lọc tháng xong thì thêm code tách ngày của tháng đó.

Nói chung chỉ cần 2 sheet là đủ: 1 sheet theo dõi và 1 sheet lọc.
- Mình đang viết cái VBA với mục đích là : Khi mình dùng chuột select một vùng chon và nhấn Ctr+C ( Copy) cái vùng đó thì clipboard đã lưu cả vùng chọn ấy vào trong bộ nhớ máy rồi ( bạn lick vào clipboard ngay thanh công vụ là thấy nó liên)
- Tiếp theo mình mở Form nhập liêu lên nhấn vào commandbutton có tên AddClipboard và chép cái dự liệu đó vào từng ô ( Cái này có tưởng là tại sao mấy cái Ô textbox không cho copy liên tục tương tự như ta copy một day ô như trong bảng tính excel)
- Mình tạo tiếp một commandButto thứ hai có tác dụng là "Save" nó có nhiệm vụ copy các textbox trên về sheets tuong ứng với ngày trong tháng và vào các ô tương ứng(Cái này thì mình đã thử xong rồi) .
- Nhưng vấn đề mà mình vương phải khi tạo đó là :
+ code cũa mình không chép vào từng textbox mà chi vào có cái textbox đầu tiên thôi. Cái này thì là do mình sử lý đoạn text đc lấy từ Clipboard chưa đc tôt là vì khi mình đưa đoạn text ở ngoài vào thò rất ok .
+ Nếu dư liêu sử lý là :x x x x x x thì Ham làm việc tôt nhưng dưới 6 ô thì ham làm việc không đúng.
 

File đính kèm

Upvote 0
Bạn chép macro này vô Module1; Tạo cho nó 1 tổ hợp để chạy như {CTRL}+{SHIFT}+C
PHP:
Sub ChuyenDuLieuTheoNgay()
 Dim Sh As Worksheet, Cls As Range

 Set Sh = ThisWorkbook.Worksheets(CStr(Day([I1].Value)))
 For Each Cls In Range("K11:P12")
    Sh.Cells(Cls.Row, Cls.Column - 8).Value = Cls.Value
 Next Cls
 For Each Cls In Range("Q13:Q16")
    Sh.Cells(Cls.Row + 1, "J").Value = Cls.Value
 Next Cls
 MsgBox "Chép Xong Ròi!"
End Sub

Nhập số liệu vô vùng qui định của 'Index' & bấm tổ hợp fím & kiểm tra lại chuyện chép

Chúc thành công!
Cam ơn Sa_DQ đã góp sức .
- Mình mới test xong ham chay rất ngọt bạn ơi.
- Còn cái Clipboard bạn có y tưởng nào giúp mình sử lý nó không.
-ở trong file bạn bôi vùng chon ơ sheet Index roi nhấn vào Goi Form chon AddClipboard thì nó chỉ chép hết toàn bộ giá trị vào textbox đâu tiên thôi
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sao bạn cứ mãi miết với Clipboard thế nhỉ?
Sao bạn không duyệt toàn bộ các ô cần chép & chép thẳng lên các TextBox luôn được không?
Đằng nào thì bạn cũng fải có từng í TextBox để chứa, dù bạn không chọn ô trên trang tính tương ứng với TextBox (fải chép tới)
 
Upvote 0
Sao bạn cứ mãi miết với Clipboard thế nhỉ?
Sao bạn không duyệt toàn bộ các ô cần chép & chép thẳng lên các TextBox luôn được không?
Đằng nào thì bạn cũng fải có từng í TextBox để chứa, dù bạn không chọn ô trên trang tính tương ứng với TextBox (fải chép tới)
Nếu như vậy thì mình phải copy từng ô rồi lại paste vào từng textbox và mình có cả trăm ô phải làm như thế. Nếu như copy từng day ô tới dảy ô khác như trong bảng tính excel thì mọi việc đa đơn giản rồi nhưng mình kg làm đc như vậy.
 
Upvote 0
Chưa hiểu bạn muốn làm cái gì, nhưng theo tôi với File này thì chỉ làm 1 sheet theo dõi, muốn ngày hoặc tháng nào thì lọc nó ra.
Nếu lọc tháng xong thì thêm code tách ngày của tháng đó.

Nói chung chỉ cần 2 sheet là đủ: 1 sheet theo dõi và 1 sheet lọc.
Như đã nêu ở trên file mình làm việc hằng ngày là file do cty lập sẳn nó khoá hết toàn bộ chức năng và chỉ cho ta thao tác trên nhưng ô không khoá thôi và mình cũng không đc quền thêm sheet vào. Hằng giờ phải lọc dư liệu trên mail và đưa dử liệu vào file đó sử lý số liệu rồi lại mail cho phòng ban khác . Mình viết vba cho mọi người trong phòng cùng sai. Để cho những người không biết nhiều về excel cũng dùng đc nhằm giảm tối đa những sai sót khi nhập liệu .
 
Upvote 0
Như đã nêu ở trên file mình làm việc hằng ngày là file do cty lập sẳn nó khoá hết toàn bộ chức năng và chỉ cho ta thao tác trên nhưng ô không khoá thôi và mình cũng không đc quền thêm sheet vào. Hằng giờ phải lọc dư liệu trên mail và đưa dử liệu vào file đó sử lý số liệu rồi lại mail cho phòng ban khác . Mình viết vba cho mọi người trong phòng cùng sai. Để cho những người không biết nhiều về excel cũng dùng đc nhằm giảm tối đa những sai sót khi nhập liệu .
Tôi chỉ đưa ra giải pháp, còn Công ty không muốn thay đổi thì tôi chịu (không thể góp ý), khi Công ty không muốn thay đổi..
 
Upvote 0
Tôi chỉ đưa ra giải pháp, còn Công ty không muốn thay đổi thì tôi chịu (không thể góp ý), khi Công ty không muốn thay đổi..
Họ có y cũa họ và mình cũng có ý cũa mình moa, có góp ý rồi nhưng kg thấy họ phản hồi gì cũng đành chịu. Hôi mình mới vào làm việc thấy các cụ trong phòng nhập số liệu vào file theo phương thức bằng tay nhình mà chán đời thôi rồi mất cả 30 phút nhập số liệu mà còn sai tùm lum, mình đã làm lại cho phòng vài thứ bây giờ đã cải thiện nhiều rồi nhưng vẫn còn nhiều sai sót .
 
Upvote 0
Họ có y cũa họ và mình cũng có ý cũa mình moa, có góp ý rồi nhưng kg thấy họ phản hồi gì cũng đành chịu. Hôi mình mới vào làm việc thấy các cụ trong phòng nhập số liệu vào file theo phương thức bằng tay nhình mà chán đời thôi rồi mất cả 30 phút nhập số liệu mà còn sai tùm lum, mình đã làm lại cho phòng vài thứ bây giờ đã cải thiện nhiều rồi nhưng vẫn còn nhiều sai sót .
Tôi chỉ góp ý vậy thôi, còn công việc thì phải từ từ.
Nếu bạn mới vào làm thì không nên nên góp ý linh tinh sẽ mang họa vào thân, mặc dù mình góp ý hay đó nhưng họ chẳng bao giờ nghe cả vì cách làm của họ đã có nền nếp, quy cũ (muốn thay đổi một sớm một chiều thì rất khó) thôi đành sống chung với lũ vậy, khi nào ngập hết không có chỗ trú thì họ mới bám lấy mình.
 
Upvote 0
Cảm ơn nhưng lời góp ý chân thành, mình chỉ làm cho phòng cũa mình thôi, họ thấy hay và nhờ mình làm sao cho công việc càng ngày càng đơn giản hóa đi và năng suất tăng lên, mổi ngày mình dành ra 2h để nghiên cứu cái VBA này cũng vì mục đích đó càng học thấy càng nghiền cái VBA này luôn thời gian ranhe là lao đầu vào đọc code. Ước gì việc copy paste lên form giống như copy paste trên các bảng tính thì không phải đau đầu như bây giờ.
PHP:
Sub CommandButton1_Click()
Dim DataObj As MSForms.DataObject
'----Ham nay lay data tu Clipboard
Dim MyString As Variant
Dim MyS As String
Dim x As Integer, i As Integer
Dim text As String, Editext As String
Dim icount As Long
Dim n As Integer
Dim ar As Variant
Dim Ghep As String

Set DataObj = New MSForms.DataObject
On Error GoTo Whoa
DataObj.GetFromClipboard
MyString = DataObj.GetText(1)
MsgBox MyString
[I21] = MyString
'-- khong co du lieu vao day
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
 
   text = Trim([I21]) '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot

 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    x = DemKT(text) + 1 ' dem so khoang trang
 
    Debug.Print x
    On Error Resume Next
   
    For i = 1 To 1
        ar = Split(text, " ", x)
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
        Next
        On Error GoTo 0
     
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub CommandButton3_Click()

End Sub
Function DemKT(Chuoi As String) As Long
Trim (Chuoi)
  DemKT = Len(Chuoi) - Len(Replace(Chuoi, " ", ""))
End Function
Function JoinText(Vung As Range, Optional PC As String = ", ") As String
  On Error GoTo Tiep1
  With Application.WorksheetFunction
    JoinText = Join(.Transpose(Vung), Chr(13))
    GoTo Tiep2
Tiep1:
    JoinText = Join(.Transpose(.Transpose(Vung)), Chr(13))
  End With
Tiep2:
  JoinText = Replace(JoinText, " ", Chr(10))
  JoinText = Replace(JoinText, Chr(13), " ")
  JoinText = WorksheetFunction.Trim(JoinText)
  JoinText = Replace(JoinText, " ", PC)
  JoinText = Replace(JoinText, Chr(10), " ")
End Function

Private Sub UserForm_Click()

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn nhưng lời góp ý chân thành, mình chỉ làm cho phòng cũa mình thôi, họ thấy hay và nhờ mình làm sao cho công việc càng ngày càng đơn giản hóa đi và năng suất tăng lên, mổi ngày mình dành ra 2h để nghiên cứu cái VBA này cũng vì mục đích đó càng học thấy càng nghiền cái VBA này luôn thời gian ranhe là lao đầu vào đọc code. Ước gì việc copy paste lên form giống như copy paste trên các bảng tính thì không phải đau đầu như bây giờ.
PHP:
Sub CommandButton1_Click()
Dim DataObj As MSForms.DataObject
'----Ham nay lay data tu Clipboard
Dim MyString As Variant
Dim MyS As String
Dim x As Integer, i As Integer
Dim text As String, Editext As String
Dim icount As Long
Dim n As Integer
Dim ar As Variant
Dim Ghep As String

Set DataObj = New MSForms.DataObject
On Error GoTo Whoa
DataObj.GetFromClipboard
MyString = DataObj.GetText(1)
MsgBox MyString
[I21] = MyString
'-- khong co du lieu vao day
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
 
   text = Trim([I21]) '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot

 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    x = DemKT(text) + 1 ' dem so khoang trang
 
    Debug.Print x
    On Error Resume Next
  
    For i = 1 To 1
        ar = Split(text, " ", x)
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
        Next
        On Error GoTo 0
    
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub CommandButton3_Click()

End Sub
Function DemKT(Chuoi As String) As Long
Trim (Chuoi)
  DemKT = Len(Chuoi) - Len(Replace(Chuoi, " ", ""))
End Function
Function JoinText(Vung As Range, Optional PC As String = ", ") As String
  On Error GoTo Tiep1
  With Application.WorksheetFunction
    JoinText = Join(.Transpose(Vung), Chr(13))
    GoTo Tiep2
Tiep1:
    JoinText = Join(.Transpose(.Transpose(Vung)), Chr(13))
  End With
Tiep2:
  JoinText = Replace(JoinText, " ", Chr(10))
  JoinText = Replace(JoinText, Chr(13), " ")
  JoinText = WorksheetFunction.Trim(JoinText)
  JoinText = Replace(JoinText, " ", PC)
  JoinText = Replace(JoinText, Chr(10), " ")
End Function

Private Sub UserForm_Click()

End Sub
Bạn sửa như thế này
Mã:
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
   text = MyString '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot
 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    For i = 1 To 1
        ar = Split(text, ChrW(9))
       
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
    Next
Đó là đoạn Code của bạn nên chắc bạn biết chỗ rồi.
 
Upvote 0
Bạn sửa như thế này
Mã:
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
   text = MyString '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot
 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    For i = 1 To 1
        ar = Split(text, ChrW(9))
      
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
    Next
Đó là đoạn Code của bạn nên chắc bạn biết chỗ rồi.
thanks ban nhiều nó chay đc rồi đúng như y mình bây giờ thêm code giải phóng clipboard nữa là ok
 
Upvote 0
Vậy 100 ô có fải kèm theo với chúng là 100 TextBox à? Dù cho ô tương ứng với TextBox nào đó không được chọn lần này; mà chọn lần kế tiếp.
 
Upvote 0
Vậy 100 ô có fải kèm theo với chúng là 100 TextBox à? Dù cho ô tương ứng với TextBox nào đó không được chọn lần này; mà chọn lần kế tiếp.

100 tính 100, Hiện gờ chỉ có 6 thì tính theo 6. Code chữa cháy mà bác. Nguyên tắc: đốt gì cháy nấy.
 
Upvote 0
Cảm ơn gpe giúp đở mình nhiều. Cái Form mới chỉ hoàn thành xong cái micro bây giờ đến giai đoạn Macro . Chạy lên lổi um sà lùm, xin cty nghỉ phép một tháng mục đích chính là để làm cái form này không mong gì hơn chỉ cho nó chạy suôn sẻ lúc đầu thôi sau đó mới cô gắng học Vba cho bài bản chư tay ngang như thế này đau đây nhức óc moà bạc hết cả đầu.
 
Upvote 0
Nhơ các a chỉnh giúp em cái Form tiết em làm nó cứ báo lổi xuốt:
Em mới lập thê Sư kiện Private Sub UserForm_Initialize() là khi mở Form lên thì nó cập nhật Dử liệu bên Sheet tại thời điểm đó sau đó ta co thê thay đôi dử liệu và Save lại.
PHP:
Private Sub UserForm_Initialize() ' Gia tri khi mo Form

Private Sub UserForm1_Initialize() ' Gia tri khi mo Form

Dim Sh As Worksheet, Cls As Range
Set Sh = ThisWorkbook.Worksheets(CStr(Day([I1].Value))) 'use ham CStr Day sang Sting
Dim TB As TextBox
Dim i As Integer, j As Integer, k As Integer
'---lay gia tri ngay tu I1
'  dung SET de khai bao bien doi tuong//giai phong set xx= nothing
'-----------------------------MSP1
 For i = 1 To 6
 TB(i).text = Sh.Range("B45").Offset(0, i)
 Exit For
 Next i

 For j = 7 To 12
 TB(j).text = Sh.Range("B49").Offset(0, j)
 Exit For
 Next j

 For k = 13 To 17
 TB(k).text = Sh.Range("B49").Offset(k, 0)
 Exit For
 Next k
  TB(18).text = Sh.Range("B49").Offset(k, 7)
  TB(19).text = Sh.Range("B49").Offset(k, 10)

 '
 ' Dung ham Offfet

'''' Erro
 
   

End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn gpe giúp đở mình nhiều. Cái Form mới chỉ hoàn thành xong cái micro bây giờ đến giai đoạn Macro . Chạy lên lổi um sà lùm, xin cty nghỉ phép một tháng mục đích chính là để làm cái form này không mong gì hơn chỉ cho nó chạy suôn sẻ lúc đầu thôi sau đó mới cô gắng học Vba cho bài bản chư tay ngang như thế này đau đây nhức óc moà bạc hết cả đầu.
Bạn đi không đúng hướng nên thời gian nhiều mà hiệu quả ít.

Ví thử bài số #131 của bạn, bạn có những từ khóa để mà đọc: Vòng lặp For....Next, Exit For, Offset .... nó là cái gì? Tác dụng? Câu lệnh đi như thế nào? Bạn đã tìm hiểu đâu, cũng chỉ mất 2 tiếng để tìm, đọc, hiểu. Tài liệu thì đầy ra.

Phía trên tôi nói bạn đi không đúng hướng, cũng ví dụ như bài #131 của bạn: tại sao bạn không bắt đầu từ 1 control, từ 1 ô. Sau đó tới 2 ô, 3 ô, ..5 ô, sau đó hãy chuyển qua vòng lặp, vì bạn làm từng dòng lặp đi lặp lại mới biết cái gì lặp cái gì không.

Việc Logic trong suy nghĩ lập trình theo tôi là quan trọng nên khuyên bạn hãy đi dần dần từng bước.

* Đằng nào cũng viết dài thì dài thêm 1 chút với bạn về cái "dần dần".
Bài #126 tôi trả lời cho bạn #125

Trong #125 của bạn, bạn đã định hướng đúng
Mã:
ar = Split(text, " ", x)
nhưng bạn có tìm hiểu Split nó như thế nào? Cái x của bạn để làm gì? Cái " " của bạn để làm gì?
Nếu bạn tìm hiểu thì bạn sẽ có câu trả lời như #126 của tôi, vì tôi biết Split nó như thế nào, cái " " của bạn nó không phải là dấu cách mà là cái gì đó, cái gì thì phải tìm mới biết, phải để chính Code đọc cho nó là Chrw(9) mà thay vào cái " ".

Dài vậy thôi để bạn tự ngẫm và chúc bạn thành công!
 
Upvote 0
Cảm ơn a dhn46 đã khuyên mình! Có lẻ nên nghỉ ngơi không lải tẩu hoả nhập ma mất. Càng làm càng sai. Lực tốc bất đạt. Dùng vòng lặp for each có lẻ hay hơn.
 
Upvote 0
Mã:
Private Sub Nutsua_Click()
Dim i As Long, currRow As Long, LastRow As Long, Arr(1 To 7)
LastRow = Worksheets("Khachhang").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
i = ListBox1.ListIndex
Arr(1) = Stt
Arr(2) = Me.cobtenKH.Value
'arr(3) = Me.gioitinh.Value
Arr(4) = Me.cobPhone.Value
Arr(5) = Me.txtADD.Text
Arr(6) = Me.cobNhom.Value
Arr(7) = Me.txtNote.Text
Sheet7.Range("A3").Offset(Stt).Resize(1, 7).Value = Arr
RefreshListbox
End Sub
Đây là 1 đoạn code mình copy trên diễn dàn dùng để chỉnh sửa và lưu dữ liệu. Nhờ GPE giải thích và cách vận dụng để chỉnh sửa và lưu dữ liệu lại với.
 
Upvote 0
Có cách gì để chỉnh kích thước chữ trong page của Form này không các bác? Xin cảm ơn ạ
 

File đính kèm

  • 12345.jpg
    12345.jpg
    119.3 KB · Đọc: 13
Upvote 0
Hi all. Listbox của mình làm có 1 cột gồm các số thập phân ví dụ như là 0.6231285, Các bạn Cho mình hỏi có cách nào chỉ hiện lên 2 chữ số sau dấu "." không ạ (0.6231285->0.62). Thanks
 
Upvote 0
mọi người ai giúp em với, em muốn thay đổi cái combo box (Thay đổi kích thước và vị trí) có được không ạh. Em cám ơn
 
Upvote 0
Nhờ các ace GPE cho em xin code cho userform của em với, em lên giao diện rồi,
mục đích form lấy dữ liệu sheet định mức chèn vào sheet dự toán
em mới tập tành với vba nên còn gà lắm
em cám ơn mọi người trước
:D:D:D:D:D
 

File đính kèm

Upvote 0
Nhờ các ace GPE cho em xin code cho userform của em với, em lên giao diện rồi,
mục đích form lấy dữ liệu sheet định mức chèn vào sheet dự toán
em mới tập tành với vba nên còn gà lắm
em cám ơn mọi người trước
:D:D:D:D:D
Đang tìm cách giải quyết bài của mình, tình cờ em gặp được bài này http://www.giaiphapexcel.com/diendan/threads/giúp-code-phân-tích-vật-tư.79499/ , và sữa theo bài em thì có 1 vấn đề là chỉ chèn được 18 cột vào bản TLuong DT (trong khi em muốn, chèn 22 cột) thì sữa code thế nào mấy ACE giúp em với
 

File đính kèm

Upvote 0
Hi cả nhà
Mình đã tào thành công form. Nhưng phần optionbutton mình cần viết code nếu chọn Nợ thì sẽ tô màu dòng đó,,, và khi cập nhập Ok thì sẽ trắng lại bt
Với phần chọn lịch, trên userform của mình hiện không có, Anh chị nào có thể giúp em giải quyết vấn đề được không ạ
Thanks cả nhà ạ
 
Upvote 0
Mình có đoạn code sau:

Private Sub CommandButton1_Click()
ListBox1.AddItem
ListBox1.List(ListBox1.ListCount - 1, 0) = 1
ListBox1.List(ListBox1.ListCount - 1, 1) = 2
n = UBound(ListBox1.List, 2)
MsgBox "UBound(ListBox1.List, 2) = " & n
End Sub

Các bạn cho mình hỏi:
- Với câu lệnh trên thì list chỉ có 2 cột, thì khi đó UBound(ListBox1.List, 2) = 1 nhưng Msgbox lại hiển thị n = 9. Ai đó giải thích dùm
- Với câu lệnh Listbox1.List = Range("A1:B1") thì UBound(ListBox1.List, 2) = 1 là đúng
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em chào cả nhà. Các bác bớt chút thời gian giúp em cái Form sửa và nhập dữ liệu này với ah. Em có gửi File kèm theo
 

File đính kèm

Upvote 0
Nhờ mọi người gỡ rối cho mình đoạn code này với:
Sub Macro1()
For x = 1 To 2
Selection.EntireRow.Insert
Selection.EntireRow.Insert
SendKeys "{down}"
SendKeys "{down}"
SendKeys "{down}"
Next x
End Sub

Mình muốn thế này: Khi mình đặt chuột ở cell A2 rồi RUN: tự động insert thêm 2 hàng, sau đó tự động trỏ chuột xuống 3 hàng và thực hiện lại như thế 2 lần hết vòng lặp FOR
Nhưng khi mình dùng code trên thì xẩy ra lỗi: Selection.EntireRow.Insert lệnh insert thực hiện 2 lần (insert 2x2 thành 4 hàng) sau đó lệnh SendKeys "{down}" mới thực hiện 2 lần (chuột tự động nhảy xuống 3x2 thành 6 hàng)
Mình có gửi kèm file
MONG MỌI NGƯỜI GIÚP ĐỠ, CẢM ƠN NHIỀU NHÉ!!!!!!!!!!!
 

File đính kèm

Upvote 0
Em chào cả nhà. Các bác bớt chút thời gian giúp em cái Form sửa và nhập dữ liệu này với ah. Em có gửi File kèm theo
Em muốn ở Form khi gõ ở textBoxt trên cùng sẽ lọc ra các dữ liệu cần tìm ở vùng từ cột B đến cột AL mà không cần fải Click vào Button ALL

Bạn gõ vô TextBox những gì vậy?
1./ Đừng nói là xài thước (kẻ) gỏ (đâu đó trên màn hình) thì TextBox trên cùng sẽ lọc ra dữ liệu cần tìm . . . đó nha
2./ Bạn cần tìm thứ gì, tìm ở trường (cột) nào & kết quả hiện ở đâu cho bạn?

Nên viết để người khác hiểu, chứ không nên viết những gì mình hiểu.
 
Upvote 0
Chào mọi người và muốn nhờ mọi người viết hộ mình code copy dữ lệu.
1. file nguồn copy dữ liệu cột U,AC,AK,AS,BA,BI,BQ,BY,CG
2. file đích pate dữ liệu từ file nguồn vào các cột I->Q.
3. Khi có file nguồn mới thì ấn macro sẽ chuyển giữ liệu mới xuống dưới dữ liệu cũ.
** Trân thành cảm ơn!!!
 

File đính kèm

Upvote 0
Chào mọi người và muốn nhờ mọi người viết hộ mình code copy dữ lệu.
1. file nguồn copy dữ liệu cột U,AC,AK,AS,BA,BI,BQ,BY,CG
2. file đích pate dữ liệu từ file nguồn vào các cột I->Q.
3. Khi có file nguồn mới thì ấn macro sẽ chuyển giữ liệu mới xuống dưới dữ liệu cũ.
** Trân thành cảm ơn!!!
Tại sao phải tự làm khó mình như thế, sao ta không thiết kế nó chung 1 File (nguồn) cho thuận tiện.
- Với 1 sheet nhập liệu và 1 sheet theo dõi (thì sẽ dễ dàng hơn).
- Hoặc ở sheet nhập liệu của File (nguồn) khi nhập liệu vào sheet theo dõi xong thì nó cũng lưu vào 1 sheet nào đó của File (đích).
 
Upvote 0
Chào mọi người và muốn nhờ mọi người viết hộ mình code copy dữ lệu.
1. file nguồn copy dữ liệu cột U,AC,AK,AS,BA,BI,BQ,BY,CG
2. file đích pate dữ liệu từ file nguồn vào các cột I->Q.
3. Khi có file nguồn mới thì ấn macro sẽ chuyển giữ liệu mới xuống dưới dữ liệu cũ.
** Trân thành cảm ơn!!!
File của bạn có cái form nào đâu mà hỏi ở đây?
 
Upvote 0
Làm sao mà biết được là "nguồn mới".
À tức là có nhiều file mỗi ngày
Bài đã được tự động gộp:

Tại sao phải tự làm khó mình như thế, sao ta không thiết kế nó chung 1 File (nguồn) cho thuận tiện.
- Với 1 sheet nhập liệu và 1 sheet theo dõi (thì sẽ dễ dàng hơn).
- Hoặc ở sheet nhập liệu của File (nguồn) khi nhập liệu vào sheet theo dõi xong thì nó cũng lưu vào 1 sheet nào đó của File (đích).
À vì mỗi ngày có nhiều file nguồn. Mình quản lý riêng 1 data để nhập tất cả dữ liệu đó gửi sếp
 
Upvote 0
Tôi có tạo 1 Add in trong đó UserForm co de che độ UserForm.Show vbModeless nhung trong Excel 2003-2010 khi di chuyen qua các Worbook khác Form vẫn hiện nhưng trong Excel 2016 thì lại không được. Niếu được mong các anh chị trong diễn đàn hướng dẫn giúp với ah.
Cám ơn mọi người rất nhiều.
Tôi có cách này bạn tham khảo
 

File đính kèm

Upvote 0
Các anh/chị cho hỏi có cách nào vừa hiện UserForm vừa nhập liệu trên bảng tính của excel không ạ? Vì thông thường khi UserForm.show thì ko thao tác trên bảng tính dc nữa
 
Upvote 0
Upvote 0
Bài toán:
1> tại sheet ma_hang ấn nút new-sheet => tạo ra sheet mới theo yêu cầu
2> tại sheet mới tạo tiến hành nhập dữ liệu => dữ liệu tại sheet mới được tạo ra lại chuyển về sheet_mau
Hỏi: nếu ta chọn 1 trong những sheet vừa được tạo vào tiến hành nhập dữ liệu từ form
- làm thế nào để nội dung được nhập từ form sẽ được cập nhập tại sheet mới mà ta đang mở
(tóm lại dữ liệu được nhập ở sheet hiện hành thì nội dung nhập từ form sẽ được cập nhập tại sheet đó)
xin cảm ơn. nhờ mọi người giúp đỡ!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
- làm thế nào để nội dung được nhập từ form sẽ được cập nhập tại sheet mới mà ta đang mở
Sheet đang mở là ActiveSheet. Tức thay cho
Mã:
dong_cuoi = Sheet1.Range("A10000").End(xlUp).Row + 1
With Sheet1
    ....
    
End Sub

thì là
Mã:
dong_cuoi = ActiveSheet.Range("A10000").End(xlUp).Row + 1
With ActiveSheet
    ....
    
End Sub
hoặc
Mã:
With ActiveSheet
    dong_cuoi = .Range("A10000").End(xlUp).Row + 1
    ....
    
End Sub
 
Upvote 0
Bài toán:
1> . . . . . .
2>. . . . . .
Mình chỉ xin góp vài ý về cấu trúc khi xây dựng CSDL của bạn, từ những điều nhỏ nhất, như sau:

Tại trang 'Kho'
Thứ nhất tên trang tính như mình viết, viết in hoàn toàn không dễ đọc hơn, fải vậy không?
Tiếp: Các cột từ A đến C ở trang này có 2 bảng; Mình tạm gọi bảng A bên trên & bảng B bên dưới
Bảng bên trên: Với mình 1 CSDL nào cũng vậy, mã hàng là rất quan trọng, nó là xương sống của 1 CSDL, vậy nên nó có trước & nên có trước khi nhập số lượng của mã hàng đó. Có nghĩa là mình đề nghị bạn hoán đổi 2 cột B & C trong bảng A này cho nhau;
(Với mình thì trường/cột [Mã HH] này luôn có trước cả tên hàng hóa; Điều này có khi tiện trong việc sử dụng hàm VLOOKUP() không chừng!)

Với bảng B bên dưới hoàn toàn ta không nên để ở đó; Ta fải chuyển nó sang các cột khác fía sau như từ cột H trở đi'
Vì 1 chuyện hiển nhiên là bảng A sẽ không tĩnh tại trong quá trình vận hành CSDL, nó có thể co rút hay tăng số dòng dữ liệu của nó; & như vậy sẽ ảnh hưởng đến ghế ngồi của bảng B

Thứ nữa: Bảng dữ liệu nào cũng nên có tiêu đề (cột/trường); Ở trang 'MaHang' (như cách mình gọi) chưa có & là điều không nên.

Chuyện cuối cùng: Bạn có thể cho biết lí do cần tạo mới nhiều trang tính làm vậy?
Mình sẽ rất vui nếu được bạn cho biết về điều này
& Chúc bạn ngày làm việc cuối tuần kết quả mỹ mãn!
 
Upvote 0
Mình chỉ xin góp vài ý về cấu trúc khi xây dựng CSDL của bạn, từ những điều nhỏ nhất, như sau:

xin cảm ơn bạn đã đóng góp ý kiến!
vấn đề bạn hỏi:
Chuyện cuối cùng: Bạn có thể cho biết lí do cần tạo mới nhiều trang tính làm vậy?
Mình sẽ rất vui nếu được bạn cho biết về điều này
lý do:
1. cty có rất nhiều loại hàng khác nhau tầm 107 mã hàng
2. tại sheet kho có siêu liên kết đến các sheet mới tạo (tiện cho việc quản lý)
3. mỗi mã hàng để ở 1 sheet tiện cho việc theo dõi và dễ nhìn hơn
 
Upvote 0
Mình chỉ xin góp vài ý về cấu trúc khi xây dựng CSDL của bạn, từ những điều nhỏ nhất, như sau:
....................................................................................................
Mình sẽ rất vui nếu được bạn cho biết về điều này
& Chúc bạn ngày làm việc cuối tuần kết quả mỹ mãn!
Đã mở Topic trước khi đăng bài ở đây rồi anh ơi, Link bài viết kia:
https://www.giaiphapexcel.com/diendan/threads/Đơn-giản-hóa-lệnh-if.137908/
 
Upvote 0
Upvote 0
Lý do:
1. cty có rất nhiều loại hàng khác nhau tầm 107 mã hàng
2. tại sheet kho có siêu liên kết đến các sheet mới tạo (tiện cho việc quản lý)
3. mỗi mã hàng để ở 1 sheet tiện cho việc theo dõi và dễ nhìn hơn
(1) 107 mặt hàng (MH) là đồ bỏ!
Vậy ~5 ngàn MH, bạn xài 5 ngàn trang tính chắt?
Thường người ta cần ngâm cứu MH nào chỉ việc trích nó ra 0001 trang duy nhất (ở dạng báo cáo) để xem mà thôi.
(2) Có thể đối với bạn là tiên, nhưng với người khác các siêu liên kết chỉ tổ mất công & mất của hơn mà thôi!
(3) Xem lại (1)
 
Upvote 0
(1) 107 mặt hàng (MH) là đồ bỏ!
Vậy ~5 ngàn MH, bạn xài 5 ngàn trang tính chắt?
Thường người ta cần ngâm cứu MH nào chỉ việc trích nó ra 0001 trang duy nhất (ở dạng báo cáo) để xem mà thôi.
(2) Có thể đối với bạn là tiên, nhưng với người khác các siêu liên kết chỉ tổ mất công & mất của hơn mà thôi!
(3) Xem lại (1)
bạn có thể cho mình xin tài liệu để mình tìm hiểu thêm về vấn đề bạn đang đề cập được không?
xin cảm ơn!
 
Upvote 0
Em xin nhờ các anh chị giúp phần code ạ.
Em muốn tạo form như trong file
Trong đó txtbox1 (để nhập mã trong cột A) ví dụ DN1
sau khi nhập tại combobox1 sẽ hiện danh sách những tên ứng với mã vừa nhập sẽ là Cộng, Việt
Tiếp đó lại chọn 1 trong 2 kết quả trong combobox 1 ví dụ là Việt
thì tại txtbox2 sẽ hiện phần chi tiết tương ứng là Cơm...
 

File đính kèm

Upvote 0
Không gõ được chữa "c" vào combobox, không chọn được dữ liệu trong combobox là lý do gì mọi người giúp em trong vd
 

File đính kèm

Upvote 0
a/C NÀO CÓ THỂ RÚT NGẮN ĐOẠN CODE NÀY DÙM MÌNH VỚI, MÌNH MỚI TÌM HIỂU VỀ VBA NÊN CÓ NHỮNG CÁI CODE DÀI " THẦN THÁNH" ....
Mã:
Private Sub ComboBox3_change()
On Error Resume Next
mnv = Me.cbmnv.Value
If ComboBox3 = 1 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 3, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 5, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 7, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 9, 0)
ElseIf ComboBox3 = 2 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 11, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 13, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 15, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 17, 0)
ElseIf ComboBox3 = 3 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 19, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 21, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 23, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 25, 0)
ElseIf ComboBox3 = 4 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 27, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 29, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 31, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 33, 0)
ElseIf ComboBox3 = 5 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 35, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 37, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 39, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 41, 0)
ElseIf ComboBox3 = 6 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 43, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 45, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 47, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 49, 0)
ElseIf ComboBox3 = 7 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 51, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 53, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 55, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 57, 0)
ElseIf ComboBox3 = 8 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 59, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 61, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 63, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 65, 0)
ElseIf ComboBox3 = 9 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 67, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 69, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 71, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 73, 0)
ElseIf ComboBox3 = 10 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 75, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 77, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 79, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 81, 0)
ElseIf ComboBox3 = 11 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 83, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 85, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 87, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 89, 0)
ElseIf ComboBox3 = 12 Then
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 91, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 93, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 95, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 97, 0)

End If
End Sub
Mã:
Private Sub cmb_record_Click()
Dim SLNo As Integer
If Me.ComboBox2.Value = "" Then
MsgBox "CHUA CO SO THU TU !!!"
Exit Sub
End If
SLNo = Me.ComboBox2.Value
Sheets("KPI").Select
Dim rowselect As Double
rowselect = Me.ComboBox2.Value
rowselect = rowselect + 5
Rows(rowselect).Select
If ComboBox3 = 1 Then
Cells(rowselect, "D").Value = Me.TxtDSNS.Value
Cells(rowselect, "F").Value = Me.TxtDSCC.Value
Cells(rowselect, "H").Value = Me.TxtDSNQ.Value
Cells(rowselect, "J").Value = Me.TxtDSTD.Value
Cells(rowselect, "E").Value = Me.TextBox2.Value
Cells(rowselect, "G").Value = Me.TextBox3.Value
Cells(rowselect, "I").Value = Me.TextBox5.Value
Cells(rowselect, "K").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 2 Then
Cells(rowselect, "L").Value = Me.TxtDSNS.Value
Cells(rowselect, "N").Value = Me.TxtDSCC.Value
Cells(rowselect, "P").Value = Me.TxtDSNQ.Value
Cells(rowselect, "R").Value = Me.TxtDSTD.Value
Cells(rowselect, "M").Value = Me.TextBox2.Value
Cells(rowselect, "O").Value = Me.TextBox3.Value
Cells(rowselect, "Q").Value = Me.TextBox5.Value
Cells(rowselect, "S").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 3 Then
Cells(rowselect, "T").Value = Me.TxtDSNS.Value
Cells(rowselect, "V").Value = Me.TxtDSCC.Value
Cells(rowselect, "X").Value = Me.TxtDSNQ.Value
Cells(rowselect, "Z").Value = Me.TxtDSTD.Value
Cells(rowselect, "U").Value = Me.TextBox2.Value
Cells(rowselect, "W").Value = Me.TextBox3.Value
Cells(rowselect, "Y").Value = Me.TextBox5.Value
Cells(rowselect, "AA").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 4 Then
Cells(rowselect, "AB").Value = Me.TxtDSNS.Value
Cells(rowselect, "AD").Value = Me.TxtDSCC.Value
Cells(rowselect, "AF").Value = Me.TxtDSNQ.Value
Cells(rowselect, "AH").Value = Me.TxtDSTD.Value
Cells(rowselect, "AC").Value = Me.TextBox2.Value
Cells(rowselect, "AE").Value = Me.TextBox3.Value
Cells(rowselect, "AG").Value = Me.TextBox5.Value
Cells(rowselect, "AI").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 5 Then
Cells(rowselect, "AJ").Value = Me.TxtDSNS.Value
Cells(rowselect, "AL").Value = Me.TxtDSCC.Value
Cells(rowselect, "AN").Value = Me.TxtDSNQ.Value
Cells(rowselect, "AP").Value = Me.TxtDSTD.Value
Cells(rowselect, "AK").Value = Me.TextBox2.Value
Cells(rowselect, "AM").Value = Me.TextBox3.Value
Cells(rowselect, "AO").Value = Me.TextBox5.Value
Cells(rowselect, "AQ").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 6 Then
Cells(rowselect, "AR").Value = Me.TxtDSNS.Value
Cells(rowselect, "AT").Value = Me.TxtDSCC.Value
Cells(rowselect, "AV").Value = Me.TxtDSNQ.Value
Cells(rowselect, "AX").Value = Me.TxtDSTD.Value
Cells(rowselect, "AS").Value = Me.TextBox2.Value
Cells(rowselect, "AU").Value = Me.TextBox3.Value
Cells(rowselect, "AW").Value = Me.TextBox5.Value
Cells(rowselect, "AY").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 7 Then
Cells(rowselect, "AZ").Value = Me.TxtDSNS.Value
Cells(rowselect, "BB").Value = Me.TxtDSCC.Value
Cells(rowselect, "BD").Value = Me.TxtDSNQ.Value
Cells(rowselect, "BF").Value = Me.TxtDSTD.Value
Cells(rowselect, "BA").Value = Me.TextBox2.Value
Cells(rowselect, "BC").Value = Me.TextBox3.Value
Cells(rowselect, "BE").Value = Me.TextBox5.Value
Cells(rowselect, "BG").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 8 Then
Cells(rowselect, "BH").Value = Me.TxtDSNS.Value
Cells(rowselect, "BJ").Value = Me.TxtDSCC.Value
Cells(rowselect, "BL").Value = Me.TxtDSNQ.Value
Cells(rowselect, "BN").Value = Me.TxtDSTD.Value
Cells(rowselect, "BI").Value = Me.TextBox2.Value
Cells(rowselect, "BK").Value = Me.TextBox3.Value
Cells(rowselect, "BM").Value = Me.TextBox5.Value
Cells(rowselect, "BO").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 9 Then
Cells(rowselect, "BP").Value = Me.TxtDSNS.Value
Cells(rowselect, "BR").Value = Me.TxtDSCC.Value
Cells(rowselect, "BT").Value = Me.TxtDSNQ.Value
Cells(rowselect, "BV").Value = Me.TxtDSTD.Value
Cells(rowselect, "BQ").Value = Me.TextBox2.Value
Cells(rowselect, "BS").Value = Me.TextBox3.Value
Cells(rowselect, "BU").Value = Me.TextBox5.Value
Cells(rowselect, "BW").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 10 Then
Cells(rowselect, "BX").Value = Me.TxtDSNS.Value
Cells(rowselect, "BZ").Value = Me.TxtDSCC.Value
Cells(rowselect, "CB").Value = Me.TxtDSNQ.Value
Cells(rowselect, "CD").Value = Me.TxtDSTD.Value
Cells(rowselect, "BY").Value = Me.TextBox2.Value
Cells(rowselect, "CA").Value = Me.TextBox3.Value
Cells(rowselect, "CC").Value = Me.TextBox5.Value
Cells(rowselect, "CE").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 11 Then
Cells(rowselect, "CF").Value = Me.TxtDSNS.Value
Cells(rowselect, "CH").Value = Me.TxtDSCC.Value
Cells(rowselect, "CJ").Value = Me.TxtDSNQ.Value
Cells(rowselect, "CL").Value = Me.TxtDSTD.Value
Cells(rowselect, "CG").Value = Me.TextBox2.Value
Cells(rowselect, "CI").Value = Me.TextBox3.Value
Cells(rowselect, "CK").Value = Me.TextBox5.Value
Cells(rowselect, "CM").Value = Me.TextBox4.Value
ElseIf ComboBox3 = 12 Then
Cells(rowselect, "CN").Value = Me.TxtDSNS.Value
Cells(rowselect, "CP").Value = Me.TxtDSCC.Value
Cells(rowselect, "CR").Value = Me.TxtDSNQ.Value
Cells(rowselect, "CT").Value = Me.TxtDSTD.Value
Cells(rowselect, "CO").Value = Me.TextBox2.Value
Cells(rowselect, "CQ").Value = Me.TextBox3.Value
Cells(rowselect, "CS").Value = Me.TextBox5.Value
Cells(rowselect, "CU").Value = Me.TextBox4.Value

End If
MsgBox "HOÀN THÀNH CÂP NHÂT KPI'S VÀO DANH SÁCH"

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code (1)
PHP:
Private Sub ComboBox3_change()
Dim CB3 As String, Num As Integer

CB3 = Me!ComboBox3.Text
Num = Switch(CB3 = "1", 3, CB3 = "2", 11, CB3 = "3", 19, CB3 = "4", 27, _
           CB3 = "5", 35, CB3 = "6", 43, CB3 = "7", 51, CB3 = "8", 59)        'Còn Thêm . . .   '
Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), Num, 0)
Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), Num + 2, 0)
Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), Num + 4, 0)
Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), Num + 6, 0)
End Sub
 
Upvote 0
Nếu tôi không lầm thì trong ComBobox3 chỉ có 12 giá trị 1, 2, ..., 12
Nếu còn các giá trị khác thì phải kiểm tra thêm xem Combobox3.Value có thuộc [1;12] hay không.


Mã:
Private Sub ComboBox3_Change()
Dim cb3 As Long
    If ComboBox3.ListIndex = -1 Then Exit Sub
    On Error Resume Next
    mnv = Me.cbmnv.Value
    cb3 = ComboBox3.Value
    Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 - 5, 0)
    Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 - 3, 0)
    Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 - 1, 0)
    Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 + 1, 0)
End Sub

Private Sub cmb_record_Click()
Dim SLNo As Integer, cb3 As Long
Dim rowselect As Double
    If Me.ComboBox2.Value = "" Then
        MsgBox "CHUA CO SO THU TU !!!"
        Exit Sub
    End If
    If ComboBox3.ListIndex = -1 Then Exit Sub
    
    SLNo = Me.ComboBox2.Value
    cb3 = ComboBox3.Value
    Sheets("KPI").Select
    
    rowselect = Me.ComboBox2.Value
    rowselect = rowselect + 5
    Rows(rowselect).Select
    
    Cells(rowselect, 8 * cb3 - 4).Value = Me.TxtDSNS.Value
    Cells(rowselect, 8 * cb3 - 2).Value = Me.TxtDSCC.Value
    Cells(rowselect, 8 * cb3).Value = Me.TxtDSNQ.Value
    Cells(rowselect, 8 * cb3 + 2).Value = Me.TxtDSTD.Value
    Cells(rowselect, 8 * cb3 - 3).Value = Me.TextBox2.Value
    Cells(rowselect, 8 * cb3 - 1).Value = Me.TextBox3.Value
    Cells(rowselect, 8 * cb3 + 1).Value = Me.TextBox5.Value
    Cells(rowselect, 8 * cb3 + 3).Value = Me.TextBox4.Value
End Sub
 
Upvote 0
Nếu tôi không lầm thì trong ComBobox3 chỉ có 12 giá trị 1, 2, ..., 12
Nếu còn các giá trị khác thì phải kiểm tra thêm xem Combobox3.Value có thuộc [1;12] hay không.


Mã:
Private Sub ComboBox3_Change()
Dim cb3 As Long
    If ComboBox3.ListIndex = -1 Then Exit Sub
    On Error Resume Next
    mnv = Me.cbmnv.Value
    cb3 = ComboBox3.Value
    Me.TxtDSNS.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 - 5, 0)
    Me.TxtDSCC.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 - 3, 0)
    Me.TxtDSNQ.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 - 1, 0)
    Me.TxtDSTD.Value = Application.WorksheetFunction.VLookup(mnv, Sheets("KPI").Range("b5:DC500"), 8 * cb3 + 1, 0)
End Sub

Private Sub cmb_record_Click()
Dim SLNo As Integer, cb3 As Long
Dim rowselect As Double
    If Me.ComboBox2.Value = "" Then
        MsgBox "CHUA CO SO THU TU !!!"
        Exit Sub
    End If
    If ComboBox3.ListIndex = -1 Then Exit Sub
   
    SLNo = Me.ComboBox2.Value
    cb3 = ComboBox3.Value
    Sheets("KPI").Select
   
    rowselect = Me.ComboBox2.Value
    rowselect = rowselect + 5
    Rows(rowselect).Select
   
    Cells(rowselect, 8 * cb3 - 4).Value = Me.TxtDSNS.Value
    Cells(rowselect, 8 * cb3 - 2).Value = Me.TxtDSCC.Value
    Cells(rowselect, 8 * cb3).Value = Me.TxtDSNQ.Value
    Cells(rowselect, 8 * cb3 + 2).Value = Me.TxtDSTD.Value
    Cells(rowselect, 8 * cb3 - 3).Value = Me.TextBox2.Value
    Cells(rowselect, 8 * cb3 - 1).Value = Me.TextBox3.Value
    Cells(rowselect, 8 * cb3 + 1).Value = Me.TextBox5.Value
    Cells(rowselect, 8 * cb3 + 3).Value = Me.TextBox4.Value
End Sub
code hok chạy !!!!:(
 
Upvote 0
Chào cả nhà, mình đang tập làm VBA, mình có tạo 1 form (file 2019-Test), khi mình tạo nút nhấn OK để tạo new workbook và sẽ copy tất cả các sheet từ file BGmau sang new workbook vừa tạo ra. Mình đang bị kẹt chỗ là new workbook vừa tạo nó chỉ có copy dc Sheet "ChiTiet" còn Sheet "BGgui" nó lại ko qua được. Mong mọi người tham khảo đoạn code của mình và giúp mình gỡ rối nha. Thank all
P/S: New workbook tạo ra lúc nào cũng có thêm sheet1, nên mình mới nhập thêm dòng X.Sheets("sheet1").Delete để xóa Sheet1 đó đi. Có cách nào để khi tạo new workbook mới thì ko dính thêm sheet1 nữa ko ạ.Mình chỉ muốn có 2 sheet là "ChiTiet" và "BGgui" trong new workbook thôi.

Private Sub btaddOK_Click()
Dim A, B, C As String
Dim X As Workbook
Dim sFil As String
Dim owb As Workbook
Dim ws As Worksheet
Dim sh As Worksheet
A = ComboBox1.Value
B = TextBox1.Value
C = TextBox2.Value
Set X = Workbooks.add
Const sPath = "D:\Test VBA\"
Application.ScreenUpdating = False
Set ws = X.Sheets(Sheets.Count)
sFil = Dir(sPath & "BG mau.xls")

Set owb = Workbooks.Open(sPath & sFil)
For Each sh In owb.Sheets
sh.Copy before:=ws '

owb.Close False
sFil = Dir

X.Sheets("sheet1").Delete
' truy xuat du lieu tu form toi file excel moi '
X.Worksheets(1).Range("H2").End(xlUp).Offset(1, 0).Value = ComboBox1.Text
X.Worksheets(1).Range("G2").End(xlUp).Offset(1, 0).Value = TextBox1.Text
X.Worksheets(1).Range("I2").End(xlUp).Offset(1, 0).Value = TextBox2.Text
X.Worksheets(1).Range("J2").End(xlUp).Offset(1, 0).Value = ComboBox2.Text
X.Worksheets(1).Range("Y2").End(xlUp).Offset(1, 0).Value = ComboBox3.Text

Application.ScreenUpdating = True

X.SaveAs Filename:="D:\Test VBA\" & A & "." & B & "." & C & ".xls"

X.Close

End Sub
 

File đính kèm

Upvote 0
Chả là e có mày mò làm một file nhập liệu theo dõi kinh phí các đơn vị. Tuy nhiên khi nhập liệu vào textbox thì Kết quả ở cột G không thể hiện là dạng số cho nên không thực hiện tính tổng được. Chỉ cần cột "Dự toán được giao" thể hiện ở dạng số thôi ạ.
E gửi cả file của em theo bài viết mong các cao nhân chỉ giáo giúp em ạ.
 

File đính kèm

Upvote 0
Thử lệnh này xem sao:
Mã:
        .Range("G" & dong_cuoi) = txtSotien.Value
PHP:
    txtSotien.Value = 0
 
Upvote 0
Chả là e có mày mò làm một file nhập liệu theo dõi kinh phí các đơn vị. Tuy nhiên khi nhập liệu vào textbox thì Kết quả ở cột G không thể hiện là dạng số cho nên không thực hiện tính tổng được. Chỉ cần cột "Dự toán được giao" thể hiện ở dạng số thôi ạ.
E gửi cả file của em theo bài viết mong các cao nhân chỉ giáo giúp em ạ.
Chẳng hiểu, làm đại hên thì trúng.
 

File đính kèm

Upvote 0
Người ta dùng txtSotien_Change chắc là muốn trong quá trình gõ đã tách thành 123 456 789 cho dễ nhìn chứ không phải là 123456789. Nếu muốn dễ nhìn trong quá trình gõ mà dùng txtSotien_AfterUpdate thì khác nào "mang bát nước chấm ra khi cuộc nhậu đã tàn?".

Dù có dùng txtSotien_AfterUpdate thì giá trị nhập xuống cột G cũng đâu là số để tính toán?

Còn nếu không muốn dễ nhìn trong quá trình gõ thì chỉ cần xóa txtSotien_Change đi thôi. Tức không dùng txtSotien_Change, mà txtSotien_AfterUpdate cũng không nốt.

Tôi không dám chắc nhưng bạn thử xem

Nếu muốn dễ nhìn, tức giữ lại txtSotien_Change thì thử như sau. Không dám cho là đúng ý.
Mã:
.Range("G" & dong_cuoi) = Replace(txtSotien.Text, Mid(Format(1234, "#,##0"), 2, 1), "")
 
Upvote 0
Chẳng hiểu, làm đại hên thì trúng.
cám ơn bác nhé. e đã tải về và kiểm tra thử thì thấy đã được. nhưng e kiểm tra file cũ của e trên máy tính xách tay cá nhân thì với code cũ vẫn ok. nhưng khi copy file này sang máy tính bàn tại cơ quan để sử dụng thì vẫn trả kết quả là text. Không biết có phải tại cài đặt chỗ nào đó trong excel không? bác nào có cao kiến chỉ giúp em nhé
 
Upvote 0
Nếu muốn dễ nhìn, tức giữ lại txtSotien_Change thì thử như sau. Không dám cho là đúng ý.
Mã:
.Range("G" & dong_cuoi) = Replace(txtSotien.Text, Mid(Format(1234, "#,##0"), 2, 1), "")
lệnh của bác e đã chạy tốt. E đã giải quyết được vấn đề. tuy nhiên chưa hiểu câu lệnh cho lắm.
Chân thành cám ơn bác nhé
 
Upvote 0
lệnh của bác e đã chạy tốt. E đã giải quyết được vấn đề. tuy nhiên chưa hiểu câu lệnh cho lắm.
Chân thành cám ơn bác nhé
vd. txtSotien.Text = "123<dấu cách phần nghìn>456<dấu cách phần nghìn>789"

Format(1234, "#,##0") trả về "1<dấu cách phần nghìn>234"

Mid(Format(1234, "#,##0"), 2, 1) = Mid("1<dấu cách phần nghìn>234", 2, 1)

trả về "<dấu cách phần nghìn>"

Replace(txtSotien.Text, Mid(Format(1234, "#,##0"), 2, 1), "") =

Replace("123<dấu cách phần nghìn>456<dấu cách phần nghìn>789", "<dấu cách phần nghìn>", "")

Tức thay tất cả các "<dấu cách phần nghìn>" trong "123<dấu cách phần nghìn>456<dấu cách phần nghìn>789" bằng chuỗi rỗng. Vậy Replace(...) = "123456789"

Tức
Mã:
.Range("G" & dong_cuoi) = "123456789"

Excel sẽ tự "chuyển" thành 123456789
 
Upvote 0
Excel sẽ tự "chuyển" thành 123456789
E lại gặp thêm vấn đề như này nữa. bác xemgiúp e xem sửa như nào với ạ.

1. E làm code điền số thứ tự ở cột A khi cột B có dữ liệu.
Dữ liệu ở cột B e có đặt công thức tham chiếu từ bảng phụ sang.
Khi em bật protect các ô có công thức lên thì code bị lỗi ở chỗ số thứ tự. Vậy sửa code như nào để khi bật protectsheet thì code vẫn chạy bình thường ạ.
2. Có code nào thay thế được công thức tại Cột B ko ạ???
 

File đính kèm

Upvote 0
E lại gặp thêm vấn đề như này nữa. bác xemgiúp e xem sửa như nào với ạ.
1. Trong Sheet1 (DATA) xóa toàn bộ code Worksheet_SelectionChange. Code này được thực hiện khi chọn ô bất kỳ của trang tính, tức tốn điện nước vô ích. Ngoài ra với code đó thì mỗi lần chọn ô thì ô đó như bị động kinh :D

2. Thay vì Worksheet_SelectionChange thì dán code dưới đây. Cách hoạt động của code: mỗi khi có sự thay đổi ở ô nào đó trong cột M (chèn từ Form?) thì code tính giá trị cho ô tương ứng ở cột B. Đồng thời code tính lại các số thứ tự ở cột A.

Hãy đọc kỹ các chú thích trong code để hiểu. Tôi chú thích từng dòng code nên đừng hỏi gì nữa. Đọc, ngẫm nghĩ, động não, hãy tự lực nhiều hơn. Ngược lại thì suốt đời đi nhờ vả.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
'    ta chi phuc vu su thay doi trong cot M de tinh cot B va A. Code chi phuc vu su thay doi cua 1 o
'    trong cot M o moi thoi diem. Neu co nhu cau dan 1 lan hang loat gia tri vao cot M thi phai sua lai code
Dim lastRow As Long, r As Long, number As Long, cotB(), nhiemvuchi
    If Target.Count <> 1 Or Target.Column <> 13 Then Exit Sub
'    de khong say ra su kien Change khi code thay doi cot B va A
    Application.EnableEvents = False
'    tinh cot B
    nhiemvuchi = Application.VLookup(Target.Value, Sheet7.Range("N4:Q144"), 3, 0)
    If IsError(nhiemvuchi) Then
'        khong tim thay Ma so. Nhap "cha co gi" vao cot B. O trong cot M dich sang trai 11 o thi la o trong cot B
        Target.Offset(, -11).Value = Empty
    Else
'        tim thay Ma so nhiemvuchi
        Target.Offset(, -11).Value = nhiemvuchi
    End If
'    tinh cot A
    With Me
        lastRow = .Cells(Rows.Count, "M").End(xlUp).Row
        If lastRow >= 6 Then
'            cot M co du lieu -> nhap cot B vao mang cotB
            cotB = .Range("B6:B" & lastRow + 1).Value
'            duyet tung o cua mang cotB
            For r = 1 To UBound(cotB)
                If cotB(r, 1) <> "" Then
'                    o co gia tri, vay thay bang so thu tu lien tiep number
                    number = number + 1
                    cotB(r, 1) = number
                End If
            Next r
'            nhap mang cotB chua STT hoac rong vao cot A
            .Range("A6").Resize(UBound(cotB)).Value = cotB
        End If
    End With
   
    Application.EnableEvents = True
End Sub
 
Upvote 0
1. Trong Sheet1 (DATA) xóa toàn bộ code Worksheet_SelectionChange. Code này được thực hiện khi chọn ô bất kỳ của trang tính, tức tốn điện nước vô ích. Ngoài ra với code đó thì mỗi lần chọn ô thì ô đó như bị động kinh :D

2. Thay vì Worksheet_SelectionChange thì dán code dưới đây. Cách hoạt động của code: mỗi khi có sự thay đổi ở ô nào đó trong cột M (chèn từ Form?) thì code tính giá trị cho ô tương ứng ở cột B. Đồng thời code tính lại các số thứ tự ở cột A.

Hãy đọc kỹ các chú thích trong code để hiểu. Tôi chú thích từng dòng code nên đừng hỏi gì nữa. Đọc, ngẫm nghĩ, động não, hãy tự lực nhiều hơn. Ngược lại thì suốt đời đi nhờ vả.
[/code]

Hì e mới bập bẹ làm file này là file đâu tiên đấy. vừa mới đặt mua sách thầy Phan Tự Hướng ấy. Nên có gì nhờ các bác chỉ bảo thêm.
 
Upvote 0
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, r As Long, number As Long, cotB(), nhiemvuchi1, nhiemvuchi2, ctmt As Long

If Target.Count <> 1 Or Target.Column <> 13 Then Exit Sub
' de khong say ra su kien Change khi code thay doi cot B va A
Application.EnableEvents = False
' tinh cot B
nhiemvuchi1 = Application.VLookup(Target.Value, Sheet7.Range("N4:Q144"), 3, 0)
nhiemvuchi2 = Application.VLookup(Target.Value, Sheet7.Range("J4:L144"), 3, 0)
ctmt = Range.Cells.Value() ' ý là giá tri o cot N
If IsError(nhiemvuchi1) Or IsError(nhiemvuchi2) Then
'khong tim thay Ma so. Nhap "cha co gi" vao cot B. O trong cot M dich sang trai 11 o thi la o trong cot B
Target.Offset(, -11).Value = Empty
Else
'tim thay Ma so nhiemvuchi

If ctmt = "00000" Then

Target.Offset(, -11).Value = nhiemvuchi1 ' tra gia tri ve cot B

Else
Target.Offset(, -12).Value = nhiemvuchi2 'van tra gia tri ve cot B
End If

End If


' tinh cot A
With Me
lastRow = .Cells(Rows.Count, "M").End(xlUp).Row
If lastRow >= 6 Then
' cot M co du lieu -> nhap cot B vao mang cotB
cotB = .Range("B6:B" & lastRow + 1).Value
' duyet tung o cua mang cotB
For r = 1 To UBound(cotB)
If cotB(r, 1) <> "" Then
' o co gia tri, vay thay bang so thu tu lien tiep number
number = number + 1
cotB(r, 1) = number
End If
Next r
' nhap mang cotB chua STT hoac rong vao cot A

.Range("A6").Resize(UBound(cotB)).Value = cotB
End If

End With

Application.EnableEvents = True

End Sub


Trên cơ sở code bác Batman1 đã giúp e, e sửa thêm như này nhưng bị lỗi ở dòng ctmt = Range.Cells.Value() ' ý là giá tri o cot N
và đơ luôn file excel. Hic
Ý tưởng là nếu Cột N = "00000" thì Giá trị cột B sẽ là nhiemvuchi1 (tìm giá trị cột M trong sheet Bảng tra cứu (N4:Q144), trả về giá trị ở cột thứ 3)
Nếu Cột N không phải "00000" thì cột B sẽ là nhiemvuchi2 (tìm giá trị cột N trong sheet Bảng tra cứu (J4:K144), trả về giá trị ở cột thứ 3)

Có ai biết chỉ dùm em với ạ.
Đặc biệt là bác @batman1 ạ.
 

File đính kèm

Upvote 0
Ý tưởng là nếu Cột N = "00000" thì Giá trị cột B sẽ là nhiemvuchi1 (tìm giá trị cột M trong sheet Bảng tra cứu (N4:Q144), trả về giá trị ở cột thứ 3)
Nếu Cột N không phải "00000" thì cột B sẽ là nhiemvuchi2 (tìm giá trị cột N trong sheet Bảng tra cứu (J4:K144), trả về giá trị ở cột thứ 3)
Lần sau code thì để trong thẻ CODE nhé.

Cột DATA!N của bạn chứa chuỗi mà bạn định tìm trong cột J chứa số là thế nào?
Sao bạn không cho cột N chỉ chứa số? Tức nếu 0 thì tìm M trong N4:Q144, còn nếu N > 0 thì tìm trong J4:L144.

Nếu vẫn để thế thì khi N <> "00000" phải convert N sang số rồi mới tìm trong cột J chỉ chứa số.

Mà thôi. Bạn cứ để thế, code sẽ convert N sang số rồi tìm trong J:L
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
'    ta chi phuc vu su thay doi trong cot M de tinh cot B va A. Code chi phuc vu su thay doi cua 1 o
'    trong cot M o moi thoi diem. Neu co nhu cau dan 1 lan hang loat gia tri vao cot M thi phai sua lai code
Dim lastRow As Long, r As Long, number As Long, cotB(), nhiemvuchi, ctmt As Long

    If Target.Count <> 1 Or Target.Column <> 13 Then Exit Sub
'    de khong say ra su kien Change khi code thay doi cot B va A
    Application.EnableEvents = False
'    tinh cot B
    If Target.Offset(0, 1).Value = "00000" Then
        nhiemvuchi = Application.VLookup(Target.Value, Sheet7.Range("N4:Q144"), 3, 0)
    Else
        ctmt = CLng(Target.Offset(0, 1).Value)
        nhiemvuchi = Application.VLookup(ctmt, Sheet7.Range("J4:L144"), 3, 0)
    End If
    If IsError(nhiemvuchi) Then
'        khong tim thay Ma so. Nhap "cha co gi" vao cot B. O trong cot M dich sang trai 11 o thi la o trong cot B
        Target.Offset(, -11).Value = Empty
    Else
'        tim thay Ma so nhiemvuchi
        Target.Offset(, -11).Value = nhiemvuchi
    End If
  
   '    tinh cot A
    With Me
        lastRow = .Cells(Rows.Count, "M").End(xlUp).Row
        If lastRow >= 6 Then
'            cot M co du lieu -> nhap cot B vao mang cotB
            cotB = .Range("B6:B" & lastRow + 1).Value
'            duyet tung o cua mang cotB
            For r = 1 To UBound(cotB)
                If cotB(r, 1) <> "" Then
'                    o co gia tri, vay thay bang so thu tu lien tiep number
                    number = number + 1
                    cotB(r, 1) = number
                End If
            Next r
            ' nhap mang cotB chua STT hoac rong vao cot A
                 
            .Range("A6").Resize(UBound(cotB)).Value = cotB
        End If
          
    End With
  
    Application.EnableEvents = True
           
End Sub
 
Upvote 0
cám ơn bác@batman1 tại e ko để ý kiểu dữ liệu trong sheet.
code bác sửa nếu e nhập trực tiếp trên sheet thì được. nhưng nếu nhập trên form thì lại không thấy tự nhảy là sao nhỉ.
nhập bằng form xong ko thấy tự nhảy lên, e nhập lại giá trị cột M trực tiếp trên sheet thì lại nhảy.
bác xem thêm giúp e với.
 
Lần chỉnh sửa cuối:
Upvote 0
nếu nhập trên form thì lại không thấy tự nhảy là sao nhỉ.
nhập bằng form xong ko thấy tự nhảy lên, e nhập lại giá trị cột M trực tiếp trên sheet thì lại nhảy.
Code mới ở dưới. Tôi sửa lại các ghi chú, hãy đọc kỹ để biết cách và thứ tự thao tác.
Nếu tôi không hiểu ý thì phải giải thích cặn kẽ chứ không thể chỉ chung chung:
nếu nhập trên form thì lại không thấy tự nhảy là sao nhỉ.

nhập bằng form xong ko thấy tự nhảy lên, e nhập lại giá trị cột M trực tiếp trên sheet thì lại nhảy
Phải cho vd. cụ thể để biết "không nhẩy" hay " nhẩy" nó là gì.

Nếu tôi đoán được "nhẩy" là gì thì nhập bằng tay trực tiếp trên sheet cũng sẽ không nhẩy nếu nhập M trước sau đó nhập N.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
'    ta chi phuc vu su thay doi trong cot N de tinh cot B va A. Code chi phuc vu su thay doi cua 1 o
'    trong cot N o moi thoi diem. Khi nhap bang tay hay tu Form thi thu tu phai la: truoc tien thay doi
'    cot M sau do moi thay doi cot N. Thu tu nay dung nhu trong Private Sub btnInsert_Click trong Form
Dim lastRow As Long, r As Long, number As Long, cotB(), nhiemvuchi, ctmt As Long
'    Neu thay doi dong thoi 2 o tro len hoac thay doi cot <> N thi code se khong duoc thuc hien
    If Target.Count <> 1 Or Target.Column <> 14 Then Exit Sub
'    de khong say ra su kien Change khi code thay doi cot B va A
    Application.EnableEvents = False
'    tinh cot B
    If Target.Value = "00000" Then
'        do tim M trong N:Q
        nhiemvuchi = Application.VLookup(Target.Offset(, -1).Value, Sheet7.Range("N4:Q144"), 3, 0)
    Else
'        do tim N trong J:L
        ctmt = CLng(Target.Value)
        nhiemvuchi = Application.VLookup(ctmt, Sheet7.Range("J4:L144"), 3, 0)
    End If
    If IsError(nhiemvuchi) Then
'        khong tim thay Ma so hoac CTMT. Nhap "cha co gi" vao cot B. O trong cot N dich sang trai 12 o thi la o trong cot B
        Target.Offset(, -12).Value = Empty
    Else
'        tim thay Ma so hoac CTMT
        Target.Offset(, -12).Value = nhiemvuchi
    End If
  
   '    tinh cot A
    With Me
        lastRow = .Cells(Rows.Count, "N").End(xlUp).Row
        If lastRow >= 6 Then
'            cot N co du lieu -> nhap cot B vao mang cotB
            cotB = .Range("B6:B" & lastRow + 1).Value
'            duyet tung o cua mang cotB
            For r = 1 To UBound(cotB)
                If cotB(r, 1) <> "" Then
'                    o co gia tri, vay thay bang so thu tu lien tiep number
                    number = number + 1
                    cotB(r, 1) = number
                End If
            Next r
            ' nhap mang cotB chua STT hoac rong vao cot A
                 
            .Range("A6").Resize(UBound(cotB)).Value = cotB
        End If
          
    End With
  
    Application.EnableEvents = True
           
End Sub
 
Upvote 0
Sorry bác vì nói chưa rõ ràng. "nhảy" ý e là trả ra giá trị cột B và Cột A ý mà. vì code đang tính cột A và Cột B mà.
Nhập trên form thì nó ko trả được kết quả của 2 cộtđấy ạ.
 
Upvote 0
Sorry bác vì nói chưa rõ ràng. "nhảy" ý e là trả ra giá trị cột B và Cột A ý mà. vì code đang tính cột A và Cột B mà.
Nhập trên form thì nó ko trả được kết quả của 2 cộtđấy ạ.
Thì tôi cũng đưa ra code trên cơ sở đoán mò rồi. Vẫn không được? Nếu vẫn không được thì tôi cũng viết rồi
Nếu tôi không hiểu ý thì phải giải thích cặn kẽ chứ không thể chỉ chung chung:
...
Phải cho vd. cụ thể để biết "không nhẩy" hay " nhẩy" nó là gì.
Còn nếu đã được thì nên nói một lời cho mọi người biết
 
Upvote 0
Thì tôi cũng đưa ra code trên cơ sở đoán mò rồi. Vẫn không được? Nếu vẫn không được thì tôi cũng viết rồi

Còn nếu đã được thì nên nói một lời cho mọi người biết

Dạ chân thành cám ơn bác. Code mới đã chạy chuẩn rồi ạ.
E mới mày mò tự học món này. Mong các bác tiếp tục giúp đỡ trong thời gian tới.
 
Upvote 0
Mình có làm một form đăng nhập và giới hạn đăng nhập theo list sẵn có của mình. Nhưng hiện mình gặp một lỗi là nếu nhập đúng theo danh sách sẵn có thì được. còn nếu mình để trắng hoặc không có trong danh sách mà tắt trực tiếp ( ở dấu X) đi thì khi mở cập nhật lại ko hiện được list có sẵn nữa và nhiều khi máy báo lỗi và khởi động lại file. Bạn nào gặp rồi có thể giúp mình xem sửa lỗi này như nào không
1552447497911.png1552447420584.png1552447293123.png1552447293123.png
 

File đính kèm

  • 1552447219422.png
    1552447219422.png
    87.8 KB · Đọc: 13
  • nhap.xlsm
    nhap.xlsm
    21.3 KB · Đọc: 7
Upvote 0
Mình có làm một form đăng nhập và giới hạn đăng nhập theo list sẵn có của mình. Nhưng hiện mình gặp một lỗi là nếu nhập đúng theo danh sách sẵn có thì được. còn nếu mình để trắng hoặc không có trong danh sách mà tắt trực tiếp ( ở dấu X) đi thì khi mở cập nhật lại ko hiện được list có sẵn nữa và nhiều khi máy báo lỗi và khởi động lại file. Bạn nào gặp rồi có thể giúp mình xem sửa lỗi này như nào không
Thay dòng
Mã:
Application.EnableEvents = False: cbtenhang.ListIndex = 0: Application.EnableEvents = True
bằng
Mã:
cbtenhang.ListIndex = -1
Cancel = True
 
Upvote 0
Xin chào các bạn,
OT có một vấn đề sau chưa biết cách xử lý, nhờ các bạn xem và giúp đỡ ạ.
 

File đính kèm

Upvote 0
Upvote 0

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

Back
Top Bottom