- Tham gia
- 23/3/16
- Bài viết
- 705
- Được thích
- 52
Code cho bạnChào cả nhà GPE . CHúc tất cả mọi người năm mới sức khỏe , làm ăn phát tài, hoan hĩ, từ bi, thanh tịnh..
Em có 1 danh sách gồm Full đường dẫn như ảnh ( tầm 5000 dòng ) . Em muốn code lấy tên và đuôi thôi, Em không muốn dùng công thức vì nặng file
Xin chân thành cảm ơn !
View attachment 212729
Sub GPE()
Dim sArr(), Res(), lR As Long, K As Long, I As Long
lR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
sArr() = Sheet1.Range("A2:A" & lR).Value
ReDim Res(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
Sheet1.Range("B2").Resize(K) = Res
End Sub
Gọi hàm Split 2 lần cho cùng 1 chuỗi chỉ với mục đích tiết kiệm 1 lần gán sang biến khác?K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Dạ vâng, đúng là lần này em "làm biếng".Gọi hàm Split 2 lần cho cùng 1 chuỗi chỉ với mục đích tiết kiệm 1 lần gán sang biến khác?
Thêm lệnh chứ đâu có cần thêm dòng. Code ấy vốn đã gom một mớ lệnh vào 1 dòng mờ.Gán sang biến khác phải tăng thêm 1 dòng code, đâu có mạnh mẽ.![]()
Code cho bạn
Mã:Sub GPE() Dim sArr(), Res(), lR As Long, K As Long, I As Long lR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row sArr() = Sheet1.Range("A2:A" & lR).Value ReDim Res(1 To UBound(sArr, 1), 1 To 1) For I = 1 To UBound(sArr, 1) K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I Sheet1.Range("B2").Resize(K) = Res End Sub
Bài này record macro thì ra vầy
Sub Macro1()
Columns("A:A").Replace "*\", ""
End Sub
Lỗi báo thế nào bạn nhỉ?Code chạy bị lỗi anh ơi. Mong anh Fix dùm. Cảm ơn anh
View attachment 212776
Lỗi báo thế nào bạn nhỉ?
Bạn thử code sau:View attachment 212792
Em muốn chổ Input e tự chỉnh được đầu Vào. nếu dử liệu trống thì Ouput trống luôn chứ đừng báo lỗi
Sub GPE()
Dim sArr(), Res(), K As Long, I As Long
sArr() = Sheet1.Range("A2:A100").Value ' Em muon cho Nay tuy chinh
ReDim Res(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
Sheet1.Range("B2").Resize(K) = Res
End Sub
Dòng màu vàng
Sub GPE()
Dim sArr(), Res(), Tmp, K As Long, I As Long
Dim sRng As Range, rRng As Range
'Chon vung du lieu dau vao
Set sRng = InputBox
If Not sRng Is Nothing Then
sArr() = sRng.Value
ReDim Res(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
K = K + 1
If Len(sArr(I, 1)) Then
Tmp = Split(sArr(I, 1), "\")
Res(K, 1) = Tmp(UBound(Tmp))
Else
Res(K, 1) = ""
End If
Next I
'Chon vung dien ket qua
Set rRng = InputBox
If Not rRng Is Nothing Then
rRng(1, 1).Resize(K) = Res
Set sRng = Nothing: Set rRng = Nothing
MsgBox "Done", vbInformation, "GPE"
End If
End If
End Sub
Function InputBox() As Range
On Error GoTo Err
Set InputBox = Application.InputBox("Please choose your range:", "GPE", Type:=8)
Exit Function
Err:
Set InputBox = Nothing
End Function
Bạn thử code sau:
PHP:Sub GPE() Dim sArr(), Res(), Tmp, K As Long, I As Long Dim sRng As Range, rRng As Range 'Chon vung du lieu dau vao Set sRng = InputBox If Not sRng Is Nothing Then sArr() = sRng.Value ReDim Res(1 To UBound(sArr, 1), 1 To 1) For I = 1 To UBound(sArr, 1) K = K + 1 If Len(sArr(I, 1)) Then Tmp = Split(sArr(I, 1), "\") Res(K, 1) = Tmp(UBound(Tmp)) Else Res(K, 1) = "" End If Next I 'Chon vung dien ket qua Set rRng = InputBox If Not rRng Is Nothing Then rRng(1, 1).Resize(K) = Res Set sRng = Nothing: Set rRng = Nothing MsgBox "Done", vbInformation, "GPE" End If End If End Sub Function InputBox() As Range On Error GoTo Err Set InputBox = Application.InputBox("Please choose your range:", "GPE", Type:=8) Exit Function Err: Set InputBox = Nothing End Function
Sub GPE()
Dim sArr(), Res(), K As Long, I As Long
sArr() = Sheet1.Range("A2:A100").Value ' Em muon cho Nay tuy chinh
ReDim Res(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
Sheet1.Range("B2").Resize(K) = Res
End Sub
Bạn nói bạn muốn tùy chỉnh dữ liệu đầu vào nên tôi đã sử dụng Inputbox cho bạn tự chọn rồi đó.Thank anh rất hay. Nhưng mà em không hiện cái Input để chọn vùng đó. Nó hết sức là đơn giản. Nó phải như đoạn code bài này
Mã:Sub GPE() Dim sArr(), Res(), K As Long, I As Long sArr() = Sheet1.Range("A2:A100").Value ' Em muon cho Nay tuy chinh ReDim Res(1 To UBound(sArr, 1), 1 To 1) For I = 1 To UBound(sArr, 1) K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I Sheet1.Range("B2").Resize(K) = Res End Sub
Nhưng code trên có nhược điểm là nó báo lỗi ở đoạn sArr() = Sheet1.Range("A2:A100").Value ( Khi dữ liệu trống ). Em muốn trống thì xuất ra trống luôn
Ví dụ dữ liệu của em từ A2:A50 ( có text đường dẫn ) mà cái sArr() =A2:A100 thì B2:B50 thì xuất ra dữ liệu còn B51:B100 xuất ra trống trống.
If Len(sArr(I, 1)) Then
Tmp = Split(sArr(I, 1), "\")
Res(K, 1) = Tmp(UBound(Tmp))
Else
Res(K, 1) = ""
End If
Bạn nói bạn muốn tùy chỉnh dữ liệu đầu vào nên tôi đã sử dụng Inputbox cho bạn tự chọn rồi đó.
Còn nếu có vùng khác thì bạn có thể tự sửa vào code cũng được.
Còn gặp dữ liệu trống thì code ở bài #12 tôi đã đưa thêm điều kiện dữ liệu trống thì kết quả trống rồi.
PHP:If Len(sArr(I, 1)) Then Tmp = Split(sArr(I, 1), "\") Res(K, 1) = Tmp(UBound(Tmp)) Else Res(K, 1) = "" End If
Bạn sửa đoạn này:Dạ em rất cảm ơn anh. Chắc có thể anh không hiễu ý e. Bây giờ em sẽ nói lại 1 lần nữa a đọc sẽ hiểu rất mong anh giúp cho trót
Bây giờ đoạn code anh nó chạy đúng nếu em thay đổi code như thế này ( Xem ảnh bên dưới ) Do từ A2:A7 có dữ liệu nên code OK
View attachment 212820
Bây giờ em thay đổi lại đầu vào là A2:A100 mà từ A2:A7 lại có dữ liệu còn từ A8:A100 trở đi là trống. Thì từ B2:B7 vẫn xuất ra như cũ và từ B8:B100 thì xuất ra trống ( do A8:A100 trống thì xuất ra trống )
View attachment 212821
Vùng dữ liệu em cố định từ A2:A100 và có dòng trống có dòng có. nến không thể dùng
Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For I = 1 To UBound(sArr, 1)
K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
For I = 1 To UBound(sArr, 1)
K = K + 1
If len(sArr(I,1)) Then
Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Else
Res(K,1)=""
End If
Next I
Chỉ cầnBạn sửa đoạn này:
Thành:PHP:For I = 1 To UBound(sArr, 1) K = K + 1: Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I
PHP:For I = 1 To UBound(sArr, 1) K = K + 1 If len(sArr(I,1)) Then Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Else Res(K,1)="" End If Next I
For I = 1 To UBound(sArr, 1)
K = K + 1
If Len(sArr(I, 1)) Then Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
For I = 1 To UBound(sArr, 1)
If Len(sArr(I, 1)) Then Res(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
Sub GPE()
Dim sArr(), Res(), I As Long
sArr = Range("A2:A100").Value
ReDim Res(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
If Len(sArr(I, 1)) Then Res(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
Range("B2").Resize(UBound(Res)) = Res
End Sub
Sub GPE()
Dim sArr(), I As Long
sArr = Range("A2:A100").Value
For I = 1 To UBound(sArr, 1)
If Len(sArr(I, 1)) Then sArr(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\")))
Next I
Range("B2").Resize(UBound(sArr)) = sArr
End Sub
Em cám ơn bác đã chỉ bảo.Chỉ cần
bởi mảng Res được khởi tạo với các element = Empty rồi.Mã:For I = 1 To UBound(sArr, 1) K = K + 1 If Len(sArr(I, 1)) Then Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I
Nhưng dùng thêm K để làm gì? Từ code thấy luôn luôn có K = I. Vậy chỉ cần
Và toàn bộ code theo cách của bạn làMã:For I = 1 To UBound(sArr, 1) If Len(sArr(I, 1)) Then Res(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I
Mã:Sub GPE() Dim sArr(), Res(), I As Long sArr = Range("A2:A100").Value ReDim Res(1 To UBound(sArr, 1), 1 To 1) For I = 1 To UBound(sArr, 1) If Len(sArr(I, 1)) Then Res(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I Range("B2").Resize(UBound(Res)) = Res End Sub
Nhưng vẫn thừa. Dùng Res làm gì?
Vẫn theo cách của bạn thì
Mã:Sub GPE() Dim sArr(), I As Long sArr = Range("A2:A100").Value For I = 1 To UBound(sArr, 1) If Len(sArr(I, 1)) Then sArr(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I Range("B2").Resize(UBound(sArr)) = sArr End Sub
Chỉ cần
bởi mảng Res được khởi tạo với các element = Empty rồi.Mã:For I = 1 To UBound(sArr, 1) K = K + 1 If Len(sArr(I, 1)) Then Res(K, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I
Nhưng dùng thêm K để làm gì? Từ code thấy luôn luôn có K = I. Vậy chỉ cần
Và toàn bộ code theo cách của bạn làMã:For I = 1 To UBound(sArr, 1) If Len(sArr(I, 1)) Then Res(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I
Mã:Sub GPE() Dim sArr(), Res(), I As Long sArr = Range("A2:A100").Value ReDim Res(1 To UBound(sArr, 1), 1 To 1) For I = 1 To UBound(sArr, 1) If Len(sArr(I, 1)) Then Res(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I Range("B2").Resize(UBound(Res)) = Res End Sub
Nhưng vẫn thừa. Dùng Res làm gì?
Vẫn theo cách của bạn thì
Mã:Sub GPE() Dim sArr(), I As Long sArr = Range("A2:A100").Value For I = 1 To UBound(sArr, 1) If Len(sArr(I, 1)) Then sArr(I, 1) = Split(sArr(I, 1), "\")(UBound(Split(sArr(I, 1), "\"))) Next I Range("B2").Resize(UBound(sArr)) = sArr End Sub
Đấy có phải code của tôi đâu? Tôi chỉ rút gọn nó để 2 code (trước và sau khi rút gọn) chạy ra kết quả y hệt nhau. Tức nếu đúng thì cùng đúng, nếu sai thì cùng sai.Em xin báo cáo code của bác em Test hơn 1 tiếng đồng hồ với 23 trường hợp 5 ngôn ngữ. Và cái kết là tìm X mới có đáp án ( Giải trí thôi nha bác )
Và toàn bộ code theo cách của bạn là
...
Vẫn theo cách của bạn thì