变量未更新传递的ByRef

时间:2018-07-12 19:26:47

标签: vba excel-vba

我在所有模块中都使用了 Option Explicit ,这使我挠头,也许是在调用方法中事情迷失了。

读取工作表并将特定数据组合到一个新的工作簿(单个工作表)中,变量colData应该使列增加,并且它将被更新并传递回与工作表一样多的次数(例如,复制1-12个月)给定年份,以1-12列为单位,然后下一年复制月份1-12以13-24列为依此类推,等等。

对函数的调用将返回一个布尔值(此为之后的错误检查):

  'Attempt to load Total Revenue for the Import Sheet
  TotRevLoaded = Application.Run("modGetDataHelpers.loadTotRev", wsImport, rng, colData)

以下是重要的功能部分: “从工作表中的选定文件中加载总收入

Private Function loadTotRev(ByRef wsImport As Worksheet, ByRef rng As Range, ByRef colData As Long) As Boolean

'matchRow is called above and works


Dim k As Integer

    For k = 1 To 12
        'sets headers for the sheet
        wsData.Cells(1, colData) = strYear
        wsData.Cells(2, colData) = k
        'Copy Total Revenue in to row 3
        wsData.Cells(3, colData) = wsImport.Cells(matchRow, 2 + k).Value
        colData = colData + 1
    Next k
    loadTotRev = True 'Success in loading the total rev on sheet

End Function

colData在函数中的更新如预期的1-13,但是当离开函数并返回下一次工作表导入时,它始终为1,因此colData的值在其引用地址处不变。

这应该很容易。该变量将被转换为ByVal,一旦离开函数范围,修改将丢失。

我认为这可能是由于()中的arg包装所致,不是。更改为子项,并且无需分配即可删除它们。

我认为这可能是由于作业=,不。更改为Sub。

因为它正在传递给函数Nope。更改为“公共和私人”。

因为调用方和修饰符位于不同的模块中,所以不对

在研究解决方案时,我不需要全局变量或将所有辅助函数带入同一模块范围(模块全局变量)。

1 个答案:

答案 0 :(得分:1)

经验丰富的VBA用户提供了很好的反馈,从而获得了很好的信息。

1)@TimWilliams:如果要传递参数ByRef,请避免使用Application.Run来调用Private Functions / Subs,它将这些参数转换为ByVal。

http://www.tushar-mehta.com/publish_train/xl_vba_cases/1022_ByRef_Argument_with_the_Application_Run_method.shtml

2)@MathieuGuindon:避免使用Application。完全运行,将Function / Subs公开,或者调查类的实现以进行封装和保护,如果确实需要,请查看Option Private Module

事实上,我确实是通过反复试验找到了make Public解决方案的,因此放弃了Application.Run调用,但是后来才有了推理。