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

lam4422

Thành viên mới
Tham gia ngày
3 Tháng mười hai 2008
Bài viết
21
Được thích
2
Điểm
665
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
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
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
 

lam4422

Thành viên mới
Tham gia ngày
3 Tháng mười hai 2008
Bài viết
21
Được thích
2
Điểm
665
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
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
Thì bạn thử đi & tự giải đáp được mà!
 

lam4422

Thành viên mới
Tham gia ngày
3 Tháng mười hai 2008
Bài viết
21
Được thích
2
Điểm
665
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 à.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
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=""
 

lam4422

Thành viên mới
Tham gia ngày
3 Tháng mười hai 2008
Bài viết
21
Được thích
2
Điểm
665
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ỉ.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
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.
 

lam4422

Thành viên mới
Tham gia ngày
3 Tháng mười hai 2008
Bài viết
21
Được thích
2
Điểm
665
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

DarKLov3

Thành viên mới
Tham gia ngày
20 Tháng mười hai 2010
Bài viết
40
Được thích
6
Điểm
365
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

Lần chỉnh sửa cuối:

tranchautrungduong

Thành viên mới
Tham gia ngày
6 Tháng sáu 2013
Bài viết
39
Được thích
7
Điểm
365
Tuổi
29
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

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
7,955
Được thích
7,697
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
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.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
. . . 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
 

DarKLov3

Thành viên mới
Tham gia ngày
20 Tháng mười hai 2010
Bài viết
40
Được thích
6
Điểm
365
Hic chưa có ai ghé qua giúp file của e được ạ.HIc
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
Lần chỉnh sửa cuối:

ongke0711

Thành viên thường trực
Tham gia ngày
7 Tháng chín 2006
Bài viết
276
Được thích
258
Điểm
710
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.
 

DarKLov3

Thành viên mới
Tham gia ngày
20 Tháng mười hai 2010
Bài viết
40
Được thích
6
Điểm
365
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

Lần chỉnh sửa cuối:

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,769
Được thích
9,687
Điểm
860
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!

. . . . .
 
Top