web-dev-qa-db-ja.com

VBAエラー1004-範囲クラスのメソッドの選択に失敗しました

初めてのポスターです。フォーマットやガイドラインを守っていない場合は、修正できるようお知らせください。

だから私は基本的にユーザーにExcelファイルのファイルディレクトリを尋ねてから、いくつかの変数を設定します(これらは他の場所で使用されて変更されていたため、元々プロジェクト変数としてパブリックに設定されていました)。また、これらの変数を何も設定しないように行を追加しました(念のため、重要ではないと思います)。次に、これらの変数を、アクセスしたいExcelファイル、ワークブック、シートに設定します。

Dim filepath as String
filePath = CStr(fileDialog)              'ask file dir, set to string
Dim sourceXL As Variant                  'these three were orig project variables
Dim sourceBook As Variant
Dim sourceSheet As Variant
Dim sourceSheetSum As Variant

Set sourceXL = Nothing                    'set to nothing in case...?
Set sourceBook = Nothing
Set sourceSheet = Nothing
Set sourceSheetSum = Nothing

Set sourceXL = Excel.Application          'set to the paths needed
Set sourceBook = sourceXL.Workbooks.Open(filePath)
Set sourceSheet = sourceBook.Sheets("Measurements")
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary")

Dim measName As Variant                    'create variable to access later
Dim partName As Variant

sourceSheetSum.Range("C3").Select           'THIS IS THE PROBLEM LINE

measName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value
sourceSheetSum.Range("D3").Select
partName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value

したがって、2つの異なるシート変数「sourceSheets」と「sourceSheetsSum」を作成しました。「sourceSheets」を使用するとコードは機能しますが、「sourceSheetsSum」を使用するとエラー1004が発生します。また、何らかの理由で「sourceSheetSum」をオーバーライドしていた場合に備えて、変数「sourceSheet」を完全に削除してコードを試しました。

Excelのブックとシートが存在し、正しく呼び出されていることはかなり確信しています。これは、ブック内のすべてのシートをループして名前を出力するコードを簡単に実行したためです。

For j = 1 To sourceBook.Sheets.Count
Debug.Print (Sheets(j).name)
Next j

のデバッグ出力で

測定
分析サマリー
分析設定

だから、誰もこのエラーが何を意味するのか、またはエラーが実際に何であるかについてもっと多くのことを見つけることができるかについてのアイデアを持っていますか?

編集:だから、シート名のリストに少し追加することにしましたが、それがまったく役立つかどうかはわかりません。

For j = 1 To sourceBook.Sheets.Count
    listSheet(j) = Sheets(j).name
Next j    
Debug.Print (listSheet(2))    
Set sourceSheetSum = sourceBook.Sheets(listSheet(2))

デバッグは分析の概要を出力するので、ワークブックにシートが存在し、名前に「タイプミス」の問題がないはずです。
コードの同じ行にはまだ同じエラーがあります。

deusxmach1na:あなたは私に変えてほしかったと思う

Dim sourceXL As Variant                  
Dim sourceBook As Variant
Dim sourceSheet As Variant
Dim sourceSheetSum As Variant

Set sourceSheet = sourceBook.Sheets("Measurements")

Dim sourceXL As Excel.Application
Dim sourceBook As Excel.Workbook
Dim sourceSheet As Worksheet
Dim sourceSheetSum As Worksheet

Set sourceSheet = sourceBook.Worksheets("Measurements")

しかし、これはエラーを変更しません、私はそれと似ていたのを覚えています、そして、私はそのバリアントがキャッチオールのようなものであり、実際にはバリアントが何であるかということではないので、それを変更しました.

17
Onekuo

範囲を選択する前に、シートを選択する必要があります。

問題を特定するために例を単純化しました。これを試して:

Option Explicit


Sub RangeError()

    Dim sourceBook As Workbook
    Dim sourceSheet As Worksheet
    Dim sourceSheetSum As Worksheet

    Set sourceBook = ActiveWorkbook
    Set sourceSheet = sourceBook.Sheets("Sheet1")
    Set sourceSheetSum = sourceBook.Sheets("Sheet2")

    sourceSheetSum.Select

    sourceSheetSum.Range("C3").Select           'THIS IS THE PROBLEM LINE

End Sub

Sheet1とSheet2をシート名に置き換えます。

重要な注意:バリアントの使用は危険であり、殺すのが難しいバグにつながる可能性があります。非常に具体的な理由がある場合にのみ使用してください。

25
Jon Crowell

最初にシートを選択せず​​に範囲を選択することはできません。最初にシートを選択して、まだ問題が発生するかどうかを確認してください。

sourceSheetSum.Select
sourceSheetSum.Range("C3").Select
8
assylias

assyliasとHead of Cateringは、エラーが発生している理由をすでに示しています。

今、あなたが何をしているのかについて、私が理解していることから、あなたはSelectを使用する必要はまったくありません

VBA PowerPointからこれをしていると思いますか?はいの場合、コードは次のように書き換えられます

Dim sourceXL As Object, sourceBook As Object
Dim sourceSheet As Object, sourceSheetSum As Object
Dim lRow As Long
Dim measName As Variant, partName As Variant
Dim filepath As String

filepath = CStr(FileDialog)

'~~> Establish an Excel application object
On Error Resume Next
Set sourceXL = GetObject(, "Excel.Application")

'~~> If not found then create new instance
If Err.Number <> 0 Then
    Set sourceXL = CreateObject("Excel.Application")
End If
Err.Clear
On Error GoTo 0

Set sourceBook = sourceXL.Workbooks.Open(filepath)
Set sourceSheet = sourceBook.Sheets("Measurements")
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary")

lRow = sourceSheetSum.Range("C" & sourceSheetSum.Rows.Count).End(xlUp).Row
measName = sourceSheetSum.Range("C3:C" & lRow)

lRow = sourceSheetSum.Range("D" & sourceSheetSum.Rows.Count).End(xlUp).Row
partName = sourceSheetSum.Range("D3:D" & lRow)
3
Siddharth Rout

コピーが機能する前に範囲選択を削除します。投稿いただきありがとうございます。

0
Pete