使用userform调整单元格范围

时间:2015-07-01 15:55:53

标签: excel vba excel-vba userform

我希望有人可以帮我查询。到目前为止,我有一个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

1 个答案:

答案 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的信息。 CellsValue属性特别有用。特别是,要增加范围内的每个单元格,您可以执行以下操作:

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对象,因为它更灵活访问单个单元格的方式(CellsOffsetRowsColumns等。