VBA-未正确引用函数
我是VBA新手,不知道我的函数是否被正确使用,或者函数本身是否有缺陷 我的子流程如下:VBA-未正确引用函数,vba,excel,Vba,Excel,我是VBA新手,不知道我的函数是否被正确使用,或者函数本身是否有缺陷 我的子流程如下: Sub InsertEquitiesBonds() Dim ws As Worksheet, i As Integer Set ws = Worksheets("PnL") ws.Range("B3").Value = "Equities" Worksheets("SummaryEquities").Range("MarketsEquities").Copy ws.Range
Sub InsertEquitiesBonds()
Dim ws As Worksheet, i As Integer
Set ws = Worksheets("PnL")
ws.Range("B3").Value = "Equities"
Worksheets("SummaryEquities").Range("MarketsEquities").Copy ws.Range("C4")
Dim LastUsedCell As Range
Set LastUsedCell = ws.Cells(ws.Rows.Count, "C").End(xlUp)
LastUsedCell.Offset(1, -1).Value = "Bonds"
Worksheets("SummaryBonds").Range("MarketsBonds").Copy LastUsedCell.Offset(2, 0)
For i = 4 To ws.Range("C" & Rows.Count).End(xlUp).Row
ws.Cells(i, 4).Value = OurFees(Range("C" & i))
Next i
Range("A1").Select
End Sub
如InsertEquitiesBonds()
中所述,在我不得不使用它实际上忽略的函数OurFees
之前,代码一直有效。这就引出了一个问题:我是否没有正确地引用我的函数,或者如果我是,函数是否不可避免地存在缺陷
OurFees()
函数描述如下:
Function OurFees(rng As Range)
If rng.Value.IsEmpty = True Then
OurFees = ""
Else
Dim BasisPoint, VolMin, VolDistr As Range
If Columns("B").Find("Bonds").Row < rng.Row Then
With Worksheets("CheatSheet_Bonds")
BasisPoint = Application.WorksheetFunction.Index(Range("A5:E6"), Application.WorksheetFunction.Match(rng, Range("C5:C6"), 0), 3)
VolMin = Application.WorksheetFunction.Index(Range("A5:E6"), Application.WorksheetFunction.Match(rng, Range("D5:D6"), 0), 4)
End With
With Worksheets("SummaryBonds")
VolDistr = Application.WorksheetFunction.Index(Range("B12:C50"), Application.WorksheetFunction.Match(rng, Range("B12:B50"), 0), 2)
OurFees = Application.WorksheetFunction.Max(Range("D9") * BasisPoint, VolMin) * Range("D8") * VolDistr
End With
Else
With Worksheets("CheatSheet_Equities")
BasisPoint = Application.WorksheetFunction.Index(Range("A4:D21"), Application.WorksheetFunction.Match(rng, Range("B4:B21"), 0), 3)
VolMin = Application.WorksheetFunction.Index(Range("A4:D21"), Application.WorksheetFunction.Match(rng, Range("B4:B21"), 0), 4)
End With
With Worksheets("SummaryEquities")
VolDistr = Application.WorksheetFunction.Index(Range("B12:C40"), Application.WorksheetFunction.Match(rng, Range("B12:B40"), 0), 2)
OurFees = Application.WorksheetFunction.Max(Range("D9") * BasisPoint, VolMin) * Range("D8") * VolDistr
End With
End If
End If
End Function
功能费用(rng As范围)
如果rng.Value.IsEmpty=True,则
OurFees=“”
其他的
Dim基本点、VolMin、VolDistor作为范围
如果列(“B”)查找(“债券”)行
试试下面的
For i = 4 To ws.Range("C" & Rows.Count).End(xlUp).Row
ws.Cells(i, 4).Value = OurFees(Range("C" & i))
Next i
1) 我想,如果你进行了适当的详细说明,那么函数定义将是
function-OurFees(rng-as-Range)
2)(假设1),那么你的函数需要一个对象(即Range
object)参数,而OurFees(Cells(I,3).Value)
提供了一个变量。->您应该使用OurFees(单元格(i,3))
但给定的详细信息不足以知道它是否是最后一个词……好的,我将扩展函数,然后我确认:将OurFees(单元格(i,3).Value)
更改为OurFees(单元格(i,3))
。但您最好也将该范围限定在其工作表中(例如:OurFees(ws.Cells(i,3))
。您必须在Else
子句中的某个地方设置OurFees=…
。。我认为真正的问题在于函数,也就是说,Match
是否有可能不能在vba中使用?@user9078057,在进入函数时逐步检查代码(在ws.Cells(I,4)处放置一个断点-F9-at).Value=OurFees(范围(“C”&i)
代码行),逐行按F8键并使用即时窗口(CTRL-G弹出)查询相关变量值(例如:键入?Application.WorksheetFunction.Match(rng,范围(“B12:B40”),0)
在代码执行之前查看匹配操作的结果)