Nhờ dạy VBA bằng cách lọc những giá trị cột A nếu dương sẽ điền sang cột B (1 người xem)

  • Thread starter Thread starter trungvdb
  • Ngày gửi Ngày gửi
Liên hệ QC

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

trungvdb

Thành viên thường trực
Tham gia
22/8/08
Bài viết
374
Được thích
171
Nghề nghiệp
Tài chính
Em chưa biết gì về VBA, nhờ mọi người giúp em tiếp cận với nó bằng bài toán lọc toàn bộ những số dương (>0) từ cột A sang cột B thì Code phải viết ra sao?
 

File đính kèm

Xử lý bằng mảng:

Mã:
Private Sub CommandButton1_Click()
    'Xu ly trong mang:
    Dim iRow As Long, MyArray, MyArr
    Columns(2).ClearContents
    MyArray = Range("A1", Range("A65536").End(xlUp)).Value
    ReDim MyArr(1 To UBound(MyArray, 1), 1 To 1)
    For iRow = 1 To UBound(MyArray, 1)
        If MyArray(iRow, 1) > 0 Then MyArr(iRow, 1) = MyArray(iRow, 1)
    Next
    If IsArray(MyArr) Then Range("B1").Resize(UBound(MyArr, 1), 1).Value = MyArr
End Sub

Xử lý trực tiếp trên sheet:

Mã:
Private Sub CommandButton2_Click()
    'Xu ly tren sheet:
    Dim MyRange As Range
    Columns(2).ClearContents
    For Each MyRange In Range("A1", Range("A65536").End(xlUp))
        If MyRange.Value > 0 Then MyRange.Offset(, 1) = MyRange.Value
    Next
End Sub
 
Upvote 0
Bạn xem hướng dẫn trong file nha
 

File đính kèm

Upvote 0
Nếu em muốn kết quả cột B xếp liền với nhau (tức là không có ô trống nữa) thì làm thế nào bây giờ?
Cái này đơn giản nhất là cứ thử thao tác bằng tay sau đó ghi lại đoạn code đó.Khi đã hiểu được đoạn code đó rồi bạn có thể rút ngắn bớt đoạn tự động đó .
Thử ví dụ : Bôi đen cột B:B đó, nhấn Ctr + G , Chọn Special....--->Chọn Constants--->Nhấn Ok --->Nhấn Ctr + C --->đặt đến vị trí nào đó cần đặt
 
Upvote 0
Bắt chước Minh Thien: Muốn kết quả cột B xếp liền nhau:

Xử lý bằng mảng:

PHP:
Private Sub CommandButton1_Click()
     ''Xu ly trong mang:     
Dim iRow As Long, iCount As Long, MyArray, MyArr
     Columns(2).ClearContents
     MyArray = Range("A1", Range("A65536").End(xlUp)).Value
     ReDim ResultArr(1 To UBound(MyArray, 1), 1 To 1)
     For iRow = 1 To UBound(MyArray, 1)
         If MyArray(iRow, 1) > 0 Then iCount = iCount + 1: ResultArr(iCount, 1) = MyArray(iRow, 1)
     Next
     If iCount > 0 Then Range("B1").Resize(iCount, 1).Value = ResultArr 
End Sub

Xử lý trực tiếp trên sheet:

PHP:
Private Sub CommandButton2_Click()
    ''Xu ly tren sheet:
     Dim MyCell As Range, nR As Long
     Columns(2).ClearContents
     For Each MyCell In Range("A1", Range("A65536").End(xlUp))
         If MyCell.Value > 0 Then
              nR = [B65000].End(xlUp).Row
             Cells(nR +1, 2) = MyCell.Value
         End If
    Next 
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này đơn giản nhất là dùng AutoFilter (điều kiện >0)
Làm bằng tay cũng được mà code cũng được
PHP:
Private Sub CommandButton1_Click()
  Application.ScreenUpdating = False
  With Range([A4], [A60000].End(xlUp))
    .AutoFilter 1, ">0"
    .SpecialCells(12).Copy Range("B4")
    .AutoFilter
  End With
  Application.ScreenUpdating = True
End Sub
Quá đơn giản
 
Upvote 0
Bắt chước Minh Thien: Muốn kết quả cột B xếp liền nhau:

Xử lý bằng mảng:

PHP:
Private Sub CommandButton1_Click()
     ''Xu ly trong mang:     
Dim iRow As Long, iCount As Long, MyArray, MyArr
     Columns(2).ClearContents
     MyArray = Range("A1", Range("A65536").End(xlUp)).Value
     ReDim ResultArr(1 To UBound(MyArray, 1), 1 To 1)
     For iRow = 1 To UBound(MyArray, 1)
         If MyArray(iRow, 1) > 0 Then iCount = iCount + 1: ResultArr(iCount, 1) = MyArray(iRow, 1)
     Next
     If iCount > 0 Then Range("B1").Resize(iCount, 1).Value = ResultArr 
End Sub

Xử lý trực tiếp trên sheet:

PHP:
Private Sub CommandButton2_Click()
    ''Xu ly tren sheet:
     Dim MyCell As Range, nR As Long
     Columns(2).ClearContents
     For Each MyCell In Range("A1", Range("A65536").End(xlUp))
         If MyCell.Value > 0 Then
              nR = [B65000].End(xlUp).Row
             Cells(nR +1, 2) = MyCell.Value
         End If
    Next 
End Sub

Em làm theo mọi người trên diễn đàn: Ấn Alt+F11, sau khi vào Insert/Modul/Copy đoạn của thày vào. Nhưng kích hoạt thế nào cho nó chạy hả thày?
 
Upvote 0
Em làm theo mọi người trên diễn đàn: Ấn Alt+F11, sau khi vào Insert/Modul/Copy đoạn của thày vào. Nhưng kích hoạt thế nào cho nó chạy hả thày?

Trời, đơn giản vậy mà bạn cũng chưa làm được ư? Sau khi copy thủ tục của từng người vào module, bạn nhớ sửa lại tên sub nhé, nếu bị trùng tên sẽ báo lỗi, sau đó, muốn chạy Sub nào thì đặt con trỏ vào Sub đó rồi bấm phím F5 hoặc nút Run Macro (mũi tên nhỏ màu xanh lá cây trên Toolbar) thì nó sẽ chạy thủ tục đó.
 
Upvote 0
Câu hỏi này giống như thắc mắc của mình lúc mới bắt đầu mò mẫm code của các sư phụ trên diễn đàn. Trước tiên bạn phải đưa con trỏ lên trên khoảng trống của thanh công cụ gần chữ help, bấm buột phải và kích hoạt thanh công cụ control toolbox. Trên thanh công cụ control toolbox, bấm nút desig nmode, sau đó bấm nút command button, rồi ra màn hình vẽ 1 cái nút hinh chữ nhật. Click chuột trái vào nút này sẽ xuất hiên màn hình để viết code vào. Sau khi viết xong thì bấm nút thoát ra. Bấm vào nút designmiode để thoát chế độ này. Lúc này có thế bấm nút command button là code chay. Tuy nhiên bạn nên search trên diên đàn có rất nhiều bài viết hướng dẫn rất dễ hiểu. Chúc bạn mau tiến bộ.
 
Upvote 0
Bắt chước Minh Thien: Muốn kết quả cột B xếp liền nhau:


Xử lý trực tiếp trên sheet:

PHP:
Private Sub CommandButton2_Click()
    ''Xu ly tren sheet:
     Dim MyCell As Range, nR As Long
     Columns(2).ClearContents
     For Each MyCell In Range("A1", Range("A65536").End(xlUp))
         If MyCell.Value > 0 Then
              nR = [B65000].End(xlUp).Row
             Cells(nR +1, 2) = MyCell.Value
         End If
    Next 
End Sub

Hình như thủ tục này đã chưa gán giá trị tại B1, nên phải thêm chút xíu:

Mã:
Private Sub CommandButton1_Click()
    ''Xu ly tren sheet:
     Dim MyCell As Range, nR As Long
     Columns(2).ClearContents
     For Each MyCell In Range("A1", Range("A65536").End(xlUp))
         If MyCell.Value > 0 Then
            nR = [B65000].End(xlUp).Row
            If [COLOR=#0000cd][B][B1].Value = "" [/B][/COLOR]Then
                [COLOR=#ff0000][B]Cells(nR, 2) = MyCell.Value[/B][/COLOR]
            Else
                Cells(nR + 1, 2) = MyCell.Value
            End If
         End If
    Next
End Sub
 
Upvote 0
Hình như thủ tục này đã chưa gán giá trị tại B1, nên phải thêm chút xíu:

Mã:
            If [COLOR=#0000cd][B][B1].Value = "" [/B][/COLOR]Then
                [COLOR=#ff0000][B]Cells(nR, 2) = MyCell.Value[/B][/COLOR]
            Else
                Cells(nR + 1, 2) = MyCell.Value
            End If
Làm chi cả 1 cái If cho rắc rối sự đời:
- Thông thường dòng 1 là dòng tiêu đề. Dữ liệu bắt đầu từ dòng 2. Thậm chí dòng 7 là tiêu đề thì code này cũng tự động bắt đầu từ dòng 8.
- Thậm chí muốn gán thẳng vào B1 cũng không cần 5 dòng như trên, mà chỉ cần thế này:
PHP:
Cells(nR + IIf(nR = 1, 0, 1),2) = MyCell.Value

Hoặc dùng iCount như code dùng mảng:

PHP:
     For Each MyCell In Range("A1", Range("A65536").End(xlUp))
         If MyCell.Value > 0 Then
              iCount = iCount +1)
             Cells(iCount, 2) = MyCell.Value
         End If
    Next
 
Upvote 0
Xin cảm ơn các thày, các anh, các chị đã quan tâm, giúp đỡ em rất nhiều.

Khi bước vào học VBA em hầu như chỉ biết đến các hàm Sum, Left...nói chung là những hàm đơn giản, được các thày tận tình chỉ bảo em đã bắt đầu vận dụng được vào công việc của mình.

Em dự định dành thời gian để cố gắng học sử dụng phối hợp các hàm trong Excel như Offset, Match..., bởi em thấy cách đó bổ trợ về thuật toán VBA rất nhiều. Em có đọc một số bài trên diễn đàn, nhưng em thấy hơi lúng túng khi sử dụng nhiều hàm lồng vào nhau (đặc biệt là anh chàng Indirect...)

Kính mong các thày, các anh, các chị giúp em tiếp cận bài toán chủ đề này bằng công thức Excel thông thường với ah.

Rất kính mong nhận được sự quan tâm, giúp đỡ.
 

File đính kèm

Upvote 0
Xin cảm ơn các thày, các anh, các chị đã quan tâm, giúp đỡ em rất nhiều.

Khi bước vào học VBA em hầu như chỉ biết đến các hàm Sum, Left...nói chung là những hàm đơn giản, được các thày tận tình chỉ bảo em đã bắt đầu vận dụng được vào công việc của mình.

Em dự định dành thời gian để cố gắng học sử dụng phối hợp các hàm trong Excel như Offset, Match..., bởi em thấy cách đó bổ trợ về thuật toán VBA rất nhiều. Em có đọc một số bài trên diễn đàn, nhưng em thấy hơi lúng túng khi sử dụng nhiều hàm lồng vào nhau (đặc biệt là anh chàng Indirect...)

Kính mong các thày, các anh, các chị giúp em tiếp cận bài toán chủ đề này bằng công thức Excel thông thường với ah.

Rất kính mong nhận được sự quan tâm, giúp đỡ.
Chỉ là bài toán trích lọc có điều kiện thôi
Cách làm như sau:
1> Đặt name xác định vùng dữ liệu:
Mã:
Rng =OFFSET($A$5,,,MATCH(10^15,$A$5:$A$10000),)
2> Đặt name xác định vị trí các phần tử thỏa điều kiện:
Mã:
Pos =IF(Rng>0,ROW(INDIRECT("1:"&ROWS(Rng))),"")
3> Công thức trích lọc:
Mã:
=IF(ROWS($1:1)>COUNT(Pos),"",INDEX(Rng, SMALL(Pos, ROWS($1:1))))
--------------
Gần như bài toán trích lọc nào cũng sẽ làm theo cách này, chỉ khác ở bước 2 (tùy theo điều kiện là gì)
 
Upvote 0
Upvote 0
Em cảm ơn thày, em đọc từ hôm qua các bài, em thấy quan trọng nhất bước là Đánh dấu vị trí dữ liệu nào ta cần lấy, tuy vậy em chưa hiểu cái hàm Indirect này lắm, em có thắc mắc tại bài http://www.giaiphapexcel.com/forum/showthread.php?2211-Hỏi-nhanh-đáp-nhanh-về-công-thức/page254 ,

Kính mong thày giúp cho./.
Hỏi ngược lại: Nếu bỏ hàm INDIRECT thì trong công thức này =IF(Rng>0,ROW($1:$?),"") dấu hỏi màu đỏ sẽ được thay bằng số mấy?
Nếu nhìn bằng mắt, dữ liệu của bạn nằm tại A5:A19, tổng cộng có 15 dòng, điền số 15 vào dấu ? màu đỏ là được rồi... Nhưng vấn đề là với dữ liệu khác, làm sao ta biết được tổng số dòng chính xác = bi nhiêu?
 
Lần chỉnh sửa cuối:
Upvote 0
Hỏi ngược lại: Nếu bỏ hàm INDIRECT thì trong công thức này =IF(Rng>0,ROW($1:$?),"") dấu hỏi màu đỏ sẽ được thay bằng số mấy?
Em đã Test thử bỏ hàm Indirect thì em nhận thấy: Nếu bỏ Indirect đi thì thành phần bôi đỏ trong công thức ROW($1:$?) nó sẽ dịch chuyển tương đối, hay nói cách khác là Indirect có tác dụng đóng băng ($1:$?) lại, tựa như tham chiếu tuyệt đối vậy.

Băn khoăn của em chỉ không hiểu ở chỗ: Tại sao Row(Indirect("1:1")) = Row(1:1) ah? nghĩa là tại sao Indirect("1:1") ,--> (1:1).

Vì dòng 1 có rất nhiều ô có giá trị khác nhau thì Indirect biết lấy giá trị ô nào (và tại sao nó lại cho kết quả vậy)

(Bởi em suy ra từ tham chiếu ô đơn của hàm này, ví dụ Indirect ("A5") = A5 = GPE (nếu ô 5 đánh chữ GPE)
 
Upvote 0
Em đã Test thử bỏ hàm Indirect thì em nhận thấy: Nếu bỏ Indirect đi thì thành phần bôi đỏ trong công thức ROW($1:$?) nó sẽ dịch chuyển tương đối, hay nói cách khác là Indirect có tác dụng đóng băng ($1:$?) lại, tựa như tham chiếu tuyệt đối vậy.

Băn khoăn của em chỉ không hiểu ở chỗ: Tại sao Row(Indirect("1:1")) = Row(1:1) ah? nghĩa là tại sao Indirect("1:1") ,--> (1:1).

Vì dòng 1 có rất nhiều ô có giá trị khác nhau thì Indirect biết lấy giá trị ô nào (và tại sao nó lại cho kết quả vậy)

(Bởi em suy ra từ tham chiếu ô đơn của hàm này, ví dụ Indirect ("A5") = A5 = GPE (nếu ô 5 đánh chữ GPE)
Thì cũng giống như INDIRECT("A1") sẽ = cell A1
Giờ thí nghiệm thế này: tại 1 cell, gõ dấu = xong quét chọn nguyên dòng từ dòng bao nhiêu đến bao nhiêu tùy ý ---> Nhìn lên thanh công thức sẽ thấy Excel biểu diễn các dòng ấy theo kiểu =x:y (với x là dòng đầu, y là dòng cuối), đúng không?
Vậy INDIRECT("2:5") <===> với vùng 2:5 (toàn bộ cột)
Vậy ROW(INDIRECT("2:5")) <===> với ROW(2:5)
Thế thôi!
Tất nhiên có thể ghi rõ ROW(INDIRECT("A2:A5")) <===> với ROW(A2:A5) nhưng ở đây ta đâu cần xét cột nào đâu nên chỉ cần ghi vị trí dòng là đủ
-----------------------
Nói thêm:
- Ngay cả trong VBA cũng cho phép ghi theo kiểu này. Ví dụ MsgBox Range("2:5").Rows.Count
- Range(...) trong VBA gần như tương đương với hàm INDIRECT(...) trên sheet, tức đối số của nó luôn là dạng chuổi thể hiện địa chỉ của 1 vùng nào đó
- Trong VBA, bạn dùng Range(...) như thế nào thì trên Sheet dùng INDIRECT gần giống thế
 
Lần chỉnh sửa cuối:
Upvote 0
Xin sửa Code sai dùm tôi

Xin làm phiền các thày chút, tôi đang học cách viết Code có link đầu vào và đầu ra (vì lý do sếp bắt phải làm thế), tôi viết chạy không đúng kết quả, rất mong các thày sửa giúp cho
PHP:
Sub loc()
    Dim DL(), KQ(), Dongdau As Long, i As Long, j As Long
    Dongdau = 4
    DL = Range("A" & Dongdau & ":A19").Value
    Range("B:B").ClearContents
    ReDim KQ(1 To UBound(DL, 1), 1 To 1)
    For i = 1 To UBound(DL, 1)
        If DL(i, 1) > 0 Then
            j = j + 1
            KQ(j, 1) = "=A" & (Dongdau + i)
        End If
    Next
    [B1].Resize(j, 1).Value = KQ
End Sub
 

File đính kèm

Upvote 0
Xin làm phiền các thày chút, tôi đang học cách viết Code có link đầu vào và đầu ra (vì lý do sếp bắt phải làm thế), tôi viết chạy không đúng kết quả, rất mong các thày sửa giúp cho
PHP:
Sub loc()
    Dim DL(), KQ(), Dongdau As Long, i As Long, j As Long
    Dongdau = 4
    DL = Range("A" & Dongdau & ":A19").Value
    Range("B:B").ClearContents
    ReDim KQ(1 To UBound(DL, 1), 1 To 1)
    For i = 1 To UBound(DL, 1)
        If DL(i, 1) > 0 Then
            j = j + 1
            KQ(j, 1) = "=A" & (Dongdau + i)
        End If
    Next
    [B1].Resize(j, 1).Value = KQ
End Sub

Xin cho hỏi, bạn cần ở cột B là kết quả của cột A hay cần công thức?
 
Upvote 0
Xin cho hỏi, bạn cần ở cột B là kết quả của cột A hay cần công thức?

Thì tôi đã nói rõ ở trên rồi mà bác nghĩa, cái tôi cần là kết quả như đầu bài của Topic chỉ có điều "có thêm" kết quả đầu ra Link với đầu vào, để dễ hình dung tôi điền trước kết quả vào file đính kèm nhờ bác giúp
 

File đính kèm

Upvote 0
Thì tôi đã nói rõ ở trên rồi mà bác nghĩa, cái tôi cần là kết quả như đầu bài của Topic chỉ có điều "có thêm" kết quả đầu ra Link với đầu vào, để dễ hình dung tôi điền trước kết quả vào file đính kèm nhờ bác giúp

Sao không làm cái code này:

PHP:
Sub Test()
Dim Rng As Range, i As Long
Sheet1.Range("B:B").ClearContents
For Each Rng In Sheet1.Range("A4:A19")
    If Rng.Value > 0 Then
        i = i + 1
        Sheet1.Range("B" & i).Formula = "=" & Rng.Address(0, 0)
    End If
Next
End Sub

Còn nếu vẫn thích dùng mảng thì:

PHP:
Sub loc()
    Dim DL(), KQ(), Dongdau As Long, i As Long, j As Long
    Dongdau = 4
    DL = Sheet1.Range("A" & Dongdau & ":A19").Value
    Sheet1.Range("B:B").ClearContents
    ReDim KQ(1 To UBound(DL, 1), 1 To 1)
    j = 0
    For i = 1 To UBound(DL, 1)
        If CDbl(DL(i, 1)) > 0 Then
            j = j + 1
            KQ(j, 1) = "=A" & (Dongdau + i - 1)
        End If
    Next
    Sheet1.[B1].Resize(j, 1).Formula = KQ
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi chưa hiểu CDbl trong đoạn Code của bác là gì? Mặt khác tôi thấy dòng "=A" & (Dongdau + i - 1) bản chất nó là chuỗi rồi thì dòng
PHP:
Sheet1.[B1].Resize(j, 1).Formula = KQ
có vẻ thừa (.Formula).

Vì tôi sửa như sau vẫn ổn mà bác

PHP:
Sub loc()
    Dim DL(), KQ(), Dongdau As Long, i As Long, j As Long
    Dongdau = 4
    DL = Sheet1.Range("A" & Dongdau & ":A19").Value
    Sheet1.Range("B:B").ClearContents
    ReDim KQ(1 To UBound(DL, 1), 1 To 1)
    j = 0
    For i = 1 To UBound(DL, 1)
        If DL(i, 1) > 0 Then
            j = j + 1
            KQ(j, 1) = "=A" & (Dongdau + i - 1)
        End If
    Next
    Sheet1.[B1].Resize(j, 1) = KQ
End Sub
 
Upvote 0
Tôi chưa hiểu CDbl trong đoạn Code của bác là gì? Mặt khác tôi thấy dòng "=A" & (Dongdau + i - 1) bản chất nó là chuỗi rồi thì dòng
PHP:
Sheet1.[B1].Resize(j, 1).Formula = KQ
có vẻ thừa (.Formula).

Vì tôi sửa như sau vẫn ổn mà bác

PHP:
Sub loc()
    Dim DL(), KQ(), Dongdau As Long, i As Long, j As Long
    Dongdau = 4
    DL = Sheet1.Range("A" & Dongdau & ":A19").Value
    Sheet1.Range("B:B").ClearContents
    ReDim KQ(1 To UBound(DL, 1), 1 To 1)
    j = 0
    For i = 1 To UBound(DL, 1)
        If DL(i, 1) > 0 Then
            j = j + 1
            KQ(j, 1) = "=A" & (Dongdau + i - 1)
        End If
    Next
    Sheet1.[B1].Resize(j, 1) = KQ
End Sub

Trong code tôi nghĩ bạn nên:

1) Nếu thủ tục, macro được viết trong Module (không phải trong sheet module) thì để tham chiếu đến một địa chỉ cells trong sheet nào đó, bạn phải ghi tên sheet.

2) Vấn đề của bạn, bạn hỏi tại sao phải thêm Cdbl. Đúng là thêm vô, nhìn có vẽ dư thừa, nhưng nó là hàm loại trừ kể cả kiểu số được định dạng là kiểu chuỗi thì nó cũng chuyển lại về dạng số kiểu Double.

3) Nếu không có Formula cũng không sao, để tường minh cho nó là dạng gì ta có thể đặt (Value, Text, Fomula...), mục đích là nhằm cho Excel hiểu lẹ hơn cái nó sẽ gán vào Range thuộc kiểu gì, thay vì nó sẽ xét hàng loạt điều kiện theo kết quả sắp gán xuống thì ta đã cho nó cái key nó sẽ chụp vào đó gán xuống luôn, không cần xét nữa, tuy nó tính quá nhanh ta không thấy được, nhưng ít nhiều gì nó cũng phải chậm hơn nếu ta không ghi rõ điều kiện nó gán xuống.

Trước đây tôi thường nghĩ code ngắn gọn là tốt, giờ tôi lại nghĩ ngắn gọn chưa hẳn là tốt mà cách sắp xếp logic, code không trùng code mới tốt, còn dài dòng văn tự thì làm mất công mình gõ vào, nhưng máy lại hiểu nhanh hơn.

VD:

Điều kiện là khác rỗng ("") và lớn hơn 10 thì thường ta ghi như sau:

If DK <> "" And DK > 10 then

Thì viết dài dòng hơn 1 tí:

If DK <> "" Then
If DK > 10 Then
...
End If
End If

Nhìn ở dưới tuy là 2 lần IF nhưng tôi nghĩ nó sẽ nhanh hơn ở trên vì ở trên cùng xét cả 2 điều kiện, còn ở dưới chỉ xét rỗng trước rồi sẽ xét đến điều kiện 2.


Nói chung tất cả những cái bạn thấy có vẽ là dư thừa đó, đều có lợi cho tốc độ tính toán.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác Nghĩa rất nhiều, vì không hiểu hết nên tôi mới hỏi vậy, được bác giảng cho tôi đã hiểu ra được nhiều vấn đề.
 
Upvote 0
Tôi đang tìm hiểu phuơng thức find trong VBA, nhờ các bạn giúp tôi theo cách này để tôi hiểu rõ hơn. Xin đa tạ.
 
Upvote 0
Upvote 0
Em đang ôn công thức, tiện đây em xin Post bài làm lên

Xác định Name xác định vùng dữ liệu, điều kiện bài toán
PHP:
DL=Sheet1!$A$5:$A$19

PHP:
DK=IF(DL>0;ROW(INDIRECT("1:"&ROWS(DL)));"")

Công thức tại ô B5:

PHP:
IF(ROWS($1:1)>COUNT(DK);"";OFFSET(DL;SMALL(DK;ROWS($1:1))-1;;1;1))

Em không biết có cách nào viết gọn hơn không, kính mong các thày chỉ bảo cho.
 

File đính kèm

Upvote 0
Chỉ là bài toán trích lọc có điều kiện thôi
Cách làm như sau:
1> Đặt name xác định vùng dữ liệu:
Mã:
Rng =OFFSET($A$5,,,MATCH(10^15,$A$5:$A$10000),)
2> Đặt name xác định vị trí các phần tử thỏa điều kiện:
Mã:
Pos =IF(Rng>0,ROW(INDIRECT("1:"&ROWS(Rng))),"")
3> Công thức trích lọc:
Mã:
=IF(ROWS($1:1)>COUNT(Pos),"",INDEX(Rng, SMALL(Pos, ROWS($1:1))))
--------------
Gần như bài toán trích lọc nào cũng sẽ làm theo cách này, chỉ khác ở bước 2 (tùy theo điều kiện là gì)

Trong công thức của thày =IF(ROWS($1:1)>COUNT(Pos),"",INDEX(Rng, SMALL(Pos, ROWS($1:1)))) nếu không dùng Index mà dùng Lookup liệu có được không ah?
 
Upvote 0
Trong công thức của thày =IF(ROWS($1:1)>COUNT(Pos),"",INDEX(Rng, SMALL(Pos, ROWS($1:1)))) nếu không dùng Index mà dùng Lookup liệu có được không ah?
Lookup() mà anh đã từng biết trong một số công thức không phải để thay cho Index() mà nó dùng để Remove giá trị lỗi thôi anh ạ. Không dùng Index() sao có thể trích lọc được dữ liệu ạ? Anh thử kiểm tra lại anh nhé! Đừng áp dụng máy móc như thế có ngày bị tẩu hỏa nhập ma đó.hic hic
Thanks!
 
Upvote 0
Em chưa biết gì về VBA, nhờ mọi người giúp em tiếp cận với nó bằng bài toán lọc toàn bộ những số dương (>0) từ cột A sang cột B thì Code phải viết ra sao?

Với bài này, nếu làm thủ công tôi sẽ làm như sau:

1- Copy dữ liệu sang cột B
2- Sửa các số âm thành rỗng

Vậy code để làm 2 việc này là:
Mã:
Sub xxx()
[a:a].Copy [b1]
[b:b].Replace "-*", ""
End Sub

Cũng là VBA đấy chứ, chỉ mỗi tội nó củ chuối quá... ẹc...ẹc...
 
Upvote 0
Giúp xóa name range

Mình xin thỉnh giáo các Bạn, mình có 1 file Exell Có quá nhiều namerange mình dung VBA để xóa nhưng không được, nếu xóa bằng thủ công thì được mong các bạn giúp (dùng VBA nha)
code minh dung nè

Sub Remove_Hidden_Names()
' Dimension variables.
Dim xName As Variant ' Loop once for each name in the workbook.
For Each xName In ActiveWorkbook.Names
If xName.Visible = True Then
xName.Delete
Else 'MsgBox (xName) 'xName.Delete
ActiveCell.Value = xName
End If ActiveCell.Offset(1, 0).Select
Next xName
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom