Thêm n ký tự vào trước chuỗi

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
460
Được thích
19
Em chào moi người.

Em muốn kiểm tra độ dài chuỗi trong ô, nếu nó nhỏ hơn 8 thì mình sẽ insert vào them "0" vào đầu chuỗi để đủ 8 thì thôi.

Ví dụ chuỗi: 00453 … sẽ thành 00000453

Code e như dưới chưa chạy đúng ạ.

Em không rõ nhầm chỗ nào ạ.

Dim number As Integer
Dim str1 As String
Dim number1 As Integer
str1 = Sheet1.Range("O3")

number = Len(Sheet1.Range("O3"))
'If number < 7 Then

number1 = 6
MsgBox number1
Sheet1.Range("O3") = Left("0", number1) & str1

'End If

Em xin cảm ơn!
 
Nếu bạn muốn sửa cho một vùng nhất định thì sử dụng đoạn code sau:


-------------------------------
JavaScript:
Sub S_test()
  Dim S$, P$, N&
  P = "0"
  N = 8
  With [A1:A20]
    S = .Address(0, 0)
    .value = Application.Evaluate("IF(AND(" & S & "<>"""",Len(" & S & ")<" & N _
            & ") ,""'""&Right(""" & String(N, P) & """&" & S & "," & N & "),"""")")
  End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em chào moi người.

Em muốn kiểm tra độ dài chuỗi trong ô, nếu nó nhỏ hơn 8 thì mình sẽ insert vào them "0" vào đầu chuỗi để đủ 8 thì thôi.

Ví dụ chuỗi: 00453 … sẽ thành 00000453

Code e như dưới chưa chạy đúng ạ.

Em không rõ nhầm chỗ nào ạ.

Dim number As Integer
Dim str1 As String
Dim number1 As Integer
str1 = Sheet1.Range("O3")

number = Len(Sheet1.Range("O3"))
'If number < 7 Then

number1 = 6
MsgBox number1
Sheet1.Range("O3") = Left("0", number1) & str1

'End If

Em xin cảm ơn!
Có thể dùng hàm Text nhé.
Mã:
=TEXT(00453,"00000000")
 
Upvote 0
Tôi nghĩ ý đồ của bạn là nếu chiều dài nhỏ hơn 8 thì nhét (8-chiều dài) ký tự 0 vào trước.
Thế thì như thế này:
PHP:
Dim OldStr As String, LengthStr As Long
OldStr =  Sheet1.Range("O3") .Value
LengthStr = Len(OldStr)
If LengthStr <8 Then  Sheet1.Range("O3") .Value = String(8 - LengthStr, "0") & OldStr
- Nghĩ trước thuật toán
- Đặt tên biến gợi hình gợi ảnh
- Viết câu lệnh bám theo thuật toán
- Đã gán giá trị vào biến thì xài biến, không xài giá trị nữa
- Đoạn code trên có thể bỏ qua If, đi thẳng vào gán giá trị cho Sheet1.Range("O3") vì nếu LengthStr = 8 thì 8 - LengthStr = 0, code vẫn chạy. Đó là phần tối ưu hoá sau khi viết
 
Upvote 0
Vẫn bám theo thuật toán đó, nếu muốn gán giá trị mới cho cả cột (O3:O100) thì cho vào vòng lặp:
PHP:
Dim OldStr As String, LengthStr As Long
    For i = 3 to 100
        OldStr =  Sheet1.Cells(i, 15) .Value
        LengthStr = Len(OldStr)
        Sheet1.Cells(i, 15) .Value = String(8 - LengthStr, "0") & OldStr
    Next
Nếu dữ liệu nhiều và nghe đồn dùng mảng nhanh hơn đánh từng ô trên sheet thì viết lại
PHP:
Dim OldStr As String, LengthStr As Long, DataArr()
DataArr = Sheet1.Range("O3:O100").Value
    For i = 1 to Ubound(DataArr, 1)
        OldStr =  DataArr(i, 1)
        LengthStr = Len(OldStr)
        DataArr(i, 1) = String(8 - LengthStr, "0") & OldStr
    Next
Sheet1.Range("O3:O100").Value = DataArr
Ghi chú:
Tiến lên 1 bước tối ưu hoá thì
PHP:
    For i = 1 to Ubound(DataArr, 1)
        DataArr(i, 1) = String(8 - Len(DataArr(i, 1)), "0") & DataArr(i, 1)
    Next
 
Upvote 0
Vẫn bám theo thuật toán đó, nếu muốn gán giá trị mới cho cả cột (O3:O100) thì cho vào vòng lặp:
PHP:
Dim OldStr As String, LengthStr As Long
    For i = 3 to 100
        OldStr =  Sheet1.Cells(i, 15) .Value
        LengthStr = Len(OldStr)
        Sheet1.Cells(i, 15) .Value = String(8 - LengthStr, "0") & OldStr
    Next
Nếu dữ liệu nhiều và nghe đồn dùng mảng nhanh hơn đánh từng ô trên sheet thì viết lại
PHP:
Dim OldStr As String, LengthStr As Long, DataArr()
DataArr = Sheet1.Range("O3:O100").Value
    For i = 1 to Ubound(DataArr, 1)
        OldStr =  DataArr(i, 1)
        LengthStr = Len(OldStr)
        DataArr(i, 1) = String(8 - LengthStr, "0") & OldStr
    Next
Sheet1.Range("O3:O100").Value = DataArr
Ghi chú:
Tiến lên 1 bước tối ưu hoá thì
PHP:
    For i = 1 to Ubound(DataArr, 1)
        DataArr(i, 1) = String(8 - Len(DataArr(i, 1)), "0") & DataArr(i, 1)
    Next
Wonderful! suy nghĩ càng dài code càng ngắn!
 
Upvote 0
Wonderful! suy nghĩ càng dài code càng ngắn!
Code ngắn không phải lúc nào cũng tốt hơn code dài. Ở trên tôi dám rút ngắn code vì xét thấy VBA phải làm những việc tương đương, không tăng thêm. Thậm chí còn rút gọn 2 biến bộ nhớ
Dữ liệu vài trăm dòng thì chưa thấy nhưng chục ngàn dòng trở lên phải xem lại rút ngắn có lợi hay có hại. Có khi rút ngắn lại khiến VBA phải tính toán nhiều hơn hoặc phức tạp hơn code dài
-------------
Nói tiếp:
Thuật toán tự mình nghĩ ra và có thể viết được thành code sẽ là ưu tiên 1. Cứ viết và tối ưu trên nền thuật toán đó. Sau này nếu phát hiện ra hoặc học được từ người khác thuật toán hay hơn, thì có thể sửa lại.
Thí dụ căn cứ gợi ý của anh @huuthang_bd về hàm Right, (VBA cũng có hàm Right và sử dụng giống Excel) thì có thể sửa code mảng cuối cùng thành:
PHP:
    For i = 1 to Ubound(DataArr, 1)
        DataArr(i, 1) = Right(String(8, "0") & DataArr(i, 1), 8)
    Next
Nếu không biết hàm String thì cứ gõ 8 số 0 ("00000000")
Hoặc học được gợi ý của anh @Hai Lúa Miền Tây về hàm Text, thì trước tiên phải tìm hàm của VBA tương đương hàm Text, đó là hàm Format, sau đó sửa:
PHP:
    For i = 1 to Ubound(DataArr, 1)
        DataArr(i, 1) = Format(DataArr(i, 1), "00000000")
    Next
 
Upvote 0
Code ngắn không phải lúc nào cũng tốt hơn code dài. Ở trên tôi dám rút ngắn code vì xét thấy VBA phải làm những việc tương đương, không tăng thêm. Thậm chí còn rút gọn 2 biến bộ nhớ
Dữ liệu vài trăm dòng thì chưa thấy nhưng chục ngàn dòng trở lên phải xem lại rút ngắn có lợi hay có hại. Có khi rút ngắn lại khiến VBA phải tính toán nhiều hơn hoặc phức tạp hơn code dài
-------------
Nói tiếp:
Thuật toán tự mình nghĩ ra và có thể viết được thành code sẽ là ưu tiên 1. Cứ viết và tối ưu trên nền thuật toán đó. Sau này nếu phát hiện ra hoặc học được từ người khác thuật toán hay hơn, thì có thể sửa lại.
Thí dụ căn cứ gợi ý của anh @huuthang_bd về hàm Right, (VBA cũng có hàm Right và sử dụng giống Excel) thì có thể sửa code mảng cuối cùng thành:
PHP:
    For i = 1 to Ubound(DataArr, 1)
        DataArr(i, 1) = Right(String(8, "0") & DataArr(i, 1), 8)
    Next
Nếu không biết hàm String thì cứ gõ 8 số 0 ("00000000")
Hoặc học được gợi ý của anh @Hai Lúa Miền Tây về hàm Text, thì trước tiên phải tìm hàm của VBA tương đương hàm Text, đó là hàm Format, sau đó sửa:
PHP:
    For i = 1 to Ubound(DataArr, 1)
        DataArr(i, 1) = Format(DataArr(i, 1), "00000000")
    Next
Dữ liệu như thế nào chưa rỏ, căn cứ vào yêu cầu " kiểm tra độ dài chuỗi trong ô, nếu nó nhỏ hơn 8 thì mình sẽ insert vào them "0" vào đầu chuỗi để đủ 8 " chỉ có bài #6 là ổn
Tôi nghĩ ý đồ của bạn là nếu chiều dài nhỏ hơn 8 thì nhét (8-chiều dài) ký tự 0 vào trước.
Thế thì như thế này:
PHP:
Dim OldStr As String, LengthStr As Long
OldStr =  Sheet1.Range("O3") .Value
LengthStr = Len(OldStr)
If LengthStr <8 Then  Sheet1.Range("O3") .Value = String(8 - LengthStr, "0") & OldStr
- Nghĩ trước thuật toán
- Đặt tên biến gợi hình gợi ảnh
- Viết câu lệnh bám theo thuật toán
- Đã gán giá trị vào biến thì xài biến, không xài giá trị nữa
- Đoạn code trên có thể bỏ qua If, đi thẳng vào gán giá trị cho Sheet1.Range("O3") vì nếu LengthStr = 8 thì 8 - LengthStr = 0, code vẫn chạy. Đó là phần tối ưu hoá sau khi viết
 
Upvote 0
Dữ liệu như thế nào chưa rỏ, căn cứ vào yêu cầu " kiểm tra độ dài chuỗi trong ô, nếu nó nhỏ hơn 8 thì mình sẽ insert vào them "0" vào đầu chuỗi để đủ 8 " chỉ có bài #6 là ổn
Nếu dữ liệu dài hơn hoặc bằng 8 ký tự thì những code sau chỉ cần để nguyên If là được.
 
Upvote 0
@ptm0412
@HieuCD
Em thấy là code nào cũng chưa ỗn hết:

Code thì quên xét chuỗi đầu vào có rỗng hay không
Sử dụng hàm String quên xét 8- len nhỏ hơn 0.
Rồi số không ở đầu thì có cần nhập thêm dấu nháy đơn không

Nếu code mà phải chờ hỏi lại nữa, thì quá mất thời gian.
Và code trên không phải là thuật toán, nó chỉ là một giải thuật.
 
Upvote 0
@ptm0412
@HieuCD
Em thấy là code nào cũng chưa ỗn hết:

Code thì quên xét chuỗi đầu vào có rỗng hay không (1)
Sử dụng hàm String quên xét 8- len nhỏ hơn 0. (2)
Rồi số không ở đầu thì có cần nhập thêm dấu nháy đơn không (3)

Và code trên không phải là thuật toán, nó chỉ là một giải thuật. (4)
(1). Chuỗi rỗng: Chỉ trừ hàm Format sẽ sai, còn 2 cách kia thì chuỗi rỗng có Len = 0 nên vẫn chạy
(2) 8-Len < 0: Như trả lời ở bài 11: Giữ nguyên If Len() < 8
(3) Số không ở đầu: Đúng là cần dấu nháy đơn
(4) cả 4 code ở 2 bài $6 và #7 là những giải thuật khác nhau cho cùng 1 thuật toán là nếu ngắn hơn 8 thì nối chuỗi những số 0 vào trước chuỗi cho đủ 8. 2 code ở bài 9 mới đổi thuật toán: 1 thuật toán nối đại vào rồi dùng Right cắt bớt, 1 thuật toán là dùng định dạng. Trong bài tôi ghi rõ như thế
Bài đã được tự động gộp:

Có thể có chuổi "1234A", hàm Format không dùng được
Đúng vậy anh. (Không biết gọi anh có đúng không, vì tôi gặp 1 lần ở HN thì không phải "anh" mà là "em")
 
Upvote 0
(1). Chuỗi rỗng: Chỉ trừ hàm Format sẽ sai, còn 2 cách kia thì chuỗi rỗng có Len = 0 nên vẫn chạy
(2) 8-Len < 0: Như trả lời ở bài 11: Giữ nguyên If Len() < 8
(3) Số không ở đầu: Đúng là cần dấu nháy đơn
(4) cả 4 code ở 2 bài $6 và #7 là những giải thuật khác nhau cho cùng 1 thuật toán là nếu ngắn hơn 8 thì nối chuỗi những số 0 vào trước chuỗi cho đủ 8. 2 code ở bài 9 mới đổi thuật toán: 1 thuật toán nối đại vào rồi dùng Right cắt bớt, 1 thuật toán là dùng định dạng. Trong bài tôi ghi rõ như thế
Bài đã được tự động gộp:


Đúng vậy anh. (Không biết gọi anh có đúng không, vì tôi gặp 1 lần ở HN thì không phải "anh" mà là "em")
Mình không được gặp bạn, trước đây cày ngày cày đêm trả nợ ngân hàng, nay quá tuổi nhà nước không cho làm, có thời gian lên diễn đàn góp vui với anh em
 
Upvote 0
Mình không được gặp bạn, trước đây cày ngày cày đêm trả nợ ngân hàng, nay quá tuổi nhà nước không cho làm, có thời gian lên diễn đàn góp vui với anh em
Hôm sinh nhật GPE 14 ở HN tôi gặp 1 em trẻ tuổi đeo thẻ tên của anh
 
Upvote 0
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom