Định dạng lại dữ liệu qua macro excel 2010?


0

Tôi đang cố gắng tạo một macro cho phép tôi thay đổi dữ liệu tôi nhận được từ máy khách thành dữ liệu tôi có thể nhập vào hệ thống. Dữ liệu tôi nhận được có định dạng:

Làm thế nào tôi có thể làm điều này thông qua VBA Macro? Vì vậy, nó nên đọc dữ liệu, sau đó tạo một bảng mới với bản sao của dữ liệu theo định dạng tôi có thể sử dụng. Như thế này:


1
Tôi biết bạn đã yêu cầu VBA, nhưng FYI, một giải pháp không phải VBA là sử dụng addon PowerQuery từ Microsoft. Nó có chức năng unpOLL tích hợp.
Madball73

Ví dụ này không trông giống như một bảng pivot . Đây có phải là dạng bảng trụ hay chỉ là trong một cấu trúc mà bạn muốn sửa đổi?
Raystafarian

Đó là trong một cấu trúc mà tôi muốn. Xin lỗi, hiện tại nó không ở định dạng Pivot
WolfeLine

Có bao nhiêu cột (quỹ)?
mcalex

Có bất kỳ số lượng cột (quỹ). Nó sẽ thay đổi trên cơ sở hàng tháng. Như phạm vi ngày (hàng).
WolfeLine

Câu trả lời:


0

Đây là macro nên làm những gì bạn muốn. Nó:

  • Nhắc về số lượng quỹ
  • Giả sử bảng dữ liệu bắt đầu bằng A1
  • in trên "Sheet2" trong các cột Athông quaC
  • Thoát nếu nó gặp một ô trống trong datecột

Lưu ý: nếu "Sheet2" không tồn tại, macro sẽ thất bại, vì vậy hãy tạo nó. Ngoài ra, bạn sẽ cần đặt các tiêu đề vào "Trang tính 2" và điều chỉnh định dạng ô cho ngày và số tiền trong "Trang tính 2"

điều chỉnh khi cần thiết

Sub wolfeline()
Dim c As Range
Dim k As Integer
Dim x As Integer
Dim y As Integer
Dim WScurr As Worksheet
Dim WStarg As Worksheet

'Set current and target WS
'//Note: target WS must exist already
Set WScurr = ActiveSheet
Set WStarg = Sheets("Sheet2")

'k=2 so we start on row 2, below the headers you've put, adjust as needed
k = 2

'count the range of dates
y = [counta(A:A)]

'Ask user to input number of funds
x = InputBox("Number of Funds?")
'Feel free to define range("A:A") to your actual range e.g. range("A2:A100")
For Each c In WScurr.Range("A2:A" & y)
If c.Value = "" Then Exit Sub

    ' "to 3" indicates there are 3 funds, adjust as needed
    For i = 1 To x
        If c.Offset(, i) <> "" Then
            'we're printing this in columns K, L and M, adjust as needed
            WStarg.Cells(k, "A") = c
            WStarg.Cells(k, "B") = Cells(1, c.Offset(, i).Column)
            WStarg.Cells(k, "C") = c.Offset(, i)
            k = k + 1
        End If
    Next
Next


End Sub

Cảm ơn bạn rất nhiều vì điều này, nhưng nếu nó có số lượng ngày và tiền không xác định thì sao? Nó sẽ thay đổi hàng tháng.
WolfeLine

Thay đổi vĩ mô để phản ánh số lượng quỹ mỗi tháng. Bạn chỉ có thể giữ range("A:A")cho số lượng ngày không xác định.
Raystafarian

Xin lỗi @Raystafarian vì sự thiếu hiểu biết của tôi, nhưng làm cách nào để thay đổi macro cho một số tiền không xác định? và làm cách nào để thay đổi macro để sao chép tất cả dữ liệu này sang một trang tính mới bắt đầu bằng cột A (Ngày), Cột B (Quỹ được đặt tên) và Cột C (Số tiền)?
WolfeLine

@WolfeLine bạn đã yêu cầu một macro để tôi hình dung bạn có thể điều chỉnh macro khi cần. Xem chỉnh sửa mới. Mục tiêu là "sheet2" vì vậy hãy thay đổi nếu nó sai. Nó nhắc về số lượng tiền, bạn không thể giữ nó không xác định hoặc nó sẽ chạy mãi mãi.
Raystafarian

0

Bật máy ghi âm macro và sử dụng phương pháp tìm thấy trên blog của John Walkenbach. Nó đi kèm với mã này bằng cách sử dụng dữ liệu mẫu trong ảnh chụp màn hình của bạn:

Sub Unpivot()

'
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
        Array("Sheet1!R1C1:R4C4"), Version:=xlPivotTableVersion15).CreatePivotTable _
        TableDestination:="", TableName:="PivotTable1", DefaultVersion:= _
        xlPivotTableVersion15
    ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
    ActiveSheet.Cells(3, 1).Select
    ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems( _
        "Count of Value").Position = 1
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = _
        xlHidden
    Range("A4").Select
    Selection.ShowDetail = True
End Sub

Điều chỉnh theo ý thích của bạn hoặc thử mã John Walkenbach gửi bài ở đây . Nó đã được viết cho một phiên bản Excel trước đó, vì vậy nó có thể trông khác với mã 2010.


cảm ơn bạn teylyn, tôi có thể hỏi cái này đề cập đến cái gì không? SourceData: = _ Array ("Trang tính 1! R1C1: R4C4")
WolfeLine

Có thể giúp lưu ý rằng có một số ngày khác nhau trong Cột A và một số lượng Quỹ khác nhau trong Hàng 1. Tôi đã thử mã ở trên nhưng nó đã cho tôi một lỗi và gỡ lỗi được tô sáng: ActiveWorkbook.POLLCaches.Create (SourceType: = xlConsolidation, SourceData: = _ Array ( "! Sheet1 R1C1: R4C4"), phiên bản: = xlPivotTableVersion15) .CreatePivotTable _ TableDestination: = "", TableName: = "PivotTable1", DefaultVersion: = _ xlPivotTableVersion15
WolfeLine

@WolfeLine không thành công vì macro này cho rằng chúng tôi đang làm việc với một bảng trụ thực tế, mà sau khi làm rõ trong các nhận xét, không phải là trường hợp.
Raystafarian

Tôi đã nói rằng mã này dựa trên mẫu dữ liệu ảnh chụp màn hình của bạn và bạn cần điều chỉnh nó.
teylyn

0

Nếu bạn không có quá nhiều cột tiền, bạn có thể làm bằng tay.

  1. Trước Quỹ 1 (Cột B), chèn một cột. Sao chép công thức 'IF' vào từng ô để kiểm tra xem có giá trị nào trong Cột B (bây giờ là Cột C) không và nếu có, hãy đặt nội dung thành "Quỹ 1". Đó là, trong ô B2:

    = IF (C2 <> "", "Quỹ 1", "")

  2. Trước cột Quỹ tiếp theo, chèn hai cột. Trong phần đầu tiên của hai phần, hãy đặt công thức 'IF' để kiểm tra xem có giá trị nào trong cột Quỹ hay không và nếu có, hãy sao chép ngày từ Cột A. Trong phần thứ hai của hai cột mới lặp lại bước 1 ở trên, nhưng chèn đúng quỹ. Đó là trong các ô D2 và E2

    = NẾU (F2 <> "", A2, "") || = NẾU (F2 <> "", "Quỹ 2", "") ||

Làm điều này cho mỗi Cột Quỹ.

  3. Sau đó, sao chép các ô từ mỗi khối ba cột sang một trang mới, sao cho mỗi khối liên tiếp được đặt bên dưới khối trước đó. Nghĩa là, chọn và sao chép từ ô dữ liệu đầu tiên của Cột A (không phải hàng 1) sang ô cuối cùng có dữ liệu trong Cột C - không phải toàn bộ các cột - và dán chúng vào ô trên cùng bên trái của trang tính mới. Sau đó chọn và sao chép dữ liệu từ ô đầu tiên trong Cột D, xuống ô dữ liệu cuối cùng trong Cột F và dán vào Cột A ở hàng ngay bên dưới dữ liệu đã dán trước đó.

Khi tất cả các khối này đã được sao chép, bạn có thể sắp xếp dữ liệu theo Cột A (cột ngày). Điều này sẽ không chỉ đặt tất cả các giao dịch theo thứ tự chrono, mà còn chặn tất cả các khoảng trống với nhau, để lại cho bạn dữ liệu theo định dạng bạn đang tìm kiếm.

Phiên bản macro

Nếu có rất nhiều Cột Quỹ, sử dụng macro recorder để làm bước 1 và 2, và chạy mã mà không bước 2 thông qua một vòng lặp cho mỗi quỹ (đặt "Quỹ #" chuỗi bằng cách thực hiện một số toán trên cột bạn đang ở).

Sau đó, thực hiện một công việc ghi macro tương tự để sao chép và dán cặp ba khối cột đầu tiên và sau đó sắp xếp chúng, và một lần nữa, lặp qua mã sao chép / quá khứ cho mỗi Quỹ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.