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
 
OT có một vấn đề sau chưa biết cách xử lý, nhờ các bạn xem và giúp đỡ ạ.
Có trường hợp khi [P8:U9] trống, nhưng [P14:U15] có dữ liệu hay không (Lúc đó ta cần điền dữ liệu lấy từ các ô hàng dưới lên các ô hàng trên hay không?)
 
Upvote 0
Có trường hợp khi [P8:U9] trống, nhưng [P14:U15] có dữ liệu hay không (Lúc đó ta cần điền dữ liệu lấy từ các ô hàng dưới lên các ô hàng trên hay không?)
Vùng N:U là kết quả mong đợi. Dữ liệu đầu vào là D:K

Nhìn D:K thì thấy dòng 10+11 được "bắn" lên trên vào dòng 8+9, và xuống dưới vào dòng 14+15. Tức súng bắn 2 chiều.

Và bây giờ giả sử có:

-dòng 8+9 rỗng
-dòng 10+11 <> rỗng
-dòng 14+15 rỗng.
-dòng 18+19 <> rỗng
-dòng 22+23 rỗng.

Các dòng đều có mã là b.

Ta có thể chấp nhận là 10+11 bắn lên 8+9 chứ không phải là 18+19 bắn lên. Đơn giả là coi 8+9 là vùng "ảnh hưởng" của 10+11 - ngay sát cạnh. Cũng vì thế ta chấp nhận 18+19 bắn xuống 22+23 chứ không phải 10+11 bắn xuống. Nhưng ai sẽ bắn vào 14+15? Vì cả hai, tức 10+11 và 18+19, đều có "quyền" như nhau đối với 14+15. Cả hai đều biết bắn lên bắn xuống.

Tóm lại không biết ai sẽ bắn vào 14+15 vì chủ thớt không nói.

Nếu là tôi thì tôi còn có một loạt câu hỏi nữa. Nhìn dữ liệu thì thấy chủ thới không muốn nhọc công. Nhập 1 chỗ rồi copy/paste vào nhiều nơi - 6 cột y hệt nhau. Trong mỗi cột nếu 2 ô liên tiếp cùng mã thì hoặc là cùng rỗng hoặc cùng khác rỗng. Không biết đó là "tính chất" hay chỉ là sự ngẫu nhiên khi soạn dữ liệu kiểu "càng mất ít thời gian càng tốt". Liệu có thể có trường hợp F6 rỗng và F7 <> rỗng (cùng chung mã a, F6 và F7 "cùng nhà") không? Lúc đó thì bắn thế nào? Bắn từ mã a ở dòng khác (nhà khác) hay bắn F7 vào F6 - "bắn trong cùng nhà"?

Tóm lại với tôi thì còn nhiều cái không rõ ràng :D
 
Upvote 0
Híc con xin lỗi mọi người,
Đêm qua con mải làm báo cáo quá lúc đó các giác quan giường như là đã quá mỏi, thậm trí còn post nhầm chủ đề,đáng lẽ con phải đăng trong chủ đề các câu hỏi về mảng.
Con đã gửi lại câu hỏi ở đây, dữ liệu sẽ lấy ở các mã dưới để điền lên trên ạ. các Bác xem giúp con với ạ.
https://www.giaiphapexcel.com/diend...ảng-trong-vba-array.46834/page-60#post-908461

Các bài viết vừa rồi nhờ BQT xóa giúp (nếu cần thiết ạ).
Xin cảm ơn
 
Upvote 0
em làm file nhập liệu, nhưng viết xong nó hiện chưa như ý, mong các anh chị sửa giúp với ạ.
Ý tưởng là: tìm kiếm dữ liệu đã nhập vào bảng, kết quả được hiện lên listbox sau khi ấn vào nút tìm kiếm. Nếu dòng dữ liệu có sự sai sót thì khi tích vào dòng đó, dữ liệu hiện lại lên phần textbox để cho phép sửa và sửa dữ liệu đó sau khi ấn nút cập nhật.
 

File đính kèm

Upvote 0
Ý tưởng là: (*) tìm kiếm dữ liệu đã nhập vào bảng, kết quả được hiện lên listbox sau khi ấn vào nút tìm kiếm.
Nếu dòng dữ liệu có sự sai sót thì khi tích vào dòng đó, dữ liệu hiện lại lên phần textbox để cho phép sửa và sửa dữ liệu đó sau khi ấn nút cập nhật.
(*) Bạn cần tìm trên cột nào của CSDL; Đừng nói là tìm ở bất kỳ cột nào trong CSDL đó nha.
(**) Tạm thời bạn đến đây tham khảo cách tìm mã NV: https://www.giaiphapexcel.com/diend...erial-trong-sheet-dữ-liệu.141388/#post-910191
 
Upvote 0
(*) Bạn cần tìm trên cột nào của CSDL; Đừng nói là tìm ở bất kỳ cột nào trong CSDL đó nha.
(**) Tạm thời bạn đến đây tham khảo cách tìm mã NV: https://www.giaiphapexcel.com/diendan/threads/giúp-viết-code-tìm-kiếm-vật-tư-dựa-vào-mã-vật-tư-tên-vật-tư-serial-trong-sheet-dữ-liệu.141388/#post-910191
Đúng là e định tìm bất cứ cột nào ấy. Nhưng cũng có thể thu gọn lại với vài cột thôi cũng dc. Hi
 
Upvote 0
em làm file nhập liệu, nhưng viết xong nó hiện chưa như ý, mong các anh chị sửa giúp với ạ.
Ý tưởng là: tìm kiếm dữ liệu đã nhập vào bảng, kết quả được hiện lên listbox sau khi ấn vào nút tìm kiếm. Nếu dòng dữ liệu có sự sai sót thì khi tích vào dòng đó, dữ liệu hiện lại lên phần textbox để cho phép sửa và sửa dữ liệu đó sau khi ấn nút cập nhật.
Form một đằng, tiêu đề 1 nẽo thì bạn sử dụng nó thế nào?
 
Upvote 0
Bạn thử trãi nghiệm với file này
 

File đính kèm

Upvote 0
Form một đằng, tiêu đề 1 nẽo thì bạn sử dụng nó thế nào?
vâng những phần nhập kia e làm cơ bản rồi. chỉ đang mắc ở chỗ tìm kiếm, sửa, cập nhật thôi ạ.
Bài đã được tự động gộp:

Bạn thử trãi nghiệm với file này
cám ơn bác, e sẽ nghiên cứu file gợi ý của bác. có gì nhờ bác giúp đỡ tiếp nhé
 
Upvote 0
Mình làm trong Form theo yêu cầu của bạn thôi; Chứ thực ra CSDL của bạn vậy mình cho sẽ thất bại nay mai 1 cách sớm nhất!
 
Upvote 0
Xin chào các bạn,
Nhờ các bạn giúp đỡ OT trường hợp trong tập tin gửi kèm với ạ.
 

File đính kèm

Upvote 0
Xin chào các bạn,
Nhờ các bạn giúp đỡ OT trường hợp trong tập tin gửi kèm với ạ.
Chỉnh sửa dựa trên code có sẵn.
Thêm 1 code để Enter chọn giá trị tìm thấy đầu tiên, đỡ phải Click chọn:
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Application.ScreenUpdating = False
    If KeyCode = 13 Then
        KeyCode = 0
        If TextBox1.Value > "" Then
            With ActiveCell
                .Value = ActiveSheet.ListBox1.Column(0, 0)
                .Offset(1, 0) = ActiveSheet.ListBox1.Column(1, 0)
                Hide
                .Offset(1).Select
            End With
        End If
    End If
    Application.ScreenUpdating = True
End Sub
Xem file đính kèm nhe.
 

File đính kèm

Upvote 0
Xin chào các bạn,
Nhờ các bạn giúp đỡ OT trường hợp trong tập tin gửi kèm với ạ.
Chỉnh vài sub
Mã:
Private Sub ListBox1_Click()
    Dim i
    i = ListBox1.ListIndex
    Range("E6") = Sheet1.ListBox1.List(i, 0)
    Range("E7") = Sheet1.ListBox1.List(i, 1)
    Range("E7").Activate
    Hide
End Sub

Private Sub thaydoi()
    With Sheet1.TextBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .Height = ActiveCell.Height
        .Value = ""
        .Activate
    End With
    With Sheet1.ListBox1
        .Visible = False
        .Visible = True
        .ColumnCount = 2
        .Left = ActiveCell.Offset(, 1).Left
        .Width = ActiveCell.Width * 1.5
        .Height = 150
        .Top = ActiveCell.Offset(, 1).Top
        .Clear
    End With
End Sub

Private Sub loc()
    Dim sArr(), Arr(), Res(), i As Long, k As Long, tmp As String, maHang As String
    With Sheet2
       sArr = .Range("M6:N74").Value
    End With
    ReDim Arr(0 To UBound(sArr), 1 To 2)
    Sheet1.ListBox1.Clear
    tmp = UCase(TV(Sheet1.TextBox1.Value))
    For i = 1 To UBound(sArr)
       maHang = sArr(i, 1)
       If maHang <> "" Then
          If UCase(TV(maHang)) Like "*" & tmp & "*" Then
             Arr(k, 1) = maHang
             Arr(k, 2) = sArr(i, 2)
             k = k + 1
          End If
       End If
    Next
    ReDim Res(0 To k, 1 To 2)
    For i = 0 To k
      Res(i, 1) = Arr(i, 1): Res(i, 2) = Arr(i, 2)
    Next i
    Sheet1.ListBox1.List = Res
End Sub
 
Upvote 0
Chỉnh sửa dựa trên code có sẵn.
Thêm 1 code để Enter chọn giá trị tìm thấy đầu tiên, đỡ phải Click chọn:
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Application.ScreenUpdating = False
    If KeyCode = 13 Then
        KeyCode = 0
        If TextBox1.Value > "" Then
            With ActiveCell
                .Value = ActiveSheet.ListBox1.Column(0, 0)
                .Offset(1, 0) = ActiveSheet.ListBox1.Column(1, 0)
                Hide
                .Offset(1).Select
            End With
        End If
    End If
    Application.ScreenUpdating = True
End Sub
Xem file đính kèm nhe.
Chưa kiểm tra kỹ, code Enter lấy giá trị trên cùng của Listbox bị lỗi khi Textbox có giá trị không nằm trong dữ liệu.
Lấy lại code sau dùm:
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Application.ScreenUpdating = False
    If KeyCode = 13 Then
        KeyCode = 0
        If TextBox1.Value > "" Then
            If ActiveSheet.ListBox1.ListCount > 0 Then
                With ActiveCell
                    .Value = ActiveSheet.ListBox1.Column(0, 0)
                    .Offset(1, 0) = ActiveSheet.ListBox1.Column(1, 0)
                    Hide
                    .Offset(1).Select
                End With
            End If
        End If
    End If
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Xin chào Bác HieuCD, Anh leonguyenz.
Oanh Thơ đã test thử code của Bác và Anh. Kết quả cả 2 đều đúng với mong muốn của OT rồi ạ.
Cảm ơn Bác & Anh , cảm ơn GPE rất nhiều.
 
Upvote 0
Xin chào Bác HieuCD, Anh leonguyenz.

Oanh Thơ muốn đưa thêm dữ liệu số lượng vào ô "E8" loay hoay một hồi chưa được ạ.
Nhờ Bác & Anh giúp đỡ ạ.

Trân trọng cảm ơn.
 
Upvote 0

File đính kèm

Upvote 0

File đính kèm

Upvote 0

File đính kèm

Upvote 0
Đã sửa cột số lượng, xem trong file đính kèm nhe.

Xin chào Anh leonguyenz ,
Trong "ListBox1" hiện đang có 3 cột dữ liệu . OT muốn set kích thước riêng cho mỗi cột thì code sẽ thêm dòng nào ạ.
Làm sao để tổng kích thước của "ListBox1" vẫn là: .Width = ActiveCell.Width * 1.5
Cảm ơn Anh.
 
Upvote 0
Xin chào Anh leonguyenz ,
Trong "ListBox1" hiện đang có 3 cột dữ liệu . OT muốn set kích thước riêng cho mỗi cột thì code sẽ thêm dòng nào ạ.
Làm sao để tổng kích thước của "ListBox1" vẫn là: .Width = ActiveCell.Width * 1.5
Cảm ơn Anh.
Thêm dòng sau vào nhé:
Mã:
.ColumnWidths = "40;100;50"
Với thông số cột.
 
Upvote 0
Thêm dòng sau vào nhé:
Mã:
.ColumnWidths = "40;100;50"
Với thông số cột.
Cảm ơn Anh leonguyenz, nhiều ạ.
Anh cho OT hỏi thêm trong trường hợp OT muốn hiển thị tiêu đề của "ListBox1" thì sẽ xử lý thế nào ạ.
OT đã thêm:
.ColumnHeads = True
và sửa:
Mã:
With Sheet2
       dl = .[M6:P74].Value
End With
thành:
Mã:
With Sheet2
       dl = .[M5:P74].Value
End With
Mà chưa được ạ, nhờ Anh xem và giúp đỡ.
 
Upvote 0
Cảm ơn Anh leonguyenz, nhiều ạ.
Anh cho OT hỏi thêm trong trường hợp OT muốn hiển thị tiêu đề của "ListBox1" thì sẽ xử lý thế nào ạ.
OT đã thêm:
.ColumnHeads = True
và sửa:
Mã:
With Sheet2
       dl = .[M6:P74].Value
End With
thành:
Mã:
With Sheet2
       dl = .[M5:P74].Value
End With
Mà chưa được ạ, nhờ Anh xem và giúp đỡ.
Cái zu listbox tiêu đề này trong diễn đàn nói nhiều rồi đó bạn kiếm thử xem
 
Upvote 0
Cái zu listbox tiêu đề này trong diễn đàn nói nhiều rồi đó bạn kiếm thử xem
Cảm ơn thuyyeu99 đã quan tâm,
OT cũng đã tìm hiểu trong trường hợp này có thể sẽ không thể xử lý được vì:
ColumnHeads chỉ áp dụng khi dùng chung với RowSource.
Không biết có phải vậy không ạ? , nếu đúng như vậy thì trường hợp muốn sử dụng với RowSource thì code phải ra sao. Híc
 
Upvote 0
Cảm ơn thuyyeu99 đã quan tâm,
OT cũng đã tìm hiểu trong trường hợp này có thể sẽ không thể xử lý được vì:

Không biết có phải vậy không ạ?
Hihi lâu rồi mình không dùng tới mấy cái control trong excel nên mình cũng không nhớ rõ nữa. Mình nhớ mang máng bài viết của anh hoàng trong nghĩa có úp code đo, còn nếu bạn muốn đẹp thì dùng listview de hiển thị (ma nó không hien thi duoc unicode), còn gán dữ liệu thì cứ từ array ma gán xuống sheet
 
Upvote 0
Tiêu đề Listbox lấy trên Range thì được.
Chưa thấy cách lấy trực tiếp từ mảng.
 
Upvote 0
Hihi lâu rồi mình không dùng tới mấy cái control trong excel nên mình cũng không nhớ rõ nữa. Mình nhớ mang máng bài viết của anh hoàng trong nghĩa có úp code đo, còn nếu bạn muốn đẹp thì dùng listview de hiển thị (ma nó không hien thi duoc unicode), còn gán dữ liệu thì cứ từ array ma gán xuống sheet
Dạ vâng, OT cảm ơn leonguyenz đã giúp đỡ.
Dữ liệu đưa ra ngoài sheet (cột MNO, đang để ẩn).
 

File đính kèm

Upvote 0
Dữ liệu đưa ra ngoài sheet (cột MNO, đang để ẩn).
OT Thấy rồi ạ, :D
Một ý tưởng rất hay ạ, code cũng không thấy chậm thêm tý nào :)
Mã:
Tmp = Sheet1.Range("M6").Resize(j, 3).Address(0, 0)
        'ActiveSheet.ListBox1.List = kQ
        ActiveSheet.ListBox1.ListFillRange = Tmp
Cảm ơn Anh leonguyenz rất nhiều.
 
Upvote 0
Em có 1 vấn đề như sau, rất mong mọi người chỉ giúp em:

Em tạo ra 1 form, trên đó có 1 textbox mã khách hàng và 1 nút tạo mã khách hàng. Em muốn khi click vào nút mã khách hàng thì nó sẽ tự động tạo ra 1 mã khách hàng mới và hiển thị lên ô textbox theo quy tắc như sau:
1. Nó sẽ tìm trong: sheet1.Range("B2 : B"& dong_cuoi) để lấy mã khách hàng cuối cùng.
2. Nó sẽ tạo ra mã khách hàng tăng 1 đơn vị, nhưng mã khách hàng được format như sau: "ABC"+2 số cuối của năm hiện tại+000
Ví dụ: các mã KH hiện có: ABC19001, ABC19002 ==> mã mới khi tạo ra sẽ là ABC19003 . Và nếu sang năm 2020 thì mã khách hàng đầu tiên của năm mới đc tạo sẽ phải tự reset 3 số cuối để đc mã ABC20001

Rất mong mọi người bớt chút thời gian giúp đỡ em.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn tham khảo cái này của mình & tùy cơ hiệu chỉnh lại nếu muốn
Mã KH gồm 7 kí tự, trong đó 3 ký tự đầu không đổi;
Kí tự thứ 4 chỉ năm hiện hành; "I" là biểu thị năm 2019; Năm sau sẽ là "J"
Cuối là 3 kí số sẽ tăng dần theo tuần tự.
Chúc bạn tuần làm việc nhiều hiệu quả.
 

File đính kèm

Upvote 0
Rãnh rỗi viết thêm cho bạn phương án tạo mã KH theo ngày liên lạc (NLL) đầu tiên
Mã gồm chỉ 5 ký tự
Kí tự đầu chỉ năm của NLL; Ký ự thứ 2 chỉ tháng của NLL & thứ 3 chỉ ngày
2 ký số cuối để phân biệt sự tăng dần vế NLL trong 1 ngày
Trang tính ban đầu có dạng:
214879
Sau khi chạy macro có nội dung:
PHP:
Const Alf As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Sub ymdID()
 Dim MaKH As String, MaYMD As String, MaTam As String, MyAdd As String
 Dim Cls As Range, Rng As Range, sRng As Range
 Dim Rws As Long, Num As Integer
 On Error Resume Next
 
 With Sheets("YMD")
    Rws = .[d1].CurrentRegion.Rows.Count
    Set Rng = .[B1].Resize(Rws)
    Rng.Offset(, -2).Value = Space(0)
    For Each Cls In .Range(.[d2], .[d2].End(xlDown))
        MaYMD = idYMD(Cls.Value)
        Set sRng = Rng.Find(MaYMD, , xlFormulas, xlPart)
        If sRng Is Nothing Then
            Cls.Offset(, -2).Value = MaYMD & "00"
        Else
            MyAdd = sRng.Address
            Do
                MaTam = sRng.Value
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
            Num = CInt(Right(MaTam, 2)) + 1
            Cls.Offset(, -2).Value = MaYMD & Right("0" & CStr(Num), 2)
            Num = 0
        End If
    Next Cls
 End With
End Sub
Mã:
Function idYMD(Optional Dat As Date)
If Dat = 0 Then Dat = Date
idYMD = Mid(Alf, Year(Dat) - 2000, 1) & Mid(Alf, Month(Dat) + 1, 1)
idYMD = idYMD & Mid(Alf, Day(Dat) + 1, 1)
End Function

Ta thu được kết quả mã KH (ở cột 'B') như hình sau:

214881
 

File đính kèm

  • 1554642582792.png
    1554642582792.png
    54.3 KB · Đọc: 2
Lần chỉnh sửa cuối:
Upvote 0
Anh chị cho em hỏi. Làm thế nào để 02 userform cùng chạy song song, kiểu như 01 userform chính và 01 userform phụ ấy
 
Upvote 0
Mình tham khảo File theo dõi công văn của tác giả be09. Mình thực hiện theo nhưng khi nhập lớp tìm kiếm và lick vào listbox thì bị lỗi. Nhờ các bạn chỉ giúp cách sửa lỗi. Xin cảm ơn.
 

File đính kèm

Upvote 0
Xin mọi người giúp em với:

File của em có 2 sheet như sau:
- Sheet 1 là sheet Đơn hàng: là sheet tổng hợp các đơn hàng trong 1 năm hoặc nhiều năm. Các đơn hàng khác nhau sẽ có mã đơn hàng khác nhau. Nhưng 1 đơn hàng mà có nhiều sản phẩm thì mỗi sản phẩm lại nằm trên 1 dòng khác nhau và có chung nhau mã đơn hàng.
- Sheet 2 là sheet In đơn hàng: ở sheet này em có tạo 1 khung sẵn các dữ liệu cột cần lấy ra từ sheet Đơn Hàng. Em muốn là khi em nhập 1 mã đơn hàng bất kì thì nó sẽ tự động tìm kiếm trong sheet đơn hàng và điền thêm các dòng vào khung có sẵn.
Ví dụ: Đơn hàng mã ABC03 có 3 sản phẩm thì nó sẽ tự động thêm 3 dòng vào khung ở sheet 2, đơn hàng mã ABC01 có 1 sản phẩm thì thêm 1 dòng.

Chốt lại vấn đề là em muốn tạo 1 cái khung để in đơn hàng, nhưng số dòng thể hiện các sản phẩm đc linh hoạt theo thực tế chứ ko phải tạo sẵn để thừa rồi tìm kiếm dữ liệu điền vào sau.
Thật sự là do trình độ kém nên em cũng ko biết phải xử lý cái này kiểu gì luôn. Mong mọi người chỉ bảo giúp em.
 

File đính kèm

Upvote 0
Mình tham khảo File theo dõi công văn của tác giả be09. Mình thực hiện theo nhưng khi nhập lớp tìm kiếm và lick vào listbox thì bị lỗi. Nhờ các bạn chỉ giúp cách sửa lỗi. Xin cảm ơn.
Chổ
Mã:
For ii = 1 To 5
thay bằng
Mã:
For ii = 1 To 9
 
Upvote 0
Xin mọi người giúp em với:

File của em có 2 sheet như sau:
- Sheet 1 là sheet Đơn hàng: là sheet tổng hợp các đơn hàng trong 1 năm hoặc nhiều năm. Các đơn hàng khác nhau sẽ có mã đơn hàng khác nhau. Nhưng 1 đơn hàng mà có nhiều sản phẩm thì mỗi sản phẩm lại nằm trên 1 dòng khác nhau và có chung nhau mã đơn hàng.
- Sheet 2 là sheet In đơn hàng: ở sheet này em có tạo 1 khung sẵn các dữ liệu cột cần lấy ra từ sheet Đơn Hàng. Em muốn là khi em nhập 1 mã đơn hàng bất kì thì nó sẽ tự động tìm kiếm trong sheet đơn hàng và điền thêm các dòng vào khung có sẵn.
Ví dụ: Đơn hàng mã ABC03 có 3 sản phẩm thì nó sẽ tự động thêm 3 dòng vào khung ở sheet 2, đơn hàng mã ABC01 có 1 sản phẩm thì thêm 1 dòng.

Chốt lại vấn đề là em muốn tạo 1 cái khung để in đơn hàng, nhưng số dòng thể hiện các sản phẩm đc linh hoạt theo thực tế chứ ko phải tạo sẵn để thừa rồi tìm kiếm dữ liệu điền vào sau.
Thật sự là do trình độ kém nên em cũng ko biết phải xử lý cái này kiểu gì luôn. Mong mọi người chỉ bảo giúp em.
Mọi người bớt chút thời gian giúp em vấn đề này với. Thanks
 
Upvote 0
Mọi người bớt chút thời gian giúp em vấn đề này với.
Chuyện của bạn không khó; Mà bạn tự làm khó mình bằng cách trộn ô (như [A3]của trang 'In . . "
Tất nhiên để vậy cũng không gây khó lắm, như bạn tự mang ách vào cổ.
Ngoài ra cũng xin góp thêm bạn vài ý, như sau:
a./ Mã đơn hàng của bạn quá dài & không cần thiết dài như vậy
(+) Mã có các ký tự hoàn toàn giống nhau là thừa những kí tự đó; Như vậy nhóm 'DH' & 04 ký tự "-" đang là thừa thải
(+) Nhóm từ 'NAQ' giống hệt nhau biểu thị cái chi? Có nhóm khác như 'NAW' hay 'NHU' không?
b./ Chưa rỏ chổ này: 'T4' có lẽ biểu thị mã ban hàng bỡi tháng 4; vậy tháng 10 bạn sẽ biểu thị làm sao?
Nếu biểu thị 'T10' thì độ dài mã không nhất quán & gây khó khi truy vấn sản lương ngày cụ thể nào đó trong tháng

Nếu là mình thì
1./ (Đương nhiên) bò hết các kí tự trùng nhau, như 'DH" & 4 ký tự ngăn cách
2./ Đơn hàng trong năm 2019 mình sẽ kí hiệu mỗi là kí tự 'H', năm sau sẽ là 'I'
Tháng 1 đến 9 sẽ là kí số tương ứng; tháng 10 sẽ là 'A', tháng 12 sẽ là 'C'
Ngày cũng vậy: ngày 12 sẽ là C, ngày 13 sẽ là 'D', & tiếp tục, . . . .
Tóm lại, mã ĐH của mình sẽ là 'NAQH5E00 cho mã ĐH đầu tiên trong ngày 14 thàng 5 năm nay
Cho dù 1 ngày gần 36*36 đơn hàng cũng vẫn không hề hấn gì đến rối loạn mã.
Nếu 1 ngày chỉ dưới 35 đơn hàng thì ta giảm được thêm 1 kí tự
Nếu trong tháng chỉ ngần ý ĐH thì giam thêm độ dài mã đơn hàng thêm nữa, . . .

Ta quay lại đề bài của bạn: Có thể có nhiều cách giải bằng VBA, như macro hay UDF
Bạn tiêu hóa hết ý tưởng của mình & có phản hồi thì mình sẽ giúp tiếp!
 
Lần chỉnh sửa cuối:
Upvote 0
Chuyện của bạn không khó; Mà bạn tự làm khó mình bằng cách trộn ô (như [A3]của trang 'In . . "
Tất nhiên để vậy cũng không gây khó lắm, như bạn tự mang ách vào cổ.
Ngoài ra cũng xin góp thêm bạn vài ý, như sau:
a./ Mã đơn hàng của bạn quá dài & không cần thiết dài như vậy
(+) Mã có các ký tự hoàn toàn giống nhau là thừa những kí tự đó; Như vậy nhóm 'DH' & 04 ký tự "-" đang là thừa thải
(+) Nhóm từ 'NAQ' giống hệt nhau biểu thị cái chi? Có nhóm khác như 'NAW' hay 'NHU' không?
b./ Chưa rỏ chổ này: 'T4' có lẽ biểu thị mã ban hàng bỡi tháng 4; vậy tháng 10 bạn sẽ biểu thị làm sao?
Nếu biểu thị 'T10' thì độ dài mã không nhất quán & gây khó khi truy vấn sản lương ngày cụ thể nào đó trong tháng

Nếu là mình thì
1./ (Đương nhiên) bò hết các kí tự trùng nhau, như 'DH" & 4 ký tự ngăn cách
2./ Đơn hàng trong năm 2019 mình sẽ kí hiệu mỗi là kí tự 'H', năm sau sẽ là 'I'
Tháng 1 đến 9 sẽ là kí số tương ứng; tháng 10 sẽ là 'A', tháng 12 sẽ là 'C'
Ngày cũng vậy: ngày 12 sẽ là C, ngày 13 sẽ là 'D', & tiếp tục, . . . .
Tóm lại, mã ĐH của mình sẽ là 'NAQH5E00 cho mã ĐH đầu tiên trong ngày 14 thàng 5 năm nay
Cho dù 1 ngày gần 36*36 đơn hàng cũng vẫn không hề hấn gì đến rối loạn mã.
Nếu 1 ngày chỉ dưới 35 đơn hàng thì ta giảm được thêm 1 kí tự
Nếu trong tháng chỉ ngần ý ĐH thì giam thêm độ dài mã đơn hàng thêm nữa, . . .

Ta quay lại đề bài của bạn: Có thể có nhiều cách giải bằng VBA, như macro hay UDF
Bạn tiêu hóa hết ý tưởng của mình & có phản hồi thì mình sẽ giúp tiếp!
Em rất cám ơn anh đã dành thời gian giúp đỡ em xin trả lời các vấn đề như sau:
1> Ở sheet In đơn hàng em phải chia nhỏ các ô rồi merge vào nhau như vậy không có mục đích gì khác ngoài vấn đề trình bày form sao cho đẹp và đúng mẫu của công ty, vì sau khi nhập đơn hàng vào Sheet Đơn Hàng để quản lý thì chuyển sang Sheet in Đơn hàng để in thành phiếu giấy để chuyển đi các phòng ban. Nếu không nhập các ô vào nhau thì thật sự em cũng ko biết làm cách nào để in ra đc 1 cái form giống như em đang làm hiện nay.

2> Mã đơn hàng đang sử dụng hiện nay là quy định của công ty nên thật sự cũng rất khó để thay đổi, thêm nữa nếu đổi thành các kí tự như anh tư vấn thì sẽ lại phải nhớ 1 bảng quy ước xem tháng 4 là chữ gì, 2019 là chữ gì, 2020 là chữ gì. Như vậy sẽ khó cho những người khác nhìn vào, và bắt cả công ty phải học bảng quy ước đó, như vậy hơi khó.
Mã đơn hàng hiện tại của em đang được quy ước gồm những phần sau:
- DH: viết tắt của từ đơn hàng
- NAQ: viết tắt tên của nhân viên, với nhân viên phụ trách đơn hàng khác nhau thì tên viết tắt này sẽ thay đổi
- T4: là tháng tạo đơn hàng, để cho đồng nhất độ dài ký tự thì có thể đổi thành: T04
- 2019: năm tạo đơn hàng
- "-01": là đơn hàng thứ 1 trong tháng, các đơn hàng tiếp theo sẽ là "-02", "-03" ... Do 1 nhân viên 1 tháng hầu như ko có trường hợp phát sinh từ 100 đơn hàng trở lên nên em chỉ định dạng có 2 chữ số thôi.

Mong anh nghĩ cách giúp em.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin mọi người giúp em với:

File của em có 2 sheet như sau:
- Sheet 1 là sheet Đơn hàng: là sheet tổng hợp các đơn hàng trong 1 năm hoặc nhiều năm. Các đơn hàng khác nhau sẽ có mã đơn hàng khác nhau. Nhưng 1 đơn hàng mà có nhiều sản phẩm thì mỗi sản phẩm lại nằm trên 1 dòng khác nhau và có chung nhau mã đơn hàng.
- Sheet 2 là sheet In đơn hàng: ở sheet này em có tạo 1 khung sẵn các dữ liệu cột cần lấy ra từ sheet Đơn Hàng. Em muốn là khi em nhập 1 mã đơn hàng bất kì thì nó sẽ tự động tìm kiếm trong sheet đơn hàng và điền thêm các dòng vào khung có sẵn.
Ví dụ: Đơn hàng mã ABC03 có 3 sản phẩm thì nó sẽ tự động thêm 3 dòng vào khung ở sheet 2, đơn hàng mã ABC01 có 1 sản phẩm thì thêm 1 dòng.

Chốt lại vấn đề là em muốn tạo 1 cái khung để in đơn hàng, nhưng số dòng thể hiện các sản phẩm đc linh hoạt theo thực tế chứ ko phải tạo sẵn để thừa rồi tìm kiếm dữ liệu điền vào sau.
Thật sự là do trình độ kém nên em cũng ko biết phải xử lý cái này kiểu gì luôn. Mong mọi người chỉ bảo giúp em.
Tôi thiết kế lại cho gọn và đồng bộ, bạn xem thử, nếu thống nhất nội dung thì tôi gán code vào sau.
 

File đính kèm

Upvote 0
Tôi thiết kế lại cho gọn và đồng bộ, bạn xem thử, nếu thống nhất nội dung thì tôi gán code vào sau.
- Em rất cảm ơn anh đã thiết kế lại giúp em. Đây là sai sót của em khi tạo file dữ liệu để nhờ mọi người giúp. Trong thực tế file của em sẽ có thêm 1 sheet Thông tin khách hàng, và các dữ liệu như Tên, số đt, địa chỉ giao hàng sẽ được lấy ở đấy để cho vào sheet In Đơn Hàng.
- Ở Sheet Đơn Hàng cũng vậy khi tạo sẽ nhập mã khách hàng vào và Tên khách hàng có thể tự động lấy bằng hàm Vlookup ( Đây là cách thô sơ mà em vẫn đang dùng :D)
- Về mã KH thì đây cũng là quy định của công ty nên mọi người sẽ thấy nói hơi dài. Mã này gồm các phần:
+ LUHA: tên công ty
+ NAQ: tên nhân viên phụ trách khách hàng đó, cái này sẽ thay đổi với từng nhân viên khác nhau
+ 19: Năm hiện tại
+ 001: số thứ tự khách phát sinh trong năm.

Em xin up lại file để mọi người xem lại và giúp em.
 

File đính kèm

Upvote 0
Anh ơi, code của anh thật tuyệt, nhưng trình của em kém nên chỉ hiểu đc 1 ít không thể sửa để nó chạy theo ý mình được. Nhưng em thấy file của anh hiện có mấy vấn đề không hợp lắm:
1> Anh đang sử dụng 1 sheet tên GPE để lấy Mã đơn hàng vào combo box, nhưng mã khách hàng lại không chính xác theo đơn hàng đc tạo trong sheet Đơn Hàng.
2> Danh sách mã đơn hàng của anh sẽ ko đc tự động update khi thêm đơn hàng mới và có mã đơn hàng mới
3> Nếu được thì em chỉ cần có 1 ô ở bên ngoài cái khung in giống như em đã làm sẵn để nhập mã đơn hàng vào để tìm kiếm thôi, như vậy em nghĩ sẽ đơn giản hơn là dùng combo box
4> Cái này là quan trọng nhất:
1 đơn hàng có thể có 1 - 2 hoặc nhiều sản phẩm, và mỗi sản phẩm đc trình bày trên 1 dòng. Em muốn số dòng sản phẩm đó ở sheet In Đơn Hàng được thể hiện chính xác là 1 - 2 hoặc 3 dòng đó ... KHÔNG CÓ DÒNG TRẮNG THỪA BÊN DƯỚI. Và tiếp nối bên dưới các dòng sản phẩm là dòng Tổng cộng và VAT luôn.

Mong anh giúp em nhé.
 
Upvote 0
. . . . trình của em kém nên chỉ hiểu đc 1 ít không thể sửa để nó chạy theo ý mình được. Nhưng em thấy (0) file của anh hiện có mấy vấn đề không hợp lắm:
1> Anh đang sử dụng 1 sheet tên GPE để lấy Mã đơn hàng vào combo box, nhưng mã khách hàng lại không chính xác theo đơn hàng đc tạo trong sheet Đơn Hàng.
2> Danh sách mã đơn hàng của anh sẽ ko đc tự động update khi thêm đơn hàng mới và có mã đơn hàng mới
3> Nếu được thì em chỉ cần có 1 ô ở bên ngoài cái khung in giống như em đã làm sẵn để nhập mã đơn hàng vào để tìm kiếm thôi, như vậy em nghĩ sẽ đơn giản hơn là dùng combo box
4> Cái này là quan trọng nhất:
1 đơn hàng có thể có 1 - 2 hoặc nhiều sản phẩm, và mỗi sản phẩm đc trình bày trên 1 dòng. Em muốn số dòng sản phẩm đó ở sheet In Đơn Hàng được thể hiện chính xác là 1 - 2 hoặc 3 dòng đó ... KHÔNG CÓ DÒNG TRẮNG THỪA BÊN DƯỚI. Và tiếp nối bên dưới các dòng sản phẩm là dòng Tổng cộng và VAT luôn.
(0) Có` thể chưa hợp với bạn lúc này; Nhưng nếu thêm 1 công đoạn nữa, như lập danh sách duy nhất từ cột mả ĐH & đem qua cập nhật bên trang 'GPE' thì sao? Chuyện cập nhật này luôn sẩy ra khi ta dóng trang CSDL lại.
(1) Chuyện mã KH chưa chính xác vì mình chỉ hiểu mối liên quan với mã ĐH đến vậy; Nhưng theo mình 2 mã này phải liên hệ hữu cơ với nhau.
Bạn cần cho biết chưa chính xác trong mối quan hệ này chỗ nào để khác phục. Ta phải khắc phục chuyện này, không thể né tránh được.
(2) Xem lại đã viết ở mục (0)
(3) Cái ô bạn muốn sẽ tìm ra mã ĐH, còn mã khách hàng sẽ lấy nơi mô? Lấy bằng cách nào?
(4) Chuyện này đơn giản như đang dõn thôi; bạn khỏi lo: Ẩn các dòng trống giữa các dòng ghi mã hàng & dòng tính tổng là xong. Nhưng để sau đi
Chuyện quan trong theo mình là mối quan hệ giữa mã ĐH & mã KH kia. (4) sẽ giải quyết 1 khi (1) được giải quyết, mình hứa đấy!
 
Lần chỉnh sửa cuối:
Upvote 0
(0) Có` thể chưa hợp với bạn lúc này; Nhưng nếu thêm 1 công đoạn nữa, như lập danh sách duy nhất từ cột mả ĐH & đem qua cập nhật bên trang 'GPE' thì sao? Chuyện cập nhật này luôn sẩy ra khi ta dóng trang CSDL lại.
(1) Chuyện mã KH chưa chính xác vì mình chỉ hiểu mối liên quan với mã ĐH đến vậy; Nhưng theo mình 2 mã này phải liên hệ hữu cơ với nhau.
Bạn cần cho biết chưa chính xác trong mối quan hệ này chỗ nào để khác phục. Ta phải khắc phục chuyện này, không thể né tránh được.
(2) Xem lại đã viết ở mục (0)
(3) Cái ô bạn muốn sẽ tìm ra mã ĐH, còn mã khách hàng sẽ lấy nơi mô? Lấy bằng cách nào?
(4) Chuyện này đơn giản như đang dõn thôi; bạn khỏi lo: Ẩn các dòng trống giữa các dòng ghi mã hàng & dòng tính tổng là xong. Nhưng để sau đi
Chuyện quan trong theo mình là mối quan hệ giữa mã ĐH & mã KH kia. (4) sẽ giải quyết 1 khi (1) được giải quyết, mình hứa đấy!

Em xin mô tả lại quy trình làm việc như sau để anh hiểu rõ hơn về mối liên kết này nhé:
- Khi nhân viên kinh doanh chốt được đơn hàng với khách và khách đặt hàng thì sẽ bắt đầu làm các thao tác sau:

1> Kiểm tra ở sheet Thông Tin KH xem đã có khách hàng này chưa, nếu chưa có thì tạo Mã KH mới và nhập các thông tin liên quan như: SĐT, địa chỉ ... vào các trường có sẵn. Toàn bộ thao tác này sẽ tạm thời thực hiện hoàn toàn bằng tay. ( có thể sử dụng form nhập liệu và nút tạo mới mã KH bằng VBA, cái này thì nhờ anh hướng dẫn em đã làm đc rồi)

2> Thao tác trên sheet ĐƠN HÀNG sẽ lần lượt như sau:
- Copy mã KH về sheet Đơn Hàng và paste vào ô Mã KH. Sau khi paste Mã KH vào thì có thể sử dụng hàm Vlookup để tự động điền tên KH ở ô bên cạnh
- Tạo Mã Đơn Hàng mới bằng tay hoặc dùng 1 nút để tự tạo mới Mã Đơn Hàng. Em muốn các đơn hàng mới sẽ luôn nằm trên cùng danh sách vì vậy nếu sử dụng nút để tạo Mã Đơn Hàng thì sẽ chỉ phải kiểm tra Mã Đơn Hàng đã tồn tại ở ô A3 - là mã cuối cùng và mới nhất rồi tăng lên 1 đơn vị, đồng thời insert 1 dòng mới lên phía trên.
- Nhập dữ liệu vào các ô liên quan để đầy đủ thông tin đơn hàng

3> Thao tác tên sheet IN ĐƠN HÀNG:
- Sau khi tạo xong đơn hàng thì sẽ copy Mã Đơn Hàng và paste vào 1 vị trí chỉ định ở Sheet In đơn hàng như vậy các thông tin sẽ được tìm kiếm ở 2 Sheet Đơn Hàng và Khách Hàng sẽ tự động điền đầy đủ như sau:
+ Mã Đơn hàng, Mã khách hàng, Tên khách hàng, Ngày đặt hàng, Ngày hẹn giao hàng, Tên sản phẩm, thông tin sản phẩm, ĐVT, Số lượng, Đơn giá, Thành tiền sẽ được lấy dữ liệu từ sheet Đơn Hàng
+ SĐT, Địa chỉ: sẽ được lấy từ sheet Thông tin khách hàng
+ NVKD - tên nhân viên kinh doanh thì nhập tay

- Các ô Tổng, VAT, và Tổng thanh toán sẽ được tự động tính toán khi các thông tin bên trên được điền đầy đủ.

Do lỗi của em không trình bày cụ thể cách hoạt động của file ngay từ đầu dẫn đến nhiều sự lòng vòng không rõ ràng, mong anh thông cảm. Nếu có gì chưa rõ anh post lại để em trả lời nhé.
Trân trọng!
 
Upvote 0
Như vậy mã KH không ăn nhập gì với mã ĐH hết; Nhưng như trong file của bạn thì mình mường tượng chúng quan hệ khăn khít với nhau mới nên nổi.
& như vậy mình thấy mã KH thiệt là rối rắm
Nếu là mình thì đơn giản mã KH chì luôn có độ dài là 5, như:
PHP:
Mã KH     Tên KH
NVH00  Nguyễn Việt Hồng
NVH01  Ngô Thị Việt Hà
FFDOO  Đỗ Đình Dương
FJT00  Đinh Trọng
. . .     . . .
Mã như vậy có tính tương tác cao giữa người có mã & người sử dụng mã.
Tìm kiếm cũng tiện', muốn tự động hóa cũng được
. . .
 
Upvote 0
Như vậy mã KH không ăn nhập gì với mã ĐH hết; Nhưng như trong file của bạn thì mình mường tượng chúng quan hệ khăn khít với nhau mới nên nổi.
& như vậy mình thấy mã KH thiệt là rối rắm
Nếu là mình thì đơn giản mã KH chì luôn có độ dài là 5, như:
PHP:
Mã KH     Tên KH
NVH00  Nguyễn Việt Hồng
NVH01  Ngô Thị Việt Hà
FFDOO  Đỗ Đình Dương
FJT00  Đinh Trọng
. . .     . . .
Mã như vậy có tính tương tác cao giữa người có mã & người sử dụng mã.
Tìm kiếm cũng tiện', muốn tự động hóa cũng được
. . .

1> Mã khách hàng được công ty em quy đinh và định dạng theo quy tắc:
- LUHA: đây là tên công ty em, cái này vốn dĩ từ đầu lúc tạo mã em đã góp ý sếp bỏ đi để cho mã KH đỡ dài nhưng sếp ko nhất quyết ko đồng ý.
- NAQ: Tên viết tắt của nhân viên phụ trách khách hàng đó
- 19: là năm khách hàng đó bắt đầu làm việc có phát sinh đơn hàng với công ty
- 001: thứ tự khách hàng đó trong năm.

Với định dạng mã khách hàng như trên, công ty mong muốn khi người quản lý nhìn vào mã khách hàng có thể biết được đó là khách hàng mới hay cũ thông qua số năm, biết được ai đang quản lý khách hàng đó, và biết được trong năm nay nhân viên đó tìm được bao nhiêu khách hàng mới. Cái này là do quy định nên em ko có quyền thay đổi, chỉ góp ý nhưng sếp ko chịu nên cũng đành thôi

2> Trong CSDL thì mã KH sẽ key của bảng khách hàng, vì mã khách hàng sẽ luôn là duy nhất với 1 khách hàng, và ko bị trùng lặp, và từ nó ta có thể truy vấn được các thông tin khác của khách hàng đó để thêm vào các ô liên quan

3> Mã đơn hàng được sử dụng để quản lý đơn hàng, nên đúng như anh nói nó sẽ ko liên quan gì đến mã khách hàng, nhưng trong thực tế thì nó sẽ có sự liên kết với nhau. Vì 1 đơn hàng khi được tạo bắt buộc phải có 1 mã khách hàng trong đó để từ đó ta tìm đc tên KH điền vào sheet Đơn Hàng, và cũng từ mã KH ta sẽ tìm được SĐT, địa chỉ giao hàng để điền vào sheet In Đơn Hàng.
 
Upvote 0
Vậy bạn lấy macro này chép đè hết lên cái đã có là ẩn được những dòng trống:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
1 If Not Intersect(Target, [J3]) Is Nothing Then
    Dim WF As Object, Rng As Range, sRng As Range
3    ReDim Arr(1 To 9, 1 To 22)
    Dim Rws As Long, W As Integer
5   Dim MyAdd As String
   
    Set WF = Application.WorksheetFunction
7    [B12:w20].Value = Arr()
    Rows("11:20").Hidden = False                '** '
9    With Sheets("DHang")
        Rws = .[A2].CurrentRegion.Rows.Count
11        Set Rng = .[A2].Resize(Rws)
        Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
 13       If sRng Is Nothing Then
            MsgBox "Nothing"
 15       Else
            MyAdd = sRng.Address
  17          Do
                W = W + 1:                                          Arr(W, 1) = W
19                Arr(W, 2) = .Cells(sRng.Row, "F").Value
                Arr(W, 7) = .Cells(sRng.Row, "G").Value
 21               Arr(W, 14) = .Cells(sRng.Row, "H").Value
                Arr(W, 16) = .Cells(sRng.Row, "I").Value
 23               Arr(W, 19) = .Cells(sRng.Row, "J").Value
                Arr(W, 22) = .Cells(sRng.Row, "K").Value
 25               If W = 1 Then
                    [U6].Value = sRng.Offset(, 1).Value:        [U7].Value = sRng.Offset(, 2).Value
27                End If
                Set sRng = Rng.FindNext(sRng)
29            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
            If W Then
31                [B12].Resize(W, 22).Value = Arr()
                Rows(W + 12 & ":20").Hidden = True              '** '
33            End If
        End If
35    End With
End If
End Sub
Thêm nữa: Lúc đó mã KH bạn phải nhập trực tiếp vô [F5]
Còn 2 ô dưới liền kế bạn cần gắn trước hàm VLOOKUP() có bẩy lỗi
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người, em là mem mới học vba, cho e hỏi một câu ạ. Form với dialog sheet khác nhau ntn v ạ, ứng dụng từng loại như sao ạ, e đọc sách r mà chưa hiểu phần này lắm. Cơn mọi người đã quan tâm.
 
Upvote 0
Excel dialog sheets

Last Updated on Thu, 10 Mar 2016 | Excel 2003 VBA

In Excel 5 and Excel 95, you created a custom dialog box by inserting a special dialog sheet. Excel 97 and later versions still support these dialog sheets, but a much better alternative is available: UserForms. You work with UserForms in the VBE.
When you open a workbook that contains an Excel 5/95 dialog sheet, the dialog sheet appears as a sheet in the workbook.
If, for compatibility purposes, you need to insert an Excel 5/95 dialog sheet, you won't find the command to do so on the Insert menu.The only way to add an Excel 5/95 dialog sheet is to right-click any sheet tab and select Insert from the shortcut menu.Then,in the Insert dialog box, click the MS Excel 5.0 Dialog icon.

[Tìm thấy trên mạng]
 
Upvote 0
Excel dialog sheets

Last Updated on Thu, 10 Mar 2016 | Excel 2003 VBA

In Excel 5 and Excel 95, you created a custom dialog box by inserting a special dialog sheet. Excel 97 and later versions still support these dialog sheets, but a much better alternative is available: UserForms. You work with UserForms in the VBE.
When you open a workbook that contains an Excel 5/95 dialog sheet, the dialog sheet appears as a sheet in the workbook.
If, for compatibility purposes, you need to insert an Excel 5/95 dialog sheet, you won't find the command to do so on the Insert menu.The only way to add an Excel 5/95 dialog sheet is to right-click any sheet tab and select Insert from the shortcut menu.Then,in the Insert dialog box, click the MS Excel 5.0 Dialog icon.

[Tìm thấy trên mạng]
Cám ơn a đã giúp e ạ, e đã hiểu về vấn đề này, nhưng cho e hỏi thêm là dialogsheet có sử dụng nhiều k ạ, e thấy e dùng userform ổn hơn :D :D
 
Upvote 0
Vậy bạn lấy macro này chép đè hết lên cái đã có là ẩn được những dòng trống:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [J3]) Is Nothing Then
    Dim WF As Object, Rng As Range, sRng As Range
    ReDim Arr(1 To 9, 1 To 22)
    Dim Rws As Long, W As Integer
    Dim MyAdd As String
  
    Set WF = Application.WorksheetFunction
    [B12:w20].Value = Arr()
    Rows("11:20").Hidden = False                '** '
    With Sheets("DHang")
        Rws = .[A2].CurrentRegion.Rows.Count
        Set Rng = .[A2].Resize(Rws)
        Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            MsgBox "Nothing"
        Else
            MyAdd = sRng.Address
            Do
                W = W + 1:                                          Arr(W, 1) = W
                Arr(W, 2) = .Cells(sRng.Row, "F").Value
                Arr(W, 7) = .Cells(sRng.Row, "G").Value
                Arr(W, 14) = .Cells(sRng.Row, "H").Value
                Arr(W, 16) = .Cells(sRng.Row, "I").Value
                Arr(W, 19) = .Cells(sRng.Row, "J").Value
                Arr(W, 22) = .Cells(sRng.Row, "K").Value
                If W = 1 Then
                    [U6].Value = sRng.Offset(, 1).Value:        [U7].Value = sRng.Offset(, 2).Value
                End If
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
            If W Then
                [B12].Resize(W, 22).Value = Arr()
                Rows(W + 12 & ":20").Hidden = True              '** '
            End If
        End If
    End With
End If
End Sub
Thêm nữa: Lúc đó mã KH bạn phải nhập trực tiếp vô [F5]
Còn 2 ô dưới liền kế bạn cần gắn trước hàm VLOOKUP() có bẩy lỗi

- Anh ơi, nhờ code của anh em đã chỉnh sửa được để nó chạy phù hợp với yêu cầu của em rồi. Em cám ơn anh nhiều
- Nhưng có 1 vấn đề là em đọc code vẫn cứ thấy lơ mơ không hiểu được. Lúc nào rảnh anh giải thích code giúp em với đc ko. Để có gì em còn áp dụng đc với cái khác nữa. Mà anh giải thích luôn giúp em mấy cái tên biến viết tắt của cái gì với ( WF, Rng, sRng,Rws ...) mấy cái đó viết tắt nên em đọc ko hiểu nó là gì cứ tẩu hỏa nhập ma hết :D
 
Upvote 0
[#253]
D1: Điều kiện nếu bạn mó tới ô [J3] thì thực hiện các lệnh tiếp theo cho đến D36

D2: Khai báo 3 tham biến đối tượng
D3: Khai bào 1 biến mảng gồm 9 dòng & 22 cột.
D4: Khai báo 2 tham biến kiểu số Long & Integer
D5: Khai báo 1 tham biến chứa chuỗi kí tự

D6: Gán đối tượng hàm Excel vô tham biến
D7: Vùng ô [B12:W20] được gán tử mảng (chưa có dữ liệu; Thực chất là xóa trắng vùng dữ liệu)
D8: Cho hiện các dòng từ 11 – 20
D9: Tuyên cáo làm việc với trang tính có tên ‘DHang’
D10 Lấy số dòng của vùng dữ liệu xung quanh [B2] gán vô tham biến
D11: Lấy vùng từ [A2] mở rọng xuống dưới với số dòng vừa xác định gán vô biến đối tương (Range)
D12: Áp dụng phương thức tìm kiếm trị ta vừa nhập (vô ô [J3]), khu vực tìm là vùng dòng 11 vừa xác định
D13: Nếu tìm không thấy thì báo cho biết ở D14
D15 Bằng ngược lại thì thực hiện các lệnh dưới liền kề cho tới D34
D16: Lấy địa chỉ ô vừa tìm thấy gán vô tham biến (kiểu chuỗi)
D17: Tạo vòng lập thực hiện việc tìm kiếm; Vòng lặp kết thúc tại D29
D18: (mệnh đề đầu)Thêm 1 đơn vị cho biến đếm
(mệnh đề sau) Lấy chỉ số này gán ngay vô phần từ đầu tiên bên trái nhất của mảng
D19: Lấy trị trong ô có số dòng trùng với dòng tìm thấy & cột ‘F’ đem gán cho phần tử thuộc dòng W & cột là 2 của mảng
D20:D24: Tương tự D19 tương ứng

D25: Điều kiện khi biến đếm =1 thì thực hiện 2 câu lệnh của dòng tiếp sau
D26 M1: Ô [U6] được gán trị của ô liền kề bên phải ô tìm thấy
M2: Ô U7 thì lại gán tiếp ô bên phải kế tiếp
D27: Kết thúc Đ/K (dòng 25)
D28 Thực hiện phương thức tìm tiếp
D29 Điều kiện kết thúc vòng lặp (là địa chỉ tìm thấy đầu tiên đã được ghi vô biến chuỗi)
D30 Điều kiện là tìm thấy dữ liệu thì thực hiện 2 dòng lệnh tiếp sau ; Kết thúc ĐK ở D33
D31: Gán vùng dữ liệu đang có trên mảng lên trang tính
D32” Ẩn những dòng trống/rỗng dữ liệu trên dòng 21 của trang
 
Lần chỉnh sửa cuối:
Upvote 0
[#253]
D1: Điều kiện nếu bạn mó tới ô [J3] thì thực hiện các lệnh tiếp theo cho đến D36

D2: Khai báo 3 tham biến đối tượng
D3: Khai bào 1 biến mảng gồm 9 dòng & 22 cột.
D4: Khai báo 2 tham biến kiểu số Long & Integer
D5: Khai báo 1 tham biến chứa chuỗi kí tự

D6: Gán đối tượng hàm Excel vô tham biến
D7: Vùng ô [B12:W20] được gán tử mảng (chưa có dữ liệu; Thực chất là xóa trắng vùng dữ liệu)
D8: Cho hiện các dòng từ 11 – 20
D9: Tuyên cáo làm việc với trang tính có tên ‘DHang’
D10 Lấy số dòng của vùng dữ liệu xung quanh [B2] gán vô tham biến
D11: Lấy vùng từ [A2] mở rọng xuống dưới với số dòng vừa xác định gán vô biến đối tương (Range)
D12: Áp dụng phương thức tìm kiếm trị ta vừa nhập (vô ô [J3]), khu vực tìm là vùng dòng 11 vừa xác định
D13: Nếu tìm không thấy thì báo cho biết ở D14
D15 Bằng ngược lại thì thực hiện các lệnh dưới liền kề cho tới D34
D16: Lấy địa chỉ ô vừa tìm thấy gán vô tham biến (kiểu chuỗi)
D17: Tạo vòng lập thực hiện việc tìm kiếm; Vòng lặp kết thúc tại D29
D18: (mệnh đề đầu)Thêm 1 đơn vị cho biến đếm
(mệnh đề sau) Lấy chỉ số này gán ngay vô phần từ đầu tiên bên trái nhất của mảng
D19: Lấy trị trong ô có số dòng trùng với dòng tìm thấy & cột ‘F’ đem gán cho phần tử thuộc dòng W & cột là 2 của mảng
D20:D24: Tương tự D19 tương ứng

D25: Điều kiện khi biến đếm =1 thì thực hiện 2 câu lệnh của dòng tiếp sau
D26 M1: Ô [U6] được gán trị của ô liền kề bên phải ô tìm thấy
M2: Ô U7 thì lại gán tiếp ô bên phải kế tiếp
D27: Kết thúc Đ/K (dòng 25)
D28 Thực hiện phương thức tìm tiếp
D29 Điều kiện kết thúc vòng lặp (là địa chỉ tìm thấy đầu tiên đã được ghi vô biến chuỗi)
D30 Điều kiện là tìm thấy dữ liệu thì thực hiện 2 dòng lệnh tiếp sau ; Kết thúc ĐK ở D33
D31: Gán vùng dữ liệu đang có trên mảng lên trang tính
D32” Ẩn những dòng trống/rỗng dữ liệu trên dòng 21 của trang
Anh ơi, cái lệnh này có tác dụng gì thế anh
[B12].Resize(W, 22).Value = Arr()
 
Upvote 0
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

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

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

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
Cám ơn các góp ý của bác @SA_DQ , e sẽ rút kinh nghiệm chuyện này.

Và cũng rất mong bác giúp em thêm về code để nó có thể hoàn thiện hơn. Em xin cám ơn.
 
Upvote 0
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.
Theo gợi ý của bạn mình đã code cho nó điền luôn khi ấn insert tuy nhiên nó hiện lỗi N/A mà chưa hiểu vì sao. minh kiểm tra thấy giá trị tìm kiếm và giá trị ở bảng tra cứu là cùng kiểu số rồi. hic. Bạn giúp mình xem lại code với

Mã:
With Sheet1

        .Range("K" & dong_cuoi) = txtQHNS.text

        .Range("C" & dong_cuoi) = txtQD.text

        .Range("D" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 2, 0)

        .Range("E" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 3, 0)

        .Range("F" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 4, 0)

        .Range("G" & dong_cuoi) = Replace(txtSotien.text, Mid(Format(1234, "#,##0"), 2, 1), "")

        .Range("H" & dong_cuoi) = txtKy.text

        .Range("I" & dong_cuoi) = txtLoai.text

        .Range("J" & dong_cuoi) = Application.VLookup(txtNguon.text, Sheet7.Range("H3:I400"), 2, 0)

        .Range("L" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 6, 0)

        .Range("P" & dong_cuoi) = txtNguon.text

        .Range("M" & dong_cuoi) = txtKhoan.text

        .Range("N" & dong_cuoi) = txtCTMT.text

        .Range("O" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 5, 0)

        .Range("Q" & dong_cuoi) = txtDuphong.text

        .Range("R" & dong_cuoi) = txtMaGD.text

    End With
P/S:Mình đã làm được rồi nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào mọi người !
tôi có câu hỏi cần được mọi người giúp đỡ
Khi tôi thực hiện lệnh gọi form từ macro

sub Goi_form()
userform1.show
end sub

form đã hiện lên để tôi nhập thông tin vào form nhưng không cho thực hiện thao tác khác với bảng tính như nhập liệu vào Cell như bình thường.

nhưng câu hỏi đặt ra là, làm thế nào để tôi vẫn có thể sử dụng bảng tính Excel (như nhập liệu, chỉnh sửa v..vv.) trong khi Userform đang được Show trên màn hình?
 
Upvote 0
Xin chào mọi người !
tôi có câu hỏi cần được mọi người giúp đỡ
Khi tôi thực hiện lệnh gọi form từ macro

sub Goi_form()
userform1.show
end sub

form đã hiện lên để tôi nhập thông tin vào form nhưng không cho thực hiện thao tác khác với bảng tính như nhập liệu vào Cell như bình thường.

nhưng câu hỏi đặt ra là, làm thế nào để tôi vẫn có thể sử dụng bảng tính Excel (như nhập liệu, chỉnh sửa v..vv.) trong khi Userform đang được Show trên màn hình?
Thử thế này xem sao.
Mã:
UserForm1.Show False
 
Upvote 0
thử thì Excel bị đơ luôn, Alt + F4 thì out ra vào báo lỗi VBA Can't quit at this time rồi tắt hẳn excel
Xin chào mọi người !
tôi có câu hỏi cần được mọi người giúp đỡ
Khi tôi thực hiện lệnh gọi form từ macro

sub Goi_form()
userform1.show
end sub

form đã hiện lên để tôi nhập thông tin vào form nhưng không cho thực hiện thao tác khác với bảng tính như nhập liệu vào Cell như bình thường.

nhưng câu hỏi đặt ra là, làm thế nào để tôi vẫn có thể sử dụng bảng tính Excel (như nhập liệu, chỉnh sửa v..vv.) trong khi Userform đang được Show trên màn hình?
Tìm thuộc tính (Properties) của UserForm là ShowModal, chọn False.
 
Upvote 0
Tìm thuộc tính (Properties) của UserForm là ShowModal, chọn False.
tôi đã làm như vậy
sau khi form hiện lên, tôi nhập dữ liệu vào bảng tính rồi quay lại form nhập tiếp dữ liệu vào form thì bị đơ máy rất lâu.
tôi gửi kèm file đính kèm. nhờ mọi người xem giúp !
 

File đính kèm

Upvote 0
tôi đã làm như vậy
sau khi form hiện lên, tôi nhập dữ liệu vào bảng tính rồi quay lại form nhập tiếp dữ liệu vào form thì bị đơ máy rất lâu.
tôi gửi kèm file đính kèm. nhờ mọi người xem giúp !
Bạn nên update hoặc cài lại office đi vì máy tôi chạy bình thường, thậm chí làm theo cách #284 vẫn chạy tốt.
 
Upvote 0
tôi đã làm như vậy
sau khi form hiện lên, tôi nhập dữ liệu vào bảng tính rồi quay lại form nhập tiếp dữ liệu vào form thì bị đơ máy rất lâu.
tôi gửi kèm file đính kèm. nhờ mọi người xem giúp !

Bạn nên update hoặc cài lại office đi vì máy tôi chạy bình thường, thậm chí làm theo cách #284 vẫn chạy tốt.

Tôi đã test file này và bị lỗi như bạn vanmanhvcu đề cập (máy cài Officw 2013).
Tìm trên mạng thì thấy khuyên là hạn chế dùng cái RefEdit control này, dễ gây crash Excel.
Một trong các cách để tránh "đơ" là Userform chứa control này phải ở chế độ Modal: True. Nếu không sẽ gặp các lỗi lung tung trong Excel.
Tóm lại nên dùng giải pháp thay thế cho control này là tốt nhất.
Thanm khảo:

220040
 
Upvote 0
Ừ, mình cũng bị, Excel 2007, đúng là do RefEdit. Chỉ có cách UserForm1.Show vbModal thôi.
 
Upvote 0
Tôi đã test file này và bị lỗi như bạn vanmanhvcu đề cập (máy cài Officw 2013).
Tìm trên mạng thì thấy khuyên là hạn chế dùng cái RefEdit control này, dễ gây crash Excel.
Một trong các cách để tránh "đơ" là Userform chứa control này phải ở chế độ Modal: True. Nếu không sẽ gặp các lỗi lung tung trong Excel.
Tóm lại nên dùng giải pháp thay thế cho control này là tốt nhất.
Thanm khảo:

View attachment 220040
Cám ơn @ongke0711
vậy có thể dùng control nào hay cách nào để cho người dùng userform nhập địa chỉ vào được không? (thay thế cái Refedit trên form kia của tôi)
 
Upvote 0
Chào tất cả mọi người !
mình có làm Add-in để show Icon trên Userform
nhưng không hiểu vì sao chỉ hoạt động trên Excel 2007 như dưới: (hình 1)
220547

nhưng khi chạy trên Office 2010 64 bít thì không ra : (hình 2)
220548
và cả khi chạy trên Office 2016 32 bít cũng không ra: (hình 3)
220549
File Addin mình có đính kèm
mọi người xem và xử lý giúp !
 

File đính kèm

Upvote 0
Thì ExtractIcon nó failed, tìm không Icon đó trong Excel chứ sao bác. Bác dùng Resource Hacker (google) xem thử cái Icon bác cần trong Excel mới có ID là bao nhiêu ?
Góp ý chút, bác declare API tá lã chổ hết, trùng nhau lung tung. Bác chịu khó gôm hết về 1 module đi cho dễ code, dễ kiểm soát. Vd modAPI chẵng hạn.
Trên khai báo API, cái gì có H ở trước thì khi khai báo trong VBA7, bác chịu khó đổi thành LongPtr. Khai báo còn sai nhiều.
H là handle đó bác, ví dụ HWND, HINSTANCE, HDC... Nó là các số Long trên Win/Office 32 bit, LongLong trên Win/Office 64 bit. Với VBA7, VBA sẽ tự động thông dịch LongPtr thành ra Long hay LongLong theo Office32 hay 64.
 
Upvote 0
Thì ExtractIcon nó failed, tìm không Icon đó trong Excel chứ sao bác. Bác dùng Resource Hacker (google) xem thử cái Icon bác cần trong Excel mới có ID là bao nhiêu ?
Góp ý chút, bác declare API tá lã chổ hết, trùng nhau lung tung. Bác chịu khó gôm hết về 1 module đi cho dễ code, dễ kiểm soát. Vd modAPI chẵng hạn.
Trên khai báo API, cái gì có H ở trước thì khi khai báo trong VBA7, bác chịu khó đổi thành LongPtr. Khai báo còn sai nhiều.
H là handle đó bác, ví dụ HWND, HINSTANCE, HDC... Nó là các số Long trên Win/Office 32 bit, LongLong trên Win/Office 64 bit. Với VBA7, VBA sẽ tự động thông dịch LongPtr thành ra Long hay LongLong theo Office32 hay 64.
ôi ôi, tôi chỉ là dân nghiệp dư
bác nhìn thì bác biết mà,
giờ không biết sửa chỗ nào.
 
Upvote 0
Bác lên đây download tool này về, rồi mở file Excel.exe mà bác cần xem ra, duyệt tới mục Icon, xem ID nào cần lấy thì chỉnh cái ID đó lại trong code của bác, chổ call hàm ExtractIcon đấy.
PS: Tool này rất nổi tiếng, viết = Delphi đấy. Tác giả là 1 guru về Delphi.
 

File đính kèm

  • 1.png
    1.png
    97 KB · Đọc: 12
Upvote 0
Bác lên đây download tool này về, rồi mở file Excel.exe mà bác cần xem ra, duyệt tới mục Icon, xem ID nào cần lấy thì chỉnh cái ID đó lại trong code của bác, chổ call hàm ExtractIcon đấy.
PS: Tool này rất nổi tiếng, viết = Delphi đấy. Tác giả là 1 guru về Delphi.
Cám ơn bác, để tôi ngâm thử.
 
Upvote 0
À, code bác declare sai đó. Gom và declare lại đi
 
Upvote 0
1. Khai báo lộn xộn.

2. Khai báo không chính xác. Vd.
Không thể là
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Mà phải là As LongPtr.

3. Không nhất quán. Đã bầy trò #If ... #Else ... #End If thì phải nhất quán, chơi trò đó đến cùng.
Không thể khai báo như ở trên (vd. FindWindow) rồi sau đó
Mã:
Dim lnghWnd As Long
Đã chơi #If ... #Else ... #End If thì chơi đến cùng.

4. Về code thì sai không phải do ExtractIcon. Parameter cuối cùng không phải là ID (identifier) mà là index - chỉ số thôi. 0 có nghĩa là icon đầu tiên có trong EXE, DLL. Excel.exe rõ ràng có ít nhất 1 icon.

Sai do cách dùng hàm SendMessage. Nếu ở trên là
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
thì khi chạy trên Office 2016 sẽ có lỗi ở
Mã:
SendMessage lnghWnd, WM_SETICON, False, lngIcon

Lúc đó phải là
SendMessage lnghWnd, WM_SETICON, False, ByVal lngIcon

Lúc đó sẽ nhìn thấy ICON.

Ngoài ra nên khai báo nhất quán. Hoặc cùng ANY hoặc cùng không ANY. Tức hoặc (lParam truyền bởi reference)
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
#Else
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Integer, lParam As Any) As Long
#End If
hoặc (lParam truyền bởi giá trị)
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, Byval lParam As LongPtr) As LongPtr
#Else
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Integer, Byval lParam As Long) As Long
#End If

Với phiên bản 1 bắt buộc phải có ByVal lngIcon. Với phiên bản 2 thì ByVal lngIcon hay lngIcon đều được.

Nói tóm lại là code hổ lốn.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả mọi người !
mình có làm Add-in để show Icon trên Userform
nhưng không hiểu vì sao chỉ hoạt động trên Excel 2007 như dưới: (hình 1)
View attachment 220547

nhưng khi chạy trên Office 2010 64 bít thì không ra : (hình 2)
View attachment 220548
và cả khi chạy trên Office 2016 32 bít cũng không ra: (hình 3)
View attachment 220549
File Addin mình có đính kèm
mọi người xem và xử lý giúp !
Có thể chổ này là cái bạn cần.
 
Upvote 0
1. Khai báo lộn xộn.

2. Khai báo không chính xác. Vd.
Không thể là


Mà phải là As LongPtr.

3. Không nhất quán. Đã bầy trò #If ... #Else ... #End If thì phải nhất quán, chơi trò đó đến cùng.
Không thể khai báo như ở trên (vd. FindWindow) rồi sau đó
Mã:
Dim lnghWnd As Long
Đã chơi #If ... #Else ... #End If thì chơi đến cùng.

4. Về code thì sai không phải do ExtractIcon. Parameter cuối cùng không phải là ID (identifier) mà là index - chỉ số thôi. 0 có nghĩa là icon đầu tiên có trong EXE, DLL. Excel.exe rõ ràng có ít nhất 1 icon.

Sai do cách dùng hàm SendMessage. Nếu ở trên là

thì khi chạy trên Office 2016 sẽ có lỗi ở
Mã:
SendMessage lnghWnd, WM_SETICON, False, lngIcon

Lúc đó phải là


Lúc đó sẽ nhìn thấy ICON.

Ngoài ra nên khai báo nhất quán. Hoặc cùng ANY hoặc cùng không ANY. Tức hoặc (lParam truyền bởi reference)

hoặc (lParam truyền bởi giá trị)


Với phiên bản 1 bắt buộc phải có ByVal lngIcon. Với phiên bản 2 thì ByVal lngIcon hay lngIcon đều được.

Nói tóm lại là code hổ lốn.
gạch đá càng nhiều càng tốt !
miễn là có thể khắc phục lỗi là được rồi,
cám ơn các bác chỉ dẫn nhiệt tình
 
Upvote 0

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

Back
Top Bottom