使用用户窗体来调整单元格的范围

我希望有人可以帮助我的查询。 到目前为止,我有一个Excel电子表格,然后select一个单元格,然后单击一个button,该button将打开一个滚动条的用户窗体,当您使用滚动条时,此编辑单元格中的数字由+ -1上/下限制你input文本框。 这将实时移动与每个单元格关联的graphics。 当我closures用户窗体时,原始值将重新填充到单元格中。

我希望在使用电子表格的时候,人们最终可以select一些单元格(随机数的单元格,有时你可以select2或者7或者10来更改),并且用户表单会影响所有的单元格同样的方式上面,但是我有这个麻烦。 这将使人们看到这些项目之间的互动的影响。

为了使它适用于一个单元格,我已经将该variables定义为在用户表单之外公开,如下所示:

Public SelRange As Integer 

然后在UserForm_Initialize内:

 SelRange = Selection 

然后是代码的最大值,最小值,增量等,当使用滚动条时,值被存储在活动单元格的代码:

 Selection = SelRange 

但是,如果我select许多单元格,并尝试这样做,我得到一个types不匹配,这将build议我应该以不同的方式来定义SelRange ,但我不知道这是什么,或者即使这将实际上帮助情况。

谢谢你的帮助。

下面的完整代码:

button代码:

  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 。 所以你把所选单元格的放入你的variables中。 但是对于多个单元格, 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 

查找MSDN中的Range对象引用以获取有关使用RangeCellsValue属性将特别有用。 特别是要增加一个范围内的每个单元格,你可以这样做:

 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对象通常更容易,因为访问单个单元格有更灵活的方法CellsOffsetRowsColumns等)。