2015-07-02 19 views
0

背景: 我在Excel中錄製了一個宏,它在三個不同的工作簿之間傳輸數據,這三個工作簿都是同時打開的(我正在錄製它,然後進入代碼並修復任何錯誤,因爲我沒有經驗編碼)。如何引用一個打開的Excel表格,我不知道名稱?

問題: 在第三次更改時(例如RFQ_1234,RFQ_1235),將始終使用兩個工作簿。這個宏很好用,除了每次使用它時,我都要調試它並重新輸入第三個工作簿的名稱。如何更改我的代碼,以便在不使用特定名稱的情況下引用第三個工作簿?

聲明: 我知道.select超慢,我不在乎。它只是需要工作。另外,我對編碼知之甚少,所以請詳細解釋一下。的代碼

實施例:

Windows("RFQ_14446.xlsm").Activate 
Range("J51").Select 
Selection.Copy 
Windows("Transfer Template.xlsm").Activate 
Range("B1").Select 
ActiveSheet.Paste 
Windows("RFQ_14446.xlsm").Activate 
Range("D27").Select 
Application.CutCopyMode = False 
Selection.Copy 
Windows("Transfer Template.xlsm").Activate 
Range("B2").Select 
ActiveSheet.Paste 
Windows("RFQ_14446.xlsm").Activate 
Range("D5").Select 
Application.CutCopyMode = False 
Selection.Copy 
Windows("Transfer Template.xlsm").Activate 
Range("B3").Select 
ActiveSheet.Paste 
+0

請問第3工作簿始終是唯一一個名稱以「RFQ_」開頭的人? –

+0

是的,它始終以「RFQ_」開頭,然後是數字。 – bdkong

回答

3

改變,因爲少你的代碼儘可能(如要求!)...

Sub Tester() 

    Dim wbName As String 

    wbName = GetRfqWbName("RFQ_") 
    If Len(wbName) = 0 Then 
     MsgBox "Didn't find the RFQ workbook!" 
     Exit Sub 
    End If 

    Windows(wbName).Activate 
    Range("J51").Select 
    Selection.Copy 
    Windows("Transfer Template.xlsm").Activate 
    Range("B1").Select 
    ActiveSheet.Paste 
    Windows(wbName).Activate 
    Range("D27").Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Windows("Transfer Template.xlsm").Activate 
    Range("B2").Select 
    ActiveSheet.Paste 
    Windows(wbName).Activate 
    Range("D5").Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Windows("Transfer Template.xlsm").Activate 
    Range("B3").Select 
    ActiveSheet.Paste 
End Sub 

'get the name of the first workbook which begins with sName... 
Function GetRfqWbName(sName As String) As String 
    Dim wb As Workbook 
    For Each wb In Workbooks 
     If wb.Name Like sName & "*" Then GetRfqWbName = wb.Name 
     Exit For 
    Next wb 
End Function 

編輯:這裏的Tester子的改進版本以上

Sub Tester2() 

    Dim wbName As String, shtSrc As Worksheet, shtDest As Worksheet 

    wbName = GetRfqWbName("RFQ_") 
    If Len(wbName) = 0 Then 
     MsgBox "Didn't find the RFQ workbook!" 
     Exit Sub 
    Else 
     'for example: you can substitute the sheet names instead 
     Set shtSrc = Workbooks(wbName).Sheets(1) 
     Set shtDest = Workbooks("Transfer Template.xlsm").Sheets(1) 
    End If 

    shtSrc.Range("J51").Copy shtDest.Range("B1") 
    shtSrc.Range("D27").Copy shtDest.Range("B2") 
    shtSrc.Range("D5").Copy shtDest.Range("B3") 

End Sub 
+1

要添加一些請求的解釋:@Tim已經編寫了一個循環遍歷所有打開的工作簿的函數,並返回以「RFQ_」開頭的第一個工作簿的名稱。這個名字然後存儲在一個變量'wbName'中,並用於從那裏引用工作簿。 – Verzweifler

+0

Tim,剛剛意識到如果除了「傳輸模板」和「RFQ_」工作簿之外還有其他任何內容,此代碼將不起作用。我目前已經打開了這些工作簿以及一個名爲「Protected_JD_Form」的工作簿,但它不工作。 – bdkong

+0

@Tim Williams它給了我「沒有找到RFQ工作簿!」消息框。 – bdkong

0

可以通過索引或activesheet引用它。

Dim ws as Excel.Worksheet 

ws = Workbook.ActiveSheet 

ws.Cell(A1).Value = "SomeValue" 

或者您可以使用索引。

Set ws = ExcelApplication.Worksheets(1) 
+0

那麼,我可以用Workbook.ActiveSheet替換所有的Windows(「RFQ_14446.xlsm」)嗎? – bdkong

+0

我不確定Windows(「RFQ.xlsm」)在做什麼。從來沒有像以前那樣使用過它。 – MatthewD

+0

我以爲那是引用第三個工作簿的部分。 – bdkong

相關問題