Chạy theo thứ tự trong mảng

Liên hệ QC

Mr Okebab

Ngon Ngất Ngây
Thành viên đã mất
Tham gia
6/8/06
Bài viết
3,260
Được thích
3,787
Mình có một mảng (1 name) gồm 1 cột, có khoảng 10.000 phần tử.

Bây giờ mình chỉ muốn làm việc (so sánh, trích lọc . . ) từ phần tử thứ 100 đến phần tử thứ 150 (từ trên xuống ) thì phải làm cách nào ?? Code ra sao.

Xin cảm ơn thật nhiều !!
 
Bác dùng Name động kết hợp với Validation (hoặc Combo Box) là được mà!
Giả sử vùng A1:A10000 là vùng dữ liệu
Nhập cận trên tại ô B1 (100 chẳng hạn)
Nhập cận dưới tại ô B2 (150 chẳng hạn)
Nhấn Insert/ Name/ Define: đặt tên là Data với công thức như sau:
Mã:
[COLOR=red][B]=OFFSET(Sheet1!$A$1:$A$10000,Sheet1!$B$1-1,0,Sheet1!$B$2-Sheet1!$B$1+1,1)[/B][/COLOR]
Ô B3 bác đặt Validation với list là Data
Bây giò bác thử thay đổi giá trị ô B1, B2 xem sao!
Hy vọng là đúng ý bác.
 
Cảm ơn nhiều nhưng không phải là như thế, chắc do mình diễn tả không rõ nghiã
VD mình có 1 bảng dữ liệu :

Mã:
            [B] A            B                C  [/B]
  1     [B]   Chứng từ     Ngày         Mã HH[/B]
  2        PN0001      1/1/07         HH002
  [COLOR=Blue]3        PN0002      2/1/07         HH002
  4        PN0002      2/1/07         HH003
  5        PN0002      2/1/07         HH004[/COLOR]
  6        PN0003      2/1/07         HH002
  7        PN0004      3/1/07         HH009
  ……………………………............................…………

Cột A được đặt Name là : DataCT
Cột B được đặt Name là :
DataNgay
Cột C được đặt Name là :
DataMaHH
Bảng được đặt Name là :
DataArray

Mình muốn trích lọc các dữ liệu theo Chứng từ :
PN0002
(Không dùng Advance Filter)


Mình biết được trong mảng DataCT có 3 phiếu
PN0002; Đứng liền nhau; Phiếu đầu tiên là phần tử số 2 trong mảng. Mình muốn dùng VBA mà không muốn tạo ra name động mới.

Tóm lại, mình muốn làm việc với 3 phần tử trên (để có thể lấy được dữ liệu ô bên cạnh, giống như ta làm việc với mảng
For each CT in range(“DataCT”) - Vòng này sẽ duyệt tất cả các phần tử trong mảng, rất mất thời gian, mình muốn phần tử đầu tiên nó duyệt đến là phần tử thứ hai ngay), cho ra số liệu sau :

Mã:
            [COLOR=Blue]PN0002          2/1/07             HH002
            PN0002          2/1/07             HH003
            PN0002          2/1/07             HH004[/COLOR]


Cảm ơn nhiều

Thân!
P/S : trong công thức
Mã:
=OFFSET(Sheet1!$A$1:$A$10000,Sheet1!$B$1-1,0,Sheet1!$B$2-Sheet1!$B$1+1,1)
Có thể sửa thành
Mã:
=OFFSET(Sheet1!$A$1,Sheet1!$B$1-1,0,Sheet1!$B$2-Sheet1!$B$1+1,1)
 
Lần chỉnh sửa cuối:
Mr Okebab đã viết:
Mình muốn dùng VBA mà không muốn tạo ra name động mới.

Nếu muốn dùng VBA liên quan đến mảng Mr.Okebab có thể sử dụng
http://home.pacbell.net/beban/
Trong đó có hàm
Mã:
Function ArrayRowFilter1(InputArray, ByVal FilterColumn As Integer, _
    FilterValue, Optional Op = "=", Optional MatchCase As Boolean = False)
    'This function returns an array of the elements in rows of an
    'array in which the value in the specified Filter Column
    'compares, as specified in the fourth argument, to the specified
    'Filter Value; if the fourth argument is omitted, the comparison
    'is equality. The filtering is case sensitive unless the fifth
    'argument is entered as False.  If the Function is called as
    'case sensitive, the comparison is determined by Option Compare
    'Binary; if not case sensitive, by Option Compare Text.

Mã:
Function ArrayRowFilter2(InputArray, FilterColumn As Integer, _
    FilterValue, Optional Op, Optional MatchCase As Boolean = False)
    'This function returns an array of the elements in rows of an
    'array in which the value in the specified Filter Column
    'compares, as specified in the fourth argument, to the specified
    'Filter Value; if the fourth argument is omitted, the comparison
    'is equality. The filtering is case sensitive unless the fifth
    'argument is entered as False.  If the Function is called as
    'case sensitive, the comparison is determined by Option Compare
    'Binary; if not case sensitive, by Option Compare Text.
Tôi cũng thường dùng module này.
From Mr OKEBAB:
Cụ thể đi bác ơi, không hiểu lắm. Bác làm theo VD trên kia cho em hiểu, chứ theo ý bác thì có mà . . . chết em (thông cảm, trình độ có hạn nhưng ham muốn lại lớn)

Cảm ơn các bác nhiều!!!


LVD

Có nghĩa là nếu bạn đưa vào một mảng và đưa vào điều kiện lọc thì hàm này sẽ trả về một mảng kết quả tương ứng.
Ví dụ:
Mã:
Sub TestArrayFilter()
    Dim OutputArr As Variant
    Dim rngRange As Range
    Set rngRange = Range("DATAARRAY")
    OutputArr = ArrayRowFilter1(rngRange, 1, "PN002")
    MsgBox "So cot cua mang la: " & UBound(OutputArr, 2) & vbCrLf & _
           "So hang cua mang ket qua la: " & UBound(OutputArr, 1), vbOKOnly, "Thong bao"
    Application.Worksheets("Sheet1").Range("OutPut") = OutputArr
End Sub
Được chưa? /-*+/

Lê Văn Duyệty
 

File đính kèm

Cảm ơn bác. Nhưng eo ôi, Code dài dã man

Em mà hiểu được thì . . . tối nay (17/06/2007) xin chết tại Thị Nghè !!

Có cách nào Ngăn ngắn không bác.

Cảm ơn thật nhiều!
 
Nếu nghiên cứu thì cần hiểu. Chứ...anh không cần hiểu. Hi Hi Hi

Lê Văn Duyệt
 
Có lẽ nếu vùng dữ liệu mà bác sắp xếp đã theo thứ tự rồi thì việc lọc ra là rất đơn giản (chỉ cần dùng các hàm của Excel như Offset, match, count... là giải quyết được thôi.
Sau đây là đoạn code chung:
Mã:
Option Explicit
Public Sub Locdulieu2()
    Range("A1:C1").Select
    Selection.AutoFilter
    Selection.AutoFilter field:=1, Criteria1:="PN002"
    
    Dim endRow As Long
    endRow = Range("A65536").End(xlUp).Row
    If endRow >= 2 Then
        Range("A2:C" & endRow).Select
        Selection.SpecialCells(xlCellTypeVisible).Select
        
        Dim rngData As Range
        Set rngData = Selection
        'Xu ly tiep cac so lieu da loc duoc trong bien rngData
        MsgBox rngData.Cells(1, 1)
        '.......
    End If
    Selection.AutoFilter
End Sub
 
Web KT

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

Back
Top Bottom