Vba 使用userform调整单元格范围

Vba 使用userform调整单元格范围,vba,excel,userform,Vba,Excel,Userform,我希望有人能帮我提出一个问题。到目前为止,我有一个excel电子表格,您选择一个单元格,然后单击一个按钮,该按钮打开一个带滚动条的用户表单,当您使用滚动条时,该按钮将按+-1向上/向下编辑单元格中的数字,直到您在文本框中键入的边界。这将实时移动与每个单元格关联的图形。当我关闭userform时,原始值将填充回单元格中 我的希望是,当使用电子表格时,最终,人们将能够选择一些单元格(随机数个单元格,有时您可能会选择2、7或10个单元格进行更改),用户表单将以上面相同的方式影响所有单元格,但我在这方面

我希望有人能帮我提出一个问题。到目前为止,我有一个excel电子表格,您选择一个单元格,然后单击一个按钮,该按钮打开一个带滚动条的用户表单,当您使用滚动条时,该按钮将按+-1向上/向下编辑单元格中的数字,直到您在文本框中键入的边界。这将实时移动与每个单元格关联的图形。当我关闭userform时,原始值将填充回单元格中

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

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

Public SelRange As Integer
然后在
用户表单中初始化

SelRange = Selection
然后是最大值、最小值、增量等的代码,当使用滚动条时,代码会将值存储在活动单元格中:

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

由于
范围
对象的默认属性为
,因此当前代码只适用于一个单元格。因此,将选定单元格中的值放入变量中。但是对于多个单元格,
Value
属性将返回一个
数组
——该数组不适合
整数

看起来您需要将
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
查找有关使用
范围的信息。
单元格
属性将特别有用。具体而言,要在一定范围内增加每个单元格,可以执行以下操作:

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
始终返回2D数组。因此
getAllValuesAtOnceAsArray(rowNumber,columnNumber)
获取数组的单个元素,并且即使其中一个始终为1,也需要两个索引。实际上,只使用
范围
对象通常更容易,因为有更灵活的方式访问单个单元格(
单元格
偏移量
等).

您当前的代码用于一个单元格,因为
范围
对象的默认属性是
。因此,将选定单元格中的值放入变量中。但是对于多个单元格,
Value
属性将返回一个
数组
——该数组不适合
整数

看起来您需要将
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
查找有关使用
范围的信息。
单元格
属性将特别有用。具体而言,要在一定范围内增加每个单元格,可以执行以下操作:

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
始终返回2D数组。因此
getAllValuesAtOnceAsArray(rowNumber,columnNumber)
获取数组的单个元素,并且即使其中一个始终为1,也需要两个索引。实际上,只使用
范围
对象通常更容易,因为有更灵活的方法访问单个单元格(
单元格
偏移量
等)。

SelRange不是一个范围而不是一个整数吗?我试过了,它给了我一个“未设置对象变量或带块变量“错误,无法运行。如果
SelRange
范围
,则需要使用
Set
-
Set-SelRange=Selection
为其赋值。我明白了。”。但是,当我对多个单元格执行此操作时,会从以下位置得到一个错误:Selection=ScrollBar1.Value+SelRange。当我试图只改变一个单元格时,它也使得这个值的增加和减少非常不稳定。这是没有意义的——您需要更仔细地考虑每个变量或元素代表什么样的东西。在某些情况下,VBA会尝试自动转换,这是没有帮助的。有关更多详细信息,请参见下面的答案。SelRange不是一个范围而不是一个整数吗?我尝试了一下,它给了我一个“Object variable or with block variable not set”(对象变量或块变量未设置)错误,不会运行。如果
SelRange
是一个
range
,您需要使用
set
-
set SelRange=Selection
为其赋值。我明白了。但是,当我对多个单元格执行此操作时,会从以下位置得到一个错误:Selection=ScrollBar1.Value+SelRange。当我试图只改变一个单元格时,它也使得这个值的增加和减少非常不稳定。这是没有意义的——您需要更仔细地考虑每个变量或元素代表什么样的东西。在某些情况下,VBA会尝试自动转换,这是没有帮助的。请参阅下面我的答案以了解更多详细信息。现在完成,谢谢您的帮助。我将在以后为其他可能有类似问题的人发布我所做的全部内容。现在就这样做,谢谢你的帮助。我将在以后为其他可能有类似问题的人发布我所做的全部内容。