【问题标题】:How to create and call a function in VBA?如何在 VBA 中创建和调用函数?
【发布时间】:2021-12-04 21:03:05
【问题描述】:

我正在尝试在 VBA 中创建我的第一个函数或过程。我在代码中使用的基本类型:

Private Type T_DATA_COLUMN_INFO
   count As Integer
   positiveColumnsColors(2) As Long ' decimal values from Hex
   negativeColumnsColors(1) As Long
   excludeColumnsColors(1) As Long
   zeroTop As Integer ' position of zero, the Top property of zero rectangle
   dataWidth As Integer
   negativeDataHeight As Integer
   positiveDataFound As Boolean
   negativeDataFound As Boolean
End Type

' All is on horizontal axis except negativeValueY
Private Type T_COLUMN_RANGES
    Xmin As Integer ' (Left) actually
    Xmid As Integer ' middle position
    Xmax As Integer ' Left + Column width
    Xgap As Integer ' Gap between column rectangles
    Xpitch As Integer ' Gap between colRanges()(1).mid and colRanges()(2).mid
    negativeValueY As Integer  ' Top+Height
    Q1Y As Integer
    Q2Y As Integer ' position of median
    Q3Y As Integer
    initiated As ENUM_INITIATED
End Type

我目前拥有的不是函数而是过程:

Sub SetColumnRanges(Sh As Shape, i As Integer)
    colRanges(0).Width = 0
End Sub

但最好是它会返回变量 'passed boolean'

我的代码是这样开始的(短版):

Sub LookForAxis()
    Dim colRanges() As T_COLUMN_RANGES
    Dim i As Integer
    Dim Sh As Shape
    Dim passed As Boolean
    
    ReDim colRanges(1 To 1) As T_COLUMN_RANGES
    colRanges(1).initiated = 0
    ...
    With ActiveWindow.Selection
      If (.Type = ppSelectionShapes) And (.ShapeRange.Type = msoGroup) Then
        For Each Sh In .ShapeRange.GroupItems
          If (Sh.Name Like "Rec*") Then
            For i = 1 To dataInfo.count
              If Not passed Then  ' If the array ...
                ' code skipped
                ' HERE I TRY TO CALL THE PROCEDURE OR FUNCTION... best if passed is returned for function:
                SetColumnRanges Sh, i

现在要放在函数中的代码

If Sh.Fill.ForeColor.RGB = dataInfo.positiveColumnsColors(1) Then
    colRanges(i).initiated = colRanges(i).initiated Or columns_initiated_positive
    If colRanges(i).Q1Y = 0 Then
         colRanges(i).Q3Y = 0
         colRanges(i).Q2Y = Sh.Top 
         colRanges(i).Q1Y = (Sh.Top + Sh.Height) * -1
    ElseIf colRanges(i).Q1Y < 0 Then
         If colRanges(i).Q1Y * -1 < Sh.Top + Sh.Height Then
             tempInt = colRanges(i).Q2Y * -1
             colRanges(i).Q3Y = colRanges(i).Q2Y  ' Make the old value positive
             colRanges(i).Q2Y = tempInt  ' Make the old value positive
             colRanges(i).Q1Y = Sh.Top + Sh.Height
         Else
            ' Sh.Name = "Q3"
             colRanges(i).Q3Y = Sh.Top + Sh.Height
             colRanges(i).Q1Y = colRanges(i).Q1Y * -1  ' Make the old value positive
         End If
    End If
ElseIf Sh.Fill.ForeColor.RGB = dataInfo.negativeColumnsColors(1) Then
    ' Sh.Name = "Negative"
    colRanges(i).initiated = colRanges(i).initiated Or columns_initiated_negative
End If

所以colRangesSH应该在函数中使用。
我得到的错误是:

Byref 参数类型不匹配

我做错了什么以及如何正确解决?

【问题讨论】:

  • 你展示了很多不相关的代码。您还没有展示如何声明该函数以及如何调用它。您引用的错误消息不可能是用Sh As Shapei As Integer 调用Sub SetColumnRanges(Sh As Shape, i As Integer) 导致的。
  • 问题代码中的fnc调用:SetColumnRanges Sh, i

标签: excel vba function powerpoint procedure


【解决方案1】:

你的问题格式有点乱,这使得阅读起来很复杂,所以如果你可以更新它,我可以更准确,但调用函数的工作方式如下:

    Sub test()
    
        MsgBox test2("hi")
        
        Dim var As String
        var = test2("hi")
        MsgBox var
    
    End Sub
    
    Function test2(var As String) As Boolean
        
        test2 = True
    
    End Function

您必须确保传递给函数的变量的类型与函数中声明的变量类型相同(例如,将“hi”传递给“string”是可以的,但如果 var 可以,这将不起作用在函数中为 long 类型。

在函数结束时,您可以使用函数名称发回结果 =>“Test2 = 要发回的函数的输出”。

【讨论】:

  • 我已经重写了这样的函数:Function SetColumnRanges(Sh As Shape, colRanges As T_COLUMN_RANGES, i As Integer) As Boolean 现在当我在 VBA 6.3 中调用它时 passed = SetColumnRanges(Sh, colRanges, i) 我得到错误 byref type mismash。我想,colRanges 应该通过引用传递,对吧?
  • T_COLUMN_RANGES 不是数据类型,替换为 Range
  • 声明为Private Type T_COLUMN_RANGES。我现在看到了问题,它必须声明为colRanges() As T_COLUMN_RANGES
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多