Vba 使用userform调整单元格范围
我希望有人能帮我提出一个问题。到目前为止,我有一个excel电子表格,您选择一个单元格,然后单击一个按钮,该按钮打开一个带滚动条的用户表单,当您使用滚动条时,该按钮将按+-1向上/向下编辑单元格中的数字,直到您在文本框中键入的边界。这将实时移动与每个单元格关联的图形。当我关闭userform时,原始值将填充回单元格中 我的希望是,当使用电子表格时,最终,人们将能够选择一些单元格(随机数个单元格,有时您可能会选择2、7或10个单元格进行更改),用户表单将以上面相同的方式影响所有单元格,但我在这方面遇到了问题。这将使人们能够看到这些项目之间交互的影响 为了使其适用于一个单元格,我在用户窗体外部将变量定义为public,如下所示:Vba 使用userform调整单元格范围,vba,excel,userform,Vba,Excel,Userform,我希望有人能帮我提出一个问题。到目前为止,我有一个excel电子表格,您选择一个单元格,然后单击一个按钮,该按钮打开一个带滚动条的用户表单,当您使用滚动条时,该按钮将按+-1向上/向下编辑单元格中的数字,直到您在文本框中键入的边界。这将实时移动与每个单元格关联的图形。当我关闭userform时,原始值将填充回单元格中 我的希望是,当使用电子表格时,最终,人们将能够选择一些单元格(随机数个单元格,有时您可能会选择2、7或10个单元格进行更改),用户表单将以上面相同的方式影响所有单元格,但我在这方面
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会尝试自动转换,这是没有帮助的。请参阅下面我的答案以了解更多详细信息。现在完成,谢谢您的帮助。我将在以后为其他可能有类似问题的人发布我所做的全部内容。现在就这样做,谢谢你的帮助。我将在以后为其他可能有类似问题的人发布我所做的全部内容。