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

обратите внимание, я изменил:

  1. тип возврата до Worksheet (вы пытаетесь установить переменную wSheet, которая имеет тип Worksheet до тип)
  2. добавил set ключевое слово
  3. изменено на .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