2017-07-13 14 views
0

非常に単純なマクロを作成しました。このブックから別のブックと選択した範囲のデータを開きます。 しかし、私はこの警告を受け取り続けます:オブジェクトはこのプロパティまたはメソッドをサポートしていませんVBA:オブジェクトはこのプロパティまたはメソッドをサポートしていません

何が問題なのですか?

Sub data() 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim filename As String 
Dim lastrow As Integer 
Dim lastcolumn As Integer 
Dim range_to_copy As Range 

'open workbook 
filename = "C:\Users\mk\Desktop\sales report\Sales Report.xls" 
Set wb = Workbooks.Open(filename) 
Set ws = wb.Sheets("data") 

lastcolumn = wb.ws.Cells(1, wb.ws.Columns.Count).End(xlToLeft).Column 
lastrow = wb.ws.Cells(wb.ws.Roows.Count, 1).End(xlToLeft).Row 

range_to_copy = Range("Cells(1,1):Cells(lastrow,lastcolumn)") 

End sub 

答えて

0

コードにいくつかの誤りがあります。 試用

lastcolumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row 

Set range_to_copy = Range(ws.Cells(1, 1), ws.Cells(lastRow, lastcolumn)) 
+0

ありがとうございましたが、私はwb.ws.Cellsのws.Cellsのinsetadを使用する必要がありますなぜあなたは説明することができます? – aannie

+0

'wb'はワークブックオブジェクトです。これは、ブック内のすべてのシートの配列であるプロパティ 'sheets'を持っています。すでにこのプロパティにアクセスして、作業するワークシートを変数 'ws'に割り当てています。そこから 'ws'を使うことができます。 'wb'はプロパティ' ws'を持たないので、これは動作しません。あなたは 'wb.sheets(" data ")。Cells'を使うことができますが、なぜ' ws'を変数として使用しているのですか? – FunThomas

2

多くのことが間違っています。

編集:
Dim lastrow As Integer Dim lastcolumn As Integer
Integerは32,767までの数値を格納することができます。これは列には問題ありませんが、行番号にオーバーフローエラーが発生します。 Longのデータ型を使用する方が良いでしょう - 数字は2,147,486,647までです。
lastcolumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

lastrow = wb.ws.Cells(wb.ws.Roows.Count, 1).End(xlToLeft).Row
Rowsはそれだけで1 oを持っている:あなただけの必要があるので

ws変数はすでにワークブックを参照します。
編集:xlToLeft右端のセルを見て、左に動作します。あなたは行を探しているので、最後のセルを見て、働くxlUpを使う必要があります。

range_to_copy = Range("Cells(1,1):Cells(lastrow,lastcolumn)")
これはオブジェクトなので、Setです。セル参照はコンマで区切られており、文字列として保持しないでください。

Sub data() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim filename As String 
    Dim lastrow As Long 
    Dim lastcolumn As Long 
    Dim range_to_copy As Range 

    'open workbook 
    filename = "C:\Users\mk\Desktop\sales report\Sales Report.xls" 
    Set wb = Workbooks.Open(filename) 
    Set ws = wb.Sheets("data") 

    lastcolumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 
    lastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row 

    Set range_to_copy = ws.Range(ws.Cells(1, 1), ws.Cells(lastrow, lastcolumn)) 

End Sub 

注:すべての範囲参照には、ワークシート参照が先行しています。これがなければ、常に現在アクティブなシートを見るので、dataシートにない場合、2番目のセル参照がアクティブシートを見るので、次のことは失敗します。
ws.Range(ws.Cells(1, 1), Cells(lastrow, lastcolumn))

コードブロックWith....End Withをチェックする価値があります。

+1

'lastrow = ws.Cells(ws.Rows.Count、1).End(xlToLeft).Row'は、Excelファイル形式に応じて常に1048576または65536を返します。あなたのための早朝も? (またはそれは深夜ですか?);-) – YowE3K

+0

@ YowE3K。地獄で誰かが「xlToLeft」を入れて、決して働かないと思っていた。早朝。 @Shaidoよりも数時間早いので、もっと良い言い訳があります。 :)それは私にOPに言及するのを忘れた別のエラーを思い出させました - 'Dim lastrow as Integer'。私は私の答えを更新します。乾杯。 –

+1

私はあなたがシャイの答えの誤りを拾ってきたのを見たときに少し動揺しました - 私はそれをしたかったので - あなたが何かを見過ごしたことに気づいた時嬉しかったです! :D – YowE3K

0

あなたが定義されており、あなたのwsワークシートオブジェクトを設定したら、あなたはwsワークシートオブジェクトが完全にwbワークブックにSheets("data")でquallifiedされているので、もうwbオブジェクトを参照する必要はありません。

は今、あなたがする必要があるすべては、以下のコードのように、Withステートメントを使用している:

Set ws = wb.Sheets("data")  
With ws 
    lastcolumn = .Cells(1, .Columns.Count).End(xlToLeft).Column 
    lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row 

    Set range_to_copy = .Range(.Cells(1, 1), .Cells(lastrow, lastcolumn)) 
End With 
+2

まだ早朝ですか?あなたはあなたの範囲を 'セットするのを忘れました。 :D –

+0

@ DarrenBartrup-Cook LOL;)、yep –

関連する問題