2016-10-06 45 views
4

我不確定這是否可行,但這是我沒有找到的答案。單元格中表格的動態引用 - VBA

我創建了一個模板工作簿Schedule.xls,它將由不同的人填寫,比如personApersonBpersonC。我需要從每個工作簿中提取相同的範圍,方法是將其複製並粘貼到主文件Master.xls中,以便我可以將每個人的信息都收集到該主簿中。

這個Master.xls將會有和填充Schedule.xls的人一樣多的紙張。

例如,讓我們留在那3個人:personA,personBpersonC

一旦他們產生他們的日程安排,我想獲得這些信息,並將其複製到Master.xls,但在不同的表名爲personApersonBpersonC

我想在Schedule.xls設置一個細胞要做到這一點,說A1,在那裏人們可以選擇personApersonBpersonC之間的值。

這樣我就可以在Master.xls中爲工作表創建一個動態參考。其中宏將粘貼信息。

`Range("B2.D5").Select 
Selection.Copy 
Workbooks.Open Filename:= _ 
    "C:\My Documents\Master.xlsx" 
Sheets(*REFERENCE*).Select 
Range("B2").Select 
ActiveSheet.Paste 
Range("A1").Select 
Application.CutCopyMode = False 
ActiveWorkbook.Save 
ActiveWorkbook.Close` 

我應該寫的,而不是參考怎麼設置我想要寫在紙張?

在此先感謝。

+0

我會做另一種方式,當personX在* Schedule.xls *中完成它們的部分時,讓它更新* Master.xls *(完整的UNC路徑)。 * Master.xls *將具有基本模板表,如果工作表** personX **不在主表中,則製作該表的副本並將其重命名爲** personX **,然後將期望範圍從Schedule到它。但是,這假定人有寫訪問Master.xls。 – PatricK

+0

@mmarinr這是回答你的問題,不知道它解決了你的代碼問題。使用'表格(範圍(「A1」)。值)。選擇'。但是,最好避免使用'Select','Selection'和'ActiveSheet' –

+0

我會在'Schedule.xls'文件中使用'ComboBox'。然後在你的'Workbook_Open'中,用你的'Master.xls'中的所有表單填充組合框。如果沒有找到他們的名字,他們可以輸入他們的名字。然後在'Schedule.xls'的'Workbook_BeforeClose'中,更新'Master.xls'。如果用戶不存在工作表,請添加一個工作表然後添加信息。同樣作爲@ShaiRado推薦的,儘量不要使用諸如「Select」之類的東西。看看如何使用'Worksheet'和其他excel對象 – Zac

回答

0

我會建議一個簡單的,無代碼的方法。然後,我會爲您提供一些VBA代碼以滿足您的特定要求。

爲簡單起見,將兩個工作簿Carl's SlaveWB.xlsx和您的Master.slxm放在同一個文件夾中。在這兩個電子表格中打開要同步的工作表(單向複製)。爲這個簡單的例子手動創建這些表。現在,單擊主工作表中的單元格A1。在編輯模式下,鍵入「=」,然後單擊Carl工作表中的單元格A1(在另一個工作簿中)。您的工作表現在已鏈接。您不僅可以對A1執行此操作,還可以對整個工作表執行此操作 - 只需將單元格A1複製/粘貼到整個工作表即可。現在,卡爾可以在路上帶上他的工作簿。這是他如何檢查。他只是將他的最新工作簿複製到您預先指定的文件夾中。當您打開主工作簿時,它將自動從Carl的「簽入」工作簿中提取所有數據。

如果您更喜歡從一個工作簿複製到另一個工作簿(以捕獲格式),這並不困難。

首先,重命名或刪除master中的舊「Carl」工作表。這是按名稱刪除工作表的代碼。如果主表中的工作表名稱存儲在Carl的「Sheet1」工作表(單元格A1)中,則可以將其作爲WSName:Workbooks(「SlaveWB」)。表格(「Sheet1」)的值傳遞。 )。值。

'DeleteWorksheet(WSName) 
Public Function DeleteWorksheet(WSName As String) 
    'If Not IIf(IsNull(DebugMode), False, DebugMode) Then On Error GoTo FoundError 
    If Not Range("DebugMode").Value Then On Error Resume Next 

    Dim WorksheetExists As Boolean 
    DeleteWorksheet = False 

    'if no worksheet name provided, abort 
     If Len(WSName) < 1 Then Exit Function 

    'if worksheet exists, delete 
     WorksheetExists = False 
     On Error Resume Next 
     WorksheetExists = (Sheets(WSName).Name <> "") 'if worksheet exists, set WorksheetExists = True 
     On Error GoTo FoundError 
     If WorksheetExists Then Sheets(WSName).Delete 'if worksheet exists, delete 
     DeleteWorksheet = True 'function succeeded (deleted worksheet if it existed) 

    Exit Function 
FoundError: 
    On Error Resume Next 
    DeleteWorksheet = False 
    Debug.Print "Error: DeleteWorksheet(" & WSName & ") failed to delete worksheet. " 
End Function 

接下來,將修改後的工作表從Carl的工作簿複製到主人。下面的代碼將srcWBName中的工作表複製到tgtWBName中,並在tgtWBName中將該工作表命名爲任何您喜歡的工作表。我建議您僅將代碼保留在主文件夾電子表格中。在每個用戶擁有的每個副本中放入相同的代碼是非常危險的。而且,這將很難管理代碼更新。

Sub CopyWSBetweenWBs(srcWBName As String, srcWSName As String, _ 
        tgtWBName As String, tgtWSName As String) 

    'srcWBName - name of PersonA's workbook 
    'srcWSName - name of worksheet to copy from Person A's workbook 
    'tgtWBName - target workbook, the master 
    'tgtWSName - what you want to call the worksheet after copying it to the target/master. 
    '   If you want this sheetname to be taken from a cell, just pass the cell 
    '   reference. For example, this can be 
    '   Workbooks(srcWBName).Sheets(srcWSName).Cells(1,1).Value 

    Dim srcWB As Workbook 
    Dim srcWS As Worksheet 
    Dim tgtWB As Workbook 
    Dim tgtWS As Worksheet 

    'Create XL objects 
    Set srcWB = Workbooks(srcWBName) 
    Set srcWS = srcWB.Worksheets(srcWSName) 

    Set tgtWB = Workbooks(tgtWBName) 
    Set tgtWS = tgtWB.Worksheets(tgtWSName) 

    ' Start at the source 
    srcWB.Activate 
    srcWS.Activate 

    ' Copy to target workbook 
    srcWS.Copy Before:=tgtWB.Sheets(1) '<~~ copy to beginning of workbook 
    ' After copying the worksheet, it is active, so you can rename it now. 
    ActiveSheet.Name = tgtWSName 


End Sub 

就是這樣。我希望這有幫助。