Chuyên đề giải đáp những thắc mắc về code VBA

khuongnghi

Thành viên mới
Tham gia ngày
1 Tháng mười 2018
Bài viết
1
Được thích
0
Điểm
13
Tuổi
29
chào add, mình xin bạn giúp đỡ điều này, như mình dừng vlookup để truy tìm các tên công việc, nhưng có nhiều đầu mục công việc khác nhau, ngắn có dài có, ngắn thì nó sẽ nằm trọn 1 hàng, những dài thì nó phải xuống hàng, vậy làm cách nào để nó tự động thêm 1 hàng bên dưới và xuống hàng ko add
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
Những điều kiện cần thiết để hàm UDF hiện ra khi gõ tên nó trên bảng tính:

1. Nó phải nằm trong module căn bản, không phải sheet, không phải project khác.
2. Excel 2007 trở lên (2003 có thể dùng được UDF nhưng không bảo đảm cái tên nó hiện ra)

Người viết bài #2136 có lẽ vi phạm điều kiện 1 ở trên (theo nói thì hàm nằm ở trong add-in)
Hi Bác @VetMini
1. tôi không hiểu phải nằm trong module căn bản là sao?? bác giải thích rõ hơn được không.?
bác Alt +F11 xem addin của tôi thì sẽ thấy nó vẫn nằm trong module mà, có phải ở sheet đâu.
2. điều kiện 2 thì tôi đang dùng Office 2007 rồi mà
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,596
Được thích
7,669
Điểm
560
Thử sửa bên trên thành bên dưới xem sao
Mã:
Function CONTAINER(ContNo As String) As Boolean
Mã:
Public Function CONTAINER(ContNo As String) As Boolean
Nếu module có dòng "Option Private Module" thì các functions và subs của nó dù bạn có Public hay không, cũng sẽ chẳng được rao bán. Bạn có thể vẫn sử dụng được, nó chỉ không rao lên thôi.
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
838
Được thích
604
Điểm
560
@CHAOQUAY , vanmanhvcu

Trong Module có khai báo "Option Private Module"
Hàm không thể được gọi ở Cell của Trang tính. Cách giải quyết:
1. Xóa "Option Private Module" nếu có thể
2. Tạo và Khai báo một hàm tương tự vào module global và gọi hàm ở Private Module như dưới đây.

Các thủ tục trong Module đấy không thể gọi theo cách Global và theo kiểu khai báo Public ở một Module khác, Document, Userform hay Class.
Nên phải sử dụng phương thức của Application là Run.

Phương thức này sẽ là một Callback Function

Call Application.Run("CONTAINER", **kargs)

+ Nếu cùng workbook
A = Application.Run("CONTAINER", **kargs)​
'Khai báo tường minh khi có nhiều Hàm Private CONTAINER trong dự án​
'If <VBProject Component Module> Then​
'Application.Run("ModuleName.CONTAINER", **kargs)​
+ Nếu khác workbook:
If <Workbook Is Open> then 'Ràng buộc xem workbook đã mở chưa.​
A = Application.Run("'" & <Workbook FullName> & "'!CONTAINER", **kargs)​
'Khai báo tường minh​
'If <VBProject Component Module> Then​
'Application.Run("'" & <Workbook FullName> & "'!ModuleName.CONTAINER", **kargs)​
End if​

**kargs nhận các biến đã khai báo của thủ tục CONTAINER(ContNo)

A = Application.Run("'" & <Workbook FullName> & "'!CONTAINER", "Chuỗi")
PHP:
'Vào Module Global'
Function CONTAINERb(ContNo As String) As Boolean
    On Error Goto Ends 'Nếu không có CONTAINER ở Module1 và một số lỗi nếu có'
    CONTAINERb = Application.Run("Module1.CONTAINER", ContNo)
Ends:
End Function
 
Lần chỉnh sửa cuối:

LEHOC

Thành viên mới
Tham gia ngày
11 Tháng một 2017
Bài viết
46
Được thích
0
Điểm
163
Xin chào tất cả anh/chị, em có chút vướng mắc với đoạn code sau. Em nhờ anh/chị sửa giúp em để khi em mở hộp thoại OpenDialog lên nhưng không chọn tới file nào để open mà đóng hộp thoại thì bị lỗi xoá trắng dữ lieu đang có trong ThisWorkbook.Sheets("Tong").
Em cảm ơn!
PHP:
Dim sFil As String
Dim owb As Workbook
Dim myFile As String
Dim xLastRow As Long
    myFile = Application.GetOpenFilename("Excel file (*.xls;*.xlsx),*.xls;*.xlsx", , "Select a excel file", , False)
    sFil = Dir(myFile)
    
    Do While sFil <> ""
        
        Set owb = Workbooks.Open(myFile)
        
        owb.Activate
        
        With Activate
        
            xLastRow = Application.ActiveSheet.Cells.SpecialCells(xlLastCell).Row
            
            xLastcolumn = Application.ActiveSheet.Cells.SpecialCells(xlLastCell).Column
            
            Range(Cells(1, 1), Cells(xLastRow, xLastcolumn)).Copy ThisWorkbook.Sheets("Tong").Range("A1")
        
            owb.Close False
        
            sFil = Dir
        
        End With
        
    Loop
 

ongke0711

Thành viên thường trực
Tham gia ngày
7 Tháng chín 2006
Bài viết
269
Được thích
244
Điểm
710
Xin chào tất cả anh/chị, em có chút vướng mắc với đoạn code sau. Em nhờ anh/chị sửa giúp em để khi em mở hộp thoại OpenDialog lên nhưng không chọn tới file nào để open mà đóng hộp thoại thì bị lỗi xoá trắng dữ lieu đang có trong ThisWorkbook.Sheets("Tong").
Em cảm ơn!
PHP:
Dim sFil As String
Dim owb As Workbook
Dim myFile As String
Dim xLastRow As Long
    myFile = Application.GetOpenFilename("Excel file (*.xls;*.xlsx),*.xls;*.xlsx", , "Select a excel file", , False)
   sFil = Dir(myFile)
  
  ..
      
    Loop
Bạn bẫy lỗi dòng này.
myFile = .....
If myFile="" Then Exit Sub
sFile = Dir(..)
 

harukenshiro

Thành viên mới
Tham gia ngày
13 Tháng mười hai 2018
Bài viết
12
Được thích
0
Điểm
13
Tuổi
22
Mọi người cho em hỏi, em có một vấn đề với Dictionary. Nhu cầu của em hiện tại là muốn tạo một Dictionary, gồm Mã Hàng(MH), ngày hàng về kho(NVK), ngày hàng xuất đi tới khách hàng(NX), ngày update. Mỗi ngày kho sẽ update cho em các thông tin này(xóa hết ngày cũ), và note lại một cột là update vào ngày mấy, vấn đề ở đây là ngày hàng về kho và ngày xuất tới khách hàng có thể thay đổi. Hiện tại em muốn tạo một Dictionary, MH là key, ngày update là item, và trong item đó có 2 item con là NVK và NX. Các anh có thể cho em hỏi là vấn đề này có khả thi không, và code để add item con là gì ạ. Em sẽ tạo topic để upload file cũng như code detail mà em viết( hiện em chỉ viết được code add item, ko có item con) nếu khả thi ạ. Em cảm ơn.
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
8,555
Được thích
9,719
Điểm
560
trong item đó có 2 item con là NVK và NX
Đọc bài này:

Mục 2.1 chỉ rõ item nhận một giá trị đơn hoặc một mảng (array)

PHP:
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dic.Add "key", array("NVK", "NX")
 

langtu020690

Thành viên mới
Tham gia ngày
4 Tháng mười hai 2009
Bài viết
37
Được thích
5
Điểm
365
Tuổi
29
Hi mọi người,
File dưới là file tiêu đề lập lại cho từng row, nhược điểm là mỗi môi trường khác nhau phải vào chỉnh sửa code (vì cột và ô ko giống nhau)
Nhờ mọi người giúp e phát triễn thêm thành giống hình dưới đây được không, nghĩa là mình muốn title nào lập lại thì chọn tiêu đề đó, dòng nào muốn lập lại thì chọn dòng...
219822
@file excel đính kèm là file chạy đoạn code phía dưới
Code trong file
Mã:
Sub titleabc()
    Dim i As Integer
    Application.ScreenUpdating = False
    Sheet3.Range("B3:S" & Sheet3.Range("B" & Rows.Count).End(3).Row + 1).Clear
    Sheet1.Range("B5:S" & Sheet1.Range("B" & Rows.Count).End(3).Row - 1).Copy Sheet3.Range("B3")
    For i = Sheet3.Range("B" & Rows.Count).End(3).Row To 3 Step -1
        Sheet3.Rows(i & ":" & i + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Sheet1.Range("B3:S4").Copy Sheet3.Range("B" & i)
        Sheet3.Range("B" & i).Resize(1, 18).Borders.LineStyle = xlNone
    Next
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,670
Được thích
3,855
Điểm
860
Hi mọi người,
File dưới là file tiêu đề lập lại cho từng row, nhược điểm là mỗi môi trường khác nhau phải vào chỉnh sửa code (vì cột và ô ko giống nhau)
Nhờ mọi người giúp e phát triễn thêm thành giống hình dưới đây được không, nghĩa là mình muốn title nào lập lại thì chọn tiêu đề đó, dòng nào muốn lập lại thì chọn dòng...
View attachment 219822
@file excel đính kèm là file chạy đoạn code phía dưới
Code trong file
Mã:
Sub titleabc()
    Dim i As Integer
    Application.ScreenUpdating = False
    Sheet3.Range("B3:S" & Sheet3.Range("B" & Rows.Count).End(3).Row + 1).Clear
    Sheet1.Range("B5:S" & Sheet1.Range("B" & Rows.Count).End(3).Row - 1).Copy Sheet3.Range("B3")
    For i = Sheet3.Range("B" & Rows.Count).End(3).Row To 3 Step -1
        Sheet3.Rows(i & ":" & i + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Sheet1.Range("B3:S4").Copy Sheet3.Range("B" & i)
        Sheet3.Range("B" & i).Resize(1, 18).Borders.LineStyle = xlNone
    Next
    Application.ScreenUpdating = True
End Sub
Bạn chưa mô tả chi tiết mục đích nên mình thiết kế Form thôi, việc còn lại thì bạn tự sửa code nhé.
 

File đính kèm

langtu020690

Thành viên mới
Tham gia ngày
4 Tháng mười hai 2009
Bài viết
37
Được thích
5
Điểm
365
Tuổi
29
Bạn chưa mô tả chi tiết mục đích nên mình thiết kế Form thôi, việc còn lại thì bạn tự sửa code nhé.
Hi ad
Mục đích là mình muốn thiết kế 1 add-in dang các ribbon trên thanh menu, khi mình click vào thì nó hình ra như hình dưới
219902
Phục vụ cho công việc lập lại tiêu đề cho từng row dữ liệu. Nghĩa là trong file mình gửi, sheet đầu là sheet dữ liệu, 1 tiêu đề chung cho mọi người. Khi in phiếu lương phát cho mọi người thì mình phải copy tiêu đề đó cho từng người tương ứng.Đoạn code mình gửi là mình copy từ file ra.Mà file này của 1 ng trên mạng, giờ áp vào cty thì mỗi lần làm mình phải vào code sửa lại, nên giờ muốn nhờ ad giúp làm 1 cái add-in. khi làm chỉ click chọn thôi, ko có vào code sửa
Mong là hiểu dc ý mình diễn giải
 

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,670
Được thích
3,855
Điểm
860
Hi ad
Mục đích là mình muốn thiết kế 1 add-in dang các ribbon trên thanh menu, khi mình click vào thì nó hình ra như hình dưới
View attachment 219902
Phục vụ cho công việc lập lại tiêu đề cho từng row dữ liệu. Nghĩa là trong file mình gửi, sheet đầu là sheet dữ liệu, 1 tiêu đề chung cho mọi người. Khi in phiếu lương phát cho mọi người thì mình phải copy tiêu đề đó cho từng người tương ứng.Đoạn code mình gửi là mình copy từ file ra.Mà file này của 1 ng trên mạng, giờ áp vào cty thì mỗi lần làm mình phải vào code sửa lại, nên giờ muốn nhờ ad giúp làm 1 cái add-in. khi làm chỉ click chọn thôi, ko có vào code sửa
Mong là hiểu dc ý mình diễn giải
Bạn phải giải thích rõ mới làm được.
Thứ nhất là khung màu đỏ thứ nhất (Titles Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ hai là khung màu đỏ thứ hai (Insert Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ ba là khung màu đỏ thứ ba (Interval rows) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Giải thích cụ thể và chi tiết, nếu được thì giải thích rõ ràng càng tốt.
 

langtu020690

Thành viên mới
Tham gia ngày
4 Tháng mười hai 2009
Bài viết
37
Được thích
5
Điểm
365
Tuổi
29
Bạn phải giải thích rõ mới làm được.
Thứ nhất là khung màu đỏ thứ nhất (Titles Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ hai là khung màu đỏ thứ hai (Insert Range) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Thứ ba là khung màu đỏ thứ ba (Interval rows) là nó lặp lại chổ nào trong file (Cụ thể hơn là nó lấy từ chổ nào của sheet data và chuyển sang sheet result thì nó nằm ở chổ nào?)
Giải thích cụ thể và chi tiết, nếu được thì giải thích rõ ràng càng tốt.
Hi ad, em giải thích tí
1. Hình có 3 khung đỏ với file là ko có gì liên quan, ý e là trong file excel khi bấm nút màu tím thì nó tự chạy dữ liệu (từ sheet DATA), trong file excel có code VBA, nó định sẵn title từ đâu tới đâu, fix sẵn luôn. Giờ em muốn mình tạo 1 nút, khi bấm vào thì nó show cái form giống hình có 3 khung đỏ
a. Khung đỏ đầu: mình muốn tiêu đề nào lập lại thì mình khối chọn, làm vậy nó sẽ động chứ k tĩnh
b. Khung đỏ thứ 2: là dữ liệu nào muốn dc chèn tiêu đề vào, nhưng trong file có 91 người, thì 91 người sẽ dc chèn tiêu đề (xem sheet ketqua)
c. Khung đỏ 3: là muốn bao nhiêu dòng tiêu đề lập lại 1 lần. Như trong file thì mỗi row tiêu đề sẽ lập lại, vd tương lại mình sẽ có nhu cầu cứ sau 5 dòng thì tiêu đề lập lại
vd1: sau 1 row thì lập lại tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
ABCDEF->là tieu de
222222->du lieu dong 2
vd2: sau 2 row thì lập lai tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
222222->du lieu dong 2
ABCDEF->là tieu de
333333->du lieu dong 3
444444->du lieu dong 4
---
2. Hình có 3 khung đỏ thực chất nó là 1 chức năng trong 1 add-in tên là Kutools
Link tham khảo: https://www.extendoffice.com/documents/excel/4624-excel-header-row-print.html
Nhưng do cái này chỉ cho dùng thử, chứ dùng lâu phải mua key
3. Hiện tại em tạm gọi là có code lập lại tiêu đề rồi nên muốn nâng tiếp 1 bước thành dạng add-in, tạo 1 ribbon trên thanh menu,môi lần dùng chỉ cần click vào, và mình thao tác động, chứ k phải mỗi lần làm phải vào chỉnh sửa code.
Chắc đến đây ad hiểu ý em phải ko
 

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,670
Được thích
3,855
Điểm
860
Hi ad, em giải thích tí
1. Hình có 3 khung đỏ với file là ko có gì liên quan, ý e là trong file excel khi bấm nút màu tím thì nó tự chạy dữ liệu (từ sheet DATA), trong file excel có code VBA, nó định sẵn title từ đâu tới đâu, fix sẵn luôn. Giờ em muốn mình tạo 1 nút, khi bấm vào thì nó show cái form giống hình có 3 khung đỏ
a. Khung đỏ đầu: mình muốn tiêu đề nào lập lại thì mình khối chọn, làm vậy nó sẽ động chứ k tĩnh
b. Khung đỏ thứ 2: là dữ liệu nào muốn dc chèn tiêu đề vào, nhưng trong file có 91 người, thì 91 người sẽ dc chèn tiêu đề (xem sheet ketqua)
c. Khung đỏ 3: là muốn bao nhiêu dòng tiêu đề lập lại 1 lần. Như trong file thì mỗi row tiêu đề sẽ lập lại, vd tương lại mình sẽ có nhu cầu cứ sau 5 dòng thì tiêu đề lập lại
vd1: sau 1 row thì lập lại tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
ABCDEF->là tieu de
222222->du lieu dong 2
vd2: sau 2 row thì lập lai tiêu đề
ABCDEF->là tieu de
111111->du lieu dong 1
222222->du lieu dong 2
ABCDEF->là tieu de
333333->du lieu dong 3
444444->du lieu dong 4
---
2. Hình có 3 khung đỏ thực chất nó là 1 chức năng trong 1 add-in tên là Kutools
Link tham khảo: https://www.extendoffice.com/documents/excel/4624-excel-header-row-print.html
Nhưng do cái này chỉ cho dùng thử, chứ dùng lâu phải mua key
3. Hiện tại em tạm gọi là có code lập lại tiêu đề rồi nên muốn nâng tiếp 1 bước thành dạng add-in, tạo 1 ribbon trên thanh menu,môi lần dùng chỉ cần click vào, và mình thao tác động, chứ k phải mỗi lần làm phải vào chỉnh sửa code.
Chắc đến đây ad hiểu ý em phải ko
Bạn xem thử đúng yêu cầu của mình chưa nhé, nếu chưa đúng thì tối tính tiếp, có việc bận rồi.
 

File đính kèm

langtu020690

Thành viên mới
Tham gia ngày
4 Tháng mười hai 2009
Bài viết
37
Được thích
5
Điểm
365
Tuổi
29
Bạn xem thử đúng yêu cầu của mình chưa nhé, nếu chưa đúng thì tối tính tiếp, có việc bận rồi.
Dear ad
Đầu tiên mình tks nhiều, cơ bản nó giống ý mình muốn rồi, nhưng kế qua hiện tại còn 1 tí lỗi nhỏ, nhờ ad fix dùm mình luôn nha.
219946
1. Như hình 1 thì sau khi mình chọn các đối tượng tương ứng trong form thì dòng dữ liệu bị lệch so với tiêu đề, vả lại giữa tiêu đề và dòng dữ liệu có khoảng trắng, bỏ luôn được không
2. Trong sheet Data có 91 người, ban đầu mình vd chỉ chọn cho tiêu đề lập lại 3 người đầu tiên thôi, file xuất quả đúng là chỉ có 3 người đó
nhưng 3 người đó bị lập đi lại lại nhiều lần, có cách nào chỉ hiện thị đúng số người mình chọn thôi.
4. Hiện tại mình chọn 3 người thì đồng nghĩa với việc sẽ có 3 cái tiêu đề cho 3 người đó, hiện tại 3 người chỉ có 1 tiêu đề
vd kết qua mong muốn là
AAAA->Tiêu đề
Người 1
AAAA->Tiêu đề
Người 2
AAAA->Tiêu đề
Người 3
----
cái này giống như phiếu lương con, mỗi tháng cắt ra đưa cho mỗi người 1 tờ giấy nhỏ để họ xem
Ad xem lại giúp mình.
 
Top