簡體   English   中英

excel-從一對多工作表創建多對一工作表

[英]excel - Create a many-to-one sheet from a one-to-many sheet

我在Excel中有一張工作表,類似:

| Value1 | Data1 | Data1b | 1,3,4,8 |
| Value2 | Data2 | Data2b | 2       |
| Value3 | Data3 | Data3b | 6,7,8   |

我想拿一張紙,然后再做一張紙,將最后一列分成單獨的行,並使其他數據保持同步。 因此,當第一張紙被更新時,第二張紙也被更新。 並且,如果將數字添加到第一張工作表的最后一列,則將新行添加到第二張工作表。

第二張紙應該看起來像這樣:

| Value1 | Data1 | Data1b | 1 |
| Value2 | Data2 | Data2b | 2 |
| Value1 | Data1 | Data1b | 3 |
| Value1 | Data1 | Data1b | 4 |
| Value3 | Data3 | Data3b | 6 |
| Value3 | Data3 | Data3b | 7 |
| Value1 | Data1 | Data1b | 8 |
| Value3 | Data3 | Data3b | 8 |

更新 :以下是我嘗試使用的代碼。 首先,我最好的方法是什么? 是否正在清理然后重新填充更新第二張工作表的正確方法? 最后,當一個人更新第一張圖紙時,如何使它自動運行?

更新 :唯一仍然不起作用的是最后的排序,有人知道為什么嗎?

Private FROM_SHEET As String
Private TO_SHEET As String
Private START_ROW As Long
Private NUM_COL As Long

Sub oneToMany()

    FROM_SHEET = "Sheet1"
    TO_SHEET = "Sheet2"
    START_ROW = 2
    NUM_COL = 4

    Dim fromSheet As Worksheet
    Dim toSheet As Worksheet
    Dim newRow As Long

    Set fromSheet = Sheets(FROM_SHEET)
    Set toSheet = Sheets(TO_SHEET)

    toSheet.UsedRange.ClearContents

    newRow = START_ROW
    For i = START_ROW To fromSheet.Cells(fromSheet.Rows.Count, 1).End(xlUp).Row
        Dim col As String
        Dim nums() As String

        col = fromSheet.Cells(i, NUM_COL)
        nums = Split(col, ",")

        For Each num In nums
            fromSheet.Rows(i).Copy toSheet.Rows(newRow)
            toSheet.Cells(newRow, NUM_COL) = Trim(num) 'Should copy then overwrite?
            newRow = newRow + 1
        Next num
    Next

    'Sort not working
    toSheet.Range(toSheet.Cells(START_ROW, START_COL), toSheet.Cells(lastRow, lastCol)).Sort _
        key1:=toSheet.Range(toSheet.Cells(START_ROW, NUM_COL), toSheet.Cells(lastRow, NUM_COL)), _
        order1:=xlAscending, Header:=xlNo

End Sub

在回答您的第一個問題時,如果這只是表單上的唯一數據,那么您的clearcontents方法就可以了。

要自動運行,請查看Sheet1上的Worksheet_Change事件。 您可以根據更改的單元格來定位更改。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Row < 4 And Target.Column < 5 Then
    Call oneToMany
End If

結束子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM