Вопрос по powerpoint-vba, vb.net, excel-vba, vba, excel-2010 – Ошибка VBA 1004 - не удалось выбрать метод класса диапазона

17

Первый постер, так что если есть какое-либо форматирование или рекомендации, которых я не придерживался, пожалуйста, дайте мне знать, чтобы я мог это исправить.

Поэтому я в основном спрашиваю пользователя о каталоге файлов в файле Excel, а затем устанавливаю некоторые переменные (изначально они были установлены как public как переменные проекта, поскольку они использовались и изменялись в других местах). Я также добавил строки, чтобы установить эти переменные в ноль (на всякий случай, я не думаю, что это должно иметь значение). Затем я устанавливаю эти переменные в файл 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

Таким образом, я создал две разные переменные листа: «sourceSheets». и «sourceSheetsSum», код работает, если я использую «sourceSheets», но ошибка 1004 возникает, если я использую «sourceSheetsSum». Я также пробовал код с переменной «aS; sourceSheet» ». полностью удален, в случае, если это переопределяет «sourceSheetSum»; по какой-то причине.

Я вполне уверен, что книга и листы Excel существуют и правильно называются, так как я быстро выполнил код, чтобы просмотреть все листы в книге и вывести имена, как показано ниже.

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

С выходом отладки

Measurements
Analysis Summary
Analysis Settings

Итак, есть ли у кого-нибудь идеи, что может означать эта ошибка, или как я могу узнать больше о том, что на самом деле является ошибка?

РЕДАКТИРОВАТЬ: Поэтому я решил немного добавить к списку имен листов, не уверен, поможет ли это вообще.

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")

Но это не меняет ошибку, я помню, что она была похожа на эту, а затем изменила ее, так как я прочитал, что этот вариант похож на ловушку, а не на то, что это за вариант.

Я бы затемнил ваши листы именно как «Рабочие листы» и посмотрел, что произойдет.Dim sourceSheetSum as Worksheet  На самом деле, вы можете захотеть затемнить все с большей конкретностью. deusxmach1na

Ваш Ответ

4   ответа
25

Вы должны выбрать лист, прежде чем вы сможете выбрать диапазон.

Я упростил пример, чтобы изолировать проблему. Попробуй это:

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 своими именами листов.

IMPORTANT NOTE: Использование вариантов опасно и может привести к ошибкам, которые трудно убить. Используйте их, только если у вас есть очень конкретные причины для этого.

Я не могу поверить, что вы опередили меня на 13 секунд на вопросе 2 часа! +1 за скорость ;-)
Я должен сказать, что сообщения об ошибках Excel VBA действительно плохие. Почему не удалось сказать "Ошибка выбора ячеек на нетоковом листе"? или что-то такое? Вздох.
@HeadofCatering Good Call! Я почти никогда не использую Selects и забыл, что сначала нужно выбрать Sheet. Вздох, добрый день! макрос записанный код.
Если бы сообщения об ошибках были такими полезными, переполнение стека не существовало бы.
+1 к хорошему баллу по вариантам
3

у возникновения ошибки.

Теперь о том, что вы делаете, из того, что я понимаю, вам не нужно использовать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)
@DPD: Ага ... Смотрите эту ссылку;)stackoverflow.com/questions/10714251/…
Спасибо! Это было именно то, что мне было нужно. Уповеди оба ответа.
Привет у меня есть связанная проблема (извините за угон). Я выполняю рефакторинг некоторого кода и перемещаю его из листа в модуль. Доступ к рабочему листу осуществляется с помощьюWorksheets(name).Range , Он работал нормально без выбора, прежде чем я переместил его в модуль. Теперь мне нужно добавитьWorksheet.Select линия до того, чтобы заставить его работать, иначе это дает мне'1004', В некоторых случаях даже это не работает. Любая идея, почему перемещение кода создало проблему и как ее решить, не добавляя строку миллион раз. Извините, я новичок в VBA.
0

как копия сработала для меня. Спасибо за сообщения.

8

не выбрав сначала лист, на котором он находится. Попробуйте сначала выбрать лист и посмотрите, не возникла ли еще проблема:

sourceSheetSum.Select
sourceSheetSum.Range("C3").Select
+1 за то, что ты сделал это одновременно :)
+1 за ответ на один и тот же вопрос почти в одно и то же время.

Похожие вопросы