Trích xuất từ ​​có 5 chữ số từ chuỗi ký tự trong Excel

Trích xuất từ ​​có 5 chữ số từ chuỗi ký tự trong Excel

Xin chào,

Tôi cần trợ giúp về công thức Excel để trích xuất mã 5 chữ số từ chuỗi văn bản sau. Tôi không thể tự mình tìm ra cách giải quyết.

Hàng 1 - X7777 (có thể có 0, 2, 4 chữ cái sau đó mà tôi không cần)

Hàng 2 - 36600

Hàng 3 - 80008

0222 TA GIẢI PHÁP X7777 073015 1 132 00
0225 THANG HOẶC LG 36600 IL91 073015 1 50 00
0230 CÂY LAU NHÀ/CHỔI 80008 OT 073015 1 550 00

Cảm ơn trước sự giúp đỡ của bạn!




Trả lời:

Bằng cách loại bỏ một dấu ? khỏi biểu thức chính quy, chúng ta có thể biến nó thành chuỗi năm ký tự cuối cùng (được mô tả như trên [xn]nnnn) theo sau là chuỗi sáu chữ số (ngày tháng). Và điều đó sẽ hoạt động tốt.

Tôi đã thực hiện một vài chỉnh sửa khác để định dạng tốt hơn. Nếu có bất kỳ dòng nào trong dữ liệu gốc không được phân tích cú pháp đúng cách, chúng sẽ bị loại bỏ khỏi kết quả và được đánh dấu bằng cách in đậm/đỏ. Điều này cũng giả định rằng phông chữ cơ bản của dữ liệu nguồn là màu đen chứ không phải in đậm.

Trong quá trình thử nghiệm, tôi nhận ra rằng nếu, ví dụ, trường Số lượng bị thiếu, dòng mã sẽ bị phân tích cú pháp và cho kết quả không chính xác. Vì vậy, tôi đã sửa đổi định nghĩa Giá để yêu cầu trường này phải có.

  • chuỗi chữ số
  • không gian đơn
  • hai chữ số nữa
  • ranh giới từ

Nếu bảng giá của bạn không được trình bày theo định dạng đó, hãy cho tôi biết.

=======================================

Tùy chọn rõ ràng
Sub ParseData()
Khai báo RE là Object, MC là Object, SM là Object
Dim vSrc As Variant, vRes() As Variant, rSrc As Range, rRes As Range
Dim wsSrc As Worksheet
Dim I As Long, J As Long, K As Long
Dim colBadFormat As Collection

'Mẫu biểu thức chính quy'
Const sPat As String = "^(\d+)\s+(.*(?=\s+(?:[AZ]\d{4}|\d{5})\s+))\s+(\w{5})\s+.*?(\d{6})\s+(\w+)\s+(\d+\s\d{2})"

Set wsSrc = Worksheets("Sheet1") 'Bảng dữ liệu
Với wsSrc
Set rSrc = Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) 'lấy dữ liệu gốc
Với rSrc
vSrc = .Value
Với .Font
.Color = vbBlack
.Bold = False
Kết thúc bằng
Kết thúc bằng

Đặt rRes = .Cells(1, 3) 'đặt kết quả bắt đầu ở C1, cùng trang
ReDim vRes(0 To UBound(vSrc, 1), 1 To 6) 'Mảng kết quả chiều

'Tiêu đề cho mảng kết quả'
vRes(0, 1) = "Mã"
vRes(0, 2) = "Mô tả"
vRes(0, 3) = "Mã số mặt hàng"
vRes(0, 4) = "Ngày"
vRes(0, 5) = "Số lượng"
vRes(0, 6) = "Giá"
Kết thúc bằng

'Khởi tạo đối tượng regex'
Đặt RE = CreateObject("vbscript.regexp")
Với RE
.Pattern = sPat
.Toàn cục = Đúng
.MultiLine = True

'Lặp lại quá trình xử lý dữ liệu và phân tích nó.'
K = 0
Đặt colBadFormat = Bộ sưu tập mới
Đối với I = 1 Đến UBound(vSrc, 1)
Nếu .test(vSrc(I, 1)) = True thì
K = K + 1
Đặt MC = .Execute(vSrc(I, 1))
Đặt SM = MC(0).submatches
Đối với J = 1 đến SM.Count
vRes(K, J) = CStr(SM(J - 1))
Tiếp theo là J
Khác
colBadFormat.Add rSrc(I, 1)
Kết thúc nếu
Tiếp theo tôi
Kết thúc bằng

'Hãy viết ra kết quả
Đặt rRes = rRes.Resize(rowsize:=UBound(vRes, 1) + 1, columnsize:=UBound(vRes, 2))
Với rRes
.EntireColumn.Clear
.Columns(1).NumberFormat = "@"
.Columns(3).HorizontalAlignment = xlCenter
.Columns(4).NumberFormat = "@"
.Giá trị = vRes
Với .Rows(1)
.Font.Bold = True
.HorizontalAlignment = xlCenter
Kết thúc bằng
.EntireColumn.AutoFit
Kết thúc bằng

For I = 1 To colBadFormat.Count
Với colBadFormat(I).Font
.Color = vbRed
.Bold = True
Kết thúc bằng
Tiếp theo tôi

End Sub

=======================================



Trả lời:
Rất vui được giúp đỡ. Cảm ơn phản hồi của bạn.

Comments

Popular posts from this blog

Điều tôi muốn làm trong Excel 2010 là tạo một nút tùy chỉnh và gắn nó vào thanh công cụ Truy nhập nhanh và chạy một macro cụ thể.

Mở tài liệu Excel và Word từ Outlook Lỗi - Không đủ bộ nhớ

Excel 2016 - mở tất cả các tệp trong MỘT phiên bản