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

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhờ các pro chỉ dùm kiểu lập trình vba của phần mềm dutoan97 là như thế nào. Mình thấy họ viết các câu lệnh ngay trên sheet. Đây là kiểu lập trình gì vậy. Làm thế nào để chạy các câu lệnh này? Thanks pro.
 

File đính kèm

Upvote 0
Chào tất cả mọi người !
nhờ mọi người xem giúp mình vì sao UDF function của mình khi gõ vào Office 2007 - 32bit không hiện ra
mình đóng gói UDF trong add-in để có thể dùng nhiều lần function trên file
link ở bài viết này:
 
Upvote 0
Chào tất cả mọi người !
nhờ mọi người xem giúp mình vì sao UDF function của mình khi gõ vào Office 2007 - 32bit không hiện ra
mình đóng gói UDF trong add-in để có thể dùng nhiều lần function trên file
link ở bài viết này:
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
 
Upvote 0
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)
 
Upvote 0
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
 
Upvote 0
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à
 
Upvote 0
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.
 
Upvote 0
@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:
Upvote 0
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
 
Upvote 0
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(..)
 
Upvote 0
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.
 
Upvote 0
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")
 
Upvote 0
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

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

Upvote 0
Web KT

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

Back
Top Bottom