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:
||||| hay thiệt đó, Thầy có thể giải thích đoạn code trên được không ạ, ví dụ như cái rng & bChk là cái gì vậy ạ,thực sự em ko hiểu về nó

Đầu tiên là biến bChk, tôi khai báo nó dang Boolean, có nghĩa là nó chỉ có 2 giá trị TRUE hoặc FALSE
Biến này dùng để "lật" đổi trạng thái: Cứ 1 lần Filter <> rổng thì đến 1 lần ShowAll. Nó "lật" được là nhờ dòng code bChk = Not bChk (bấm lần 1, bChk biến thành TRUE, bấm lần 2, bChk biến thành FALSE và cứ thế....)
----------------------
Tiếp theo là biến rng, tôi khai báo nó dạng Range, có nghĩa là rng chính là 1 vùng nào đó trên bảng tính
Ở đây tôi Set rng = Sheet1.AutoFilter.Range có nghĩa là trên Sheet1, chổ nào có chứa AutoFilter thì tôi set rng chính là chổ đó (mà không cần phải ghỉ rõ C5:E10 gì cả)
 
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE

Thì bạn cứ chọn sheet đó, rồi mở properties ra, sửa lại tại mục Name thôi, miễn đừng trùng tên là được.
 
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE
Trong cửa sổ VBA, ta chỉ có thể:
- Đổi Sheet CodeName tại mục (Name)
- Đổi SheetName tai mục Name


Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thích vẽ kiểu gì cứ vẽ, sau đó Assign Macro cho sub dưới đây là được:
Mã:
Public bChk As Boolean
Sub Main()
  Dim rng As Range
  On Error Resume Next
  Set rng = Sheet1.AutoFilter.Range
  If Not rng Is Nothing Then
    bChk = Not bChk
    If bChk Then rng.AutoFilter 3, ">0" Else rng.AutoFilter 3
  End If
End Sub
-------------
Ngoài lề: Mô tả vấn đề khó đến vậy sao? Vấn đề của bạn chỉ cần mô tả 1 câu là đủ: LỌC 1 CỘT VỚI ĐIỀU KIỆN KHÁC RỔNG
Thế thôi

Nếu chỉ điều kiện khác rỗng thôi thì như vầy sẽ ổn hơn:

Range("C5:E10").AutoFilter 3, "<>"

Nhưng vừa khác rỗng, vừa khác 0 thì như sau:

Range("C5:E10").AutoFilter 3, "<>", xlAnd, "<>0"

Bởi vì đó là cột số liệu, mà số liệu đôi khi nhỏ hơn 0, nếu ta đặt điều kiện >0 thì vô hình chung nó "kill" luôn những giá trị âm và 0.

Theo em nghĩ là vậy.
 
Upvote 0
Nhờ anh em giải thích dùm ý nghĩa 2 dòng code bên dưới với. chi tiết càng tốt để mình có thế hiểu và áp dụng rộng hơn!
Range("A2:A" & [A65000].End(xlUp).Row).Resize(, [A1].End(xlToRight).Column).Copy
Range("A65000").End(xlUp).Select

* bạn có thể hiểu Range là một đối tuợng dùng để tham chiếu 1 vùng dữ liệu trên bảng tính :
ví dụ : range("A1 :A3") là vùng dữ liệu từ ô A1:A3 (<---- nếu bạn biết về hàm indirect trong excel thì range cũng gần gần như thế)

* End(xlup),end(xltoright) giống hệt như khi bạn ấn phím end + phím mũi tên lên trên hoặc sang phải trên bàn phím

* Row,Column trả về vị trí hàng và cột của 1 ô trên bảng tính : vd Range("A3").row = 3
*Resize : mở rộng , kéo dãn vùng tham chiếu : vdu : range("A1").resize(,2) sẽ được vùng tham chiếu là A1:B1

Nắm được các thuộc tính trên thì bạn sẽ "mổ xẻ " được dòng code ngay :
ví dụ :
Range("A2:A" & [A65000].End(xlUp).Row) :
+
[A65000].End(xlUp).Row: tương đương vơi việc bạn chọn ô A65000 trên bảng tính , xong rồi ấn phím End + mũi tên lên trên---> kết quả sẽ trả về ô chứa dữ liệu cuối cùng trong cột A ( tính từ trên xuống) ,và thuộc tính .Row sẽ trả về số hàng của ô này trong bảng tính
ví dụ : cột A có dữ liệu từ ô A2 đến ô A100
*[A65000].End(xlUp).Row =100
*Range("A2:A" & [A65000].End(xlUp).Row) = Range("A2:A" &100) = Range("A2:A100") thế thôi, câu lênh này đơn giản chỉ là chọn đúng vùng chứa dữ liệu trong cột A thôi
==> các vấn đề còn lại bạn tự mổ xẻ tiếp nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE

Không hiểu ý bạn là muốn đổi codeName hay chỉ là name thôi : ví dụ Sheet1(sheet1) : vùng "đo đỏ " là codename, còn trong ngoặc là Name ( xem ảnh minh họa tại #63 -tác giả Ndu )
Còn code thì là vậy :
Mã:
Sub Macro1()
    Sheets("Sheet5").Name = "Sheet6"
    ThisWorkbook.VBProject.VBComponents.Item("sheet5").Name = "sheet6"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh em giải thích dùm ý nghĩa 2 dòng code bên dưới với. chi tiết càng tốt để mình có thế hiểu và áp dụng rộng hơn!
PHP:
1
Range("A2:A" & [A65000].End(xlUp).Row).Resize(, [A1].End(xlToRight).Column).Copy
Mã:
[B]2[/B] Range("A65000").End(xlUp).Select

(1)

Đầu tiên là cụm từ:
[A65000].End(xlUp).Row

Nhìn vô đây, ta biết tác giả đang viết code xài cho E2003 vì số dòng trang tính tối đa hơn 65000 cỡ vài chục dòng;
[A65000].End(xlUp) là fương thức tìm ô có chứa dữ liệu cuối cùng thuộc cột 'A'

(Nói thêm(NT): Nếu CSDL của bạn là chuẩn, ta nên dùng fương thức [A9].End(xlDown); Mà tại sao là [A9] bạn tự tìm hiểu nha!)

Vậy là toàn cụm từ trên giúp ta tìm ra được dòng cuối của cột 'A' có dữ liệu

Thứ đến là cụm Range("A2:A" & [A65000].End(xlUp).Row)

Cái này để xác định 1 vùng thuộc cột 'A' có chứa dử liệu

(NT: Nếu dữ liệu của bạn chỉ đến dòng 99, thì
ta tạm hiểu rằng Range("A2:A" & [A65000].End(xlUp).Row) là vùng từ A2:A99)

Kế tiếp là cụm từ [A1].End(xlToRight)

Đây là fương thức tìm ô cuối cùng của dòng 1 có dữ liệu


Vậy là toàn bộ câu lệnh sẽ để xác định vùng cần Copy, đó là vùng bắt đầu từ [A1]
Với số dòng là dòng cuối của cột 'A' có chứa dữ liệu
& với số cột là cột cuối của dòng 1 có dữ liệu;

(NT: Nếu CSDL của bạn là chuẩn, ta thay toàn bộ những fiền muộn vừa nghe bằng câu lệnh sau:

[B2].CurrentRegion.Copy

(2)

Đó là tác giả ra lệnh cho VBA chọn ô mà ta đã đề cập bên trên


Mong hữu ích ít nhiều cho bạn & NT: Bạn có thể tìm hiểu các fương thức này trên diễn đàn bằng thừ khóa tương ứng.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Trong cửa sổ VBA, ta chỉ có thể:
- Đổi Sheet CodeName tại mục (Name)
- Đổi SheetName tai mục Name
Thầy có thể hướng dẫn mở cái bảng để đổi tên được không ạ, cái này ảo quá, tìm mãi ko ra, hic trước có lần mở đc, khi mà mới mở cửa sổ lên thì nó hiện, nhưng sau khi đóng rồi ko biết lấy ra từ đâu thanks !$@!!
 
Upvote 0
Thầy có thể hướng dẫn mở cái bảng để đổi tên được không ạ, cái này ảo quá, tìm mãi ko ra, hic trước có lần mở đc, khi mà mới mở cửa sổ lên thì nó hiện, nhưng sau khi đóng rồi ko biết lấy ra từ đâu thanks !$@!!
Nhấn Alt + F11 để mở cửa sổ VBE. Nhấn tiếp F4 để mở cửa sổ Properties.
 
Upvote 0
Loay ha loay hoay em nghịch cái gì bây h nó không cho lưu bất cứ cái gì trong VBA, nhấn F4 cũng không ra cửa sổ đó, híc teo huyền tèo
untitled.JPG
Nhờ anh chị xem và sửa giúp em ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Loay ha loay hoay em nghịch cái gì bây h nó không cho lưu bất cứ cái gì trong VBA, nhấn F4 cũng không ra cửa sổ đó, híc teo huyền tèo
View attachment 107115
Nhờ anh chị xem và sửa giúp em ạ

Cái này là hộp thoại thông báo : nếu save dưới dạng xlsx thì sẽ mất hết code trong moude > Do đó bạn phải chọn no,và save as dưới định dạng khác, như là xlsm.
 
Upvote 0
File quản lý kho chạy quá chậm

Dear Các cao Thủ
Em vừa mầy mò làm dc 1 file quản lý kho để phục vụ công việc. Ban đầu "Em ấy" chạy rất luột là nhưng không hiểu sao khi copy dữ liệu với số lượng lớn( >1000 dòng). là "em nó" cứ quay tít ngủ không chịu chạy. hic hic
EM post file nên đây mong các cao thủ giúp EM xem có cách nào làm cho nó chạy luột hơn không ạh.
 

File đính kèm

  • File quan ly kho( vật tư)111.7z
    431.8 KB · Đọc: 82
Upvote 0
Cái này là hộp thoại thông báo : nếu save dưới dạng xlsx thì sẽ mất hết code trong moude > Do đó bạn phải chọn no,và save as dưới định dạng khác, như là xlsm.
Dạ nhưng tại sao nó lại mất code ạ, em ko biết lý do vì sao, hay là xlsx của em nó bị sao ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Các cao Thủ
Em vừa mầy mò làm dc 1 file quản lý kho để phục vụ công việc. Ban đầu "Em ấy" chạy rất luột là nhưng không hiểu sao khi copy dữ liệu với số lượng lớn( >1000 dòng). là "em nó" cứ quay tít ngủ không chịu chạy. hic hic
EM post file nên đây mong các cao thủ giúp EM xem có cách nào làm cho nó chạy luột hơn không ạh.

Không biết khái niệm "chạy luột" cua bạn có nghĩa gì.

Tôi nghĩ bạn nên tách ra từng phần để nhờ giúp đỡ và khi khỏi cần phải mô tả rõ ràng dữ liệu đầu vào như thế nào, mục đích của bạn là gì... Không có nhiều người đủ kiên nhẫn và thời gian để dịch ngược từ code của bạn ra mục đích và từ mục đích đó viết lại code nhất là khi bạn đưa nguyên cả file mà không hề mô tả một tí gì. Ngoài ra, chắc gì code của bạn đã thực hiện đúng ý đồ của bạn.
 
Upvote 0
Dạ nhưng tại sao nó lại mất code ạ, em ko biết lý do vì sao, hay là xlsx của em nó bị sao ạ

Định dạng file xlsx không cho lưu macro (có lẽ là để phòng ngừa virus cho người sử dụng). Vì vậy, khi lưu file với định dạng xlsx thì toàn một Macro trên file đó (nếu có) sẽ bị xóa hết đó là chuyện bình thường chứ máy bạn không bị gì cả. Tuy nhiên khi lưu file xlsx mà có Macro thì Excel có hỏi bạn có muốn save mà xóa Macro hay không. Bạn nên tập thói quen đọc kỹ khi có thông báo lạ, đừng click Yes hay No theo quán tính.
 
Upvote 0
Định dạng file xlsx không cho lưu macro (có lẽ là để phòng ngừa virus cho người sử dụng). Vì vậy, khi lưu file với định dạng xlsx thì toàn một Macro trên file đó (nếu có) sẽ bị xóa hết đó là chuyện bình thường chứ máy bạn không bị gì cả. Tuy nhiên khi lưu file xlsx mà có Macro thì Excel có hỏi bạn có muốn save mà xóa Macro hay không. Bạn nên tập thói quen đọc kỹ khi có thông báo lạ, đừng click Yes hay No theo quán tính.
Dạ vâng nhưng trong trường hợp này thì tại sao xlsx lại không thể lưu được macro, và cách giải quyết nó để xlsx có thể lưu. Vấn đề của em là như vậy ạ
 
Upvote 0
Dạ vâng nhưng trong trường hợp này thì tại sao xlsx lại không thể lưu được macro, và cách giải quyết nó để xlsx có thể lưu. Vấn đề của em là như vậy ạ

File .xlsx không cho lưu Macro là do Excel quy định như vậy. Nếu muốn lưu Macro thì bạn hãy lưu file với định dạng .xls (dùng cho Excel 2003 trở lên) hoặc .xlsm (dùng cho Excel 2007 trở lên).
 
Upvote 0
File .xlsx không cho lưu Macro là do Excel quy định như vậy. Nếu muốn lưu Macro thì bạn hãy lưu file với định dạng .xls (dùng cho Excel 2003 trở lên) hoặc .xlsm (dùng cho Excel 2007 trở lên).
Thanks anh, từ trước giờ em cứ ngĩ mọi xlsx có thể lưu mcr, :)
 
Upvote 0
Không biết khái niệm "chạy luột" cua bạn có nghĩa gì.

Tôi nghĩ bạn nên tách ra từng phần để nhờ giúp đỡ và khi khỏi cần phải mô tả rõ ràng dữ liệu đầu vào như thế nào, mục đích của bạn là gì... Không có nhiều người đủ kiên nhẫn và thời gian để dịch ngược từ code của bạn ra mục đích và từ mục đích đó viết lại code nhất là khi bạn đưa nguyên cả file mà không hề mô tả một tí gì. Ngoài ra, chắc gì code của bạn đã thực hiện đúng ý đồ của bạn.

TKS bác đã nhắc nhở vây cho Em hỏi 1 trường hợp cụ thể sau: chắc bác nhìn vào Code là biết đây là code cập nhật dữ liệu.
vậy bác cho EM hỏi Đoạn code này có thể rút ngắn hơn không?hay thay thế bàng 1code khác mà vẫn có tác dụng như code cũ.
vi theo EM biết có nhiều cách để lưu dữ liệu sang sheet khá nhưng em chỉ biết mỗi cách này thôi

Sub Macro1()


' Macro1 Macro
'


'


Sheets("nhap xuat hang").Select
a = Range("k6").Value
b = Range("e5").Value
c = Range("e8").Value
d = Range("i8").Value
e = Range("e9").Value
no = Range("i6").Value
co = Range("i7").Value
f = Range("e10").Value
g = Range("i10").Value
h = Range("e53").Value
j = Range("k62").Value
k = Range("h62").Value
L = Range("e62").Value
m = Range("c62").Value
Range("d14:k48").Copy
Sheets("TH xuat nhap").Select
n = Range("A1").Value
Range("B1").Select
ActiveCell.Offset(n + 3, -1).Value = a
ActiveCell.Offset(n + 3, 0).Value = b
ActiveCell.Offset(n + 3, 1).Value = c
ActiveCell.Offset(n + 3, 2).Value = d
ActiveCell.Offset(n + 3, 3).Value = no
ActiveCell.Offset(n + 3, 4).Value = co
ActiveCell.Offset(n + 3, 5).Value = e
ActiveCell.Offset(n + 3, 6).Value = f
ActiveCell.Offset(n + 3, 7).Value = g
ActiveCell.Offset(n + 3, 8).Value = h
ActiveCell.Offset(n + 3, 17).Value = j
ActiveCell.Offset(n + 3, 18).Value = k
ActiveCell.Offset(n + 3, 19).Value = L
ActiveCell.Offset(n + 3, 20).Value = m
ActiveCell.Offset(n + 3, 9).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("TH xuat nhap").Select
Range("K4:K1219").Copy
Sheets("DMVT").Select
Range("B6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Range("$B$6:$B$1221").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveWorkbook.Worksheets("DMVT").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DMVT").AutoFilter.Sort.SortFields.Add Key:=Range( _
"B4:B1214"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DMVT").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Sheets("nhap xuat hang").Select
Application.CutCopyMode = False
Range("e5").Select
Selection.ClearContents
Range("d14:k48").Select
Selection.ClearContents
Range("i6:i7").Select
Selection.ClearContents
Range("e3").Select
End Sub
 
Upvote 0
TKS bác đã nhắc nhở vây cho Em hỏi 1 trường hợp cụ thể sau: chắc bác nhìn vào Code là biết đây là code cập nhật dữ liệu.
vậy bác cho EM hỏi Đoạn code này có thể rút ngắn hơn không?hay thay thế bàng 1code khác mà vẫn có tác dụng như code cũ.
vi theo EM biết có nhiều cách để lưu dữ liệu sang sheet khá nhưng em chỉ biết mỗi cách này thôi
Sub Macro1()
...........
Sheets("nhap xuat hang").Select
a = Range("k6").Value
......................
Bạn muốn làm gì thì đưa file lên và nói rõ yêu cầu, kết quả cần có, người khác viết code giúp bạn, có lẽ còn đỡ "chóng mặt" hơn là cố đọc và hiểu trong macro hàng trăm dòng của bạn muốn làm cái gì.
 
Upvote 0
Web KT
Back
Top Bottom