21

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

したがって、基本的にユーザーに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")

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

4

4 に答える 4

28

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

問題を切り分けるために、例を単純化しました。これを試して:

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 をシート名に置き換えます。

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

于 2012-06-08T16:12:53.293 に答える
8

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

sourceSheetSum.Select
sourceSheetSum.Range("C3").Select
于 2012-06-08T16:13:06.283 に答える
4

assylias とケータリングの責任者は、エラーが発生している理由を既に伝えています。

今あなたがしていることに関して、私が理解していることから、あなたはまったく使う必要はありませ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)
于 2012-06-08T17:23:49.673 に答える