จัดรูปแบบข้อมูลใหม่ผ่านแมโคร excel 2010 หรือไม่


0

ฉันกำลังพยายามสร้างแมโครที่ให้ฉันเปลี่ยนข้อมูลที่ฉันได้รับจากลูกค้าเป็นข้อมูลที่ฉันสามารถนำเข้าสู่ระบบได้ ข้อมูลที่ฉันได้รับอยู่ในรูปแบบ:

ฉันจะทำสิ่งนี้ผ่าน VBA Macro ได้อย่างไร ดังนั้นควรอ่านข้อมูลจากนั้นสร้างแผ่นงานใหม่พร้อมสำเนาของข้อมูลในรูปแบบที่ฉันสามารถใช้ได้ แบบนี้:


1
ฉันรู้ว่าคุณขอ VBA แต่ FYI โซลูชันที่ไม่ใช่ VBA คือการใช้ PowerQuery addon จาก Microsoft มันมีฟังก์ชั่น unpivot ในตัว
Madball73

ตัวอย่างเช่นนี้ไม่ได้มีลักษณะเหมือนตารางเดือย มันอยู่ในรูปแบบตารางสาระสำคัญหรือเป็นเพียงในโครงสร้างที่คุณต้องการแก้ไข?
Raystafarian

มันอยู่ในโครงสร้างที่ฉันต้องการ ขออภัยมันไม่ได้อยู่ในรูปแบบ Pivot
WolfeLine

มีกี่คอลัมน์ (เงิน)
mcalex

มีจำนวนคอลัมน์ใด ๆ (เงิน) มันจะเปลี่ยนเป็นรายเดือน ช่วงวันที่ (แถว) จะเป็นเช่นไร
WolfeLine

คำตอบ:


0

นี่คือแมโครที่ควรทำในสิ่งที่คุณต้องการ มัน:

  • แจ้งจำนวนกองทุน
  • สมมติว่าตารางข้อมูลเริ่มต้นขึ้น A1
  • พิมพ์บน "Sheet2" ในคอลัมน์Aผ่านC
  • ออกถ้ามันเจอเซลล์ว่างในdateคอลัมน์

หมายเหตุ: หากไม่มี "Sheet2" อยู่แมโครจะล้มเหลวดังนั้นให้สร้างมันขึ้นมา นอกจากนี้คุณจะต้องใส่ส่วนหัวลงใน "Sheet2" และปรับรูปแบบเซลล์สำหรับวันที่และจำนวนใน "Sheet2"

ปรับได้ตามต้องการ

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

ขอบคุณมากสำหรับสิ่งนี้ แต่ถ้าเป็นวันที่และจำนวนเงินที่ไม่ได้กำหนดล่ะ มันจะเปลี่ยนรายเดือน
WolfeLine

เปลี่ยนแมโครเพื่อแสดงจำนวนเงินต่อเดือน คุณสามารถเก็บrange("A:A")จำนวนวันที่ไม่ได้ระบุ
Raystafarian

ขออภัย @Raystafarian สำหรับความไม่รู้ของฉัน แต่ฉันจะเปลี่ยนมาโครสำหรับจำนวนเงินที่ไม่ได้กำหนดได้อย่างไร และฉันจะเปลี่ยนมาโครเพื่อคัดลอกข้อมูลทั้งหมดนี้ไปยังชีตใหม่ที่เริ่มต้นด้วยคอลัมน์ A (วันที่), คอลัมน์ B (กองทุนที่มีชื่อ) และคอลัมน์ C (จำนวนเงิน) ได้อย่างไร
WolfeLine

@ WolfeLine คุณถามมาโครฉันก็เลยคิดว่าคุณสามารถปรับมาโครได้ตามต้องการ ดูการแก้ไขใหม่ เป้าหมายคือ "sheet2" ดังนั้นให้เปลี่ยนหากมันผิด มันแจ้งให้ทราบถึงจำนวนเงินที่คุณไม่สามารถเก็บไว้ไม่ได้กำหนดหรือมันจะทำงานตลอดไป
Raystafarian

0

เปิดเครื่องบันทึกมาโครและใช้วิธีการที่พบในบล็อกของ John Walkenbach มันมาพร้อมกับรหัสนี้โดยใช้ข้อมูลตัวอย่างในภาพหน้าจอของคุณ:

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

ปรับให้เข้ากับความชื่นชอบของคุณหรือลองรหัสการโพสต์จอห์นวัลเกนบา ค ที่นี่ มันถูกเขียนขึ้นสำหรับ Excel รุ่นก่อนหน้าดังนั้นมันอาจดูแตกต่างจากรหัส 2010


ขอบคุณ teylyn ฉันขอถามได้ไหมว่านี่หมายถึงอะไร SourceData: = _ Array ("Sheet1! R1C1: R4C4")
WolfeLine

มันอาจช่วยให้ทราบว่ามีจำนวนวันที่ตัวแปรในคอลัมน์ A และจำนวนตัวแปรของกองทุนในแถวที่ 1 ฉันลองรหัสข้างต้น แต่มันทำให้ฉันมีข้อผิดพลาดและการแก้จุดบกพร่องเน้น: ActiveWorkbook.PivotCaches.Create (SourceType: = xlConsolidation, SourceData = _ array ( "! Sheet1 R1C1: R4C4") เวอร์ชัน: = xlPivotTableVersion15) .CreatePivotTable _ TableDestination: = "", TableName = "PivotTable1" DefaultVersion = _ xlPivotTableVersion15
WolfeLine

@ WolfeLine มันล้มเหลวเพราะแมโครนี้ถือว่าเรากำลังทำงานกับตารางเดือยจริงซึ่งหลังจากการชี้แจงในความคิดเห็นแล้วก็ไม่เป็นเช่นนั้น
Raystafarian

ฉันบอกว่ารหัสนี้เป็นไปตามตัวอย่างข้อมูลภาพหน้าจอของคุณและคุณต้องปรับเปลี่ยน
teylyn

0

หากคุณไม่มีเงินทุนมากเกินไปคุณสามารถทำได้ด้วยตนเอง

  1. ด้านหน้ากองทุน 1 (คอลัมน์ B) ให้แทรกหนึ่งคอลัมน์ คัดลอกสูตร 'IF' ไปยังแต่ละเซลล์ที่ตรวจสอบว่ามีค่าในคอลัมน์ B (ตอนนี้คือคอลัมน์ C) หรือไม่และตั้งค่าเนื้อหาเป็น "กองทุน 1" นั่นคือในเซลล์ B2:

    = IF (C2 <> "", "กองทุน 1", "")

  2. ด้านหน้าของคอลัมน์กองทุนถัดไปให้แทรกสองคอลัมน์ ในแรกของทั้งสองตั้งสูตร 'IF' ที่ตรวจสอบว่ามีค่าในคอลัมน์กองทุนและถ้าเป็นเช่นนั้นคัดลอกวันที่จากคอลัมน์ A ในคอลัมน์ที่สองของคอลัมน์ใหม่ที่สองทำซ้ำขั้นตอนที่ 1 ข้างต้น แต่ใส่กองทุนที่ถูกต้อง ที่อยู่ในเซลล์ D2 และ E2

    = IF (F2 <> "", A2, "") || = IF (F2 <> "", "กองทุน 2", "") ||

ทำเช่นนี้สำหรับแต่ละคอลัมน์กองทุน

  3. จากนั้นคัดลอกเซลล์จากบล็อกสามคอลัมน์แต่ละแผ่นไปยังแผ่นงานใหม่เพื่อให้แต่ละบล็อกที่อยู่ติดกันอยู่ด้านล่างของบล็อกก่อนหน้า นั่นคือเลือกและคัดลอกจากเซลล์ข้อมูลแรกของคอลัมน์ A (ไม่ใช่แถว 1) ไปยังเซลล์สุดท้ายที่มีข้อมูลในคอลัมน์ C - ไม่ใช่คอลัมน์ทั้งหมด - และวางไว้ในเซลล์ซ้ายบนของแผ่นงานใหม่ จากนั้นเลือกและคัดลอกข้อมูลจากเซลล์แรกในคอลัมน์ D ลงไปที่เซลล์ข้อมูลสุดท้ายในคอลัมน์ F และวางลงในคอลัมน์ A ที่แถวทันทีใต้ข้อมูลที่วางก่อนหน้านี้

เมื่อคัดลอกบล็อคเหล่านี้ทั้งหมดแล้วคุณสามารถเรียงลำดับข้อมูลตามคอลัมน์ A (คอลัมน์วันที่) สิ่งนี้จะไม่เพียง แต่ทำธุรกรรมทั้งหมดตามลำดับเวลา แต่ยังบล็อกช่องว่างทั้งหมดไว้ด้วยกันทำให้คุณมีข้อมูลในรูปแบบที่คุณต้องการ

เวอร์ชันมาโคร

หากมีเป็นจำนวนมากของคอลัมน์กองทุนใช้บันทึกแมโครที่จะทำขั้นตอนที่ 1 และ 2 และเรียกใช้รหัสที่ไม่ขั้นตอนที่ 2 ผ่านห่วงสำหรับแต่ละกองทุน (ตั้ง "กองทุน # สตริง" โดยการทำคณิตศาสตร์บางอย่างเกี่ยวกับคอลัมน์ที่คุณ อยู่ใน).

จากนั้นทำหน้าที่บันทึกแมโครที่คล้ายกันเพื่อคัดลอกและวางคู่แรกของบล็อกคอลัมน์สามคอลัมน์แล้วเรียงลำดับแล้ววนซ้ำผ่านการคัดลอก / รหัสที่ผ่านมาสำหรับทุกกองทุน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.