Jul*_*lia 0 excel vba function
I wrote this function, which is supposed to take the user defined cell from a chosen range and add or multiply its value by an user defined number. The output should be an array with one changed cell.
I was able to compile it; however, I cannot call it.
I tried to replicate what this and this but it failed.
Function Macro1(cellref As Range, row_number As Long, column_number As Long, x As Double, method As Integer) As Variant
'Number, which will be added or multiplied by chosen cell value in an array
'One for multiplication, two for addition
If method = 1 Then
Cells(row_number, column_number) = Cells(row_number, column_number) * x
ElseIf method = 2 Then
Cells(row_number, column_number) = Cells(row_number, column_number) + x
End If
Result = Macro1
End Function
Sub try()
Macro1(Range("A1:AX3").Select, 2, 2, 0.5, 1) = Result
End Sub
Run Code Online (Sandbox Code Playgroud)
When running this code, I get the error message "Run-time error 424, object required". The line Macro1(Range("A1:AX3").Select, 2, 2, 0.5, 1) = Result gets red highlighted
Then I tried
Function Macro1(cellref As Range, row_number As Long, column_number As Long, x As Double, method As Integer) As Variant
'Number, which will be added or multiplied by chosen cell value in an array
'One for multiplication, two for addition
If method = 1 Then
Cells(row_number, column_number) = Cells(row_number, column_number) * x
ElseIf method = 2 Then
Cells(row_number, column_number) = Cells(row_number, column_number) + x
End If
Result = Macro1
End Function
Sub try()
Macro1(Worksheets("Macro1").Range("A1:AX3"), 2, 2, 0.5, 1)
End Sub
Run Code Online (Sandbox Code Playgroud)
But I got "Type mismatch Error 13" message. The line Sub try() is highlighted in yellow and the line below it is red
我看到几个问题:
一,行
Result = Macro1
Run Code Online (Sandbox Code Playgroud)
In Macro1是对的递归调用Macro1。即Macro1试图自我称呼。
由于Macro1需要参数,因此会出现错误,其中第Object一个Range是((a 是Object)),而您没有提供对象参数。实际上,您没有在此调用中提供任何必需的参数。
二,代码:
<functionName> = value
Run Code Online (Sandbox Code Playgroud)
是倒退。该行试图将Macro1(<functionName>赋值运算符的左侧=)设置为的值Result。这是不可能的(至少在VBA中没有)。我相信您想要的是:
result = Macro1(Worksheets("Macro1").Range("A1:AX3"), 2, 2, 0.5, 1)
Run Code Online (Sandbox Code Playgroud)
它将Macro1使用指定的参数执行,然后将返回的值(Variant定义为a)分配给Variant变量(因为尚未修改Dim)result。
第三,您已经声明Macro1为Function,但是没有必要-它没有返回值,而是在Range传递值时设置了单元格。最好将其更改为Sub,因为这是它正在执行的工作。我认为您可能一直打算让它在该行中返回一个值Result = Macro1,但是如上所述,这是行不通的。VBA通过将要返回的值分配给Function名称来工作,而return不像某些其他语言那样具有功能。如果确实有想要返回的某种结果,则可以使用以下代码为其分配:
Macro1 = <the value to be returned>
Run Code Online (Sandbox Code Playgroud)
但是,我不确定您实际上会从中得到什么,Function因为它可以在Range一个人身上使用Cell
第四,我不确定您为什么接受一个整体Range作为参数Macro1,然后Cell在其中指定一个。传入...Range("A1:AX3"),然后指定我想column 2和Row 2这个范围的是方式太多的认知努力挑选出你是什么细胞后。为什么不直接传递...Range("B2")并完成它呢?好处是
1)Macro1直接与所需单元格一起使用
2)呼叫者仅指定所需的单元格和所需的单元格
3)从参数列表中消除其他不必要的参数。
第五,您Macro1收到要使用的Range参数,但从不引用它。您可以接受cellref As Range,但是在代码正文中,您正在使用它,Cells()并且从未引用过cellref。有两个问题:
1)您有未指定的名称Cells(),该名称会自动引用ActiveSheet,无论您的意图与否。
2)您根本不处理呼叫时传递的内容Macro1(可能在中的任何内容 Worksheet上Workbook)。
你已经做的是非常具体的在你的电话了伟大的工作,以 Macro1通过指定Worksheets("Macro1").Range("A1:AX3")让VBA知道究竟你是什么样细胞后。但是,如果您恰巧Sheet2在通话时正在查看,Macro1则可以使用,Worksheets("Sheet2").Range("B2")因为此时Activesheet= = Worksheets("Sheet2")代替Worksheets("Macro1")。
第六,您不对输入值做任何检查。如果传递的单元格中的值恰好是red而不是,会发生什么情况17.256。有什么价值red * 2?为什么,这是一个Runtime error #13. Type mismatch。您需要某种形式的健全性检查或错误处理,以确保您使用的是数字数据。
最后,我将通过执行前的健全性检查来建议这样的事情:
Function Macro1(cellref As Range, x As Double, method As Long) As Variant
'Number, which will be added or multiplied by chosen cell value in an array
'One for multiplication, two for addition
Dim Result As Double
If Not IsNumeric(cellref.Value) Then
MsgBox ("The cell does not contain a numeric value")
Exit Function
End If
If method = 1 Then
Result = cellref.Value * x
ElseIf method = 2 Then
Result = cellref.Value + x
End If
Macro1 = Result
End Function
Sub try()
With Worksheets("Sheet1")
.Range("B2") = Macro1(.Range("B2"), 0.5, 1)
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
或者,您可以进行错误处理并按以下方式进行操作:
Option Explicit
Function Macro1(cellref As Range, x As Double, method As Long) As Variant
'Number, which will be added or multiplied by chosen cell value in an array
'One for multiplication, two for addition
On Error GoTo ErrorHandler
Dim Result As Double
If method = 1 Then
Result = cellref.Value * x
ElseIf method = 2 Then
Result = cellref.Value + x
End If
CleanExit:
Macro1 = Result
ErrorHandler:
MsgBox ("The cell does not contain a numeric value")
Result = vbNull
Resume CleanExit
End Function
Sub try()
With Worksheets("Sheet1")
.Range("B2") = Macro1(.Range("B2"), 0.5, 1)
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
请注意,要包含Option Explicit该变量,必须先声明(Dim)所有变量,然后再使用它们。这将有助于消除其他可能的错误,因为您可能会拼错Variable1,Varaible1而VBA会“为您”创建一个全新的变量,从而为您创建一个很难发现的错误。
根据其他一些评论,我认为您正在尝试为范围内的许多单元格调用此方法。如果是这种情况,您可以在Try()过程中添加一些简单的循环,以遍历所有需要应用的单元格。如果不是,并且您正试图Range基于该范围内的其他值将其应用于一个单元格,则需要修改它的某些部分以执行后续操作。我希望这篇文章中有足够的信息供您了解如何做到这一点。如果没有,那么一旦您完全理解了更改此单元格的过程后,可能会提出一个很大的后续问题。
附带说明一下,有一个很棒的OSS VBE附加软件,名为Rubberduck,可帮助您发现和修复许多此类错误。我是该工具的忠实拥护者,每天都会使用它,我也为该项目做出了贡献。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |