Bài tập về vòng lặp

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Điểm
50
Những ai đã từng xem qua bài viết này: Giới thiệu Cơ bản về vòng lặp For . . . next của sư phụ ptm0412 giờ hãy cùng làm 1 vài bài tập từ đơn giản đến nâng cao nhé
Xin mở màn bằng 1 bài tập sau:

Bài tập 01:

Hãy tính xem từ năm 1900 đến nay có bao nhiêu ngày thuộc dạng THỨ SÁU NGÀY 13
------------------------
Các bạn ai có bài tập gì hay xin post lên đây nhé! Cảm ơn
 
Chỉnh sửa lần cuối bởi điều hành viên:
VỚi người mới tập tành VBA
Tường Vi cũng có một bài tập liên quan đến vòng lập nhưng chưa làm được
Thực tế: Một file có nhiều sheet (chứa nhiều công thức và link), khi gửi báo cáo, muội toàn phải làm thủ công copy & pastespecial value từng sheet 1
Vậy làm sao để Tạo một sub để copy & pastespecial value tất cả các sheet trong một file?

Xin các Huynh chỉ giáo?
 
Upvote 0
VỚi người mới tập tành VBA
Tường Vi cũng có một bài tập liên quan đến vòng lập nhưng chưa làm được
Thực tế: Một file có nhiều sheet (chứa nhiều công thức và link), khi gửi báo cáo, muội toàn phải làm thủ công copy & pastespecial value từng sheet 1
Vậy làm sao để Tạo một sub để copy & pastespecial value tất cả các sheet trong một file?

Xin các Huynh chỉ giáo?
-Em thấy cái này cũng nhiều mà,hay chị cứ đưa file cụ thể của chị chắc chắn sẽ OK --=0
-Đây chỉ là file e làm nữa đêm hôm trước cho ai đó -+*/
 

File đính kèm

  • Book1.rar
    52.2 KB · Đọc: 17
Lần chỉnh sửa cuối:
Upvote 0
Trong thời gian chờ đợi một bài tập hay các bạn thử làm bài này xem:

Tạo một Sub() để tạo mã theo nguyên tắc sau: Người dùng sẽ nhập vào mã bắt đầu gồm 5 chữ cái (XXXXX) và số lượng mã cần tạo (n), code sẽ tạo ra dãy n mã tiếp theo mã người dùng đã nhập. Các mã mới tạo nhập vào cột A bắt đầu từ A1.
Ví dụ: Nhập vào mã HUBIYn = 6. Code sẽ tạo ra các mã HUBIZ, HUBJA, HUBJB, HUBJC, HUBJD, HUBJE
Sao khó ngủ quá
Mã:
Private Sub CommandButton1_Click()
    Dim Ma As String, So As Integer, I As Integer, j As Integer
        Ma = [a1]
        So = [a2]
            If So > 26 Then MsgBox ("KHÔNG CHOI"): Exit Sub
            Range("b:b,C:C").ClearContents
                j = Asc(Right(Ma, 1))
                    For I = 1 To So
                        If j + I > 90 Then j = 65 - I
                        Cells(I, 2) = Replace(Ma, Right(Ma, 1), Chr((j) + I))
                    Next
    Range([b1], [b1].End(xlDown)).Offset(0, 1) = [row(A:A)]
End Sub
Nếu chạy đủ một vòng các chữ cái rồi thì làm gì nữa, hay chỉ chạy trong vòng các chữ cái rồi.....đi ngủ???
 

File đính kèm

  • Bt vonglap(1).xls
    30.5 KB · Đọc: 11
Upvote 0
Sao khó ngủ quá
Mã:
Private Sub CommandButton1_Click()
    Dim Ma As String, So As Integer, I As Integer, j As Integer
        Ma = [a1]
        So = [a2]
            If So > 26 Then MsgBox ("KHÔNG CHOI"): Exit Sub
            Range("b:b,C:C").ClearContents
                j = Asc(Right(Ma, 1))
                    For I = 1 To So
                        If j + I > 90 Then j = 65 - I
                        Cells(I, 2) = Replace(Ma, Right(Ma, 1), Chr((j) + I))
                    Next
    Range([b1], [b1].End(xlDown)).Offset(0, 1) = [row(A:A)]
End Sub
Nếu chạy đủ một vòng các chữ cái rồi thì làm gì nữa, hay chỉ chạy trong vòng các chữ cái rồi.....đi ngủ???
Trong yêu cầu đã có ví dụ cụ thể rồi còn gì, chạy 1 vòng thì bài này làm gì phải bàn nữa. Tổng quát thì bài này nhập vào N chữ cái(miễn sao ko có ký số) và M là số phần tử cần trả về. Tưởng tượng giống như COLUMN của excel ấy, nhập vào cột ban đầu là A thì cột thứ 26 là Z, cột 27 là AA, cột thứ 28 là AB, ... cột thứ 256 là IV
 
Upvote 0
Sao khó ngủ quá
Mã:
 1.           If So > 26 Then MsgBox ("KHÔNG CHOI"): Exit Sub
 2.          Range("b:b,C:C").ClearContents
 3.                        Cells(I, 2) = Replace(Ma, Right(Ma, 1), Chr((j) + I))
Nếu chạy đủ một vòng các chữ cái rồi thì làm gì nữa, hay chỉ chạy trong vòng các chữ cái rồi.....đi ngủ???

1. Nếu chỉ lấy 1 chữ cái, không có AA, AB, ... thì 25 thôi Cò ơi, 26 cũng không chơi nốt.
2. sao hông viết Range("B:C") cho nhẹ, lẹ, phẻ?
3. Dùng Replace vô đây không ổn, nếu A1 = ConcoC, thì kết quả mắc cười lắm, nào là Đón Cò, nào là Nón Cò, Rốn Cò, Sơn Cò, Tồn Cò, Vốn Cò, Bồn Cò, hihihihi luôn.
 
Upvote 0
Sao khó ngủ quá
Mã:
Private Sub CommandButton1_Click()
    Dim Ma As String, So As Integer, I As Integer, j As Integer
        Ma = [a1]
        So = [a2]
            If So > 26 Then MsgBox ("KHÔNG CHOI"): Exit Sub
            Range("b:b,C:C").ClearContents
                j = Asc(Right(Ma, 1))
                    For I = 1 To So
                        If j + I > 90 Then j = 65 - I
                        Cells(I, 2) = Replace(Ma, Right(Ma, 1), Chr((j) + I))
                    Next
    Range([b1], [b1].End(xlDown)).Offset(0, 1) = [row(A:A)]
End Sub
Nếu chạy đủ một vòng các chữ cái rồi thì làm gì nữa, hay chỉ chạy trong vòng các chữ cái rồi.....đi ngủ???
Chưa đúng theo ý của tác giả đâu Anh. Theo Em nghĩ quy luật bài toán này tương tự như cách chạy của đồng hồ bấm số ấy
(hh:mm:ss)
 
Upvote 0
Trong thời gian chờ đợi một bài tập hay các bạn thử làm bài này xem:

Tạo một Sub() để tạo mã theo nguyên tắc sau: Người dùng sẽ nhập vào mã bắt đầu gồm 5 chữ cái (XXXXX) và số lượng mã cần tạo (n), code sẽ tạo ra dãy n mã tiếp theo mã người dùng đã nhập. Các mã mới tạo nhập vào cột A bắt đầu từ A1.
Ví dụ: Nhập vào mã HUBIYn = 6. Code sẽ tạo ra các mã HUBIZ, HUBJA, HUBJB, HUBJC, HUBJD, HUBJE
Đây là bài toán ngược với bài toán này chuyển chỉ số cột thành chữ cái
 
Upvote 0
Chưa đúng theo ý của tác giả đâu Anh. Theo Em nghĩ quy luật bài toán này tương tự như cách chạy của đồng hồ bấm số ấy
(hh:mm:ss)
Tôi nghĩ cũng nên đưa ra một quy tắc chung luôn cho thống nhất. Gần giống như bạn nói, lấy quy tắc như chỉ số trên các công tơ. Khi chạy đến số 999999 thì chạy tiếp công tơ sẽ chạy về số 000000. Ở đây, khi đến mã ZZZZZ thì mã tiếp theo là AAAAA.
 
Upvote 0
Trong thời gian chờ đợi một bài tập hay các bạn thử làm bài này xem:
Tạo một Sub() để tạo mã theo nguyên tắc sau: Người dùng sẽ nhập vào mã bắt đầu gồm 5 chữ cái (XXXXX) và số lượng mã cần tạo (n), code sẽ tạo ra dãy n mã tiếp theo mã người dùng đã nhập. Các mã mới tạo nhập vào cột A bắt đầu từ A1.
Ví dụ: Nhập vào mã HUBIYn = 6. Code sẽ tạo ra các mã HUBIZ, HUBJA, HUBJB, HUBJC, HUBJD, HUBJE

Tôi nghĩ cũng nên đưa ra một quy tắc chung luôn cho thống nhất. Gần giống như bạn nói, lấy quy tắc như chỉ số trên các công tơ. Khi chạy đến số 999999 thì chạy tiếp công tơ sẽ chạy về số 000000. Ở đây, khi đến mã ZZZZZ thì mã tiếp theo là AAAAA.

Em mới nghĩ được đến đây thôi. Mong các bác chỉ bảo thêm
 

File đính kèm

  • Tao_Ma1.xls
    37 KB · Đọc: 21
Upvote 0
Tôi nghĩ cũng nên đưa ra một quy tắc chung luôn cho thống nhất. Gần giống như bạn nói, lấy quy tắc như chỉ số trên các công tơ. Khi chạy đến số 999999 thì chạy tiếp công tơ sẽ chạy về số 000000. Ở đây, khi đến mã ZZZZZ thì mã tiếp theo là AAAAA.
Bài này ngoài kiến thức về vòng lặp còn có chút về logic cơ số như bài toán ngược tôi đã giới thiệu trong bài 169, do đó với những bạn mới sẽ cảm thấy tương đối khó, boyxin đã đưa ra được lời giải nhưng có vẻ hơi rối, tôi xin đưa ra 2 cách làm như sau:(giả sử ô A1 chứa mã ban đầu, ô A2 chứa số mã tiếp theo cần sinh)
Cách 1:
Mã:
Sub Ma1()
    Dim sText As String, N As Integer
    sText = UCase([A1])
    N = [A2]
    Dim i As Integer, j As Integer, code As Integer, sTemp As String
    
    For i = 1 To N
        sTemp = ""
        For j = Len(sText) To 1 Step -1
            code = Asc(Mid(sText, j, 1)) - Asc("A") + 1
            sTemp = Chr(((code Mod 26) + 1) + Asc("A") - 1) & sTemp
            If code < 26 Then Exit For
        Next
        sText = Left(sText, IIf(j > 0, j - 1, 0)) & sTemp
        Range("B" & i) = sText
    Next
End Sub
Cách 2:
Mã:
Function Text2Number(sText As String) As Long
    sText = UCase(sText)
    Dim i As Integer
    Dim iRet As Long
    For i = 1 To Len(sText)
        iRet = iRet + (Asc(Mid(sText, i, 1)) - Asc("A") + 1) * (26 ^ (Len(sText) - i))
    Next
    Text2Number = iRet
End Function

Function Number2Text(iNumber As Long) As String
    If iNumber <= 26 Then
        Number2Text = Chr(iNumber + Asc("A") - 1)
    Else
        Number2Text = Number2Text((iNumber - 1) \ 26) & Chr(((iNumber - 1) Mod 26) + Asc("A"))
    End If
End Function

Sub Ma2()
    Dim sText As String, N As Integer
    sText = UCase([A1])
    N = [A2]
    
    Dim i As Integer, iTemp As Long
    iTemp = Text2Number(sText)
    For i = 1 To N
        Range("C" & i) = Number2Text(iTemp + i)
    Next
End Sub
 
Upvote 0
Em mới nghĩ được đến đây thôi. Mong các bác chỉ bảo thêm
Xét về kết quả thì bài giải của bạn đạt yêu cầu nhưng về thuật toán thì chưa tốt. Bạn sử dụng quá nhiều biến mà nếu bạn phân tích kỹ thì sẽ giảm được đáng kể số biến. Mặt khác, nếu mở rộng số ký tự của mã cần tạo là tự do chứ không phải là 5 ký tự thì thuật toán của bạn chưa giải quyết được.

Tôi xin hướng dẫn sơ về thuật toán của bài này như sau:
Trong mã gồm một dãy các chữ cái bạn chỉ cần quan tâm đến 1 chữ cái trong dãy đó, đó là chữ cái cuối cũng không phải là chữ "Z". Vì khi nhảy sang mã tiếp theo các chữ cái đứng trước chữ cái đó sẽ không đổi, bản thân chữ cái đó sẽ nhảy lên 1 đơn vị (tôi tạm gọi là đơn vị) và các chữ cái đứng sau chữ cái đó sẽ là chữ "A". Ví du:
- Mã TUAOBQ bạn cần quan tâm đến ký tự thứ 6 (ký tự cuối cùng không phải là chữ "Z"). Mã tiếp theo sẽ là TUAOBR
- Mã TUAOBZ bạn cần quan tâm đến ký tự thứ 5 (ký tự cuối cùng không phải là chữ "Z"). Mã tiếp theo sẽ là TUAOCA
- Mã TUAOZZ bạn cần quan tâm đến ký tự thứ 6 (ký tự cuối cùng không phải là chữ "Z"). Mã tiếp theo sẽ là TUAPAA
Kết hợp các hàm Len(),RTrim() Replace() để xác định vị trí của ký tự này.
 
Upvote 0
Quan điểm của tôi là suy luận logic, nhưng ưu tiên thuật toán đơn giản.
Logic của bài này rõ ràng là tương tự hệ đếm cơ số 26. Tuy vậy, không nhất thiết phải xài đến công thức liên quan đến 26^n hay i Mod 26.

Tôi suy luận theo hướng:
- nếu ASC(ký tự cuối số 5) < 90, thì cộng 1, nếu = 90, quay về 65
- Nếu Asc(ký tự 5) = 90, và nếu Asc(ký tự 4) = 90, quay về 65, nếu asc(ký tự 4) <> 90, thì tăng 1. ...,
- tương tự các ký tự khác
Code rất ngắn, 1 vòng lặp, chưa dùng mảng đã xem xem code boyxin chậm hơn 1 chút xíu thôi.

Vấn đề là suy luận hướng này phù hợp với người mới làm quen tư duy logic, theo kiểu đồng hồ đo điện: 00099 thành 00100, 99999 trở về 00000

Nếu dùng mảng, 60.000 mã dưới 1 giây (máy què 1 cây ram, chỉ còn 1 cây):

PHP:
Sub taoma()
Dim Ma As String, So As Long, N(1 To 5), MaN()
Ma = [A1]: So = [b1]
ReDim MaN(So, 1)
t = Timer
For i = 1 To 5
    N(i) = Asc(Mid(Ma, i, 1))
Next

For i = 1 To So
    N(1) = IIf(N(2) = 90 And N(3) = 90 And N(4) = 90 And N(5) = 90, IIf(N(1) = 90, 65, N(1) + 1), N(1))
    N(2) = IIf(N(3) = 90 And N(4) = 90 And N(5) = 90, IIf(N(2) = 90, 65, N(2) + 1), N(2))
    N(3) = IIf(N(4) = 90 And N(5) = 90, IIf(N(3) = 90, 65, N(3) + 1), N(3))
    N(4) = IIf(N(5) = 90, IIf(N(4) = 90, 65, N(4) + 1), N(4))
    N(5) = IIf(N(5) = 90, 65, N(5) + 1)
    MaN(i, 1) = Chr(N(1)) & Chr(N(2)) & Chr(N(3)) & Chr(N(4)) & Chr(N(5))
Next
Range("A2:A" & So + 1) = MaN
[b2] = Timer - t
End Sub
 

File đính kèm

  • Mazzz.xls
    24.5 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Cách của tôi cũng gần giống với rollover79, tức dựa vào việc chuyển cơ số
PHP:
Function StrToN26(Text As String) As Long
  Dim i As Long, Temp As Long
  Const ALPHAB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  Text = UCase(Text)
  For i = 1 To Len(Text)
    If InStr(ALPHAB, Mid(Text, i, 1)) = 0 Then Exit Function
    Temp = Temp + (InStr(ALPHAB, Mid(Text, i, 1)) - 1) * 26 ^ (Len(Text) - i)
  Next
  StrToN26 = Temp
End Function
PHP:
Function N26ToStr(Num As Long) As String
  Dim rd As Long, qt As Long, Temp As Long
  Const ALPHAB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  Temp = Num
  Do
    rd = Int(Temp / 26)
    qt = Temp Mod 26
    Temp = rd
    N26ToStr = Mid(ALPHAB, qt + 1, 1) & N26ToStr
  Loop Until rd = 0
End Function
PHP:
Function GetCodelist(stCode As String, Amount As Long, Length As Long)
  Dim Temp As Long, i As Long, Arr()
  ReDim Arr(1 To Amount, 1 To 1)
  Temp = StrToN26(stCode)
  Arr(1, 1) = Right(String(Length, "A") & stCode, Length)
  For i = 1 To Amount - 1
    Arr(i + 1, 1) = Right(String(Length, "A") & N26ToStr(Temp + i), Length)
  Next
  GetCodelist = Arr
End Function
Thuật toán:
- Có 1 chuổi cho trước, ta chuyển chúng thành giá trị số theo cơ số 26
- Lần lượt cộng vào kết quả từng đơn vị một rồi chuyển chúng sang chuổi (cũng theo cơ số 26)
Xem file
 

File đính kèm

  • GetCodeList.xls
    22 KB · Đọc: 20
Upvote 0
Nếu bài tập vòng lặp cho người mới mà dùng hàm, lại là hàm mảng nữa thì làm sao mọi người theo kịp? Do đó tôi chỉ dùng sub và thuật toán đơn giản. Nếu kèm theo giải thích nữa thì càng tốt.
Bài này tương đối khó, cần phải dựa vào quan sát tìm ra quy luật.
Thuật toán tìm ký tự cuối không phải Z của huuthangbd cũng là dựa vào quan sát.

Việc chuyển Sub thành Function có lẽ nên mở 1 topic mới.
 
Upvote 0
Xét về kết quả thì bài giải của bạn đạt yêu cầu nhưng về thuật toán thì chưa tốt. Bạn sử dụng quá nhiều biến mà nếu bạn phân tích kỹ thì sẽ giảm được đáng kể số biến. Mặt khác, nếu mở rộng số ký tự của mã cần tạo là tự do chứ không phải là 5 ký tự thì thuật toán của bạn chưa giải quyết được.

Tôi xin hướng dẫn sơ về thuật toán của bài này như sau:
Trong mã gồm một dãy các chữ cái bạn chỉ cần quan tâm đến 1 chữ cái trong dãy đó, đó là chữ cái cuối cũng không phải là chữ "Z". Vì khi nhảy sang mã tiếp theo các chữ cái đứng trước chữ cái đó sẽ không đổi, bản thân chữ cái đó sẽ nhảy lên 1 đơn vị (tôi tạm gọi là đơn vị) và các chữ cái đứng sau chữ cái đó sẽ là chữ "A".
Kết hợp các hàm Len(),RTrim() Replace() để xác định vị trí của ký tự này.

- Tìm vị trí ký tự Z đầu tiên bằng Instr, trừ đi 1 ra ký tự cuối không phải Z (bên trái Z). (Có điều kiện kèm theo khi tìm không có ký tự Z nào)
- Còn phải xác định ký tự cuối có phải Z hay không nữa, rồi mới quyết định tăng 1 "đơn vị" cho "ký tự cuối" hay "ký tự cuối cùng không phải Z". Nghĩa là còn phải xem sau chữ Z đầu tiên, có ký tự không phải Z nào hay không, lấy ký tự cuối cùng không phải Z bên phải Z để tăng 1 đơn vị.
 
Lần chỉnh sửa cuối:
Upvote 0
Với chuỗi gồm 5 ký tự ban đầu sẽ có thể tạo ra 26^5 = 11 881 376 mã khác nhau

Nếu muốn liệt kê 120 000 mã thôi (khoảng 1% tổng số) khi đó có cần quan tâm đến tốc độ xử lý không?

Vấn đề code dài hay ngắn, dễ nhìn hay rối mắt liệu có quan trọng bằng so với việc cho code chạy 1 nhát thì ngỗi đợi như vô quán cafe hay què RAM ... Nên khi xử lý dữ liệu lớn, mình thường hay quan tâm đến tốc độ xử lý (thuật toán) và cách trình bày hơn so với việc rút gọn code hay trình bày code dễ nhìn.

Sau khi đạt kết quả đúng theo yêu cầu rồi thì mới tính đến chuyện nâng cấp, mởi rộng, ... Không biết các bác tính sao về vấn đề này
 
Upvote 0
Nếu bài tập vòng lặp cho người mới mà dùng hàm, lại là hàm mảng nữa thì làm sao mọi người theo kịp? Do đó tôi chỉ dùng sub và thuật toán đơn giản. Nếu kèm theo giải thích nữa thì càng tốt.
Bài này tương đối khó, cần phải dựa vào quan sát tìm ra quy luật.
Thuật toán tìm ký tự cuối không phải Z của huuthangbd cũng là dựa vào quan sát.

Việc chuyển Sub thành Function có lẽ nên mở 1 topic mới.
Nếu sư phụ không thích mảng thì bỏ code thứ 3 đi, khi ấy ta dùng như sau:
- Giả sử nhập vào cell A1 code gì đó
- Tại A2 ta gõ công thức:
PHP:
=RIGHT(REPT("A",LEN(A1)) & N26ToStr(StrToN26(A1)+1),LEN(A1))
- Kéo fill xuống đến đâu tùy ý
-----------------
Còn chuyện Function hay Sub em nghĩ nó cũng như nhau thôi mà sư phụ!
 
Upvote 0
Xét về kết quả thì bài giải của bạn đạt yêu cầu nhưng về thuật toán thì chưa tốt. Bạn sử dụng quá nhiều biến mà nếu bạn phân tích kỹ thì sẽ giảm được đáng kể số biến. Mặt khác, nếu mở rộng số ký tự của mã cần tạo là tự do chứ không phải là 5 ký tự thì thuật toán của bạn chưa giải quyết được.

Tôi xin hướng dẫn sơ về thuật toán của bài này như sau:
Trong mã gồm một dãy các chữ cái bạn chỉ cần quan tâm đến 1 chữ cái trong dãy đó, đó là chữ cái cuối cũng không phải là chữ "Z". Vì khi nhảy sang mã tiếp theo các chữ cái đứng trước chữ cái đó sẽ không đổi, bản thân chữ cái đó sẽ nhảy lên 1 đơn vị (tôi tạm gọi là đơn vị) và các chữ cái đứng sau chữ cái đó sẽ là chữ "A". Ví du:
- Mã TUAOBQ bạn cần quan tâm đến ký tự thứ 6 (ký tự cuối cùng không phải là chữ "Z"). Mã tiếp theo sẽ là TUAOBR
- Mã TUAOBZ bạn cần quan tâm đến ký tự thứ 5 (ký tự cuối cùng không phải là chữ "Z"). Mã tiếp theo sẽ là TUAOCA
- Mã TUAOZZ bạn cần quan tâm đến ký tự thứ 6 (ký tự cuối cùng không phải là chữ "Z"). Mã tiếp theo sẽ là TUAPAA
Kết hợp các hàm Len(),RTrim() Replace() để xác định vị trí của ký tự này.
Đây là code theo thuật toán tôi đã trình bày:
PHP:
Sub Test()
Dim Str As String, N As Long, i As Long, C As Long
ActiveSheet.[A:A].ClearContents
Str = UCase(InputBox("Ma bat dau:", , "AAAAAA"))
N = InputBox("So ma can tao:", , 1000)
For i = 1 To N
    C = Len(RTrim(Replace(Str, "Z", " ")))
    If C = 0 Then
        Str = String(Len(Str), "A")
    Else
        Str = Left(Str, C - 1) & Chr(Asc(Mid(Str, C, 1)) + 1) & String(Len(Str) - C, "A")
    End If
    Cells(i, 1).Value = Str
Next
End Sub
Vì là bài tập về vòng lặp nên tôi thấy việc gán kết quả vào mảng để cải thiệt tốc độ là không cần thiết. Điều quan trọng là thuật toán.
- Tìm vị trí ký tự Z đầu tiên bằng Instr, trừ đi 1 ra ký tự cuối không phải Z (bên trái Z). (Có điều kiện kèm theo khi tìm không có ký tự Z nào)
- Còn phải xác định ký tự cuối có phải Z hay không nữa, rồi mới quyết định tăng 1 "đơn vị" cho "ký tự cuối" hay "ký tự cuối cùng không phải Z". Nghĩa là còn phải xem sau chữ Z đầu tiên, có ký tự không phải Z nào hay không, lấy ký tự cuối cùng không phải Z bên phải Z để tăng 1 đơn vị.
Kết hợp các hàm Len(),RTrim() Replace() để xác định vị trí của ký tự cuối cùng không phải là "Z" có lẽ sẽ đơn giản hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Vì là bài tập về vòng lặp nên tôi thấy việc gán kết quả vào mảng để cải thiệt tốc độ là không cần thiết.
ah... không bạn à! Mảng tôi dùng ở đây không phải với mục đích tăng tốc (thực chất cũng không hề tăng tốc tí nào)... mà là để dễ sử dụng ---> Chẳng hạn người ta muốn tạo 10 mã thì chỉ việc quét chọn 10 cell rồi gõ công thức trên thanh Formula, Ctrl + Shift + Enter để ra kết quả
Chỉ vậy thôi
 
Upvote 0
ah... không bạn à! Mảng tôi dùng ở đây không phải với mục đích tăng tốc (thực chất cũng không hề tăng tốc tí nào)... mà là để dễ sử dụng ---> Chẳng hạn người ta muốn tạo 10 mã thì chỉ việc quét chọn 10 cell rồi gõ công thức trên thanh Formula, Ctrl + Shift + Enter để ra kết quả
Chỉ vậy thôi
Tôi đang đề cập đến việc gán kết quả vào mảng trước khi nhập vào sheet như trong bài giải của boyxin ptm0412.
 
Upvote 0
Web KT
Back
Top Bottom