Trang 3/13 đầuđầu 1 2 3 4 5 6 7 ... cuốicuối
Hiển thị kết quả tìm kiếm từ 21 đến 30 trên tổng số: 126

Ðề tài: Xin viết dùng mã vba thay thế cho hàm vlookup

  1. Trích Nguyên văn bởi tiendo1988 View Post
    BÁc ndu96081631 Hướng dẫn cụ thể cách thêm For Each Clls in Target như thế nào?
    “...có thể dùng Array để tăng tốc bảng tính” : bác gúp em và mọi người đoạn code để học hỏi thêm.
    Nhờ bác cùng các Pro tùy biến giúp bài của em bên Topic Cần hướng dẫn và trợ giúp về sử dụng Vlookup trong VBA excel!

    Xin cảm ơn!
    Làm thử trên file của bạn nhé:
    Mô tả:
    - Nhập liệu tại cột C
    - Cột D, E, G, H, I và N là những cột cần lookup
    - Vậy, nếu nhập liệu 1 hoặc nhiều cell trên cột C thì những cột D, E, G, H, I và N với dòng tương ứng sẽ lấy dữ liệu từ sheet LLNV gán vào
    - Nếu 1 hoặc nhiều cell trên 1 C bị xóa thì thì những cột D, E, G, H, I và N với dòng tương ứng cũng sẽ bị xóa theo
    Mô tả đúng chứ?
    Nếu là vậy thì tôi để xuất code thế này:
    1> Nạp Dictionary
    PHP Code:
    Public Chk As BooleanDic As ObjectaResult()
    Sub Auto_Open()
      
    Dim wks As WorksheetSrcRng As RangesArray
      Dim lR 
    As LongAs LongAs Longtmp
      On Error Resume Next
      Set wks 
    Sheets("LLNV")
      
    Set SrcRng wks.Range("B6:R1000")
      
    sArray SrcRng.Value
      ReDim aResult
    (1 To UBound(sArray1), 1 To UBound(sArray2))
      
    Set Dic CreateObject("Scripting.Dictionary")
      For 
    1 To UBound(sArray1)
        If 
    CStr(sArray(i1)) <> "" Then
          tmp 
    sArray(i1)
          If 
    Not Dic.Exists(tmpThen
            lR 
    lR 1
            Dic
    .Add tmplR
            aResult
    (lR1) = tmp
            aResult
    (lR2) = sArray(i2)
            
    aResult(lR3) = sArray(i3)
            
    aResult(lR5) = sArray(i5)
            
    aResult(lR6) = sArray(i6)
            
    aResult(lR14) = sArray(i14)
            
    aResult(lR13) = sArray(i13)
          
    End If
        
    End If
      
    Next
    End Sub 
    2> Theo dỏi những thay đổi tại Sheet LLNV (để cập nhật lại Dictionary)
    PHP Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
      
    Chk True
    End Sub 
    PHP Code:
    Private Sub Worksheet_Deactivate()
      If 
    Chk Then
        Auto_Open
        Chk 
    False
      End 
    If
    End Sub 
    3> Nhập liệu và fill dữ liệu tại sheet ChiTiet
    PHP Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
      
    Dim rTarget As RangeaTargetAs LongAs Long
      Dim Arr1
    (), Arr2(), Arr3(), tmp
      On Error Resume Next
      
    If Dic Is Nothing Then Auto_Open
      
    If Not Intersect(Range("C6:C1000"), TargetIs Nothing Then
        Set rTarget 
    Intersect(Range("C6:C1000"), Target)
        If 
    IsArray(rTarget.ValueThen
          aTarget 
    rTarget.Value
        
    Else
          
    ReDim aTarget(1 To 11 To 1)
          
    aTarget(11) = rTarget.Value
        End 
    If
        
    ReDim Arr1(1 To UBound(aTarget1), 1 To 2)
        
    ReDim Arr2(1 To UBound(aTarget1), 1 To 3)
        
    ReDim Arr3(1 To UBound(aTarget1), 1 To 1)
        For 
    1 To UBound(aTarget1)
          If 
    aTarget(i1) <> "" Then
            tmp 
    aTarget(i1)
            If 
    Dic.Exists(tmpThen
              Arr1
    (i1) = aResult(Dic.Item(tmp), 2)
              
    Arr1(i2) = aResult(Dic.Item(tmp), 3)
              
    Arr2(i1) = aResult(Dic.Item(tmp), 5)
              
    Arr2(i2) = aResult(Dic.Item(tmp), 6)
              
    Arr2(i3) = aResult(Dic.Item(tmp), 14)
              
    Arr3(i1) = aResult(Dic.Item(tmp), 13)
            
    End If
          
    End If
        
    Next
        rTarget
    .Offset(, 1).Resize(, 2).Value Arr1
        rTarget
    .Offset(, 4).Resize(, 3).Value Arr2
        rTarget
    .Offset(, 11).Resize(, 1).Value Arr3
      End 
    If
    End Sub 
    Xem file đính kèm và thí nghiệm nhé ---> Có gì sơ sót, ta bàn tiếp
    (Nói thiệt, làm mấy bài này chán bỏ xừ... lại hại não)
    Tập tin đính kèm Tập tin đính kèm
    thay đổi nội dung bởi: ndu96081631, 14-04-12 lúc 02:15 PM

  2. Cám ơn bác ndu96081631, em d
    em đang xem, nếu có gì em không hiểu hay cần giúp đỡ thêm mong bác và các AE giúp đỡ.
    Chúc bác và mọi người sức khỏe!

  3. #23
    Trích Nguyên văn bởi ndu96081631 View Post
    Nguyên văn bởi siwtom Tôi thấy có vẻ nhiều người hơi lạm dụng Dictionary. Dictionary mạnh và không dễ thay thế được trong một vài trường hợp không có nghĩa là nó tốt cho mọi trường hợp. Tỏi nếu nấu với món "này" thì tuyệt nhưng không có nghĩa là nấu món nào cũng cho tỏi. Không phải mổ trâu, lợn, gà, bóc tỏi, gọt táo đều dùng dao mổ trâu. Lợi thì chắc không mà hại thì nhiều.
    Sửa một chút code trên thành
    .
    Đây chính là lúc dùng đến Dictionary nè!
    Tuy nhiên, nếu khéo hơn thì ta chỉ tạo và nạp Dictionary 1 lần duy nhất (nếu Dictionary chưa được tạo) ---> Những lần sau đó của sự kiện Change, chỉ việc "vào" Dic "moi" ra xài thôi
    Bạn có để ý là tôi góp ý cho bài của bạn concogia chứ không phải trả lời bạn chủ topic?
    Nếu tôi trả lời trực tiếp chủ topic thì dĩ nhiên code đề xuất là của tôi, nhưng tôi chỉ muốn góp ý với bạn concogia mà thôi.
    Bạn concogia có viết: "Code trên là viết theo đề bài của bạn hoangvinh_tb". Tức chỉ viết cho vấn đề của chủ topic. Tôi thấy là để làm cái việc mà bạn concogia định làm thì không cần Dictionary. Tôi không khẳng định là để làm cái việc mà chủ topic định làm thì không cần dùng Dictionary. Nếu bạn concogia dùng Dictionary nhưng với code khác thì đã chắc gì tôi góp ý. Tôi không đề xuất cách giải quyết vấn đề của chủ topic, tôi góp ý cho người cụ thể, cho code cụ thể đáp ứng yêu cầu cụ thể bạn ạ. Rõ ràng là để làm cái việc mà code của concogia làm cho yêu cầu cụ thể thì chả cần gì tới Dictionary. Bạn trả lời người khác và dùng Dictionary nhưng tôi không có ý định góp ý vì tôi thấy nó hợp lý. Còn concogia dùng Dictionary trong code cụ thể ấy không hợp lý nên tôi góp ý. Không ai phê phán chuyện dùng Dictonary nhưng sau khi viết code thì nên xem lại xem liệu với cách làm việc như thế thì Dictionary có cần không. Vì rất có thể để làm y nguyên việc như thế không làm ÍT hơn và cũng không NHIỀU hơn thì có thể thay bằng code mới không dùng dictionary.

  4. Trích Nguyên văn bởi siwtom View Post
    Tôi thấy có vẻ nhiều người hơi lạm dụng Dictionary. Dictionary mạnh và không dễ thay thế được trong một vài trường hợp không có nghĩa là nó tốt cho mọi trường hợp. Tỏi nếu nấu với món "này" thì tuyệt nhưng không có nghĩa là nấu món nào cũng cho tỏi. Không phải mổ trâu, lợn, gà, bóc tỏi, gọt táo đều dùng dao mổ trâu. Lợi thì chắc không mà hại thì nhiều.
    Sửa một chút code trên thành

    Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim I, Vung, Ws
        Set Ws = Sheets("MA")
        Vung = Ws.Range(Ws.[B3], Ws.[B10000].End(xlUp)).Resize(, 4)
        If Not Intersect(Target, Range("B4:B1000")) Is Nothing Then
            If Target.Count = 1 Then
                For I = 1 To UBound(Vung)
                    If Vung(I, 1) = Ucase(Target.Value) Then
                        Target.Offset(, 1) = Vung(I, 2)
                        Target.Offset(, 2) = Vung(I, 3)
                        Target.Offset(, 5) = Vung(I, 4)
                        Exit For
                    End If
                Next I
            End If
        End If
    End Sub
    nếu tôi không lầm thì code tốt hơn. Trong trường hợp xấu nhất thì cũng chỉ phải duyệt (FOR) tất cả các dòng của Vung, còn trong trường hợp tốt nhất thì chỉ duyệt có 1 dòng. Dùng Dictionary như trên luôn phải duyệt tất cả các dòng, rồi với mỗi dòng đó làm "động tác" d.Add ... (thừa)
    Nếu số dòng không phải là "vài" mà là "mấy trăm" (mã không phải là A --> Z mà là vd. wxyz) thì chắc chắn code dùng Dictionary như trên sẽ làm nhiều việc hơn, lâu hơn.
    Híc, hôm nay mình mới đọc được bài này. Ý của bạn siwtom cũng đúng thôi, thật ra bài này mình muốn thử Item của Dictionary là một Array xem nó như thế nào, xử lý nó có linh hoạt không thôi (trước kia mình hay gom vào một cục, khi xử lý thì dùng Split tách nó ra, sau khi đọc bài của bạn Kyo mình mới biết Item có thể là một Array _ vì toàn mò mẫm tự học_ ) chứ với đề bài trên & dữ liệu không thật lớn thì dùng Find ( bài của chị Hải Yến) hoặc chơi cùi bắp hơn thì dùng Match thì khỏi phải " Pho với Phiếc", "Đít-to với Đít-bé" chi cho rách việc
    Thân ái

  5. #25
    Trích Nguyên văn bởi concogia View Post
    Híc, hôm nay mình mới đọc được bài này. Ý của bạn siwtom cũng đúng thôi, thật ra bài này mình muốn thử Item của Dictionary là một Array xem nó như thế nào, xử lý nó có linh hoạt không thôi (trước kia mình hay gom vào một cục, khi xử lý thì dùng Split tách nó ra, sau khi đọc bài của bạn Kyo mình mới biết Item có thể là một Array _ vì toàn mò mẫm tự học_ ) chứ với đề bài trên & dữ liệu không thật lớn thì dùng Find ( bài của chị Hải Yến) hoặc chơi cùi bắp hơn thì dùng Match thì khỏi phải " Pho với Phiếc", "Đít-to với Đít-bé" chi cho rách việc
    Thân ái
    Góp ý cũng chỉ là để lưu ý thôi.
    Bạn nói rất đúng. Nhiều khi có thể viết một code tổng quát cho việc của mình rồi bất cứ trường hợp cụ thể nào cũng gọi cái code tổng quát kia nhưng như thế không tối ưu. Nếu nhu cầu của mình cụ thể thì có thể viết code cho trường hợp đó thì sẽ hay hơn. Tôi góp ý cho code cụ thể của bạn nhưng thực chất tôi muốn một điều khác. Có những người chập chững bước vào lập trình. Nếu ta biết thì ta giúp họ phân tích code để hiểu và có thể tối ưu nó. Hoặc nói về một trường hợp khác. Ai đó có một code và hỏi: sao em chạy code mà nó không làm theo ý muốn? Anh A trả lời: Bạn dùng code ở dưới của tôi nhé, chạy vù vù, tối ưu. Anh B nói: Bạn sai ở chỗ này, chỗ này. Anh A đưa ra được code tối ưu, giải quyết được vấn đề cần làm của người hỏi nhưng chỉ thế thôi. Anh B có thể biết viết code tối ưu hơn của người hỏi nhưng anh ta đặt cho mình mục đích khác với mục đích của anh A. Anh ta phân tích code của người hỏi và chỉ ra những chỗ sai. Như thế người hỏi sẽ biết mình sai chỗ nào để trong tương lai không mắc phải nữa. Mục đích của A và B là khác nhau. Rất có thể tôi sẽ là B vì mục đích tôi chọn khác với A

  6. Rất cám ơn anh ndu96081631 đã giúp đỡ về code.
    Do kiến thức của em về Code VBA quá hạn chế nên từ chiều đến giờ em ngồi xem code của bác và tìm cách để lookup những cột còn lại (K, L, M, O) mà em chưa làm được. mong anh chỉ cho.
    ở trong Sheet ChiTiet, cột N (cột THƯỜNG TRÚ) hình như anh lookup nhầm cột "Nơi cấp" thì phải. anh sửa lại code giúp em nhé.

    Nếu em có nhiều Sheet tương tự cần Lookup từ Sheet LLNV, mỗi Sheet có số cột cần lookup khác nhau và chỉ số cột cần lookup cũng khác nhau. Để có thể vận dụng code của anh vào những sheet này thì em cần lưu ý và thay đổi những chỗ nào trong code để đạt được yêu cầu lookup của các Sheet.

    Rất mong anh ndu96081631 cùng các Pro trên GPE hướng dẫn thêm.

  7. #27
    Trích Nguyên văn bởi tiendo1988 View Post
    Rất cám ơn anh ndu96081631 đã giúp đỡ về code.
    Do kiến thức của em về Code VBA quá hạn chế nên từ chiều đến giờ em ngồi xem code của bác và tìm cách để lookup những cột còn lại (K, L, M, O) mà em chưa làm được. mong anh chỉ cho.
    ở trong Sheet ChiTiet, cột N (cột THƯỜNG TRÚ) hình như anh lookup nhầm cột "Nơi cấp" thì phải. anh sửa lại code giúp em nhé.

    Nếu em có nhiều Sheet tương tự cần Lookup từ Sheet LLNV, mỗi Sheet có số cột cần lookup khác nhau và chỉ số cột cần lookup cũng khác nhau. Để có thể vận dụng code của anh vào những sheet này thì em cần lưu ý và thay đổi những chỗ nào trong code để đạt được yêu cầu lookup của các Sheet.

    Rất mong anh ndu96081631 cùng các Pro trên GPE hướng dẫn thêm.
    Kiến thức của tôi cũng vô cùng hạn chế nhưng tôi mạo muội có ý kiến. Tôi thấy đoạn
    Code:
    If IsArray(rTarget.Value) Then
          aTarget = rTarget.Value
    Else
          ReDim aTarget(1 To 1, 1 To 1)
          aTarget(1, 1) = rTarget.Value
    End If
    có vẻ chưa ổn lắm. Đểm kiểm nghiệm ta thử như sau:
    Nếu vd. ND chọn xóa 1 ô ở cột C hoặc một loạt ô ở các dòng liên tiếp thì không sao. Nhưng nếu chọn vài ô không ở các dòng lên tiếp - tức từ "ô đầu" tới "ô cuối" có ô không được chọn để xóa thì code làm không theo ý muốn.
    Nếu tôi nhầm lẫn thì xin thứ lỗi cho. Tôi chỉ muốn là nếu cảm nhận của tôi là đúng thì ai dùng cứ dùng nhưng phải ý thức được điều đó.

  8. Trích Nguyên văn bởi siwtom View Post
    Kiến thức của tôi cũng vô cùng hạn chế nhưng tôi mạo muội có ý kiến. Tôi thấy đoạn
    Code:
    If IsArray(rTarget.Value) Then
          aTarget = rTarget.Value
    Else
          ReDim aTarget(1 To 1, 1 To 1)
          aTarget(1, 1) = rTarget.Value
    End If
    có vẻ chưa ổn lắm. Đểm kiểm nghiệm ta thử như sau:
    Nếu vd. ND chọn xóa 1 ô ở cột C hoặc một loạt ô ở các dòng liên tiếp thì không sao. Nhưng nếu chọn vài ô không ở các dòng lên tiếp - tức từ "ô đầu" tới "ô cuối" có ô không được chọn để xóa thì code làm không theo ý muốn.
    Nếu tôi nhầm lẫn thì xin thứ lỗi cho. Tôi chỉ muốn là nếu cảm nhận của tôi là đúng thì ai dùng cứ dùng nhưng phải ý thức được điều đó.
    Ah... cái đoạn code đó không liên quan gì đến vấn đề bạn nói cả... Chẳng qua nếu chuyển toàn bộ sang Array thì phải lưu ý xem Target có phải là 1 cell hay không (nếu Target gồm nhiều cell thì Target.Value là 1 Array nhưng nếu Target là 1 cell thì Target.Value không phải là Array)
    Còn vấn đề bạn vừa nói thật ra giải quyết nó cũng không có vấn đề gì... Có điều nếu chuyển mọi thứ sang xử lý mảng thì hơi rắc rối chút ----> Dạng Array trong Array đấy mà
    Để từ từ tôi nghiên cứu thêm việc này
    Cảm ơn bạn đã nhắc nhở!

  9. Trích Nguyên văn bởi tiendo1988 View Post
    Rất cám ơn anh ndu96081631 đã giúp đỡ về code.
    Do kiến thức của em về Code VBA quá hạn chế nên từ chiều đến giờ em ngồi xem code của bác và tìm cách để lookup những cột còn lại (K, L, M, O) mà em chưa làm được. mong anh chỉ cho.
    ở trong Sheet ChiTiet, cột N (cột THƯỜNG TRÚ) hình như anh lookup nhầm cột "Nơi cấp" thì phải. anh sửa lại code giúp em nhé.

    Nếu em có nhiều Sheet tương tự cần Lookup từ Sheet LLNV, mỗi Sheet có số cột cần lookup khác nhau và chỉ số cột cần lookup cũng khác nhau. Để có thể vận dụng code của anh vào những sheet này thì em cần lưu ý và thay đổi những chỗ nào trong code để đạt được yêu cầu lookup của các Sheet.

    Rất mong anh ndu96081631 cùng các Pro trên GPE hướng dẫn thêm.
    Thật ra nếu bạn để ý các chỉ số trong code sẽ đoán được đang lookup ở cột nào
    Ví dụ:
    Arr3(i, 3) = aResult(Dic.Item(tmp), 11) ---> Lookup cột 11
    Tại sao lại có Arr1, Arr2Arr3 ---> Vì Sheet ChiTiet các vùng cần lookup nằm không liền nhau: Cột D và E là 1 vùng, cột G, H, I là 1 vùng, cột N là 1 vùng (vị chi có 3 vùng, tương ứng với 3 Array sẽ gán vào)
    Cái thằng Arr3 lúc trước chỉ gán cho 1 cột (cột N)... Giờ bạn thêm cột K, L, M, O ---> Các cột này cùng với cọt N tạo thành 1 vùng liên tục, vậy cho nó vào Arr3 luôn (5 cột)
    Code sửa lại như sau:
    PHP Code:
    Public Chk As BooleanDic As ObjectaResult()
    Sub Auto_Open()
      
    Dim wks As WorksheetSrcRng As RangesArray
      Dim lR 
    As LongAs LongAs LongAs Longtmp
      On Error Resume Next
      Set wks 
    Sheets("LLNV")
      
    Set SrcRng wks.Range("B6:R1000")
      
    sArray SrcRng.Value
      ReDim aResult
    (1 To UBound(sArray1), 1 To UBound(sArray2))
      
    Set Dic CreateObject("Scripting.Dictionary")
      For 
    1 To UBound(sArray1)
        If 
    CStr(sArray(i1)) <> "" Then
          tmp 
    sArray(i1)
          If 
    Not Dic.Exists(tmpThen
            lR 
    lR 1
            Dic
    .Add tmplR
            
    For 1 To 17
              aResult
    (lRj) = sArray(ij)
            
    Next
          End 
    If
        
    End If
      
    Next
    End Sub 
    và:
    PHP Code:
    Private Sub Worksheet_Change(ByVal Target As Range)
      
    Dim rTarget As RangeaTargetAs LongAs Long
      Dim Arr1
    (), Arr2(), Arr3(), tmp
      On Error Resume Next
      
    If Dic Is Nothing Then Auto_Open
      
    If Not Intersect(Range("C6:C1000"), TargetIs Nothing Then
        Set rTarget 
    Intersect(Range("C6:C1000"), Target)
        If 
    IsArray(rTarget.ValueThen
          aTarget 
    rTarget.Value
        
    Else
          
    ReDim aTarget(1 To 11 To 1)
          
    aTarget(11) = rTarget.Value
        End 
    If
        
    ReDim Arr1(1 To UBound(aTarget1), 1 To 2)
        
    ReDim Arr2(1 To UBound(aTarget1), 1 To 3)
        
    ReDim Arr3(1 To UBound(aTarget1), 1 To 5)
        For 
    1 To UBound(aTarget1)
          If 
    aTarget(i1) <> "" Then
            tmp 
    aTarget(i1)
            If 
    Dic.Exists(tmpThen
              Arr1
    (i1) = aResult(Dic.Item(tmp), 2)
              
    Arr1(i2) = aResult(Dic.Item(tmp), 3)
              
    Arr2(i1) = aResult(Dic.Item(tmp), 5)
              
    Arr2(i2) = aResult(Dic.Item(tmp), 6)
              
    Arr2(i3) = aResult(Dic.Item(tmp), 14)
              
    Arr3(i1) = aResult(Dic.Item(tmp), 7)
              
    Arr3(i2) = aResult(Dic.Item(tmp), 8)
              
    Arr3(i3) = aResult(Dic.Item(tmp), 11)
              
    Arr3(i4) = aResult(Dic.Item(tmp), 15)
              
    Arr3(i5) = aResult(Dic.Item(tmp), 4)
            
    End If
          
    End If
        
    Next
        rTarget
    .Offset(, 1).Resize(, 2).Value Arr1
        rTarget
    .Offset(, 4).Resize(, 3).Value Arr2
        rTarget
    .Offset(, 8).Resize(, 5).Value Arr3
      End 
    If
    End Sub 
    Các code khác giữ nguyên
    Kiểm tra lại, trục trặc gì ta sẽ bàn tiếp
    Tập tin đính kèm Tập tin đính kèm

  10. #30
    Trích Nguyên văn bởi ndu96081631 View Post
    Ah... cái đoạn code đó không liên quan gì đến vấn đề bạn nói cả... Chẳng qua nếu chuyển toàn bộ sang Array thì phải lưu ý xem Target có phải là 1 cell hay không (nếu Target gồm nhiều cell thì Target.Value là 1 Array nhưng nếu Target là 1 cell thì Target.Value không phải là Array)
    Còn vấn đề bạn vừa nói thật ra giải quyết nó cũng không có vấn đề gì... Có điều nếu chuyển mọi thứ sang xử lý mảng thì hơi rắc rối chút ----> Dạng Array trong Array đấy mà
    Để từ từ tôi nghiên cứu thêm việc này
    Cảm ơn bạn đã nhắc nhở!
    Tôi nghĩ là có liên quan. Với nghĩa là có thể phải thay nó bằng đoạn code khác, vì kiểm tra như thế dẫn tới việc đoạn code tiếp theo làm việc không đúng.
    Không biết bạn có đọc kỹ bài của tôi không.
    Thứ nhất tôi đọc code (của bạn hay code nào khác) thì tôi hiểu ý đồ của người lập trình và tại sao lại muốn làm thế. Thứ hai: tôi thấy các code còn lại nhìn có vẻ đúng nên tôi nghi ngờ
    Code:
    If IsArray(rTarget.Value) Then
          aTarget = rTarget.Value
    Else
          ReDim aTarget(1 To 1, 1 To 1)
          aTarget(1, 1) = rTarget.Value
    End If
    Mà nghi cũng phải thôi, tiếp theo tôi sẽ viết về nó. Chỗ này tôi muốn lưu ý. Bạn viết: "nếu Target gồm nhiều cell thì Target.Value là 1 Array". Chỗ này không chính xác (tôi không nói là không đúng, chỉ nói là không chính xác, hay nói khác đi thì "cũng còn tùy"). Ở dưới tôi sẽ viết.
    Thứ ba tôi viết: "Nhưng nếu chọn vài ô không ở các dòng lên tiếp - tức từ "ô đầu" tới "ô cuối" có ô không được chọn để xóa thì code làm không theo ý muốn".
    Bạn hãy chọn trong cột C 2 ô liên tiếp, bỏ 1 ô sau đó chọn 99 ô nữa (liên tiếp hay không không cần), tổng cộng 101 ô. Lúc này IsArray(rTarget.Value) = TRUE, và UBound(aTarget, 1) (dùng trong FOR) bằng ........... 2. Tôi hiểu là chỉ 2 ô đầu liên tiếp được tính, 99 ô sau coi như là mất. Nhưng thậm chí 2 dòng có 2 ô đầu này không được xóa, chứng tỏ code
    Code:
    rTarget.Offset(, 1).Resize(, 2).Value = Arr1
    rTarget.Offset(, 4).Resize(, 3).Value = Arr2
    rTarget.Offset(, 8).Resize(, 5).Value = Arr3
    không thực hiện.
    Trong trường hợp này
    Code:
    If aTarget(i, 1) <> "" Then
    End If
    không được thực hiện vì các ô đã xóa là rỗng, chứng tỏ Arr1, Arr2, Arr3 chứa các giá trị rỗng. Nhưng 2 dòng đầu không được xóa điều này chứng tỏ cụm "rTarget.Offset ... " không thực hiện đúng.
    Bây giờ ta chỉ chọn 1 ô, sau đó bỏ 1 ô, tiếp theo chọn 100 ô rồi xóa. Có 101 ô chọn nhưng IsArray(rTarget.Value) = FALSE. Tôi hiểu do chỉ tính ô đầu. Cái tôi viết "cũng còn tùy" chính là đây - so sánh 2 trường hợp chọn 101 ô

Trang 3/13 đầuđầu 1 2 3 4 5 6 7 ... cuốicuối

Thông tin về chủ đề này

Users Browsing this Thread

Hiện có 1 người đang xem đề tài này. (0 thành viên và 1 khách)

Bookmarks

Bookmarks

Quyền Sử Dụng Ở Diễn Ðàn

  • Bạn không thể đăng đề tài mới
  • Bạn không thể đăng trả lời
  • Bạn không thể đăng file đính kèm.
  • Bạn không thể sửa bài viết.
  •