2017-03-02 14 views
0

昨日、このコードで助けを受けていましたが、私はVBAにとって全く新しいので、難しかったです。私のコードを説明するにはシート名に基づくブックのセル範囲のコピー

1つのブックから別のブックの同じセル範囲にセルの範囲をコピーしようとしていますが、ワークシートの名前は同じでなければなりません。コードはワークシートが存在するかどうかをテストすることになっているので、2つのワークブックに対応するワークシートがあります。名前が同じであれば値を取るが、そうでなければ、workbook1のすべてのシートを調べて正しいシートを見つける。コードが実行されますが、セルをコピーしていません。

問題は、最初のループ内の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に設定しますが、再度変更しないでください。だから常に1枚しか見ていない。あなたのコードモジュールの最初の行としてOption Explicitを含めることも良いアイデアです

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 

あなたfooサブルーチンに変更する必要があります。私は元のコードをコピーして貼り付けていたので、私の答えにタイプミスがありましたが、変数wbk1wbk2を定義し、その代わりにwkb1wkb2を使用しました。 wkb1wkb2は明示的に宣言されていないため、暗黙的にVariantとして作成され、コード内で問題が発生しました(Workbook)。

Option Explicitは、すべての変数を明示的に宣言するようにコンパイラに指示し、そのような誤植を取り除きます。

+0

私は何をしているのか分かります。これは私に、行とのByRef引数不一致エラーを与える。 SheetExists(wkb2.worksheets(i).Name、wkb1)、それはwkb1を強調表示した。 shtnameがそのループ内で変化していなかったことに気づいた。これはもっと意味があります – leetontea

+0

申し訳ありません - タイプミス( "wbk"の代わりに "wkb") - 回答を修正します – YowE3K

+0

@leetontea - 私は仕事をしました**なぜ**私はタイプミスを持っていました。私の答えの最後に追加したコメントを参照してください。 – YowE3K

関連する問題