2017-03-02 34 views
0

昨天我收到了有關此代碼的幫助,但我對VBA完全陌生,所以遇到困難。解釋我的代碼:基於圖紙名稱的工作簿中的單元格複製範圍

我試圖從一個工作簿中將單元格範圍複製到另一個工作簿中單元格的相同範圍,但工作表的名稱必須相同。所以代碼應該測試工作表是否存在,然後它會在兩個工作簿中找到相應的工作表。如果名稱相同,則會顯示該值,但如果不是,則會繼續瀏覽工作簿1中的所有工作表以找到正確的工作表。代碼運行通過,但它不是複製單元格。

我認爲這個問題可能源於第一個循環中的sheetexists行。我被告知我需要確保在運行循環之前檢查表單是否存在,但我不確定如何執行該操作。

謝謝!

Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean 
    Dim sht As Worksheet 

    If wb Is Nothing Then Set wb = ThisWorkbook 
    On Error Resume Next 
    Set sht = wb.Sheets(shtName) 
    On Error GoTo 0 
    SheetExists = Not sht Is Nothing 

End Function 
Sub foo() 

Dim wbk1 As Workbook 
Dim wbk2 As Workbook 
Dim shtName1 As String 
Dim shtName2 As String 
Dim i As Integer 
Dim p As Integer 


Set wkb1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx") 
Set wkb2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx") 


i = 2 
p = 2 
shtName2 = wkb2.Sheets(i).Name 
shtName1 = wkb1.Sheets(p).Name 

For i = 2 To wkb2.Worksheets.Count 
    If (SheetExists(shtName2) = True) And (SheetExists(shtName1) = True) Then 
     For p = 2 To wkb1.Worksheets.Count 
      If shtName2 = shtName1 Then 
       wkb2.Sheets(shtName2).Range("D2:G2").Value = wkb1.Sheets(shtName1).Range("D2:G2").Value 
      End If 
     Next p 
    End If 
Next i 

End Sub 

回答

0

您設置了shtName2 = wkb2.Sheets(i).Name但是之後再也不會改變它。所以它總是隻看一張。

foo子程序應改爲:

Sub foo() 
    Dim wbk1 As Workbook 
    Dim wbk2 As Workbook 
    Dim i As Integer 

    Set wbk1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx") 
    Set wbk2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx") 

    For i = 2 To wbk2.Worksheets.Count 
     If SheetExists(wbk2.Worksheets(i).Name, wbk1) Then 
      wbk2.Worksheets(i).Range("D2:G2").Value = wbk1.Worksheets(wbk2.Worksheets(i).Name).Range("D2:G2").Value 
     End If 
    Next i 

End Sub 

這也是一個好主意,包括Option Explicit爲您的代碼模塊的第一線。我的答案中有拼寫錯誤,因爲我複製/粘貼了原始代碼,但是您已經定義變量wbk1wbk2,然後使用wkb1wkb2代替。由於wkb1wkb2未明確聲明,因此它們被隱式創建爲Variant,然後導致代碼中出現問題,該代碼預期爲Workbook

Option Explicit指示編譯器強制您顯式聲明所有變量,從而撿起這樣的拼寫錯誤。

+0

我明白你在做什麼。它給我一個ByRef參數不匹配錯誤的線: SheetExists(wkb2.worksheets(i).Name,wkb1),它突出顯示wkb1 我注意到shtname在該循環內沒有改變。這使得更有意義 – leetontea

+0

對不起 - 錯字(「wkb」而不是「wbk」) - 將修復答案 – YowE3K

+0

@leetontea - 我制定了**爲什麼**我有錯別字。請參閱我在答案末尾添加的評論。 – YowE3K

相關問題