Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何将工作表变量传递给另一个子表_Excel_Vba_Variables_Worksheet - Fatal编程技术网

Excel 如何将工作表变量传递给另一个子表

Excel 如何将工作表变量传递给另一个子表,excel,vba,variables,worksheet,Excel,Vba,Variables,Worksheet,我有一个主sub-Macro5,它叫一个私有sub-NamedRanges。下面只添加了部分代码 我已经在main sub中将工作簿和工作表声明并设置为wb和wSh,因为名称会不断更改,我将它们用作变量 我在调用的私有sub中使用这些变量时遇到问题。该错误出现在myWorksheet.Cells的私有子文件夹中 错误:未设置对象变量或带变量 我想在设置工作表名称时会出现问题 'identify worksheet containing cell range Set myWorksheet

我有一个主sub-Macro5,它叫一个私有sub-NamedRanges。下面只添加了部分代码

我已经在main sub中将工作簿和工作表声明并设置为wb和wSh,因为名称会不断更改,我将它们用作变量

我在调用的私有sub中使用这些变量时遇到问题。该错误出现在myWorksheet.Cells的私有子文件夹中 错误:未设置对象变量或带变量 我想在设置工作表名称时会出现问题

'identify worksheet containing cell range
    Set myWorksheet = wSh
这是我第一次尝试在不同的sub中使用变量。我在网上看过,但不知道如何解决这个问题。下面是专用子代码和部分主子代码

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)
我已经为主sub添加了很多代码,以说明如何获取wb和wSh变量(如果有帮助)。

我认为您已经将wSh声明为工作表的sub-NamedRanges,不需要使用 '标识包含单元格范围的工作表 设置myWorksheet=wSh

你最好直接使用 '供应商名称范围 使用wSh.Cells

很抱歉,由于我的特权,我还不能发表评论:

我想您已经将wSh声明为工作表的子名称已经存在,您不需要使用 '标识包含单元格范围的工作表 设置myWorksheet=wSh

你最好直接使用 '供应商名称范围 使用wSh.Cells


很抱歉,由于我的特权,我无法发表评论:

根据您的代码,您似乎希望将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)

根据您的代码,您似乎希望将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)

这些在同一模块中吗?请尝试不使用专用命令。@SJR是的,它们在同一个模块中。我尝试不使用Private,但它仍然在同一行上给出相同的错误在Call NamedRangeswb处放置断点,wSh行选择该行并按F9键,然后使用即时窗口Ctrl-G将其弹出,以查看wSh是否为空,即键入?wSh为空并按Return键wSh不总是文件中的最后一页吗?实际上,正如HTH所建议的,当您的循环完成时,ws什么都不是。您需要将其分配给循环中的可见工作表。@HTH和SJR,谢谢,我看到wSh什么都没有。它现在设置为可见工作表。我将运行代码,看看它是否适用于其余的部分。它们在同一个模块中吗?请尝试不使用专用命令。@SJR是的,它们在同一个模块中。我尝试不使用Private,但它仍然在同一行上给出相同的错误在Call NamedRangeswb处放置断点,wSh行选择该行并按F9键,然后使用即时窗口Ctrl-G将其弹出,以查看wSh是否为空,即键入?wSh为空并按Return键wSh不总是文件中的最后一页吗?实际上,正如HTH所建议的,当您的循环完成时,ws什么都不是。您需要将其分配给循环中的可见工作表。@HTH和SJR,谢谢,我看到wSh什么都没有。它现在设置为可见工作表。我将运行代码,看看它是否适用于其余部分。这有助于消除过多的代码/变量!感谢这有助于摆脱过多的代码/变量!