Как передать переменную рабочего листа в другой подпункт - PullRequest
1 голос
/ 02 апреля 2020

У меня есть основная подпрограмма (Sub Macro5), которая вызывает частную подпрограмму (NamedRanges). (только часть кода, добавленного ниже)

Я объявил и установил рабочую книгу и рабочий лист в главном подпункте как wb и w Sh, поскольку имена будут постоянно меняться. Я использую их как переменные.

У меня проблема с использованием этих переменных в закрытой подпрограмме, которая вызывается. Ошибка возникает в закрытой подпрограмме на With myWorksheet.Cells error: «Переменная объекта или переменная не установлена» Я предполагаю, что проблема возникает при установке имени листа?

'identify worksheet containing cell range
    Set myWorksheet = wSh

Это первый раз, когда я ' Я пытаюсь использовать переменные в разных подпрограммах. Я посмотрел онлайн, но не уверен, как решить эту проблему. Ниже приведена частная подпрограмма и часть основного подпрограммы.

Private Sub NamedRanges(wb As Workbook, wSh As Worksheet)

'declare object variable to hold reference to worksheet containing cell range
    Dim myWorksheet As Worksheet

    'declare variables to hold row and column numbers that define named cell range (dynamic)
    Dim myFirstRow As Long
    Dim myLastRow As Long

    'declare object variable to hold reference to cell range
    Dim myNamedRangeDynamicVendor As Range
    Dim myNamedRangeDynamicVendorCode As Range

    'declare variable to hold defined name
    Dim myRangeNameVendor As String
    Dim myRangeNameVendorCode As String

    'identify worksheet containing cell range
    Set myWorksheet = wSh

    'identify first row of cell range
    myFirstRow = 2

    'specify defined name
    myRangeNameVendor = "namedRangeDynamicVendor"
    myRangeNameVendorCode = "namedRangeDynamicVendorCode"

    'Vendor Name range
    With myWorksheet.Cells

        'find last row of source data cell range
        myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

        'specify cell range
        Set myNamedRangeDynamicVendor = .Range(.Cells(myFirstRow, "A:A"), .Cells(myLastRow, "A:A"))

    End With
End Sub




Sub Macro5

Dim wb As Workbook
Dim ws As Worksheet
Dim path As String
Dim MainWB As Workbook
Dim MasterFile As String
Dim MasterFileF As String

Set ws = Application.ActiveSheet
Set MainWB = Application.ActiveWorkbook

Application.ScreenUpdating = False

'Get folder path
path = GetFolder()

'Get visible worksheet on Master data File
MasterFile = Dir(path & "\*Master data*.xls*")
MasterFileF = path & "\" & MasterFile

Set wb = Workbooks.Open(MasterFileF)

'Count visible worksheets
Dim i As Integer
Dim wSh As Worksheet

i = 0

For Each ws In wb.Worksheets
    If ws.Visible = True Then
        i = i + 1
    End If
Next ws

'if more then 1 sheet visible then prompt to choose one
If i > 1 Then
    MsgBox "More than one worksheet visible, please edit 'Master data' File to have only the 1 worksheet visible that it needs to use, and rerun macro"
    Exit Sub
Else
'If only 1 sheet visible use sheet name
    Set wSh = ws
End If

'Set Vendor Name and Code Range names
Call NamedRanges(wb, wSh)

Я включил много кода для основной подпрограммы, чтобы показать, как я получаю свои wb и w Sh переменные, если это помогает.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

В соответствии с вашим кодом вы, похоже, хотите, чтобы wSh был установлен на первый и единственный видимый лист в wb

, поэтому измените последнюю часть Macro5 на:

For Each ws In wb.Worksheets
    If ws.Visible = True Then
        Set wSh = ws
        i = i + 1
    End If
Next ws

'if more then 1 sheet visible then prompt to choose one
If i > 1 Then
    MsgBox "More than one worksheet visible, please edit 'Master data' File to have only the 1 worksheet visible that it needs to use, and rerun macro"
    Exit Sub
End If

'Set Vendor Name and Code Range names
Call NamedRanges(wb, wSh)
1 голос
/ 02 апреля 2020

Я думаю, что с вами Sub NamedRanges, который вы уже объявили wSh As Worksheet, и вам не нужно объявлять его снова с 'identify worksheet containing cell range Set myWorksheet = wSh

Вам лучше напрямую использовать 'Vendor Name range With wSh.Cells

Извините, я не могу комментировать еще из-за моей привилегии:)

...