THANHTRUNGT
Thành viên chính thức


- Tham gia
- 11/5/14
- Bài viết
- 57
- Được thích
- 17
- Giới tính
- Nam
- Nghề nghiệp
- Lang Thang
Chào các bạn,
Mình cần tách chuỗi để lấy các ký tự file "abc" sang file "tonghop". Trong file abc chỉ cần lấy cột C và các ký tự trong chuỗi ở cột H. Chi tiết mình gửi trong file đính kèm. Nhờ các bạn giúp đỡ.
Dùng VBA:
* đưa toàn bộ dữ liệu từ file ABC vào 1 mảng
* Rồi xử lý các chuỗi trên mảng tương ứng thôi !
--> bạn đang loay hoay tìm giải pháp ? hay còn vướng mắc ở điểm nào ?
Option Explicit
Sub GPE()
Dim cnn As Object, rst As Object, regx As Object
Dim sFilename As String, Arr(), Arrresult(), i As Long, tmp$
sFilename = Application.GetOpenFilename()
If sFilename <> "False" Then
Set cnn = CreateObject("ADODB.connection")
Set rst = CreateObject("ADODB.recordset")
With cnn
.provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Data source") = sFilename
.Properties("Extended properties") = "Excel 12.0;HDR=NO;IMEX=1"
.Open
End With
rst.Open "SELECT f8,f3 FROM [Data (1)$A4:H65536]", cnn, 3, 3, 1
Arr = TransArr(rst.getrows): ReDim Arrresult(0 To UBound(Arr, 1), 0 To 3)
'--------------------------------------------------------------------------------
Set regx = CreateObject("VBscript.regexp")
regx.Pattern = "SYSTEMID=(.+):-:RACKID=\d+:-:SELFID=\d+:-:SLOT=(\d+):-:PORT=(\d+):-:"
For i = 0 To UBound(Arr, 1)
Arrresult(i, 3) = Arr(i, 1)
tmp = Arr(i, 0)
With regx.Execute(tmp)(0)
Arrresult(i, 0) = .submatches(0)
Arrresult(i, 1) = .submatches(1)
Arrresult(i, 2) = .submatches(2)
End With
Next
Range("C2").Resize(i + 1, 4) = Arrresult
'---------------------------------------------------------------------------------------
Set regx = Nothing
Set rst = Nothing
cnn.Close: Set cnn = Nothing
End If
End Sub
'============================================================
Function TransArr(sArr As Variant) As Variant
Dim cllX As Long, cllY As Long, tmpX As Long, tmpY As Long, tmparr As Variant
tmpX = UBound(sArr, 2): tmpY = UBound(sArr, 1)
ReDim tmparr(tmpX, tmpY)
For cllX = 0 To tmpX
For cllY = 0 To tmpY
tmparr(cllX, cllY) = sArr(cllY, cllX)
Next cllY
Next cllX
TransArr = tmparr
End Function
'SYSTEMID=NAN.HNN.HNN.L2S.FU14:-:RACKID=0:-:SELFID=0:-:SLOT=0:-:PORT=5:-:VPI=8:-:VCI=35
Mình đang loay hay mãi, chưa kịp trả lời thì bạn đã "tự sướng" làm mình cũng sướng theo.Dùng VBA:
* đưa toàn bộ dữ liệu từ file ABC vào 1 mảng
* Rồi xử lý các chuỗi trên mảng tương ứng thôi !
--> bạn đang loay hoay tìm giải pháp ? hay còn vướng mắc ở điểm nào ?
Mình đã run và thưởng thức, cảm giác rất tuyệt vời. Cho mình hỏi thêm nếu tùy chỉnh để thêm cột:đang buồn "tự sướng" vậy :
copy toàn bộ code này vào file tonghop.xlsx , run và thưởng thức:
regx.Pattern = "SYSTEMID=(.+):-:RACKID=\d+:-:SELFID=\d+:-:SLOT=(\d+):-:PORT=(\d+):-:"
VPI=(\d+):-:VCI=(\d+)
về cú pháp regx.pattern thì có lẽ vẫn ok!Mình đã run và thưởng thức, cảm giác rất tuyệt vời. Cho mình hỏi thêm nếu tùy chỉnh để thêm cột:
Có đúng không? Mới tìm hiểu chưa đến nơi đến chốn mong bạn thông cảm.PHP:regx.Pattern = "SYSTEMID=(.+):-:RACKID=\d+:-:SELFID=\d+:-:SLOT=(\d+):-:PORT=(\d+):-:" VPI=(\d+):-:VCI=(\d+)
Một lần nữa cảm ơn bạn rất nhiều, file chạy rất tốt.
O3 = "tentram"
P3 = "slot"
Q3 = "port"
R3 = "goicuoc"
O4 = MID(H4,FIND("=",H4,1)+1,FIND(":-:",H4,1)-FIND("=",H4,1)-1)
P4 = MID(H4,FIND("SLOT=",H4,1)+LEN("SLOT="),FIND(":-:PORT",H4,1)-FIND("SLOT",H4,1)-LEN("SLOT="))
Q4 = MID(H4,FIND("PORT=",H4,1)+LEN("PORT="),FIND(":-:VPI",H4,1)-FIND("PORT",H4,1)-LEN("PORT="))
R4 = C4
Cảm ơn bạn đã góp ý. Nhưng trên file abc.xlsx số liệu luôn biến động và file thay đổi thường xuyên. Mình chỉ tác động trên file tổng hợp để lấy kết quả mong muốn.Mình xin góp 1 cách dùng hàm như sau:
Trên file abc.xlsx / Sheet "Data(1), đặt các tiêu đề cho dễ quan sát:
Cho mình hỏi bạn thêm một vấn đề nữa mà lúc đầu hỏi bài không dám đưa lên vì sợ làm phức tạp thêm.về cú pháp regx.pattern thì có lẽ vẫn ok!
tuy nhiên bạn phải khai báo mảng kết quả có kích thước lớn hợn: ví dụ
Redim Arrresult ( 0 to ubound(Arr,1), 0 to 4) <--- mảng kết quả sẽ có 5 cột
tương đương với việc bạn sẽ gán số liệu vào mảng như sau :
............. Arrresult(i,3) = .submatches(3) :Arrresult(i,4) = .submatches(4)
Mình muốn ánh xạ từ goicuoc sang phần ghi chú các mã goicuoc, thì giải quyết bằng hàm gì?
Cho mình hỏi bạn thêm một vấn đề nữa mà lúc đầu hỏi bài không dám đưa lên vì sợ làm phức tạp thêm.
View attachment 139593
như hình trên, hoặc ví vụ từ file sau:
Vì có rất nhiều goicuoc khác nhau, và chung một mã, nếu mình định nghĩa và tạo một hàm để nó nhận biết rằng aaa=1 và aab=1; abb=2 và abc=2 thì đơn giản hơn
Cảm ơn bạn đã giúp đỡ. Mình đang mải tìm kiếm các dạng ở forum mà không giải được bài toán của mình nên trả lời hơi chậm chạp. Mình gửi bạn file gán code + bảng định nghĩa. Nhờ bạn giúp đỡ, code của bạn mình chỉ biết dùng chứ không biết sửa thế nào cả. Có gì nhờ bạn giảng giải giúp mình với nhé!gửi lại file mà bạn đã gán code + bảng mã định nghĩa , để mình có cách làm tổng quát hơn!
Cảm ơn bạn đã giúp đỡ. Mình đang mải tìm kiếm các dạng ở forum mà không giải được bài toán của mình nên trả lời hơi chậm chạp. Mình gửi bạn file gán code + bảng định nghĩa. Nhờ bạn giúp đỡ, code của bạn mình chỉ biết dùng chứ không biết sửa thế nào cả. Có gì nhờ bạn giảng giải giúp mình với nhé!
Cảm ơn bạn rất nhiều. Code này của bạn mình thấy "khủng" quá. Mục thêm thông tin goicuoc + mã rất cơ động.Xem thử file đính kèm,
( mở file lên, ấn vào nút "Click Here" , check thông tin gói cước - mã, ấn vào nút "execute" tìm đường dẫn đến file abc.xlsx,.......)
Mình có một file cần tách và lọc tương tự nhưng cấu trúc có thay đổi một tý. Do không hiểu về code nên mình không biết cách sửa như thế nào. Nhờ bạn giúp mình với nhé, cảm ơn bạn!Xem thử file đính kèm,
( mở file lên, ấn vào nút "Click Here" , check thông tin gói cước - mã, ấn vào nút "execute" tìm đường dẫn đến file abc.xlsx,.......)