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:
Sheet B2 không có code thì đương nhiên không có tác dụng gì là đúng rồi. Bạn sử dụng code sau cho sheet B2 nhé:
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Intersect(Target, [F11:F43]) Is Nothing Then Exit Sub
For Each Cll In Intersect(Target, [F11:F43])
Cll.Resize(, 12).Borders.LineStyle = (Cll <> "")
Next
End Sub[/GPECODE]

CODE của anh NghĩaPhúc ngắn gọn quá !
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Cám ơn Bạn Khuongvietphong và Anh Nghĩa Phúc.
Nếu như đường kẻ em chon theo mầu. VD mầu xanh bất kỳ. A/C chỉnh thêm giúp Em.

Trong Code của mình chỗ ColorIndex bạn cho nó giá trị bằng 4 là được, còn của anh Phúc thì mình chưa biết chỉnh thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Bạn Khuongvietphong và Anh Nghĩa Phúc.
Nếu như đường kẻ em chon theo mầu. VD mầu xanh bất kỳ. A/C chỉnh thêm giúp Em.
Bạn có thể thêm câu lệnh này vào trong vòng For:
Mã:
If Cll <> "" Then Cll.Resize(, 12).Borders.ColorIndex = 5
Để tham khảo thêm về giá trị tương ứng với các màu (thay cho số 5 ở câu lệnh trên), bạn có thể chạy code này, nên chọn 1 sheet trống trước khi chạy code:
[GPECODE=vb]Sub Test()
Dim i As Long
For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Next
End Sub[/GPECODE]
 
Upvote 0
Mình mù tịt về vba, mình có ví dụ dưới đây, ai biết giúp mình với, xin chân thành cảm ơn!
 
Upvote 0
Hiện tại cột C em đang sử dụng name "MatHang" và cột F em đang sử dụng name "ThanhTien"

Nếu sử dụng name như hiện tại như của Em. Nếu dữ liệu nhiều thì mỗi lần cập nhập dữ liệu file thường tính toán rất chậm.

Em nhờ A/C giúp Em viết code lấy mặt hàng cho cột C và tính Thành tiền cho cột F. Khi viết A/C giúp Em lấy công thức tính toán theo name có sẵn của Em (bởi vì nếu lắp name có sẵn của em vào trong code thì sẽ tiện cho em hơn với các trường hợp khác để ứng dụng. Công thức theo code nhiều cái em chưa hiểu)

A/C giúp em để code ở sự kiện worksheetchange. Em cám ơn A/C!
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    16.9 KB · Đọc: 6
  • Codename.xls
    35 KB · Đọc: 6
Upvote 0
Hiện tại cột C em đang sử dụng name "MatHang" và cột F em đang sử dụng name "ThanhTien"

Nếu sử dụng name như hiện tại như của Em. Nếu dữ liệu nhiều thì mỗi lần cập nhập dữ liệu file thường tính toán rất chậm.

Em nhờ A/C giúp Em viết code lấy mặt hàng cho cột C và tính Thành tiền cho cột F. Khi viết A/C giúp Em lấy công thức tính toán theo name có sẵn của Em (bởi vì nếu lắp name có sẵn của em vào trong code thì sẽ tiện cho em hơn với các trường hợp khác để ứng dụng. Công thức theo code nhiều cái em chưa hiểu)

A/C giúp em để code ở sự kiện worksheetchange. Em cám ơn A/C!

thật tiếc là tôi không biết sử dụng name vào code !$@!!!$@!!, nếu gặp tôi thì tôi viết thẳng code vào sự kiện Change mà không thông qua name nào hết , nên chắc bạn chờ thành viên khác .
 
Upvote 0
thật tiếc là tôi không biết sử dụng name vào code !$@!!!$@!!, nếu gặp tôi thì tôi viết thẳng code vào sự kiện Change mà không thông qua name nào hết , nên chắc bạn chờ thành viên khác .
Thay vì ghi range("c1:C...") thì mình có thể ghi name tương tự, range("tên name")
 
Upvote 0
Xin anh(chị) cho biết tại sao khi nhập đúng mã rồi mà nó vẫn hiện lên hộp thông báo MsgBox vậy. Thậm chí em đã cho cả câu lệnh Exit Sub vàorồi mà sao nó vẫn không được vậy.
 

File đính kèm

  • Hoi.xls
    37.5 KB · Đọc: 11
Upvote 0
Xin anh(chị) cho biết tại sao khi nhập đúng mã rồi mà nó vẫn hiện lên hộp thông báo MsgBox vậy. Thậm chí em đã cho cả câu lệnh Exit Sub vàorồi mà sao nó vẫn không được vậy.

Đồng chí đổi MsgBox "No Ma" thành MsgBox dem

Rồi nhập vài mã và Test thử xem, rồi ngồi nghiệm tí xíu là có kết quả ngay...--=0--=0--=0
 
Upvote 0
Bạn không tạm ngưng sự kiện chnage cho nên code chạy 2 lần
 
Upvote 0
Em có dùng macro để copy các name ở dòng đầu tiên của 1 vùng công thức, để dán xuống các dòng phía dưới (dạng công thức). Rồi lại copy và pase lại (dạng giá trị). Để nhằm giảm công thức quá nhiều cho file. Hiện tại Em chưa viết được code cho các công thức đang dùng. Nên tạm thời thực hiện copy pase theo cách này. A/C xem giúp Em đoạn code ở dưới xem có thể tối ưu được hơn ko. Và có thể rút ngắn lại và giúp cho code nhanh hơn thì tuyệt. Mong A/C giúp Em. Cám ơn A/C nhiều!

Sub NXT ()
'Mở Protect
ActiveSheet.Unprotect

'Clear fillter - Nếu đang fillter copy pase sẽ lỗi
ActiveSheet.ShowAllData

'Chọn dòng I10 tới T10 là dòng có name và thực hiện lệnh copy
Range("I10:T10").Select
Selection.Copy

'Chọn vùng cần dán kết quả tử I11 tới T11. thực hiện pase name (dạng công thức)
Range("I11:T11").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.PasteSpecial Paste:=xlPasteFormulas

'Thực hiện lệnh copy rồi pase value
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues

'Ở cột H thực hiện fillter để lọc những dòng có dữ liệu
ActiveSheet.Range("$H$9:$T$509").AutoFilter Field:=1, Criteria1:="<>"

'Sau khi thực hiện các lệnh ở trên xong thì Protec sheet lại
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingColumns:=True, AllowFiltering:=True

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em ngồi chỉnh lại code như sau. Mong A/C chỉ bảo Em. Cám ơn A/C nhiều!

Sub PasteNameNXTKho()
ActiveSheet.ShowAllData
Range("E10:p10").Copy
Range("E11:p498").PasteSpecial Paste:=xlPasteFormulas
Range("E11:p498").Copy
Range("E11:p498").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
ActiveSheet.Range("$D$9:$P$509").AutoFilter Field:=1, Criteria1:="<>"
Calculate
Range("E11").Select
End Sub
Sub NXT ()
'Clear fillter - Sử dụng để bỏ chế độ đang fillter ở một cột nào đó (Nếu đang fillter mà thực hiện copy paste sẽ lỗi)
ActiveSheet.ShowAllData
'Chọn dòng I10 tới T10 là dòng có name và thực hiện lệnh copy
Range("E10:p10").Copy
'Chọn vùng cần dán kết quả tử E11 tới P498. thực hiện paste name (dạng công thức)
Range("E11:p498").PasteSpecial Paste:=xlPasteFormulas
'Thực hiện lệnh copy vùng vừa dán name (dạng công thức). và paste lại dạng giá trị
Range("E11:p498").Copy
Range("E11:p498").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'Ở cột H dùng để lọc những dòng có dữ liệu
ActiveSheet.Range("$H$9:$T$509").AutoFilter Field:=1, Criteria1:="<>"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em ngồi chỉnh lại code như sau. Mong A/C chỉ bảo Em. Cám ơn A/C nhiều!

Sub NXT ()
'Clear fillter - Sử dụng để bỏ chế độ đang fillter ở một cột nào đó (Nếu đang fillter mà thực hiện copy paste sẽ lỗi)
ActiveSheet.ShowAllData
'Chọn dòng I10 tới T10 là dòng có name và thực hiện lệnh copy
Range("E10:p10").Copy
'Chọn vùng cần dán kết quả tử E11 tới P498. thực hiện paste name (dạng công thức)
Range("E11:p498").PasteSpecial Paste:=xlPasteFormulas
'Thực hiện lệnh copy vùng vừa dán name (dạng công thức). và paste lại dạng giá trị
Range("E11:p498").Copy
Range("E11:p498").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'Ở cột H dùng để lọc những dòng có dữ liệu
ActiveSheet.Range("$H$9:$T$509").AutoFilter Field:=1, Criteria1:="<>"
End Sub
ActiveSheet.ShowAllData : Bị lỗi khi không Filter cột nào.
Thêm bẫy lỗi: If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
-------------------------------------------------

Range("E11:p498").Copy
Range("E11:p498").PasteSpecial Paste:=xlPasteValues
Có thể thay bằng:
Range("E11:p498").Value=Range("E11:p498").Value
 
Lần chỉnh sửa cuối:
Upvote 0
ActiveSheet.ShowAllData : Bị lỗi khi không Filter cột nào.
Thêm bẫy lỗi: If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
-------------------------------------------------

Range("E11:p498").Copy
Range("E11:p498").PasteSpecial Paste:=xlPasteValues
Có thể thay bằng:
Range("E11:p498").Value=Range("E11:p498").Value

Em cám ơn Anh Bate. Hôm qua Em cũng đang định hỏi cách dùng IF vào nếu ko có cột nào fillter thì bỏ qua. Nhưng lại ngại nên thôi. hi' .... Cám ơn Anh!
 
Upvote 0
Em cho thêm cái If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
Khi chạy thì nó báo lỗi như sau:
Compile error:
End If without block If

A/C xem giúp Em lỗi này với ạ.

Sub NXTKho()
On Error Resume Next
If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
Range("E3:p3").Copy
Range("E10:p348").PasteSpecial Paste:=xlPasteFormulas
Range("E10:p348").Value = Range("E10:p348").Value
ActiveSheet.Range("$D$9:$D$350").AutoFilter Field:=1, Criteria1:="<>"
End If
End Sub
 
Upvote 0
Web KT
Back
Top Bottom