Passing Array to Function Requiring Transformation in VBA
我已经通过一种变通办法解决了这一问题,但是我敢肯定,这里缺少一些基本的知识,希望理解为什么在VBA阵列中会发生这种情况。
我在excel中有一组选项卡,它们是"管理表"-我在公共数组中定义了这些选项卡,以便能够在工具的各种功能和子例程之间共享该单个变量。
我有一个函数,可以像管理工作表变量一样传递Variant数组,但是如果我不使用中间数组(Redim调整大小并适合基础输入)来转换输入数组,则会创建一个烦人的数组。
喜欢:
FunctionArray(0)(n),其中传递的Aray的所有N个对象都与函数输入中的第一个对象对齐。 然后,我必须将其转换为数组,以便FinalArray(n)保留我最初想要的值。
当然,我在这里做错了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | Public AdminSheets As Variant 'here we define our tabs that need to be admin-only items. AdminSheets = Array("Control Panel","WBS Setup","Staff Tables","BOE Summary Output","TEMPLATE","PQ_Output","Output") Public Function ShowHideSheets(ParamArray TargetSheets() As Variant) 'Simply buckets the re-visible toggle of all sheets that are Admin Sheets. 'modify target array to fit consumable format for the iterator generically below. 'this step is not truly necessary if i change the iterator below, but i do it to make the array look the way i prefer when interfacing with Arrays. Without this step, the iterator below breaks. Application.ScreenUpdating = False Dim VisibleToggle() As String ReDim VisibleToggle(UBound(TargetSheets(0))) For X = 0 To UBound(VisibleToggle) VisibleToggle(X) = TargetSheets(0)(X) Next X 'here we do what i care about - modulate the tool to hide sheets from end users who don't need to see things. Dim i As Integer For i = 0 To UBound(VisibleToggle) If ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetHidden Then ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVisible ElseIf ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVeryHidden Then ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVisible ElseIf ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVisible Then ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVeryHidden End If Next i Application.ScreenUpdating = True End Function |
编辑:
这是我不先测试就得到的,哈哈。
另外,只需注意函数将返回内容和子项"做事",因此
就像@BigBen所说的那样,您不需要
1 2 3 4 5 | Public Sub Test1() ShowHideSheets"Control Panel","WBS Setup", _ "Staff Tables","BOE Summary Output", _ "TEMPLATE","PQ_Output","Output"` End Sub |
另一种选择是执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | Public Sub Test2() AdminSheets = Array("Control Panel","WBS Setup","Staff Tables","BOE Summary Output","TEMPLATE","PQ_Output","Output") ShowHideSheets AdminSheets End Sub Public Sub ShowHideSheets(ByRef TargetSheets As Variant) 'Simply buckets the re-visible toggle of all sheets that are Admin Sheets. 'modify target array to fit consumable format for the iterator generically below. 'this step is not truly necessary if i change the iterator below, but i do it to make the array look the way i prefer when interfacing with Arrays. Without this step, the iterator below breaks. 'here we define our tabs that need to be admin-only items. Application.ScreenUpdating = False 'here we do what i care about - modulate the tool to hide sheets from end users who don't need to see things. Dim i As Integer For i = 0 To UBound(TargetSheets) If ActiveWorkbook.Sheets(TargetSheets(i)).Visible = xlSheetHidden Then ActiveWorkbook.Sheets(TargetSheets(i)).Visible = xlSheetVisible ElseIf ActiveWorkbook.Sheets(TargetSheets(i)).Visible = xlSheetVeryHidden Then ActiveWorkbook.Sheets(TargetSheets(i)).Visible = xlSheetVisible ElseIf ActiveWorkbook.Sheets(TargetSheets(i)).Visible = xlSheetVisible Then ActiveWorkbook.Sheets(TargetSheets(i)).Visible = xlSheetVeryHidden End If Next i Application.ScreenUpdating = True End Sub |
原版的:
从函数参数传递到另一个函数时,
见下文:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Public AdminSheets As Variant 'here we define our tabs that need to be admin-only items. AdminSheets = Array("Control Panel","WBS Setup","Staff Tables","BOE Summary Output","TEMPLATE","PQ_Output","Output") Public Function ShowHideSheets(ParamArray TargetSheets() As Variant) 'Simply buckets the re-visible toggle of all sheets that are Admin Sheets. 'modify target array to fit consumable format for the iterator generically below. 'this step is not truly necessary if i change the iterator below, but i do it to make the array look the way i prefer when interfacing with Arrays. Without this step, the iterator below breaks. Application.ScreenUpdating = False Dim VisibleToggle() As Variant VisibleToggle() = CVar(TargetSheets) 'convert the paramarray to a variant 'here we do what i care about - modulate the tool to hide sheets from end users who don't need to see things. Dim i As Integer For i = 0 To UBound(VisibleToggle) If ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetHidden Then ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVisible ElseIf ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVeryHidden Then ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVisible ElseIf ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVisible Then ActiveWorkbook.Sheets(VisibleToggle(i)).Visible = xlSheetVeryHidden End If Next i Application.ScreenUpdating = True End Function |