Chuyên đề giải đáp những thắc mắc về code VBA (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

  • 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:
    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

    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

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

    Đúng rồi ! Cái này em đúng là bị NGU quá mà +-+-+-++-+-+-++-+-+-++-+-+-+ Khi mình Next i đi thì biến cou sẽ lấy giá trị cũ của nó từ vòng lặp trước làm giá trị ban đầu nên biến cou đâu còn bằng 0 nữa. Cảm ơn anh nhiều ạ....--=0--=0--=0
     
    Lần chỉnh sửa cuối:
    Upvote 0
    vì chưa bao giờ làm việc trên file text nên chưa hiểu rõ cách làm việc với nó như thế nào? mong các thành viên giúp đỡ, vấn đề như sau, tôi có rất nhiều file text, bây giờ muốn tổng hợp tất cả các file text đó vào 1 file excel, với mỗi sheet tương ứng là 1 file text, tôi có đính kèm file mẫu, xin được sự giúp đỡ của các bạn, xin chân thành cảm ơn
    http://www.mediafire.com/download/qt0bk9ab38xw0jd/CHUYEN_FILE_TEXT_VAO_EXCEL.rar

    Lấy dữ liệu từ file text thì được rồi nhưng sao phần tô màu linh tinh vậy? 3 sheet mà tô màu chẳng giống nhau tí nào
     
    Upvote 0
    Không cần tô màu đâu anh

    Cho hết đống code này vào 1 Module nhé:
    Mã:
    Function SheetExists(ByVal SheetName As String) As Boolean
      On Error Resume Next
      SheetExists = Not Sheets(SheetName) Is Nothing
    End Function
    Private Sub ImportTextFile(ByVal FilePath As String, ByVal Target As Range)
      With Target.Parent.QueryTables.Add("TEXT;" & FilePath, Target)
        .TextFileTabDelimiter = True
        .Refresh False
      End With
    End Sub
    Sub Main()
      Dim vFiles, fileItem, wks As Worksheet
      Dim SheetName As String, FilePath As String
      vFiles = Application.GetOpenFilename("Text Files, *.txt", , , , True)
      If IsArray(vFiles) Then
        For Each fileItem In vFiles
          FilePath = CStr(fileItem)
          SheetName = Mid(FilePath, InStrRev(FilePath, "\") + 1)
          SheetName = Left(SheetName, Len(SheetName) - 4)
          If Not SheetExists(SheetName) Then Worksheets.Add(After:=Sheets(Sheets.Count)).Name = SheetName
          Set wks = Worksheets(SheetName)
          wks.UsedRange.Clear
          ImportTextFile FilePath, wks.Range("A1")
        Next
      End If
    End Sub
    Xong, chay sub Main và xem kết quả
    Phần format (tô màu, kẻ khung...) bạn có thể làm bằng tay hoặc bằng code tùy ý
    ---------------------
    Lưu ý: Khi chạy code từ lần thứ 2 trở đi thì nó sẽ xóa dữ liệu cũ, đè lên bằng dữ liệu mới
     

    File đính kèm

    Upvote 0
    E chào các AC trong diễn đàn. Nhờ các AC xem giúp em đoạn code không cho nhấp chuột phải tại 1 Picture, e thử mà k thấy nó hoạt động ạ. E xin cảm ơn !
     

    File đính kèm

    Upvote 0
    Upvote 0
    E chào các AC trong diễn đàn. Nhờ các AC xem giúp em đoạn code không cho nhấp chuột phải tại 1 Picture, e thử mà k thấy nó hoạt động ạ. E xin cảm ơn !

    Bạn đang dùng code:
    Mã:
    Sub Worksheet_BeforeRightClick([COLOR=#ff0000]ByVal Target As Range[/COLOR], Cancel As Boolean) 
    ''......................
    End Sub
    Chú ý chỗ màu đỏ: Đối số Target thuộc Range. Vậy nên code này chỉ có tác dụng trên Range và đương nhiên chẳng có tác dụng gì với các đối tượng Shape, Picture...
     
    Upvote 0
    Bạn đang dùng code:
    Mã:
    Sub Worksheet_BeforeRightClick([COLOR=#ff0000]ByVal Target As Range[/COLOR], Cancel As Boolean) 
    ''......................
    End Sub
    Chú ý chỗ màu đỏ: Đối số Target thuộc Range. Vậy nên code này chỉ có tác dụng trên Range và đương nhiên chẳng có tác dụng gì với các đối tượng Shape, Picture...
    Vâng e sẽ nghiên cứu thêm về các đối số này, chúc thầy 1 ngày mới tốt lành :)
     
    Upvote 0
    có nên trả lời cho anh này không ta ? hi hi
    cộng dồn số lượng được mà không cộng dồn số lần được là sao ta
    dArr(.Item(Tmp), 7) = dArr(.Item(Tmp), 7) + 1
     
    Upvote 0
    Bác giúp phát đi. (mới bước vào con đường Dic mà, vì thấy nó thật hay, và nhiều cái tiện, nhưng chưa hiểu được các thuộc tính của nó lắm).
    Đọc Dic chỉ thấy mỗi cái Dic.Count nên nó cộng cả cục. Hông biết làm sao cộng đồn từng Item ...hichic)(&&@@
    nhìn cho kỹ đi nha . banh con mắt lên mà nhìn #335 đi
     
    Upvote 0
    Web KT

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

    Back
    Top Bottom