【问题标题】:Using a userform to adjust a range of cells使用用户窗体调整单元格范围
【发布时间】:2015-07-02 05:34:01
【问题描述】:

我希望有人可以帮助我查询。到目前为止,我有一个 excel 电子表格,您选择一个单元格,然后单击一个按钮,该按钮会打开一个带有滚动条的用户窗体,当您使用滚动条时,它会将单元格中的数字向上/向下编辑 +-1 到边界您在文本框中键入的内容。这会实时移动与每个单元格关联的图形。当我关闭用户窗体时,原始值会重新填充到单元格中。

我希望在使用电子表格时,人们最终能够选择多个单元格(随机数量的单元格,有时您可能会选择 2 或 7 或 10 个进行更改),并且用户表单将影响所有他们以与上面相同的方式但是我遇到了麻烦。这将使人们能够看到这些项目之间交互的影响。

为了使它适用于一个单元格,我已将变量定义为用户表单之外的公共变量,如下所示:

Public SelRange As Integer

那么在UserForm_Initialize内:

SelRange = Selection

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

Selection = SelRange

但是,如果我选择大量单元格并尝试这样做,我会得到类型不匹配,这表明我应该以不同的方式定义 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

【问题讨论】:

  • SelRange 不会是一个范围而不是一个整数吗?
  • 我试过了,它给了我一个“对象变量或未设置块变量”错误并且不会运行。
  • 如果SelRangeRange,您需要使用Set - Set SelRange = Selection 分配给它。
  • 我明白了。但是,当我对多个单元格执行此操作时,我会收到错误消息:Selection= ScrollBar1.Value + SelRange。当我尝试只改变一个单元格时,它也会使这个增加和减少非常不稳定。
  • 您正在尝试向对象添加数字。这没有任何意义——您需要更仔细地考虑每个变量或元素代表什么。在某些情况下,VBA 会尝试自动转换并没有帮助。有关详细信息,请参阅下面的答案。

标签: vba excel userform


【解决方案1】:

您当前的代码适用于一个单元格,因为Range 对象的默认属性是Value。因此,您将所选单元格中的 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 对象通常更容易,因为访问单个单元格的方法更灵活(@ 987654337@、OffsetRowsColumns 等)。

【讨论】:

  • 现在完成,感谢您的帮助。稍后我会将我所做的全部内容发布给将来可能遇到类似问题的其他人。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多