VBA: возврат ссылки на объект листов из функции
как вернуть ссылку на объект Worksheets? Я просматривал различные поисковые запросы Google с результатами nada.
например, у меня есть функционирующий код, например. wSheet уже dim'Ed:
Public wSheet As Worksheet
...
Set wSheet = ActiveWorkbook.Worksheets("ExampleSheet")
wSheet.Range("A1").Value = "Hello"
однако я хочу, чтобы wSheet теперь вызывал модуль, который поставляет его в правильную ссылку. Что-то вроде этого:--4-->
Public wSheet As Worksheet
...
Set wSheet = myModule.get_ExampleSheet
wSheet.Range("A1").Value = "Hello"
и затем имеют функцию в модуле myModule
Function get_ExampleSheet() As Worksheets
get_ExampleSheet = ActiveWorkbook.Worksheets("ExampleSheet")
End Function
все, что я пытаюсь дает мне различные среды выполнения ошибки. Есть ли способ заставить это работать?
спасибо и вперед!
5 ответов
вы возвращаете неправильный тип объекта в функции.
Function get_ExampleSheet() As Worksheets
get_ExampleSheet = ActiveWorkbook.Worksheets("ExampleSheet")
End Function
в настоящее время это имеет несколько ошибок.
Function get_ExampleSheet() As Worksheet
Set get_ExampleSheet = ActiveWorkbook.Sheets("Sheet1")
End Function
обратите внимание, я изменил:
- тип возврата до
Worksheet
(вы пытаетесь установить переменную wSheet, которая имеет типWorksheet
до тип) - добавил
set
ключевое слово - изменено на
.Worksheets
to.Sheets
чтобы вернуть конкретный лист, который вас интересует
Sub Lookup()
Dim state As Variant
Dim PodName As Variant
Set state = ThisWorkbook.Worksheets("Sheet1").Range("E:E")
Sheets("Sheet1").Activate
PodName = WorksheetFunction.VLookup(state, Range("A1:C55"), 2, False)
ThisWorkbook.Worksheets("Sheet1").Range("F:F") = PodName
End Sub
макрос должен остановиться, как только целевая ячейка пуста
чтобы вернуть объект из функции, вам необходимо предоставить Set
ключевые слова:
Function get_ExampleSheet() As Worksheet
Set get_ExampleSheet = ActiveWorkbook.Worksheets("ExampleSheet")
End Function
http://excelmacromastery.com/Blog/index.php/the-complete-guide-to-worksheets-in-excel-vba/
в вашей обычной части кода
Dim issues_sheet As Worksheet
Set issues_sheet = create_working_sheet("Issues")
issues_sheet.Range("A1").Value = "bssssbb"
функция может быть что-то вроде
Function create_working_sheet(sheet_name As String) As Worksheet
For i = 1 To Worksheets.Count
If Worksheets(i).Name = sheet_name Then
exists = True
End If
Next i
If Not exists Then
Worksheets.Add.Name = sheet_name
'if we want it at the end
'Sheets.Add(After:=Sheets(Sheets.Count)).Name = sheet_name
End If
Set create_working_sheet = ThisWorkbook.Sheets(sheet_name)
End Function
полный обзор способов установки рабочего листа с помощью VBA можно найти здесь:http://codevba.com/excel/set_worksheet.htm