#excel #vba #worksheet-function
#преуспеть #vba #рабочий лист-функция #excel
Вопрос:
Я работаю над проектом по фильтрации нескольких рабочих листов / столбцов. Первым шагом является определение количества строк со значениями в первом столбце листа «Данные Iris» и построение вокруг этого (поскольку это будет использоваться снова с новыми данными, удалено и сделано снова и т.д.). Код, который у меня есть сейчас, не работает и возвращает ошибку «Ошибка времени выполнения ‘9’: индекс вне диапазона». Поскольку во многих примерах используется общий «Лист1», я попытался скопировать / вставить те же данные в новый лист с именем «Лист1», и это было успешно. К сожалению, переименование листов не является вариантом, согласно моему руководителю. Вероятно, я мог бы немного изменить его, но не сильно.
Итак, мой вопрос в том, является ли это проблемой именования с пробелом в ‘Iris Data’? Какая-то другая проблема?
Я попытался изменить ‘IrisData’ или ‘Iris_Data’, и это также возвращает ошибку времени выполнения 9. Я также попытался установить ‘Sheet1’ = «Данные Iris», и это также возвращает ошибку времени выполнения 9.
Sub Helping_Out_Alex()
Dim wb As Workbook 'identify source workbook
Dim IrisData As Worksheet 'identify Iris Data worksheet
Dim xlApp As Object 'tie workbook/worksheet into an object
Dim lastRow As Long 'identify numerical value for # of rows
Dim Sheet1 As String 'issue with spaces in name, work-around
Sheet1 = "Iris Data" 'Added this as a work around
Set xlApp = CreateObject("Excel.Application") 'set variable to object
Set wb =
xlApp.Workbooks.Open("\uk1.group.internaldataPERSONALGorowsRMy
DocumentsEquinitiHelping_Out_Alex.xlsm") 'set varaible to workbook
Set IrisData = wb.Worksheets("Sheet1") 'set variable to first sheet
With xlApp 'Example code
.Visible = True 'Example code
.EnableEvents = True 'Example code
End With 'Example code
With ActiveSheet
lastRow = IrisData.Cells(.Rows.Count, "A").End(xlUp).Row 'This is the variable I'm trying to define as a number so I know the range each time
MsgBox "the value is" amp; lastRow
End With
End Sub
Комментарии:
1. Я не слишком уверен в этом, поэтому не собираюсь размещать это в качестве ответа. Попробуйте
Set IrisData = Workbooks(wb.Name).Sheets("Sheet1")
2. @TimStack зачем разыменовывать
wb.Name
изWorkbooks
, если у вас уже естьwb
? т. Е.wb.Worksheets("Sheet1")
все в порядке3. Вы создаете объект Excel с использованием поздней привязки, но затем используете обычные свойства Excel. Где вы выполняете этот код? Доступ? Word? Сам Excel? Вы активировали ссылки на библиотеку Excel?
4. @TimStack Я упоминаю об этом, потому что я выбрал точно такую же упущенную возможность в вашем совершенно прекрасном недавнем ответе, за который я проголосовал несколько минут назад 😉
5.Вы передаете строку ilteral
"Sheet1"
вWorksheets
коллекцию; вы имели в виду передать ей содержимое переменнойSheet1
? Если это так, я бы настоятельно рекомендовал переименовать эту переменную вirisSheetName
или что-то подобное значимое, предполагая, что это вообще необходимо.
Ответ №1:
Строка
Set IrisData = wb.Worksheets("Sheet1")
указывает Excel указать на лист, имя которого (как показано на вкладке Excel в нижней части экрана) — Лист1. Вы также можете указать на лист по его кодовому имени (показанному в окне vbeditor project explorer), чтобы
Set IrisData = wb.Worksheets(Fred)
Или по его индексу, где первый лист слева равен 1: так
Set IrisData = wb.Worksheets(1)
Похоже, ваша проблема в том, что ваш лист на самом деле называется чем-то вроде «Данные радужной оболочки»
поэтому вам нужно либо
Set irisdata = wb.worksheets("Iris Data")
или (возможно, проще), поскольку вы говорите, что это первый лист, просто
Set IrisData = wb.Worksheets(1)
Комментарии:
1. Это сработало для меня — более конкретно, изменив на «Set IrisData = wb.Worksheets (1). Спасибо!
2. @CircularReference обратите внимание, что из всех вариантов это самый хрупкий, если только вы не защищаете структуру рабочей книги таким образом, чтобы пользователь не мог изменять порядок листов или вставлять новые. Если в этой книге есть рабочий лист («вкладка») с именем «Данные радужной оболочки глаза», переход по имени обычно будет более надежным (хотя пользователи все еще могут переименовывать листы в незащищенной книге). Если переход по имени выдает ошибку 9, обратите внимание на начальные или конечные пробелы и удалите их.
3. Я бы согласился с этим, к сожалению, я все еще не могу объяснить, почему я продолжаю получать ошибку времени выполнения 9 при попытке использовать «Данные Iris», я даже пробовал копировать / вставлять из блокнота, чтобы строка была такой же, когда я переименовываю лист и помещаю в модуль. Все еще выдает ошибку. Но это для коллеги, который обратился за помощью, так что это такое же разочарование, как и я для них
4. В редакторе vb, при активном листе данных iris в Excel, в типе немедленного окна ? activesheet, имя, которое должно отображать то, что, по мнению Excel, называется. В качестве альтернативы введите Activesheet. name = «Данные Iris», чтобы переименовать его
Ответ №2:
Вы можете получить доступ к листу по его имени (строка) или по его номеру (целое число). Пробел в имени не является проблемой, вы все равно можете получить к нему доступ по имени.
Все это должно делать:
Const sheetName = "Iris Data"
Set IrisData = wb.Worksheets(sheetName)
- or -
Set IrisData = wb.Worksheets("Iris Data")
- or -
Set IrisData = wb.Worksheets(1) ' This assumes that the sheet is the 1st sheet in Workbook.
Может быть, вы боретесь с
Sheet1 = "Iris Data"
...
Set IrisData = wb.Worksheets("Sheet1")
Там вы задаете (строковую) переменную с именем Sheet1
в качестве имени листа, но позже вы получаете доступ не к листу с именем, которое хранится в переменной, а к листу с именем «Лист1» (и, поскольку оно отсутствует, вы получаете ошибку времени выполнения 9). Просто опустите кавычки, должно сработать (однако я бы рекомендовал использовать другое имя переменной).
Set IrisData = wb.Worksheets(Sheet1)