Biến một hàng thành 3, chuyển đổi ngược dữ liệu ?

Liên hệ QC

emty0824

Thành viên mới
Tham gia
22/5/10
Bài viết
3
Được thích
0
Nhờ các bạn giúp giùm mình cách tao thêm một cột mói lấy dữ liệu từ một cột trước đó nhưng x3 lên, như thế này nay:

excel111.jpg


Và làm thế nào để chuyển đổi ngược dữ liệu lại, giống như thế này:

excel222.jpg
 
vấn đề thứ hai thì có nhiều người đã viết hàm rùi. Nhưng theo mình Hàm dùng ngon ngon có lẽ hàm của AnhTuan dùng ngon nhất thì phải
bạn tham khảo thêm file
 
Chỉnh sửa lần cuối bởi điều hành viên:
Yêu cầu số hai của bạn đây, xin mời

PHP:
Option Explicit
Function DaoChu(StrC As String) As String
 DaoChu = StrReverse(StrC)
End Function
 
Thế còn vấn đề một thì sao anh ?
 
Hườn dẫn sử dụng bạn ơi. Mình chỉ biết sơ sơ về Excel thui. >_<
 
Hườn dẫn sử dụng bạn ơi. Mình chỉ biết sơ sơ về Excel thui. >_<
Hướng dẫn sử dụng thì có hướng dẫn.
*/ ở câu đảo chữ yêu cầu hai: cách dùng như sau.
- trong cell bất kỳ nào đó. bạn gõ =Dao(A1)===> Enter là ra kết quả. ( để xem code bạn nhấn ALt+f11.
A1 : là ô dữ liệu bạn muốn đảo ngược chẳng hạn.
*/ yêu cầu 1 bạn nhấn vào cái nút commanbutton đó là ok.( xem code thì nhấn Alt +f11 sẽ hiển thị code.)
 
Khoa Vu à, việc đảo chuỗi thì UDF thua hẳn StrReverse(text) của VBA vậy nên dùng cách lôi nó tư VBA vào Excell như bác ChanhTQ làm là ngon nhất.
Mã:
Function Rev(text) As String
Rev = StrReverse(text)
End Function
Còn sub tính thì sao để nhiều vòng lặp và nhiều lệnh trùng quá.
Mình sửa lại chút và sử dụng đảo chuỗi nha
Mã:
Sub tinh()
Dim kt As Integer, dg As Range
kt = MsgBox("Co dao khong. Co nhan OK?", vbOKCancel)
Set dg = Sheet1.[b56536].End(xlUp)
For i = 1 To 9
If kt = 1 Then
dg.Offset(i) = Rev(Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2))))
Else
dg.Offset(i) = Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2)))
End If
Next
End Sub
Có thể bỏ hàm Rev (Để 2 in 1) bằng cách thay câu lệnh sau
dg.Offset(i) = Rev(Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2))))
Bằng
dg.Offset(i) = StrReverse(Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2))))
 

File đính kèm

Lần chỉnh sửa cuối:
Thế còn vấn đề một thì sao anh ?

Đây, mại zô:

PHP:
Option Explicit
Sub ChuyenThanh3Dong()
 Dim Clls As Range
 
 Columns("B:B").ClearContents
 [B1].Value = "KQua"
 For Each Clls In Range([A1], [A1].End(xlDown))
   With [B65500].End(xlUp).Offset(1)
      .Resize(3).Value = Clls.Value
   End With
 Next Clls
End Sub
 
Khoa Vu à, việc đảo chuỗi thì UDF thua hẳn StrReverse(text) của VBA vậy nên dùng cách lôi nó tư VBA vào Excell như bác ChanhTQ làm là ngon nhất.
Mã:
Function Rev(text) As String
Rev = StrReverse(text)
End Function
Còn sub tính thì sao để nhiều vòng lặp và nhiều lệnh trùng quá.
Mình sửa lại chút và sử dụng đảo chuỗi nha
Mã:
Sub tinh()
Dim kt As Integer, dg As Range
kt = MsgBox("Co dao khong. Co nhan OK?", vbOKCancel)
Set dg = Sheet1.[b56536].End(xlUp)
For i = 1 To 9
If kt = 1 Then
dg.Offset(i) = Rev(Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2))))
Else
dg.Offset(i) = Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2)))
End If
Next
End Sub
Có thể bỏ hàm Rev (Để 2 in 1) bằng cách thay câu lệnh sau
dg.Offset(i) = Rev(Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2))))
Bằng
dg.Offset(i) = StrReverse(Sheet1.[a1].Offset(IIf(i < 4, 0, IIf(i < 7, 1, 2))))

Cái sub này chỉ tính cho 3 hàng có số chứ không tính cho nhiều hàng, nếu tính cho nhiều hàng hơn và vẫn nhân ba lên thì dung cái này tổng quát hơn

PHP:
Sub Tinh()
    Dim m, n, i, j As Integer
    m = Range("D65000").End(xlUp).Row
    Range("D1:D" & m).Clear
    n = Range("A65000").End(xlUp).Row
    For j = 1 To 3
        For i = 1 To n
            Range("D" & 3 * i - 3 + j) = Range("A" & i)
        Next i
    Next j
End Sub
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Nếu tổng quát hơn nữa thì nên dùng code sau
PHP:
Private Sub ChuyenHang_Click()
Const solan As Long = 3
    Dim n As Long, i As Long, fR As Long
    Range("D1:D1000").Clear
    n = Range("A65000").End(xlUp).Row
    fR = 1
        For i = 1 To n
           Range("D" & fR & ":D" & fR + solan - 1).Value = Range("A" & i).Value
           fR = fR + solan
        Next i
    
End Sub
Muốn gán mấy dòng thì thay 3 = X
Const solan As Long = 3
 
Không viết thì không ngủ được, còn viết thì là SPAM!

Nếu tổng quát hơn nữa thì nên dùng code sau
Mã:
[COLOR=Silver]Private Sub ChuyenHang_Click()
Const solan As Long = 3
    Dim n As Long, i As Long, fR As Long
    Range("D1:D1000").Clear
    n = Range("A65000").End(xlUp).Row
    fR = 1
        For i = 1 To n[/COLOR]
          [B] Range("D" & fR & ":D" & fR + solan - 1).Value = Range("A" & i).Value[/B]
[COLOR=Silver]           fR = fR + solan
        Next i
    
End Sub[/COLOR]
Muốn gán mấy dòng thì thay 3 = X
Const solan As Long = 3

Chứ thực ra câu lệnh tô đậm đó dài dòng vậy chứ có khác gì dùng fương thức Resize( 3) của tui đâu!

Còn muốn tự động hóa thêm ư; Thay con 3 đó bằng 1 Const là OK tuốt!

Chúc cuối tuần vui vẻ!
 
Câu 2 bất đắc dĩ mới dùng VBA, còn câu 1 tôi thích làm công thức hơn:
=INDEX($A$2:$A$6,INT((ROW(A1)-1)/3)+1,1)

(dùng cho dữ liệu gốc 5 ô từ A2 đến A6. Sửa thành bao nhiêu cũng được)

Fill down.
Công thức bình thường, không gây chậm máy.
 
Lần chỉnh sửa cuối:
Câu 2 bất đắc dĩ mới dùng VBA, còn câu 1 tôi thích làm công thức hơn:
=INDEX($A$2:$A$6,INT((ROW(A1)-1)/3)+1,1)

(dùng cho dữ liệu gốc 5 ô từ A2 đến A6. Sửa thành bao nhiêu cũng được)

Fill down.
Công thức bình thường, không gây chậm máy.
Thú thật em cũng chả muốn code hay ct gì cả, chỉ cần copy, tính số lượng dòng cần dán = bội số của số lần và dán, xong sort lại, nếu cần thêm cột stt cho dễ sort.
 
Web KT

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

Back
Top Bottom