代码之家  ›  专栏  ›  技术社区  ›  Wookies-Will-Code

变量未更新传递的byref

  •  0
  • Wookies-Will-Code  · 技术社区  · 7 年前

    我正在使用 选项显式 在所有模块中,这一个让我抓耳挠腮,也许是在调用方法中,事情会丢失。

    读取工作表并将特定数据组合到一个新的工作簿、单个工作表中,变量coldata应增加列,并且它将更新并在工作表中传递回尽可能多的次数(例如,在cols 1-12中复制给定年份的1-12个月,然后在下一年复制月份S 1-12 in cols 13-24等)

    调用函数返回一个布尔值(这是随后直接进行的错误检查):

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

    以下是功能的重要部分: 'Sub以加载工作表中所选文件的总收入

    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,如果不分配,可以删除这些内容。

    我想这可能是因为作业,不是。改为Sub.

    因为它正被传递给一个函数,不是。更改为次公共和私有。

    因为调用者和修饰符在不同的模块中,所以不是

    在解决方案中,我不希望使用全局变量,也不希望将所有助手函数引入同一个模块范围(模块全局变量)。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wookies-Will-Code    7 年前

    来自经验丰富的VBA用户的良好反馈,从而获得良好的信息。

    1)@timwilliams:避免使用应用程序。运行以调用私有函数/subs如果要传递参数byref,它会将这些参数强制转换为byval。

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

    2)@mathieuguindon:避免使用应用程序。完全运行,使函数/sub公开,或者调查要封装和保护的类的实现,如果确实需要,查看选项私有模块

    实际上,我是通过尝试和错误找到了make-public解决方案,从而放弃了应用程序。run-call,但后来又出现了推理。

    推荐文章