我希望有人可以帮我查询。到目前为止,我有一个excel电子表格,你选择一个单元格,然后单击一个按钮,该按钮打开一个带有滚动条的用户窗体,当你使用滚动条时,它编辑单元格中的数字+ -1上/下到边界您键入文本框。这会实时移动与每个单元格关联的图形。当我关闭用户窗体时,原始值将填充回单元格中。
我的希望是,在使用电子表格时,最终人们将能够选择多个单元格(随机数量的单元格,有时您可能会选择2或7或10来更改),而用户表单将影响所有他们以同样的方式,但我遇到了麻烦。这将使人们能够看到这些项目之间交互的影响。
为了使它适用于一个单元格,我已将变量定义为用户表单之外的公共内容,如下所示:
Public SelRange As Integer
然后在UserForm_Initialize
内:
SelRange = Selection
然后有max,min,increment等代码,当使用滚动条时,代码将存储在活动单元格中:
Selection = SelRange
然而,如果我选择了很多单元格并尝试这样做,我会遇到类型不匹配,这表明我应该以不同的方式定义SelRange
,但我无法弄清楚这是什么,甚至是实际上会有所帮助。
感谢您的帮助。
以下完整代码:
按钮代码:
Public SelRange As Integer
Sub Button1_Click()
UserForm1.Show
End Sub
userform中的滚动条代码:
Option Explicit
' Sets default values for when the Userform is opened
Public Sub UserForm_Initialize()
MinBox.Value = -100
MaxBox.Value = 100
IncBox.Value = 5
SelRange = Selection
End Sub
'Ensures that the default starting point is midway between the min and max values specified
Sub scrollbar1_enter()
Dim x As Double
Dim y As Double
y = MaxBox.Value
x = MinBox.Value
ScrollBar1.Value = (x + y) / 2
Selection = SelRange
End Sub
'Sets all parameters in the scroll bar
Private Sub Scrollbar1_Change()
ScrollBar1.Max = MaxBox.Value
ScrollBar1.Min = MinBox.Value
ScrollBar1.LargeChange = IncBox.Value
ScrollBar1.SmallChange = IncBox.Value
Selection = ScrollBar1 + SelRange
End Sub
'Default on exit of userform
Private Sub ScrollBar1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim x As Double
Dim y As Double
y = MaxBox.Value
x = MinBox.Value
ScrollBar1.Value = (x + y) / 2
End Sub
'ensures activecell is updated in real time with dragging of mouse
Private Sub ScrollBar1_Scroll()
Selection.Value = ScrollBar1.Value + SelRange
End Sub
答案 0 :(得分:0)
您当前的代码适用于一个单元格,因为Range
对象的默认属性为Value
。因此,您将所选单元格中的值放入变量中。但对于多个单元格,Value
属性将返回Array
- 这不符合Integer
。
您似乎需要将selRange
声明为Range
然后使用它:
Public selRange as Range
'...
If TypeName(Selection) = "Range" Then
Set selRange = Selection
Else
'handle case when something other than cell(s) are selected here
End If
'rest of your code here
查看Range object reference in MSDN以获取有关使用Range
的信息。 Cells
和Value
属性特别有用。特别是,要增加范围内的每个单元格,您可以执行以下操作:
Dim getAllValuesAtOnceAsArray As Variant
getAllValuesAtOnceAsArray = selRange.Value
Dim singleCell As Range
For Each singleCell In selRange.Cells
singleCell.Value = singleCell.Value + 1
Next singleCell
'Now write back the original values
selRange.Value = getAllValuesAtOnceAsArray
需要注意的一点是,如果有多个单元格,Range.Value
总是返回一个二维数组(即使范围只有一行或一列)。因此getAllValuesAtOnceAsArray(rowNumber,columnNumber)
获取数组的单个元素 - 即使一个元素始终为1,也需要两个索引。实际上,通常更容易使用Range
对象,因为它更灵活访问单个单元格的方式(Cells
,Offset
,Rows
,Columns
等。