使用用户表单调整单元格范围
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
的信息。 Cells
和 Value
属性将特别有用。特别是,要递增范围内的每个单元格,您可以执行以下操作:
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
对象更容易,因为有更灵活的访问方式单个单元格(Cells
、Offset
、Rows
、Columns
等)。
希望有人能帮我解答一下。到目前为止,我有一个 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
的信息。 Cells
和 Value
属性将特别有用。特别是,要递增范围内的每个单元格,您可以执行以下操作:
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
对象更容易,因为有更灵活的访问方式单个单元格(Cells
、Offset
、Rows
、Columns
等)。