Là một cựu người dùng Lotus 1-2-3 hạng nặng ở công việc trước đây, Patti đã RẤT gắn bó với một tính năng mà Excel rất thiếu: khả năng chuyển dữ liệu theo ba chiều. Chuyển vị hai chiều được hỗ trợ trong Excel, nhưng Patti chưa tìm ra cách lấy một hàng hoặc cột hoặc bảng và trải nó qua một chồng trang tính. Đây là một chức năng được mọi người trong văn phòng tài chính của cô ấy sử dụng hàng ngày và cô ấy thực sự nhớ nó.

Patti đúng; không có chức năng tích hợp nào để thực hiện việc này trong Excel. Tùy chọn gần nhất là sử dụng PivotTable và các khả năng “Hiển thị trang” mà nó bao gồm. Nói chung, bạn làm theo các bước sau:

  1. Tạo PivotTable từ dữ liệu của bạn như bình thường.

  2. Đặt cột mà bạn muốn trang tính được tạo vào phần “Trang” của PivotTable.

  3. Trên thanh công cụ PivotTable, bấm vào tùy chọn PivotTable ở bên trái thanh công cụ. Excel hiển thị một số tùy chọn bạn có thể chọn.

  4. Chọn Hiển thị Trang. Excel yêu cầu bạn xác nhận rằng bạn muốn hiển thị các trang.

  5. Bấm OK.

Những gì bạn kết thúc là một loạt các bảng tính, mỗi bảng tính cho mỗi mục nhập cột bạn đã chỉ định ở bước 2. Mỗi bảng tính đó chứa một “trang”

của PivotTable.

Nếu điều này vẫn không thực hiện được những gì bạn muốn, thì bạn sẽ cần phải sử dụng macro để chuyển đổi dữ liệu. Một macro như vậy có thể khá phức tạp, nhưng về cơ bản tất cả những gì nó cần làm là lướt qua bảng dữ liệu của bạn và di chuyển từng hàng (hoặc cột) dữ liệu sang trang tính của chính nó.

Ví dụ: macro sau (Transpose3D) sẽ lấy từng hàng từ một phạm vi ô đã chọn và đặt hàng đó trên trang tính mới được tạo của chính nó.

Sub Transpose3D()

Dim rngTbl As Range     Dim wsName As String     Dim R As Integer     Dim C As Integer     Dim i As Integer     Dim j As Integer     Dim Killit As Integer     Dim RCount As Integer     Dim CCount As Integer     Dim Table1() As Variant     Dim Row1() As Variant

RCount = Selection.Rows.Count     CCount = Selection.Columns.Count     If RCount < 2 Then         MsgBox ("Error; Select a range with more than one row.")

GoTo EndItAll     End If

wsName = ActiveSheet.Name     R = ActiveCell.Row     C = ActiveCell.Column

Set rngTbl = Selection     ReDim Table1(1 To RCount, 1 To CCount)

ReDim Row1(1 To 1, 1 To CCount)

Table1() = rngTbl.Value

On Error GoTo Abend

For i = 1 To RCount          If SheetExists(wsName & "_Row_" & i) Then             Killit = MsgBox("Sheet " & wsName & "_Row_" & i & _               " Already Exists!" & vbCrLf & _               "     Cancel: Stop Transposition" & vbCrLf & _               "     OK: Delete Sheet and Continue", vbOKCancel)

If Killit = vbCancel Then GoTo EndItAll             Application.DisplayAlerts = False             Sheets(wsName & "_Row_" & i).Delete             Application.DisplayAlerts = True         End If

Sheets.Add         ActiveSheet.Name = wsName & "_Row_" & i         Cells(R, C).Select         For j = 1 To CCount             Row1(1, j) = Table1(i, j)

Next j         Range(ActiveCell, ActiveCell.Offset(0, CCount - 1)) = Row1()

Sheets(wsName).Select     Next i     GoTo EndItAll

Abend:

MsgBox ("Error in Routine Transpose3D.")



EndItAll:

Application.DisplayAlerts = True End Sub
Function SheetExists(SheetName As String) As Boolean     Dim ws As Worksheet     SheetExists = False     For Each ws In ThisWorkbook.Worksheets         If ws.Name = SheetName Then             SheetExists = True             Exit For         End If     Next ws End Function

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (11245) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003.

Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: