Tìm các mục còn thiếu từ danh sách các số liên tiếp trong một cột?


5

Tôi có một bảng Excel chứa kết quả của 66000 trường hợp thử nghiệm. Hoặc ít nhất nó phải...

Bây giờ, vì tôi đang chạy thử nghiệm không đồng bộ và liên tục dừng và bắt đầu, tôi có tầm nhìn xa để đảm bảo số lượng thử nghiệm được đưa vào đầu ra. Bây giờ, khi đã sử dụng tính năng Xóa Bản sao của Excel 2007 dựa trên các số kiểm tra đó, tôi thấy tôi có 65997 hàng dữ liệu. Vì vậy, ba trong số họ bị mất tích.

Công việc ở đây là xác định vị trí các số nhiệm vụ còn thiếu.

Các số kiểm tra nằm trong cột A, theo thứ tự tăng dần và được đảm bảo không có sự trùng lặp. Các dữ liệu khác được đặt trong các cột khác và chúng phải được giữ nguyên với số kiểm tra của chúng.

  |    A
--+---------
1 | testNum
2 | 1
3 | 2
4 | 3
5 | ...

Giả sử có quá nhiều trường hợp thử nghiệm để thực hiện tìm kiếm này theo cách thủ công , vì tôi có một bộ dữ liệu khác gần hơn với một triệu mục mà tôi sẽ phải thực hiện một công việc tương tự sớm.

Tôi có thể giải quyết vấn đề này với VBA, nhưng tự hỏi liệu có một giải pháp đơn giản hơn mà tôi đang thiếu không?


IMO, VBA phương pháp chuyển tiếp thẳng. Bạn không cần phải nhảy qua 10 hộp thoại và nhấp vào 5 hộp kiểm để hoàn thành nó. Chỉ loại.
Surfasb

Một công thức sẽ làm việc quá, mà không cần bất kỳ nhấp chuột. Xem câu trả lời của tôi dưới đây.
kopischke

Câu trả lời:


5

Giả sử dữ liệu của bạn ở Cột A và bắt đầu ở hàng 2, hãy chọn một phạm vi trong một cột miễn phí bắt đầu từ hàng 2 và bao gồm ít nhất là nhiều hàng bạn sẽ có kết quả (điều này rất quan trọng: nếu phạm vi của bạn bao gồm ít ô hơn tổng số của bạn trình tự, danh sách các kết quả bị thiếu sẽ bị cắt ngắn) 1 . Trong thanh công thức - không trực tiếp trong các ô! - chèn công thức sau:

=IFERROR(
   SMALL(
     IF(
       ISNA(MATCH(ROW(A1:A66000)-1,A2:A66001,0)),
       ROW(A1:A66000)-1,
     ""),
   ROW()-1),
 "")

- lưu ý điều này cần phải được viết trên một dòng ; sự thụt lề chỉ là để dễ đọc ở đây. Lưu trữ nó như là một công thức mảng bằng cách nhấn Ctrl+Shift+Enter. Nếu bạn đã làm điều này một cách chính xác, công thức sẽ hiển thị kèm theo trong dấu ngoặc nhọn và Excel sẽ khiếu nại khi bạn cố gắng chỉnh sửa các ô đơn trong phạm vi mảng.

Đối với các giá trị trong cột A của ảnh chụp màn hình bên dưới, công thức được lưu dưới dạng công thức mảng trong B2:B21(20 hàng vì chuỗi hoàn chỉnh sẽ là 1 đến 20) sẽ trả về các giá trị sau trong cột B:

Ảnh chụp màn hình danh sách công thức của các giá trị bị thiếu trong một chuỗi

Như bạn có thể thấy, đây là những con số bị thiếu trong chuỗi (được tô sáng trong ảnh chụp màn hình).


  1. bạn có thể sai về phía hào phóng khi chọn phạm vi để áp dụng miễn là ROW(A1:AXXXXX)tham chiếu bao gồm chính xác một số hàng bằng tổng chuỗi của bạn (do đó, 66000 hàng trong ví dụ của bạn A1:A66000).

Điều này hoạt động, +1 và đánh dấu. Tuy nhiên , một cảnh báo cho tất cả những người cố gắng sử dụng điều này; phép tính rất chậm trên tập dữ liệu cỡ 66000 của tôi, chúng tôi sẽ nói vài phút để bốn ô của công thức mảng trả về cho tôi ba số trường hợp kiểm tra bị thiếu của tôi. Tuy nhiên, tôi muốn bỏ công thức và kiểm tra email của mình, v.v. trong khi Excel nhai một lõi CPU trong vài phút hơn là làm bằng tay, vì vậy Win!. Ngoài ra, bạn có thể (như tôi đã làm) làm điều này một ô tại một thời điểm, thay vì thông qua một phạm vi lớn. Với tốc độ chậm, có lẽ tôi muốn giới thiệu phương pháp này.
DMA57361

Yup, hiệu suất của các công thức mảng rất tệ trên các tập dữ liệu lớn. Tuy nhiên, đây là một hoạt động được thực hiện một lần và được thực hiện, tôi nghĩ rằng điều đó có thể chấp nhận được (đáng lẽ phải thêm từ chối trách nhiệm, tho).
kopischke

3

Trong một cột trống (giả sử Z) bắt đầu từ hàng 2, hãy đặt một công thức và sao chép xuống cho tất cả các hàng đã sử dụng

=A2=A1+1

Tìm kiếm trong cột Zcho FALSE. sẽ tìm bài kiểm tra trên hàng sau khi thiếu số

Ngoài ra bạn có thể thử

= NẾU (A2 = A1 + 1, "", A1 + 1)


Điều này sẽ trở lại FALSEcho mỗi hàng duy nhất.
kopischke

@kopischke thx, tôi cũng rất nhanh trong việc đánh máy
chris neilsen

2

Giải pháp này đòi hỏi hai cột trợ giúp. Trong Cột B, điền các số liên tiếp từ 1 đến 66.000. Trong C2 (trong hàng dữ liệu đầu tiên), nhập

=IF(A2=B2,0,1)

Trong C3, nhập

=IF(B3=OFFSET(A3,-1*SUM(C$2:C2),0),0,1)

Điền vào C3 đến C66001.

Từ đây, bạn có thể lọc B: C cho các bản ghi có giá trị 1 trong Cột C. Điều này sẽ hiển thị các số còn thiếu.

HOẶC LÀ

Nếu bạn muốn có được sự ưa thích ở bước cuối cùng, bạn có thể sử dụng công thức mảng này và điền vào theo yêu cầu của bạn:

=IFERROR(SMALL(IF($C$2:C$32<>0,$B$2:$B$32),ROW()-1),"")

Nhập công thức bằng Ctrl + Shift + Enter. Ví dụ này được nhập vào Hàng 2. Bạn sẽ cần điều chỉnh ROW()-1công thức sao cho giá trị này bằng 1 cho mục nhập đầu tiên. Ví dụ: nếu bạn bắt đầu danh sách các số bị thiếu tại E5, bạn sẽ cần thay đổi nó thành ROW()-4. [Cảm ơn @kopischke cho phương pháp này: link ]


Cảm ơn các liên kết :). Công thức của bạn, tuy nhiên, sẽ chỉ trả lại chính xác khoảng cách đầu tiên. Nó cũng không tính đến những khoảng trống đa giá trị. Đối với một biến thể cải tiến, xem câu trả lời của tôi .
kopischke

@kopischke Ah, bạn nói đúng về việc bỏ lỡ những con số bị thiếu liên tiếp. Đó là những gì tôi nhận được khi sử dụng dữ liệu thử nghiệm không đủ chung. : - /
Xuất sắc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.