У меня есть основная подпрограмма (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 переменные, если это помогает.