(/iết dùm mình hai macro thêm dòng có điều kiện sau đây (2 người xem)

  • Thread starter Thread starter ChanhTQ@
  • Ngày gửi Ngày gửi
Liên hệ QC

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

ChanhTQ@

0901452không62
Tham gia
5/9/08
Bài viết
4,254
Được thích
4,861
Mình có bảng dữ liệu như sau

| A |
1 |GPE.COM.00|
2 |GPE01 2|
3 |GPE02 9|
4 |GPE03 3|
5 |GPE04 8|
6 |GPE05 5|
7 |GPE06 13|
8 |GPE07 259|
9 ||

Bằng 2 cách, các bạn thêm n dòng ngay dưới dòng dữ liệu; Ở đây, n là chỉ số được viết rời fía cuối của dữ liệu

Ví dụ như dòng 8: "GPE07 259" là thêm 259 dòng dưới dòng dữ liệu này

Xin trân trọng cảm ơn!
 
Lần chỉnh sửa cuối:
Mình có bảng dữ liệu như sau

| A |
1 |GPE.COM.00|
2 |GPE01 2|
3 |GPE02 9|
4 |GPE03 3|
5 |GPE04 8|
6 |GPE05 5|
7 |GPE06 13|
8 |GPE07 259|
9 ||

Bằng 2 cách, các bạn thêm n dòng ngay dưới dòng dữ liệu; Ở đây, n là chỉ số được viết rời fía cuối của dữ liệu

Ví dụ như dòng 8: "GPE07 259" là thêm 259 dòng dưới dòng dữ liệu này

Xin trân trọng cảm ơn!

Vui lòng góp ý cho mình code này có ổn không

PHP:
Sub chenthemdong()
For i = 8 To 2 Step -1
    a = Cells(i, 1)
    n = Val(Right(a, Len(a) - InStrRev(a, " ")))
    dong = i + 1
    Range(dong & ":" & dong + n - 1).EntireRow.Insert
Next
End Sub
 
Upvote 0
Vui lòng góp ý cho mình code này có ổn không

PHP:
Sub chenthemdong()
For i = 8 To 2 Step -1
    a = Cells(i, 1)
    n = Val(Right(a, Len(a) - InStrRev(a, " ")))
    dong = i + 1
    Range(dong & ":" & dong + n - 1).EntireRow.Insert
Next
End Sub
Bằng cách tính toán bợp lý, ta đưa các giá trị vào vị trí thích hợp trong 1 mảng ---> Cuối cùng "đập" 1 phát vào bảng tính luôn mới sướng
 
Upvote 0
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em không hiểu! 2 macro nghĩa là sao hả sư phụ? Chia ra làm 2 Sub à?
Sư phụ "quất" 2 xị vào là ra code ngay thôi mà
Có nghĩa là lập ra 2 macro với 2 fương án khác nhau,

Như bài đã trả lời là làm từ dưới lên;
Thì cách 2 là làm từ trên đi làm xuống; Hoặc cách nào khác nữa . . . . chẳng hạn, như NDU đã vẽ.
 
Upvote 0
Có nghĩa là lập ra 2 macro với 2 fương án khác nhau,

Như bài đã trả lời là làm từ dưới lên;
Thì cách 2 là làm từ trên đi làm xuống; Hoặc cách nào khác nữa . . . . chẳng hạn, như NDU đã vẽ.

Cũng ráng thêm 1 code nữa xem thế nào, có thể chưa đẹp nhưng đủ 2 phương án rồi nha.

PHP:
Sub chenthemdong2()
Dim arrkq(1 To 1000, 1 To 1), dl
dl = [a2:a8].Value
j = 1
For i = 1 To UBound(dl)
    a = dl(i, 1)
    n = Val(Right(a, Len(a) - InStrRev(a, " "))) + 1
    arrkq(j, 1) = dl(i, 1)
    j = j + n
Next
[A2].Resize(j, 1) = arrkq
End Sub
 
Upvote 0
Macro thứ 2 này chỉ mang tính giải thuật thôi, không có tính thực tiển

Vì trong thực tế, dữ liệu không thể chỉ trên cột 'A' mà còn ở các cột sau nó nữa.

2uang Hải làm vậy là fá vỡ CSDL cũ rồi còn đâu!

Thực ra bài toán này đã có ai đó trên diễn đàn nêu ra rồi (ngành xây dựng hay sao í!); Mình chỉ việc thêm 1 iêu cầu nữa (viết thêm 1 fương án, lời giải) cho xôm tụ mà thôi.

2uang Hải thử thêm 1 cột trước cột 'A' & đánh ố thứ tự theo kiểu

A, B, C, D, E, F, G cho 7 dòng dữ liệu, sau đó A1, A2, B1, B2,B3,. . . .

& bước cuối là xếp lại

Thực ra việc thêm dòng từ trên xuống vẫn thực hiện được bỡi vòng lặp Do . . . Loop & nhẹ nhàng hơn cách mình nêu bên trên. Chắc vậy.

Mong 2uang Hải tiếp tục thêm 1 macro nữa!
 
Upvote 0
Mình có bảng dữ liệu như sau

| A |
1 |GPE.COM.00|
2 |GPE01 2|
3 |GPE02 9|
4 |GPE03 3|
5 |GPE04 8|
6 |GPE05 5|
7 |GPE06 13|
8 |GPE07 259|
9 ||

Bằng 2 cách, các bạn thêm n dòng ngay dưới dòng dữ liệu; Ở đây, n là chỉ số được viết rời fía cuối của dữ liệu

Ví dụ như dòng 8: "GPE07 259" là thêm 259 dòng dưới dòng dữ liệu này

Xin trân trọng cảm ơn!

Hỏi thì phải trình bầy rõ chứ như đánh đố nhau thế?
Dữ liệu bạn đưa ra chỉ là ví dụ. Mà dữ liệu ví dụ thì luôn có thể do ngẫu nhiên mà gây hiểu lầm cho người đọc. Vì thế luôn phải miêu tả dữ liệu.
Chẳng hạn nhìn dữ liệu ví dụ thì có vẻ luôn lấy từ dấu cách cuối cùng. Vậy thì với dòng 1 thì lấy số nào đây? Số 0? Có đúng là luôn lấy từ dấu cách cuối cùng? Dấu cách này luôn tồn tại? Hay cái vụ dấu cách này chỉ là ngẫu nhiên trong dữ liệu ví dụ?
Bạn viết: "n là chỉ số được viết rời fía cuối của dữ liệu", như vậy dòng 1 phải hiểu như thế nào?
Miêu tả, miêu tả nữa, miêu tả mãi.
Góp ý về cách đặt vấn đề thôi chứ code chả có gì khó cả.
 
Lần chỉnh sửa cuối:
Upvote 0
Hỏi thì phải trình bầy rõ chứ như đánh đố nhau thế?
Dữ liệu bạn đưa ra chỉ là ví dụ. Mà dữ liệu ví dụ thì luôn có thể do ngẫu nhiên mà gây hiểu lầm cho người đọc. Vì thế luôn phải miêu tả dữ liệu.
Chẳng hạn nhìn dữ liệu ví dụ thì có vẻ luôn lấy từ dấu cách cuối cùng. Vậy thì với dòng 1 thì lấy số nào đây? Số 0? Có đúng là luôn lấy từ dấu cách cuối cùng? Dấu cách này luôn tồn tại? Hay cái vụ dấu cách này chỉ là ngẫu nhiên trong dữ liệu ví dụ?
Bạn viết: "n là chỉ số được viết rời fía cuối của dữ liệu", như vậy dòng 1 phải hiểu như thế nào?
Miêu tả, miêu tả nữa, miêu tả mãi.
Góp ý về cách đặt vấn đề thôi chứ code chả có gì khó cả.

Theo tôi thấy thì dòng 1 không có dấu cách nào như siwtom nói, còn các dòng phía dưới thỏa điều kiện đề bài: n là chỉ số được viết rời fía cuối của dữ liệu

Vậy có thể hiểu là "luôn lấy từ dấu cách cuối cùng", còn "dấu cách luôn tồn tại" thì đề bài sai dữ liệu dòng 1.
 
Upvote 0
Theo tôi thấy thì dòng 1 không có dấu cách nào như siwtom nói, còn các dòng phía dưới thỏa điều kiện đề bài: n là chỉ số được viết rời fía cuối của dữ liệu

Vậy có thể hiểu là "luôn lấy từ dấu cách cuối cùng", còn "dấu cách luôn tồn tại" thì đề bài sai dữ liệu dòng 1.

Cũng có thể dữ liệu của người ta như thế. Lúc này thì không có chuyện sai hay đúng dữ liệu, vì dữ liệu là như thế, chấm hết. Chỉ có điều là phải miêu tả dữ liệu đó.
Ví dụ miếu tả dữ liệu (không hẳn là cho chủ đề này):
Dữ liệu luôn tận cùng bởi số tự nhiên, tức có dạng "a...bx...y" trong đó a...b là dãy k (k >= 0) ký tự tận cùng bởi ký tự không là ký tự chữ số, còn x...y là dãy m (m >= 1) ký tự chữ số. Nói đơn giản thì với kiểu miêu tả trên thì trước chữ số đầu tiên của số cuối cùng là ký tự không là chữ số. Ví dụ: 123, a123, a 345, a-678, a.90, a123b456, 789a123 v...v
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu là tôi ra đề thì tôi viết thế này:

<Bảng dữ liệu> (có thể y như bài 1)
Dòng 1 là dòng tiêu đề.
Yêu cầu:
Viết 2 đoạn macro VBA bằng 2 thuật toán khác nhau để thực hiện cùng 1 yêu cầu sau:
Bên dưới mỗi dòng dữ liệu kể từ dòng 2, chèn 1 số dòng trắng, số dòng chèn vào bằng với nhóm chữ số sau cuối của dữ liệu, nhóm chữ số này đã cách ra 1 khoảng trắng.

Nghĩa là:
- khẳng định không thực hiện cho dòng 1. Ngoài ra, tiêu đề tôi sẽ đặt khác với dữ liệu, tránh gây hiểu nhầm với người đọc
- khẳng định nhóm chữ số cuối cùng của dữ liệu luôn cách ra bằng 1 khoảng trắng.

Nên đề bài ra như vậy sẽ rõ ràng hơn bài 1.
 
Lần chỉnh sửa cuối:
Upvote 0
/-)ề bài đúng như PTM0412 đã diễn dịch;

& nói thêm rằng bạn 2uang Hải đã hiểu đề bài như PTM0412 đã fiên âm.
Rất mong các bạn có <=600 bài tiếp tục gởi những lời giải khác.

)(in chân thành cảm ơn vì tất cả.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác muốn em Do... Loop và đi từ trên xuống thì em cũng cố thử
sức xem thế nào. Dù sao cũng là giải trí mà lo gì. Để từ
từ em sẽ thử thêm cách khác. Cách này không có phá CSDL à nghen.

PHP:
Sub chenthemdong3()
r = 2
Do
    If Cells(r, 1) = "" Then
        a = Cells(r, 1).End(4)
        i = Cells(r, 1).End(4).Row
    Else
        a = Cells(r, 1)
        i = Cells(r, 1).Row
    End If
        n = Val(Right(a, Len(a) - InStrRev(a, " ")))
        Range(i + 1 & ":" & i + n).EntireRow.Insert
        r = i + n
Loop Until Cells(r, 1).End(4) = ""
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Và đây là phương án For ... Next của em đây

PHP:
Sub chenthemdong2()
Dim dl, i, j, n
dl = [a2:a8].Value
j = 2
For i = 1 To UBound(dl)
    n = Val(Right(dl(i, 1), Len(dl(i, 1)) - InStrRev(dl(i, 1), " ")))
    Range(j + 1 & ":" & j + n).EntireRow.Insert
    j = j + 1 + n
Next
End Sub
 
Upvote 0
Chưa xét về tốc độ, thì đây cũng là í tưởng fát sinh từ "2uang Hải"

PHP:
Option Explicit
Sub AddRows4()
 Dim DL, I, J, N
 Columns("A:A").Insert Shift:=xlToRight
 DL = [B2:B8].Value:        [A1].Value = [b1].Value
 J = 2:                           [A8].Value = "A8"
 For I = 1 To UBound(DL)
    N = Val(Right(DL(I, 1), Len(DL(I, 1)) - InStrRev(DL(I, 1), " ")))
    Cells(I + 1, "A") = "A" & I
    With [A65500].End(xlUp).Offset(1)
        .Resize(N).Value = "A" & I & N
    End With
 Next
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub AddRows4()
 Dim DL, I, J, N
 Columns("A:A").Insert Shift:=xlToRight
 DL = [B2:B8].Value:        [A1].Value = [b1].Value
 J = 2:                           [A8].Value = "A8"
 For I = 1 To UBound(DL)
    N = Val(Right(DL(I, 1), Len(DL(I, 1)) - InStrRev(DL(I, 1), " ")))
    Cells(I + 1, "A") = "A" & I
    With [A65500].End(xlUp).Offset(1)
        .Resize(N).Value = "A" & I & N
    End With
 Next
End Sub

Sao em chạy code thử thì hình như ra gì đó không phải chèn dòng, suy nghĩ mãi vẫn chưa hiểu. Giải thích dùm em đi.
 
Upvote 0
Bằng cách tính toán bợp lý, ta đưa các giá trị vào vị trí thích hợp trong 1 mảng ---> Cuối cùng "đập" 1 phát vào bảng tính luôn mới sướng
Đập 1 phát theo ý Ndu thử coi:
PHP:
Public Sub GPE1()
On Error Resume Next
Dim Rng(), Arr(), I As Long, J As Long, K As Long, Tem As Long, N As Long, C As Long
    C = Sheet1.[IV1].End(xlToLeft).Column
    Rng = Sheet1.Range(Sheet1.[A2], Sheet1.[A65000].End(xlUp)).Resize(, C).Value
ReDim Arr(1 To 65000, 1 To C)
    K = 1
    For I = 1 To UBound(Rng, 1)
        If Rng(I, 1) <> "" Then
            N = InStr(1, Rng(I, 1), " ")
                If N Then Tem = Mid(Rng(I, 1), N + 1, 10)
                    For J = 1 To C
                        Arr(K, J) = Rng(I, J)
                Next J
            K = K + Tem + 1
        End If
    Next I
Sheet1.[A2].Resize(K, C).Value = Arr
End Sub
 
Upvote 0
Em cũng nghe theo ý của anh NDU và đi theo anh BaTê đập 1 phát sướng thật

PHP:
Sub chenthemdong4()
Dim dl, cotcuoi, i, ii, j, a, N
dl = [a1].CurrentRegion
cotcuoi = UBound(dl, 2)
ReDim arrkq(1 To 65536, 1 To cotcuoi)
j = 1
For i = 2 To UBound(dl)
    a = dl(i, 1)
    N = Val(Right(a, Len(a) - InStrRev(a, " "))) + 1
        For ii = 1 To cotcuoi
            arrkq(j, ii) = dl(i, ii)
        Next
    j = j + N
Next
[A2].Resize(j - 1, cotcuoi) = arrkq
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom