Tạo userForm - nhờ giúp đỡ (6 người xem)

Liên hệ QC

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

caovanhau1507

Thành viên chính thức
Tham gia
17/7/12
Bài viết
79
Được thích
3
Thân chào các anh chị em GPE!

Em đang có nhu cầu tạo 1 user Form để thực hiện tra cứu thông tin nhưng vì mới bắt đầu nên chưa có kinh nghiệm trong việc này,

Nhờ các anh chị hướng dẫn giúp em.

Em có gửi file và yêu cầu đính kèm.
(Các anh chị tốt bụng ghi chú giải thích bên cạnh để e hiểu lần sau còn tự làm đc với nhé :P)

Cảm ơn các anh chị nhiều!
 

File đính kèm

Số mã chứng khoán sẽ không vượt hơn số ngày cần tra cứu (trong 10 năm chẳng hạn); Vậy nên theo mình bạn cần xoay dữ liệu lại: Ngày được nhập theo cột thì hay hơn;

Nhưng dù sao bạn cũng không nhớ hết toàn bộ mã CK của các đơn vị;
Vậy nên theo mình bạn cần sử dụng 1 ComboBox để chọn mã CK cần khảo sát thì hợp lí hơn.

Chúc thành công!
 
Số mã chứng khoán sẽ không vượt hơn số ngày cần tra cứu (trong 10 năm chẳng hạn); Vậy nên theo mình bạn cần xoay dữ liệu lại: Ngày được nhập theo cột thì hay hơn;

Nhưng dù sao bạn cũng không nhớ hết toàn bộ mã CK của các đơn vị;
Vậy nên theo mình bạn cần sử dụng 1 ComboBox để chọn mã CK cần khảo sát thì hợp lí hơn.

Chúc thành công!

Ah vấn đề là dữ liệu của sheet "HIS" sẽ đc update tự động với số lượng mã CK và thứ tự không giống nhau (có thể thêm hoặc bớt mã trc đó, mã CK sẽ xếp theo thứ tự giảm dần của room) nên việc sử dụng dữ liệu dạng cột sẽ bất tiện. Chưa kể dữ liệu này chỉ lưu trong 1 năm, qua năm mới sẽ làm dữ liệu mới để giảm bớt dung lượng file.
Thật ra, nội dung e yêu cầu có thể dùng hàm INDEX-MATCH để xử lý và thiết kế trực tiếp trên sheet mà ko cần dùng đến các công cụ developer, nhưng vì em đang muốn tìm hiểu về các công cụ này nên xem như đây là 1 ví dụ để học hỏi :)
Nhờ các anh chị trợ giúp cho :)
 
Ah vấn đề là dữ liệu của sheet "HIS" sẽ đc update tự động với số lượng mã CK và thứ tự không giống nhau (có thể thêm hoặc bớt mã trc đó, mã CK sẽ xếp theo thứ tự giảm dần của room) nên việc sử dụng dữ liệu dạng cột sẽ bất tiện. Chưa kể dữ liệu này chỉ lưu trong 1 năm, qua năm mới sẽ làm dữ liệu mới để giảm bớt dung lượng file.
Thật ra, nội dung e yêu cầu có thể dùng hàm INDEX-MATCH để xử lý và thiết kế trực tiếp trên sheet mà ko cần dùng đến các công cụ developer, nhưng vì em đang muốn tìm hiểu về các công cụ này nên xem như đây là 1 ví dụ để học hỏi :)
Nhờ các anh chị trợ giúp cho :)
'- Hiển thị user form ở góc phải sheet (không che mất sheet hiện hành);
có nghĩa là sao bạn?
mà bạn muốn thiết kế form làm gì?
nhập dữ liệu hay tra cứu dữ liệu?
mà sao sau cột J form nó y chang nhau sao không gộp lại mà lại tách ra nhỉ.
nếu trình bày như file thì mẫu đó là xuất dữ liệu rồi chứ đâu phải dùng để quản lý dữ liệu. hay là cách quản lý mới chăng.+-+-+-+
 
Lần chỉnh sửa cuối:
Bạn xem file này; Còn muốn Form đi đâu thì lấy chuột mà rê nó đến thôi.
 

File đính kèm

'- Hiển thị user form ở góc phải sheet (không che mất sheet hiện hành);
có nghĩa là sao bạn?
mà bạn muốn thiết kế form làm gì?
nhập dữ liệu hay tra cứu dữ liệu?
mà sao sau cột J form nó y chang nhau sao không gộp lại mà lại tách ra nhỉ.
nếu trình bày như file thì mẫu đó là xuất dữ liệu rồi chứ đâu phải dùng để quản lý dữ liệu. hay là cách quản lý mới chăng.+-+-+-+

Chào a,

Mục đích của Form e có ghi rõ là dùng để tra cứu dữ liệu chứ ko nhằm quản lý dữ liệu.
Dữ liệu trong sheet "HIS" là dữ liệu thô đc xuất ra từ các BC khác và lưu vào sheet.

Số liệu trong form e đã thay đổi nên nó không có ý nghĩa j cả, mục địch chính là theo form e đã tạo sẵn trong file thì nhập mã và ngày sẽ tra cứu đc dữ liệu của ngày đó;

"Không che mất sheet hiện hành" là e muốn vừa thao tác đc trên sheet vừa thao tác đc trên form vì 1 số form em tham khảo muốn thao tác trên sheet thì phải tắt form đi, lúc cần thì bật lại hơi bất tiện.

Thank a đã góp ý :D
 
Bạn xem file này; Còn muốn Form đi đâu thì lấy chuột mà rê nó đến thôi.

Cảm ơn anh đã giúp đỡ,

Về cơ bản là file của a đúng cái em cần, nhưng nhờ a thêm 2 việc:
- A có thể edit để form hiện lên nhưng e vẫn thao tác đc trên sheet hiện hành ko?
- A giải thích giúp e về các thiết lập trong form để e học hỏi thêm;

Cảm ơn anh rất nhiều :)
 
Về cơ bản là file của a đúng cái em cần, nhưng nhờ a thêm 2 việc:
(2) - A có thể edit để form hiện lên nhưng e vẫn thao tác đc trên sheet hiện hành ko?
(1)- A giải thích giúp e về các thiết lập trong form để e học hỏi thêm;

(1): Khi kích hoạt trang tính 'Report' sẽ có form hiện ra giữa màn hình
Form có 2 ComboBox cùng hàng ngang;
Cái thứ nhất nằm bên fải màn hình dùng để chọn 1 kí tự của mã CK (chứng khoán); khi chọn kí tự nào đó thì danh sách các CK có chứa kí tự đó sẽ có trong nguồn của ComboBox thứ 2; Lúc này ta có thể chọn 1 mã CK nào đó cần thiết trong khảo sát của ta;
Sau đó, khi nhập chuỗi số ngày giao dịch cần thiết, thì có thể bấm vô nút tra cứu để ta biết kết quả tìm kiếm;
Có thể tìm không thấy; bằng ngược lại các số liệu sẽ hiễn thị trên các TextBox còn lại bên dưới.

Nhưng còn 1 điều mà tác giả có thể làm là cô gọn hiễn thị các số thập fân trong các TextBox này (Nếu bạn thấy cần thiết có thể iêu cầu tiếp).

Còn chuyện (2) bạn đã thấy ở đâu làm vậy chưa & sao không học ngay file ở đó!

Tạm là vậy!
 
cảm ơn a đã góp ý :),

Ý của em là khi em nhìn vào form thì e ko biết là tác giả đã thực hiện thao tác hay công cụ gì lên nó để ra được kết quả như vậy. Em muốn xem chi tiết cách làm ể học hỏi thêm và có thể tự làm cho những lần tiếp theo :)
 
Trước tiên là việc bạn chọn 1 kí tự trong danh sách (DS) của ComboBox fải; Khi đó cũng đồng thời kích hoạt macro này chạy:
PHP:
Option Explicit
Dim Rng As Range, sRng As Range

Private Sub CbBAlf_Change()
 Dim MyAdd As String
 
1 [Ad2].CurrentRegion.Offset(1).ClearContents
 Set Rng = Range([z1], [Z2].End(xlDown))
3 Set sRng = Rng.Find(Me!CbBAlf.Text, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
5    MyAdd = sRng.Address
    Do
7        [Ad999].End(xlUp).Offset(1).Value = sRng.Value
        Set sRng = Rng.FindNext(sRng)
9    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    Set sRng = Nothing
11 End If
 Set Rng = Nothing
End Sub

Dòng lệnh trước dòng mang số 1: Khai báo 1 biến kiểu chuỗi xài trong macro;
D1: Xóa dữ liệu trong vùng các ô lân cận liền kề với ô AD2, kể từ hàng thứ 2 trở xuống
D2: Đem vùng từ ô Z2 trở xuống có dữ liệu gán vô biến đối tương (Range) toàn cục đã khai báo
D3: Thực hiện fương thức tìm kiếm trị chuỗi trong ComboBox trong vùng ô của biến toàn cục;
D4: Điều kiện nếu tìm thấy thì thực hiện các lệnh tiếp sau cho đến D11
D5: gán địa chỉ ô tìm thấy vô biến vừa khai báo;
D6: Thiết lập vòng lặp để tìm tất tần tật các ô trong vùng cần tìm; Vòng lặp này kết thúc tại D9
D7: Chép dữ liệu trong ô tìm thấy vô dòng trống đầu tiên của cột [AD]
D8: Ra lệnh tiếp tục tìm khi còn thỏa điều kiện
D9: (điều kiện thoát vòng lặp) khi ô tìm thấy là trùng (quay về) với ô tìm thấy ban đầu.

Sau khi macro này chạy sẽ lập cho ta danh sách các mã CK có chứa kí tự ta đang cần tìm.

Còn đây là các câu lệnh cần thực hiện khi ta nhấn nút tra cứu:
PHP:
Private Sub CmdTra_Click()
 Dim Col As Integer, J As Integer, Rws As Long
 With Sheets("HIS")
    Col = .[b2].CurrentRegion.Columns.Count
    Rws = .[b2].CurrentRegion.Rows.Count
    For J = 2 To Col Step 9
        If CStr(.Cells(2, J).Value) = Me!TxtNgay.Text Then
            Set Rng = .Cells(2, J + 4).Resize(Rws)
            Set sRng = Rng.Find(Me!CbBMaCK.Text)
            If Not sRng Is Nothing Then
                Me!TxtDN.Value = sRng.Offset(, 3).Value
                Me!TxtVay.Value = sRng.Offset(, 1).Value
                Me!Txt5FT.Value = sRng.Offset(, 2).Value
                Me!TxtRCL.Value = sRng.Offset(, 4).Value
            End If
        End If
    Next J
 End With
End Sub
 
Cảm ơn anh đã giúp đỡ,

Về cơ bản là file của a đúng cái em cần, nhưng nhờ a thêm 2 việc:
- A có thể edit để form hiện lên nhưng e vẫn thao tác đc trên sheet hiện hành ko?
- A giải thích giúp e về các thiết lập trong form để e học hỏi thêm;

Cảm ơn anh rất nhiều :)
muốn hiện form mà còn thao tác được trên sheet thì chỉnh chỗ này nha bạn Showmodal =False Chưa có tên.jpg
 
Trước tiên là việc bạn chọn 1 kí tự trong danh sách (DS) của ComboBox fải; Khi đó cũng đồng thời kích hoạt macro này chạy:
PHP:
Option Explicit
Dim Rng As Range, sRng As Range

Private Sub CbBAlf_Change()
 Dim MyAdd As String
 
1 [Ad2].CurrentRegion.Offset(1).ClearContents
 Set Rng = Range([z1], [Z2].End(xlDown))
3 Set sRng = Rng.Find(Me!CbBAlf.Text, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
5    MyAdd = sRng.Address
    Do
7        [Ad999].End(xlUp).Offset(1).Value = sRng.Value
        Set sRng = Rng.FindNext(sRng)
9    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    Set sRng = Nothing
11 End If
 Set Rng = Nothing
End Sub

Dòng lệnh trước dòng mang số 1: Khai báo 1 biến kiểu chuỗi xài trong macro;
D1: Xóa dữ liệu trong vùng các ô lân cận liền kề với ô AD2, kể từ hàng thứ 2 trở xuống
D2: Đem vùng từ ô Z2 trở xuống có dữ liệu gán vô biến đối tương (Range) toàn cục đã khai báo
D3: Thực hiện fương thức tìm kiếm trị chuỗi trong ComboBox trong vùng ô của biến toàn cục;
D4: Điều kiện nếu tìm thấy thì thực hiện các lệnh tiếp sau cho đến D11
D5: gán địa chỉ ô tìm thấy vô biến vừa khai báo;
D6: Thiết lập vòng lặp để tìm tất tần tật các ô trong vùng cần tìm; Vòng lặp này kết thúc tại D9
D7: Chép dữ liệu trong ô tìm thấy vô dòng trống đầu tiên của cột [AD]
D8: Ra lệnh tiếp tục tìm khi còn thỏa điều kiện
D9: (điều kiện thoát vòng lặp) khi ô tìm thấy là trùng (quay về) với ô tìm thấy ban đầu.

Sau khi macro này chạy sẽ lập cho ta danh sách các mã CK có chứa kí tự ta đang cần tìm.

Còn đây là các câu lệnh cần thực hiện khi ta nhấn nút tra cứu:
PHP:
Private Sub CmdTra_Click()
 Dim Col As Integer, J As Integer, Rws As Long
 With Sheets("HIS")
    Col = .[b2].CurrentRegion.Columns.Count
    Rws = .[b2].CurrentRegion.Rows.Count
    For J = 2 To Col Step 9
        If CStr(.Cells(2, J).Value) = Me!TxtNgay.Text Then
            Set Rng = .Cells(2, J + 4).Resize(Rws)
            Set sRng = Rng.Find(Me!CbBMaCK.Text)
            If Not sRng Is Nothing Then
                Me!TxtDN.Value = sRng.Offset(, 3).Value
                Me!TxtVay.Value = sRng.Offset(, 1).Value
                Me!Txt5FT.Value = sRng.Offset(, 2).Value
                Me!TxtRCL.Value = sRng.Offset(, 4).Value
            End If
        End If
    Next J
 End With
End Sub

Rất là chi tiết, cảm ơn anh đã hướng dẫn :D
 
Cho em hỏi thêm 1 vấn đề nữa :),

Đối với user Form thì việc in ấn và lưu pdf xử lý như thế nào vậy các anh chị?

Em cảm ơn :)
 
Web KT

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

Back
Top Bottom