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
 
Em có sử dụng record macro để ghi lại thao tác copy 1 dòng, rồi insert dòng copy đó, sau đó thì xóa bỏ 1 vài dữ liệu ko cần thiết đi. Nhưng em thấy nó chạy hơi chậm. Anh xem có cách nào giúp đoạn code chạy nhanh hơn thì tư vấn giúp em với.
Mã:
Sub TaoDH()

    Rows("3:3").Select
    Selection.Copy
    Selection.Insert Shift:=xlDown
    Range("B3").Value = ""
    Application.CutCopyMode = False
    Range("C3").Value = ""
    Range("D3").Value = ""
    Range("F3").Value = ""
    Range("G3").Value = ""
    Range("H3").Value = ""
    Range("I3").Value = ""
    Range("J3").Value = ""
    Range("L3").Value = ""
    Range("M3").Value = ""
    Range("N3").Value = ""
    Range("P3").Value = ""
    Range("Q3").Value = ""
    Range("R3").Value = ""
    Range("S3").Value = ""

End Sub
 
Upvote 0
Bạn thử chạy macro sau:
PHP:
Sub TaoDH()
  Rows("3:3").Insert Shift:=xlDown
  [A3].Value = [A4].Value:                  [e3].Value = [E4].Value
  [k3].Value = [k4].Value:                  [o3].Value = [O4].Value
 Exit Sub
End Sub
 
Upvote 0
Bạn thử chạy macro sau:
PHP:
Sub TaoDH()
  Rows("3:3").Insert Shift:=xlDown
  [A3].Value = [A4].Value:                  [e3].Value = [E4].Value
  [k3].Value = [k4].Value:                  [o3].Value = [O4].Value
Exit Sub
End Sub
Anh ơi. Nếu insert như thế này thì các định dạng và công thức ở 1 số ô có đc giữ nguyên ko anh
 
Upvote 0
Thì bạn thử đi & tự giải đáp được mà!
 
Upvote 0
Thì bạn thử đi & tự giải đáp được mà!
- Làm như thế này không được anh ạ. Vì như thế các định dạng ô sẽ không đc giữ nguyên, thêm nữa nó sẽ lấy định dạng của dòng phía trên ( A2). Ví dụ như dòng A2 đang là dòng tiêu đề, em có to màu đỏ toàn bộ dòng, khi insert kiểu này thì dòng insert ra cũng sẽ bị tô màu theo.
- Anh cho em hỏi thêm, các thao tác chạy bằng macros kiểu này sau khi chạy xong không dùng được ctrl + Z đc à.
 
Upvote 0
Vậy thì quay lại làm như bạn, nhưng có thể tóm gọn các câu lệnh lại, như thay vì
Range("C3").Value = ""
Range("D3").Value = ""
Range("F3").Value = ""
Range("G3").Value = ""
Range("H3").Value = ""
Ta chỉ nên : [C3: H3].Value=""
 
Upvote 0
Vậy thì quay lại làm như bạn, nhưng có thể tóm gọn các câu lệnh lại, như thay vì
Range("C3").Value = ""
Range("D3").Value = ""
Range("F3").Value = ""
Range("G3").Value = ""
Range("H3").Value = ""
Ta chỉ nên : [C3: H3].Value=""

Em đã sửa theo như anh bảo, đúng là code có chạy nhanh hơn thật. Anh cho em hỏi thêm 1 tí. Em tạo 1 cái nút dùng để sắp xếp dữ liệu theo thứ tự A - Z như sau:
Mã:
Sub Sort()
Dim dong_cuoi As Long
    dong_cuoi = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row
    
Range("A3", "S" & dong_cuoi).Select
Sheet1.Sort.SortFields.Clear
Sheet1.Sort.SortFields.Add Key:=Range("A3"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With Sheet1.Sort
    .SetRange Range("A3", "S" & dong_cuoi)
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With


Rows(dong_cuoi).Select
Exit Sub
End Sub
Đây là em dùng ghi macro để ghi lại rồi chỉnh sửa thêm.
Bây giờ em muốn cùng 1 nút đó khi bấm thì nó sẽ kiểm tra nếu đang sắp xếp từ A - Z thì nó sẽ sắp xếp ngược lại thành từ Z - A thì làm thế nào được anh nhỉ.
 
Upvote 0
Bắt VBA nó hiểu dữ liệu đang sắp kiểu gì là khó
Còn chuyện bảo nó hỏi ta muốn sắp xếp kiểu gì thì căn cứ vô hằng xlAscending & xlDes. . . trong câu lệnh VBA mà tùy biến
Chuyện này bạn thử xài hàm InputBox() hay MsgBox() xem sao.
 
Upvote 0
Bắt VBA nó hiểu dữ liệu đang sắp kiểu gì là khó
Còn chuyện bảo nó hỏi ta muốn sắp xếp kiểu gì thì căn cứ vô hằng xlAscending & xlDes. . . trong câu lệnh VBA mà tùy biến
Chuyện này bạn thử xài hàm InputBox() hay MsgBox() xem sao.
Anh ơi cho em hỏi 1 tí. Em tạo 1 cái Button khi bấm sẽ chạy đoạn code sau để copy 1 dòng rồi insert nó tại vị trí đó.

Mã:
Sub TaoDH()
Dim dong_cuoi As Long
    dong_cuoi = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row

Rows(dong_cuoi).Select
Selection.Copy
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
Range("B" & dong_cuoi + 1, "D" & dong_cuoi + 1).Value = ""
Range("F" & dong_cuoi + 1, "J" & dong_cuoi + 1).Value = ""
Range("L" & dong_cuoi + 1).Value = ""
Range("N" & dong_cuoi + 1).Value = ""
Range("P" & dong_cuoi + 1).Value = ""
Range("R" & dong_cuoi + 1).Value = ""
Range("S" & dong_cuoi + 1).Value = ""


Exit Sub
End Sub

Vấn đề xảy ra là chạy ở máy em rất nhiều lần thì không sao, nhưng vẫn file đó copy đi máy khác khi chạy 1 vài lần thì bị lỗi như hình. Chọn debug thì nó bôi vàng dòng

Mã:
Selection.Insert Shift:=xlDown

Rồi chỉ có tắt file bật lại thì mới dùng tiếp được. Anh xem giúp em nó bị làm sao với. Em cám ơn anh nhiều.
 

File đính kèm

  • z1370886892293_34d7403b0f8f85da1f57a7c1b751cd8f.jpg
    z1370886892293_34d7403b0f8f85da1f57a7c1b751cd8f.jpg
    370.7 KB · Đọc: 17
Upvote 0
Với sự giúp đỡ của anh @batman1 , e đã có file theo dõi dữ liệu cũng khá là OK. nhưng hiện e có 1 nhu cầu nữa là thay thế các công thức vlookup trên bảng bằng code vì để vlookup cảm giác chưa được chuyên nghiệp lắm. E đã cố sửa code của anh @batman1 giúp code điền cột B và Cột A để áp dụng sang các cột khác mà chưa thành công.
Anh @batman1 và mọi người trong diễn đàn có thế giúp và hướng dẫn em viết code để điền giá trị tại các cột D, E, F, J,L, O của Sheet DATA được không ạ.
Em xin cám ơn nhiều ạ.
 

File đính kèm

  • 13.5.2019 test.xlsm
    1.4 MB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Gửi anh chị em Giải pháp EXCEL

Em có vấn đề xin anh chị giúp ạ,

Em muốn nhập 1 nội dung tìm kiếm và kết quả hiển thị trong textbox nối các thông tin cùng dòng (file đính kèm).

em xin cảm ơn!
 

File đính kèm

  • HOA DON.xlsm
    18.5 KB · Đọc: 5
Upvote 0
Gửi anh chị em Giải pháp EXCEL

Em có vấn đề xin anh chị giúp ạ,

Em muốn nhập 1 nội dung tìm kiếm và kết quả hiển thị trong textbox nối các thông tin cùng dòng (file đính kèm).

em xin cảm ơn!
Góp ý cho bạn:
1/ Nếu nói về chứng từ, hóa đơn, phiếu xuất nhập thì dùng UserForm là không phù hợp, nên dùng Sheetform thì sẽ thuận tiện hơn.
2/ Bạn diễn giải không cụ thể, rõ ràng, nội dung thì trái ngược nhau, làm cho người đọc chẳng hiểu bạn muốn làm cái gì? Cụ thể:
- Trong Form thì ghi "Hiển thị nội dung từ cột A:O".
- Trên sheet thì ghi "nối thông tin từ cột A+ C-O".
- Bài 1 nội dung lại ghi "kết quả hiển thị trong textbox nối các thông tin cùng dòng"

Đọc xong 3 thông tin thì thấy tối mắt và không dám nhìn nữa.
 
Upvote 0
Hiển thị kết quả trên ListBox
 

File đính kèm

  • Form.rar
    15.4 KB · Đọc: 21
Upvote 0
. . . Tại em muốn nó hiện vô textbox để coppy dữ liệu ạ! list box copy k đc tiện!
Cũng tiện mà, Copy từ Array í thôi (Nhờ ListIndex của ListBox)!
PHP:
Private Sub timinv_Change()
Dim Rng As Range, sRng As Range
Dim lRs As Long, J As Long, W As Integer
Dim MyAdd As String

With Sheets("INV")
    lRs = .[B1].CurrentRegion.Rows.Count
    Set Rng = .[B1].Resize(lRs)
    ReDim Arr(1 To lRs, 1 To 7)
    If Len(Me!TimInv.Text) = 4 Then
        Set sRng = Rng.Find(Right("000" & Me!TimInv.Text, 7), , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            MsgBox "Nothing!"
        Else
            MyAdd = sRng.Address
            Do
                W = W + 1:                                          Arr(W, 1) = W
                Arr(W, 2) = sRng.Offset(, -1).Value:        Arr(W, 3) = sRng.Value
                Arr(W, 4) = sRng.Offset(, 3).Value:             Arr(W, 5) = sRng.Offset(, 4).Value
                Arr(W, 6) = sRng.Offset(, 10).Value:        Arr(W, 7) = sRng.Offset(, 12).Value
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
            Me!lbTim.List = Arr()       '<=|   <=|   <=|   <=|   <=|   '
        End If
    End If
End With
End Sub
 
Upvote 0
Hic chưa có ai ghé qua giúp file của e được ạ.HIc
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Với sự giúp đỡ của anh @batman1 , e đã có file theo dõi dữ liệu cũng khá là OK. nhưng hiện e có 1 nhu cầu nữa là thay thế các công thức vlookup trên bảng bằng code vì để vlookup cảm giác chưa được chuyên nghiệp lắm. E đã cố sửa code của anh @batman1 giúp code điền cột B và Cột A để áp dụng sang các cột khác mà chưa thành công.
Anh @batman1 và mọi người trong diễn đàn có thế giúp và hướng dẫn em viết code để điền giá trị tại các cột D, E, F, J,L, O của Sheet DATA được không ạ.

Hic chưa có ai ghé qua giúp file của e được ạ.HIc

Cách đơn giản nhất là bạn chuyển cái textbox [txtQHNS] thành combobox có:
- Name: cboQHNS
- Column Count: 6
- Bound Column:1
-Column width: 1 pt;0 pt;0 pt;0 pt;0 pt;0 pt
- Row Source là cái range ($B$6:$G$dòng cuối) của "Bảng tra cứu"

Khi lưu (insert) thì gán trị cho các cột D, E.. tương ứng lấy từ các cột của cboQHNS.
vd: Range("D" & dong_cuoi) = Me.cboQHNS.Column(1)

Vậy xong.
 
Upvote 0
Mã:
Sub diendulieu()
    On Error Resume Next

    Sheets(Data).Select
    Dim i As Long
    If Range("K" & i + 5).Value = "" Then Exit Sub
    For i = 1 To Range("K10000").End(xlUp).Row - 5
        Range("D" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 2, 0)
        Range("E" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 3, 0)
        Range("F" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 4, 0)
        Range("L" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 6, 0)
        Range("O" & i + 5).Value = WorksheetFunction.VLookup(Range("K" & i + 5).Value, Sheet7.Range("B3:G400"), 5, 0)
        Range("J" & i + 5).Value = WorksheetFunction.VLookup(Range("P" & i + 5).Value, Sheet7.Range("H3:I400"), 2, 0)

    Next


End Sub


Em tạo code như thế này nhưng cần phải ấn một nút để gọi sub diendulieu() thi mới chạy. và code này chạy cũng khá chậm, con trỏ cứ phải xoay 1 lát mới ra kết quả.
Khi em cho vào sự kiện change của sheet1 thi các Cột D, E, F, L, O thì điền OK, nhưng cột J không thấy điền được. chỉ khi nhập thêm dòng khác thì dòng trước mới bắt đầu có kết quả
Các thầy có thể giúp e tối ưu code hoặc cho code vào chỗ nào mà khi nhập xong dữ liệu (sau khi ấn Nhập dữ liệu) thì các ô cần điền sẽ có kết quả theo vlookup luôn được ạ.

Thêm nữa là ở cột H e chỉ muốn cho hiện dạng tháng/ năm (Ví dụ: 05-19) thì làm thế nào các thầy chỉ em với nhé.
 

File đính kèm

  • 23.5.2019 test.xlsm
    1.4 MB · Đọc: 19
Lần chỉnh sửa cuối:
Upvote 0
em tạo code như thế này nhưng cần phải ấn một nút . . .
Khoan hãy nói về Code của bạn;
Thứ nhất: Đầu dòng phải viết hoa; Chuyện này là để người khác tôn trọng bạn & bạn tôn trọng người khác
Thứ nhì: (Nói về thiết kế trang tính)
Ở trang tính mà bạn đã khóa: Tô màu quá nhiều ô; Theo mình chỉ tô màu các dòng tiêu đề để phân biệt vùng là đủ
Mà chỉ nên tô màu cách vùng thôi
Cùng lắm chỉ nên thế này:

217835

Theo như mình thì 1 khi đã xài VBA thì các tên trang tính nên là tiếng Việt không dâu & càng ngắn càng tốt
Thay vì "Nhập liệu", chỉ nên là 'NhapLieu'; Thậm chí là 'Nhap' là dư để đủ rồi!

. . . . .
 
Upvote 0
Web KT
Back
Top Bottom