2017-05-17 8 views
-1

あるブックから別のブックにデータをコピー&ペーストしようとしています。この関数は、範囲が静的である場合に機能しますが、動的になることはできません。私はendxldown機能はこのためですけど、私は自分のコードにそれをどのように動作するか:endxldown関数を使用して無制限のデータをコピー&ペーストする

Private Sub CommandButton21_Click() 

Dim itemName As String 

Dim itemPrice As Single 

Dim myData As Workbook 


Worksheets("Sheet1").Select 

itemName = Range("A2") 

Worksheets("Sheet1").Select 

itemPrice = Range("B2") 

Set myData = Workbooks.Open("C:\Users\Iraj.Masud\Desktop\testing\Master.xlsm") 
Worksheets("Sheet1").Select 

Worksheets("Sheet1").Range("A1").Select 

RowCount = Worksheets("Sheet1").Range("A1").CurrentRegion.Rows.Count 
With Worksheets("Sheet1").Range("A1") 

.Offset(RowCount, 0) = itemName 

.Offset(RowCount, 1) = itemPrice 

End With 
myData.Save 

End Sub 

私の編集は、以下の画像で強調表示されています。マクロを実行すると、オブジェクト変数またはブロック変数が設定されていません。

Code with Error

答えて

1

私は推測すると思います:

With Worksheets("Sheet1") 
    With .Range("A" & .Rows.Count).end(xlUp) 
     .Offset(1, 0) = itemName 
     .Offset(1, 1) = itemPrice 
    End With 
End With 
+0

最後にwith ... withブロック – jkpieterse

0

をも

Private Sub CommandButton21_Click() 

    Dim rowcount As Long 
    Dim myData As Workbook 

    With Worksheets("Sheet1") 
     .Range("A2:B" & .Cells(.Rows.Count, 1).End(xlUp).Row).Copy 
    End With 
    Set myData = Workbooks.Open("C:\Users\Iraj.Masud\Desktop\testing\Master.xlsm") 
    With myData.Worksheets("Sheet1") 
     rowcount = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 
     .Cells(rowcount, 1).Paste 
    End With 
    myData.Save 

End Sub 
+0

これはA1、B2を超えて何もコピーしません – jwiggins

+0

あなたのコードでは、@jwigginsのいずれかではありません。 –

+0

Lolはい私は知っています。だから、ダイナミックレンジを含むようにコードを変更する方法を尋ねました。 – jwiggins

0

使用をROWCOUNTする値を設定する命令を参照して、(私はあなたのコードをクリーンアップ)、これを試してみてくださいEnd(xlUp)最後の行をキャプチャするために、これはxlDownを使用するよりも優れています。これは、後者が最後の行ではなく最初の空の行を取得するためです。すべての不要なSelectものを削除し、アレイを使用して

は、あなたのコードがこれまで低減することができます。すべての参照が明示されていることを

Private Sub CommandButton21_Click() 
    With Workbooks.Open("C:\Users\Iraj.Masud\Desktop\testing\Master.xlsm").Sheets("Sheet1") 
    .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Resize(1, 2).Value = _ 
     ThisWorkbook.Sheets("Sheet1").Range("A2:B2").Value2 
    .Parent.Close True 
    End With 
End Sub 

ノート、ワークブックまたはワークシートがアクティブな方への暗黙的な参照はありません。これにより、通常より安全なコードが作成されます。

EDIT

あなたがすべてコピーしたい場合は、次のソースからのBデータを、これを使用する:

Private Sub CommandButton21_Click() 
    Dim src as Range 
    Set src = ThisWorkbook.Sheets("Sheet1").Range("A2", ThisWorkbook.Sheets("Sheet1").Range("B999999").End(xlUp) 
    With Workbooks.Open("C:\Users\Iraj.Masud\Desktop\testing\Master.xlsm").Sheets("Sheet1") 
    .Cells(.Rows.Count, "A").End(xlUp).Offset(1) _ 
     .Resize(src.Rows.Count, src.Columns.Count).Value = src.Value2 
    .Parent.Close True 
    End With 
End Sub 
0
Private Sub CommandButton21_Click() 

Dim itemName As String 
Dim itemPrice As Single 
Dim wbData As Workbook 
Dim wsData As Worksheet 
Dim newData As Range 

With ThisWorkbook.Worksheets("Sheet1") '<~defines that we are working on sheet1 
    itemName = .Range("A2")    '<~gets the itemname 
    itemPrice = .Range("B2")    '<~gets the itemprice 
End With 

Set wbData = Workbooks.Open("C:\Users\Iraj.Masud\Desktop\testing\Master.xlsm") '<~opens then workbook 
Set wsData = wbData.Worksheets("Sheet1")          '<~sets the worksheet 
Set newData = wsData.Range("A1048576").End(xlUp).Offset(1, 0)     '<~locate last cell and offset 1 row below 

With newData       '<~defines that we are working with the cell below the last non-blank cell 
    .Offset(0, 0).Value = itemName  '<~passes the item name 
    .Offset(0, 1).Value = itemPrice  '<~passes the item price 
End With 

Set newData = Nothing     '<~post procedure cleaning 
Set wsData = Nothing     '<~post procedure cleaning 

wbData.Save        '<~save 
wbData.Close 

End Sub 

これは分厚いコードかもしれません。しかし、IMOでは、コードの一部を変更したい場合に柔軟に対応します。

関連する問題