私はすでにシートや他のものを作成するマクロを持っています。シートが作成された後、2番目のExcel(開いている)から最初のアクティブなExcelファイルにデータをコピーする別のマクロを呼び出したいですか。
最初にヘッダーにコピーしたいのですが、それを機能させることができません-エラーが発生し続けます。
Sub CopyData(sheetName as String)
Dim File as String, SheetData as String
File = "my file.xls"
SheetData = "name of sheet where data is"
# Copy headers to sheetName in main file
Workbooks(File).Worksheets(SheetData).Range("A1").Select # fails here: Method Select for class Range failed
Workbooks(File).Worksheets(SheetData).Range(Selection, Selection.End(xlToRight)).Select
Workbooks(File).Worksheets(SheetData).Selection.Copy ActiveWorkbook.Sheets(sheetName).Cells(1, 1)
End Sub
なにが問題ですか ?
「myfile.xls」をアクティブにする必要は本当にありません。
編集:それが機能する前に、私はそれをあきらめて、SheetDataを新しいシートとしてターゲットファイルにコピーする必要がありました。 複数の行を検索して選択
2年後(これはグーグルで見つけたので、他の人にとっては)...上で述べたように、何も選択する必要はありません。これらの3行:
Workbooks(File).Worksheets(SheetData).Range("A1").Select
Workbooks(File).Worksheets(SheetData).Range(Selection, Selection.End(xlToRight)).Select
Workbooks(File).Worksheets(SheetData).Selection.Copy ActiveWorkbook.Sheets(sheetName).Cells(1, 1)
と置き換えることができます
Workbooks(File).Worksheets(SheetData).Range(Workbooks(File).Worksheets(SheetData). _
Range("A1"), Workbooks(File).Worksheets(SheetData).Range("A1").End(xlToRight)).Copy _
Destination:=ActiveWorkbook.Sheets(sheetName).Cells(1, 1)
これにより、選択エラーを回避できます。
ベストプラクティスは、ソースファイルを開いて(煩わしくない場合は誤って表示されたステータスで)データを読み取り、それを閉じます。
以下のリンクから、機能するクリーンなコードを入手できます。
http://vba-useful.blogspot.fr/2013/12/how-do-i-retrieve-data-from-another.html
画面に影響がなければ、「myfile.xls」をアクティブにしていただけませんか。画面の更新をオフにすることはこれを実現する方法であり、パフォーマンスも向上します(ワークシート/ワークブックを切り替えながらループを実行している場合は重要です)。
これを行うためのコマンドは次のとおりです。
Application.ScreenUpdating = False
マクロが終了したら、忘れずにTrue
に戻してください。
VBAを使用して、あるワークブックから別のワークブックにデータをコピーする必要がありました。要件は以下のとおりです。1。ActiveXボタンを押すと、ダイアログを開いて、データのコピー元のファイルを選択します。 2. [OK]をクリックすると、値がセル/範囲から現在作業中のブックにコピーされます。
煩わしいワークブックを開くので、open機能を使いたくありませんでした。
以下は私がVBAで書いたコードです。改善や新しい代替案は大歓迎です。
コード:ここでは、A1:C4コンテンツをブックから現在のブックのA1:C4にコピーしています。
Private Sub CommandButton1_Click()
Dim BackUp As String
Dim cellCollection As New Collection
Dim strSourceSheetName As String
Dim strDestinationSheetName As String
strSourceSheetName = "Sheet1" 'Mention the Source Sheet Name of Source Workbook
strDestinationSheetName = "Sheet2" 'Mention the Destination Sheet Name of Destination Workbook
Set cellCollection = GetCellsFromRange("A1:C4") 'Mention the Range you want to copy data from Source Workbook
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.Show
'.Filters.Add "Macro Enabled Xl", "*.xlsm;", 1
For intWorkBookCount = 1 To .SelectedItems.Count
Dim strWorkBookName As String
strWorkBookName = .SelectedItems(intWorkBookCount)
For cellCount = 1 To cellCollection.Count
On Error GoTo ErrorHandler
BackUp = Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount))
Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)) = GetData(strWorkBookName, strSourceSheetName, cellCollection.Item(cellCount))
Dim strTempValue As String
strTempValue = Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)).Value
If (strTempValue = "0") Then
strTempValue = BackUp
End If
Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)) = strTempValue
ErrorHandler:
If (Err.Number <> 0) Then
Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)) = BackUp
Exit For
End If
Next cellCount
Next intWorkBookCount
End With
End Sub
Function GetCellsFromRange(RangeInScope As String) As Collection
Dim startCell As String
Dim endCell As String
Dim intStartColumn As Integer
Dim intEndColumn As Integer
Dim intStartRow As Integer
Dim intEndRow As Integer
Dim coll As New Collection
startCell = Left(RangeInScope, InStr(RangeInScope, ":") - 1)
endCell = Right(RangeInScope, Len(RangeInScope) - InStr(RangeInScope, ":"))
intStartColumn = Range(startCell).Column
intEndColumn = Range(endCell).Column
intStartRow = Range(startCell).Row
intEndRow = Range(endCell).Row
For lngColumnCount = intStartColumn To intEndColumn
For lngRowCount = intStartRow To intEndRow
coll.Add (Cells(lngRowCount, lngColumnCount).Address(RowAbsolute:=False, ColumnAbsolute:=False))
Next lngRowCount
Next lngColumnCount
Set GetCellsFromRange = coll
End Function
Function GetData(FileFullPath As String, SheetName As String, CellInScope As String) As String
Dim Path As String
Dim FileName As String
Dim strFinalValue As String
Dim doesSheetExist As Boolean
Path = FileFullPath
Path = StrReverse(Path)
FileName = StrReverse(Left(Path, InStr(Path, "\") - 1))
Path = StrReverse(Right(Path, Len(Path) - InStr(Path, "\") + 1))
strFinalValue = "='" & Path & "[" & FileName & "]" & SheetName & "'!" & CellInScope
GetData = strFinalValue
End Function
何も選択する必要はないと思います。 2つの空白のワークブックBook1とBook2を開き、Book2のSheet1のRange( "A1")に値 "A"を入力し、次のコードを即時ウィンドウに送信しました-
Workbooks(2).Worksheets(1).Range( "A1")。Copy Workbooks(1).Worksheets(1).Range( "A1")
Book1のSheet1のRange( "A1")に "A"が含まれるようになりました。
また、コードでActiveWorkbookから「myfile.xls」にコピーしようとしているという事実を考えると、CopyメソッドはActiveWorkbookの範囲と宛先に適用する必要があるため、順序が逆になっているようです(引数コピー機能)は、「myfile.xls」の適切な範囲である必要があります。