简体   繁体   中英

How to Pass a Worksheet variable to another sub

I have a main sub (Sub Macro5) that's calling a private sub (NamedRanges). (only part of the code added below)

I've declared and set the workbook and worksheet in the main sub as wb and wSh , since the names will constantly change I use them as variables.

I'm having a problem in using these variables in the private sub that's getting called. The error comes up in the private sub at With myWorksheet.Cells error:"Object variable or with variable not set" I presume the problem comes in at setting the worksheet name?

'identify worksheet containing cell range
    Set myWorksheet = wSh

It's the first time I'm trying to use variables in different subs. I've looked online but not sure how to solve this issue. Below is the private sub and part of the main sub code.

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)

I've included a lot of code for the main sub to show how I get my wb and wSh variables if it helps.

As per your code you seem to want wSh set to the first and only visible sheet in wb

hence change the last part of Macro5 to:

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)

I think with you the Sub NamedRanges you have already declared wSh As Worksheet and you do not need to declare it again with the 'identify worksheet containing cell range Set myWorksheet = wSh

You better directly use 'Vendor Name range With wSh.Cells

Sorry, I cannot comment yet due to my privilege :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM