
我在兩張單獨的紙上有兩個列表,我正在嘗試將它們合併到第三張紙中。這些清單會根據使用者輸入自動填充,因此清單中的行數可能會有所不同。因此,一旦它在工作表 1 的第一列中偵測到任何內容,它就會開始使用工作表 2 中的列填充工作表 3 上的列表,如下所示
表1
Make Model License Plate
Ford Escape UVC345
Honda Civic KD2YR9
表2
Make Model License Plate
Dodge Charger 34TRLS2
VW Passat V70YTR
表3
Make Model License Plate
Ford Escape UVC345
Honda Civic KD2YR9
Dodge Charger 34TRLS2
VW Passat V70YTR
更新:
當我使用 VBA 複製和貼上時遇到的問題是,它正在貼上和識別用於自動填充工作表 1 上的初始列表的公式。 3 頁上。
Sub Copy_Alternatives()
Worksheets("CNA eTool Alternatives").Range("A:A").Copy
Worksheets("Repair Replacement Recom").Range("A:A").PasteSpecial xlPasteValues
Worksheets("CNA eTool Alternatives").Range("B:B").Copy
Worksheets("Repair Replacement Recom").Range("B:B").PasteSpecial xlPasteValues
Worksheets("CNA eTool Alternatives").Range("C:C").Copy
Worksheets("Repair Replacement Recom").Range("C:C").PasteSpecial xlPasteValues
End Sub
Sub Copy_Paste_Range()
Dim lNewRow As Long
Dim lDataRow As Long
ThisWorkbook.Activate
lNewRow = Worksheets("CNA eTool Addit. Alternatives").Cells(Worksheets("CNA eTool Addit. Alternatives").Rows.Count, "H").End(xlUp).Row
lDataRow = Worksheets("Repair Replacement Recom").Cells(Worksheets("Repair Replacement Recom").Rows.Count, 1).End(xlUp).Row
lDataRow = lDataRow + 1
Worksheets("CNA eTool Addit. Alternatives").Range("H2:J" & lNewRow).Copy
Worksheets("Repair Replacement Recom").Range("A" & lDataRow).PasteSpecial
End Sub
答案1
您可以使用工作表函數來實作。
假設您的第一張表是Sheet1
,第二張表是Extra1
將下列公式放在 A2 上的合併工作表上,然後複製並貼上到其他儲存格:
=IF(ROW()>COUNTA(Sheet1!A:A)+COUNTA(Extra1!A:A)-1,"",INDIRECT(IF(ROW()<=COUNTA(Sheet1!A:A),"Sheet1!","Extra1!")&SUBSTITUTE(ADDRESS(1,COLUMN(),4),1,"")&ROW()-IF(ROW()<=COUNTA(Sheet1!A:A),0,COUNTA(Sheet1!A:A)-1)))
這是如何運作的:
- 檢查目前行是否高於第一張紙+第二張紙減一的行數(因為兩者都有標題);
- 如果目前行較大,則顯示為空。否則,進入下一步;
- 準備一個
INDIRECT
.如果目前行低於第一個工作表上的行,則取得第一個工作表名稱。否則它會取得第二個工作表名稱; - 它使用
SUBSTITUTE + ADDRESS
技巧來傳回列的當前字母。這很好,因為它在所有欄位上使用相同的公式,甚至當列變為 AA 時也接受 - 最後,如果目前行低於第一張工作表上的項目數,則取得目前行,否則取得目前行減去第一張工作表的行數,再減一,以傳回第二張工作表的起始行。
我知道它有點難以理解並且難以閱讀,但公式有時比 VBA 更好。
編輯:好吧,我頓悟了,得到了一個可以工作的 VBA 版本
Sub merge()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Set ws1 = Sheets("Sheet1") 'First sheet to get merged
Set ws2 = Sheets("Extra1") 'Second sheet to get merged
Set ws3 = Sheets("Merged") 'Name of the sheet you want results
Dim lr As Long 'To return the number of the last row
Dim arrayone As Variant
lr = ws1.Cells(Rows.Count, 1).End(xlUp).Row
arrayone = Range(ws1.Cells(2, 1), ws1.Cells(lr, 3)).Value 'From Row 2 onwards, considering it has headers
Dim arr2 As Variant
lr = ws2.Cells(Rows.Count, 1).End(xlUp).Row
arr2 = Range(ws2.Cells(2, 1), ws2.Cells(lr, 3)).Value 'From Row 2 onwards, considering it has headers
Dim arr3 As Variant
ReDim arr3(1 To UBound(arrayone, 1) + UBound(arr2, 1), 1 To 3)
For i = 1 To UBound(arr3, 1)
For j = 1 To 3
If i <= UBound(arrayone, 1) Then
arr3(i, j) = arrayone(i, j)
Else
arr3(i, j) = arr2(i - UBound(arrayone, 1), j)
End If
Next j
Next i
Range(ws3.Cells(2, 1), ws3.Cells(UBound(arr3) + 1, 3)).Value = arr3
End Sub