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
 
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

  • New_Nhập dữ liệu.xlsm
    121.3 KB · Đọc: 15
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

  • test_New_Nhập dữ liệu.xlsm
    211.6 KB · Đọc: 5
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

  • test_2.xlsm
    212.4 KB · Đọc: 8
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
    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

  • Book1.xlsx
    12.4 KB · Đọc: 10
Upvote 0
Upvote 0
Web KT
Back
Top Bottom