将变体添加到VBA中的问题

时间:2017-08-08 15:32:11

标签: excel vba

我对VBA编程很新,以及不同的数据类型如何工作,所以我遇到了一个问题。我在输入框中添加了两个不同的数字(rngrng1)。如果用户按下取消,程序将关闭并且工作表将锁定。如果我使用例如一个整数而不是一个变量我不能运行关闭代码。但是,当我尝试执行rng + rng1时,它不会添加它们,而是将它们粘合在一起,即grp = 2grp1 = 3然后grp + grp1 = 23。这与我的情节功能混淆了。所以我希望有人可以帮我弄清楚要使用的正确数据类型?或者是问题的不同解决方案。代码可以在下面看到。

dim grp As variant
dim grp1 As variant

Application.DisplayAlerts = False
On Error Resume Next
grp = InputBox("Enter No in Group 1")
On Error GoTo 0
Application.DisplayAlerts = True

If grp = "" Then
    MsgBox ("User canceled!")
    ActiveSheet.Protect Password:="..."
    Exit Sub
End If

Application.DisplayAlerts = False
On Error Resume Next
grp1 = InputBox("Enter No in Group 2")
On Error GoTo 0
Application.DisplayAlerts = True

If grp1 = "" Then
    MsgBox ("User canceled!")
    ActiveSheet.Protect Password:="..."
    Exit Sub
End If

ActiveSheet.ChartObjects("Chart1").Activate

With ActiveChart
    I = 3
    Do Until I = grp + 3
        ActiveChart.FullSeriesCollection(I).Select
        ActiveChart.SeriesCollection(I).Select
        With Selection
            .Border.LineStyle = xlContinuous
            .Border.Color = RGB(0, 255, 0)
            .MarkerBackgroundColor = RGB(0, 255, 0)
            .MarkerForegroundColor = RGB(0, 255, 0)
        End With
        I = I + 1
    Loop

    j = grp + 3
    Do Until j = grp + grp1 + 3
        ActiveChart.SeriesCollection(j).Select
        With Selection
            .Border.LineStyle = xlContinuous
            .Border.Color = RGB(0, 0, 255)
            .MarkerBackgroundColor = RGB(0, 0, 255)
            .MarkerForegroundColor = RGB(0, 0, 255)
        End With
        j = j + 1
    Loop

2 个答案:

答案 0 :(得分:1)

  

它不会添加它们,而是将它们粘合在一起,即grp = 2grp1 = 3然后grp + grp1 = 23

InputBox会返回String类型。很多人都没有意识到,你可以使用 &+运算符来组合字符串,这就是你和你的意思#39;正在做:

"2" + "3" = "23" '// equivalent to "2" & "3"

鉴于:

2 + 3 = 5

因为您的参数属于String类型,+运算符会假定您正在尝试将它们组合在一起,而Int没有隐式类型转换或者LongDouble,因为运算符对于组合字符串非常有效,这就是你给它的:)

注意: 通常建议使用&运算符,这样做&#39>与添加长整数值相比,组合字符串更不明确。

要将结果输入作为数字类型 处理(即执行添加或其他算术运算),那么您需要使用数字数据(Integer/Long/Double类型)而不是String类型。你可以做一个明确的类型转换:

Dim grp as Long
grp = CLng(InputBox("Enter No in Group 1"))

或者,更优选地,use the Type argument of the InputBox function

Dim grp as Long
grp = InputBox("Enter No in Group 1", Type:=1)

grp2相同。

答案 1 :(得分:1)

因为两个输入都不能为0,所以这对你很有用:

Dim dInput1 As Double
Dim dInput2 As Double

'Use Application.InputBox with Type 1 to force a numeric entry
dInput1 = Application.InputBox("Enter No in Group 1", Type:=1)
If dInput1 = 0 Then Exit Sub    'Pressed cancel

'Use Application.InputBox with Type 1 to force a numeric entry    
dInput2 = Application.InputBox("Enter No in Group 2", Type:=1)
If dInput2 = 0 Then Exit Sub    'Pressed cancel

'A simple example showing the values and their sum
MsgBox dInput1 & " + " & dInput2 & " = " & dInput1 + dInput2

以下是有关Application.InputBox

的详情的链接