nhờ giúp đỡ Code VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

swalowbird

Thành viên mới
Tham gia
22/5/16
Bài viết
49
Được thích
1
Hi các bác , e làm code phân giải chuỗi ký tự để có dấu /
và đang tắc chỗ k> 2 , giúp em về thuật toán và code với
thanks !
Em muốn làm file code mà từ 1 chuỗi ký tự như

[TABLE="class: cms_table, width: 254"]
[TR]
[TD]000320/2B6/467/237/990/123/ACF12
sau khi bấm button sẽ ínsert thành các dòng bên duoi[/TD]
[/TR]
[/TABLE]

000320
0002B6
000467
000237
000990
000123
0ACF12

Option Explicit
Sub GPE()
Dim MyString, TargetString As String, LenTH1 As Integer
Dim Rng As Range, Arr() As Integer
Dim K As Integer, I As Integer, J As Integer, N As Integer, W As Byte '*|*'
Set Rng = Selection
MyString = Rng
TargetString = "/" 'Cái Này Ta Có The Khai Báo 1 Hàng Mà Dùng'
LenTH1 = Len(MyString)
ReDim Arr(1 To LenTH1) As Integer
J = 0
For I = 1 To LenTH1
If Mid(MyString, I, 1) = TargetString Then
J = J + 1
End If
Next I
K = J
For I = 1 To LenTH1
If Mid(MyString, I, 1) = TargetString Then
W = W + 1 '*|*'
Arr(W) = I '*|*'
MsgBox Arr(W), , "Thong Bao 02"
End If
Next I
If K = 1 Then
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1)
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - (LenTH1 - Arr(1)) - 1) & Mid(MyString, Arr(1) + 1, LenTH1 - Arr(1))
End If
If K = 2 Then
If Arr(2) - Arr(1) - 1 <= LenTH1 - Arr(2) Then
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - Arr(2) + Arr(1)) & Mid(MyString, Arr(1) + 1, Arr(2) - Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - LenTH1 + Arr(2) - 1) & Mid(MyString, Arr(2) + 1, LenTH1 - Arr(2))

Else
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - Arr(2) + Arr(1)) & Mid(MyString, Arr(1) + 1, Arr(2) - Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - Arr(2) + Arr(1)) & Mid(MyString, Arr(1) + 1, Arr(2) - Arr(1) - LenTH1 + Arr(2) - 1) & Mid(MyString, Arr(2) + 1, LenTH1 - Arr(2))

End If
If K > 2 Then

If Arr(W) - Arr(W - 1) >= Arr(W - 1) - Arr(W - 2) Then
W = 3
Do While Arr(W) - Arr(W - 1) >= Arr(W - 1) - Arr(W - 2)
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1 - Arr(W) + Arr(W - 1)) & Mid(MyString, Arr(W) + 1, Arr(W + 1) - Arr(W))
W = W + 1
Loop
End If

End If


Application.CutCopyMode = False '*|*'
End If


End Sub
 

File đính kèm

Bạn thử trước với cái ni xem sao:
PHP:
Option Explicit
Sub gpeFT()
 Const FC As String = "/":              Dim StrC As String
 Dim J As Integer, Dem As Integer, VTr As Integer
 
 If Selection.Count > 1 Then Exit Sub
 StrC = Selection.Value & FC:           Dem = 1
 Do
    VTr = InStr(StrC, FC)
    If VTr < 1 Then
        Exit Do
    Else
        Dem = Dem + 1
        Selection.Offset(Dem).Value = "'" & Left(StrC, VTr - 1)
        StrC = Mid(StrC, VTr + 1, Len(StrC))
    End If
 Loop
End Sub
 
Upvote 0
Hi các bác , e làm code phân giải chuỗi ký tự để có dấu /
và đang tắc chỗ k> 2 , giúp em về thuật toán và code với
thanks !
Em muốn làm file code mà từ 1 chuỗi ký tự như

[TABLE="class: cms_table, width: 254"]
[TR]
[TD]000320/2B6/467/237/990/123/ACF12
sau khi bấm button sẽ ínsert thành các dòng bên duoi[/TD]
[/TR]
[/TABLE]

000320
0002B6
000467
000237
000990
000123
0ACF12

Option Explicit
Sub GPE()
Dim MyString, TargetString As String, LenTH1 As Integer
Dim Rng As Range, Arr() As Integer
Dim K As Integer, I As Integer, J As Integer, N As Integer, W As Byte '*|*'
Set Rng = Selection
MyString = Rng
TargetString = "/" 'Cái Này Ta Có The Khai Báo 1 Hàng Mà Dùng'
LenTH1 = Len(MyString)
ReDim Arr(1 To LenTH1) As Integer
J = 0
For I = 1 To LenTH1
If Mid(MyString, I, 1) = TargetString Then
J = J + 1
End If
Next I
K = J
For I = 1 To LenTH1
If Mid(MyString, I, 1) = TargetString Then
W = W + 1 '*|*'
Arr(W) = I '*|*'
MsgBox Arr(W), , "Thong Bao 02"
End If
Next I
If K = 1 Then
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1)
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - (LenTH1 - Arr(1)) - 1) & Mid(MyString, Arr(1) + 1, LenTH1 - Arr(1))
End If
If K = 2 Then
If Arr(2) - Arr(1) - 1 <= LenTH1 - Arr(2) Then
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - Arr(2) + Arr(1)) & Mid(MyString, Arr(1) + 1, Arr(2) - Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - LenTH1 + Arr(2) - 1) & Mid(MyString, Arr(2) + 1, LenTH1 - Arr(2))

Else
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - Arr(2) + Arr(1)) & Mid(MyString, Arr(1) + 1, Arr(2) - Arr(1) - 1)

Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - Arr(2) + Arr(1)) & Mid(MyString, Arr(1) + 1, Arr(2) - Arr(1) - LenTH1 + Arr(2) - 1) & Mid(MyString, Arr(2) + 1, LenTH1 - Arr(2))

End If
If K > 2 Then

If Arr(W) - Arr(W - 1) >= Arr(W - 1) - Arr(W - 2) Then
W = 3
Do While Arr(W) - Arr(W - 1) >= Arr(W - 1) - Arr(W - 2)
Rng.EntireRow.copy
Rng.Offset(1, 0).EntireRow.insert Shift:=xlDown
Rng.Offset(1, 0) = Mid(MyString, 1, Arr(1) - 1 - Arr(W) + Arr(W - 1)) & Mid(MyString, Arr(W) + 1, Arr(W + 1) - Arr(W))
W = W + 1
Loop
End If

End If


Application.CutCopyMode = False '*|*'
End If


End Sub
Bạn sử dụng đoạn code này thử xem
Mã:
Option Explicit
Sub GPE()
Dim s As String, arr, i As Long
For i = Range("A65000").End(xlUp).Row To 1 Step -1
    If Range("A" & i).Value <> "" Then
        s = Range("A" & i).Value
        arr = Split(s, "/")
        Range("A" & i + 1).Resize(UBound(arr) + 1).EntireRow.Insert
        Range("A" & i + 1).Resize(UBound(arr) + 1).Value = Application.Transpose(arr)
    End If
Next i
End Sub
 
Upvote 0
Mình nhìn code của bạn khủng quá nên không thể ngồi rà lại được.
Mình tham gia đoạn code khác ngắn hơn bạn kiểm tra xem có được không?

Mã:
Sub SeaGPE()
Dim i, j, Tm
Tm = Split(Selection.Value, "/")
i = UBound(Tm)
If i > 0 Then
For j = 0 To i
If Len(Tm(j)) < 6 Then Tm(j) = Right("000000" & Tm(j), 6)
Next
Selection.Offset(1).Resize(UBound(Tm) + 1).Insert Shift:=xlDown
Selection.Offset(1).Resize(UBound(Tm) + 1) = WorksheetFunction.Transpose(Tm)
End If
End Sub
 
Upvote 0
chưa dc bác ak
sửa code của em với
thanks !!!**~**

Bạn muốn kết quả thế nào thì nhập mẫu trong file để mọi người giúp bằng code họ viết.
Nhìn code của bạn mà sửa thì "mệt" lắm.
Bài 1 bạn ví dụ có vài dòng, kết quả tách ra bằng dấu "/", sau đó thêm các số 0 phía trước thành 6 ký tự?
Những trường hợp này thì sao: F0076688, 201603N08362,...
 
Upvote 0
đó mới là vấn đề em đang nghĩ , xây dựng thuật toán mà chưa dc đây
 
Upvote 0
Em lấy vd nhé !

[TABLE="width: 254"]
[TR]
[TD="class: xl534, width: 254"]201603N06044/46/49/5890/91

sẽ ra các dòng bên duwois sau
[/TD]
[/TR]
[/TABLE]
201603N06044
201603N06046
201603N06049
201603N05890
201603N05891

Thanks !!!!!
 
Upvote 0
Em lấy vd nhé !

[TABLE="width: 254"]
[TR]
[TD="class: xl534, width: 254"]201603N06044/46/49/5890/91

sẽ ra các dòng bên duwois sau [/TD]
[/TR]
[/TABLE]
201603N06044
201603N06046
201603N06049
201603N05890
201603N05891

Thanks !!!!!
Nếu vậy sửa code lại thế này xem sao?
Mã:
Sub GPE()
Dim s As String, arr, i As Long, j As Integer
For i = Range("A65000").End(xlUp).Row To 1 Step -1
    If Range("A" & i).Value <> "" Then
        s = Range("A" & i).Value
        arr = Split(s, "/")
        For j = 1 To UBound(arr)
           arr(j) = Left(arr(0), Len(arr(0)) - Len(arr(j))) & arr(j)
        Next j
        Range("A" & i + 1).Resize(UBound(arr) + 1).EntireRow.Insert
        Range("A" & i + 1).Resize(UBound(arr) + 1).Value = Application.Transpose(arr)
    End If
Next i
End Sub
 
Upvote 0
Em lấy vd nhé !

[TABLE="width: 254"]
[TR]
[TD="class: xl534, width: 254"]201603N06044/46/49/5890/91

sẽ ra các dòng bên duwois sau
[/TD]
[/TR]
[/TABLE]
201603N06044
201603N06046
201603N06049
201603N05890
201603N05891

Thanks !!!!!

Đưa vào mảng rồi gán xuống sheeet, khỏi phải Insert dòng được không?
PHP:
Public Sub GPE()
Dim sArr(), dArr(1 To 10000, 1 To 1), i As Long, J As Long, K As Long, Tem
sArr = Range("A2", Range("A65536").End(xlUp)).Value
For i = 1 To UBound(sArr)
    If Not IsEmpty(sArr(i, 1)) Then
        Tem = Split(sArr(i, 1), "/")
        For J = 0 To UBound(Tem)
            K = K + 1
            dArr(K, 1) = Left(Tem(0), Len(Tem(0)) - Len(Tem(J))) & Tem(J)
        Next J
    End If
Next i
Columns("B:B").NumberFormat = "@"
Range("B2").Resize(K) = dArr
End Sub
 
Upvote 0
Mình nhìn code của bạn khủng quá nên không thể ngồi rà lại được.
Mình tham gia đoạn code khác ngắn hơn bạn kiểm tra xem có được không?

Mã:
Sub SeaGPE()
Dim i, j, Tm
Tm = Split(Selection.Value, "/")
i = UBound(Tm)
If i > 0 Then
For j = 0 To i
If Len(Tm(j)) < 6 Then Tm(j) = Right("000000" & Tm(j), 6)
Next
Selection.Offset(1).Resize(UBound(Tm) + 1).Insert Shift:=xlDown
Selection.Offset(1).Resize(UBound(Tm) + 1) = WorksheetFunction.Transpose(Tm)
End If
End Sub
ôi lâu lắm rooid mới thấy anh sealand xuất hiện
 
Upvote 0
Nếu vậy sửa code lại thế này xem sao?
Mã:
Sub GPE()
Dim s As String, arr, i As Long, j As Integer
For i = Range("A65000").End(xlUp).Row To 1 Step -1
    If Range("A" & i).Value <> "" Then
        s = Range("A" & i).Value
        arr = Split(s, "/")
        For j = 1 To UBound(arr)
           arr(j) = Left(arr(0), Len(arr(0)) - Len(arr(j))) & arr(j)
        Next j
        Range("A" & i + 1).Resize(UBound(arr) + 1).EntireRow.Insert
        Range("A" & i + 1).Resize(UBound(arr) + 1).Value = Application.Transpose(arr)
    End If
Next i
End Sub

code của bác chạy ổn , nhưng đoạn cuối lại ra thế này

[TABLE="width: 393"]
[TR]
[TD]201603N06044/46/49/5890/91[/TD]
[/TR]
[TR]
[TD]201603N06044[/TD]
[/TR]
[TR]
[TD]201603N06046[/TD]
[/TR]
[TR]
[TD]201603N06049[/TD]
[/TR]
[TR]
[TD]201603N05890[/TD]
[/TR]
[TR]
[TD]201603N06091

nhưng thực tế phải là

[TABLE="width: 393"]
[TR]
[TD]201603N06044/46/49/5890/91[/TD]
[/TR]
[TR]
[TD]201603N06044[/TD]
[/TR]
[TR]
[TD]201603N06046[/TD]
[/TR]
[TR]
[TD]201603N06049[/TD]
[/TR]
[TR]
[TD]201603N05890[/TD]
[/TR]
[TR]
[TD]201603N05891[/TD]
[/TR]
[/TABLE]
[/TD]
[/TR]
[/TABLE]

Thanks !
có thể sửa giúp em được ko vầy :D
 
Upvote 0
code của bác chạy ổn , nhưng đoạn cuối lại ra thế này

[TABLE="width: 393"]
[TR]
[TD]201603N06044/46/49/5890/91[/TD]
[/TR]
[TR]
[TD]201603N06044[/TD]
[/TR]
[TR]
[TD]201603N06046[/TD]
[/TR]
[TR]
[TD]201603N06049[/TD]
[/TR]
[TR]
[TD]201603N05890[/TD]
[/TR]
[TR]
[TD]201603N06091

nhưng thực tế phải là

[TABLE="width: 393"]
[TR]
[TD]201603N06044/46/49/5890/91[/TD]
[/TR]
[TR]
[TD]201603N06044[/TD]
[/TR]
[TR]
[TD]201603N06046[/TD]
[/TR]
[TR]
[TD]201603N06049[/TD]
[/TR]
[TR]
[TD]201603N05890[/TD]
[/TR]
[TR]
[TD]201603N05891[/TD]
[/TR]
[/TABLE]
[/TD]
[/TR]
[/TABLE]

Thanks !
có thể sửa giúp em được ko vầy :D

Hình như mới "hiểu hiểu" được 1 chút. Bạn xem file này coi sao.
 

File đính kèm

Upvote 0
code của bác chạy ổn , nhưng đoạn cuối lại ra thế này

[TABLE="width: 393"]
[TR]
[TD]201603N06044/46/49/5890/91[/TD]
[/TR]
[TR]
[TD]201603N06044[/TD]
[/TR]
[TR]
[TD]201603N06046[/TD]
[/TR]
[TR]
[TD]201603N06049[/TD]
[/TR]
[TR]
[TD]201603N05890[/TD]
[/TR]
[TR]
[TD]201603N06091

nhưng thực tế phải là

[TABLE="width: 393"]
[TR]
[TD]201603N06044/46/49/5890/91[/TD]
[/TR]
[TR]
[TD]201603N06044[/TD]
[/TR]
[TR]
[TD]201603N06046[/TD]
[/TR]
[TR]
[TD]201603N06049[/TD]
[/TR]
[TR]
[TD]201603N05890[/TD]
[/TR]
[TR]
[TD]201603N05891[/TD]
[/TR]
[/TABLE]
[/TD]
[/TR]
[/TABLE]

Thanks !
có thể sửa giúp em được ko vầy :D
Nhưng bạn cho tôi biết lý do sao mà chổ màu đỏ mới đúng mà không phải như màu xanh phía trên. Theo quy luật thì như chổ màu xanh mới đúng chứ.
 
Upvote 0
Theo quy luật đặt cái này là vậy bác ạ

bác nào từng tiếp xúc với XNK sẽ biết , tờ khai hải quan nó hay viết nhiều số invoice thế này mà .

Thanks !!!
 
Upvote 0
Ak !
Bác giỏi vãi !
nhưng em muốn insert các dòng xuống bên dưới , để thế này bất tiện khi tra cứu lắm


thanks bác !!!
 
Upvote 0
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
 
Upvote 0
Sub run() Dim Str, S, K As String
Dim I, J, Q As Long
Dim Arr As Variant


For rw = [A100].End(3).Row To 1 Step -1
ReDim Arr(1 To 10, 1 To 1)
If Cells(rw, 1) <> "" Then
S = Cells(rw, 1)
I = WorksheetFunction.Find("/", S, 1)
Str = Left(Cells(rw, 1), I - 1)
J = I
Q = 1
Arr(Q, 1) = "'" & Str
Do
J = J + 1
If Mid(S, J, 1) <> "/" Then
K = K & Mid(S, J, 1)
ElseIf Mid(S, J, 1) = "/" Then
Mid(Str, Len(Str) - Len(K) + 1, Len(K)) = K
Q = Q + 1
Arr(Q, 1) = "'" & Str
K = ""
End If
If J = Len(S) Then
Mid(Str, Len(Str) - Len(K) + 1, Len(K)) = K
Q = Q + 1
Arr(Q, 1) = Str
K = ""
End If
Loop Until J = Len(Cells(rw, 1))
[D1000].End(3).Offset(1).Resize(Q) = Arr


End If

Next rw


End Sub

tôi chạy thì ok rồi! không biết đúng ý bạn chưa?
[TABLE="width: 222"]
[TR]
[TD="class: xl65, width: 222"]000320/2B6/467/237/990/123/ABCF12[/TD]
[/TR]
[/TABLE]

thành :
[TABLE="width: 64"]
[TR]
[TD="width: 64"]000320[/TD]
[/TR]
[TR]
[TD]0002B6[/TD]
[/TR]
[TR]
[TD]000467[/TD]
[/TR]
[TR]
[TD]000237[/TD]
[/TR]
[TR]
[TD]000990[/TD]
[/TR]
[TR]
[TD]000123[/TD]
[/TR]
[TR]
[TD]ABCF12[/TD]
[/TR]
[/TABLE]
 
Upvote 0
Hi bác ! Bác có thể sửa giúp em code để mỗi một cái được giải ra nó sẽ tự insert xuống thế này dc ko ak !

Thank bác !!!
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom