Lấy ký tự trong chuỗi

Liên hệ QC
Cám ơn bác @HieuCD rất nhiều.
Em vẫn có một thắc mắc là, giá trị VCSC[30] thay đổi vị trí, số lượng thì đoạn mã nào bác làm công việc này. Bin xem nhiều lần vẫn còn có thắc mắc này.

Và Bin có thêm thử một giá trị nữa VCSC[26] vào cột 11 và có viết lại code nhưng chạy không được, bác xem hộ Bin chỗ nào bị sai giúp với.

View attachment 273338
=========================================================
Sub ABC2()
Dim sArr(), res$(), vc27$, vc30$, vc26$, vc$, sRow&, tmp$, N&, i&, j&, c&

vc27 = "VCSC[27]": vc30 = "VCSC[30]": vc26 = "VCSC[26]"
With Sheets("Sheet1")
sArr = .Range("A3", .Range("A" & Rows.Count).End(xlUp)).Value
End With
sRow = UBound(sArr)
ReDim res(1 To sRow, 1 To 14)
For i = 1 To sRow
tmp = sArr(i, 1)
N = Len(tmp)
c = 5
c = 11
For j = 1 To N Step 36
vc = Mid(tmp, j, 8)
If Mid(tmp, j, 8) = vc27 Then
res(i, 1) = vc
res(i, 2) = Mid(tmp, j + 9, 5)
res(i, 3) = Mid(tmp, j + 15, 5)
res(i, 4) = Mid(tmp, j + 30, 4)

ElseIf Mid(tmp, j, 8) = vc30 Then
res(i, c) = vc30
res(i, c + 1) = Mid(tmp, j + 9, 5)
res(i, c + 2) = Mid(tmp, j + 15, 5)
If c = 5 Then c = 8

If Mid(tmp, j, 8) = vc26 Then
res(i, c) = vc
res(i, 2) = Mid(tmp, j + 9, 5)
res(i, 3) = Mid(tmp, j + 15, 5)
res(i, 4) = Mid(tmp, j + 30, 4)
If c = 11 Then
End If
Next j
Next i
Sheets("Sheet1").Range("C3").Resize(sRow, 14) = res
End Sub
=========================================================
VCSC[30] lấy đầu và cuối nên có biến C xác định cột kết quả, còn lại chỉ lấy 1 nên nhập trực tiếp thứ tự cột
Mã:
Sub ABC2()
  Dim sArr(), res$(), vc27$, vc30$, vc26$, vc$, sRow&, tmp$, N&, i&, j&, c&
 
  vc27 = "VCSC[27]": vc30 = "VCSC[30]": vc26 = "VCSC[26]"
  With Sheet1
    sArr = .Range("A3", .Range("A" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 14)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    N = Len(tmp)
    c = 5
    For j = 1 To N Step 36
      vc = Mid(tmp, j, 8)
      If Mid(tmp, j, 8) = vc27 Then
        res(i, 1) = vc
        res(i, 2) = Mid(tmp, j + 9, 5)
        res(i, 3) = Mid(tmp, j + 15, 5)
        res(i, 4) = Mid(tmp, j + 30, 4)
      ElseIf Mid(tmp, j, 8) = vc30 Then
        res(i, c) = vc30
        res(i, c + 1) = Mid(tmp, j + 9, 5)
        res(i, c + 2) = Mid(tmp, j + 15, 5)
        If c = 5 Then c = 8
      ElseIf Mid(tmp, j, 8) = vc26 Then
        res(i, 11) = vc
        res(i, 12) = Mid(tmp, j + 9, 5)
        res(i, 13) = Mid(tmp, j + 15, 5)
        res(i, 14) = Mid(tmp, j + 30, 4)
      End If
    Next j
  Next i
  Sheet1.Range("C3").Resize(sRow, 14) = res
End Sub
 
Xin cám ơn bác @HieuCD nhiều.

Đồng thời Bin cũng xin cám ơn bác @VetMini @wtvnphu @Hoàng Tuấn 868 @befaint đã hỗ trợ và giúp đỡ Bin ah.

Dữ liệu Bin đã trích xuất được hơn cả mong đợi, em xin phép đóng chủ đề hỏi này ở đây.

Một lần nữa xin cảm ơn anh chị và các bạn, chúc mọi người sức khỏe và bình an trong cuộc sống và GPE ngày càng phát triển.
 
Gửi bác @HieuCD, sau khi sử dụng Bin thấy là đối với dữ liệu có nhiều dòng, thì kết quả đang ưu tiên lấy kết quả cuối cùng nên có vài mã lại cần giá trị đầu tiên trong chuỗi. Vậy nên làm phiền bác có thể giúp Bin chỉnh lại được không?

Trong tệp mình sẽ bỏ đi c=5 và c=8, mình sẽ đặt giá trị đầu và giá trị sau tùy cột và theo nhu cầu cho các mã khác.

Cám ơn và làm phiền bác nhiều.
 

File đính kèm

  • 1647842960620.png
    1647842960620.png
    108.6 KB · Đọc: 6
  • Lấy ký tự trong chuỗi_GPE.xlsm
    20.1 KB · Đọc: 10
Gửi bác @HieuCD, sau khi sử dụng Bin thấy là đối với dữ liệu có nhiều dòng, thì kết quả đang ưu tiên lấy kết quả cuối cùng nên có vài mã lại cần giá trị đầu tiên trong chuỗi. Vậy nên làm phiền bác có thể giúp Bin chỉnh lại được không?

Trong tệp mình sẽ bỏ đi c=5 và c=8, mình sẽ đặt giá trị đầu và giá trị sau tùy cột và theo nhu cầu cho các mã khác.

Cám ơn và làm phiền bác nhiều.
Chỉnh lại . . .
Mã:
Sub ABC()
  Dim sArr(), res$(), vc27$, vc30$, vc79$, vc$, sRow&, tmp$, N&, i&, j&
 
  vc27 = "VCSC[27]": vc30 = "VCSC[30]": vc79 = "VCSC[79]"
  With Sheets("HieuCD")
    sArr = .Range("A3", .Range("A" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 10)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    N = Len(tmp)
    For j = 1 To N Step 36
      vc = Mid(tmp, j, 8)
      If vc = vc27 Then
        If res(i, 1) = Empty Then
          res(i, 1) = vc
          res(i, 2) = Mid(tmp, j + 9, 5)
          res(i, 3) = Mid(tmp, j + 15, 5)
          res(i, 4) = Mid(tmp, j + 30, 4)
        End If
      ElseIf vc = vc30 Then
        If res(i, 5) = Empty Then
          res(i, 5) = vc
          res(i, 6) = Mid(tmp, j + 9, 5)
          res(i, 7) = Mid(tmp, j + 15, 5)
        End If
      ElseIf vc = vc79 Then
        res(i, 8) = vc
        res(i, 9) = Mid(tmp, j + 9, 5)
        res(i, 10) = Mid(tmp, j + 15, 5)
      End If
    Next j
  Next i
  Sheets("HieuCD").Range("C3").Resize(sRow, 10) = res
End Sub
 
Tu
Chỉnh lại . . .
Mã:
Sub ABC()
  Dim sArr(), res$(), vc27$, vc30$, vc79$, vc$, sRow&, tmp$, N&, i&, j&
 
  vc27 = "VCSC[27]": vc30 = "VCSC[30]": vc79 = "VCSC[79]"
  With Sheets("HieuCD")
    sArr = .Range("A3", .Range("A" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 10)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    N = Len(tmp)
    For j = 1 To N Step 36
      vc = Mid(tmp, j, 8)
      If vc = vc27 Then
        If res(i, 1) = Empty Then
          res(i, 1) = vc
          res(i, 2) = Mid(tmp, j + 9, 5)
          res(i, 3) = Mid(tmp, j + 15, 5)
          res(i, 4) = Mid(tmp, j + 30, 4)
        End If
      ElseIf vc = vc30 Then
        If res(i, 5) = Empty Then
          res(i, 5) = vc
          res(i, 6) = Mid(tmp, j + 9, 5)
          res(i, 7) = Mid(tmp, j + 15, 5)
        End If
      ElseIf vc = vc79 Then
        res(i, 8) = vc
        res(i, 9) = Mid(tmp, j + 9, 5)
        res(i, 10) = Mid(tmp, j + 15, 5)
      End If
    Next j
  Next i
  Sheets("HieuCD").Range("C3").Resize(sRow, 10) = res
End Sub
Tuyệt vời. Cám ơn bác @HieuCD đã hỗ trợ rất nhiều.
 
Web KT
Back
Top Bottom