我無法理解我將要描述的操作如何被概念化,因為我是編碼新手。
一個大的電子表格包含 100 列,需要通過將這些列加在一起來將這些列壓縮到 10 列。有一個鍵,以便所有標記為“1”的列轉到第一個新列,依此類推。
這是一個例子:

有n個原始列。這些列中的每一列都有一個鍵(左下角),并且必須根據該鍵將它添加到新表的第 1、2、3 或 4 列(右下角)。這一切都很好而且很干凈,但真正的電子表格可能有 270 多列,并且對于 3000 多 ID 來說,它們必須壓縮成 10 列左右,其中并非所有 ID 都填充了所有列。
我不知道如何創建那種回圈,我想先回圈遍歷鍵,然后在原始列中找到每個“A”,將它們添加到新表的第一列,然后通過所有這些進行,但是我不確定如何避免用新金額覆寫舊金額。
干杯!
uj5u.com熱心網友回復:
你可以用 SUMPRODUCT 做到這一點。實際上,您可以使用相同的 SUMPRODUCT 公式和粘貼值或使用 Evaluate 在 VBA 上對其進行編碼:

=SUMPRODUCT(--($A$2:$A$6=$F14)*$B$2:$M$6*TRANSPOSE(--($B$14:$B$25=G$13)))
根據您的 Excel 版本,您可能需要將公式輸入為陣列公式,因此請鍵入公式并按CTRL ENTER ,而不是正常輸入SHIFT
更新:您也可以使用 VBA 執行此操作,但您需要對源檔案進行一些更改以使其適用于任何大小的任何資料集:
- 您的資料必須單獨存在于名為DATA的作業表中
- 您的密鑰必須單獨存在于名為KEYS的作業表中
該代碼將根據鍵生成一個包含分組資料的新作業表。它使用與以前相同的公式,但它是單獨完成的。

Sub TEST()
Dim wk As Worksheet
Dim rngData As Range
Dim rngKeys As Range
Dim LR As Long 'last non blank row
Dim LC As Long 'last non blank column
Dim ThisKeys As Variant
Set wk = ThisWorkbook.Sheets.Add(, ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) 'add new worksheet for output at end of workbook
With ThisWorkbook.Worksheets("DATA")
LR = .Range("A" & .Rows.Count).End(xlUp).Row
LC = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set rngData = .Range(.Cells(2, 2), .Cells(LR, LC))
.Range("A2:A" & LR).Copy wk.Range("A2:A" & LR) 'copy names to output
End With
With ThisWorkbook.Worksheets("KEYS")
LR = .Range("A" & .Rows.Count).End(xlUp).Row
Set rngKeys = .Range("B2:B" & LR)
.Range("B2:B" & LR).Copy
wk.Range("B2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End With
With wk
.Range("B2:B" & LR).RemoveDuplicates Columns:=1, Header:=xlNo
LR = .Range("B" & .Rows.Count).End(xlUp).Row
ThisKeys = .Range("B2:B" & LR).Value
.Range("B2:B" & LR).Clear
.Range("B1").Resize(1, UBound(ThisKeys)) = Application.WorksheetFunction.Transpose(ThisKeys) 'transpose keys to horizontal
.Range("A1").Value = "Names / Keys"
LR = .Range("A" & .Rows.Count).End(xlUp).Row
LC = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Range("B2").FormulaArray = _
"=SUMPRODUCT(--(DATA!R2C1:R" & rngData.Rows.Count 1 & "C1=RC1)*DATA!" & rngData.Address(True, True, xlR1C1) & "*TRANSPOSE(--(KEYS!R2C2:R" & rngKeys.Rows.Count 1 & "C2=R1C)))"
.Range("B2").AutoFill Destination:=Range(.Range(.Cells(2, 2), .Cells(2, LC)).Address), Type:=xlFillDefault 'drag to right
.Range(.Cells(2, 2), .Cells(2, LC)).AutoFill Destination:=Range(.Range(.Cells(2, 2), .Cells(LR, LC)).Address), Type:=xlFillDefault 'drag to right
.Range(.Cells(2, 2), .Cells(LR, LC)).Value = .Range(.Cells(2, 2), .Cells(LR, LC)).Value 'paste as values, not formulas
End With
Erase ThisKeys
Set rngKeys = Nothing
Set rngData = Nothing
Set wk = Nothing
End Sub

我上傳了帶有代碼的檔案,以便您查看:https ://drive.google.com/file/d/1rc8oOPcqP4HBFEyamku24H9hHRFpncq_/view?usp=sharing
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494347.html
