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:
Chào tất cả mọi người. Nhờ mọi người xem giúp em đoạn code trích lọc dữ liệu theo tháng dưới đây bị sai ở đâu ạ, em nghĩ mãi mà vẫn không biết mình sai ở chỗ nào. Đoạn code của em đây ạ :
Sub trich()
Range("I3:L22").ClearContents
For i = 3 To 22
If Month(Range("B" & i).Value) = Range("O1").Value Then
Range("A" & i & ":D" & i).Copy Range("I" & i)
End If
Next i
End Sub
Em đính kèm File bên dưới luôn cho mọi người dễ hiều ạ. Em cảm ơn mọi người
Vẫn theo code của bạn, sửa lại như vậy để kết quả nhìn cho đẹp...
PHP:
Sub trich()
Dim i&, r&
r = 1
Sheet1.Range("I3:L22").Clear
For i = 3 To 22
    If Month(Sheet1.Range("B" & i).Value) = Sheet1.Range("O1").Value Then
        Sheet1.Range("A" & i & ":D" & i).Copy Sheet1.Range("I3").Offset(r - 1)
        r = r + 1
    End If
Next i
End Sub
 
Upvote 0
Vẫn là nối tiếp của bài tập bên trên. Lời giải của bài tập này em tham khảo được đoạn code trong File đính kèm dưới đây của tác giả Anhtuan1066 .

Trong đoạn code đó , có chỗ tác giả viết (dòng thứ 3 từ cuối lên) : Range("Sheet2!A9:E2000").Sort Key1:=Range("A9"), Order1:=xlAscending

Tuy nhiên em không hiểu câu lệnh trên có ngụng ý gì ? Em đã thử xóa nó đi nhưng thấy code vẫn chạy bình thường ạ. Em muốn mọi người

giải thích hộ em câu lệnh trên , tác dụng của nó để làm gì ạ.



 

File đính kèm

  • Trich_01.xls
    88 KB · Đọc: 15
Upvote 0
Để sort dữ liệu theo ngày tháng thôi (sort cột A). Không thích sort thì bỏ đi
(Nhìn lại code ngày xưa mình viết thấy mắc cười quá --=0)

Cũng nhờ cái "mắc cười ấy" mà bây giờ khối người ngồi cười vì "sung sướng" đó anh ạ! (Chắc lúc đó anh cũng sung sướng không kém --=0 như người mới học code bây giờ)
 
Upvote 0
Để sort dữ liệu theo ngày tháng thôi (sort cột A). Không thích sort thì bỏ đi
(Nhìn lại code ngày xưa mình viết thấy mắc cười quá --=0)

Có xem lại mấy bài tập toán mình làm ngày xưa chưa vậy? Hồi còn "uổng chờ tứa măm" đó.
Chắc cũng "mắc cười" lắm.
"Tuổi nhỏ làm việc nhỏ" thôi mà. Ẹc..
 
Upvote 0
Để sort dữ liệu theo ngày tháng thôi (sort cột A). Không thích sort thì bỏ đi
(Nhìn lại code ngày xưa mình viết thấy mắc cười quá --=0)

Oa..... Oa!!!! --=0 --=0. Người đó chính là chú ạ. Trên diễn đàn, vào lại các bài cũ cũ , con có được đọc nhiều bài viết của tác giả Anhtuan1066 này và thấy rất hay (con thấy khoái nhất là cái vụ dùng hàm để tách riêng các số lẫn với các ký tự khác trong 1 chuỗi, phương pháp làm quả thất là rất bá đạo :-=:-=:-= hi hi.) không ngờ hôm nay con mới biết 2 người lại là một. Thì ra tên thật của chú là chú Tuấn , hi hi..../-*+//-*+/
 
Lần chỉnh sửa cuối:
Upvote 0
Oa..... Oa!!!! --=0 --=0. Người đó chính là chú ạ. Trên diễn đàn, vào lại các bài cũ cũ , con có được đọc nhiều bài viết của tác giả Anhtuan1066 này và thấy rất hay (con thấy khoái nhất là cái vụ dùng hàm để tách riêng các số lẫn với các ký tự khác trong 1 chuỗi, phương pháp làm quả thất là rất bá đạo :-=:-=:-= hi hi.) không ngờ hôm nay con mới biết 2 người lại là một. Thì ra tên thật của chú là chú Tuấn , hi hi..../-*+//-*+/
Trời ơi, nhờ bạn mà giờ tôi mới biết là tuy 2 mà 1 đó nha! --=0--=0--=0
 
Upvote 0
Trời ơi, nhờ bạn mà giờ tôi mới biết là tuy 2 mà 1 đó nha! --=0--=0--=0

Anh Trọng Nghĩa đây tham gia diễn đàn cũng khá là lâu rồi, hơn nữa lại còn là thành viên trong BQT nữa, vậy mà giờ cũng mới biết thì chứng tỏ 1 điều hành tung của chú ndu quả thật quá bí ẩn....||||||||||||||||||||
 
Upvote 0
Bạn tham khảo cặp macro này thử coi:

PHP:
Option Explicit
Sub GPE(Sh As Worksheet)
 MsgBox Sh.Name
End Sub
Mã:
Sub Main()
 Dim ShName As String, J As Byte
 For J = 1 To 3
    GPE Worksheets("sheet" & CStr(J))
 Next J
End Sub
 
Upvote 0
Mã:
Sub abc(SH As Worksheet)
'.......................
'''''code
''''''''''
End Sub


Sub main()
Call abc(Sheet1) ' sheet1 là tên sheet trong cua so VBA
Call abc(Sheet2) ' sheet2 là tên sheet trong cua so VBA
Call abc(Sheet3) ' sheet3 là tên sheet trong cua so VBA
' xin cho hoi co cách nào goi duoc nhu the này khong
Call abc("sheet" & 1) ' chu y la lay ten sheet trong cua so VBA thoi nha
' khong lay ten sheet ben ngoai
End Sub
[B]Call abc("sheet" & 1) ' chu y la lay ten sheet trong cua so VBA thoi nha[/B]
[B]' khong lay ten sheet ben ngoai có được không?[/B]


xin cho hỏi là có cách nào làm được như trên không? xin chân thành cảm ơn

Dùng hàm CallByName
Mã:
Sub Main()
  Call abc(CallByName(ThisWorkbook.Worksheets, "Item", VbGet,[COLOR=#ff0000] "Sheet" & 1[/COLOR]))
End Sub
Chỗ màu đỏ là đối số cho bạn tùy biến
----------------------------------
Bạn tham khảo cặp macro này thử coi:

PHP:
Option Explicit
Sub GPE(Sh As Worksheet)
 MsgBox Sh.Name
End Sub
Mã:
Sub Main()
 Dim ShName As String, J As Byte
 For J = 1 To 3
    GPE Worksheets("sheet" & CStr(J))
 Next J
End Sub
Cái đối số truyền vào người ta muốn là Sheet CodeName chứ hổng phải SheetName đâu sư phụ à
 
Upvote 0
Sao em thử áp dụng vào vấn đề này nó báo lỗi anh
Call Tong_HopNHAP(CallByName(ThisWorkbook.Worksheets, "Item", VbGet, "Sheet" & 1), ARR_D, K)
anh xem dùm em module3 thử sao nha, cảm ơn anh ndu nhiều, file này áp dụng để giảng dạy
 

File đính kèm

  • NXT-2014-HL.rar
    396.8 KB · Đọc: 19
Upvote 0
Sao em thử áp dụng vào vấn đề này nó báo lỗi anh
Call Tong_HopNHAP(CallByName(ThisWorkbook.Worksheets, "Item", VbGet, "Sheet" & 1), ARR_D, K)
anh xem dùm em module3 thử sao nha, cảm ơn anh ndu nhiều, file này áp dụng để giảng dạy

Chết! Tôi sai rồi. Đối số của hàm CallByName không phải là CodeName mà là SheetName
Vậy sửa thế này:
Mã:
Sub MAIN02()
  Dim ARR_D(1 To 60000, 1 To 9)
  Dim K As Long
  K = 0
  Sheet40.Range("A6:Z10000").Clear
  [COLOR=#ff0000]Dim wkb As Workbook
  Set wkb = ThisWorkbook[/COLOR]
'For I = 1 To 34 Step 3
    Call Tong_HopNHAP([COLOR=#ff0000]wkb.Worksheets(wkb.VBProject.VBComponents([B]"Sheet" & 1[/B]).Properties("Name").Value)[/COLOR], ARR_D, K)
'Next
'Sheet40.Range("a6").Resize(K, 9) = ARR_D
End Sub
Chỗ màu đỏ là thêm vào và sửa lại
-------------
Vậy bài 311 cũng phải sửa lại:
Mã:
Sub Main()
  [COLOR=#ff0000]Dim wkb As Workbook
  Set wkb = ThisWorkbook[/COLOR]
  Call abc([COLOR=#ff0000]wkb.Worksheets(wkb.VBProject.VBComponents([B]"Sheet" & 1[/B]).Properties("Name").Value)[/COLOR])
End Sub
Xin lỗi vì sơ suất khi thử nghiệm trên file mới mà không để ý SheetName y chang CodeName (nên có nhầm lẫn)
 
Upvote 0
Anh ndu có thể sửa trực tiếp lên file của bài 312 cho mọi người học hỏi nha, cảm ơn anh ndu nhiều
Thử với cái này xem:

Mã:
Function SheetName(ByVal Wb As Workbook, ByVal CodeName As String) As String
    SheetName = Wb.VBProject.VBComponents(CodeName).Properties("Name").Value
End Function


Sub TestIt()
    Dim St As String
    Dim Wb As Workbook
    Dim Ws As Worksheet
    
    Set Wb = ActiveWorkbook


    St = "sheet1"


    MsgBox SheetName(Wb, St)
    
    Set Ws = Wb.Sheets(SheetName(Wb, St))
End Sub
 
Upvote 0

Như đã nói ở đây:
http://www.giaiphapexcel.com/forum/...n-code-vào-một-trang-tính&p=671850#post671850
Liên quan đến việc truy cập vào môi trường VBA ta phải check mục "Trust access to the VBA project object model" trong Excel Options (cái này tưởng bạn đã biết rồi chứ)
 
Upvote 0
Code lọc các giá trị khác nhau

Xin chào tất cả mọi thành viên GPE. Nhờ mọi người xem giúp em đoạn Code sau tại sao chạy không ra đúng kết quả vậy. Đề bài là lọc

ra những người có tên ở cột A nhưng không có tên ở cột B, kết quả sẽ được hiển thị tại cột C. Em xin chân thành cảm ơn !
 

File đính kèm

  • vietdo.xls
    30 KB · Đọc: 16
Upvote 0
trong code bạn viết bị thiếu 1 dòng
Mã:
cou = 0
bạn tìm chỗ nhét nó đi
 
Upvote 0
Xin chào tất cả mọi thành viên GPE. Nhờ mọi người xem giúp em đoạn Code sau tại sao chạy không ra đúng kết quả vậy. Đề bài là lọc

ra những người có tên ở cột A nhưng không có tên ở cột B, kết quả sẽ được hiển thị tại cột C. Em xin chân thành cảm ơn !
Thêm câu lệnh cou = 0 dưới hàng For..next đầu tiên (For i = 2 To 13) thử xem sao nhé
 
Upvote 0
Ok. Được rồi anh nhé. Cho câu lệnh đó vào giữa For i và For j. Nhưng mà cái này em tưởng nếu mình không gán giá trị ban đầu cho nó là

bao nhiêu thì nó tự lấy giá trị bằng 0. Anh doveandrove giải thích cho em với được không.
Khi i=1 thì cou=0+1=1
Vậy khi i=2 thì theo bạn i =? luôn >0 là chắc chắn nên kết quả của bạn có 1 giá trị duy nhất
 
Upvote 0
Web KT
Back
Top Bottom