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:
Dear all,

Em có viết 1 file báo cáo công ty bằng VBA khi chạy trên máy ở nhà thì code chạy ổn định, Nhưng khi sang máy khác bị lỗi ở modul 6, bước cuối cùng tổng hợp báo cáo. Mong mọi người xem xét chỉ giúp em lỗi của file này RUN TIME ERRO 7 OUT OF MEMORY. (Do file này nặng em tải nên drive, các anh chị tải về xem giúp em)
Rát mong nhận được sự giúp đỡ của mọi người. Em xin chân thành cảm ơn.

https://drive.google.com/file/d/0B7_P2xWKkzz7dWhoU3JHck9JZzA/view
 
Upvote 0
Xin thầy chia sẽ thêm là: tham chiếu kiểu này và offset cơ bản có cùng bản chất, vậy sử dụng cái nào sẽ tối ưu hơn ạ, và thầy thường sử dụng phương pháp nào, em cám ơn

Nhìn thì có vẻ giống! Tức nếu viết Range("C7")(2, 2) thì các bạn nghĩ nó tương đương với Range("C7").Offset(1,1) đúng không?
Nếu vậy thì người ta "đẻ" thêm cái kiểu (2,2) kia làm gì cho nhức đầu
???!!!
Ta hãy làm cuộc thí nghiệm thế này:
- Quét chọn C7:G15 rồi thực hiện lệnh Merge chúng lại với nhau
- Vào cửa sổ VBA, bấm Ctrl + G (mở cửa sổ Immediate)
- Gõ vào khung Immediate dòng lệnh ?Range("C7")(2,2).Address rồi Enter phát, ta nhận được kết quả $D$8 (Ổn đúng không?)
- Tiếp theo gõ vào khung Immediate lệnh ?Range("C7").Offset(1,1).Address rồi Enter phát, ta nhận được kết quả $H$16 (bất ngờ quá đúng không?)

--------------------------
Vậy ta có thể tạm kết luận rằng:
- Kiểu viết Range("...").Offset(m-1,n-1) sẽ giống với kiểu Range("...")(m,n) cho trường hợp cell thường chưa Merge
- Kiểu viết Range("...").Offset(....) tương đương với thao tác chọn 1 cell rồi dùng các phím mũi tên để di chuyển. Chẳng hạn tình huống trên, nếu chọn C7 (đã Merge) rồi bấm phím mũi tên xuống và mũi tên phải cùng lúc, activeCell cũng sẽ được di chuyển đến H16 ---> Đó chính là Range("C7").Offset(1,1) đấy
- Ngoài cells bị merge ra, Offset còn gặp rắc rối tương tự khi có dòng ẩn, cột ẩn hoặc bảng tính có fillter (nó sẽ "nhảy" linh tinh khiến ta ngơ ngác không hiểu mình sai ở đâu)
- Kiểu viết Range(m,n) luôn luôn cho kết quả đúng như những gì mình nghĩ trong đầu, bất kể cell có bị merge, bị ẩn hay filter
--------------------------
Hiểu được sự khác nhau giữa 2 cách viết rồi, các bạn quyết định xài cái nào là.. tùy tình huống. Riêng tôi, ít khi thích xài Offset
 
Lần chỉnh sửa cuối:
Upvote 0
Nhìn thì có vẻ giống! Tức nếu viết Range("C7")(2, 2) thì các bạn nghĩ nó tương đương với Range("C7").Offset(1,1) đúng không?
Nếu vậy thì người ta "đẻ" thêm cái kiểu (2,2) kia làm gì cho nhức đầu
???!!!
Ta hãy làm cuộc thí nghiệm thế này:
- Quét chọn C7:G15 rồi thực hiện lệnh Merge chúng lại với nhau
- Vào cửa sổ VBA, bấm Ctrl + G (mở cửa sổ Immediate)
- Gõ vào khung Immediate dòng lệnh ?Range("C7")(2,2).Address rồi Enter phát, ta nhận được kết quả $D$8 (Ổn đúng không?)
- Tiếp theo gõ vào khung Immediate lệnh ?Range("C7").Offset(1,1).Address rồi Enter phát, ta nhận được kết quả $H$16 (bất ngờ quá đúng không?)

--------------------------
Vậy ta có thể tạm kết luận rằng:
- Kiểu viết Range("...").Offset(m-1,n-1) sẽ giống với kiểu Range("...")(m,n) cho trường hợp cell thường chưa Merge
- Kiểu viết Range("...").Offset(....) tương đương với thao tác chọn 1 cell rồi dùng các phím mũi tên để di chuyển. Chẳng hạn tình huống trên, nếu chọn C7 (đã Merge) rồi bấm phím mũi tên xuống và mũi tên phải cùng lúc, activeCell cũng sẽ được di chuyển đến H16 ---> Đó chính là Range("C7").Offset(1,1) đấy
- Ngoài cells bị merge ra, Offset còn gặp rắc rối tương tự khi có dòng ẩn, cột ẩn hoặc bảng tính có fillter (nó sẽ "nhảy" linh tinh khiến ta ngơ ngác không hiểu mình sai ở đâu)
- Kiểu viết Range(m,n) luôn luôn cho kết quả đúng như những gì mình nghĩ trong đầu, bất kể cell có bị merge, bị ẩn hay filter
--------------------------
Hiểu được sự khác nhau giữa 2 cách viết rồi, các bạn quyết định xài cái nào là.. tùy tình huống. Riêng tôi, ít khi thích xài Offset
Dạ em cám ơn thầy rất nhiều ạ, đúng là chỉ có trải nghiệm nhiều mới biết được những cái này.
 
Upvote 0
Có Anh/Chị nào giúp em set pass cho file PDF sau khi export ra không ạ?

Em xin đính kèm file ở dưới, trong File e đã xuất ra dc file PDF rồi, nhưng không có set pass dc ạ
 

File đính kèm

  • Macro_mailMege_salary.xls
    67.5 KB · Đọc: 8
Upvote 0
Có Anh/Chị nào giúp em set pass cho file PDF sau khi export ra không ạ?

Em xin đính kèm file ở dưới, trong File e đã xuất ra dc file PDF rồi, nhưng không có set pass dc ạ
Bạn đã thử bài này chưa?

http://www.giaiphapexcel.com/forum/showthread.php?120467-Macro-save-file-với-định-dạng-pdf-có-pass

Mình cũng đang hóng xem có cách nào khác không đây. Search nhiều rùi nhưng câu trả lời mình thấy chỉ có như link mình gửi bạn là có vẻ ok.
 
Upvote 0
Giới hạn vùng thao tác?

Xin chào tất cả các bạn,

Oanh Thơ muốn sử dung 1 đoạn code hoạt động trong sự kiện bên dưới, với điều kiện là khi thao tác trong cộ E từ dòng số 10 nghĩa là từ E10 xuống đến dòng cuối cùng trong cột E có dữ lieu thì sự kiện mới có tác dụng còn ngoài điều kiện trên thì code không hoạt động.

Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        
End Sub

Rất mong nận được sự giúp đỡ từ các bạn.
Xin cảm ơn các bạn nhiều
 
Upvote 0
Xin chào tất cả các bạn,

Oanh Thơ muốn sử dung 1 đoạn code hoạt động trong sự kiện bên dưới, với điều kiện là khi thao tác trong cộ E từ dòng số 10 nghĩa là từ E10 xuống đến dòng cuối cùng trong cột E có dữ lieu thì sự kiện mới có tác dụng còn ngoài điều kiện trên thì code không hoạt động.

Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        
End Sub

Rất mong nận được sự giúp đỡ từ các bạn.
Xin cảm ơn các bạn nhiều
Không biết đúng ý không?
Mã:
If Not Intersect(Target, Range("E10:E" & Range("E65000").End(xlUp).Row)) Is Nothing Then
    'code cua ban.
End If
 
Upvote 0
rivate Sub Worksheet_Calculate()
Static oldval
If Range("A2").Value <> oldval Then
oldval = Range("A2")
Call AutoNhatKy
End If
End SubPrivate Sub Worksheet_Calculate()
Static oldval
If Range("A2").Value <> oldval Then
oldval = Range("A2")
Call AutoNhatKy
End If
End Sub
-------------------------------
Mình có đoạn code gọi Sub tự động, làm thế nào để khi đang đứng ở 1 sheet khác code chạy mà nó không bị quay lại Sheet chạy code
 
Upvote 0
rivate Sub Worksheet_Calculate()
Static oldval
If Range("A2").Value <> oldval Then
oldval = Range("A2")
Call AutoNhatKy
End If
End SubPrivate Sub Worksheet_Calculate()
Static oldval
If Range("A2").Value <> oldval Then
oldval = Range("A2")
Call AutoNhatKy
End If
End Sub
-------------------------------
Mình có đoạn code gọi Sub tự động, làm thế nào để khi đang đứng ở 1 sheet khác code chạy mà nó không bị quay lại Sheet chạy code

alibaba chứ có phải "40 tên cướp" đâu mà thích thả bom diễn đàn vậy ?

http://www.giaiphapexcel.com/forum/...1-code-về-công-thức-mảng!&p=756874#post756874

http://www.giaiphapexcel.com/forum/...!-có-file-và-ảnh-đính-kèm&p=756877#post756877
 
Upvote 0
Upvote 0
Upvote 0
Bác giúp em vấn đề này với ạ!

vấn đề khó hay dễ tôi đều làm nếu tôi biết , chỉ tiếc là tôi không giao thiệp với các thành phần không tôn trọng nội quy , hễ thích thì gửi bài viết cùng 1 nội dung ở nhiều nơi , cho nên bạn phải chờ thành viên khác rồi .
 
Upvote 0
vấn đề khó hay dễ tôi đều làm nếu tôi biết , chỉ tiếc là tôi không giao thiệp với các thành phần không tôn trọng nội quy , hễ thích thì gửi bài viết cùng 1 nội dung ở nhiều nơi , cho nên bạn phải chờ thành viên khác rồi .
Dạ vâng! em sẽ đọc lại Nội Quy và chấp hành. Cảm ơn bác đã nhắc nhở
 
Upvote 0
Nhờ mọi người giải thích giúp đoạn Code lưu File dưới đây

Em nhờ mọi người giải thích giúp e những phần bôi đỏ dưới đây :

Mã:
ActiveWorkbook.SaveAs fileName:=path & "\" & fileName & ".xls",FileFormat:=xlExcel8, [COLOR=#ff0000][B]Password:="", WriteResPassword:="",[/B][/COLOR]

 [COLOR=#ff0000][B]ReadOnlyRecommended:=False[/B][/COLOR], CreateBackup:=False

Em xin cảm ơn ạ !
 
Upvote 0
Em nhờ mọi người giải thích giúp e những phần bôi đỏ dưới đây :

Mã:
ActiveWorkbook.SaveAs fileName:=path & "\" & fileName & ".xls",FileFormat:=xlExcel8, [COLOR=#ff0000][B]Password:="", WriteResPassword:="",_ [/B][/COLOR]
  [COLOR=#ff0000][B]ReadOnlyRecommended:=False[/B][/COLOR], CreateBackup:=False

Em xin cảm ơn ạ !


Password:=""
'Đặt mật khẩu Open file

WriteResPassword:=""
'Đặt mật khẩu Edit file

ReadOnlyRecommended:=False
'Thiết lập chế độ chỉ đọc, False là không đặt chế độ chỉ đọc, True là bật chế độ chỉ đọc cho file
 
Upvote 0
Em nhờ mọi người giải thích giúp e những phần bôi đỏ dưới đây :

Mã:
ActiveWorkbook.SaveAs fileName:=path & "\" & fileName & ".xls",FileFormat:=xlExcel8, [COLOR=#ff0000][B]Password:="", WriteResPassword:="",[/B][/COLOR]

 [COLOR=#ff0000][B]ReadOnlyRecommended:=False[/B][/COLOR], CreateBackup:=False

Em xin cảm ơn ạ !

Nếu chỗ màu đỏ = "" và = False thì xóa luôn đi, khỏi giải thích. Chứ ghi vào mà không có tác dụng gì thì ghi làm gì cho thêm năng đầu suy nghĩ. Đợi khi nào dùng tới sẽ nghiên cứu
 
Upvote 0
Cảm ơn anh benfaint và chú Ndu ạ. Ủa mà sao không thấy nút cảm ơn trên diễn đàn nữa đâu ta ....

Nếu chỗ màu đỏ = "" và = False thì xóa luôn đi, khỏi giải thích. Chứ ghi vào mà không có tác dụng gì thì ghi làm gì cho thêm năng đầu suy nghĩ. Đợi khi nào dùng tới sẽ nghiên cứu

Code này hổng phải con viết đâu chú, cái này của người khác họ lấy ở đâu đó rồi nhờ con giải thích dùm ... về phần này thì con cũng không rành lắm nên phải hỏi lại cho chắc chắn ạ
 
Upvote 0
Nhờ mọi người giải thích giúp e đoạn Code này với ạ, đoạn Code này để tạo ra 5 File khác:

Trong file đính kèm e thấy có đoạn Code:
Mã:
   Sheets(Array("Sheet1")).Select
    Sheets(Array("Sheet1")).Copy

Nhưng về sau không thấy Paste ở đâu ... mà xóa 2 dòng Code trên đi thì nó lại chỉ tạo ra mỗi 1 File ...Em không hiểu là sao nữa ...
 

File đính kèm

  • Copy of KPI-HUNG.xlsm
    23.6 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
Nói chung mọi người giải thích sơ qua về đoạn code này giúp e vs được không ạ:
Mã:
Sub SplitFile(rptTitle As String, fileName As String, path As String)
    
    Range("B2") = rptTitle

    Sheets(Array("Sheet1")).Select  
    Sheets(Array("Sheet1")).Copy  [COLOR=#ff0000][B] ' Chỗ này Copy xong nhưng không thấy Paste vô đâu cả  ... ????'[/B][/COLOR]
    
    Range("E7:F8").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs fileName:=path & "\" & fileName & ".xls", _
        FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
    
    Application.DisplayAlerts = True
    ActiveWindow.Close
  
End Sub
----------------------------------------------------------------------------------------------------------

Sub Main()
    Dim rptTitle As String, fileName As String, i As Integer, j As Integer, path As String
    path = ThisWorkbook.path
    
    i = 2
    j = 1
    Set WS = ThisWorkbook.Sheets("MA_NV")
    
    Do Until IsEmpty(WS.Cells(i, j))
    rptTitle = WS.Cells(i, j)
    fileName = WS.Cells(i, j + 1)

    SplitFile rptTitle, fileName, path ' -->[COLOR=#ff0000][B] tại sao chổ này phải viết vầy mà không thể viết thế này : SplitFile(rptTitle As String, fileName As String, path As String) '[/B][/COLOR]
    
    i = i + 1
    
    Loop

End Sub
-----------------------------------------------------------------------------------------------------
Sub chonmayin()
Application.Dialogs(xlDialogPrinterSetup).Show
End Sub
'phai chay cai nay truoc de chon may in
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom