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

hadoan-pap

Thành viên thường trực
Tham gia ngày
8 Tháng bảy 2015
Bài viết
285
Được thích
8
Điểm
385
Tuổi
33
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!
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,566
Được thích
1,762
Điểm
560
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:

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,676
Được thích
14,616
Điểm
1,910
Nơi ở
Tp.HCM
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")
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
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
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
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
 

Tống Văn Đệ

Thành viên thường trực
Tham gia ngày
27 Tháng mười 2007
Bài viết
272
Được thích
188
Điểm
695
Nơi ở
Tân Thành, BRVT
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!
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
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
 

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
7,219
Được thích
14,232
Điểm
1,860
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
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
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.
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,566
Được thích
1,762
Điểm
560
@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.
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
@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")
 

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
7,219
Được thích
14,232
Điểm
1,860
(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
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp
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
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia ngày
4 Tháng mười một 2007
Bài viết
9,924
Được thích
29,653
Điểm
1,910
Tuổi
58
Nơi ở
Gò Vấp

Cá ngừ F1

Thành viên gắn bó
Thành viên BQT
Moderator
Tham gia ngày
1 Tháng một 2008
Bài viết
2,098
Được thích
3,217
Điểm
910
Tuổi
37
Nơi ở
Đảo Đào Hoa
Top Bottom