2015-01-12 46 views
0

我有一個輸入數據和運行計算的表格。這個表有很多列,所以我爲可打印的輸出創建了第二個表。兩個表中的第一列是兩個表共有的唯一值,因此輸出表基本上是一個表,它使用查找函數從每個行的輸入表中提取所需的數據或結果。兩個excel表有一個相同的列,可以從另一個自動更新嗎?

使最終用戶添加和刪除輸入表中的行時,使兩個表中的第一列始終保持相同的最佳方式是什麼?我一直在努力研究一個宏,以便每次將值添加到輸入的第一列時,該值將被複制到輸出表的第一列的最後一行,但是我不知道如何如果一行被刪除,或者添加了重複值,它就會起作用。或者我可以使用一個宏,每次更改輸入列時都會複製並粘貼整個列。我有沒有明顯的解決辦法,我也應該考慮?我對VBA相當陌生,但是一旦我找出哪個方向會讓最終用戶變得最簡單,我想我可以弄清楚。

更新:對於任何其他有類似問題的人來說,這是我最終編寫的代碼,迄今爲止效果很好。 在工作表中:

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim KeyCells As Range 
Set KeyCells = Range("A:A") 

If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then 

    Call Module1.UpdateOutput 

End If 


End Sub 

模塊1:

Sub UpdateOutput() 

' UpdateOutput Macro 

'Set active cell for return at end of macro 
Dim ActCell As Range 
Set ActCell = Selection 

' Check Input table has data 
If Sheet6.ListObjects("Input").DataBodyRange Is Nothing Then 
Exit Sub 
End If 

'Count Selected Rows of Input and Output Table 
Dim RowsIn As Long 
RowsIn = Sheet6.ListObjects("Input").ListColumns("UWI").DataBodyRange.Rows.Count 
Dim RowsOut As Long 
RowsOut = Sheet3.ListObjects("Results").DataBodyRange.Rows.Count 
Dim RowsCalc As Long 
RowsCalc = Sheet1.ListObjects("IWCP").DataBodyRange.Rows.Count 

Application.ScreenUpdating = False 
'Delete extra rows from Output Table 
Dim lRow As Long 
lRow = RowsOut + 1 
Do While lRow >= RowsIn + 2 
Sheet3.Rows(lRow).Delete 
Sheet1.Rows(lRow + 1).Delete 
lRow = lRow - 1 
Loop 

'Select UWI column from input table 
Application.Goto Sheet6.ListObjects("Input").ListColumns("UWI").DataBodyRange 
Selection.Copy 

'Paste UWI column from input table 
Sheet3.ListObjects("Results").ListColumns("UWI").DataBodyRange(1).PasteSpecial xlPasteValues 
Sheet1.ListObjects("IWCP").ListColumns("UWI").DataBodyRange(1).PasteSpecial xlPasteValues 
Application.CutCopyMode = False 

'Return to previous cell 
Application.Goto ActCell 
Application.ScreenUpdating = True 

End Sub 
+1

TL; DR最好的堆棧溢出問題有一個[** Minimal,Complete,and Verifiable example **](http://stackoverflow.com/help/mcve)。你也應該看看[Help Page](http://stackoverflow.com/help/on-topic)。因此,請縮短您的問題,詢問您需要幫助的特定項目,然後張貼您目前使用的代碼,並在代碼中顯示您卡住的地方。 – Chrismas007

+0

聽起來好像「每次更改輸入列時複製並粘貼整個列」都不會佔用大量時間。 – pnuts

+0

@Xipha您應該在您的原始文章中包含您期望的輸入/輸出的屏幕截圖。 – Chrismas007

回答

0

我假設你的兩個表是在Sheet1。您必須在與Sheet1對應的模塊中插入以下代碼

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rngsrc As Range, rngtrg As Range 
    Dim losrc As ListObject, lotrg As ListObject 
    Set losrc = Me.ListObjects(1) 
    Set lotrg = Me.ListObjects(2) 
    'Set rngsrc = your_source_range_to_monitor 
    Set rngsrc = losrc.ListColumns(1).Range 
    Set rngtrg = lotrg.ListColumns(1).Range 

    Dim ints As Range 
    Set ints = Application.Intersect(rngsrc, Target) 
    If (Not (ints Is Nothing)) Then 
     ' Do your job to copy from rngsrc to rngtrg 
     Application.CutCopyMode = xlCopy 
     rngsrc.Copy 
     rngtrg.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlPasteSpecialOperationNone 
    End If 
End Sub 

並根據需要進行修改。

+0

謝謝,這有助於我走上正確的軌道 – Xipha

相關問題