使用用户表单调整单元格范围

Using a userform to adjust a range of cells

希望有人能帮我解答一下。到目前为止,我有一个 excel 电子表格,你 select 一个单元格,然后单击一个按钮,该按钮打开一个带有滚动条的用户窗体,当你使用滚动条时,它会编辑单元格中的数字+-1 up/down 到您在文本框中键入的范围。这会实时移动与每个单元格关联的图形。当我关闭用户窗体时,原始值会重新填充到单元格中。

我希望在使用电子表格时,人们最终能够 select 一些单元格(随机数的单元格,有时你可能 select 2 或 7 或 10更改)并且用户表单将以与上述相同的方式影响所有这些但是我遇到了麻烦。这将使人们看到这些项目之间相互作用的影响。

为了使其适用于一个单元格,我在用户表单外将变量定义为 public,如下所示:

Public SelRange As Integer

然后在UserForm_Initialize内:

SelRange = Selection

然后有最大、最小、增量等代码,当使用滚动条时,值通过代码存放在活动单元格中:

Selection = SelRange

但是,如果我 select 多个单元格并尝试这样做,我会得到一个类型不匹配,这表明我应该以不同的方式定义 SelRange 但我无法弄清楚这是什么或者即使这真的有助于解决问题。

感谢您的帮助。

完整代码如下:

按钮代码:

        Public SelRange As Integer

        Sub Button1_Click()
        UserForm1.Show
        End Sub

用户窗体中的滚动条代码:

        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

您当前的代码适用于一个单元格,因为 Range 对象的默认 属性 是 Value。因此,您将所选单元格中的 value 放入变量中。但是对于多个单元格,Value 属性 将 return 和 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 总是 return 二维数组。所以 getAllValuesAtOnceAsArray(rowNumber,columnNumber) 得到数组的一个元素——你需要两个索引,即使一个总是 1。在实践中,通常只使用 Range 对象更容易,因为有更灵活的访问方式单个单元格(CellsOffsetRowsColumns 等)。