2017-08-04 9 views
1

私は次の操作を行うために探しています:先のワークシートにVBAのデータのインポート - 変数ワークシート名

  1. CommandButtonをA検索
  2. (どちらを選択するためのダイアログボックス)ソースファイルを開きます
  3. セルの範囲をコピーします(実際には2つの別々の範囲 - 追加されます)
  4. セルと同じ名前のワークシート(常に同じ名前 - 「パフォーマンス」)ソースシート内のI2)が存在する
  5. 先の同じ範囲に
  6. 貼り値ワークシート
  7. は、ソースファイル

を閉じ、私は今のところ、これを持っている:

Private Sub CommandButton1_Click() 

Dim SourceFile As String 
Dim SourceBook As Workbook 
Dim DestinationBook As Workbook 
Dim desiredName As String 

Set DestinationBook = ThisWorkbook 

SourceFile = Application.GetOpenFilename(fileFilter:="Excel Macro-Enabled Workbook (*.xlsm), *.xlsm") 

Set SourceBook = Workbooks.Open(SourceFile) 

SourceBook.Sheets("Performance").Activate 
desiredName = ActiveSheet.Range("I2") 
Application.CutCopyMode = True 
SourceBook.ActiveSheet.Range("E25:I64").Copy 
DestinationBook.Activate 

If WorksheetExists = False Then 

     MsgBox "Couldn't find " & desiredName & " sheet within destination workbook" 

    Call SourceBook.Close(False) 

    Exit Sub 

Else 


Range("E25:I64").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 

Application.CutCopyMode = False 

Call SourceBook.Close(False) 

End If 

End Sub 

Function WorksheetExists() As Boolean 

Dim sh As Object 

    For Each sh In DestinationBook.Worksheets 
     If sh.Name = desiredName Then WorksheetExists = True: sh.Activate 
     Exit For 
    Next 

End Function 

私は実行時エラー「424」を取得しています:オブジェクトが

必須

提案がありますか?

ありがとうございます!

答えて

1

最新のコードを変更したものです。 1) "Option Explicit"はすべての変数を正しく宣言したことを保証します.2)重要なワークブック、ワークシート、および範囲に変数を割り当てました.3)必要な変数がWorkSheetExists関数に渡されました。これが機能するには、DestinationBookに "Performance"と "testSheet"という名前のシートがあり、SourceBookI2にある "testSheet"シートが必要です。覚えておいてください、これは単にあなたを "動かす"試みですので、変更する必要があると思います。

Option Explicit 
Sub test() 

Dim SourceFile As String 
Dim SourceBook As Workbook, performanceSh As Worksheet 
Dim DestinationBook As Workbook 
Dim desiredName As String 
Set DestinationBook = ThisWorkbook 

SourceFile = Application.GetOpenFilename(fileFilter:="Excel Macro-Enabled Workbook (*.xlsm), *.xlsm") 
Set SourceBook = Workbooks.Open(SourceFile) 
Set performanceSh = SourceBook.Sheets("Performance") 
desiredName = performanceSh.Range("I2") 
Application.CutCopyMode = True 
performanceSh.Range("E25:I64").Copy 
If WorksheetExists(DestinationBook, desiredName) = False Then 
     MsgBox "Couldn't find " & desiredName & " sheet within destination workbook" 
    SourceBook.Close(False) 
    Exit Sub 
Else 
Range("E25:I64").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
Application.CutCopyMode = False 
SourceBook.Close(False) 
End If 
End Sub 

Function WorksheetExists(destWk As Workbook, theName As String) As Boolean 
Dim sh As Object 
    For Each sh In destWk.Worksheets 
     If sh.Name = theName Then WorksheetExists = True: sh.Activate 
     Exit For 
    Next 
End Function 
+0

ありがとうトニー、ポイントは私はそれが正しい宛先シートがアクティブであることを自分で確認したいと思っています。右の宛先シートは、ソース・ファイル内のソース・シートのセルI2の内容と同じ名前のものです。技術的には、これは正しい場所に戻ってくるはずです。なぜなら、これはボタンがある場所だからです。私は、それが間違って変更されていないことを絶対に確信したい - 宛先ファイルに複数のシートがあり、それぞれ別々に実行される。それらはすべて全く同じようにフォーマットされているので、混乱する傾向があります。 –

+0

さて、それに対処するためのコードを追加しました。それが役に立てば幸い。 –

+0

ほとんどそこにありますが、見つけられない、ちょうど開いたソースブックのシートを探しているようです。明確にするために、セルI2は、ソースブックおよび「パフォーマンス」と呼ばれるソースシートに配置され、宛先ファイル内の宛先シートは、ソースシート内のI2の内容と同じと呼ばれる。ソースシートにI2のSTACKと言って、目的のワークブックにSTACKと呼ばれるシートを見つけてそこに貼り付けたいとします。 –

関連する問題